Files
mesh-configs/skills/devops/web-hosting-deployment/references/docker-internal-services.md
T

5.1 KiB

Docker Internal Services Deployment (Gitea + Vaultwarden)

Anwendungsfall

Interne Dienste (Git-Server, Passwort-Manager, sonstige Web-Apps) auf einem VPS hinter nginx-Reverse-Proxy mit Let's Encrypt SSL betreiben. Dienste laufen als Docker-Container, sind nur für den Eigentümer bestimmt (oder registrierungsbeschränkt).

Beispiel-Stack

Dienst Docker-Image Port Subdomain Zweck
Gitea gitea/gitea:latest 3000 git.mehlzoerwer.de Eigener Git-Server für Skills/Configs
Vaultwarden vaultwarden/server:latest 4433 vault.perfekt-ohne-en.de Passwort-Manager (Bitwarden-kompatibel)

Deployment-Workflow

1. Docker-Container starten

# Verzeichnisse
mkdir -p /opt/gitea/data /opt/vaultwarden/data

# Gitea
docker run -d --name gitea --restart unless-stopped \
  -p 3000:3000 -p 2222:22 \
  -v /opt/gitea/data:/data \
  -e USER_UID=1000 -e USER_GID=1000 \
  gitea/gitea:latest

# Vaultwarden
ADMIN_TOKEN=$(openssl rand -base64 48)
docker run -d --name vaultwarden --restart unless-stopped \
  -p 4433:80 \
  -v /opt/vaultwarden/data:/data \
  -e SIGNUPS_ALLOWED=true \
  -e ADMIN_TOKEN=$ADMIN_TOKEN \
  -e DOMAIN=https://vault.perfekt-ohne-en.de \
  vaultwarden/server:latest

# Token sichern
echo "$ADMIN_TOKEN" > /opt/vaultwarden/admin_token.txt
chmod 600 /opt/vaultwarden/admin_token.txt

2. nginx-Reverse-Proxy pro Dienst

# /etc/nginx/sites-available/git.mehlzoerwer.de
server {
    listen 80;
    listen [::]:80;
    server_name git.mehlzoerwer.de;

    location / {
        proxy_pass http://127.0.0.1:3000;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}
# /etc/nginx/sites-available/vault.perfekt-ohne-en.de
server {
    listen 80;
    listen [::]:80;
    server_name vault.perfekt-ohne-en.de;

    location / {
        proxy_pass http://127.0.0.1:4433;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        # WebSocket-Support für Browser-Extension
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
    }
}

3. SSL (DNS muss bereits auf den Server zeigen)

certbot --nginx -d git.mehlzoerwer.de --non-interactive --agree-tos -m admin@domain.de
certbot --nginx -d vault.perfekt-ohne-en.de --non-interactive --agree-tos -m admin@domain.de

4. Nach SSL prüfen

# Prüfen ob bestehende Domains noch funktionieren (Certbot-Kollateral-Pitfall!)
for url in https://git.mehlzoerwer.de/ https://vault.perfekt-ohne-en.de/ https://mehlzoerwer.de/; do
  echo "$url → $(curl -sk -o /dev/null -w '%{http_code}' $url)"
done

Vaultwarden Setup

Schritt Aktion
1. Registrierung öffnen SIGNUPS_ALLOWED=true setzen, Container neustarten
2. Account erstellen https://vault.perfekt-ohne-en.de/ → "Create Account"
3. Registrierung schließen Container stoppen, mit SIGNUPS_ALLOWED=false neustarten
4. Admin-Panel https://vault.perfekt-ohne-en.de/admin → Admin-Token
5. Clients verbinden Bitwarden-Apps → eigene Server-URL eintragen

Gitea Mirror auf zweitem Server

# Auf UnraidHermes (zweiter Server)
sudo mkdir -p /opt/gitea-mirror/data
sudo tee /opt/gitea-mirror/docker-compose.yml > /dev/null << 'YAML'
services:
  gitea:
    image: gitea/gitea:latest
    container_name: gitea-mirror
    restart: unless-stopped
    ports:
      - "3001:3000"
    volumes:
      - /opt/gitea-mirror/data:/data
    environment:
      - USER_UID=1000
      - USER_GID=1000
YAML
cd /opt/gitea-mirror && sudo docker compose up -d

Pitfalls

⚠️ Certbot überschreibt bestehende SSL-Pfade

Nach certbot --nginx -d NEUE.DOMAIN.de prüfen ob bestehnde Domains noch ihr richtiges Zertifikat haben. Certbot kann ssl_certificate-Pfade in anderen vhosts überschreiben. → nginx-vhost-deployment Skill: "Certbot überschreibt SSL-Pfade in BESTEHENDEN vhosts"

⚠️ Vaultwarden Admin-Token sichern

openssl rand -base64 48 erzeugt einen Token. Dieser wird NUR beim ersten Start ausgegeben (in den Logs). Danach nie wieder. Sofort speichern:

echo "$ADMIN_TOKEN" > /opt/vaultwarden/admin_token.txt
chmod 600 /opt/vaultwarden/admin_token.txt

Alternativ: -e ADMIN_TOKEN_FILE=/data/admin_token — dann reicht die Datei im Volume-Verzeichnis, Container-Neustart überlebt den Token.

⚠️ Vaultwarden SIGNUPS_ALLOWED

Initial auf true setzen, damit der Eigentümer einen Account erstellen kann. Nach dem ersten Account: Container stoppen, mit SIGNUPS_ALLOWED=false neustarten. Kein Fremder kann sich danach registrieren.

⚠️ Docker-Gruppe für sudo-lose Ausführung

Sub-Agenten (UnraidHermes) haben mehlzoerwer nicht in der docker-Gruppe. Fix: sudo usermod -aG docker $USER && newgrp docker (einmalig, danach docker ohne sudo).