From d740c2c9007ce4fc1f9fef10bd7ad0f8dfc41049 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?C=C3=A9drix?= Date: Wed, 23 Sep 2026 12:42:03 +0200 Subject: [PATCH] Publier toutes les pages du wiki, et une vraie page d'erreur MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit L'accueil n'annonçait que six pages du wiki, et rien ne menait au reste : qui voulait savoir ce qui avait bougé depuis sa dernière visite n'avait nulle part où aller. modifications.html liste tout ce que le wiki publie, du plus récemment retouché au plus ancien, avec un filtre par titre ou par rubrique. Elle lit toutes-les-pages.json, que le build du wiki écrit à côté de derniers-articles.json ; tant que ce fichier n'existe pas, elle se rabat sur celui de l'accueil et le dit plutôt que de rester vide. 404.html reprend la charte et propose l'accueil, le wiki, les mises à jour et les listes. Elle attend encore sa directive Apache : le site répond aujourd'hui 200 et l'accueil à toute adresse inconnue, ce qui trompe le visiteur comme le moteur de recherche. Le README dit quoi poser dans le .htaccess du serveur. Les deux pages partagent commun.css plutôt que de recopier le style de l'accueil, qui garde le sien en ligne — une page, une requête. Et le garde-fou du déploiement, qui ne regardait que l'accueil, refuse désormais de mettre en ligne n'importe quelle page tronquée : une 404 servie à moitié serait aussi laide qu'une erreur. Co-Authored-By: Claude Opus 5 (1M context) Claude-Session: https://claude.ai/code/session_01JYfYUZRcJmmEWJwAxZb4o2 --- README.md | 57 +++++- deploiement/deploy-www.sh | 15 +- site/404.html | 135 +++++++++++++++ site/commun.css | 128 ++++++++++++++ site/index.html | 3 + site/modifications.html | 352 ++++++++++++++++++++++++++++++++++++++ site/sitemap.xml | 8 +- 7 files changed, 686 insertions(+), 12 deletions(-) create mode 100644 site/404.html create mode 100644 site/commun.css create mode 100644 site/modifications.html diff --git a/README.md b/README.md index 855da1a..bf8071b 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,8 @@ # www.alpinux.org -La page d'accueil de l'association — du HTML statique, une seule page, servie sur -`https://alpinux.org` et `https://www.alpinux.org`. +Le site public de l'association — du HTML statique, servi sur `https://alpinux.org` et +`https://www.alpinux.org` : la page d'accueil, la page des mises à jour du wiki, et la +page d'erreur 404. Elle affiche deux choses qu'elle ne contient pas : l'**agenda**, lu dans le calendrier public Nextcloud, et les **dernières pages du wiki**, lues dans @@ -16,12 +17,13 @@ nouveautés**, lui, vit dans le dépôt : `site/nouveautes.json`. | Ce que vous voulez faire | Ce que vous faites | |---|---| -| Modifier la page | Éditer `site/index.html`, pousser sur `main` — la mise en ligne suit | +| Modifier l'accueil | Éditer `site/index.html`, pousser sur `main` — la mise en ligne suit | | Annoncer une nouveauté | Ajouter une entrée en tête de `site/nouveautes.json` (voir plus bas) | | Voir le rendu avant de pousser | `python3 -m http.server -d site` puis http://localhost:8000 | | Comprendre pourquoi ça n'est pas en ligne | `tail -20 /var/log/www-deploy.log` sur le serveur | | Republier sans nouveau commit | `sudo -u abonnelc /opt/www-alpinux/deploy-www.sh` | | Réinstaller la chaîne de déploiement | `sudo bash deploiement/installer.sh` | +| Reprendre une modification de `deploiement/` | Relancer `installer.sh` : le serveur exécute sa copie dans `/opt/www-alpinux`, pas celle du dépôt | En local, l'agenda reste vide : `/public-calendars/…` est relayé vers Nextcloud par le serveur, pas par `http.server`. Les articles du wiki, eux, s'affichent normalement. @@ -33,8 +35,11 @@ serveur, pas par `http.server`. Les articles du wiki, eux, s'affichent normaleme ``` alpinux-www/ ├── site/ ce qui part en ligne, tel quel -│ ├── index.html -│ ├── nouveautes.json le journal des nouveautés, lu par la page +│ ├── index.html l'accueil, son style et ses scripts en ligne +│ ├── modifications.html toutes les pages du wiki, datées +│ ├── 404.html la page d'erreur +│ ├── commun.css la charte des deux pages secondaires +│ ├── nouveautes.json le journal des nouveautés, lu par l'accueil │ ├── robots.txt │ └── sitemap.xml └── deploiement/ la chaîne, versionnée avec le site @@ -68,6 +73,48 @@ si le fichier disparaît ou devient illisible, la section se masque comme les de --- +## Les mises à jour du wiki + +`site/modifications.html` liste **toutes** les pages de wiki.alpinux.org, de la plus +récemment retouchée à la plus ancienne, avec un filtre par titre ou rubrique. Elle lit +`https://wiki.alpinux.org/toutes-les-pages.json`, que le build du wiki publie à chaque +fois — comme il publie déjà `derniers-articles.json` pour l'accueil. + +Si ce fichier manque, la page se rabat sur `derniers-articles.json` et le dit : on +obtient les vingt dernières pages au lieu de toutes, plutôt qu'une page vide. Les deux +sources injoignables, elle affiche un message et renvoie vers le wiki. + +Le contenu se change donc **dans le dépôt du wiki**, pas ici : ajouter une page à la +navigation du wiki suffit à la faire apparaître. + +--- + +## La page 404 + +`site/404.html` reprend la charte du site, annonce clairement l'erreur et propose +l'accueil, le wiki, les mises à jour et les listes de diffusion. Elle porte +`noindex, follow` : une page d'erreur n'a rien à faire dans un moteur de recherche, +mais ses liens restent bons à suivre. + +**Elle ne sert à rien sans la directive Apache qui va avec.** Le `.htaccess` du +DocumentRoot — qui vit sur le serveur, pas dans ce dépôt public — doit porter : + +```apache +ErrorDocument 404 /404.html +``` + +et **ne pas** renvoyer les adresses inconnues vers l'accueil. Une règle du type +`RewriteRule . /index.html [L]` produit un « soft 404 » : le visiteur voit l'accueil, +le moteur de recherche enregistre une page valide, et personne ne sait que l'adresse +était fausse. + +```bash +# ce qu'on doit lire une fois la directive en place +curl -o /dev/null -w '%{http_code}\n' https://alpinux.org/adresse-qui-nexiste-pas # 404 +``` + +--- + ## Ce qui se passe après un push ``` diff --git a/deploiement/deploy-www.sh b/deploiement/deploy-www.sh index 1e33ba1..e61ac29 100755 --- a/deploiement/deploy-www.sh +++ b/deploiement/deploy-www.sh @@ -13,12 +13,15 @@ echo "[$(date '+%Y-%m-%d %H:%M:%S')] Deploy started" >> "$LOG" cd "$REPO_DIR" git pull origin main >> "$LOG" 2>&1 -# Garde-fou : un index.html tronqué ne part pas en ligne. C'est l'équivalent, pour un -# site sans build, du « mkdocs build --strict » du wiki. -if ! grep -q "" "$SOURCE/index.html"; then - echo "[$(date '+%Y-%m-%d %H:%M:%S')] ABANDON : index.html incomplet" >> "$LOG" - exit 1 -fi +# Garde-fou : une page tronquée ne part pas en ligne. C'est l'équivalent, pour un +# site sans build, du « mkdocs build --strict » du wiki. Toutes les pages y passent, +# pas seulement l'accueil : la 404 servie à moitié serait aussi laide qu'une erreur. +for page in "$SOURCE"/*.html; do + if ! grep -q "" "$page"; then + echo "[$(date '+%Y-%m-%d %H:%M:%S')] ABANDON : $(basename "$page") incomplet" >> "$LOG" + exit 1 + fi +done # Pas de --delete, volontairement : le DocumentRoot contient aussi des fichiers qui ne # sont pas dans ce dépôt — le .htaccess qui relaie /public-calendars vers Nextcloud, les diff --git a/site/404.html b/site/404.html new file mode 100644 index 0000000..ca48e19 --- /dev/null +++ b/site/404.html @@ -0,0 +1,135 @@ + + + + + + + Page introuvable — Alpinux + + + + + + + + + + +
+ + Logo Alpinux — LUG de Savoie + + + Alpinux + + le LUG de Savoie + + +
+ + + +
+ +

