alpinux-wiki/docs/technique/deploiement-dynamic.md
Alpinux 4ff7390d6b Déploiement de dynamic.alpinux.org : décrire ce qui tourne réellement
Installation faite le 22/10/2026 sur owni : /opt/dynamic-alpinux, service
dynamic-alpinux sur 127.0.0.1:5001, configuration dans .env, mise en ligne
par scripts/deploy.sh (dépôt privé, pas de git pull sur le serveur).
Ajoute l'état de la connexion AlpID (client Keycloak à créer) et renvoie au
DEPLOIEMENT.md du dépôt pour le détail.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_019V4mhmHoJD3b8YfQy249dC
2026-10-22 08:54:28 +02:00

4.5 KiB

description
Déploiement de dynamic.alpinux.org — application Flask derrière Apache (ISPConfig), Gunicorn, SQLite, AlpID.

Déploiement de dynamic.alpinux.org

Le site « apprendre Linux en jouant » : cours, jeux et quiz. Application Flask, publique, avec une connexion AlpID pour enregistrer ses scores.

!!! note "Pour qui ?" Les mainteneurs qui ont un accès SSH au serveur. La référence détaillée est le fichier DEPLOIEMENT.md du dépôt alpinux-dynamic, tenu à jour avec le code ; cette page en donne l'essentiel.


Architecture

Navigateur
    │  HTTPS
    ▼
Apache (ISPConfig, proxy, Let's Encrypt)
    │  HTTP, 127.0.0.1:5001
    ▼
Gunicorn (2 workers) — service dynamic-alpinux
    │
    ▼
Flask (/opt/dynamic-alpinux)
    │                    │
    ▼                    ▼
SQLite               AlpID (OIDC)
/var/lib/dynamic-alpinux/scores.db
Code /opt/dynamic-alpinux, utilisateur système dynamic-alpinux
Service dynamic-alpinux, Gunicorn sur 127.0.0.1:5001
Configuration /opt/dynamic-alpinux/.env (droits 600)
Base de données /var/lib/dynamic-alpinux/scores.db
Journaux sudo journalctl -u dynamic-alpinux

Mettre à jour le site

Toute modification passe par une pull request fusionnée dans main. Ensuite, depuis sa copie locale du dépôt :

scripts/deploy.sh -n   # quel commit de main va partir
scripts/deploy.sh      # mise en ligne

Le script envoie origin/main sur le serveur, installe les dépendances, redémarre le service et vérifie que les pages répondent.

!!! info "Pourquoi pas un git pull sur le serveur ?" Le dépôt est privé et le serveur n'a pas d'identifiant pour la forge. Le code part donc du poste du mainteneur, comme pour static.alpinux.org.

Les jeux, les cours et les quiz sont lus au démarrage : modifier le contenu demande, comme le code, une mise en ligne.


Gérer le service

Action Commande
État systemctl status dynamic-alpinux
Redémarrer sudo systemctl restart dynamic-alpinux
Journal en direct sudo journalctl -u dynamic-alpinux -f
Tester sans Apache curl -sI http://127.0.0.1:5001/jeux/ (sur le serveur)

Le site dans ISPConfig

Le proxy se déclare dans Sites → dynamic.alpinux.org → Options → Directives Apache, et pas dans le fichier .vhost, qu'ISPConfig régénère :

ProxyPass        /.well-known/  !
ProxyPreserveHost On
ProxyPass        / http://127.0.0.1:5001/
ProxyPassReverse / http://127.0.0.1:5001/

RequestHeader set X-Forwarded-Proto "https"
RequestHeader set X-Forwarded-For   "%{REMOTE_ADDR}s"

La première ligne laisse passer le renouvellement du certificat Let's Encrypt.


La connexion AlpID

L'application utilise le realm master d'AlpID, comme admin.alpinux.org. Son client Keycloak, dynamic, se crée dans la console d'AlpID :

  1. Clients → Create client, Client ID dynamic ;
  2. Client authentication activé ;
  3. Valid redirect URIs : https://dynamic.alpinux.org/auth/callback ;
  4. Web origins : https://dynamic.alpinux.org ;
  5. le secret de l'onglet Credentials va dans ALPID_CLIENT_SECRET, dans /opt/dynamic-alpinux/.env, puis on redémarre le service.

!!! warning "État au 22/10/2026" Le client n'est pas encore créé : les cours, les jeux et les quiz publics fonctionnent, mais pas la connexion. Il faut aussi que l'application tienne compte du proxy HTTPS (ProxyFix) avant de l'ouvrir, sinon AlpID refuse l'adresse de retour.


Ajouter du contenu

Les procédures pour ajouter un jeu, un cours ou un quiz sont dans le README.md du dépôt. En résumé :

Contenu Fichiers
Quiz data/quizzes.json
Jeu une entrée dans data/jeux.json, et data/jeux/<id>.json
Cours data/cours/<id>.md

Puis pull request, fusion, et scripts/deploy.sh.


Réinstaller de zéro

Le détail, commande par commande, est dans DEPLOIEMENT.md. Dans l'ordre :

  1. créer l'utilisateur système dynamic-alpinux, les dossiers /opt/dynamic-alpinux et /var/lib/dynamic-alpinux, et le venv ;
  2. écrire /opt/dynamic-alpinux/.env (droits 600) ;
  3. installer l'unité systemd, dont une copie de référence est dans deploiement/ ;
  4. lancer scripts/deploy.sh depuis sa copie locale ;
  5. créer le site dans ISPConfig, avec Let's Encrypt et les directives ci-dessus.