Guide pratique pour faire évoluer l'application capbe-agro. Les mêmes
commandes servent avec ou sans IA : une IA (agent de code) peut manipuler
les fichiers locaux puis utiliser les scripts deploy/ pour publier.
Règle d'or : jamais d'édition directe dans les conteneurs. On travaille en local (kit + source dev), puis on publie avec les scripts.
🚀 05/08/2026 — Messagerie centralisée (compte agro@ + audit + alias)
- Compte applicatif
agro@capbe.ovhcréé sur Stalwart (587 STARTTLS,MAIL_APP_AGRO_PASSdansplaybook/config/secrets.env) — prêt pour tout envoi futur (cf. section « Mail sortant » ci-dessous). - Alias
postmaster@capbe.ovh→admin@capbe.ovh(RFC 5321). - Audit délivrabilité global :
playbook/audit-deliverability.sh(4 comptes, sonde MX Gmail, chaîne DNS) — modes--alertet--install-cron(cron mensuel root). - Smoke-test §7
--app-accounts: auth SMTP 587 des 4 comptes.
✉️ 05/08/2026 — Mail sortant : capbe-mail (prêt à l'emploi)
Les notifications AGRO sont in-app (pas d'envoi email dans le backend). Si
un envoi email est ajouté plus tard, il doit passer par capbe-mail
(mail.capbe.ovh:587 STARTTLS + auth, compte agro@capbe.ovh,
MAIL_APP_AGRO_PASS dans playbook/config/secrets.env) — DKIM/SPF/DMARC
signés par capbe-mail (domaine capbe.ovh).
1. Cycle d'évolution de l'API (FastAPI)
1.1 Récupérer le code (une seule fois, ou à chaque base de travail)
sudo ./deploy/deploy-api.sh --pull
# → copie /srv/agro/api (capbe-pgis) → ./api-work/ (sans .env ni __pycache__)
1.2 Modifier
Édite les fichiers dans ./api-work/ (ou dans la source dev
src/backend puis copie). Pour une évolution guidée par
IA, fournis à l'IA : le code local (./api-work/), la carte d'identité
(README.md), les conventions (docs/MIGRATION.md) et le point d'entrée
app/main.py.
NB : l'API agro gère ses migrations avec Alembic (
alembic/,alembic.ini) — après modification des modèles, lance la migration :alembic revision --autogenerate -m "..." && alembic upgrade head(dans./api-work/, avec les bonnes variables de connexion).
1.3 Tester en local (si possible)
# Dans ./api-work/ avec un venv :
# pip install -r requirements.txt
# uvicorn app.main:app --port 8001 (ou pytest, voir tests/)
1.4 Publier
sudo ./deploy/deploy-api.sh --push # code → pgis + restart agro-api
sudo ./ops/smoke-agro.sh # validation front + API + tenant
deploy-api.sh :
- ne pousse jamais le .env (les secrets restent sur pgis) ;
- réinstalle les dépendances uniquement si requirements.txt /
pyproject.toml a changé ;
- fait un healthcheck interne (/health sur :8001) après redémarrage.
1.5 Convention d'URL
L'API agro sert ses routes sous /api/v1/* (le front l'appelle ainsi). Le
bloc Caddy agro.app.ci.capbe.ovh relaye tout /api/* → pgis:8001 sans
rewrite (contrairement à meca). Nouveau endpoint = aucune modification
Caddy nécessaire (tout /api/* est relayé).
2. Cycle d'évolution du front (Flutter)
# 1. Modifier le code Flutter dans src/frontend
# 2. Builder :
cd src/frontend && flutter build web
# 3. Publier :
sudo ./deploy/deploy-front.sh # → capbe-agro:/var/www/html + restart nginx
# 4. Valider :
sudo ./ops/smoke-agro.sh
Le front est un build statique (SPA) : la logique métier vit dans l'API. Si l'appelleur doit changer d'URL d'API, préfère le même-origine (
/api/v1/*) déjà en place — aucun changement de build nécessaire.
3. Évolution du tenant Odoo (base agro)
# Tenant vierge initialisé à la migration (odoo -i base) : les données
# ERP se construisent via l'interface (https://agro.ci.capbe.ovh).
sudo ./ops/db.sh --write --shell odoo # psql interactif sur la base agro
⚠️ Le tenant agro est une base vierge (initialisée sans données métier) : toute donnée ERP est à créer via Odoo. Les modifications de schéma doivent passer par les mécanismes Odoo (install/upgrade de modules).
4. Sauvegarde / restauration projet
sudo ./ops/backup-agro.sh # dumps agro_api + agro + snapshot front + code API
# Restauration d'un dump :
sudo ./ops/db.sh --write --shell api # psql interactif → \i /tmp/dump.sql
La sauvegarde globale de l'infrastructure reste playbook/10-backup.sh
(cron 02h00) — ce kit est complémentaire (ciblé projet).
💾 Automatisée :
backup-agro.shtourne chaque nuit à 02h45 (cron root, décalé de la globale à 02h00) → log/var/log/capbe-agro-backup.log. Gardeflock: un run manuel pendant le cron est refusé proprement.⏱️ NB pool ZFS fichier-image : la création du snapshot front peut prendre 5-15 min quand le pool est chargé (constaté en réel). Piège évité : un
timeoutclient tue l'opération SERVEUR Incus — le script lance donc la création en arrière-plan sans timeout puis attend la présence effective du dataset ZFS (borne 20 min) avant de conclure (✓ ou WARN).
5. Supervision au quotidien
sudo /data/CAPBE/scripts/status-global.sh # 🌍 résumé GLOBAL des 2 kits en 1 commande
sudo ./ops/status.sh # tableau de bord complet
sudo ./ops/check-nightly.sh # ✅ le matin : le run de nuit (02h45) s'est-il bien passé ?
sudo ./ops/monitor-agro.sh # surveillance endpoints (manuel, ou cron auto toutes les 5 min)
sudo ./ops/logs.sh api # journaux agro-api (api|front|odoo|all, -f pour suivre)
sudo ./ops/api.sh --list # endpoints connus de l'API
sudo ./ops/api.sh health # exemple d'appel GET (lecture seule)
🌍
scripts/status-global.sh(racine du dépôt) : conteneurs Incus, santé des 2 kits (front/API/tenant Odoo), sauvegardes de nuit, crons, alertes récentes et état git — tout en une commande, sortie 0 = tout vert, 1 = point(s) rouge(s). ⏰ Automatisé : cron root 07h40 avec--alert→ trace journalière/var/log/capbe-status.log, et mail de synthèse (rapport complet, sujet[CAPBE] État global : N point(s) rouge(s)) uniquement si le statut n'est pas vert — rien n'est envoyé quand tout est vert (aucun bruit).🌙
check-nightly.sh: vérifie en une commande que la sauvegarde de nuit s'est bien passée (run présent et terminé, dumps SQL < 26 h, snapshot ZFS du kit < 26 h, snapshot global10-backup.sh< 26 h, aucune alerte mail depuis le run). Sortie 0 = nuit saine, 1 = problème(s) détaillés.⏰ Automatisé : lancé par cron chaque matin à 07h35 avec
--alert→ en cas d'échec, un mail[CAPBE-AGRO] Check nightly : échecest envoyé àadmin@capbe.ovh(SMTP 587 STARTTLS, mdp par environnement). Log :/var/log/capbe-check-nightly.log. Rien n'est envoyé quand la nuit est saine (aucun bruit).📮 Envoi des mails centralisé :
send_alert_mail()danslib/mail.sh(racine du dépôt — source UNIQUE, sourcée par la lib de kit) — SMTP 587 STARTTLS, mdp par environnement--env, jamais en argv — utilisée parmonitor-agro.sh,check-nightly.shetstatus-global.sh.📡 Monitoring automatique :
monitor-agro.shtourne toutes les 5 minutes (cron root) → log/var/log/capbe-monitor.log. En cas d'échec (front, API public/interne, endpoint kit, tenant Odoo, sauvegardes), une alerte mail est envoyée àadmin@capbe.ovhvia capbe-mail (SMTP 587 STARTTLS — mot de passe par environnement, jamais en argv).💾 Checks sauvegardes (fraîcheur < 26 h) : dumps SQL du kit, snapshot ZFS de
capbe-agro, snapshot ZFS global (10-backup.shvia capbe-pgis) — un cron backup manqué est donc détecté et alerté automatiquement. 📧 Alerte testée en réel (sur meca) : arrêt volontaire du service API → échecs détectés → mail reçu dans l'INBOX, puis redémarrage → tout vert.
6. Checklist d'une évolution livrée
- [ ] Code testé (tests de
./api-work/tests/si l'API, ou smoke manuel) - [ ] Migrations Alembic appliquées si les modèles ont changé
- [ ]
deploy-api.sh --push/deploy-front.shexécutés - [ ]
ops/smoke-agro.sh100 % vert - [ ]
ops/backup-agro.shlancé après une évolution majeure - [ ] Aucun secret dans le code poussé (
.envjamais copié)