EQVPS

Wie man einen Docker-Compose-Stack auf einem VPS deployt

Deploye einen Multi-Container-Stack auf einem VPS mit Docker Compose: schreibe docker-compose.yml, halte Secrets in .env, bring ihn mit Neustart-nach-Reboot hoch und veröffentliche nur die Ports, die du wirklich meinst. Copy-paste-Beispiel mit Web-App, Datenbank und Reverse Proxy.

Docker Compose beschreibt einen Multi-Container-Stack in einer Datei und fährt ihn mit einem Befehl. Das ist die Deploy-Anleitung; installiere zuerst Docker, falls noch nicht geschehen. Für einen KI-Agenten-spezifischen Stack (Agent + Vektor-DB + Redis) siehe docker-compose für KI-Agenten.

1. Ein Stack: App + Datenbank + 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 liegen in .env, niemals in der Compose-Datei:

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

Eine minimale Caddyfile proxyt deine Domain zur App und holt sich HTTPS selbst:

app.yourdomain.com {
  reverse_proxy app:8080
}

2. Hochfahren

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

restart: unless-stopped auf jedem Dienst + Docker beim Boot aktiviert = der Stack kommt nach einem Reboot von selbst zurück.

3. Alltagsbefehle

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

Der Teil, den viele falsch machen: freigegebene Ports

Docker veröffentlicht Ports über iptables, also ist ein Container mit ports: ["5432:5432"] aus dem Internet erreichbar, selbst hinter einer UFW-Firewall, die du für geschlossen hieltest. Veröffentliche nur den öffentlichen Einstiegspunkt (den Proxy auf 80/443); halte Datenbanken und Caches im Compose-Netzwerk oder an 127.0.0.1 gebunden. Alles, was Web-Traffic ausliefert, braucht einen Tarif mit dedizierter IP; kombiniere mit einer UFW-Firewall.

Für einen ganzen Stack hinter einer IP siehe mehrere Dienste selbst hosten. Root in etwa einer Minute, NVMe, kein KYC, Zahlung in Krypto.

FAQ

Wie deploye ich einen Docker-Compose-Stack auf einem VPS?

Installiere Docker mit dem Compose-Plugin, schreibe eine docker-compose.yml, die jeden Dienst beschreibt, halte Secrets in einer git-ignorierten .env, dann docker compose up -d. Setze restart: unless-stopped auf jeden Dienst und aktiviere Docker beim Boot, damit der Stack Neustarts übersteht. Das Beispiel unten fährt eine Web-App, Postgres und einen Caddy-Reverse-Proxy.

Wohin kommen Secrets — in die Compose-Datei?

Nein. Leg sie in eine .env-Datei (chmod 600, git-ignoriert) und referenziere sie als ${VAR} in Compose, oder nutze Docker-Secrets. Committe niemals Passwörter oder API-Schlüssel in docker-compose.yml — eine geleakte Datei mit gültigen Zugangsdaten ist der klassische Fehler.

Kommt der Stack nach einem Reboot zurück?

Nur, wenn du es ihm sagst. Setze restart: unless-stopped (oder always) auf jeden Dienst und aktiviere Docker beim Boot (systemctl enable docker). Dann übersteht docker compose up -d Neustarts und startet abgestürzte Container neu.

Welche Ports werden freigegeben?

Nur was du mit ports: veröffentlichst. Binde interne Dienste (Datenbanken, Caches) ans Compose-Netzwerk oder an 127.0.0.1 und veröffentliche nur den öffentlichen Einstiegspunkt — meist ein Reverse Proxy auf 80/443. Docker veröffentlicht über iptables, also ist eine versehentliche ports:-Zeile aus dem Internet erreichbar, selbst hinter UFW.

Verlangt ihr Ausweis oder Karte?

Nein. E-Mail zum Registrieren, Zahlung in USDC oder USDT — keine Dokumente, keine Karte. Root in etwa einer Minute.

Kommentare

Noch keine Kommentare. Sei der Erste.

Kommentar hinterlassen

Kommentare werden vor der Anzeige moderiert.