Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

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

ApplicationTypeTechnologie
web-agriApplication web riche (SPA/SSR)Next.js 16 + React 19
web-pilotsApplication web riche (SPA/SSR)Next.js 16 + React 19
mobileApplication mobile nativeFlutter (iOS + Android)
serverServeur APIFastify + 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)