EQVPS

Sådan deployer du en Docker Compose-stak på en VPS

Deploy en multi-container-stak på en VPS med Docker Compose: skriv docker-compose.yml, hold hemmeligheder i .env, kør den op med genstart-efter-reboot, og udgiv kun de porte, du mener. Copy-paste-eksempel med en webapp, database og reverse proxy.

Docker Compose beskriver en multi-container-stak i én fil og kører den med én kommando. Dette er deploy-guiden; installér Docker først, hvis du ikke har gjort det. For en AI-agent-specifik stak (agent + vektor-DB + Redis), se docker-compose til AI-agenter.

1. En stak: 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: {} }

Hemmeligheder bor i .env, aldrig i compose-filen:

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

En minimal Caddyfile proxyer dit domæne til appen og henter HTTPS af sig selv:

app.yourdomain.com {
  reverse_proxy app:8080
}

2. Kør den op

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

restart: unless-stopped på hver tjeneste + Docker aktiveret ved boot = stakken vender tilbage af sig selv efter et reboot.

3. Hverdagskommandoer

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

Den del folk gør forkert: eksponerede porte

Docker udgiver porte via iptables, så en container med ports: ["5432:5432"] er nåbar fra internettet selv bag en UFW-firewall, du troede var lukket. Udgiv kun det offentlige indgangspunkt (proxyen på 80/443); hold databaser og caches på compose-netværket eller bundet til 127.0.0.1. Alt, der serverer webtrafik, kræver et plan med dedikeret IP; kombinér med en UFW-firewall.

For en hel stak bag én IP, se self-host flere tjenester. Root på cirka et minut, NVMe, ingen KYC, betal i krypto.

FAQ

Hvordan deployer jeg en Docker Compose-stak på en VPS?

Installér Docker med Compose-pluginnet, skriv en docker-compose.yml, der beskriver hver tjeneste, hold hemmeligheder i en git-ignoreret .env, så docker compose up -d. Sæt restart: unless-stopped på hver tjeneste og aktivér Docker ved boot, så stakken overlever reboots. Eksemplet nedenfor kører en webapp, Postgres og en Caddy reverse proxy.

Hvor kommer hemmeligheder hen — i compose-filen?

Nej. Læg dem i en .env-fil (chmod 600, git-ignoreret) og referér dem som ${VAR} i compose, eller brug Docker secrets. Commit aldrig adgangskoder eller API-nøgler i docker-compose.yml — en lækket fil med aktive legitimationsoplysninger er den klassiske fejl.

Kommer stakken tilbage efter et reboot?

Kun hvis du siger det. Sæt restart: unless-stopped (eller always) på hver tjeneste og aktivér Docker ved boot (systemctl enable docker). Så overlever docker compose up -d reboots og genstarter crashede containere.

Hvilke porte eksponeres?

Kun det, du udgiver med ports:. Bind interne tjenester (databaser, caches) til compose-netværket eller 127.0.0.1 og udgiv kun det offentlige indgangspunkt — normalt en reverse proxy på 80/443. Docker udgiver via iptables, så en utilsigtet ports:-linje er nåbar fra internettet selv bag UFW.

Beder I om ID eller kort?

Nej. En e-mail for at tilmelde dig, betaling i USDC eller USDT — ingen dokumenter, intet kort. Root på cirka et minut.

Kommentarer

Ingen kommentarer endnu. Vær den første.

Skriv en kommentar

Kommentarer modereres, før de vises.