---
title: "Deploy on CyberPanel"
description: "Deploy OpenCodeHub using CyberPanel with OpenLiteSpeed web server or Docker"
---
> **Difficulty:** Easy-Intermediate | **Time:** 25-35 minutes | **Method:** Docker Compose (recommended) or LiteSpeed Node.js
**CyberPanel** is a modern, free, open-source hosting control panel powered by OpenLiteSpeed. It offers better performance than cPanel for modern applications and has native Docker support in the Enterprise version.
---
## Prerequisites
- VPS with Ubuntu 22.04/24.04, AlmaLinux 8/9, or Rocky Linux 8/9
- Minimum **2 CPU cores, 4GB RAM, 40GB SSD**
- Root or sudo access
- A domain/subdomain pointed to your server (e.g., `git.yourdomain.com`)
---
## Step 1: Install CyberPanel
If you haven't installed CyberPanel yet:
```bash
# Run the installer
sh <(curl https://cyberpanel.net/install.sh || wget -O - https://cyberpanel.net/install.sh)
```
During installation:
1. Select **1** for CyberPanel + OpenLiteSpeed
2. Select **1** for Full installation
3. Set MySQL password
4. Choose whether to install PowerDNS, Postfix, Pure-FTPd (optional)
5. Install Memcached/Redis (select **Y** for Redis - we'll use it)
6. Install Watchdog (recommended)
After installation, access CyberPanel at:
```
https://your-server-ip:8090
```
---
## Deployment Method A: Docker Compose (Recommended)
CyberPanel Enterprise and recent versions support Docker. This is the easiest and most complete method.
### Step A.1: Enable Docker in CyberPanel
1. Log into CyberPanel
2. Go to **Docker** → **Install Docker**
3. Wait for installation to complete
4. Go to **Docker** → **Images** → **Pull Image**
5. Pull these images:
- `postgres:16-alpine`
- `redis:7-alpine`
### Step A.2: Create Docker Network
```bash
# SSH into your server
ssh root@your-server-ip
docker network create opencodehub-network
```
### Step A.3: Create Persistent Volumes
```bash
mkdir -p /var/lib/opencodehub/{repos,storage,ssh,cache}
```
### Step A.4: Start PostgreSQL Container
In CyberPanel:
1. Go to **Docker** → **Containers** → **Create Container**
2. Or use CLI:
```bash
docker run -d \
--name opencodehub-postgres \
--network opencodehub-network \
-e POSTGRES_USER=opencodehub \
-e POSTGRES_PASSWORD=$(openssl rand -hex 16) \
-e POSTGRES_DB=opencodehub \
-v opencodehub-postgres:/var/lib/postgresql/data \
-p 127.0.0.1:5432:5432 \
--restart unless-stopped \
postgres:16-alpine
```
Note the password you set.
### Step A.5: Start Redis Container
```bash
docker run -d \
--name opencodehub-redis \
--network opencodehub-network \
-v opencodehub-redis:/data \
-p 127.0.0.1:6379:6379 \
--restart unless-stopped \
redis:7-alpine \
redis-server --appendonly yes --requirepass $(openssl rand -hex 16)
```
Note the Redis password.
### Step A.6: Deploy OpenCodeHub
#### Clone and Build
```bash
cd /var/lib/opencodehub
git clone https://github.com/swadhinbiswas/OpencodeHub.git
cd OpenCodeHub
# Create environment file
cp .env.example .env
nano .env
```
Configure `.env`:
```bash
# Database
DATABASE_DRIVER=postgres
DATABASE_URL=postgresql://opencodehub:POSTGRES_PASSWORD@127.0.0.1:5432/opencodehub
# Redis
REDIS_URL=redis://:REDIS_PASSWORD@127.0.0.1:6379
# Secrets (generate each with: openssl rand -hex 32)
JWT_SECRET=
SESSION_SECRET=
INTERNAL_HOOK_SECRET=
CRON_SECRET=
RUNNER_SECRET=
WORKFLOW_SECRET_ENCRYPTION_KEY=
# Site
SITE_URL=https://git.yourdomain.com
NODE_ENV=production
# Storage
STORAGE_TYPE=local
STORAGE_PATH=/data/storage
REPOS_PATH=/data/repos
SSH_HOST_KEY_PATH=/data/ssh/host_key
# Skip Redis check during build
SKIP_REDIS_CHECK=1
```
#### Build and Run
```bash
# Build the Docker image
docker build -t opencodehub:prod .
# Run the container
docker run -d \
--name opencodehub \
--network opencodehub-network \
-p 127.0.0.1:4321:4321 \
-p 2222:2222 \
-v /var/lib/opencodehub/repos:/data/repos \
-v /var/lib/opencodehub/storage:/data/storage \
-v /var/lib/opencodehub/ssh:/data/ssh \
-v /var/lib/opencodehub/cache:/data/cache \
--env-file .env \
--restart unless-stopped \
opencodehub:prod
```
### Step A.7: Configure Reverse Proxy in CyberPanel
1. In CyberPanel, go to **Websites** → **Create Website**
2. Domain: `git.yourdomain.com`
3. Package: Default
4. Owner: admin
5. PHP: Any (we'll use proxy, not PHP)
6. SSL: Select **Issue SSL**
7. Click **Create Website**
Now configure the reverse proxy:
```bash
# SSH into server
nano /usr/local/lsws/conf/vhosts/git.yourdomain.com/vhost.conf
```
Add or modify the virtual host configuration:
```apache
git.yourdomain.com
*
80
/var/www/html
1
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
git.yourdomain.com
*
443
/var/www/html
1
/etc/letsencrypt/live/git.yourdomain.com/fullchain.pem
/etc/letsencrypt/live/git.yourdomain.com/privkey.pem
opencodehub
proxy
127.0.0.1:4321
100
30
10
5
proxy
/
opencodehub
off
proxy
/*.git/
opencodehub
off
```
Restart OpenLiteSpeed:
```bash
systemctl restart lsws
```
---
## Deployment Method B: LiteSpeed Node.js (No Docker)
If you prefer not to use Docker, CyberPanel supports Node.js apps natively via LiteSpeed.
### Step B.1: Install Node.js
```bash
# SSH as root
source /etc/profile
yum install -y nodejs npm # AlmaLinux/Rocky
# OR
apt install -y nodejs npm # Ubuntu
# Install Bun
curl -fsSL https://bun.sh/install | bash
```
### Step B.2: Create Website in CyberPanel
1. **Websites** → **Create Website**
2. Domain: `git.yourdomain.com`
3. SSL: Issue Let's Encrypt
4. Click **Create**
### Step B.3: Set Up PostgreSQL
CyberPanel uses MariaDB by default. Install PostgreSQL:
```bash
# AlmaLinux/Rocky 9
sudo dnf install -y postgresql16-server postgresql16-contrib
sudo /usr/pgsql-16/bin/postgresql-16-setup initdb
sudo systemctl enable --now postgresql-16
# Create database
sudo -u postgres psql -c "CREATE USER opencodehub WITH PASSWORD 'strongpassword';"
sudo -u postgres psql -c "CREATE DATABASE opencodehub OWNER opencodehub;"
```
### Step B.4: Deploy OpenCodeHub Code
```bash
cd /home/git.yourdomain.com/public_html
git clone https://github.com/swadhinbiswas/OpencodeHub.git .
```
### Step B.5: Configure Node.js App in CyberPanel
1. Go to **Websites** → **List Websites**
2. Click **Manage** for `git.yourdomain.com`
3. Go to **Node.js** → **Setup Node.js App**
4. Configuration:
```
Application Name: opencodehub
Application Startup File: dist/server/entry.mjs
Application Path: /home/git.yourdomain.com/public_html
Application URL: git.yourdomain.com
```
5. In **Environment Variables**, add all values from `.env`
6. Click **Create**
### Step B.6: Build and Start
```bash
cd /home/git.yourdomain.com/public_html
cp .env.example .env
# Edit .env with your values
nano .env
# Install dependencies
bun install
# Build
export SKIP_REDIS_CHECK=1
bun run build
# Initialize database
bun run db:push
# Create admin user
bun run scripts/seed-admin.ts
```
Back in CyberPanel:
1. Go to **Node.js** → **Manage Node.js Apps**
2. Click **Start** for your app
---
## Step 2: Create Admin User (Docker Method)
```bash
# If using Docker
docker exec -it opencodehub bun run scripts/seed-admin.ts
```
Enter username, email, and password.
---
## Step 3: Verify Installation
```bash
# Check container is running
docker ps
# Check logs
docker logs opencodehub
# Test health
curl http://127.0.0.1:4321/api/health
```
Visit `https://git.yourdomain.com` in your browser.
---
## Step 4: Configure Firewall
CyberPanel uses firewalld/ufw. Open necessary ports:
```bash
# For SSH Git access
firewall-cmd --permanent --add-port=2222/tcp
firewall-cmd --reload
# For OpenCodeHub web (if not using reverse proxy)
# Port 4321 should only be accessible locally (127.0.0.1) when behind proxy
```
---
## Step 5: Set Up CI/CD Runner (Docker Method)
If you deployed via Docker:
```bash
# Build runner image
docker build -t opencodehub-runner -f Dockerfile.runner .
# Run runner
docker run -d \
--name opencodehub-runner \
--network opencodehub-network \
--privileged \
-e SERVER_URL=https://git.yourdomain.com \
-e RUNNER_TOKEN= \
-v /var/run/docker.sock:/var/run/docker.sock \
-v /var/lib/opencodehub/runner-work:/work \
-v /var/lib/opencodehub/runner-cache:/cache \
--restart unless-stopped \
opencodehub-runner
```
Get the runner token from OpenCodeHub admin panel → **Runners** → **Register Runner**.
---
## Step 6: SSL with Let's Encrypt
### In CyberPanel Dashboard:
1. Go to **SSL** → **Manage SSL**
2. Select `git.yourdomain.com`
3. Click **Issue SSL**
4. CyberPanel will automatically configure OpenLiteSpeed with the certificate
### Auto-Renewal:
CyberPanel handles Let's Encrypt auto-renewal automatically.
---
## Maintenance
### Update OpenCodeHub
```bash
cd /var/lib/opencodehub/OpenCodeHub
git pull origin main
# Rebuild
docker build -t opencodehub:prod .
# Restart container
docker stop opencodehub
docker rm opencodehub
# Re-run with same docker run command from Step A.6
```
Or use Docker Compose for easier management:
```bash
# Create docker-compose.yml in /var/lib/opencodehub
cat > docker-compose.yml << 'EOF'
version: '3.8'
services:
app:
build:
context: ./OpenCodeHub
dockerfile: Dockerfile
container_name: opencodehub
restart: unless-stopped
ports:
- "127.0.0.1:4321:4321"
- "2222:2222"
env_file: ./OpenCodeHub/.env
volumes:
- ./repos:/data/repos
- ./storage:/data/storage
- ./ssh:/data/ssh
- ./cache:/data/cache
depends_on:
- postgres
- redis
networks:
- och-net
postgres:
image: postgres:16-alpine
restart: unless-stopped
environment:
POSTGRES_USER: opencodehub
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
POSTGRES_DB: opencodehub
volumes:
- ./postgres-data:/var/lib/postgresql/data
networks:
- och-net
redis:
image: redis:7-alpine
restart: unless-stopped
command: redis-server --appendonly yes --requirepass ${REDIS_PASSWORD}
volumes:
- ./redis-data:/data
networks:
- och-net
runner:
build:
context: ./OpenCodeHub
dockerfile: Dockerfile.runner
container_name: opencodehub-runner
restart: unless-stopped
privileged: true
environment:
- SERVER_URL=https://git.yourdomain.com
- RUNNER_TOKEN=${RUNNER_TOKEN}
- DOCKER_HOST=unix:///var/run/docker.sock
volumes:
- /var/run/docker.sock:/var/run/docker.sock
- ./runner-work:/work
- ./runner-cache:/cache
networks:
- och-net
networks:
och-net:
driver: bridge
EOF
# Create .env for compose
cat > .env << 'EOF'
POSTGRES_PASSWORD=your-postgres-password
REDIS_PASSWORD=your-redis-password
RUNNER_TOKEN=your-runner-token
EOF
# Deploy
docker-compose up -d --build
# Update
cd /var/lib/opencodehub
docker-compose pull
docker-compose up -d --build
```
### Backup
```bash
# Database
docker exec opencodehub-postgres pg_dump -U opencodehub opencodehub > backup-$(date +%Y%m%d).sql
# Files
tar czf och-backup-$(date +%Y%m%d).tar.gz /var/lib/opencodehub/repos /var/lib/opencodehub/storage
```
Set up a cron job in CyberPanel → **Cron Jobs**:
```
0 2 * * * cd /var/lib/opencodehub && docker exec opencodehub-postgres pg_dump -U opencodehub opencodehub > backups/backup-$(date +\%Y\%m\%d).sql
```
---
## Troubleshooting
| Problem | Solution |
|---------|----------|
| **502 Bad Gateway** | Check if OpenCodeHub container is running: `docker ps`. Check logs: `docker logs opencodehub`. |
| **SSL not working** | Re-issue SSL in CyberPanel → SSL → Manage SSL. Ensure DNS points to server. |
| **Database connection error** | Verify PostgreSQL container is running. Check `.env` DATABASE_URL uses correct password. |
| **Git SSH not working** | Ensure port 2222 is open in firewall. Verify SSH host key is generated in `/data/ssh`. |
| **Build fails** | Check Docker has enough disk space: `docker system df`. Free space with `docker system prune`. |
| **Node.js app won't start (Method B)** | Check LiteSpeed error logs in CyberPanel → Logs. Verify `dist/server/entry.mjs` exists after build. |
| **Permission denied on files** | Fix ownership: `chown -R 1000:1000 /var/lib/opencodehub/*` (Docker runs as user 1000/bun). |
---
## Performance Tuning
CyberPanel + OpenLiteSpeed is already optimized, but you can tune further:
### Enable LSCache
1. Go to **Websites** → **List Websites** → **Manage**
2. **LiteSpeed Cache** → **Enable**
3. This caches static assets and improves load times
### Database Optimization
```bash
# In PostgreSQL container
docker exec -it opencodehub-postgres psql -U opencodehub -d opencodehub
# Run VACUUM
VACUUM ANALYZE;
```
Set up a weekly cron:
```
0 3 * * 0 docker exec opencodehub-postgres psql -U opencodehub -d opencodehub -c "VACUUM ANALYZE;"
```
---
## Next Steps
- [Configure Email (SMTP)](/administration/configuration/#email)
- [Set up Storage Adapter (S3/R2)](/guides/storage-adapters/)
- [Enable Branch Protection](/guides/branch-protection/)
- [Set up your First Stack](/tutorials/your-first-stack/)