--- 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](https://gitea.alpinux.org/alpinux.cedrica5l/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 : ```bash 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 : ```apache 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/.json` | | Cours | `data/cours/.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.