« infos et inscriptions sur https://installparty.alpinux.org » s'affichait en texte mort dans la fiche d'un événement : à recopier à la main. Les adresses du descriptif et du lieu deviennent des liens, la ponctuation qui termine la phrase restant en dehors. Le texte vient du calendrier, donc de quelqu'un qui écrit du texte et non du HTML : il est échappé avant d'être lié, et les titres et lieux des cartes le sont aussi, ce qui n'était pas le cas jusqu'ici. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01JYfYUZRcJmmEWJwAxZb4o2 |
||
|---|---|---|
| deploiement | ||
| site | ||
| .gitignore | ||
| README.md | ||
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
derniers-articles.json que le wiki
publie à chaque build. Si l'une ou l'autre source est injoignable, la section
correspondante se masque et le reste de la page tient debout. Le journal des
nouveautés, lui, vit dans le dépôt : site/nouveautes.json.
Je veux…
| Ce que vous voulez faire | Ce que vous faites |
|---|---|
| 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.
Structure
alpinux-www/
├── site/ ce qui part en ligne, tel quel
│ ├── 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
├── installer.sh pose tout sur le serveur (root, une fois)
├── deploy-www.sh git pull + rsync vers le DocumentRoot
├── webhook.py service d'écoute, 127.0.0.1:9877
├── www-webhook.service unité systemd
└── vhost-deploy.conf le relais Apache, pour trace
Annoncer une nouveauté
La section « Nouveautés » de l'accueil est dessinée à partir de site/nouveautes.json —
un tableau d'entrées, url facultative :
{
"date": "2026-09-23",
"titre": "Listes de diffusion",
"texte": "Une phrase ou deux, à hauteur de visiteur.",
"url": "https://messagerie.alpinux.org"
}
L'ordre du fichier n'a pas d'importance : la page trie sur date et n'affiche que les
six entrées les plus récentes. Les plus anciennes restent dans le fichier, comme
mémoire. Une entrée sans titre ou sans date au format AAAA-MM-JJ est ignorée ;
si le fichier disparaît ou devient illisible, la section se masque comme les deux autres.
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 :
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.
# 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
git push (sur main)
│
Gitea (origin/main)
│ webhook ──▶ https://alpinux.org/deploy ──▶ service d'écoute (signature vérifiée)
▼
deploy-www.sh : git pull → index.html complet ? → rsync vers le DocumentRoot
▼
https://alpinux.org
Compter moins d'une minute. Le garde-fou est modeste mais réel : un index.html tronqué
— transfert coupé, conflit mal résolu — ne part pas en ligne.
Les deux pièges à connaître
Supprimer un fichier ici ne le retire pas du serveur. Le rsync de déploiement est
volontairement sans --delete : le DocumentRoot contient aussi des fichiers qui ne sont
pas dans ce dépôt — le .htaccess qui relaie /public-calendars vers Nextcloud, les
pages d'erreur et les statistiques d'ISPConfig. Un --delete les emporterait. Retirer un
fichier en ligne se fait donc à la main, sur le serveur.
Le serveur n'écrit dans le DocumentRoot que par une ACL. web11/web appartient à
l'utilisateur web11 ; installer.sh pose un setfacl pour l'utilisateur du service.
Si ISPConfig réinitialise les droits du site un jour, le déploiement échouera avec une
erreur de permission — relancer installer.sh suffit à la remettre.
Historique
Ce dépôt est né le 2026-09-20, par détachement du monorepo alpinux.site.2026 où la page
vivait sous home/. Elle y était déployée à la main, et le dépôt avait fini par
diverger : la version en ligne portait quatre mois de modifications faites directement sur
le serveur et jamais revenues dans git. C'est ce qui a motivé le webhook.