Déploiement : plus aucune valeur d'exemple à corriger à la main

L'unité web portait ORIGIN=https://veille.example.org : un fichier versionné
qu'il fallait éditer à chaque déploiement, et dont l'oubli casse silencieusement
les soumissions de formulaire. Remplacé par PROTOCOL_HEADER / HOST_HEADER :
l'application déduit son origine des en-têtes du reverse proxy et fonctionne
donc sur n'importe quel domaine, sans édition.

Vérifié en exécutant réellement le binaire construit : deux domaines
différents servis par le même processus, HTTP 200 dans les deux cas, et un
ORIGIN figé l'emporte bien sur les en-têtes.

Au passage, une affirmation fausse que j'avais écrite en commentaire : « le
.env l'emporte sur les variables systemd ». C'est l'inverse — le --env-file de
Node ne remplace pas une variable déjà présente dans l'environnement (constaté
sur Node 24). Le commentaire dit désormais pourquoi ORIGIN dans .env fonctionne
quand même : parce que l'unité ne le déclare pas. Et un contrôle mécanique
interdit désormais de le redéclarer.

ExecStart passe par /usr/bin/env : NodeSource installe node dans /usr/bin, une
compilation manuelle dans /usr/local/bin, un chemin figé échouait sur l'un des
deux.

Deux contrôles ajoutés à make verifier : aucune valeur d'exemple active dans
les unités systemd, et ORIGIN laissé au .env.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
Cyber Mawonaj
2026-07-25 22:51:05 -04:00
co-authored by Claude Opus 5
parent 29424afdd5
commit bdeaa9fa7f
4 changed files with 83 additions and 15 deletions
+20 -5
View File
@@ -146,12 +146,26 @@ démarre Node qu'à la première requête ; sans trafic pendant `IDLE_TIMEOUT`
(300 s), elle s'arrête. Sur un site de veille peu fréquenté, l'empreinte mémoire
tombe à zéro entre deux visites — ce qui compte sur un serveur à 5 € par mois.
Avant de démarrer, ajustez `ORIGIN` dans `veille-web.service` : sans lui, les
soumissions de formulaire sont refues derrière un reverse proxy.
**Aucun fichier n'est à éditer avant de démarrer.** L'unité déduit son origine
des en-têtes posés par le reverse proxy (`PROTOCOL_HEADER` / `HOST_HEADER`),
donc elle fonctionne quel que soit votre domaine. Sans cette origine,
adapter-node refuserait les soumissions de formulaire (« Cross-site POST form
submissions are forbidden »).
Ces en-têtes ne sont dignes de confiance que parce que l'application n'écoute
que sur `127.0.0.1` : seul le proxy local peut les poser. **N'exposez jamais le
port 3971 directement** — l'origine deviendrait falsifiable par le client.
Pour figer l'origine plutôt que la déduire, renseignez `ORIGIN=` dans `.env` :
adapter-node la retient d'office, sa résolution s'écrivant
`origin || get_origin(headers)`.
### Reverse proxy
**Caddy** (le plus court, HTTPS automatique) :
Remplacez `veille.example.org` par votre domaine dans les deux exemples.
**Caddy** (le plus court, HTTPS automatique — il pose les en-têtes attendus
sans configuration supplémentaire) :
```caddy
veille.example.org {
@@ -180,8 +194,9 @@ server {
}
```
Avec nginx, remplacez `ORIGIN` par `PROTOCOL_HEADER=x-forwarded-proto` et
`HOST_HEADER=x-forwarded-host` dans le service.
Les trois en-têtes `X-Forwarded-*` de cet exemple ne sont pas décoratifs :
ce sont eux dont l'application déduit son origine. Les omettre casserait les
soumissions de formulaire.
### Vérifier