--- # ========================================================================= # serveur_web_dorsal — webapps DYNAMIQUES (runtime + service systemd), derriere l'edge. # 2e brique de la plateforme webapp : 100% natif (venv/paquets + systemd + nginx), # ZERO conteneur. L'app ecoute en localhost ; un vhost nginx local la fronte ; # l'edge proxie vers ce nginx. BD reseau (PG) via resoudre_base si l'app en a une ; # les apps a etat local (SQLite) utilisent un data_dir persistant. # Codifie depuis le spike du 2026-07-05 (monregistraire, FastAPI + uvicorn + SQLite). # ========================================================================= serveur_web_dorsal_racine: "/srv/webapp" serveur_web_dorsal_utilisateur: "webapp" # Liste des webapps servies par ce noeud. Chaque entree : # nom identifiant court (dossier + service + vhost) # server_name FQDN servi (doit etre expose via applications.yml -> edge, port 80) # depot URL du depot git de l'app (souverain, ex. Forgejo) # branche branche a deployer (defaut: main) # port port local ecoute par l'app (127.0.0.1:) # commande ExecStart, relatif au dossier de l'app (ex: .venv/bin/uvicorn app.main:app --host 127.0.0.1 --port 8001) # requirements fichier pip (defaut: requirements.txt) ; venv cree automatiquement # env dict de variables d'environnement (secrets via voute) # data_dir repertoire d'etat persistant (optionnel ; cree, possede par webapp) serveur_web_dorsal_apps: [] # LES CODES QU'UNE WEBAPP SAINE PEUT RENDRE A LA RACINE, sans etre authentifie. # # 200 quand elle sert, 302 quand elle renvoie vers une page de connexion, 401/403 quand # elle exige une identite, 404 quand la racine n'est pas une route — une API sous # `/api/...` est parfaitement saine sans rien servir a `/`. Ce qui reste exclu : les 5xx # et l'absence de reponse, c'est-a-dire l'app coincee ou morte. serveur_web_dorsal_sonde_codes: "HTTP/1.1 200,HTTP/1.1 302,HTTP/1.1 401,HTTP/1.1 403,HTTP/1.1 404" # --- LES SITES STATIQUES (2026-09-29, repris du web frontal) ------------------------------- # # LE DORSAL PORTE LES SITES ; LE FRONTAL NE SERT RIEN LUI-MEME. Le web frontal est le reverse # proxy et le WAF devant les services web publics du locataire ; ce qui est servi — les # applications comme les sites statiques — vit ici. Un site statique : 100 % natif, nginx, # le contenu cloné d'un depot git souverain. serveur_web_dorsal_sites_racine: "/srv/web" # En-tetes de securite par defaut (sobriete + vie privee : tout local, pas de tiers). serveur_web_dorsal_csp_defaut: >- default-src 'self'; img-src 'self' data:; style-src 'self'; script-src 'self'; object-src 'none'; base-uri 'self'; frame-ancestors 'self' # Liste des sites statiques servis par ce noeud. Chaque entree : # nom identifiant court (dossier + vhost) # server_name FQDN servi — celui que le plan EXPOSE (applications.yml -> edge ou frontal) # depot URL du depot git du site (souverain, ex. Forgejo) # branche branche a servir (defaut: main) # sous_dossier sous-dossier du depot a servir comme racine (ex: public) # csp Content-Security-Policy specifique (optionnel) serveur_web_dorsal_sites: [] # LE PORT DES VHOSTS LOCAUX DES SITES. En clair sur cette machine : c'est le frontal (ou # l'edge, pour un nom interne) qui les recoit et les relaie. La sonde mesure ce qu'il ira # chercher — si le frontal est vert et le site muet, la panne est ici. serveur_web_dorsal_sites_port: 80 # --- LA FORGE DU SITE, SOURCE DES SITES ET DES APPLICATIONS (2026-09-29) ------------------- # # Les locataires n'ont plus de forge a eux : le contenu vient de celle du SITE, jointe par # son adresse et signee par l'AC du site. On ne pose pas cette racine dans le magasin # systeme : `git config http..sslCAInfo` ne l'applique qu'a CETTE forge — le patron du # runner (`serveur_ops`). L'adresse et la racine sont LUES chez le runner du locataire, # qui les declare deja : une seconde copie prendrait du retard. serveur_web_dorsal_forge_site: >- {{ (hostvars[groups['serveur_ops'][0]].serveur_ops_forge_amont | default('')) if (groups.get('serveur_ops') or []) else '' }} serveur_web_dorsal_forge_site_ac: >- {{ (hostvars[groups['serveur_ops'][0]].serveur_ops_forge_amont_ac | default('')) if (groups.get('serveur_ops') or []) else '' }} serveur_web_dorsal_forge_site_ac_depot: "/usr/local/share/setops/ac-forge-site.crt"