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
# 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
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é.
Contrôles pré-déploiement
.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/etGUIDE_DEV_PYTHON.md. - Utilisez
--stagedpour 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, avecPersistent=true)
Le service utilise les protections suivantes : NoNewPrivileges, PrivateTmp, ProtectHome, ProtectSystem=strict, ReadWritePaths pour l'état et les logs.
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
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
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
0640pour le compte de service
sudo install -m 0644 deploy/logrotate/pronote_sync /etc/logrotate.d/pronote_sync
sudo logrotate --debug /etc/logrotate.d/pronote_sync
Mise à jour
# 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 pour les variables d'environnement, Sécurité pour la gestion des secrets et check_secrets.