Architecture logicielle — Cerops
Vue d’ensemble
Cerops est une plateforme mettant en relation des agriculteurs et des pilotes de drone certifiés pour la surveillance et l’analyse de parcelles agricoles.
Type d’application
| Application | Type | Technologie |
|---|---|---|
web-agri | Application web riche (SPA/SSR) | Next.js 16 + React 19 |
web-pilots | Application web riche (SPA/SSR) | Next.js 16 + React 19 |
mobile | Application mobile native | Flutter (iOS + Android) |
server | Serveur API | Fastify + oRPC |
Gestion de projet
Approche Agile : TDD, Conventional Commits, versioning sémantique (changelog via git-cliff), CI/CD GitHub Actions sur chaque PR.
La roadmap est organisée en milestones, avec des issues détaillées dans GitHub. Les décisions d’architecture sont formalisées dans des ADR (Architecture Decision Records) pour assurer la traçabilité.
Architecture retenue : Monolithe modulaire en monorepo
Justification (ADR-002)
L’équipe est restreinte et le périmètre fonctionnel bien défini. Une architecture microservices aurait apporté une complexité opérationnelle (service discovery, monitoring distribué) inadaptée. Le monolithe modulaire permet un développement rapide avec une séparation claire des responsabilités via les routers oRPC par domaine.
Structure monorepo (ADR-001)
cerops/
├── apps/
│ ├── web-agri/ # Frontend agriculteur (port 3001)
│ ├── web-pilots/ # Frontend pilote (port 3002)
│ └── server/ # API Fastify (port 3000)
└── packages/
├── api/ # Routers oRPC + logique métier
├── auth/ # Better-Auth
├── db/ # Prisma + schéma PostgreSQL
├── env/ # Validation des variables d'environnement
└── web-shared/ # Utilitaires partagés entre les deux frontends
Géré par Turborepo pour le cache de build et l’exécution parallèle des tâches. La dépendance mobile/ (Flutter) est volontairement séparée du monorepo TypeScript (ADR-009).
Choix technologiques justifiés
Serveur : Fastify + oRPC (ADR-005, ADR-006)
Fastify pour ses performances et son écosystème de plugins. oRPC assure la sécurité de type de bout en bout (serveur → client) sans génération de code. Exposition OpenAPI automatique via @orpc/openapi.
Frontend web : Next.js (ADR-004)
Deux applications distinctes par audience (agriculteurs / pilotes) pour éviter toute fuite de logique entre rôles. App Router Next.js pour le SSR natif et les Server Components (appels oRPC sans overhead réseau côté serveur).
Mobile : Flutter (ADR-009)
Performances proches du natif, accès caméra/GPS, et mode offline robuste via Drift (SQLite embarqué). Une seule codebase iOS + Android. Choisi face à React Native (offline plus complexe) et PWA (accès natif limité).
Base de données : PostgreSQL + PostGIS + Prisma (ADR-007, ADR-008)
PostgreSQL pour les transactions ACID et PostGIS pour les requêtes géospatiales (parcelles, viewport map). Prisma comme ORM pour la type-safety et les migrations versionées.
Authentification : Better-Auth (ADR-011)
Sessions httpOnly cookies, bearer tokens pour les clients API, CAPTCHA Cloudflare Turnstile, plugin Stripe pour les abonnements agriculteurs.
Runtime : Bun (ADR-003)
Remplacement de Node.js pour des performances d’installation et d’exécution supérieures. Compatible avec l’écosystème npm.
Paiements : Stripe (ADR-012)
Pré-autorisation à la création de mission, capture à la livraison du livrable.
Schéma de communication
Browser / Mobile App
│
│ HTTPS (cookies httpOnly / Bearer token)
▼
┌──────────────────┐
│ Fastify Server │ port 3000
│ ┌────────────┐ │
│ │ oRPC Layer │ │ /rpc/*
│ └────────────┘ │
│ ┌────────────┐ │
│ │ Better-Auth│ │ /api/auth/*
│ └────────────┘ │
│ ┌────────────┐ │
│ │ OpenAPI │ │ /docs
│ └────────────┘ │
└──────┬───────────┘
│
├── PostgreSQL + PostGIS (port 5432)
├── Ollama LLM (port 11434)
├── S3-compatible (fichiers livrables)
└── Stripe API (paiements)