# 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/`. ### Manuell anlegen (via CLI) ```bash export VAULT_ADDR='https://10.100.30.11:8200' export VAULT_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/.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.