Élus & DSIOpen SourceSouveraineté numérique

UrbaFood :
Infrastructure publique
de livraison alimentaire

Dossier technique à destination des élus, directions des systèmes d'information, développeurs et décideurs publics souhaitant comprendre l'architecture, les garanties de souveraineté et les mécanismes de résilience d'UrbaFood.

UrbaFood comme infrastructure publique numérique

UrbaFood n'est pas une simple application de commande en ligne. C'est une infrastructure logicielle pensée comme un service public : open source, auditée, hébergée localement, et gouvernée par la collectivité qui la déploie.

🏗️

Architecture générale

Stack full-stack NestJS (API REST) + Next.js (interface web) + PWA React (application mobile coursiers). Reverse proxy Nginx devant un HAProxy terminant le TLS. Déployable sur tout hébergeur conforme NIS2 ou en auto-hébergement municipal.

👤

Frontend citoyen

Interface web progressive (PWA) : catalogue de restaurants, panier, suivi de commande en temps réel, compte citoyen avec historique. Conforme RGAA accessibilité. Aucun traceur publicitaire tiers.

🍽️

Application restaurateur

Espace dédié : gestion du menu, tableau de bord commandes en temps réel, statistiques de chiffre d'affaires, connexion optionnelle à Google Business Profile pour import automatique de la fiche établissement.

🛵

Application livreur (PWA)

Application web installable sur Android/iOS sans passer par les stores. Service Worker Workbox pour fonctionnement partiel hors-ligne. Interface mobile-first : disponibilité, commandes disponibles, livraison active, gains en temps réel.

🏛️

Portail d'administration municipal

Interface d'administration pour la collectivité : validation des restaurants, gestion des coursiers, suivi des commandes, rapports financiers, open data configurable. Rôles et permissions granulaires (agent instructeur, élu, DSI, auditeur).

🔌

API publiques

API REST documentée (OpenAPI/Swagger) : endpoints publics pour les données ouvertes et endpoints sécurisés (JWT) pour les acteurs de l'écosystème. Interopérabilité avec les SI municipaux (annuaire, identité numérique).

💳

Système de paiement

Intégration Stripe (PCI-DSS SAQ-A). Les fonds transitent directement vers les restaurants (Stripe Connect) après déduction du seul frais de maintenance (1 %). Alternative virement SEPA disponible sans dépendance à un prestataire unique.

📦

Gestion des commandes

Workflow de statuts : PENDING → CONFIRMED → PREPARING → READY → PICKED_UP → DELIVERED. File de traitement Redis pour les événements temps réel. Notifications SMS/push à chaque changement de statut.

📍

Géolocalisation

Géolocalisation HTML5 native dans la PWA coursier, sans SDK propriétaire. Calcul des distances via l'API Nominatim OpenStreetMap — aucune dépendance à Google Maps. Attribution des commandes par proximité et disponibilité déclarée.

🔔

Notifications

Notifications push via Web Push API (Service Worker) pour la PWA coursiers. Email via SMTP municipal configurable. Architecture de queue Bull/Redis pour la fiabilité des envois, sans dépendance à un prestataire d'emailing externe.

🖥️

Hébergement souverain

Déployable sur infrastructure municipale existante, datacenter régional certifié SecNumCloud, ou cloud souverain (OVHcloud, Scaleway, Outscale). Aucune dépendance obligatoire à AWS, Azure ou GCP. Build Docker reproductible.

🔐

Sécurité & conformité

Authentification JWT (access 15 min + refresh 7j). Mots de passe hashés Argon2. Chiffrement AES-256-GCM des tokens OAuth. Rate limiting Nginx + NestJS Throttler. Conforme RGPD : données hébergées en UE, droit à l'effacement implémenté.

Deux modèles, deux philosophies

Plateforme centralisée (Uber Eats / Deliveroo)

 Restaurants ──────────────────────────────────────┐
                                                   ↓
                               ┌─────────────────────────────┐
                               │     Plateforme privée       │
                               │     (Silicon Valley)        │
                               └────────────┬────────────────┘
                                            │
               ┌────────────────────────────┼────────────────────┐
               ↓                            ↓                   ↓
         Actionnaires              Données citoyens         Hébergement
         (dividendes)              hors territoire          AWS / USA

 Commission : 25–30 % par commande
 Gouvernance : fonds d'investissement privés
 Transparence : nulle — données non communiquées

