Espace de travail Alpinux — multi-projets
Find a file
Cédrix df889649d8 admin et dynamic sortent de l'espace de travail
Ils rejoignent le wiki dans leur propre dossier — ~/Projects/alpinux.admin et
~/Projects/alpinux.dynamic — au même niveau que cet espace. Un dépôt git, un
dossier : l'imbrication n'apportait rien et faisait croire à un monorepo.

Le tableau des projets, les procédures de déploiement, le tableau de
développement local et les commandes de lancement sont mis à jour. Une section
« Sortis de cet espace » récapitule où sont passés les trois dépôts.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01PcZ7hL9aVvMhRuzxXLT2DG
2026-09-19 22:48:05 +02:00
.gitignore Ajouter .credentials (ignoré), compléter .gitignore et README 2026-05-03 20:20:54 +02:00
README.md admin et dynamic sortent de l'espace de travail 2026-09-19 22:48:05 +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 un espace de travail local — il n'a pas de remote git.


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
static/ static.alpinux.org Flask + AlpID + CDN alpinux-static
infra/ — Configs Apache + systemd dépôt git local séparé

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

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


Procédure de déploiement

Vue d'ensemble

Projet Méthode Commande
home git pull sur serveur ssh alpinux.org "cd <web root> && git pull"
static (app) rsync local + restart cd static && scripts/deploy-app.sh
static (assets) rsync local cd static && scripts/push-assets.sh

Dans tous les cas : versionner avec git push avant de déployer.

static.alpinux.org — app Flask

# 1. Poste local
git push origin main

# 2. Déployer (rsync depuis le dépôt local + restart service)
cd static
scripts/deploy-app.sh

static.alpinux.org — assets CDN

cd static
scripts/push-assets.sh    # rsync logo/, wiki/, stats/, error/ → web root ISPConfig

Wiki

Rien à faire : un webhook Gitea construit et met en ligne à chaque push sur main. Voir https://wiki.alpinux.org/technique/deploiement-wiki/


Développement local

Projet Commande URL
static python app/app.py http://localhost:5003
cd <projet>
python3 -m venv venv && source venv/bin/activate
pip install -r requirements.txt
cp .env.example .env && nano .env
flask run --port <port>

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/org.alpinux.owni/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


Infra

infra/ est un dépôt git local indépendant (pas de remote Gitea).
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"