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
141 lines
4.5 KiB
Markdown
141 lines
4.5 KiB
Markdown
---
|
|
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/<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.
|