Espace de travail Alpinux — multi-projets
Find a file
Cédrix abbef2304c Recentrer ce dépôt sur l'infrastructure, pas sur les sites
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
2026-09-27 12:45:45 +02:00
.gitignore Ajouter .credentials (ignoré), compléter .gitignore et README 2026-05-03 20:20:54 +02:00
README.md Recentrer ce dépôt sur l'infrastructure, pas sur les sites 2026-09-27 12:45:45 +02:00

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 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
home/ alpinux.org HTML statique alpinux-home
portail/ portail.alpinux.org en construction alpinux-portail
infra/ — Configs Apache + systemd 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
~/Projects/alpinux.admin admin.alpinux.org alpinux-admin
~/Projects/alpinux.dynamic dynamic.alpinux.org alpinux-dynamic
~/Projects/alpinux.static static.alpinux.org alpinux-static
~/Projects/alpinux.gitea gitea.alpinux.org alpinux-gitea
~/Projects/alpinux.messagerie messagerie.alpinux.org 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 :

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


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


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

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).
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"