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).