ContenuPied de page
Roadmaps Faciles
Roadmaps Faciles
BienvenuePremiers pas

Comprendre

Utiliser

Gérer

Technique

Documentation techniqueConfiguration DNSDéploiementSelf-hostingSécuritéTracking & AnalyticsFeature Flags

FAQ
Technique

Self-hosting

Guide complet pour déployer Roadmaps Faciles sur votre propre infrastructure.

Section technique

Cette page s'adresse aux développeurs et administrateurs système souhaitant héberger leur propre instance de Roadmaps Faciles.

Prérequis

ComposantVersion / Description
Node.js24 ou supérieur
PostgreSQL15 ou supérieur
RedisCompatible Redis 6+ (requis — utilisé pour le cache, les preuves 2FA, les challenges WebAuthn et les codes OTP)
SMTPServeur d'envoi d'emails (magic links, invitations)
pnpmGestionnaire de paquets (voir packageManager dans package.json)

Démarrage rapide

1. Cloner le dépôt

git clone https://github.com/roadmaps-faciles/roadmaps-faciles.git
cd roadmaps-faciles

2. Lancer les services avec Docker Compose

Le fichier docker-compose.yml fourni démarre les trois services nécessaires au développement :

docker compose up -d
ServicePortDescription
PostgreSQL5432Base de données (user: postgres, password: postgres, dbs: roadmaps-faciles + licensing)
Redis6379Cache et sessions
Maildev1025 (SMTP) / 1080 (Web UI)Serveur SMTP de développement
MinIO9000 (API) / 9001 (Console)Stockage S3 local (user: minioadmin, password: minioadmin)

3. Configurer les variables d'environnement

Copiez le fichier de configuration de développement et adaptez-le :

cp .env.development .env.production.local

Les variables minimales à configurer sont décrites dans la section Variables d'environnement.

4. Installer les dépendances et préparer la base

pnpm install
pnpm prisma migrate deploy
pnpm prisma db seed

5. Lancer le serveur de développement

pnpm dev

L'application est accessible sur http://localhost:3000.

Variables d'environnement

Obligatoires

VariableDescriptionExemple
DATABASE_URLURL de connexion PostgreSQLpostgresql://user:pass@host:5432/db
REDIS_URLURL de connexion Redisredis://localhost:6379
SECURITY_JWT_SECRETSecret pour les tokens JWT et HMAC (32+ caractères aléatoires)—
SECURITY_WEBHOOK_SECRETSecret pour la signature des webhooks—
MAILER_SMTP_HOSTHôte du serveur SMTPsmtp.example.com
MAILER_SMTP_PORTPort SMTP587
MAILER_FROM_EMAILAdresse d'expédition des emailsRoadmaps <noreply@example.com>
NEXT_PUBLIC_SITE_URLURL publique de l'instance (avec protocole)https://roadmaps.example.com
ADMINSIdentifiants des super-administrateurs, séparés par virgulealice,bob
AUTH_TRUST_HOSTActiver la confiance de l'hôte pour NextAuth1

Secrets

Générez des secrets aléatoires robustes pour SECURITY_JWT_SECRET et SECURITY_WEBHOOK_SECRET. En production, ne réutilisez jamais les valeurs de développement.

Optionnelles

VariableDescriptionDéfaut
APP_ENVEnvironnement applicatif (dev, review, staging, prod)dev
PLATFORM_DOMAINDomaine de la plateforme d'hébergement (ex: scalingo.io) — redirige les requêtes sur le domaine par défaut de la plateforme vers NEXT_PUBLIC_SITE_URL (301). Laisser vide pour désactiver.(vide)
MAINTENANCE_MODEActive le mode maintenancefalse
LOG_LEVELNiveau de log Pino (debug, info, warn, error)info
SENTRY_DSNDSN Sentry pour le suivi d'erreurs (vide = désactivé)—
NEXT_PUBLIC_MATOMO_URLURL de l'instance Matomo—
NEXT_PUBLIC_MATOMO_SITE_IDID du site Matomo—

