Self-Host Dokploy on Liquid Web
TL;DR
- Dokploy: self-hosted Docker PaaS. Apache-2.0, ~31k GitHub stars, v0.14.0 (2026-04-22)
- Installs with one command; deploys apps from Git with Nixpacks, Dockerfile, or Docker Compose
- Idle: ~600 MB RAM, lighter than Coolify (~800 MB idle)
- The cleaner-UI, lower-overhead choice when you need a PaaS without Coolify's extended feature set
Dokploy (github.com/Dokploy/dokploy) is a self-hosted PaaS that deploys applications from Git using Nixpacks (auto-detect language), Dockerfile, or Docker Compose. It manages SSL certificates via Let's Encrypt, runs a Traefik reverse proxy for routing, provisions databases (PostgreSQL, MySQL, MariaDB, MongoDB, Redis), and provides a clean web dashboard for deployments, logs, and environment variables.
Dokploy vs Coolify: both are Apache-2.0, Docker-based PaaS platforms with similar feature sets. Dokploy is ~200 MB lighter at idle, has a simpler (some say cleaner) UI, and iterates faster on new features. Coolify has a larger community (~52k vs ~31k stars), more production deployments, multi-server support, and a more mature Docker Swarm integration. For most solo developers and small teams, the choice is preference, so try both.
Prerequisites
- A Liquid Web Self-Managed VPS (minimum 1 vCPU / 2 GB RAM, 4 GB recommended for running apps). Verify pricing
- Ubuntu 22.04 or Debian 12
- Root SSH access
- A domain pointing to the VPS IP
- About 10 minutes
Install Dokploy
# Run on the VPS as root
curl -sSL https://dokploy.com/install.sh | sh
The script:
- Installs Docker Engine if not present
- Pulls the Dokploy Docker image
- Starts the Dokploy stack (app + PostgreSQL + Redis + Traefik)
- Exposes the UI on port 3000
After install:
# Visit http://your-vps-ip:3000
# Create your admin account
# The first user to log in becomes the admin
Point DNS at Dokploy
# DNS records
app1.yourdomain.com. A <your-vps-ip>
app2.yourdomain.com. A <your-vps-ip>
dokploy.yourdomain.com. A <your-vps-ip>
In Dokploy: Settings → Server → set the server hostname. Traefik handles SSL automatically for any domain you add to an application.
Deploy your first application
# In the Dokploy UI:
# 1. Projects → Create Project
# 2. + Create Service → Application
# 3. Configure:
# - Provider: GitHub / GitLab / Bitbucket / Git (custom URL)
# - Repository and branch
# - Build type: Nixpacks (auto-detect) / Dockerfile / Docker Compose / Static
# 4. + Create Domain → enter your app's domain
# Traefik auto-issues an SSL certificate via Let's Encrypt
# 5. Deploy
# Nixpacks language detection covers:
# Node.js, Python, Ruby, Go, PHP, Java, Rust, .NET, Elixir, Crystal
Deploy a database
# In your project:
# + Create Service → Database → PostgreSQL / MySQL / MariaDB / MongoDB / Redis
# Dokploy provisions the container with:
# - Auto-generated credentials
# - Internal connection string for your apps
# - Automated backup schedule (optional)
# - One-click restore from backup
Inject the database URL into your app as an environment variable via the app's Environment section.
Verify the installation
# Check Dokploy stack is running
docker ps | grep dokploy
# Service health (from VPS shell)
curl -s http://localhost:3000/api/health
# Resource usage
docker stats --no-stream | grep dokploy
Runtime footprint
Measured 2026-05-02 on local Docker (4 vCPU / 8 GB RAM).
Dokploy stack itself (before deploying any apps):
| Service | Idle RAM |
|---|---|
| dokploy (main app) | 300 MB |
| traefik (proxy) | 50 MB |
| db (PostgreSQL) | 180 MB |
| redis | 20 MB |
| Total (Dokploy stack) | 550 MB |
Apps deployed via Dokploy add their own RAM. Size your VPS as: Dokploy overhead (~600 MB) + your app RAM budget.
Upgrading Dokploy
# Dokploy has a built-in update option:
# Settings → Server → Dokploy → Update to latest
# Or via CLI (re-run the install script):
curl -sSL https://dokploy.com/install.sh | sh
# Dokploy checks for and applies schema migrations automatically on startup
Cost vs Heroku / Railway
| Heroku Eco (3 dynos) | Railway Hobby | Dokploy on Liquid Web | |
|---|---|---|---|
| Monthly cost | $15/mo | $5/mo usage-based | ~$3.50/mo VPS |
| Apps | 3 | Unlimited | Unlimited |
| Databases | Add-on pricing | Add-on pricing | Included (self-managed) |
| Build minutes | 1,000 free | $0.005/min | On your VPS hardware |
| Custom domains + SSL | ✓ | ✓ | ✓ (automatic) |
| Self-hostable | ✗ | ✗ | ✓ |
Prices subject to change. Verify at heroku.com/pricing, railway.app/pricing, and liquidweb.com/vps-hosting/self-managed/.
Coolify vs Dokploy: which to choose?
| Coolify | Dokploy | |
|---|---|---|
| Idle RAM | ~800 MB | ~600 MB |
| GitHub stars | ~52k | ~31k |
| Multi-server | ✓ | ✓ (v0.14+) |
| Docker Swarm | ✓ | Partial |
| UI design | Functional, feature-dense | Cleaner, simpler |
| Release cadence | Frequent beta patches | Monthly releases |
| License | Apache-2.0 | Apache-2.0 |
Both are solid choices. Use Coolify if you want the larger community and battle-tested multi-server support. Use Dokploy if you want a leaner footprint and a cleaner UI at the cost of a smaller community.
When this isn't right for you
- You need Docker Swarm orchestration. Dokploy's Swarm support is partial as of v0.14.0. For production Swarm workloads, Coolify's Swarm integration is more complete.
- You need Kubernetes. Dokploy is not a Kubernetes platform. For K8s, consider a managed cluster (Liquid Web does not currently offer managed Kubernetes, so verify at the time of purchase) or Rancher/K3s on a dedicated server.
- You have a large team with complex access control. Dokploy's role-based access is simpler than enterprise IAM. For SAML/SSO requirements, neither Dokploy nor Coolify's OSS version covers this, so evaluate the enterprise tiers.
- Uptime is mission-critical. Dokploy is single-server by default. If the VPS goes down, all apps go down. Add monitoring, have a tested restore procedure, and consider the Liquid Web Managed VPS for hardware replacement SLAs.
Exit strategy
Apps deployed via Dokploy are standard Docker containers, fully portable:
# Export the docker-compose.yml for any application:
# Application → General → View Compose → Copy
# Download database backups:
# Service → Database → Backups → Download
# Your application code stays in your Git repository — zero lock-in
Yes. In Application settings, set 'Build Path' to the subdirectory of your service within the monorepo. Nixpacks detects the language from that subdirectory. For Docker-based deployments, set 'Dockerfile Path' to the specific Dockerfile location. Each service in the monorepo is a separate Dokploy Application pointing to the same repository with different build paths.
As of v0.14.0, Dokploy does not have built-in preview environments (per-PR deployments). You can manually create separate applications pointing to different branches. Automatic preview environments are on the Dokploy roadmap, so check the GitHub issues for current status.
Dokploy adds a management layer on top of Docker Compose: a web UI for deployments, automatic SSL certificate issuance, environment variable management, deployment logs, database provisioning, and Git webhook integration. If you're comfortable managing Docker Compose files and Caddy/Nginx config manually, Dokploy saves you the operational overhead of doing it yourself. If you have one app and it never changes, raw Docker Compose may be simpler.
The apps themselves are portable: your docker-compose.yml works on any Docker host. Export your compose file from Coolify, import it to Dokploy as a Docker Compose application. Databases need a pg_dump/restore. Environment variables need to be re-entered. The migration is manual but straightforward since both platforms are Docker-based.
Common mistakes and fixes
Dokploy install script exits with 'docker: command not found'.
Dokploy's install script installs Docker automatically on supported OS (Ubuntu 20.04+, Debian 11+). If it fails, install Docker manually first: `curl -fsSL https://get.docker.com | sh && systemctl enable docker && systemctl start docker`. Then re-run the Dokploy install script.
App deployment fails with 'Nixpacks: no supported language detected'.
Nixpacks auto-detects the language from your repository. If detection fails, it's usually because the build files are in a subdirectory. In Dokploy → Application → Build → set 'Build Path' to the subdirectory containing your package.json / requirements.txt / Gemfile, or switch the build type to 'Dockerfile' and provide your own Dockerfile.
Custom domain shows 'SSL certificate could not be obtained'.
Let's Encrypt requires the domain to resolve to the server IP before the certificate request. Verify: `dig +short yourdomain.com` returns your VPS IP. If DNS hasn't propagated yet, wait 5–30 minutes and retry the domain in Dokploy → Application → Domains → Refresh Certificate. Also confirm port 80 is open on the VPS firewall: Let's Encrypt uses HTTP-01 challenge which requires port 80 access.



