La page annonçait l'existence des services, jamais leur arrivée : un visiteur régulier n'avait aucun moyen de voir ce qui avait bougé depuis sa dernière visite. Une section « Nouveautés » s'en charge, dessinée à partir de site/nouveautes.json — ajouter une entrée ne demande plus de toucher au HTML. Les six entrées de départ sont reconstituées depuis l'historique git, ici et dans le monorepo d'où la page vient. La page trie sur la date, l'ordre du fichier est donc libre, et n'affiche que les six plus récentes ; les anciennes restent dans le fichier comme mémoire. Fichier absent ou illisible : la section se masque, comme l'agenda et le wiki le font déjà de leur côté. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01JYfYUZRcJmmEWJwAxZb4o2
109 lines
4.4 KiB
Markdown
109 lines
4.4 KiB
Markdown
# 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`.
|
|
|
|
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 la page | É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` |
|
|
|
|
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
|
|
│ ├── nouveautes.json le journal des nouveautés, lu par la page
|
|
│ ├── 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.
|
|
|
|
---
|
|
|
|
## 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.
|