Déploiement gouvernemental
Héberger Roadmaps Faciles pour un opérateur public : thème DSFR, licence Gov, ProConnect, Espace Membre et conformité.
À lire en complément
Cette page couvre uniquement la configuration spécifique au secteur public. Pour les bases du déploiement (prérequis, build, base de données, options d'hébergement), commencez par le guide Self-hosting. Les templates prêts à l'emploi (docker-compose, Caddy, Coolify, Scaleway) sont dans le repo sous docs/self-host/.
Vue d'ensemble
Un déploiement gouvernemental, pour une administration, une collectivité, un opérateur de l'État ou un incubateur beta.gouv, se distingue d'un déploiement standard sur cinq points :
- Thème DSFR : le Système de Design de l'État peut être activé sur un espace, sous deux conditions cumulatives (licence Gov + domaine
.gouv.fr). - Licence Gov : le DSFR et les features EE sont débloqués par une clé de licence
GOV_LICENSED, émise manuellement après qualification. - Authentification : ProConnect (fédération d'identité de l'État) et Espace Membre (beta.gouv) en plus du mot de passe et du magic link.
- Pages légales : mentions légales, politique de confidentialité, CGU et déclaration d'accessibilité à renseigner avec les informations de l'opérateur public.
- Conformité : RGAA, RGPD/CNIL, résidence des données en France ou dans l'UE.
Les variables ci-dessous (branding, pages légales, tracking, URL du site) sont lues au runtime : aucune n'est inlinée au build, donc l'image GHCR prébuildée sert n'importe quel domaine et n'importe quel branding sans rebuild. Vous les posez en variables d'environnement runtime sur votre instance ; les valeurs publiques sont exposées au navigateur via une config runtime injectée par le serveur.
Licence Gov
Roadmaps Faciles est triple-licencié (AGPL v3 / BSL 1.1 / Gov). Les features EE et le thème DSFR sont activés au runtime par une clé de licence.
| Variable | Description | Défaut |
|---|---|---|
LICENSE_KEY | Clé de licence au format rf_live_.... Vide = mode Community (features core uniquement) | (vide) |
LICENSING_SERVER_URL | URL du serveur de vérification en ligne (ne pas changer en self-host) | https://licensing.roadmaps-faciles.fr |
INSTANCE_ID | Identifiant d'instance pour le binding de la licence. Auto-généré et persisté en base au premier lancement si non défini | (auto-généré) |
Vérification de licence
La vérification est principalement offline (signature Ed25519 embarquée dans la clé), avec un refresh en ligne toutes les 24h auprès du serveur de licences. Si le serveur est injoignable, une période de grâce de 7 jours maintient la licence active. Vous n'hébergez jamais le serveur de licences vous-même : il appartient au modèle SaaS root. Vous consommez uniquement la clé.
Plans disponibles :
| Plan | Effet | Émission |
|---|---|---|
| (aucune clé) | Mode Community, features core uniquement | - |
| LICENSED | Toutes les features EE, mais pas le DSFR | Via Stripe Checkout |
| GOV_LICENSED | Toutes les features EE + le thème DSFR | Manuelle, après qualification gouvernementale |
Le DSFR exige GOV_LICENSED
Une licence LICENSED standard ne déverrouille pas le thème DSFR. Seul le plan GOV_LICENSED l'active. C'est la première des deux conditions du thème DSFR (voir section suivante).
Thème DSFR : deux verrous orthogonaux
Le thème par défaut de l'application reste Default (design maison). Le thème DSFR doit être activé explicitement par espace, et il exige deux conditions indépendantes, toutes deux nécessaires :
- Verrou organisation (licence) : l'organisation doit avoir l'entitlement
THEME_DSFR.- En self-host : une
LICENSE_KEYde planGOV_LICENSEDvalide. - En cloud : un plan d'organisation
GOV.
- En self-host : une
- Verrou tenant (domaine) : le domaine personnalisé de l'espace doit se terminer par
.gouv.fr. C'est une exigence de la charte DSFR : le DSFR est réservé aux sites de l'État servis sur un domaine.gouv.fr.
Les deux verrous sont contrôlés à la fois côté interface (la sélection du thème DSFR dans Administration > Général est désactivée tant que l'une des conditions manque, avec un message indiquant lequel) et côté serveur (la sauvegarde rejette le thème DSFR si le domaine personnalisé n'est pas en .gouv.fr).
Cohérence thème / domaine verrouillée
Une fois le DSFR actif sur un espace, vous ne pouvez plus retirer ni changer le domaine personnalisé vers un domaine non-.gouv.fr : il faut d'abord repasser l'espace en thème Default. Le serveur renvoie une erreur explicite sinon. Cela garantit qu'un espace en DSFR reste toujours servi sur un domaine .gouv.fr.
Activer le DSFR sur un espace :
- Posez une
LICENSE_KEYde planGOV_LICENSED. - Configurez le domaine personnalisé de l'espace en
.gouv.fr(ex :feedback.monministere.gouv.fr) depuis Administration > Général. - Sélectionnez le thème DSFR dans la section thème de la même page.
Authentification
Sans configuration OAuth, la baseline fonctionne immédiatement : mot de passe + magic link (les deux nécessitent un SMTP fonctionnel, voir Mailer).
ProConnect
ProConnect est la fédération d'identité de l'État pour les agents publics. Le provider OIDC est activé uniquement si les trois variables sont posées.
| Variable | Description |
|---|---|
OAUTH_PROCONNECT_CLIENT_ID | Identifiant client OIDC fourni par ProConnect |
OAUTH_PROCONNECT_CLIENT_SECRET | Secret client OIDC |
OAUTH_PROCONNECT_ISSUER | URL de l'issuer OIDC ProConnect (endpoint de découverte). Vérifiez la valeur de production courante dans la documentation ProConnect, l'issuer évolue |
Issuer requis, sinon provider ignoré
Le provider ProConnect n'est activé que si OAUTH_PROCONNECT_CLIENT_ID et OAUTH_PROCONNECT_ISSUER sont renseignés. Si l'issuer manque, le provider est ignoré (avec un avertissement dans les logs) pour éviter que la découverte OIDC ne casse la page de connexion. Renseignez les trois variables ensemble.
Espace Membre (beta.gouv)
Pour les incubateurs beta.gouv, l'intégration Espace Membre connecte les membres beta.gouv via leur compte. Les emails en @beta.gouv.fr et @ext.beta.gouv.fr sont vérifiés contre l'API Espace Membre au login : un membre inactif est bloqué, un membre actif sans compte local voit son compte créé automatiquement.
| Variable | Description | Défaut |
|---|---|---|
ESPACE_MEMBRE_API_KEY | Clé API Espace Membre | (vide) |
ESPACE_MEMBRE_URL | URL de l'instance Espace Membre | https://espace-membre.incubateur.net |
OAuth optionnels
GitHub et Google restent disponibles si besoin (par exemple pour des contributeurs externes) :
| Variable | Description |
|---|---|
OAUTH_GITHUB_CLIENT_ID / OAUTH_GITHUB_CLIENT_SECRET | OAuth GitHub |
OAUTH_GOOGLE_CLIENT_ID / OAUTH_GOOGLE_CLIENT_SECRET | OAuth Google |
Chaque fournisseur OAuth doit aussi être activé explicitement par espace (ou sur le domaine racine) via Administration > Authentification pour être proposé sur la page de connexion.
Bootstrap d'une instance fraîche
L'image officielle est un bundle Next.js standalone : ni tsx ni pnpm n'y sont présents, donc prisma db seed n'y fonctionne pas. Le bootstrap d'une instance vierge se fait via la route HTTP POST /api/setup.
| Variable | Description | Défaut |
|---|---|---|
SETUP_TOKEN | Jeton du endpoint de bootstrap. Vide = route désactivée (403) | (vide) |
- La route est désactivée par défaut : sans
SETUP_TOKEN, elle renvoie403. - Posez
SETUP_TOKEN(valeur secrète forte, ex :openssl rand -base64 32) pour l'activer. - Chaque appel doit fournir le header
x-setup-token: <SETUP_TOKEN>(sinon401, comparaison à temps constant). - La route est idempotente :
409si la base contient déjà un espace, sans rien créer. - Le corps JSON est optionnel : tout champ absent retombe sur la variable
SEED_*correspondante.
Champs du corps JSON :
| Champ | Fallback env | Description |
|---|---|---|
adminEmail | SEED_ADMIN_EMAIL | Email de l'administrateur initial |
adminName | SEED_ADMIN_NAME | Nom affiché de l'admin |
adminPassword | SEED_ADMIN_PASSWORD | Mot de passe de l'admin (optionnel) |
adminUsername | SEED_ADMIN_USERNAME | Username de l'admin |
tenantName | SEED_TENANT_NAME | Nom du premier espace |
tenantSubdomain | SEED_TENANT_SUBDOMAIN | Sous-domaine du premier espace ([a-z0-9-]+) |
curl -X POST https://instance.example/api/setup \
-H "x-setup-token: $SETUP_TOKEN" \
-H "content-type: application/json" \
-d '{"adminEmail":"admin@monministere.gouv.fr","adminPassword":"un-mot-de-passe-fort"}'En cas de succès (201), la route crée une organisation, un espace, un administrateur OWNER et les entités de bienvenue (un board + ses statuts), puis renvoie { ok, adminEmail, tenantId, loginUrl }.
Connexion de l'admin
Si vous fournissez un adminPassword, l'admin se connecte directement par mot de passe. Sinon, il se connecte par magic link : un SMTP fonctionnel est alors indispensable. Après le bootstrap, vous pouvez retirer SETUP_TOKEN de l'environnement (la route restant de toute façon idempotente).
Mailer
Le SMTP sert aux magic links, invitations et notifications.
| Variable | Description | Défaut |
|---|---|---|
MAILER_SMTP_HOST | Hôte SMTP | 127.0.0.1 |
MAILER_SMTP_PORT | Port SMTP | 1025 |
MAILER_SMTP_LOGIN | Login SMTP | (vide) |
MAILER_SMTP_PASSWORD | Mot de passe SMTP | (vide) |
MAILER_SMTP_SSL | Activer TLS | false |
MAILER_FROM_EMAIL | Adresse d'expédition | (calculé) |
L'adresse from est résolue dans cet ordre : MAILER_FROM_EMAIL s'il est défini, sinon le login SMTP (MAILER_SMTP_LOGIN), sinon noreply@<domaine de l'instance> (dérivé de SITE_URL).
Posez MAILER_FROM_EMAIL sur votre domaine gouvernemental
Renseignez explicitement MAILER_FROM_EMAIL avec un email de votre domaine gouvernemental, aligné avec vos enregistrements SPF/DKIM/DMARC. Sans cela, les magic links partent en spam ou sont rejetés par les serveurs destinataires, et les agents ne peuvent plus se connecter. Format accepté : "Nom affiché <noreply@monministere.gouv.fr>" ou simplement noreply@monministere.gouv.fr.
Branding État
Le bloc-marque de l'État (République Française et son ministère de rattachement) et le logo opérateur sont les leviers principaux en contexte gouvernemental.
| Variable | Description | Défaut |
|---|---|---|
BRAND_NAME | Nom du service | Roadmaps Faciles |
BRAND_TAGLINE | Accroche sous le nom | (défaut RMF) |
BRAND_MINISTRY | Bloc-marque de l'État (le \n force le retour à la ligne, ex : Ministère\nde l'Exemple) | République\nFrançaise |
BRAND_OPERATOR_ENABLE | Afficher le logo opérateur (true/false) | true |
BRAND_OPERATOR_LOGO_URL | URL du logo opérateur | /img/roadmaps-faciles.png |
BRAND_OPERATOR_LOGO_ALT | Texte alternatif du logo | Roadmaps Faciles |
BRAND_OPERATOR_LOGO_ORIENTATION | Orientation du logo (vertical/horizontal) | vertical |
Pages légales
Les valeurs par défaut pointent vers Roadmaps Faciles et son hébergeur (Scalingo). Un opérateur gouvernemental doit toutes les remplacer : elles alimentent les pages /mentions-legales, /politique-de-confidentialite et /cgu.
| Variable | Description | Défaut |
|---|---|---|
LEGAL_PUBLISHER_NAME | Éditeur du site | Roadmaps Faciles |
LEGAL_PUBLISHER_ADDRESS | Adresse de l'éditeur | (vide) |
LEGAL_PUBLICATION_DIRECTOR | Directeur de la publication | Le responsable légal de Roadmaps Faciles |
LEGAL_HOSTING_NAME | Nom de l'hébergeur | Scalingo SAS |
LEGAL_HOSTING_ADDRESS | Adresse de l'hébergeur | 15 avenue du Rhin, 67100 Strasbourg, France |
LEGAL_HOSTING_CONTACT | Contact de l'hébergeur | support@scalingo.com |
LEGAL_HOSTING_PRIVACY_URL | Politique de confidentialité de l'hébergeur | (Scalingo) |
LEGAL_CONTACT_EMAIL | Email de contact public | contact@roadmaps-faciles.fr |
LEGAL_RGPD_EMAIL | Email du délégué à la protection des données | rgpd@roadmaps-faciles.fr |
Stockage et résidence des données
Roadmaps Faciles utilise un stockage S3-compatible pour les fichiers uploadés. Pour la résidence des données en France, deux options principales :
- Garage (recommandé en self-host) : stockage S3-compatible léger, hébergé sur votre propre infrastructure. Défaut du scénario docker-compose.
- Scaleway Object Storage : stockage S3 managé avec régions en France (
fr-par), pour garantir la résidence des données sur le territoire national.
| Variable | Description | Défaut |
|---|---|---|
STORAGE_PROVIDER | s3 (ou noop pour désactiver l'upload) | noop |
STORAGE_S3_ENDPOINT | Endpoint S3 (ex : http://garage:3900, ou l'endpoint Scaleway) | - |
STORAGE_S3_REGION | Région (ex : garage, fr-par) | us-east-1 |
STORAGE_S3_BUCKET | Nom du bucket | - |
STORAGE_S3_ACCESS_KEY_ID / STORAGE_S3_SECRET_ACCESS_KEY | Credentials S3 | - |
STORAGE_S3_KEY_PREFIX | Préfixe de clé (optionnel, pour mutualiser un bucket) | (vide) |
STORAGE_MAX_FILE_SIZE_MB | Taille max par fichier (Mo) | 5 |
Pour le détail du provisioning Garage (secret RPC, access keys, bucket auto-créé au premier boot), voir le scénario docker-compose.
Checklist conformité
Le secteur public impose des obligations réglementaires à traiter avant la mise en production :
- Accessibilité (RGAA) : la page
/accessibiliteest livrée comme placeholder déclarant l'état "non conforme". Réalisez un audit RGAA et complétez la déclaration d'accessibilité conforme avant la mise en service. - RGPD / CNIL : renseignez toutes les variables
LEGAL_*, désignez un DPO joignable viaLEGAL_RGPD_EMAIL, et tenez à jour la politique de confidentialité (/politique-de-confidentialite). - Résidence des données : hébergez la base PostgreSQL et le stockage S3 en France ou dans l'UE (Garage auto-hébergé, ou Scaleway région
fr-par). - Tracking CNIL-compatible : si vous activez l'analytique, choisissez une solution conforme (Matomo auto-hébergé sans cookie), ou désactivez le tracking avec
TRACKING_PROVIDER=noop. Évitez les solutions transférant des données hors UE sans encadrement. - Pages légales : mentions légales (
/mentions-legales), CGU (/cgu) et politique de confidentialité (/politique-de-confidentialite) renseignées avec les informations réelles de l'opérateur. - Secrets uniques par instance :
SECURITY_JWT_SECRET,SECURITY_WEBHOOK_SECRET,INTEGRATION_ENCRYPTION_KEY,SETUP_TOKENgénérés et propres à votre instance, jamais réutilisés d'un exemple. - SMTP de production :
MAILER_FROM_EMAILsur le domaine gouvernemental, aligné SPF/DKIM/DMARC.
Templates repo
Le guide d'hébergement détaillé par scénario et les templates prêts à l'emploi sont dans le repo sous docs/self-host/, avec un guide GOUVERNEMENTAL.md dédié.