Set-OPS-Public/roles/serveur_web_dorsal/README.md
Daniel Allaire af13fc37c9 Rôles web : renommer web_frontal/dorsal -> serveur_web_frontal/dorsal (convention)
Aligne sur la convention serveur_* de tous les rôles de service (vars incluses).
Le modèle presence-web (pré-existant) utilisait déjà ces noms -> il colle enfin.
Aussi : serveur_web_dorsal ne chown plus le code (reste root, lecture seule pour
l'app = plus sûr + git idempotent, fini le 'propriété douteuse' au pull).
Idempotence prouvée (2e passage changed=0). lint production.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-05 18:49:31 -04:00

44 lines
2 KiB
Markdown

# 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/<nom>` ;
2. venv Python + `pip install -r requirements.txt` ;
3. **unité systemd** (l'app écoute en `127.0.0.1:<port>`, user `webapp`, durcie :
NoNewPrivileges, PrivateTmp) ;
4. **vhost nginx local** qui fronte l'app (`server_name` → `127.0.0.1:<port>`).
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: <noeud>, port: 80, expose: [registraire.<domaine>]`.
## 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).