frontal : page 404 du locataire pour les noms qu il ne publie pas

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
Daniel Allaire 2026-09-29 18:37:00 -04:00
parent f818143b49
commit 5f23201075
4 changed files with 66 additions and 0 deletions

View file

@ -1,5 +1,24 @@
# CHANGELOG — Set-OPS
## 2026-09-29 (44) — La page du PSPBT devient la page 404 du frontal de Chezlepro
Précision de l'exploitant sur (43) : c'est le **frontal** qui doit servir cette page, comme
**page 404 par défaut** — pas le dorsal comme page d'un site.
- **Le rôle `serveur_web_frontal`** accepte une page 404 du locataire
(`serveur_web_frontal_page_404`, un chemin dans le dépôt du locataire) : le serveur par
défaut la sert, statut 404, à tout nom qu'il ne publie pas ; sans page déclarée, il ferme
toujours sans réponse (444). La page est `internal` (pas de lecture directe de
`/404.html` : 404 aussi), avec sa propre CSP (styles et scripts en ligne, rien d'extérieur).
Le nom inconnu n'obtient toujours aucun service.
- **Chezlepro** : `contenus/frontal-404.html` (le fichier `site web.html` de l'exploitant) ;
Technolibre garde le 444.
- **`essai.chezlepro.ca` revient à sa page de test**, CSP par défaut (la CSP propre au site,
posée en (43), est retirée).
Éprouvé depuis l'Internet : `http://69.70.26.61/`, un chemin quelconque, `/404.html` et un nom
inconnu → 404 avec la page du PSPBT ; `essai.chezlepro.ca` → 200, la page de test.
## 2026-09-29 (43) — `essai.chezlepro.ca` sert la page du « Parti de la Sainte-Paix et du Bon Temps »
À la demande de l'exploitant : le fichier `site web.html` (le seul du dossier `parti politique

View file

@ -38,3 +38,16 @@ serveur_web_frontal_taille_max_corps: "16m"
# Un amont declare sur un de ces ports se parle en TLS (comme a l'edge).
serveur_web_frontal_ports_tls: [443, 8443]
# --- LA PAGE 404 DU FRONTAL (2026-09-29) ----------------------------------------------------
#
# Ce que recoit une requete pour un nom que le frontal ne publie pas : une visite de l'adresse
# publique sans nom, un nom inconnu. Vide = la connexion est fermee sans reponse (444). Un
# chemin (sur le controleur, dans le depot du locataire) = cette page, avec le statut 404.
# C'est un CONTENU du locataire : il vit dans son depot, pas dans ce role.
serveur_web_frontal_page_404: ""
serveur_web_frontal_racine_404: "/var/www/setops-frontal"
# La page peut porter ses styles et scripts en ligne ; rien d'exterieur n'est autorise.
serveur_web_frontal_page_404_csp: >-
default-src 'self'; img-src 'self' data:; style-src 'self' 'unsafe-inline';
script-src 'self' 'unsafe-inline'; object-src 'none'; base-uri 'self'; frame-ancestors 'self'

View file

@ -69,6 +69,24 @@
| expositions_des_applications({'domaines_publics': domaines_publics | default({})}, serveur_web_frontal_groupe) }}
when: serveur_web_frontal_publier_expositions | bool
- name: Creer la racine de la page 404
ansible.builtin.file:
path: "{{ serveur_web_frontal_racine_404 }}"
state: directory
owner: root
group: root
mode: "0755"
when: serveur_web_frontal_page_404 | length > 0
- name: Deposer la page 404 du locataire
ansible.builtin.copy:
src: "{{ serveur_web_frontal_page_404 }}"
dest: "{{ serveur_web_frontal_racine_404 }}/404.html"
owner: root
group: root
mode: "0644"
when: serveur_web_frontal_page_404 | length > 0
- name: Deployer les vhosts du frontal (derives des expositions publiques)
ansible.builtin.template:
src: frontal.conf.j2

View file

@ -3,11 +3,27 @@
# LE SERVEUR PAR DEFAUT REFUSE TOUT NOM INCONNU (meme regle que l'edge) : sans lui, nginx
# confie un nom inconnu au premier vhost, et un balayage de l'adresse publique recevrait un
# service qu'il n'a pas nomme.
#
# LA PAGE 404 DU LOCATAIRE, s'il en declare une (`serveur_web_frontal_page_404`) : le nom
# inconnu recoit cette page, statut 404 — il n'obtient toujours aucun service. Sinon, 444.
server {
listen 80 default_server;
listen [::]:80 default_server;
server_name _;
{% if serveur_web_frontal_page_404 | length > 0 %}
root {{ serveur_web_frontal_racine_404 }};
error_page 404 /404.html;
location = /404.html {
internal;
add_header Content-Security-Policy "{{ serveur_web_frontal_page_404_csp | trim }}" always;
add_header X-Content-Type-Options "nosniff" always;
}
location / {
return 404;
}
{% else %}
return 444;
{% endif %}
}
{% for expo in serveur_web_frontal_expositions | default([]) %}
{% if expo.hote in hostvars and hostvars[expo.hote].ansible_host is defined and expo.port %}