Commands Reference
End-to-end reference for install, day-to-day ops, logs, nginx, password reset, networking, and versioning.
| Item | Value |
|---|---|
| Compose services | backend · frontend · nginx · nginx-proxy · certbot |
| Container names | docklift-backend · docklift-frontend · docklift-nginx · docklift-nginx-proxy · docklift-certbot |
| App containers | dl_<project-slug>_<id>_<service> (e.g. dl_python-smoke_53b01966_app) |
| Dashboard | http://SERVER_IP:8080 |
| App publish ports | 5500–5600 (opt-in) |
| Fresh setup | Bootstrap secret from docker logs docklift-backend or data/.bootstrap-secret |
Run Compose commands from /opt/docklift on production installs (or your clone path).
1. Install / start / stop
# Fresh install — latest GitHub release
curl -fsSL https://raw.githubusercontent.com/SSujitX/docklift/master/install.sh | sudo bash# Fresh install — pin a release (argv)
curl -fsSL https://raw.githubusercontent.com/SSujitX/docklift/master/install.sh | sudo bash -s -- v=2.0.2# Same pin via env
curl -fsSL https://raw.githubusercontent.com/SSujitX/docklift/master/install.sh | sudo DOCKLIFT_VERSION=2.0.2 bash# From a cloned repo
cd /opt/docklift
docker compose up -d --build# First boot: Dashboard URL + Setup code
docker logs docklift-backend 2>&1 | grep -A8 'Fresh install'
sudo cat /opt/docklift/data/.bootstrap-secret# Start / stop / restart (all)
docker compose start
docker compose stop
docker compose restart# Rebuild one service (Compose service keys, not container names)
docker compose up -d --build backend
docker compose up -d --build frontend
docker compose up -d --build nginx
docker compose up -d --build nginx-proxy# Status
docker compose ps
docker ps --filter name=docklift --filter name=dl_2. Upgrade & uninstall
# Safe upgrade (keeps data + user app containers)
curl -fsSL https://raw.githubusercontent.com/SSujitX/docklift/master/upgrade.sh | sudo bash# Full uninstall (destructive — deletes Docklift data)
curl -fsSL "https://raw.githubusercontent.com/SSujitX/docklift/master/uninstall.sh" | sudo bash -s -- -y# Development build from master (unreleased)
curl -fsSL https://raw.githubusercontent.com/SSujitX/docklift/master/install-dev.sh | sudo bash3. Logs (all services)
Platform containers
# Compose (all services, live)
docker compose logs -f
docker compose logs -f --tail 100 backend
docker compose logs -f --tail 100 frontend
docker compose logs -f --tail 100 nginx
docker compose logs -f --tail 100 nginx-proxy
# By container name
docker logs docklift-backend -f --tail 100
docker logs docklift-frontend -f --tail 100
docker logs docklift-nginx -f --tail 100 # dashboard gateway (:8080)
docker logs docklift-nginx-proxy -f --tail 100 # custom domains (:80/:443)
docker logs docklift-certbot -f --tail 50 # Let's Encrypt renewalsDeployed project apps
docker ps --filter name=dl_
docker logs dl_python-smoke_53b01966_app -f --tail 200In the UI
Dashboard → Logs → Backend · Frontend · Nginx Proxy · Nginx (SSE live stream).
4. Nginx (gateway + app proxy)
| Container | Role | Host port | Config |
|---|---|---|---|
docklift-nginx | Dashboard gateway (/, /api, /ws) | 8080 | repo nginx.conf |
docklift-nginx-proxy | User app domains + HTTPS | 80, 443 | nginx-proxy/conf.d/*.conf |
docklift-certbot | Let's Encrypt ACME | — | nginx-proxy/certbot/ |
# Test config then reload (gateway)
docker exec docklift-nginx nginx -t
docker exec docklift-nginx nginx -s reload
# Test config then reload (app domain proxy)
docker exec docklift-nginx-proxy nginx -t
docker exec docklift-nginx-proxy nginx -s reload
# List generated domain configs
ls -la /opt/docklift/nginx-proxy/conf.d/Edit gateway routing: change nginx.conf, then:
docker compose up -d --force-recreate nginx
# or: docker exec docklift-nginx nginx -s reload (if only conf mounted)5. Reset admin password
Production (Docker)
docker exec -it docklift-backend node dist/scripts/reset-password.jsPrints a new random password for the admin user. Change it after login.
Local development
cd backend
bun run reset-password6. Version (check & release)
See current version
grep '"version"' backend/package.json frontend/package.jsoncurl -s http://SERVER_IP:8080/api/health
# or from the server:
curl -s http://127.0.0.1:8080/api/healthUI also shows the version in the header / footer (authenticated compare).
How versions are changed
Versioning is automatic via semantic-release. Do not use npm version, bumpp, or manual bumps unless you intend to break the pipeline.
# Conventional commits on master, then:
# GitHub → Actions → "Release & Test" → Run workflow
git commit -m "fix(deploy): description" # → patch
git commit -m "feat: something *force minor*" # → minor
git commit -m "feat: something *force major*" # → major
git commit -m "chore: docs *skip release*" # → none| Commit signal | Release |
|---|---|
feat:, fix:, perf:, refactor:, chore: … | Patch |
*force minor* in subject | Minor |
*force major* / BREAKING CHANGE | Major |
*skip release* in subject | None |
Config: release.config.cjs · Workflow: .github/workflows/release.yml
After a release on a server
curl -fsSL https://raw.githubusercontent.com/SSujitX/docklift/master/upgrade.sh | sudo bash7. Projects & containers
docker ps -a --filter name=docklift --filter name=dl_
docker inspect dl_python-smoke_53b01966_app
docker exec -it docklift-backend sh
docker exec -it dl_python-smoke_53b01966_app shNaming:
- Compose project / image prefix:
dl-<slug>-<8charId> - Container:
dl_<slug>_<8charId>_<service>
8. Network & ports
docker network inspect docklift_network
docker network ls --filter label=com.docklift.managed=true
sudo ss -tulpn | grep -E ':(80|443|8080|550[0-9]|8000)\b'
sudo fuser -k 5500/tcp| Port | Use |
|---|---|
8080 | Dashboard (gateway nginx) |
80 | Custom domains HTTP + ACME |
443 | Custom domains HTTPS |
5500–5600 | Published app ports (opt-in pool) |
8000 | Backend (internal / local dev) |
3600 | Vite frontend (local bun run dev) |
Compose env defaults:
# PORT_RANGE_START=5500
# PORT_RANGE_END=5600
# DASHBOARD_BIND=0.0.0.09. Clean / reset
# Stop stack (keeps volumes/data dirs)
docker compose down
# Stop + remove containers/network (data dirs on disk remain)
docker compose down --remove-orphans
# Free stuck app port pool
for port in {5500..5600}; do sudo fuser -k ${port}/tcp 2>/dev/null; doneNuclear remove: see uninstall one-liner in §2.
Volumes labelled for a project:
docker volume ls --filter label=com.docklift.project10. Local development
cd backend
cp .env.local.example .env.local
bun install
bun run db:generate
bun run db:push
bun run dev # http://localhost:8000cd frontend
bun install
bun run dev # http://127.0.0.1:3600
bun run build # production → dist/cd backend
bun run db:studio
bun run db:push
bun run db:generatecurl -s http://127.0.0.1:8000/api/health
curl -s http://127.0.0.1:3600/api/auth/status # via Vite proxyDatabase scripts (from backend/)
| Command | Description |
|---|---|
bun run db:studio | Prisma Studio GUI |
bun run db:migrate | Apply checked-in Prisma migrations |
bun run db:ensure | Production DB bootstrap (dedupe + migrate + repair) |
bun run db:generate | Regenerate Prisma client |
bun run db:push | Local-only schema sync (not used on container boot) |
Quick cheat sheet
| Task | Command |
|---|---|
| Start stack | docker compose up -d --build |
| Upgrade server | curl -fsSL …/upgrade.sh | sudo bash |
| Backend logs | docker logs docklift-backend -f |
| Frontend logs | docker logs docklift-frontend -f |
| Gateway nginx logs | docker logs docklift-nginx -f |
| Domain proxy logs | docker logs docklift-nginx-proxy -f |
| Reload domain nginx | docker exec docklift-nginx-proxy nginx -s reload |
| Reset password | docker exec -it docklift-backend node dist/scripts/reset-password.js |
| Check version file | grep version backend/package.json |
| Health | curl -s http://SERVER_IP:8080/api/health |
| List apps | docker ps --filter name=dl_ |
| Ship a release | conventional commit → Actions → Release & Test |