📚 Documentation CerOps
Ce dossier contient la documentation fonctionnelle et technique du projet CerOps.
Objectif
Centraliser la vision produit, les choix techniques et les règles métier afin de :
- faciliter le développement
- aligner l’équipe
- préparer les livrables (école / pitch / démo)
Structure
parcelles.md→ gestion des parcelles agricolesagriculteurs.md→ gestion des utilisateurs agriculteurspilotes-drone.md→ gestion des pilotes de dronemarketplace.md→ mise en relation agriculteurs ↔ pilotesimagerie-parcellaire.md→ traitement et exploitation des imagesplan-actions.md→ recommandations et suivi d’actionsmobile-map-offline.md→ fonctionnement mobile + offlineapi-contrats.md→ contrats entre frontend et backend
Règles
- 1 fichier = 1 domaine
- Utiliser le template commun
- Mettre à jour la doc en même temps que le code
🎯 [Nom du module]
Contexte
Décrire le rôle de ce module dans CerOps.
Objectif
Quel problème ce module résout ?
Utilisateurs concernés
- Agriculteur
- Pilote de drone
- Admin
- Autre ?
Fonctionnalités (User Stories)
- En tant que …, je veux …, afin de …
Données manipulées
- Entités
- Champs importants
- Relations
API / Interfaces
- Endpoints concernés
- Inputs / outputs
Écrans / UX
- Pages / composants liés
- Comportements attendus
Cas limites
- Offline ?
- Erreurs ?
- Données manquantes ?
Critères d’acceptation
- …
- …
Dépendances
- Backend
- Mobile
- Drone
- Autres modules
MVP vs Post-MVP
MVP
- …
Post-MVP
- …
🎯 [Nom du module]
Contexte
Décrire le rôle de ce module dans CerOps.
Objectif
Quel problème ce module résout ?
Utilisateurs concernés
- Agriculteur
- Pilote de drone
- Admin
- Autre ?
Fonctionnalités (User Stories)
- En tant que …, je veux …, afin de …
Données manipulées
- Entités
- Champs importants
- Relations
API / Interfaces
- Endpoints concernés
- Inputs / outputs
Écrans / UX
- Pages / composants liés
- Comportements attendus
Cas limites
- Offline ?
- Erreurs ?
- Données manquantes ?
Critères d’acceptation
- …
- …
Dépendances
- Backend
- Mobile
- Drone
- Autres modules
MVP vs Post-MVP
MVP
- …
Post-MVP
- …
🎯 [Nom du module]
Contexte
Décrire le rôle de ce module dans CerOps.
Objectif
Quel problème ce module résout ?
Utilisateurs concernés
- Agriculteur
- Pilote de drone
- Admin
- Autre ?
Fonctionnalités (User Stories)
- En tant que …, je veux …, afin de …
Données manipulées
- Entités
- Champs importants
- Relations
API / Interfaces
- Endpoints concernés
- Inputs / outputs
Écrans / UX
- Pages / composants liés
- Comportements attendus
Cas limites
- Offline ?
- Erreurs ?
- Données manquantes ?
Critères d’acceptation
- …
- …
Dépendances
- Backend
- Mobile
- Drone
- Autres modules
MVP vs Post-MVP
MVP
- …
Post-MVP
- …
🎯 [Nom du module]
Contexte
Décrire le rôle de ce module dans CerOps.
Objectif
Quel problème ce module résout ?
Utilisateurs concernés
- Agriculteur
- Pilote de drone
- Admin
- Autre ?
Fonctionnalités (User Stories)
- En tant que …, je veux …, afin de …
Données manipulées
- Entités
- Champs importants
- Relations
API / Interfaces
- Endpoints concernés
- Inputs / outputs
Écrans / UX
- Pages / composants liés
- Comportements attendus
Cas limites
- Offline ?
- Erreurs ?
- Données manquantes ?
Critères d’acceptation
- …
- …
Dépendances
- Backend
- Mobile
- Drone
- Autres modules
MVP vs Post-MVP
MVP
- …
Post-MVP
- …
🎯 [Nom du module]
Contexte
Décrire le rôle de ce module dans CerOps.
Objectif
Quel problème ce module résout ?
Utilisateurs concernés
- Agriculteur
- Pilote de drone
- Admin
- Autre ?
Fonctionnalités (User Stories)
- En tant que …, je veux …, afin de …
Données manipulées
- Entités
- Champs importants
- Relations
API / Interfaces
- Endpoints concernés
- Inputs / outputs
Écrans / UX
- Pages / composants liés
- Comportements attendus
Cas limites
- Offline ?
- Erreurs ?
- Données manquantes ?
Critères d’acceptation
- …
- …
Dépendances
- Backend
- Mobile
- Drone
- Autres modules
MVP vs Post-MVP
MVP
- …
Post-MVP
- …
🎯 [Nom du module]
Contexte
Décrire le rôle de ce module dans CerOps.
Objectif
Quel problème ce module résout ?
Utilisateurs concernés
- Agriculteur
- Pilote de drone
- Admin
- Autre ?
Fonctionnalités (User Stories)
- En tant que …, je veux …, afin de …
Données manipulées
- Entités
- Champs importants
- Relations
API / Interfaces
- Endpoints concernés
- Inputs / outputs
Écrans / UX
- Pages / composants liés
- Comportements attendus
Cas limites
- Offline ?
- Erreurs ?
- Données manquantes ?
Critères d’acceptation
- …
- …
Dépendances
- Backend
- Mobile
- Drone
- Autres modules
MVP vs Post-MVP
MVP
- …
Post-MVP
- …
🎯 [Nom du module]
Contexte
Décrire le rôle de ce module dans CerOps.
Objectif
Quel problème ce module résout ?
Utilisateurs concernés
- Agriculteur
- Pilote de drone
- Admin
- Autre ?
Fonctionnalités (User Stories)
- En tant que …, je veux …, afin de …
Données manipulées
- Entités
- Champs importants
- Relations
API / Interfaces
- Endpoints concernés
- Inputs / outputs
Écrans / UX
- Pages / composants liés
- Comportements attendus
Cas limites
- Offline ?
- Erreurs ?
- Données manquantes ?
Critères d’acceptation
- …
- …
Dépendances
- Backend
- Mobile
- Drone
- Autres modules
MVP vs Post-MVP
MVP
- …
Post-MVP
- …
🎯 [Nom du module]
Contexte
Décrire le rôle de ce module dans CerOps.
Objectif
Quel problème ce module résout ?
Utilisateurs concernés
- Agriculteur
- Pilote de drone
- Admin
- Autre ?
Fonctionnalités (User Stories)
- En tant que …, je veux …, afin de …
Données manipulées
- Entités
- Champs importants
- Relations
API / Interfaces
- Endpoints concernés
- Inputs / outputs
Écrans / UX
- Pages / composants liés
- Comportements attendus
Cas limites
- Offline ?
- Erreurs ?
- Données manquantes ?
Critères d’acceptation
- …
- …
Dépendances
- Backend
- Mobile
- Drone
- Autres modules
MVP vs Post-MVP
MVP
- …
Post-MVP
- …
⚙️ DevOps & Infrastructure
Monorepo
CerOps est organisé en monorepo géré par Turborepo et Bun. Toutes les applications et packages partagés cohabitent dans un seul dépôt Git, ce qui garantit la cohérence des types TypeScript entre le backend et les frontends, et simplifie les déploiements.
Bun est utilisé à la fois comme runtime JavaScript, package manager et outil de compilation (le serveur Fastify est compilé en binaire natif via bun build --compile). Les versions des dépendances partagées sont centralisées dans le workspace catalog pour éviter toute dérive entre packages.
Application mobile Flutter
L’application mobile agriculteurs est développée en Flutter dans un dépôt séparé. Elle n’est pas intégrée au monorepo pour deux raisons principales : l’écosystème Flutter (Dart, pub.dev) est incompatible avec la chaîne d’outils Bun/Node, et les cycles de release mobiles (App Store / Play Store) suivent un rythme indépendant du déploiement web.
L’app communique avec le même backend via les mêmes endpoints ORPC.
Intégration Continue (GitHub Actions)
Quatre workflows couvrent l’ensemble du cycle de qualité :
- CI (
ci.yaml) : build, tests unitaires et lint (Biome, knip, sherif) — déclenché sur chaque PR et push surmain - E2E (
e2e.yaml) : tests Playwright avec une base PostGIS éphémère — déclenché sur chaque PR - PR title (
pr-title.yaml) : validation Conventional Commits - Docs (
docs.yaml) : compilation mdBook — déclenché uniquement sidocs/**est modifié
Le cache Turborepo est restauré entre les runs pour ne reconstruire que les packages affectés par la PR.
Conteneurisation (Docker)
Chaque application a son propre Dockerfile multi-stage : le pruning Turborepo extrait uniquement les fichiers nécessaires à l’app ciblée, puis le build produit une image minimale. Le serveur est distribué comme binaire compilé, les frontends Next.js en mode standalone.
Déploiement : Coolify
Coolify est le PaaS self-hosted qui orchestre tous les services. Aujourd’hui, en phase de développement, Coolify effectue lui-même les builds directement depuis le dépôt Git à chaque push sur main.
À terme, cette responsabilité sera transférée à GitHub Actions : un workflow dédié se chargera de builder et publier une image Docker taguée (ex. v1.2.0) sur le registry, et Coolify n’aura plus qu’à déployer cette image prébuilt sur l’environnement cible (production, pré-production, etc.) sans refaire de build. Cette séparation garantit que le même artefact immuable traverse tous les environnements.
Services applicatifs
Les trois applications (server, web-agri, web-pilots) sont chacune un service Coolify distinct pointant sur leur Dockerfile respectif.
Base de données
La base de données est un service PostGIS (PostgreSQL + extension géospatiale) provisionné par Coolify. L’extension PostGIS est utilisée pour les calculs géographiques liés aux zones agricoles et aux missions terrain.
Services annexes
Coolify héberge également :
- OpenObserve — observabilité unifiée (logs, métriques, traces)
- RustFS — stockage objet compatible S3 (uploads, livrables de missions)
- pgAdmin — interface d’administration PostgreSQL
- mdBook — cette documentation
Architecture de déploiement (actuelle — full dev)
GitHub (push main)
│
▼ webhook + build
Coolify
├── server (API Fastify)
├── web-agri (frontend agriculteurs)
├── web-pilots (frontend pilotes)
├── postgis (base de données)
├── openobserve (observabilité)
├── rustfs (stockage objet)
├── pgadmin (admin BDD)
└── mdbook (documentation)
Architecture de déploiement (cible)
GitHub (tag vX.Y.Z)
│
▼ GitHub Actions (build + push image)
Container Registry
│
▼ deploy image
Coolify
├── prod → image :v1.2.0
├── preprod → image :v1.2.0-rc1
└── ...