Kamal 2 review: deploying containers without Kubernetes in 2026
A measured look at Kamal 2 — 37signals' Docker-over-SSH deploy tool. What kamal-proxy changed, where it fits, and where it hands the hard problems back to you.
Kamal is the deployment tool 37signals built to move Basecamp, HEY, and their ONCE products off managed cloud platforms and onto rented bare metal. Version 2 landed in October 2024, and the headline change is that it no longer leans on Traefik for routing. You point it at one or more servers with SSH access, hand it a Docker image, and it runs the container, terminates TLS, and swaps versions with zero downtime. No control plane, no YAML manifests for pods and services, no cluster to babysit.
We ran Kamal 2 against a small Rails app and a plain Node service to see how much of the “deploy like it’s 2010, scale like it’s 2026” pitch holds up. Here’s where it earns its place and where it quietly hands the hard problems back to you.
What Kamal 2 actually does
At its core, Kamal is a thin orchestration layer over Docker and SSH. Your config/deploy.yml names the image, the servers, the registry, and the environment. Run kamal setup once and it installs Docker on each host, logs into your registry, boots the proxy, and starts your app. After that, kamal deploy builds or pulls the image, pushes it to every server, health-checks the new container, and cuts traffic over only when that check passes.
The piece that makes this feel current is kamal-proxy, a small Go reverse proxy 37signals wrote to replace Traefik in v2. It handles request routing, automatic Let’s Encrypt certificates, and the connection draining that makes deploys zero-downtime. In v1, getting Traefik labels right was the most common source of “why is my deploy stuck” threads. Kamal 2 folds that into a first-party component you configure through the same deploy.yml, which is a genuine reduction in moving parts.
Secrets got simpler too. Kamal 2 reads them from .kamal/secrets, which can pull from your shell environment, 1Password, or any command that prints a value. You reference them by name in the config and Kamal injects them as environment variables at boot. There’s no separate secrets store to provision and no plaintext credentials sitting in the repo.
The kamal-proxy shift and what changed from v1
If you used MRSK or Kamal 1, the upgrade is not a no-op. The proxy change means your routing config moves out of Traefik labels and into a proxy: block. Healthcheck behavior changed as well: kamal-proxy waits for your app to report healthy on a configurable path before sending traffic, so a missing or slow /up endpoint will stall a deploy in a way the old setup didn’t.
The payoff is fewer surprises in steady state. A v2 deploy is a sequence you can read top to bottom: build, push, boot, health-check, drain old, route new. When something breaks, the failure is usually in one of those steps rather than buried in proxy label resolution. kamal rollback restores the previous container in seconds because the old image is still sitting on the host.
What you give up is anything resembling a scheduler. Kamal does not reschedule containers when a host dies, does not autoscale, and does not spread replicas across a fleet for you. If a server goes down, that server’s traffic goes down with it until you fix the box or pull it from the config. Kamal’s position is that most apps don’t need a scheduler, and for a large share of them that’s honestly correct — but you should decide that on purpose, not discover it during an outage.
Cursor
Kamal config is hand-written YAML, and an AI editor that can read your Dockerfile and deploy.yml together cuts the trial-and-error on proxy and healthcheck settings.
Free tier; Pro $20/mo
Affiliate link · We earn a commission at no cost to you.
Where Kamal 2 fits (and where it doesn’t)
Kamal 2 is a strong default when you control a handful of long-lived servers and want deploys you fully understand. Solo developers, small teams running a monolith, and anyone moving off a triple-digit monthly PaaS bill to a couple of VPS boxes are the obvious fit. The mental model is small enough to hold in your head, and the cost story is compelling: a single server can host the app, a database container, and background workers.
It fits less well when you need elastic capacity, multi-region failover, or per-request autoscaling. Stateful services are the sharpest edge. Kamal will happily run a Postgres container, but it does nothing to manage backups, replication, or failover — that part is entirely yours.
The honest summary: Kamal 2 doesn’t compete with Kubernetes on what Kubernetes does. It competes on whether you needed Kubernetes at all. For a large slice of apps that were over-provisioned onto a cluster for resume reasons, the answer is no — and Kamal 2 is the most polished version of that argument shipped so far.
FAQ
Is Kamal 2 only for Ruby on Rails apps?
Do I still need Docker knowledge to use Kamal 2?
How is Kamal 2 different from Kamal 1?
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-06-22
Caddy vs Nginx in 2026: When Automatic HTTPS Is Worth the Switch
A practical comparison of Caddy and Nginx for solo developers and small teams: certificate management, performance trade-offs, config ergonomics, and when switching actually pays off.
2026-06-22
Hetzner vs OVH for Side Projects: Bare-Metal Value in 2026
A measured comparison of Hetzner and OVHcloud for side projects in 2026 — pricing models, bandwidth, hardware, and the trade-offs that actually matter for a solo developer.
2026-06-22
Bun vs Node.js in Production: What Actually Changes in 2026
A measured look at what swapping Node.js for Bun changes in real production: install speed, native TypeScript, built-in tooling, and the compatibility and observability gaps that still bite.
2026-06-22
Coolify vs Dokploy: Self-Hosted PaaS for Solo Developers in 2026
A practical comparison of Coolify and Dokploy for solo devs running their own deployments in 2026 — architecture, setup, resource use, and which one to pick.
2026-06-22
Turso vs Neon: Serverless SQLite and Postgres Compared in 2026
A developer's comparison of Turso (edge SQLite/libSQL) and Neon (serverless Postgres) in 2026 — latency model, branching, cost shape, and lock-in.
Get the best tools, weekly
One email every Friday. No spam, unsubscribe anytime.