94 lines
2.5 KiB
Markdown
94 lines
2.5 KiB
Markdown
# Deploying Docker Apps with Secrets (GitOps & Vault)
|
|
|
|
Dieses Dokument erklärt, wie du eine neue Docker-Anwendung hinzufügst und wie der Secret-Flow von Vault bis in den Container funktioniert.
|
|
|
|
---
|
|
|
|
## 1. App erstellen (Lokal)
|
|
|
|
Lege einen neuen Ordner unter `infrastructure/apps/` an, z.B. `nextcloud`.
|
|
Erstelle dort eine `docker-compose.yml`.
|
|
|
|
### Secrets nutzen
|
|
Statt Passwörter hardzucoden, nutze Umgebungsvariablen (`${VAR_NAME}`).
|
|
|
|
**Beispiel `infrastructure/apps/nextcloud/docker-compose.yml`:**
|
|
```yaml
|
|
services:
|
|
db:
|
|
image: mariadb
|
|
environment:
|
|
- MYSQL_ROOT_PASSWORD=${DB_ROOT_PASSWORD} # Kommt aus Vault/.env
|
|
- MYSQL_PASSWORD=${DB_PASSWORD} # Kommt aus Vault/.env
|
|
```
|
|
|
|
---
|
|
|
|
## 2. Secrets in Vault anlegen
|
|
|
|
Damit Ansible die Variablen (`DB_ROOT_PASSWORD`, etc.) kennt, müssen sie in Vault liegen.
|
|
Jede App hat ihren eigenen Pfad: `secret/apps/<app-name>`.
|
|
|
|
### Manuell anlegen (via CLI)
|
|
```bash
|
|
export VAULT_ADDR='https://10.100.30.11:8200'
|
|
export VAULT_TOKEN='<Dein-Token>' # Root- oder Admin-Token
|
|
|
|
vault kv put secret/apps/nextcloud \
|
|
DB_ROOT_PASSWORD="super-secret-root-pw" \
|
|
DB_PASSWORD="user-db-pw"
|
|
```
|
|
|
|
### Manuell anlegen (via UI)
|
|
1. Öffne `https://10.100.30.11:8200`
|
|
2. Gehe zu `secret` -> `apps`.
|
|
3. Erstelle Secret `nextcloud`.
|
|
4. Füge Key-Value Paare hinzu.
|
|
|
|
---
|
|
|
|
## 3. App zuweisen (Deployment Config)
|
|
|
|
Sage dem Server, dass er die App starten soll.
|
|
Editiere `infrastructure/deployments/<server-name>.yml`.
|
|
|
|
```yaml
|
|
apps:
|
|
- name: nextcloud
|
|
has_secrets: true # WICHTIG: Setze auf true, damit Ansible im Vault sucht!
|
|
```
|
|
|
|
---
|
|
|
|
## 4. Push & Deploy (GitOps)
|
|
|
|
1. Commite und pushe deine Änderungen.
|
|
2. Warte 5 Minuten (automatischer Pull) oder starte manuell via Ansible (Push).
|
|
|
|
---
|
|
|
|
## 5. Was passiert im Hintergrund? (Der Flow)
|
|
|
|
Hier geschieht die Magie, wenn Ansible läuft (egal ob Push oder Pull):
|
|
|
|
1. **Lookup:**
|
|
Ansible sieht `has_secrets: true`.
|
|
Es fragt Vault: "Gib mir alle Keys unter `secret/apps/nextcloud`."
|
|
|
|
2. **Generierung:**
|
|
Ansible nimmt diese Keys und erstellt eine `.env` Datei im Zielordner auf dem Server (`/opt/nextcloud/.env`).
|
|
|
|
*Inhalt der .env:*
|
|
```env
|
|
DB_ROOT_PASSWORD=super-secret-root-pw
|
|
DB_PASSWORD=user-db-pw
|
|
```
|
|
|
|
3. **Start:**
|
|
Ansible führt `docker compose up -d` aus.
|
|
Docker Compose lädt automatisch die `.env` Datei im selben Ordner.
|
|
Die Variablen `${DB_ROOT_PASSWORD}` in der YAML werden mit den Werten aus der `.env` gefüllt.
|
|
|
|
**Ergebnis:** Deine App läuft mit sicheren Passwörtern, die nie im Git standen.
|
|
|