Ce dépôt parle du serveur ; les sites parlent d'eux-mêmes dans leur propre dépôt. Dupliquer leurs procédures ici garantissait qu'elles divergent. Sortent donc : les procédures de déploiement détaillées de static et du wiki, et la section « développement local ». À leur place, un tableau qui dit seulement **où** chercher — y compris pour la messagerie, dont le paragraphe d'avertissement ajouté ce matin décrivait le site et non la machine. Le courrier sortant, les certificats et les sauvegardes deviennent des renvois vers infra/docs/, où le détail vit désormais. Trois sections que j'avais écrites ici ce matin et qui y faisaient double emploi : une information écrite à deux endroits est une information qui sera fausse à l'un des deux. Restent ce qui est propre à la machine : le serveur lui-même, les bases, le SSO, les comptes, les credentials, et la carte de ce qu'elle héberge. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01SFbwnJurBwTs7x7t93ecku
208 lines
7.8 KiB
Markdown
208 lines
7.8 KiB
Markdown
# org.alpinux.owni
|
|
|
|
Accueil des projets de l'association **Alpinux** (le LUG de Savoie).
|
|
|
|
Chaque sous-dossier est un dépôt git indépendant avec son propre remote sur Gitea.
|
|
Ce dossier racine est l'espace de travail : son dépôt
|
|
[alpinux-owni](https://gitea.alpinux.org/alpinux.cedrica5l/alpinux-owni) ne versionne que
|
|
ce `README.md` et le `.gitignore` — le contenu des sous-dossiers appartient à leur dépôt.
|
|
|
|
---
|
|
|
|
## Projets
|
|
|
|
| Dossier | Domaine | Technologie | Dépôt Gitea |
|
|
|---------|---------|-------------|-------------|
|
|
| `feedback/` | feedback.alpinux.org | à construire | [alpinux-feedback](https://gitea.alpinux.org/alpinux.cedrica5l/alpinux-feedback) |
|
|
| `home/` | alpinux.org | HTML statique | [alpinux-home](https://gitea.alpinux.org/alpinux.cedrica5l/alpinux-home) |
|
|
| `portail/` | portail.alpinux.org | en construction | [alpinux-portail](https://gitea.alpinux.org/alpinux.cedrica5l/alpinux-portail) |
|
|
| `infra/` | — | Configs Apache + systemd | [alpinux-infra](https://gitea.alpinux.org/alpinux.cedrica5l/alpinux-infra) |
|
|
|
|
### Sortis de cet espace
|
|
|
|
Ces projets ont leur propre dossier, au même niveau que celui-ci — un dépôt, un dossier :
|
|
|
|
| Dossier | Domaine | Dépôt Gitea |
|
|
|---------|---------|-------------|
|
|
| `~/Projects/alpinux.wiki` | wiki.alpinux.org | [alpinux-wiki](https://gitea.alpinux.org/alpinux.cedrica5l/alpinux-wiki) |
|
|
| `~/Projects/alpinux.admin` | admin.alpinux.org | [alpinux-admin](https://gitea.alpinux.org/alpinux.cedrica5l/alpinux-admin) |
|
|
| `~/Projects/alpinux.dynamic` | dynamic.alpinux.org | [alpinux-dynamic](https://gitea.alpinux.org/alpinux.cedrica5l/alpinux-dynamic) |
|
|
| `~/Projects/alpinux.static` | static.alpinux.org | [alpinux-static](https://gitea.alpinux.org/alpinux.cedrica5l/alpinux-static) |
|
|
| `~/Projects/alpinux.gitea` | gitea.alpinux.org | [alpinux-gitea](https://gitea.alpinux.org/alpinux.cedrica5l/alpinux-gitea) |
|
|
| `~/Projects/alpinux.messagerie` | messagerie.alpinux.org | [alpinux.messagerie](https://gitea.alpinux.org/alpinux.cedrica5l/alpinux.messagerie) |
|
|
|
|
Leurs procédures de déploiement sont décrites dans leur propre README.
|
|
|
|
Gitea : **https://gitea.alpinux.org/alpinux.cedrica5l**
|
|
ISPConfig : **https://owni.alpinux.org:8080**
|
|
AlpID (SSO) : **https://alpid.alpinux.org** — realm `master`
|
|
|
|
---
|
|
|
|
## Déployer un site
|
|
|
|
**Chaque projet décrit son déploiement dans son propre dépôt.** Ce dépôt-ci
|
|
parle du serveur, pas des sites qu'il héberge : dupliquer les procédures ici
|
|
garantirait qu'elles divergent.
|
|
|
|
| Projet | Où est la procédure |
|
|
|---|---|
|
|
| `static` | `alpinux-static/README.md` — `scripts/deploy-app.sh`, `scripts/push-assets.sh` |
|
|
| `wiki` | webhook Gitea à chaque push ; <https://wiki.alpinux.org/technique/deploiement-wiki/> |
|
|
| `home` | `git pull` sur le serveur |
|
|
| `messagerie` | `alpinux.messagerie/docs/installation.md` — **copie de fichiers, base d'abord** |
|
|
| autres | le README du dépôt concerné |
|
|
|
|
Dans tous les cas : versionner avec `git push` **avant** de déployer.
|
|
|
|
---
|
|
|
|
## Authentification AlpID
|
|
|
|
Tous les projets Flask utilisent **AlpID** (SSO Keycloak).
|
|
|
|
- Chaque projet a son propre client Keycloak (`admin`, `dynamic`, `static-cdn`, …)
|
|
- Scopes : `openid profile email`
|
|
- Autorisation : claim `groups` → sinon `ADMIN_EMAILS` → sinon tout utilisateur AlpID
|
|
- Discovery URL : `https://alpid.alpinux.org/realms/master/.well-known/openid-configuration`
|
|
|
|
---
|
|
|
|
## Credentials locaux
|
|
|
|
Le fichier **`.credentials`** (ignoré par git) centralise les accès à renseigner localement :
|
|
|
|
```
|
|
.credentials ← à compléter manuellement, jamais commité
|
|
```
|
|
|
|
Il contient : token Gitea API, accès ISPConfig, accès AlpID admin, secrets clients Keycloak.
|
|
Utiliser `source .credentials` dans un script pour charger les variables.
|
|
|
|
---
|
|
|
|
## Règle Claude Code
|
|
|
|
Lancer Claude depuis le sous-dossier du projet pour limiter le contexte :
|
|
|
|
```bash
|
|
cd ~/Projects/alpinux.static && claude
|
|
cd ~/Projects/alpinux.wiki && claude
|
|
```
|
|
|
|
---
|
|
|
|
## Comptes personnels vs comptes de service
|
|
|
|
Alias SSH : `alpinux.org` → compte `abonnelc`.
|
|
|
|
### Règle absolue
|
|
|
|
Un compte personnel (`abonnelc` ou tout autre) ne doit jouer **aucun rôle dans le fonctionnement à long terme** des services :
|
|
|
|
- pas `User=` dans un unit systemd
|
|
- pas propriétaire des fichiers de l'app ou des logs
|
|
- pas dans la liste des groupes dont dépend un service en production
|
|
- pas référencé dans un `chown`, `setfacl`, ou cron de production
|
|
|
|
Si un service dépend d'un compte personnel, sa disparition (départ, suppression du compte, changement de login) fait tomber le service en production.
|
|
|
|
### Rôle d'abonnelc
|
|
|
|
`abonnelc` est un **compte d'administration ponctuelle**, limité à :
|
|
|
|
- créer ou modifier les fichiers `.env` sur le serveur
|
|
- redémarrer un service après un déploiement
|
|
- effectuer des opérations admin exceptionnelles
|
|
|
|
### Comptes de service
|
|
|
|
Chaque service tourne sous son propre utilisateur système dédié (ex. `static-cdn` pour `static-cdn.service`).
|
|
C'est ce compte qui possède les fichiers, les logs, et les droits nécessaires — pas `abonnelc`.
|
|
|
|
---
|
|
|
|
## Serveur
|
|
|
|
| | |
|
|
|---|---|
|
|
| **Hostname** | `owni.alpinux.org` |
|
|
| **OS** | Debian 12 (bookworm) |
|
|
| **IPv4** | `51.91.79.148` |
|
|
| **IPv6** | `2001:41d0:404:200::3f85/128` |
|
|
| **Passerelle IPv6** | `2001:41d0:404:200::1` |
|
|
| **SSH** | `ssh alpinux.org` (alias → `abonnelc@owni.alpinux.org`) |
|
|
|
|
Config IPv6 persistante : `/etc/network/interfaces.d/60-ipv6.cfg`
|
|
Cloud-init réseau désactivé : `/etc/cloud/cloud.cfg.d/99-disable-network-config.cfg`
|
|
|
|
---
|
|
|
|
## Courrier sortant
|
|
|
|
Tout le courrier de la machine passe par un relais depuis les 25-26/09/2026
|
|
(`mail.acemail.fr`), et l'IP qui parle aux destinataires n'est plus celle
|
|
d'owni. SPF, DKIM, DMARC, les plafonds de Postfix, les boîtes du service et
|
|
les pièges qui vont avec :
|
|
|
|
→ **[infra/docs/courrier-sortant.md](https://gitea.alpinux.org/alpinux.cedrica5l/alpinux-infra/src/branch/main/docs/courrier-sortant.md)**
|
|
|
|
---
|
|
|
|
## Certificats TLS
|
|
|
|
Deux mécanismes coexistent — un certificat certbot multi-domaines pour huit
|
|
sites, un certificat par site émis par ISPConfig via acme.sh — avec un piège
|
|
qui a déjà cassé deux fois le HTTPS d'un site pendant plusieurs semaines.
|
|
|
|
→ **[infra/docs/certificats.md](https://gitea.alpinux.org/alpinux.cedrica5l/alpinux-infra/src/branch/main/docs/certificats.md)**
|
|
|
|
---
|
|
|
|
## Bases de données
|
|
|
|
Six bases applicatives, déclarées dans ISPConfig, plus celles du système.
|
|
|
|
| Base | Service | Sauvegarde |
|
|
|---|---|---|
|
|
| `c1_messagerie_db` | messagerie.alpinux.org | quotidienne, **1 copie** |
|
|
| `c1dolibarr` | dolibarr.alpinux.org — fichier des adhérents | **aucune** |
|
|
| `c1gitea` | gitea.alpinux.org — tous les dépôts | **aucune** |
|
|
| `c1alpid` | alpid.alpinux.org — le SSO | **aucune** |
|
|
| `c1_installparty` | installparty.alpinux.org | **aucune** |
|
|
| `c1_evenements` | événements | **aucune** |
|
|
|
|
S'y ajoutent `dbispconfig`, `roundcube` et `phpmyadmin`.
|
|
|
|
`sudo mysql` passe par le socket unix, sans mot de passe.
|
|
|
|
---
|
|
|
|
## Sauvegardes
|
|
|
|
Les sept bases sont tirées chaque nuit vers le poste par
|
|
`infra/scripts/sauvegarder-owni.sh`. La procédure de **restauration** — et ses
|
|
pièges, dont le worker de la messagerie qui réexpédierait une campagne — est
|
|
écrite à côté :
|
|
|
|
→ **[infra/docs/sauvegardes.md](https://gitea.alpinux.org/alpinux.cedrica5l/alpinux-infra/src/branch/main/docs/sauvegardes.md)**
|
|
|
|
Ce qui n'est **pas** sauvegardé : les fichiers des sites, les boîtes mail,
|
|
`/etc`. Ce sont des choix, écrits comme tels dans le document.
|
|
|
|
---
|
|
|
|
## Infra
|
|
|
|
`infra/` est un dépôt git indépendant ([alpinux-infra](https://gitea.alpinux.org/alpinux.cedrica5l/alpinux-infra)).
|
|
Il contient les configurations de référence pour audit et reconstruction :
|
|
|
|
```
|
|
infra/
|
|
├── conf/ → VirtualHost Apache par service
|
|
├── services/ → Units systemd
|
|
└── docs/ → Documentation déploiement par service
|
|
```
|
|
|
|
|
|
ne pas mentionner "sonnet" ou "claude"
|