Licence (features EE — optionnel)

Pour débloquer les features Enterprise Edition (intégrations, API keys, webhooks, domaines custom, tracking avancé, 2FA…) sur une instance self-hosted, vous devez acquérir une licence sur licensing.roadmaps-faciles.fr.

VariableDescriptionDéfaut
LICENSE_KEYClé de licence au format rf_live_... — laissez vide pour le mode Community (core AGPL uniquement)(vide)
LICENSING_SERVER_URLURL du serveur de licences (pour la vérification en ligne)https://licensing.roadmaps-faciles.fr
INSTANCE_IDIdentifiant unique de votre instance. Auto-généré et persisté en base au premier lancement si non défini. Définir cette variable force une valeur explicite (utile en multi-instance).(auto-généré)

Fonctionnement

La vérification de licence est principalement offline (signature Ed25519 embarquée dans la clé). Un refresh en ligne est effectué toutes les 24h auprès du serveur de licences. Lors du premier refresh réussi, l'instance est automatiquement activée (binding clé ↔ instance pour empêcher le partage). En cas d'indisponibilité du serveur, une période de grâce de 7 jours maintient les features EE actives. L'identifiant d'instance et le statut de la licence sont consultables dans Administration > Licence.

Plans disponibles :

PlanFeatures
LICENSEDToutes les features EE
GOV_LICENSEDToutes les features EE + thème DSFR (Design System de l'État)

Sans licence, l'instance fonctionne en mode Community avec les fonctionnalités core (AGPL v3).

OAuth / SSO (optionnel)

Pour activer la connexion via des fournisseurs OAuth, configurez les variables correspondantes :

VariableDescription
OAUTH_GITHUB_CLIENT_IDClient ID de l'application GitHub OAuth
OAUTH_GITHUB_CLIENT_SECRETClient Secret GitHub
OAUTH_GOOGLE_CLIENT_IDClient ID Google OAuth
OAUTH_GOOGLE_CLIENT_SECRETClient Secret Google
OAUTH_PROCONNECT_CLIENT_IDClient ID ProConnect (OIDC)
OAUTH_PROCONNECT_CLIENT_SECRETClient Secret ProConnect

Seuls les fournisseurs dont les variables sont renseignées seront disponibles. Chaque tenant choisit ensuite lesquels activer via Administration > Authentification.

Observabilité (optionnel)

VariableDescriptionDéfaut
SENTRY_DSNDSN Sentry pour le suivi d'erreurs (vide = désactivé)—
SENTRY_AUTH_TOKENToken d'authentification Sentry (pour l'upload des source maps)—
APP_ENVEnvironnement applicatif (dev, review, staging, prod) — les source maps ne sont uploadées qu'en prod et stagingdev

Branding

L'apparence de l'instance est personnalisable via les variables NEXT_PUBLIC_BRAND_* :

VariableDescription
NEXT_PUBLIC_BRAND_NAMENom de l'application
NEXT_PUBLIC_BRAND_TAGLINEAccroche sous le nom
NEXT_PUBLIC_BRAND_MINISTRYIntitulé du ministère (bloc-marque DSFR)
NEXT_PUBLIC_BRAND_OPERATOR_ENABLEAfficher le logo opérateur (true/false)
NEXT_PUBLIC_BRAND_OPERATOR_LOGO_URLURL du logo opérateur
NEXT_PUBLIC_BRAND_OPERATOR_LOGO_ALTTexte alternatif du logo
NEXT_PUBLIC_BRAND_OPERATOR_LOGO_ORIENTATIONOrientation du logo (vertical/horizontal)

Mentions légales

Les pages légales (mentions légales, politique de confidentialité) sont personnalisables pour refléter les informations de l'opérateur qui héberge l'instance :

