Initial: Mesh-Skills, Configs, Scripts
This commit is contained in:
@@ -0,0 +1,158 @@
|
||||
# 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).
|
||||
Reference in New Issue
Block a user