Coolify vs Dokku vs CapRover: self-hosted PaaS in 2026
We deployed the same three-service app to a $12/mo Hetzner box: architecture, memory footprint, and ops cost of each.
Self-hosting a PaaS used to mean weekends lost to Nginx, systemd, and SSL renewals that broke at 3am. Coolify, Dokku, and CapRover all promise to compress that work into a git push and a web dashboard. They get there through different stacks, and the wrong pick costs you migration time you won’t get back.
We deployed the same three-service app — a Node API, a Postgres database, and a static Astro frontend — to each platform on a fresh $12/mo Hetzner CX22 (2 vCPU, 4GB RAM). What follows is what we hit, where each one bent, and which we’d reach for on the next project.
Architecture decides what breaks
Dokku is the oldest of the three (2013) and the leanest: a few thousand lines of Bash glue around Docker, designed to run on a single host. App lifecycles live in ~/dokku/<app> directories. There’s no web UI in the core — you ssh in and run dokku apps:create, dokku domains:add, dokku certs:add. A community plugin (dokku-letsencrypt) handles TLS. Plugins are first-class: Postgres, Redis, MongoDB, Clickhouse all ship as dokku-postgres, dokku-redis, etc., and they wire env vars into your app automatically when you dokku <db>:link.
CapRover sits on Docker Swarm. That choice is the whole story: you get multi-node orchestration, rolling deploys, and a one-click app store (over 100 apps as of writing) out of the box, but you also inherit Swarm’s quirks — overlay network DNS oddities, volume placement headaches, and a deprecation cloud since Docker shifted focus to Kubernetes. The web dashboard is the primary interface; the CLI exists but is secondary.
Coolify v4 rewrote the platform on Laravel + Docker Compose (no Swarm, no Kubernetes by default). v4 added multi-server support, so one Coolify instance can deploy to many remote Docker hosts over SSH. The UI is the most polished of the three — closest to Vercel or Render in feel — and it’s the only one with a built-in S3-compatible backup story for databases and a managed-Postgres-style UX.
Where each one actually fits
Pick Dokku when: you have one server, you live in the terminal, and you want the smallest moving-parts footprint. Memory baseline is around 150MB. The plugin ecosystem is mature — Dokku has been around twice as long as the others and the community plugins have been hammered on for a decade. The cost: no web UI in core, no built-in multi-server, no out-of-the-box backup scheduling. If you can’t ssh, you can’t operate Dokku.
Pick CapRover when: you want a web dashboard, one-click apps (Ghost, Nextcloud, Plausible, MinIO are common picks), and you don’t mind being on Docker Swarm. Memory baseline is around 400MB. The one-click app catalog is the strongest selling point — adding a Plausible instance is genuinely two clicks. Watch the Swarm caveat: if a node goes down mid-deploy, Swarm’s recovery is more fragile than Compose’s restart loops. Bind-mount volumes also don’t move between nodes, which surprises first-time multi-node users.
Pick Coolify when: you want the modern UX, your team has people who aren’t comfortable in SSH, and you’ll plausibly outgrow a single host within 12 months. Memory baseline is around 700MB (the heaviest of the three — it runs Laravel, a database, Redis, and Soketi for itself). In exchange you get: per-app TLS via Caddy, push-to-deploy from GitHub/GitLab with previews, an actual database backup scheduler with S3 destinations, and a real audit trail. v4 is younger and breaks more often than Dokku — check the GitHub issues for your stack before committing.
A note on community velocity: Coolify is the most actively developed (multiple releases per month, around 45k GitHub stars), CapRover is steady (around 13k stars, monthly-ish releases), Dokku is mature and slow-moving (around 30k stars, releases when needed). Velocity cuts both ways — Coolify breaks more often, Dokku has more sharp edges that nobody has filed off in five years.
Ops cost, the part nobody benchmarks
The total cost of running these is not the server. It’s the time you spend recovering from upgrades.
Dokku upgrades are mostly painless because there’s almost nothing to upgrade — you apt upgrade dokku and re-run dokku plugin:update. We have seen Postgres plugin updates require a careful read of the changelog (volume layout changes between major Postgres versions).
CapRover upgrades go through the dashboard. The Swarm-level upgrades (Docker version, Swarm state) are the ones to worry about; the CapRover layer itself is a single container restart. We hit one Swarm gotcha during a Docker 25 to 26 upgrade where the overlay network needed manual recreation — a documented issue with documented recovery, but not fun at the time.
Coolify v4 upgrades are the most invasive — schema migrations on every minor version, occasional breaking config changes during the v4 stabilization period (we’re past the worst of it as of 2026 but not all the way clear). Their changelog is honest about it, and rollback works, but plan upgrades on a weekday, not Friday afternoon.
FAQ
FAQ
Can I run any of these on a $5/month VPS?
What's the migration story between them?
Are any of these production-ready for a paid SaaS?
Related tools
Beehiiv
Newsletter platform with built-in ad network and Boost referrals.
Try Beehiiv →
Webflow
Visual site builder with real CSS export and a CMS that scales.
Try Webflow →
Some links above are affiliate links. We may earn a commission if you sign up. See our disclosure for details.
Related reading
2026-09-02
OpenAI Deployment Layer: The Assistants API Precedent
OpenAI shipped the Assistants API in November 2023 and marked it for sunset 16 months later. That precedent is how to price the new deployment stack.
2026-08-21
701 Bad Internal Links Before 49 Good Ones
A phrase-matching script inserted 750 links across 269 MDX articles. Here is where they failed, and how claim-matching cut the review pile to 128.
2026-08-21
Cloudflare Web Analytics via GraphQL: the siteTag Filter
Why accountTag and siteTag differ in rumPageloadEventsAdaptiveGroups, how the limit argument truncates silently, and which fields we did not verify.
2026-08-21
Bing Webmaster API's 100-URL Cap: 289 URLs, Three Days
Quota is 100 a day against 1300 a month, GetQueryStats was still empty at the end, and two error shapes will kill a cron job.
2026-08-19
IndexNow Batch Mode: 286 URLs Per Publish Down to 0
Bing flags full-sitemap submissions as batch mode. The ~40-line lastmod diff that fixes it, the precondition it needs, and two ways it silently breaks.
Get the best tools, weekly
One email every Friday. No spam, unsubscribe anytime.