From 02df6c10a05702f2a888bf0de016cee4c6aedc87 Mon Sep 17 00:00:00 2001 From: Colin Maudry Date: Wed, 24 Jun 2026 17:29:03 +0200 Subject: [PATCH] =?UTF-8?q?feat(backup):=20unit=C3=A9s=20systemd,=20variab?= =?UTF-8?q?les=20d'env=20et=20doc=20de=20d=C3=A9ploiement=20(#89)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Ajoute les artefacts de déploiement finaux pour la sauvegarde systématisée de users.sqlite sur S3 : - Service systemd pour exécuter le backup (oneshot) - Timer systemd pour le déclencher toutes les heures - Variables d'env pour configuration S3 et chiffrement - Documentation d'installation et restauration dans CLAUDE.md - Guide rapide dans README.md Co-Authored-By: Claude Sonnet 4.6 --- .template.env | 11 +++++++++++ CLAUDE.md | 23 +++++++++++++++++++++++ README.md | 18 ++++++++++++++++++ deploy/decpinfo-backup.service | 11 +++++++++++ deploy/decpinfo-backup.timer | 9 +++++++++ 5 files changed, 72 insertions(+) create mode 100644 deploy/decpinfo-backup.service create mode 100644 deploy/decpinfo-backup.timer diff --git a/.template.env b/.template.env index aa95306..410b43c 100644 --- a/.template.env +++ b/.template.env @@ -39,3 +39,14 @@ BREVO_TEMPLATE_VERIFY_ID= # ID numérique du template "vérification BREVO_TEMPLATE_RESET_ID= # ID numérique du template "réinitialisation mot de passe" MAIL_FROM=noreply@decp.info # expéditeur (doit être un expéditeur vérifié dans Brevo) MAIL_FROM_NAME=decp.info # nom d'expéditeur + +# Sauvegarde de users.sqlite vers un stockage S3-compatible +S3_ENDPOINT_URL=https://s3.exemple.net +S3_BUCKET=decp-backups +S3_BACKUP_PREFIX=backups +S3_ACCESS_KEY_ID= +S3_SECRET_ACCESS_KEY= +# Clé Fernet : générer avec +# python -c "from cryptography.fernet import Fernet; print(Fernet.generate_key().decode())" +# À CONSERVER HORS DU SERVEUR : sans elle, les sauvegardes sont irrécupérables. +BACKUP_ENCRYPTION_KEY= diff --git a/CLAUDE.md b/CLAUDE.md index 5af8a09..f4cbc8e 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -96,3 +96,26 @@ Tests require a running Chrome/Chromium browser. They use `DashComposite` from ` - `main` branch → manual deploy to decp.info via GitHub Actions - `dev` branch → auto-deploy to test.decp.info via GitHub Actions + +#### Sauvegarde de la base utilisateurs + +`users.sqlite` est sauvegardée toutes les heures sur S3 par un timer systemd +(voir `deploy/decpinfo-backup.{service,timer}`). Installation initiale (une fois, +sur le serveur, en root) : + +```bash +cp deploy/decpinfo-backup.service deploy/decpinfo-backup.timer /etc/systemd/system/ +systemctl daemon-reload +systemctl enable --now decpinfo-backup.timer +systemctl list-timers decpinfo-backup.timer # vérifier le prochain déclenchement +``` + +Restauration manuelle : + +```bash +cd /var/www/decpinfo && source .venv/bin/activate +python -m src.backup list +systemctl stop decpinfo +python -m src.backup restore backups/users-YYYYMMDDTHHMMSSZ.sqlite.gz.enc +systemctl start decpinfo +``` diff --git a/README.md b/README.md index 0378501..72e9030 100644 --- a/README.md +++ b/README.md @@ -25,6 +25,24 @@ uv run run.py Ne pas oublier de mettre à jour les fichier .env. +### Sauvegarde de la base utilisateurs + +`users.sqlite` est sauvegardée toutes les heures sur S3 via un timer systemd. Pour lister les sauvegardes disponibles : + +```bash +python -m src.backup list +``` + +Pour restaurer une sauvegarde, arrêtez le service, restaurez la base, puis redémarrez : + +```bash +systemctl stop decpinfo +python -m src.backup restore backups/users-YYYYMMDDTHHMMSSZ.sqlite.gz.enc +systemctl start decpinfo +``` + +Voir `CLAUDE.md` pour la documentation complète de déploiement. + ## Liens connexes - [decp-processing](https://github.com/ColinMaudry/decp-processing) (traitement et publication des données) diff --git a/deploy/decpinfo-backup.service b/deploy/decpinfo-backup.service new file mode 100644 index 0000000..bec0999 --- /dev/null +++ b/deploy/decpinfo-backup.service @@ -0,0 +1,11 @@ +[Unit] +Description=Sauvegarde horaire de users.sqlite (decp.info) vers S3 +After=network-online.target +Wants=network-online.target + +[Service] +Type=oneshot +User=decpinfo +WorkingDirectory=/var/www/decpinfo +EnvironmentFile=/var/www/decpinfo/.env +ExecStart=/var/www/decpinfo/.venv/bin/python -m src.backup backup diff --git a/deploy/decpinfo-backup.timer b/deploy/decpinfo-backup.timer new file mode 100644 index 0000000..c77aace --- /dev/null +++ b/deploy/decpinfo-backup.timer @@ -0,0 +1,9 @@ +[Unit] +Description=Déclenche la sauvegarde horaire de users.sqlite (decp.info) + +[Timer] +OnCalendar=hourly +Persistent=true + +[Install] +WantedBy=timers.target