Aller au contenu

ADR-053 : Extraction du déploiement dans un opt-in

Statut

Proposé, Forge 1.0.0-beta.x (ticket DEPLOY-EXTRACT-001).
Décision d'architecture ; relève du mainteneur.


Date

2026-06-26


Contexte

Le déploiement vit aujourd'hui dans le cœur du CLI : cli/deploy/ fournit les
commandes forge deploy:init (génère wsgi.py, une configuration Nginx, une
unité systemd, un README_DEPLOY.md) et forge deploy:check, pour environ 730
lignes.

Trois constats motivent cet ADR :

  1. C'est de l'outillage, pas du runtime. Aucun code de core/ ni d'une
    application n'importe cli.deploy : c'est un générateur de configuration
    d'exploitation, jamais une brique que l'application appelle à l'exécution.
  2. C'est opinioné. deploy:init suppose Nginx, systemd et Gunicorn. Une
    application déployée en Docker, en Kubernetes ou derrière un autre proxy n'a
    pas besoin de cette opinion, aujourd'hui cuite dans le cœur du CLI.
  3. Ce n'est pas de la génération de code MVC. La génération du cœur (les
    make:*) produit le code applicatif de l'utilisateur (entités, CRUD,
    contrôleurs), ce qui est bien du ressort du cœur (ADR-004). Générer une
    configuration d'infrastructure relève d'une autre catégorie.

Le dossier deploy/ à la racine du dépôt (sortie régénérable de deploy:init)
a par ailleurs été retiré : le dépôt framework ne porte pas d'application
déployée (ADR-044). La question restante est : la génération de déploiement
elle-même doit-elle rester dans le cœur, ou devenir un opt-in ?


Décision

Extraire le déploiement dans un opt-in forge-mvc-deploy (module
forge_mvc_deploy).

Périmètre de l'opt-in :

  • les commandes forge deploy:init et forge deploy:check ;
  • les gabarits générés (Nginx, systemd, wsgi.py, README_DEPLOY.md) ;
  • la documentation de déploiement (docs/deployment/) migrée en doc embarquée du
    paquet (ADR-038).

Branchement, fidèle au modèle déjà en place pour les opt-ins à CLI (settings:init,
audit:init, iot:*, etc.) : forge.py dispatche deploy:* vers
forge_mvc_deploy par import paresseux, avec un repli explicite « module non
installé, lancer pip install forge-mvc-deploy ».

forge-mvc-deploy est le premier opt-in à CLI seule (pas d'API runtime
importée par l'application). Ce n'est pas sans précédent : forge-mvc-testing
est déjà un opt-in dev-only sans API métier. L'outillage de déploiement suit la
même logique : on installe la brique quand on en a besoin.

Justification au regard de la charte :

  • Principe 8 (noyau minimal, briques opt-in) : le déploiement n'est pas du
    runtime de framework ; il rejoint les capacités déjà extraites (mail, i18n,
    pivot, files, images).
  • ADR-004 (périmètre du cœur) : le cœur génère du code MVC, pas de la
    configuration d'infrastructure.
  • L'opinion Nginx/systemd/Gunicorn devient opt-in au lieu d'être imposée par
    le cœur.

Mise en œuvre (phasage)

L'extraction du code, du paquet, de la dispatch, des tests et de la doc
embarquée minimale (présentation + référence CLI) est livrée par
DEPLOY-EXTRACT-001.

La migration des sept guides de mise en production (docs/deployment/) vers la
doc embarquée du paquet est différée à un ticket de suivi dédié
(DEPLOY-DOCS-MIGRATE-001). Ces guides sont fortement intriqués : plus de
quinze liens entrants depuis le reste de docs/ et plusieurs tests qui codent
en dur leurs chemins. Les déplacer dans le même ticket que l'extraction du code
mêlerait deux changements à risques distincts. Dans l'intervalle, le paquet
référence ces guides, qui restent publiés dans la documentation Forge.

Conséquences

  • Le cœur du CLI maigrit (730 lignes et leurs gabarits partent dans l'opt-in).
  • Le déploiement devient une brique cohérente et autonome : code, gabarits et
    documentation au même endroit (doc embarquée ADR-038).
  • L'onboarding gagne une étape : forge deploy:init exige d'abord
    pip install forge-mvc-deploy. Le repli de forge.py guide l'utilisateur.
  • Premier opt-in à CLI seule : la dispatch forge.py et les garde-fous meta
    (table des opt-ins, classifiers, smoke test, doc embarquée, parcours welcome)
    s'appliquent comme aux autres paquets.
  • Les références deploy/... de la documentation restent valides : elles
    désignent le dossier généré dans le projet utilisateur, pas le dépôt framework.

Alternatives écartées

  • Laisser le déploiement dans le cœur du CLI. Contredit le principe 8 et
    l'ADR-004, et impose l'opinion Nginx/systemd/Gunicorn à tous les projets, y
    compris ceux qui déploient autrement.
  • Documenter sans générer (comme les starters, ADR-035). Les guides
    docs/deployment/ existent déjà, mais deploy:check a besoin de code, et les
    gabarits générés (config adaptée à upload_max_size, chemins du projet) ont
    une vraie valeur qu'un copier-coller manuel perd. L'opt-in garde la génération
    utile tout en la rendant optionnelle.
  • Rattacher le déploiement à un opt-in existant (par exemple
    forge-mvc-admin). Mauvais domaine : le déploiement n'a rien à voir avec le
    back-office. Une brique dédiée est plus claire (principe 11).

Référence

  • Charte : CHARTE_DOC.md (principe 8, noyau minimal ; principe 11, une seule
    façon officielle).
  • ADR-004 : périmètre du cœur minimal.
  • ADR-016 : modèle opt-in.
  • ADR-035 : documenter plutôt que
    générer (tension examinée ici).
  • ADR-038 : documentation embarquée par
    paquet.
  • ADR-044 : le dépôt framework ne porte que le
    framework.
  • cli/deploy/ (code actuel), docs/deployment/ (guides à migrer).