Independent testing Updated July 2026 387 self-hosting guides 5 VPS providers tested

guide

Deployen naar een VPS met Kamal (Volledige Gids)

Kamal zet je Docker-app via SSH op een gewone VPS, zonder Kubernetes. Schrijf config/deploy.yml, kies de juiste servergrootte en lever uit zonder downtime.

Kamal draait niet op je VPS. Het is een deploytool die je op je eigen machine of CI-runner installeert en die via SSH verbinding maakt met de server. Basecamp bouwde het om Rails-applicaties zonder Kubernetes uit te rollen, maar het deployt alles wat je in een Docker-image kunt bouwen.

Dat onderscheid verandert waar je naar zoekt. De VPS is Kamals doel en moet dus groot genoeg zijn voor je applicatie, de bijbehorende databases en een paar dagen aan imageversies. Kamal zelf legt geen beslag op de server.

Wat Kamal daadwerkelijk op de server achterlaat

kamal setup maakt verbinding via SSH (standaard als root, geauthenticeerd met je SSH-sleutel) en voert drie stappen uit: Docker installeren als het ontbreekt, de opgegeven accessories starten en dan de applicatie deployen. Daarna draait op de host:

Kamal zelf is een gem (gem install kamal, momenteel 2.12.0) en laat geen daemon achter.

Vereisten

Voordat je begint heb je nodig:

Een VPS-provider kiezen

Omdat de server alleen containers draait, beoordeel je providers op netwerkbetrouwbaarheid, schijfruimte en hoe snel je een host opnieuw kunt opbouwen:

ProviderPrijsKenmerkenAffiliate-link
Contabo VPS5.99 EUR/mnd400 GB schijf vangt grote images en een lange rollbackgeschiedenis opContabo VPS
Hetzner Cloud5.49 EUR/mnd2 vCPU / 4 GB / 40 GB NVMe, snapshots om snel opnieuw op te bouwenHetzner Cloud
DigitalOcean6 USD/mndBeste documentatie en API om de host zelf te scriptenDigitalOcean
Vultr5 USD/mndRuime regiokeuze om de app dicht bij zijn gebruikers te zettenVultr
Linode5 USD/mndVoorspelbare prijzen, eenvoudige netwerkinrichtingLinode

Voor een volledige vergelijking, zie onze VPS-vergelijking.

DigitalOcean is hier het makkelijkste startpunt, omdat de documentatie precies het werk op hostniveau behandelt dat Kamal niet voor je doet: firewallregels, swap en automatische updates.

De server voorbereiden

  1. Zet de VPS op met een minimale Ubuntu 24.04-image en je SSH-sleutel eraan gekoppeld.
  2. Controleer of root via SSH werkt, want zo maakt Kamal standaard verbinding:
ssh root@jouw-vps-ip
  1. Open alleen wat nodig is. kamal-proxy handelt TLS op de server af, dus poorten 22, 80 en 443 volstaan:
ufw allow 22,80,443/tcp && ufw enable

Docker hoef je niet zelf te installeren. Kamal doet dat bij de eerste kamal setup als het ontbreekt.

Kamal installeren en de configuratie schrijven

Op je eigen machine, in de map van je applicatie:

gem install kamal
kamal init

kamal init maakt config/deploy.yml aan. Een minimaal werkende configuratie heeft een servicenaam, een image en minstens één host nodig:

service: myapp
image: your-registry-user/myapp

servers:
  web:
    hosts:
      - 203.0.113.10

registry:
  username: your-registry-user
  password:
    - KAMAL_REGISTRY_PASSWORD

proxy:
  ssl: true
  host: app.example.com

Secrets staan in .kamal/secrets, dat Kamal tijdens het deployen leest. Het zoekt eerst .kamal/secrets-common en daarna .kamal/secrets:

KAMAL_REGISTRY_PASSWORD=$KAMAL_REGISTRY_PASSWORD

Houd dat bestand buiten versiebeheer en haal de waarde uit je shell-omgeving of een wachtwoordmanager.

De eerste deploy

kamal setup

Dat ene commando installeert Docker, start de accessories, bouwt en pusht je image en start de applicatie. Elke volgende deploy is:

kamal deploy

Om te zien wat er op de host draait:

kamal app containers

Waar de image wordt gebouwd

Standaard bouwt Kamal lokaal, op de machine waarvandaan je het start, en pusht daarna naar de registry. De server haalt alleen op. Is je laptop arm64 en de VPS amd64, leg dan de doelarchitectuur vast of wijs Kamal naar een remote builder:

builder:
  arch: amd64
  remote: ssh://[email protected]

Cross-builden via emulatie is traag genoeg om bij elke deploy op te vallen. Is de VPS je enige amd64-machine, dan kan hij ook als builder dienen — maar kies dan de grootte voor een Docker-build en niet alleen voor het draaien van de app, wat meestal een pakket hoger betekent.

De schijf op maat kiezen

Kamal bewaart oude containers en images op de server zodat kamal rollback een vorige versie kan starten zonder opnieuw uit de registry te halen. Standaard ruimt het ze na drie dagen op. Reken op de eigen data van je applicatie plus zo’n drie dagen aan imageversies en hun gedeelde baselagen.

Een image van 1 GB die je een paar keer per dag uitrolt past ruim op de 40 GB NVMe van Hetzner. Een image van 3 GB vult een schijf van 25 GB binnen een week, en een volle schijf breekt de volgende deploy, niet de huidige — waardoor het probleem makkelijk te missen is tot het urgent wordt.

Omschakelen zonder downtime

kamal-proxy stuurt het verkeer pas naar de nieuwe container zodra die GET /up met een 200 beantwoordt. Daaruit volgen twee dingen:

Slaagt de health check nooit, dan loopt de deploy in een timeout en laat Kamal de oude container het verkeer bedienen.

De deploy beveiligen

Tot slot

Meer over het kiezen van de onderliggende server vind je in onze VPS-vergelijking.

Frequently asked questions

Draait Kamal op de VPS of op mijn eigen machine?

Kamal draait op je eigen machine of op je CI-runner. Het is een Ruby-gem die via SSH verbinding maakt met de server, Docker installeert als dat ontbreekt en je containers start. Op de VPS blijven alleen kamal-proxy en je app- en accessory-containers achter, nooit Kamal zelf.

Hoeveel schijfruimte heeft een VPS als Kamal-doelserver nodig?

Reken op de data van je applicatie plus ongeveer drie dagen aan imageversies, want Kamal bewaart oude containers en images voor rollbacks en ruimt ze pas na drie dagen op. Een image van 1 GB die je een paar keer per dag uitrolt past op 40 GB; een image van 3 GB past niet op 25 GB.

Waarom loopt mijn Kamal-deploy in een timeout en draait hij terug?

kamal-proxy verlegt het verkeer pas als de nieuwe container GET /up met een 200 beantwoordt. Heeft je applicatie dat endpoint niet, of geeft het nog een fout terwijl de app opstart, dan slaagt de health check nooit en herstelt Kamal de vorige container.