1 Secrets
pepper edited this page 2026-06-27 03:07:55 +00:00

🔑 Secrets — Gestion des mots de passe

Principe

Aucun mot de passe n'est en clair dans docker-compose.yml ou .env.

Tous les secrets sont des fichiers texte dans ./secrets/ :

  • Montés en lecture seule via Docker secrets (/run/secrets/<nom>)
  • Accessibles uniquement aux services qui en ont besoin
  • Exclus du dépôt git (secrets/ dans .gitignore)

Liste des secrets

Fichier Usage
authentik_db_password.txt Mot de passe PostgreSQL rôle authentik_user
authentik_secret_key.txt Clé secrète Django Authentik (SECRET_KEY)
forgejo_db_password.txt Mot de passe PostgreSQL rôle forgejo_user
nextcloud_db_password.txt Mot de passe PostgreSQL rôle nextcloud_user
nextcloud_admin_password.txt Mot de passe admin Nextcloud (init uniquement)
redis_password.txt Mot de passe Redis Authentik
redis_nextcloud_password.txt Mot de passe Redis Nextcloud
grafana_oauth_secret.txt Client secret OIDC Grafana ↔ Authentik
grafana_admin_password.txt Mot de passe admin local Grafana
jellyfin_api_key.txt Clé API Jellyfin (utilisée par jellyfin-sso-init)
jellyfin_sso_secret.txt Client secret OIDC Jellyfin ↔ Authentik
crowdsec_api_key.txt Clé API bouncer SWAG ↔ CrowdSec LAPI
hcaptcha_site_key.txt Clé publique hCaptcha (visible dans le HTML)
hcaptcha_secret_key.txt Clé secrète hCaptcha (validation côté serveur)
forgejo_git_token.txt Token API Forgejo pour git-push.sh

Comment un service lit un secret

Services supportant _FILE nativement

environment:
  - POSTGRES_PASSWORD_FILE=/run/secrets/db_password
secrets:
  - db_password

Services sans support _FILE (Redis, Authentik, Grafana...)

L'entrypoint lit le fichier et exporte la variable avant de lancer le programme :

#!/bin/sh
export REDIS_PASSWORD="$(cat /run/secrets/redis_password)"
exec redis-server --requirepass "$REDIS_PASSWORD"

Pattern FILE__* (SWAG / CrowdSec bouncer)

environment:
  - FILE__CROWDSEC_SITE_KEY=/run/secrets/hcaptcha_site_key

Le mod lit le fichier au démarrage et remplace la variable.


Créer un nouveau secret

# 1. Générer un mot de passe fort
openssl rand -base64 32 > secrets/nouveau_service_password.txt
chmod 600 secrets/nouveau_service_password.txt

# 2. Déclarer dans docker-compose.yml
# Section globale `secrets:` :
secrets:
  nouveau_service_password:
    file: ./secrets/nouveau_service_password.txt

# Section du service :
services:
  mon-service:
    secrets:
      - nouveau_service_password

# 3. Recréer le service
sudo docker compose up -d mon-service

Changer un mot de passe existant

# 1. Mettre à jour le fichier secret
echo "nouveau_mot_de_passe" > secrets/<nom>.txt

# 2. Si c'est un mot de passe PostgreSQL, mettre à jour la base
sudo docker exec -it postgresql psql -U postgres -c "ALTER ROLE <user> PASSWORD 'nouveau_mot_de_passe';"

# 3. Recréer le(s) service(s) concerné(s)
sudo docker compose up -d --force-recreate <service>

Sécurité des fichiers

# Vérifier les permissions (doivent être 600 ou 640)
ls -la secrets/

# Corriger si nécessaire
chmod 600 secrets/*.txt

Les secrets sont sauvegardés dans backup.sh (inclus dans l'archive) et exclus du dépôt git.