Files

158 lines
5.1 KiB
Markdown

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