Architecture UrbaFood (infrastructure publique)

 Restaurants ──┐
 Livreurs  ────┼──→ Infrastructure publique locale
 Citoyens  ────┘             │
                             │
        ┌────────────────────┼────────────────────┐
        ↓                    ↓                    ↓
  Données sur          Hébergement           Gouvernance
  le territoire        souverain             municipale
  (propriété           (datacenter           (conseil
   publique)            local)                municipal)

 Commission : 1 % (maintenance uniquement)
 Gouvernance : élus + DSI + citoyens
 Transparence : comptes publics, code ouvert

Architecture technique UrbaFood — Stack de production

 Internet (HTTPS:443)
         ↓
 ┌───────────────────────────────────────────────────────────┐
 │  HAProxy  (SSL termination, certificat Let's Encrypt)     │
 └─────────────────────────┬─────────────────────────────────┘
                           ↓  (réseau interne chiffré)
 ┌───────────────────────────────────────────────────────────┐
 │  Nginx  (reverse proxy, rate limiting 100 req/min API)    │
 │                                                           │
 │   /api/*           →  Backend NestJS    :3000             │
 │   /coursier-app/*  →  PWA Coursiers     :80               │
 │   /*               →  Frontend Next.js  :3001             │
 └─────────────────────────┬─────────────────────────────────┘
                           ↓
 ┌───────────────────────────────────────────────────────────┐
 │  Backend NestJS (API REST, TypeORM, Bull queues)          │
 │                                                           │
 │   Auth JWT  ──  Restaurants  ──  Orders  ──  Couriers     │
 │        ↓               ↓            ↓            ↓        │
 │   Redis (cache, sessions, queues)                         │
 │   MariaDB 11.5 (données persistantes, UTF8MB4, InnoDB)    │
 │        ↓                                                  │
 │   Worker (queue emails + cron jobs)                       │
 └───────────────────────────────────────────────────────────┘

 Tous les containers : Docker Compose · réseau bridge isolé
 Données : volumes persistants · backup automatisé (mariadb-dump)
 Déployable sur : OVHcloud · Scaleway · Outscale · Baremetal municipal

Un réseau distribué inspiré du Web3,
sans les travers des cryptomonnaies

Une blockchain publique comme Ethereum est inadaptée aux collectivités : coûts de transaction variables et imprévisibles, gouvernance hors de portée démocratique, dépendance à des acteurs privés spéculatifs. UrbaFood propose une architecture décentralisée sous maîtrise publique, sans cryptomonnaie.

🌐

Réseau P2P

Chaque nœud (serveur municipal, terminal CCAS, équipement de commerce) communique directement avec ses voisins via un protocole léger. Pas de point central unique défaillant.

🖧

Nœuds distribués

Mairie, CCAS, bibliothèque, office de commerce, marché couvert : chaque équipement public peut héberger un nœud. Plus le réseau est dense, plus la résilience est élevée.

📱

Smartphones comme nœuds légers

Les applications des coursiers et restaurateurs fonctionnent comme des nœuds légers : ils valident et propagent les transactions sans stocker l'intégralité de l'historique.

🗄️

Stockage distribué

Commandes, réputation et paiements répliqués sur plusieurs nœuds. Si un serveur tombe, les données restent accessibles via les réplicas locaux, sans interruption de service.

🔗

Blockchain privée municipale

Registre distribué des transactions (commandes, paiements, livraisons). Immuable et auditable par les élus et le DSI. Aucune cryptomonnaie : les unités sont des euros, traçables via Stripe.

⚖️

Consensus léger (PoA)

Proof of Authority : seuls les nœuds autorisés par la municipalité valident les blocs. Consommation énergétique proche de zéro. Débit élevé. Adapté aux contraintes des collectivités.

Réseau de nœuds territoriaux — Architecture P2P décentralisée

                     ┌──────────────────────────┐
                     │    Nœud principal        │
                     │    Mairie / DSI          │
                     │    (validateur primaire) │
                     └──────────┬───────────────┘
                                │
         ┌──────────────────────┼──────────────────────┐
         ↓                      ↓                      ↓
┌─────────────────┐   ┌──────────────────┐   ┌─────────────────┐
│  Nœud CCAS      │   │  Nœud Office     │   │  Nœud Médiathèq │
│  (validateur)   │   │  de commerce     │   │  (validateur)   │
└────────┬────────┘   └────────┬─────────┘   └───────┬─────────┘
         │                     │                      │
   ┌─────┴─────┐         ┌─────┴─────┐         ┌─────┴─────┐
   ↓           ↓         ↓           ↓          ↓           ↓
 App         App       App         App        App         App
 Citoyen  Restaurant  Citoyen   Coursier   Citoyen  Restaurant

 Légende :
 ─── Connexion P2P chiffrée (TLS mutuel)
 ↓   Nœud léger (lecture + propagation, sans stockage complet)
     Les validateurs forment le comité de consensus (PoA municipal)

 Frais de transaction : 0 EUR (réseau privé, aucun gas fee)
 Cryptomonnaie : aucune — devise : euro via Stripe / SEPA

Pourquoi une blockchain publique n'est pas adaptée aux collectivités

Ethereum / chaînes publiques
  • Frais de gas imprévisibles (0,01 € à 50 € par transaction)
  • Gouvernance hors contrôle démocratique
  • Données publiques par défaut (incompatible RGPD)
  • Empreinte carbone significative ou dépendance à des validateurs privés
  • Exposition aux cryptomonnaies spéculatives et à leur volatilité
Blockchain privée UrbaFood (PoA)
  • Frais de transaction : 0 € (réseau fermé, aucun marché de gas)
  • Gouvernance : conseil municipal + DSI + délibération publique
  • Données chiffrées, accès granulaire par rôle (RGPD confiant)
  • Empreinte énergétique proche de zéro (Proof of Authority)
  • Aucune cryptomonnaie — euros uniquement via Stripe / virement SEPA

Reprendre le contrôle
de l'infrastructure alimentaire locale

En déléguant la livraison alimentaire à des plateformes privées, les collectivités cèdent non seulement une part de la valeur économique locale, mais aussi la maîtrise de données stratégiques — habitudes de consommation, fréquentation des commerces, données personnelles des citoyens — sans garantie sur leur hébergement ni leur utilisation.

🔒 Souveraineté des données

  • Données hébergées sur le territoire ou en datacenter certifié SecNumCloud
  • Propriété juridique : la collectivité, pas l'opérateur tiers
  • Accès en lecture aux élus, DSI, auditeurs et commissaires aux comptes
  • Export complet des données à tout moment (portabilité RGPD garantie)
  • Aucune cession à des tiers sans délibération du conseil municipal

💰 Souveraineté économique

  • 1 % de commission uniquement, pour la maintenance technique
  • 99 % du chiffre d'affaires reste dans l'économie locale
  • Aucun transfert de valeur vers des actionnaires extérieurs au territoire
  • Réinvestissement des excédents décidé par délibération publique
  • Modèle sans objectif lucratif — aucune pression sur les marges

🚚 Souveraineté logistique

  • Algorithme de dispatch publié, auditable et délibéré collectivement
  • Critères de sélection des coursiers définis publiquement
  • Zones de livraison délimitées par la collectivité, modifiables
  • Possibilité d'intégrer des coopératives de coursiers locales
  • Interopérabilité avec les systèmes de mobilité municipaux existants

🖥️ Souveraineté numérique

  • Code source 100 % open source (licence AGPL-3.0)
  • Pas de vendor lock-in : changement d'hébergeur sans recodage
  • Dépendances auditées, sans composant propriétaire obligatoire
  • Interopérabilité API ouverte (OpenAPI 3.0 / Swagger)
  • Communauté de collectivités partageant les coûts de développement

Mécanismes d'extraction de valeur des plateformes privées

Extraction économique

25 à 30 % de commission : un restaurant réalisant 500 000 € de CA annuel via plateforme transfère 125 000 à 150 000 € vers des actionnaires extérieurs. Sur dix restaurants, c'est 1 à 1,5 M€ qui quittent le territoire chaque année.

Extraction des données

Les plateformes agrègent les données de consommation pour affiner leur modèle publicitaire, vendre des études de marché et orienter leurs propres offres (dark kitchens, marques fantômes). La collectivité n'a aucun accès à ces données produites par ses citoyens.

Verrouillage progressif

Une fois les restaurants intégrés et les habitudes citoyennes formées, la collectivité ne peut plus reprendre la main sans provoquer une rupture de service. C'est le mécanisme classique du lock-in par réseau : plus il est grand, plus la dépendance est forte.

Plateforme privée vs UrbaFood décentralisé

CritèrePlateforme centraliséeUrbaFood décentralisé
Propriété des donnéesPlateforme privée (hors territoire)Collectivité territoriale
HébergementCloud extraterritorial (AWS, GCP, Azure)Infrastructure souveraine (FR / UE certifiée)
Commission25–30 % par commande1 % (maintenance uniquement)
GouvernanceConseil d'administration privéConseil municipal + délibération publique
Transparence financièreDonnées non communiquéesComptes publics trimestriels, open data
RésiliencePoint de défaillance uniqueRéseau distribué multi-nœuds
AuditabilitéCode propriétaire, boîte noireCode open source, auditable à tout moment
InteropérabilitéAPI fermée, écosystème verrouilléOpenAPI 3.0, standards ouverts
Coût de sortieRupture de service totaleMigration progressive sans perte de données
ÉvolutivitéDépendante des décisions de l'éditeurFork et personnalisation libres
Contrôle démocratiqueAucun recours pour les citoyensDélibération, audit, recours administratif
RGPDTransferts hors UE fréquentsHébergement UE, DPA signé, registre tenu
Dépendance fournisseurTotale (lock-in contractuel)Nulle (logiciel libre, multi-hébergeurs)
Emploi localEmplois délocalisés, pas de retombée localeDSI municipal, prestataires locaux, coursiers

Continuité de service en toutes circonstances

Un service public numérique doit continuer à fonctionner même en cas de panne partielle. UrbaFood est conçu pour maintenir la continuité de service face aux défaillances techniques, aux changements de prestataires et aux dégradations de connectivité.

Scénario : Un serveur tombe

Réplication multi-nœuds

Les données sont répliquées en temps réel sur au moins trois nœuds distincts. La perte d'un serveur est transparente pour les utilisateurs finaux.

Healthcheck automatique

Nginx et Docker Compose surveillent la santé des services toutes les 30 secondes. Redémarrage automatique en cas de défaillance détectée.

Basculement Nginx (failover)

Le reverse proxy bascule automatiquement vers un nœud secondaire dès que le primaire ne répond plus (directive upstream max_fails configurable).

Scénario : Un opérateur quitte le projet

Code open source sous licence

Le code appartient à la communauté, pas à l'opérateur. La collectivité peut reprendre le déploiement et le support sans négociation ni indemnité.

Documentation opérationnelle

Chaque procédure est documentée dans le wiki public. Un nouveau DSI peut prendre en main le système en quelques heures, pas en plusieurs semaines.

Portabilité totale des données

Format SQL standard (MariaDB). Export complet en un seul commandement. Importable sur tout hébergeur compatible MySQL/MariaDB sans transformation.

Scénario : Un prestataire disparaît

Module paiement interchangeable

Stripe peut être remplacé par Mollie, Adyen ou un virement SEPA direct. L'intégration paiement est modulaire et documentée comme telle.

Déploiement multi-cloud natif

Le docker-compose.yml fonctionne sur OVHcloud, Scaleway, Outscale ou un serveur baremetal municipal sans modification de code.

SMTP configurable en 4 variables

Remplacement de tout prestataire d'emailing par un SMTP interne ou souverain en modifiant quatre variables d'environnement. Zéro recodage.

Scénario : Connexion Internet dégradée

Service Worker hors-ligne (PWA)

L'application coursier fonctionne partiellement hors-ligne grâce à Workbox : consultation des livraisons en cours, mise en cache des données récentes.

Synchronisation différée

Les mises à jour de statut (commande livrée, disponibilité) sont mises en file d'attente localement et synchronisées dès le retour de la connexion.

Communication P2P locale

En mode décentralisé, les nœuds d'un même réseau local (LAN/WiFi municipal) communiquent entre eux sans transiter par Internet.

Automatiser la confiance sans intermédiaire

Un smart contract est un programme qui s'exécute automatiquement selon des règles définies à l'avance, sans qu'aucune partie puisse les modifier unilatéralement une fois déployé. Sur le réseau UrbaFood, ils garantissent l'équité des paiements et la transparence des évaluations sans nécessiter de tiers de confiance central.

Contract #1

Contrat de commande (OrderContract)

📝
Création

Le citoyen valide son panier. Le montant est séquestré (escrow) — ni le restaurant ni la plateforme ne peuvent y accéder avant livraison. Contrat instancié sur le registre distribué.

Acceptation

Le restaurant confirme la commande dans le délai imparti (ex. 5 min). Sans confirmation dans les temps, le contrat s'annule automatiquement et le paiement est remboursé.

🤝
Livraison & règlement

Le coursier marque la commande livrée. Le contrat libère automatiquement : 98 % au restaurant, 1 % à la caisse municipale. Trace immuable sur le registre distribué.

// Pseudo-code — contrat de commande
contract OrderContract {
  state : PENDING | CONFIRMED | PREPARING | DELIVERED | CANCELLED
  escrow : montant bloque jusqu'a confirmation de livraison

  on confirm_by_restaurant()  -> state = CONFIRMED
  on delivery_confirmed()     -> release_payment() -> state = DELIVERED
  on timeout(5min, PENDING)   -> refund_citizen()  -> state = CANCELLED
  on timeout(48h, CONFIRMED)  -> arbitration()     -> state = DISPUTED
}
Contract #2

Contrat de rémunération (PaymentContract)

🍽️
Versement restaurateur

Transfert automatique vers le compte Stripe Connect du restaurant dès validation de la livraison. Relevé mensuel généré automatiquement. La grille tarifaire est publique et inscrite dans le contrat.

🛵
Versement coursier

Rémunération calculée selon la grille tarifaire publiée (distance, type de véhicule). La formule de calcul est inscrite dans le contrat et non modifiable unilatéralement par l'opérateur.

🏛️
Frais municipaux

1 % prélevé automatiquement sur chaque transaction, versé à la caisse municipale dédiée. Usage : maintenance infrastructure, support technique. Rapport trimestriel public obligatoire.

Contract #3

Contrat de réputation (ReputationContract)

Notation vérifiée

Seul un citoyen ayant effectivement reçu une commande peut noter le restaurant et le coursier. La preuve est fournie par le hash de la transaction liée. Impossible de générer de fausses notes.

📈
Confiance progressive

Score calculé sur les 90 derniers jours (pondération décroissante). Un incident isolé n'affecte pas définitivement un acteur. Score récupérable pour les commerces qui améliorent leur service.

🛡️
Prévention de la fraude

Détection des patterns anormaux (séquences de notes similaires, délai suspect). Les anomalies sont signalées pour révision manuelle par le modérateur municipal. Sanctions décidées par délibération.

Ce qu'UrbaFood apporte concrètement
à votre collectivité

💶

Rétention de la richesse locale

Chaque euro dépensé sur UrbaFood reste dans l'économie locale. Avec 1 % de commission contre 25–30 % sur les plateformes privées, les restaurants économisent en moyenne 24 points de marge — directement réinvestis en emploi local et en qualité.

Jusqu'à +24 pts de marge pour les restaurateurs
🏗️

Indépendance technologique

Logiciel libre sous licence AGPL-3.0 : la collectivité possède le code, peut l'auditer, le modifier et le transmettre à d'autres communes. Fin du cycle des renouvellements de licences et des dépendances à un éditeur unique.

0 € de licence logicielle annuelle
📊

Maîtrise des données stratégiques

Accès en temps réel aux données d'activité économique locale : fréquentation des restaurants, zones de livraison, tendances de consommation. Données précieuses pour piloter la politique commerciale et soutenir les commerces en difficulté.

Tableau de bord décisionnel en temps réel
👷

Création d'emplois locaux

UrbaFood structure l'emploi local : coursiers, développeurs territoriaux, agents de validation, modérateurs municipaux. Ces emplois sont ancrés dans le territoire et ne peuvent pas être délocalisés.

80+ emplois directs et indirects
🌱

Développement des circuits courts

La plateforme valorise les producteurs locaux via des filtres dédiés (circuits courts, bio, label local). L'algorithme de mise en avant est transparent et délibéré collectivement — pas optimisé pour la marge de la plateforme.

Paramétrage circuits courts par délibération
🔍

Transparence et accountability

Rapports financiers publics trimestriels, open data sur les commissions perçues et leur usage, registre des décisions de gouvernance publié. Un niveau de transparence impossible à obtenir auprès d'une société privée.

Rapports publics obligatoires trimestriellement
« UrbaFood n'est pas un projet de niche. C'est la démonstration qu'une collectivité peut, avec des moyens raisonnables et une approche open source, reprendre la maîtrise de son infrastructure économique numérique — exactement comme elle possède ses routes, ses écoles et ses réseaux d'eau. »
Collectivités pionnières · Modèle applicable dès 10 000 habitants

Votre commune est prête
à reprendre le contrôle ?

Nous accompagnons les collectivités dans l'évaluation, la mise en œuvre et l'exploitation d'UrbaFood. Une première consultation technique est gratuite et sans engagement.

🔓
Licence
AGPL-3.0
🇫🇷
Hébergement
France / UE
🛡️
RGPD
Conforme
📞
Support
Municipal