# serveur_web_dorsal Hébergement de **webapps dynamiques** (runtime + service systemd), derrière l'edge. Deuxième brique de la **plateforme webapp** de Set-OPS : **100 % natif** — venv/paquets + systemd + nginx, **zéro conteneur**. Codifié depuis le spike du 2026-07-05 (monregistraire : FastAPI + uvicorn + SQLite). ## Patron Pour chaque app déclarée dans `serveur_web_dorsal_apps` : 1. `git clone` (depth 1) → `/srv/webapp/` ; 2. venv Python + `pip install -r requirements.txt` ; 3. **unité systemd** (l'app écoute en `127.0.0.1:`, user `webapp`, durcie : NoNewPrivileges, PrivateTmp) ; 4. **vhost nginx local** qui fronte l'app (`server_name` → `127.0.0.1:`). L'app reste **en localhost** (sûr) ; l'edge proxie `server_name` → nginx local → app. Exposé via `applications.yml` (port **80**, pas le port interne de l'app). ## Déclaration (group_vars du groupe serveur_web_dorsal) ```yaml serveur_web_dorsal_apps: - nom: registraire server_name: "registraire.{{ domaine_interne }}" depot: "https://forge.{{ domaine_interne }}/…/monregistraire.git" branche: main port: 8001 commande: ".venv/bin/uvicorn app.main:app --host 127.0.0.1 --port 8001" env: { IMMOS_DB_PATH: /var/lib/registraire/immos.db } data_dir: /var/lib/registraire # état local (SQLite), optionnel ``` Et une app `groupe: serveur_web_dorsal, hote: , port: 80, expose: [registraire.]`. ## BD Les apps à état **local** (SQLite) : `data_dir` persistant. Les apps à **BD réseau** (PostgreSQL) : déclarer la base dans `bases-donnees.yml` et passer le DSN via `env` (resoudre_base) — même motif que les autres services Set-OPS. ## Runtimes Éprouvé sur **Python (FastAPI/uvicorn)**. Node/autres : adapter `commande` + les paquets de runtime (le patron systemd + nginx + git reste identique). ## Validation `ansible-lint` profil production + `--syntax-check`. Éprouvé sur web-frontal-01 (monregistraire servi via l'edge, HTTPS step-ca, API fonctionnelle).