EQVPS

Hoe deploy je een Docker Compose-stack op een VPS

Deploy een multi-container-stack op een VPS met Docker Compose: schrijf docker-compose.yml, houd secrets in .env, breng hem omhoog met herstart-na-reboot en publiceer alleen de poorten die je echt bedoelt. Copy-paste-voorbeeld met een web-app, database en reverse proxy.

Docker Compose beschrijft een multi-container-stack in één bestand en draait hem met één commando. Dit is de deploy-handleiding; installeer eerst Docker als je dat nog niet hebt gedaan. Voor een AI-agent-specifieke stack (agent + vector-DB + Redis) zie docker-compose voor AI-agents.

1. Een stack: app + database + reverse proxy

# /opt/stack/docker-compose.yml
services:
  app:
    image: your/app:latest
    restart: unless-stopped
    env_file: [.env]
    depends_on: [db]
    # no ports: — reached only through the proxy below

  db:
    image: postgres:16-alpine
    restart: unless-stopped
    environment:
      POSTGRES_PASSWORD: ${DB_PASSWORD}
    volumes: ["pg:/var/lib/postgresql/data"]   # internal only

  caddy:                                        # HTTPS automatically
    image: caddy:2
    restart: unless-stopped
    ports: ["80:80", "443:443"]                 # the only public entrypoint
    volumes:
      - ./Caddyfile:/etc/caddy/Caddyfile
      - caddy_data:/data

volumes: { pg: {}, caddy_data: {} }

Secrets leven in .env, nooit in het compose-bestand:

# /opt/stack/.env  (chmod 600, git-ignored)
DB_PASSWORD=a-long-random-string

Een minimale Caddyfile proxyt je domein naar de app en haalt zelf HTTPS op:

app.yourdomain.com {
  reverse_proxy app:8080
}

2. Breng hem omhoog

cd /opt/stack
docker compose up -d
docker compose ps
docker compose logs -f app

restart: unless-stopped op elke service + Docker ingeschakeld bij het opstarten = de stack komt na een reboot vanzelf terug.

3. Dagelijkse commando's

docker compose pull && docker compose up -d   # update images
docker compose down                            # stop the stack
docker compose restart app                     # restart one service

Het deel dat mensen fout doen: blootgestelde poorten

Docker publiceert poorten via iptables, dus een container met ports: ["5432:5432"] is vanaf internet bereikbaar, zelfs achter een UFW-firewall die je gesloten waande. Publiceer alleen het publieke toegangspunt (de proxy op 80/443); houd databases en caches op het compose-netwerk of gebonden aan 127.0.0.1. Alles dat webverkeer aanbiedt heeft een plan met dedicated IP nodig; combineer met een UFW-firewall.

Voor een hele stack achter één IP zie meerdere services zelf hosten. Root in ongeveer een minuut, NVMe, geen KYC, betalen in crypto.

FAQ

Hoe deploy ik een Docker Compose-stack op een VPS?

Installeer Docker met de Compose-plugin, schrijf een docker-compose.yml die elke service beschrijft, houd secrets in een git-genegeerde .env, dan docker compose up -d. Zet restart: unless-stopped op elke service en schakel Docker in bij het opstarten zodat de stack reboots overleeft. Het voorbeeld hieronder draait een web-app, Postgres en een Caddy reverse proxy.

Waar gaan secrets — in het compose-bestand?

Nee. Zet ze in een .env-bestand (chmod 600, git-genegeerd) en verwijs ernaar als ${VAR} in compose, of gebruik Docker secrets. Commit nooit wachtwoorden of API-sleutels in docker-compose.yml — een gelekt bestand met geldige inloggegevens is de klassieke fout.

Komt de stack terug na een reboot?

Alleen als je het hem zegt. Zet restart: unless-stopped (of always) op elke service en schakel Docker in bij het opstarten (systemctl enable docker). Dan overleeft docker compose up -d reboots en herstart gecrashte containers.

Welke poorten worden blootgesteld?

Alleen wat je publiceert met ports:. Bind interne services (databases, caches) aan het compose-netwerk of aan 127.0.0.1 en publiceer alleen het publieke toegangspunt — meestal een reverse proxy op 80/443. Docker publiceert via iptables, dus een per ongeluk toegevoegde ports:-regel is vanaf internet bereikbaar, zelfs achter UFW.

Vragen jullie om een identiteitsbewijs of kaart?

Nee. Een e-mail om je aan te melden, betalen in USDC of USDT — geen documenten, geen kaart. Root in ongeveer een minuut.

Reacties

Nog geen reacties. Wees de eerste.

Laat een reactie achter

Reacties worden gemodereerd voordat ze verschijnen.