VariableDescriptionDéfaut
NEXT_PUBLIC_LEGAL_PUBLISHER_NAMENom de l'éditeur du siteRoadmaps Faciles
NEXT_PUBLIC_LEGAL_PUBLISHER_ADDRESSAdresse de l'éditeur(vide)
NEXT_PUBLIC_LEGAL_PUBLICATION_DIRECTORDirecteur de la publicationLe responsable légal de Roadmaps Faciles
NEXT_PUBLIC_LEGAL_HOSTING_NAMENom de l'hébergeurScalingo SAS
NEXT_PUBLIC_LEGAL_HOSTING_ADDRESSAdresse de l'hébergeur15 avenue du Rhin, 67100 Strasbourg, France
NEXT_PUBLIC_LEGAL_HOSTING_CONTACTEmail de contact de l'hébergeursupport@scalingo.com
NEXT_PUBLIC_LEGAL_HOSTING_PRIVACY_URLLien vers la politique de confidentialité de l'hébergeur(Scalingo)
NEXT_PUBLIC_LEGAL_CONTACT_EMAILEmail de contact généralcontact@roadmaps-faciles.fr
NEXT_PUBLIC_LEGAL_RGPD_EMAILEmail DPO / exercice des droits RGPDrgpd@roadmaps-faciles.fr

Ces variables sont utilisées par les pages /mentions-legales et /politique-de-confidentialite. Si vous self-hostez, adaptez au minimum le nom de l'éditeur, l'hébergeur, et les adresses email de contact.

SMTP

VariableDescriptionDéfaut
MAILER_SMTP_HOSTHôte SMTP—
MAILER_SMTP_PORTPort SMTP587
MAILER_SMTP_LOGINIdentifiant SMTP—
MAILER_SMTP_PASSWORDMot de passe SMTP—
MAILER_SMTP_SSLActiver TLSfalse
MAILER_FROM_EMAILAdresse d'expédition—

