# 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 ```bash # 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 ```nginx # /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; } } ``` ```nginx # /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) ```bash 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 ```bash # 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 ```bash # 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:** ```bash 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).