Cette page n'existe pas… ou plus

+

+ L'adresse demandée ne correspond à rien sur ce site. Un lien qui a vieilli, une + coquille dans l'adresse, ou une page que nous avons déplacée — dans tous les cas, + l'accueil vous remettra sur les rails. +

+ +

+ Retour à l'accueil +

+ +
+

Ou bien, directement :

+ +
+
+ + + + + diff --git a/site/commun.css b/site/commun.css new file mode 100644 index 0000000..10d7b36 --- /dev/null +++ b/site/commun.css @@ -0,0 +1,128 @@ +/* Charte partagée par les pages secondaires — 404, mises à jour du wiki. + L'accueil garde son style en ligne : une page, une requête, rien à attendre. */ + +*, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; } + +body { + font-family: 'Segoe UI', system-ui, -apple-system, sans-serif; + background: #f3f6fb; + color: #1a1a2e; + min-height: 100vh; + display: flex; + flex-direction: column; +} + +/* ── En-tête ──────────────────────────────────────────────────────── */ +header { + background: #1a6bbf; + color: #fff; + padding: 2.2rem 1.5rem 1.8rem; + text-align: center; +} + +.logo-wrap { + display: flex; + align-items: center; + justify-content: center; + gap: 1.1rem; + flex-wrap: wrap; + text-decoration: none; +} + +.logo-img { width: 66px; height: 66px; border-radius: 10px; } + +.logo-text { text-align: left; } + +.brand { + display: block; + font-size: 2.1rem; + line-height: 1; + color: #fff; + letter-spacing: -.02em; +} + +.brand .light { font-weight: 300; } +.brand .bold { font-weight: 800; } + +.tagline { + display: block; + font-size: .82rem; + font-weight: 300; + letter-spacing: .18em; + color: rgba(255,255,255,.8); + margin-top: .25rem; + text-transform: lowercase; +} + +/* ── Navigation ───────────────────────────────────────────────────── */ +nav { + background: #0f4e8f; + display: flex; + justify-content: center; + gap: .2rem; + flex-wrap: wrap; + padding: .4rem 1rem; +} + +nav a { + color: rgba(255,255,255,.85); + text-decoration: none; + font-size: .88rem; + padding: .45rem .9rem; + border-radius: 4px; + transition: background .15s; +} + +nav a:hover { background: rgba(255,255,255,.15); color: #fff; } +nav a[aria-current="page"] { background: rgba(255,255,255,.18); color: #fff; } + +/* ── Corps ────────────────────────────────────────────────────────── */ +main { + max-width: 860px; + width: 100%; + margin: 0 auto; + padding: 3rem 1.5rem; + flex: 1; +} + +h1 { + font-size: 1.6rem; + color: #0f4e8f; + line-height: 1.25; + margin-bottom: .8rem; +} + +.chapeau { + font-size: 1rem; + line-height: 1.7; + color: #4a5a6a; + max-width: 62ch; +} + +.chapeau a { color: #1a6bbf; } + +.bouton { + display: inline-block; + background: #1a6bbf; + color: #fff; + text-decoration: none; + font-weight: 600; + font-size: .95rem; + padding: .7rem 1.4rem; + border-radius: 8px; + transition: background .15s, transform .15s; +} + +.bouton:hover { background: #0f4e8f; transform: translateY(-2px); } + +/* ── Pied de page ─────────────────────────────────────────────────── */ +footer { + background: #0f4e8f; + color: rgba(255,255,255,.75); + text-align: center; + padding: 1.6rem 1.5rem; + font-size: .85rem; +} + +footer a { color: rgba(255,255,255,.9); text-decoration: none; } +footer a:hover { text-decoration: underline; } diff --git a/site/index.html b/site/index.html index 5ead851..741a7c2 100644 --- a/site/index.html +++ b/site/index.html @@ -702,6 +702,7 @@ Portail membres Install Party Gitea + Mises à jour du wiki Listes de diffusion Adhérer @@ -755,6 +756,8 @@

Parcourir tout le wiki → +  ·  + Toutes les mises à jour →

diff --git a/site/modifications.html b/site/modifications.html new file mode 100644 index 0000000..7b7dd54 --- /dev/null +++ b/site/modifications.html @@ -0,0 +1,352 @@ + + + + + + + + Les mises à jour du wiki — Alpinux + + + + + + + + + + + + + + + + + + + + +
+ + Logo Alpinux — LUG de Savoie + + + Alpinux + + le LUG de Savoie + + +
+ + + +
+

Les mises à jour du wiki

+

+ Toutes les pages de wiki.alpinux.org, de la + plus récemment retouchée à la plus ancienne. Les dates viennent de l'historique du + dépôt : c'est le jour où le texte a changé, pas celui où le fichier a été recopié. + Déplacer une page ne la fait donc pas remonter ici. +

+ +
+ + + +
+ +
Chargement de la liste…
+
    + +
    + + + + + + + diff --git a/site/sitemap.xml b/site/sitemap.xml index 667684f..8dabbf5 100644 --- a/site/sitemap.xml +++ b/site/sitemap.xml @@ -2,8 +2,14 @@ https://alpinux.org/ - 2026-05-03 + 2026-09-23 monthly 1.0 + + https://alpinux.org/modifications.html + 2026-09-23 + weekly + 0.6 +