diff --git a/D%C3%A9ploiement.md b/D%C3%A9ploiement.md new file mode 100644 index 0000000..9838be3 --- /dev/null +++ b/D%C3%A9ploiement.md @@ -0,0 +1,132 @@ +# Déploiement + +## Prérequis + +- Python ≥ 3.13.5 +- Git +- Un compte de service non-root (ex: `pronote-sync`) +- Chemins cibles : + - `/opt/pronote-sync` (code) + - `/var/lib/pronote-sync` (état) + - `/var/log/pronote-sync` (logs) + - `/etc/pronote-sync` (configuration) + +## Installation + +```bash +# Créer le compte de service +sudo useradd --system --no-create-home --shell /usr/sbin/nologin pronote-sync + +# Cloner le dépôt +sudo git clone https://git.antoineve.me/AntoineVe/college-infos /opt/pronote-sync +sudo chown -R pronote-sync:pronote-sync /opt/pronote-sync + +# Créer l'environnement virtuel +cd /opt/pronote-sync +sudo -u pronote-sync python3.13 -m venv .venv +sudo -u pronote-sync .venv/bin/pip install -e ".[dev]" + +# Créer les répertoires +sudo install -d -m 0700 -o pronote-sync -g pronote-sync /etc/pronote-sync +sudo install -d -m 0750 -o pronote-sync -g pronote-sync /var/lib/pronote-sync +sudo install -d -m 0750 -o pronote-sync -g pronote-sync /var/log/pronote-sync +``` + +## Configuration + +```bash +sudo -u pronote-sync cp /opt/pronote-sync/.env.example /etc/pronote-sync/pronote-sync.env +``` + +L'opérateur doit renseigner les secrets (`PRONOTE_PASSWORD`, `CALDAV_PASSWORD`, `XMPP_PASSWORD`, `AI_API_KEY`) dans ce fichier. + +Ne jamais placer de secret dans une unité systemd, une commande shell ou un journal. Voir [Sécurité](Sécurité). + +## Contrôles pré-déploiement + +```bash +.venv/bin/python scripts/check_secrets.py +.venv/bin/python -m pip check +.venv/bin/pronote-sync --dry-run +``` + +- `check_secrets.py` : + - Sort avec le code **0** (propre), **1** (secrets détectés), **2** (erreur). + - Inspecte les fichiers textuels, en excluant `.env`, les environnements virtuels, les répertoires générés, `tests/` et `GUIDE_DEV_PYTHON.md`. + - Utilisez `--staged` pour vérifier uniquement les fichiers indexés par Git avant un commit. +- `pip check` : Vérifie la cohérence des dépendances. +- `--dry-run` : Valide le pipeline sans écrire dans CalDAV/XMPP. + +## Installation systemd + +Les fichiers fournis dans `deploy/systemd/` sont : + +- `pronote-sync.service` (oneshot, exécute la synchronisation) +- `pronote-sync.timer` (quotidien à 18:00, avec `Persistent=true`) + +Le service utilise les protections suivantes : `NoNewPrivileges`, `PrivateTmp`, `ProtectHome`, `ProtectSystem=strict`, `ReadWritePaths` pour l'état et les logs. + +```bash +sudo install -m 0644 deploy/systemd/pronote-sync.service /etc/systemd/system/ +sudo install -m 0644 deploy/systemd/pronote-sync.timer /etc/systemd/system/ +sudo systemctl daemon-reload +sudo systemctl enable --now pronote-sync.timer +systemctl list-timers pronote-sync.timer +``` + +Adaptez `User`, `Group`, `WorkingDirectory`, `EnvironmentFile`, les chemins dans `ExecStartPre`, `ExecStart`, `StateDirectory`, `LogsDirectory` et `ReadWritePaths` avant l'installation. + +## Test manuel + +```bash +sudo systemctl start pronote-sync.service +sudo systemctl status pronote-sync.service +``` + +Une exécution en échec laisse le service en état **failed** : configurez une supervision pour alerter sur cet état. + +## Journaux + +```bash +sudo tail -f /var/log/pronote-sync/pronote-sync.log +sudo journalctl -u pronote-sync.service --since today +sudo journalctl -u pronote-sync.service -f +systemctl status pronote-sync.timer +``` + +## Rotation des journaux + +La configuration `deploy/logrotate/pronote_sync` applique : + +- Rotation quotidienne +- 7 archives conservées +- Compression avec `delaycompress` +- Création du fichier avec le mode `0640` pour le compte de service + +```bash +sudo install -m 0644 deploy/logrotate/pronote_sync /etc/logrotate.d/pronote_sync +sudo logrotate --debug /etc/logrotate.d/pronote_sync +``` + +## Mise à jour + +```bash +# Récupérer la nouvelle version du code +sudo -u pronote-sync git -C /opt/pronote-sync pull --ff-only + +# Mettre à jour les dépendances +sudo -u pronote-sync /opt/pronote-sync/.venv/bin/pip install -e ".[dev]" + +# Contrôles pré-redémarrage +sudo -u pronote-sync /opt/pronote-sync/.venv/bin/python scripts/check_secrets.py +sudo -u pronote-sync /opt/pronote-sync/.venv/bin/python -m pip check +sudo -u pronote-sync /opt/pronote-sync/.venv/bin/pronote-sync --dry-run + +# Recharger et redémarrer +sudo systemctl daemon-reload +sudo systemctl restart pronote-sync.timer +sudo systemctl start pronote-sync.service +journalctl -u pronote-sync.service -n 100 --no-pager +``` + +Voir aussi : [Configuration](Configuration) pour les variables d'environnement, [Sécurité](Sécurité) pour la gestion des secrets et `check_secrets`. \ No newline at end of file