Kamal is a deployment tool that runs on your own machine or CI runner, not on the server. So โKamal VPS requirementsโ is really a question about the machine Kamal deploys to: it has to run your application containers, kamal-proxy, any accessories you declared, and a few days of old images kept for rollback.
Kamalโs own resource cost on the host is zero. Size everything else.
What Consumes Resources on the Host
After kamal setup, the server runs three things:
- kamal-proxy, a small Go HTTP proxy holding ports 80 and 443
- your app containers, one set per role in
config/deploy.yml - accessories โ Postgres, Redis, or whatever else you declared
Only the middle two matter for sizing. kamal-proxy is a single static binary and its footprint disappears next to any real application.
RAM
The figure that catches people out is not steady-state memory, it is the deploy overlap. Kamal boots the new container while the old one is still serving traffic, and only stops the old one after the new one passes its health check. Peak memory is therefore your normal usage plus roughly one more copy of the app container.
- Practical minimum: 2 GB, for a small app with no separate database
- Comfortable: 4 GB, which covers a typical web app plus Postgres and the deploy overlap
- Add swap on 4 GB hosts. A host that starts swapping mid-deploy can get slow enough to miss the health-check window, and the deploy then rolls back for what looks like no reason.
If you run Postgres as a Kamal accessory rather than as a managed service, size for it explicitly โ it, not Kamal, will be the largest consumer on the box.
CPU
Two vCPUs is the sensible floor, for a reason that has nothing to do with steady-state load: during a deploy the host is simultaneously pulling an image, starting a container, running health checks, and serving traffic from the old container. On a single vCPU that contention stretches the deploy window.
- Minimum: 1 vCPU, workable for a low-traffic app if you accept slower deploys
- Recommended: 2 vCPUs
- Building images on the VPS itself is the one case that genuinely needs more. If your laptop is arm64 and the VPS is your only amd64 machine, a build will use every core you give it.
Storage
This is where Kamalโs behaviour actually changes the numbers. Kamal keeps old containers and images on the server so kamal rollback can restart a previous version without pulling from the registry, and prunes them after three days by default.
So the disk has to hold:
- Your applicationโs own data and volumes
- The current image plus roughly three days of previous versions
- Shared base layers, which are stored once no matter how many versions you keep
A 1 GB image deployed a few times a day is fine on 40 GB NVMe. A 3 GB image on a 25 GB disk fills the disk within a week. The failure mode is worth knowing: a full disk breaks the next deploy, not the one that filled it, so the cause and the symptom are days apart.
If you deploy often, kamal prune all clears the backlog on demand rather than waiting for the three-day window.
VPS Provider Options and Pricing
| Provider | Price per Month | Notable Features | Affiliate Link |
|---|---|---|---|
| Contabo | โฌ5.99 | 400 GB disk, so image history is never the constraint | Contabo |
| Hetzner Cloud | โฌ5.49 | 2 vCPU / 4 GB / 40 GB NVMe, snapshots before risky deploys | Hetzner Cloud |
| DigitalOcean | $6 USD | Clearest documentation for the host-level setup Kamal skips | DigitalOcean |
| Vultr | $5 USD | Region choice, useful when the app should sit near its users | Vultr |
| Linode (Akamai Cloud) | $5 USD | Predictable pricing and straightforward networking | Linode |
For a comprehensive look at options, check the full VPS comparison.
DigitalOcean is the easiest entry point, because Kamal deliberately does not manage the host beyond Docker โ firewall rules, swap, and unattended upgrades are still yours, and DigitalOceanโs documentation covers all three. Hetzner gives you more RAM and disk per euro if you are comfortable doing that setup yourself.
Practical Deployment Tips
- Give the server only ports 22, 80, and 443. kamal-proxy terminates TLS itself, so nothing else needs to be reachable.
- Check
kamal app containersbefore relying on a rollback; the target has to still be on disk. - Watch free disk with the same alerting you use for memory. It is the failure that arrives quietly.
- Deploying a second app to the same host is supported in Kamal 2 โ kamal-proxy routes by hostname โ but that doubles the container count and the image history, so size the disk for both.
Conclusion
For most single-app deployments, 2 vCPUs, 4 GB RAM, and 40 GB of SSD or NVMe leaves room for the app, its database, the deploy overlap, and three days of rollback images. Push the disk higher before you push the RAM higher: memory pressure announces itself, while image accumulation does not. For more options, explore our full VPS comparison to find the best match for your deployment.
Frequently asked questions
How much RAM does a VPS need to be a Kamal deploy target?
Enough for your app, its accessories, and one extra copy of the app container. During a deploy the old and new containers run at the same time, so peak memory is roughly your steady-state usage plus one app container. On a 4 GB host with a 1 GB app that is comfortable; add swap if it is tight.
Does Kamal itself consume CPU or memory on the server?
No. Kamal is a gem you run from your own machine or CI, and it exits when the deploy finishes. The only permanent addition to the host is kamal-proxy, a small Go HTTP proxy whose usage is negligible next to any real application.
Why does a Kamal host run out of disk space over time?
Kamal retains old containers and images so rollbacks do not need a registry pull, pruning them after three days by default. Frequent deploys of a large image accumulate quickly, and the disk usually fills partway through a later deploy rather than during the one that caused it.