Créer la page Déploiement du wiki
123
D%C3%A9ploiement.md
Normal file
123
D%C3%A9ploiement.md
Normal file
@@ -0,0 +1,123 @@
|
||||
# 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
|
||||
.venv/bin/python scripts/check_secrets.py
|
||||
.venv/bin/python -m pip check
|
||||
.venv/bin/pronote-sync --dry-run
|
||||
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`.
|
||||
Reference in New Issue
Block a user