La page était en place, mais Apache renvoyait toujours l'accueil avec un code 200 : c'est le .htaccess et le routeur PHP qui décidaient, et ni l'un ni l'autre ne vit dans ce dépôt. Le README disait quoi poser ; il dit maintenant ce qui est posé, et ce qui reviendra si ISPConfig réinitialise ces fichiers un jour. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01JYfYUZRcJmmEWJwAxZb4o2
159 lines
6.9 KiB
Markdown
159 lines
6.9 KiB
Markdown
# 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`](https://wiki.alpinux.org/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 :
|
|
|
|
```json
|
|
{
|
|
"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 dépend de deux réglages qui vivent sur le serveur**, pas dans ce dépôt public —
|
|
en place depuis le 23 septembre 2026 :
|
|
|
|
- le `.htaccess` du DocumentRoot porte `ErrorDocument 404 /404.html`, et n'envoie plus
|
|
au routeur PHP que les adresses commençant par `public-calendars` ;
|
|
- `index.php`, ce routeur, finit par un `http_response_code(404)` suivi de la page,
|
|
au lieu du `readfile('index.html')` qu'il faisait avant.
|
|
|
|
Jusque-là, **toute adresse inconnue recevait l'accueil avec un code 200** : le visiteur
|
|
croyait avoir atterri quelque part, et les moteurs de recherche enregistraient autant
|
|
de pages valides qu'il existe d'adresses fausses. Si ISPConfig réinitialise un jour ces
|
|
fichiers, c'est ce comportement qui revient — et c'est ce qu'il faut reposer.
|
|
|
|
```bash
|
|
# ce qu'on doit lire
|
|
curl -o /dev/null -w '%{http_code}\n' https://alpinux.org/adresse-qui-nexiste-pas # 404
|
|
curl -o /dev/null -w '%{http_code}\n' https://alpinux.org/ # 200
|
|
curl -s https://alpinux.org/public-calendars/n5BWPYsxw7FCYozM | grep -c BEGIN:VEVENT # > 0
|
|
```
|
|
|
|
---
|
|
|
|
## 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.
|