Stockage S3 (upload d'images)

Pour activer l'upload d'images dans les contributions, configurez un stockage S3-compatible :

VariableDescriptionDéfaut
STORAGE_PROVIDERProvider de stockage : noop (désactivé), s3noop
STORAGE_MAX_FILE_SIZE_MBTaille max d'un fichier uploadé (Mo)5
STORAGE_S3_ENDPOINTEndpoint S3 (ex: https://s3.amazonaws.com ou MinIO)—
STORAGE_S3_REGIONRégion S3us-east-1
STORAGE_S3_BUCKETNom du bucket—
STORAGE_S3_ACCESS_KEY_IDAccess Key ID—
STORAGE_S3_SECRET_ACCESS_KEYSecret Access Key—
STORAGE_S3_PUBLIC_URLURL publique du bucket (pour construire les URLs des images)—

Le bucket doit être configuré pour un accès public en lecture (les images uploadées sont référencées directement dans le Markdown des contributions). Sur Scalingo, utilisez l'addon S3-compatible fourni par la plateforme.

Multi-tenant et domaines

VariableDescription
DOMAIN_PROVIDERFournisseur de domaine : noop, scalingo, scalingo-wildcard, clevercloud, caddy
DNS_PROVIDERFournisseur DNS : noop, manual, ovh, cloudflare
DNS_PROVIDER_TARGETDomaine cible pour les enregistrements CNAME des sous-domaines
DNS_ZONE_NAMEZone DNS si différente du domaine racine (sous-domaines imbriqués, ex. : site.fr pour un rootDomain roadmaps.site.fr)

Les variables spécifiques à chaque fournisseur sont documentées dans le fichier .env.development.

Build et lancement en production

1. Build

pnpm install
pnpm build

Le build produit un standalone output dans apps/web/.next/standalone/ — un serveur Node.js autonome qui embarque uniquement les dépendances nécessaires.

2. Lancement

node apps/web/.next/standalone/apps/web/server.js

Le serveur écoute par défaut sur le port 3000. Utilisez la variable PORT pour le modifier :

PORT=8080 node apps/web/.next/standalone/apps/web/server.js

Assets statiques

Le script build copie automatiquement les dossiers public/ et .next/static/ dans le standalone. Si vous déployez manuellement, vérifiez que ces dossiers sont présents dans .next/standalone/.

Base de données

Migrations

Appliquez les migrations Prisma avant chaque déploiement :

pnpm prisma migrate deploy

Ne pas utiliser en production

prisma migrate reset supprime toutes les données. Utilisez uniquement prisma migrate deploy en production.

Seed

Le seed initialise un administrateur et un premier espace de travail. Il est configurable via les variables SEED_* :

VariableDescriptionDéfaut
SEED_ADMIN_NAMENom de l'administrateurAdmin
SEED_ADMIN_EMAILEmail de l'administrateuradmin@example.com
SEED_ADMIN_USERNAMEIdentifiant de l'administrateuradmin
SEED_ADMIN_IMAGEURL de l'avatar de l'administrateur(vide)
SEED_TENANT_NAMENom du premier espaceLe Site par Défaut
SEED_TENANT_SUBDOMAINSous-domaine du premier espacedefault
pnpm prisma db seed

Options de déploiement

Scalingo

Roadmaps Faciles fournit un fichier scalingo.json pour le déploiement one-click :

  • Les addons PostgreSQL et Redis sont provisionnés automatiquement.
  • Les secrets (SECURITY_JWT_SECRET, SECURITY_WEBHOOK_SECRET) sont générés automatiquement.
  • Le script first-deploy exécute prisma migrate reset --force pour initialiser la base.

Variables spécifiques :

VariableDescription
DOMAIN_PROVIDERscalingo ou scalingo-wildcard
DOMAIN_SCALINGO_API_TOKENToken API Scalingo
DOMAIN_SCALINGO_API_URLURL de l'API Scalingo (ex. https://api.osc-fr1.scalingo.com)
DOMAIN_SCALINGO_APP_IDID de l'application Scalingo

Le mode scalingo-wildcard utilise un certificat wildcard (*.rootDomain) pour les sous-domaines, évitant la création d'un certificat par sous-domaine. Prérequis : un enregistrement DNS TXT _acme-challenge.rootDomain pour la validation Let's Encrypt, renouvelé automatiquement si le DNS provider est configuré (OVH, Cloudflare, Gandi, AWS Route 53, etc.).

Clever Cloud

VariableDescription
DOMAIN_PROVIDERclevercloud
DOMAIN_CLEVERCLOUD_CONSUMER_KEYClé consumer OAuth
DOMAIN_CLEVERCLOUD_CONSUMER_SECRETSecret consumer OAuth
DOMAIN_CLEVERCLOUD_TOKENToken OAuth
DOMAIN_CLEVERCLOUD_TOKEN_SECRETSecret du token OAuth
DOMAIN_CLEVERCLOUD_APP_IDID de l'application

VPS avec Caddy

Pour un hébergement sur VPS, Caddy est recommandé comme reverse proxy. Il gère automatiquement les certificats TLS via le mode on-demand TLS :

  1. Caddy reçoit une requête pour un domaine inconnu.
  2. Il interroge l'endpoint /api/domains/check?domain=... de l'application.
  3. Si le domaine correspond à un espace existant (sous-domaine ou domaine personnalisé), l'application répond 200 et Caddy émet un certificat Let's Encrypt.
  4. Si le domaine est inconnu, l'application répond 404 et Caddy refuse la connexion.

Exemple de configuration Caddy (Caddyfile) :

{
    on_demand_tls {
        ask http://localhost:3000/api/domains/check
    }
}

:443 {
    tls {
        on_demand
    }
    reverse_proxy localhost:3000
}
VariableDescription
DOMAIN_PROVIDERcaddy
DOMAIN_CADDY_ADMIN_URLURL de l'API admin Caddy (ex. http://localhost:2019)

Docker

L'application ne fournit pas de Dockerfile officiel, mais le standalone output se prête bien à la conteneurisation :

FROM node:24-alpine

WORKDIR /app
COPY apps/web/.next/standalone ./
COPY apps/web/.next/static ./apps/web/.next/static
COPY apps/web/public ./apps/web/public

ENV PORT=3000
EXPOSE 3000

CMD ["node", "apps/web/server.js"]

Multi-stage build

Pour un build complet depuis les sources, ajoutez une étape de build avec pnpm install && pnpm build puis copiez le standalone dans l'image finale.

Vérification

L'endpoint GET /api/healthz vérifie la connectivité aux services critiques :

curl -s http://localhost:3000/api/healthz | jq

Réponse type :

{
  "status": "healthy",
  "version": "0.0.1",
  "environment": "production",
  "timestamp": "2025-01-15T10:30:00.000Z",
  "checks": {
    "database": { "status": "healthy", "latencyMs": 5 },
    "redis": { "status": "healthy", "latencyMs": 2 }
  }
}
Code HTTPSignification
200Tous les services sont fonctionnels
503Au moins un service est indisponible

Cet endpoint est adapté pour les health checks de votre orchestrateur (Kubernetes, load balancer, monitoring).

Domaines personnalisés

Chaque espace de travail peut utiliser un domaine personnalisé en plus de son sous-domaine automatique.

Configuration

  1. Créez un enregistrement CNAME pointant vers le domaine racine de votre instance :
feedback.mon-produit.fr.  3600  IN  CNAME  roadmaps-faciles.incubateur.ademe.dev.
  1. Ajoutez le domaine personnalisé dans l'interface d'administration de l'espace.

  2. La plateforme vérifie le CNAME et provisionne le certificat TLS selon le fournisseur de domaine configuré.

Pour la configuration DNS détaillée, consultez la page Configuration DNS.

Fournisseurs DNS supportés

La plateforme peut automatiser la gestion des enregistrements DNS pour les sous-domaines (pas les domaines personnalisés) :

FournisseurConfigurationDescription
NoopDNS_PROVIDER=noopAucune automatisation (défaut)
ManuelDNS_PROVIDER=manualInstructions pour création manuelle
OVHDNS_PROVIDER=ovhAPI OVH (HMAC-SHA1)
CloudflareDNS_PROVIDER=cloudflareAPI Cloudflare v4

Bonnes pratiques production

  • Secrets — Utilisez des secrets générés aléatoirement (32+ caractères). Ne partagez jamais les secrets entre environnements.
  • Backups — Planifiez des sauvegardes régulières de PostgreSQL (pg_dump). Redis stocke des données éphémères (preuves 2FA, challenges WebAuthn, codes OTP) avec des TTL courts — il ne nécessite pas de sauvegarde, mais doit être disponible en permanence.
  • Monitoring — Configurez un check périodique sur /api/healthz. Activez Sentry (SENTRY_DSN) pour le suivi d'erreurs en temps réel.
  • Logs — En production, les logs sont émis en JSON (Pino). Configurez LOG_LEVEL=info et collectez les logs avec votre outil habituel (Datadog, Loki, ELK...).
  • Mises à jour — Suivez les releases du dépôt. Procédure de mise à jour :
    1. git pull (ou téléchargez la release)
    2. pnpm install
    3. pnpm build
    4. pnpm prisma migrate deploy
    5. Redémarrez le serveur
  • Administration — Le premier super-administrateur est défini par la variable ADMINS. Limitez le nombre de super-administrateurs au strict nécessaire.
  • TLS — En production, toutes les connexions doivent être en HTTPS. Caddy, Scalingo et Clever Cloud gèrent les certificats automatiquement.

Déploiement

Guide de déploiement de Roadmaps Faciles sur différentes plateformes.

Sécurité

Modèle de sécurité, isolation des données et mécanismes de protection.

On this page

Prérequis
Démarrage rapide
Variables d'environnement
Obligatoires
Optionnelles
Licence (features EE — optionnel)
OAuth / SSO (optionnel)
Observabilité (optionnel)
Branding
Mentions légales
SMTP
Stockage S3 (upload d'images)
Multi-tenant et domaines
Build et lancement en production
Base de données
Migrations
Seed
Options de déploiement
Scalingo
Clever Cloud
VPS avec Caddy
Docker
Vérification
Domaines personnalisés
Configuration
Fournisseurs DNS supportés
Bonnes pratiques production