Louis stocke trois types de données critiques :
- Postgres : utilisateurs, conversations, messages, provider keys chiffrées, connecteurs, audit log, workflows, projets, etc.
- Object storage (S3-compatible) : binaires des documents uploadés (PDF, DOCX, texte) + PDFs preview générés
ENCRYPTION_KEYetAUTH_SECRET: si perdues, toutes les clés provider stockées deviennent inutilisables, et toutes les sessions JWT sont invalidées
Une stratégie de backup robuste couvre les trois.
Le script ../../scripts/backup.sh fait :
pg_dump $DATABASE_URL → louis-TIMESTAMP.sql
gpg --symmetric --cipher-algo AES256 → louis-TIMESTAMP.sql.gpg
shred le dump en clairVariables requises :
DATABASE_URL: la chaîne de connexionBACKUP_PASSPHRASE: différente deENCRYPTION_KEY(cf. ci-dessous)BACKUP_DIR(optionnel) : dossier de destination (défaut./backups)
Si vous rotez ENCRYPTION_KEY (typiquement parce qu'elle a fuité ou pour
respecter une politique), Louis re-chiffre toutes les provider keys en DB
avec la nouvelle. L'ancien backup, chiffré avec l'ancienne ENCRYPTION_KEY,
contient les anciennes clés re-chiffrées. Donc :
- Si vous utilisez
ENCRYPTION_KEYcomme passphrase de backup, la rotation rend l'ancien backup inrestaurable (vous n'avez plus l'ancienne clé) - Avec une
BACKUP_PASSPHRASEindépendante, vous pouvez restaurer un ancien backup, puis re-chiffrer les provider keys avec la nouvelleENCRYPTION_KEY
# Toutes les nuits à 03:00 (heure serveur)
0 3 * * * cd /opt/louis && BACKUP_PASSPHRASE="$(cat /etc/louis/backup-passphrase)" ./scripts/backup.shgpg --decrypt louis-2026-05-16T03-00-00Z.sql.gpg | psql $DATABASE_URLPas de script intégré — utilisez rclone, aws-cli sync, ou les outils
natifs de votre provider :
# Exemple rclone vers un second bucket / un disque local chiffré
rclone sync louis-storage:/ /backup/storage-2026-05-16/Une bonne pratique : différer la rétention DB et stockage (ex. DB gardée 30 jours, storage 90 jours) pour pouvoir restaurer un état cohérent des deux à tout moment.
ENCRYPTION_KEY, AUTH_SECRET, BACKUP_PASSPHRASE : stocker dans un
gestionnaire de secrets (Vault, AWS Secrets Manager, Scaleway Secret
Manager, OVH KMS, 1Password Business, Bitwarden Business). JAMAIS dans
le repo, JAMAIS dans le backup non chiffré.
En cas de perte d'ENCRYPTION_KEY : les conversations / documents
restent lisibles (pas chiffrés en DB), mais toutes les provider keys et
connecteurs deviennent inutilisables. Les utilisateurs devront
re-saisir leurs clés.
Tester votre backup avant d'en avoir besoin. Une fois par trimestre au moins :
- Cloner Louis dans un dossier de staging
- Restaurer un dump récent
- Configurer une
ENCRYPTION_KEYtest - Tenter de lister les utilisateurs, les conversations, et un document
- Confirmer que la décompression et l'authentification fonctionnent