3
Déploiement
Antoine Van Elstraete edited this page 2026-09-08 18:09:10 +02:00

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/ 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.

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 0640 pour 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.