Compare commits
No commits in common. "bc7e9f601b93f0ca4449d4da701e4b2bb1de8e72" and "60eb8bc952a9b2f7af932ed3e8eed38154b1a6d5" have entirely different histories.
bc7e9f601b
...
60eb8bc952
58 changed files with 324 additions and 211 deletions
21
.gitignore
vendored
21
.gitignore
vendored
|
|
@ -1,25 +1,18 @@
|
|||
wiki/site/
|
||||
wiki/__pycache__/
|
||||
|
||||
# Assets binaires — générés par wiki/scripts/build-assets.py
|
||||
# Hébergés sur https://static.alpinux.org/logo/
|
||||
wiki/docs/assets/*.png
|
||||
wiki/docs/assets/*.ico
|
||||
wiki/docs/assets/images/
|
||||
|
||||
site/
|
||||
__pycache__/
|
||||
dynamic/__pycache__/
|
||||
dynamic/routes/__pycache__/
|
||||
dynamic/venv/
|
||||
dynamic/.env
|
||||
|
||||
admin/__pycache__/
|
||||
admin/venv/
|
||||
admin/.env
|
||||
|
||||
# Configuration serveur (Apache vhosts, systemd) — local uniquement, ne pas versionner
|
||||
infra/
|
||||
*.vhost.conf
|
||||
*.service
|
||||
# Assets binaires — générés par scripts/build-assets.py
|
||||
# Hébergés sur https://static.alpinux.org/logo/
|
||||
docs/assets/*.png
|
||||
docs/assets/*.ico
|
||||
docs/assets/images/
|
||||
|
||||
# Obsidian (local uniquement)
|
||||
.obsidian/
|
||||
|
|
|
|||
91
README.md
91
README.md
|
|
@ -1,91 +0,0 @@
|
|||
# org.alpinux.owni — Monorepo Alpinux
|
||||
|
||||
Dépôt unique de l'association **Alpinux** (LUG de Savoie).
|
||||
Gitea : https://gitea.alpinux.org/alpinux.cedrica5l/alpinux.site.2026
|
||||
|
||||
---
|
||||
|
||||
## Structure
|
||||
|
||||
Chaque sous-dossier correspond à un sous-domaine indépendant de `alpinux.org`.
|
||||
|
||||
```
|
||||
org.alpinux.owni/
|
||||
├── wiki/ → wiki.alpinux.org MkDocs Material (documentation publique)
|
||||
├── home/ → alpinux.org Page d'accueil statique
|
||||
├── dynamic/ → dynamic.alpinux.org Flask — quiz et jeux (public + membres)
|
||||
├── admin/ → admin.alpinux.org Flask — interface d'administration
|
||||
├── static/ → static.alpinux.org CDN assets : logos, favicons, images OG
|
||||
├── portail/ → portail.alpinux.org Portail membres (ISPConfig, Nextcloud…)
|
||||
└── feedback/ → feedback.alpinux.org Formulaire de retours (à construire)
|
||||
```
|
||||
|
||||
Les configurations serveur (Apache, systemd) sont gérées séparément et ne sont **pas versionnées**.
|
||||
|
||||
---
|
||||
|
||||
## Projets indépendants, liés par l'infrastructure
|
||||
|
||||
Chaque projet :
|
||||
- utilise **AlpID** (SSO Keycloak) pour l'authentification quand nécessaire
|
||||
- a son propre environnement Python (`venv/`) et son fichier `.env` (non versionés)
|
||||
|
||||
Les projets sont liés par le SSO partagé, le serveur commun, et l'identité visuelle (logo depuis `static.alpinux.org`).
|
||||
|
||||
---
|
||||
|
||||
## Convention git et Claude
|
||||
|
||||
> **Travailler dans le sous-dossier du projet concerné**, pas à la racine du dépôt.
|
||||
|
||||
```bash
|
||||
cd wiki/ # pour modifier le wiki ou MkDocs
|
||||
cd dynamic/ # pour modifier l'appli quiz
|
||||
cd admin/ # pour modifier l'interface admin
|
||||
```
|
||||
|
||||
De même, lorsqu'on utilise **Claude Code** (ou tout autre outil IA) :
|
||||
lancer Claude depuis le sous-dossier du projet pour que le contexte soit limité à ce projet.
|
||||
|
||||
```bash
|
||||
cd ~/Projects/org.alpinux.owni/wiki && claude
|
||||
cd ~/Projects/org.alpinux.owni/admin && claude
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Démarrage rapide par projet
|
||||
|
||||
### wiki (wiki.alpinux.org)
|
||||
```bash
|
||||
cd wiki
|
||||
python3 scripts/build-assets.py # génère docs/assets/alpinux-logo.png
|
||||
pip install mkdocs-material
|
||||
mkdocs serve # dev local
|
||||
mkdocs build --strict # build de prod dans site/
|
||||
```
|
||||
|
||||
### dynamic (dynamic.alpinux.org)
|
||||
```bash
|
||||
cd dynamic
|
||||
python3 -m venv venv && source venv/bin/activate
|
||||
pip install -r requirements.txt
|
||||
cp .env.example .env && nano .env # renseigner les clés AlpID
|
||||
flask run
|
||||
```
|
||||
|
||||
### admin (admin.alpinux.org)
|
||||
```bash
|
||||
cd admin
|
||||
python3 -m venv venv && source venv/bin/activate
|
||||
pip install -r requirements.txt
|
||||
cp .env.example .env && nano .env # renseigner les clés AlpID
|
||||
flask run
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Déploiement serveur
|
||||
|
||||
Voir `wiki/docs/technique/` pour la documentation.
|
||||
Les fichiers de configuration serveur sont conservés localement hors dépôt.
|
||||
|
|
@ -1,6 +1,6 @@
|
|||
SECRET_KEY=changez-moi-avec-une-valeur-aleatoire-longue
|
||||
|
||||
ALPID_CLIENT_ID=<client-id-configuré-dans-keycloak>
|
||||
ALPID_CLIENT_ID=alpinux-admin
|
||||
ALPID_CLIENT_SECRET=
|
||||
ALPID_DISCOVERY_URL=https://alpid.alpinux.org/realms/alpinux/.well-known/openid-configuration
|
||||
|
||||
|
|
@ -8,4 +8,4 @@ ALPID_DISCOVERY_URL=https://alpid.alpinux.org/realms/alpinux/.well-known/openid-
|
|||
ADMIN_GROUPS=admins
|
||||
|
||||
# Chemin du script de déploiement (défaut dans builds.py si non défini)
|
||||
# DEPLOY_SCRIPT=<chemin absolu vers le script de déploiement>
|
||||
# DEPLOY_SCRIPT=/home/alpinux/site/scripts/deploy-wiki.sh
|
||||
|
|
|
|||
|
|
@ -8,8 +8,8 @@ import builds
|
|||
app = Flask(__name__)
|
||||
app.secret_key = os.environ["SECRET_KEY"]
|
||||
|
||||
# Gère X-Forwarded-Proto envoyé par Apache
|
||||
app.wsgi_app = ProxyFix(app.wsgi_app, x_proto=1)
|
||||
# Gère X-Forwarded-Proto et X-Script-Name envoyés par Apache
|
||||
app.wsgi_app = ProxyFix(app.wsgi_app, x_proto=1, x_prefix=1)
|
||||
|
||||
# ── OIDC AlpID ────────────────────────────────────────────────────
|
||||
oauth = OAuth(app)
|
||||
|
|
|
|||
|
|
@ -18,7 +18,7 @@ Navigateur
|
|||
│ HTTPS
|
||||
▼
|
||||
Apache (reverse proxy, SSL)
|
||||
│ HTTP (port local dédié)
|
||||
│ HTTP 127.0.0.1:5001
|
||||
▼
|
||||
Gunicorn (2 workers)
|
||||
│
|
||||
|
|
@ -37,15 +37,15 @@ SQLite AlpID OIDC
|
|||
### 1. Cloner le dépôt sur le serveur
|
||||
|
||||
```bash
|
||||
ssh <user>@alpinux.org
|
||||
ssh alpinux@alpinux.org
|
||||
git clone https://gitea.alpinux.org/alpinux.cedrica5l/alpinux.site.2026.git \
|
||||
$APP_DIR
|
||||
/home/alpinux/site
|
||||
```
|
||||
|
||||
### 2. Créer l'environnement Python
|
||||
|
||||
```bash
|
||||
cd $APP_DIR/dynamic
|
||||
cd /home/alpinux/site/dynamic
|
||||
python3 -m venv venv
|
||||
venv/bin/pip install -r requirements.txt gunicorn
|
||||
```
|
||||
|
|
@ -54,7 +54,7 @@ venv/bin/pip install -r requirements.txt gunicorn
|
|||
|
||||
```bash
|
||||
sudo mkdir /etc/dynamic-alpinux
|
||||
sudo cp $APP_DIR/dynamic/.env.example /etc/dynamic-alpinux/config.env
|
||||
sudo cp /home/alpinux/site/dynamic/.env.example /etc/dynamic-alpinux/config.env
|
||||
sudo nano /etc/dynamic-alpinux/config.env
|
||||
```
|
||||
|
||||
|
|
@ -62,10 +62,10 @@ Remplissez les valeurs :
|
|||
|
||||
```bash
|
||||
SECRET_KEY=<générer avec : python3 -c "import secrets; print(secrets.token_hex(32))">
|
||||
ALPID_CLIENT_ID=<client-id-configuré-dans-keycloak>
|
||||
ALPID_CLIENT_ID=dynamic-alpinux
|
||||
ALPID_CLIENT_SECRET=<obtenir depuis la console Keycloak AlpID>
|
||||
ALPID_DISCOVERY_URL=https://alpid.alpinux.org/realms/alpinux/.well-known/openid-configuration
|
||||
DATABASE=<chemin vers le fichier scores.db>
|
||||
DATABASE=/var/lib/dynamic-alpinux/scores.db
|
||||
```
|
||||
|
||||
```bash
|
||||
|
|
@ -75,9 +75,9 @@ sudo chmod 600 /etc/dynamic-alpinux/config.env
|
|||
### 4. Créer les répertoires de données et de logs
|
||||
|
||||
```bash
|
||||
sudo mkdir -p <répertoire données>
|
||||
sudo mkdir -p <répertoire logs>
|
||||
sudo chown <user>:<group> <répertoire données> <répertoire logs>
|
||||
sudo mkdir -p /var/lib/dynamic-alpinux
|
||||
sudo mkdir -p /var/log/dynamic-alpinux
|
||||
sudo chown alpinux:alpinux /var/lib/dynamic-alpinux /var/log/dynamic-alpinux
|
||||
```
|
||||
|
||||
### 5. Configurer AlpID (Keycloak)
|
||||
|
|
@ -85,7 +85,7 @@ sudo chown <user>:<group> <répertoire données> <répertoire logs>
|
|||
Dans la console d'administration Keycloak (`https://alpid.alpinux.org`) :
|
||||
|
||||
1. **Clients** → **Créer un client**
|
||||
2. **Client ID** : le client ID choisi pour cette app
|
||||
2. **Client ID** : `dynamic-alpinux`
|
||||
3. **Client authentication** : activé (pour obtenir un `client_secret`)
|
||||
4. **Valid redirect URIs** : `https://dynamic.alpinux.org/auth/callback`
|
||||
5. **Web origins** : `https://dynamic.alpinux.org`
|
||||
|
|
@ -93,10 +93,8 @@ Dans la console d'administration Keycloak (`https://alpid.alpinux.org`) :
|
|||
|
||||
### 6. Installer le service systemd
|
||||
|
||||
Les fichiers de configuration systemd et Apache sont conservés **hors dépôt** (`infra/` local).
|
||||
|
||||
```bash
|
||||
sudo cp infra/dynamic/dynamic.alpinux.org.service \
|
||||
sudo cp /home/alpinux/site/scripts/dynamic.alpinux.org.service \
|
||||
/etc/systemd/system/dynamic-alpinux.service
|
||||
sudo systemctl daemon-reload
|
||||
sudo systemctl enable --now dynamic-alpinux
|
||||
|
|
@ -106,9 +104,11 @@ sudo systemctl status dynamic-alpinux
|
|||
### 7. Configurer Apache
|
||||
|
||||
```bash
|
||||
# Activer les modules nécessaires
|
||||
sudo a2enmod proxy proxy_http headers ssl
|
||||
|
||||
sudo cp infra/dynamic/dynamic.alpinux.org.vhost.conf \
|
||||
# Copier le vhost
|
||||
sudo cp /home/alpinux/site/scripts/dynamic.alpinux.org.vhost.conf \
|
||||
/etc/apache2/sites-available/dynamic.alpinux.org.conf
|
||||
sudo a2ensite dynamic.alpinux.org
|
||||
sudo apachectl configtest
|
||||
|
|
@ -126,8 +126,8 @@ sudo certbot --apache -d dynamic.alpinux.org
|
|||
## Mise à jour
|
||||
|
||||
```bash
|
||||
ssh <user>@alpinux.org
|
||||
cd $APP_DIR
|
||||
ssh alpinux@alpinux.org
|
||||
cd /home/alpinux/site
|
||||
git pull
|
||||
cd dynamic
|
||||
venv/bin/pip install -r requirements.txt # si requirements.txt a changé
|
||||
|
|
@ -145,6 +145,8 @@ sudo systemctl restart dynamic-alpinux
|
|||
| Redémarrer | `sudo systemctl restart dynamic-alpinux` |
|
||||
| État | `sudo systemctl status dynamic-alpinux` |
|
||||
| Logs en direct | `sudo journalctl -u dynamic-alpinux -f` |
|
||||
| Logs accès | `tail -f /var/log/dynamic-alpinux/access.log` |
|
||||
| Logs erreurs | `tail -f /var/log/dynamic-alpinux/error.log` |
|
||||
|
||||
---
|
||||
|
||||
|
|
@ -29,7 +29,7 @@ Dépôt local serveur
|
|||
│
|
||||
│ mkdocs build --strict
|
||||
▼
|
||||
DocumentRoot Apache (wiki.alpinux.org)
|
||||
/var/www/clients/client1/web2/web/wiki-static/
|
||||
│
|
||||
│ Apache
|
||||
▼
|
||||
|
|
@ -62,10 +62,14 @@ sudo apt install chromium
|
|||
|
||||
```bash
|
||||
git clone https://gitea.alpinux.org/alpinux.cedrica5l/alpinux.site.2026.git \
|
||||
$WIKI_DIR
|
||||
/home/alpinux/wiki
|
||||
```
|
||||
|
||||
- Le `site_dir` dans `wiki/mkdocs.yml` pointe vers le DocumentRoot Apache configuré dans ISPConfig.
|
||||
- Le `site_dir` dans `mkdocs.yml` pointe vers le bon DocumentRoot Apache :
|
||||
|
||||
```yaml
|
||||
site_dir: /var/www/clients/client1/web2/web/wiki-static
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
|
|
@ -74,13 +78,13 @@ git clone https://gitea.alpinux.org/alpinux.cedrica5l/alpinux.site.2026.git \
|
|||
### 1. Se connecter au serveur
|
||||
|
||||
```bash
|
||||
ssh <user>@alpinux.org
|
||||
ssh alpinux@alpinux.org
|
||||
```
|
||||
|
||||
### 2. Récupérer les dernières modifications
|
||||
|
||||
```bash
|
||||
cd $WIKI_DIR
|
||||
cd /home/alpinux/wiki
|
||||
git pull
|
||||
```
|
||||
|
||||
|
|
@ -91,7 +95,6 @@ Vérifiez que la commande affiche bien les fichiers modifiés. Si elle affiche `
|
|||
Le logo PNG n'est pas dans git — il est généré depuis le SVG source :
|
||||
|
||||
```bash
|
||||
cd $WIKI_DIR/wiki
|
||||
python3 scripts/build-assets.py
|
||||
```
|
||||
|
||||
|
|
@ -107,7 +110,6 @@ Cette commande produit :
|
|||
### 4. Lancer le build MkDocs
|
||||
|
||||
```bash
|
||||
cd $WIKI_DIR/wiki
|
||||
mkdocs build --strict
|
||||
```
|
||||
|
||||
|
|
@ -121,7 +123,7 @@ INFO - Cleaning site directory
|
|||
INFO - Documentation built in X.XX seconds
|
||||
```
|
||||
|
||||
Le DocumentRoot Apache est maintenant mis à jour. **Pas besoin de redémarrer Apache**.
|
||||
Le dossier `site_dir` est maintenant mis à jour. Apache sert immédiatement les nouveaux fichiers — **pas besoin de redémarrer Apache**.
|
||||
|
||||
### 5. Vérifier en ligne
|
||||
|
||||
|
|
@ -131,20 +133,19 @@ Ouvrez [https://wiki.alpinux.org](https://wiki.alpinux.org) et vérifiez que la
|
|||
|
||||
## Automatiser avec un script
|
||||
|
||||
Pour éviter d'oublier une étape, créez un script de déploiement sur le serveur :
|
||||
Pour éviter d'oublier une étape, créez un script `/home/alpinux/deploy-wiki.sh` :
|
||||
|
||||
```bash
|
||||
#!/bin/bash
|
||||
set -e
|
||||
|
||||
WIKI_DIR="<chemin vers le dépôt sur le serveur>/wiki"
|
||||
WIKI_DIR="/home/alpinux/wiki"
|
||||
|
||||
echo "==> Récupération des modifications..."
|
||||
cd "$WIKI_DIR/.."
|
||||
cd "$WIKI_DIR"
|
||||
git pull
|
||||
|
||||
echo "==> Génération du logo..."
|
||||
cd "$WIKI_DIR"
|
||||
python3 scripts/build-assets.py
|
||||
|
||||
echo "==> Build MkDocs..."
|
||||
|
|
@ -153,6 +154,18 @@ mkdocs build --strict
|
|||
echo "==> Déployé avec succès sur https://wiki.alpinux.org"
|
||||
```
|
||||
|
||||
Rendez-le exécutable :
|
||||
|
||||
```bash
|
||||
chmod +x /home/alpinux/deploy-wiki.sh
|
||||
```
|
||||
|
||||
Utilisation :
|
||||
|
||||
```bash
|
||||
/home/alpinux/deploy-wiki.sh
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Automatiser avec un hook Gitea (optionnel)
|
||||
|
|
@ -173,8 +186,8 @@ Créez `/etc/webhook/hooks.json` :
|
|||
[
|
||||
{
|
||||
"id": "deploy-wiki",
|
||||
"execute-command": "<chemin du script de déploiement>",
|
||||
"command-working-directory": "<chemin du dépôt>",
|
||||
"execute-command": "/home/alpinux/deploy-wiki.sh",
|
||||
"command-working-directory": "/home/alpinux/wiki",
|
||||
"response-message": "Déploiement lancé"
|
||||
}
|
||||
]
|
||||
|
|
@ -186,10 +199,12 @@ Démarrez le service :
|
|||
sudo systemctl enable --now webhook
|
||||
```
|
||||
|
||||
Le webhook écoute par défaut sur le port `9000`.
|
||||
|
||||
### Côté Gitea : configurer le webhook
|
||||
|
||||
1. Allez dans le dépôt sur Gitea → **Paramètres** → **Webhooks** → **Ajouter un webhook**.
|
||||
2. **URL** : `http://<serveur>:<port>/hooks/deploy-wiki`
|
||||
2. **URL** : `http://alpinux.org:9000/hooks/deploy-wiki`
|
||||
3. **Type de déclencheur** : *Push* (ou *Pull Request merging*)
|
||||
4. Cliquez sur **Ajouter le webhook**.
|
||||
|
||||
|
|
@ -230,3 +245,4 @@ Ouvrez [http://localhost:8000](http://localhost:8000) — MkDocs recharge automa
|
|||
| Générer le logo PNG (si SVG modifié) | `python3 scripts/build-assets.py` |
|
||||
| Construire et déployer | `mkdocs build --strict` |
|
||||
| Tester en local | `mkdocs serve` |
|
||||
| Déployer via script (tout en un) | `/home/alpinux/deploy-wiki.sh` |
|
||||
|
|
@ -4,12 +4,12 @@
|
|||
SECRET_KEY=changez-moi-avec-une-valeur-aleatoire-longue
|
||||
|
||||
# AlpID / OIDC (obtenir les valeurs dans la console Keycloak)
|
||||
ALPID_CLIENT_ID=<client-id-configuré-dans-keycloak>
|
||||
ALPID_CLIENT_ID=dynamic-alpinux
|
||||
ALPID_CLIENT_SECRET=
|
||||
ALPID_DISCOVERY_URL=https://alpid.alpinux.org/realms/alpinux/.well-known/openid-configuration
|
||||
|
||||
# Base de données SQLite
|
||||
DATABASE=<chemin absolu vers scores.db>
|
||||
DATABASE=/var/lib/dynamic-alpinux/scores.db
|
||||
|
||||
# Mode debug (mettre à 0 en production)
|
||||
FLASK_DEBUG=0
|
||||
|
|
|
|||
|
|
@ -1,26 +0,0 @@
|
|||
# feedback.alpinux.org
|
||||
|
||||
Formulaire de retours et suggestions pour l'association Alpinux.
|
||||
|
||||
## Statut
|
||||
|
||||
À construire. Ce sous-domaine n'est pas encore développé.
|
||||
|
||||
## Idées
|
||||
|
||||
- Formulaire simple (Flask ou statique) pour collecter les retours des participants aux événements
|
||||
- Intégration AlpID optionnelle (retours anonymes possibles)
|
||||
- Stockage SQLite ou envoi par e-mail vers une liste de l'association
|
||||
|
||||
## Structure prévue
|
||||
|
||||
```
|
||||
feedback/
|
||||
├── app.py # Flask app (à créer)
|
||||
├── templates/
|
||||
├── static/
|
||||
├── requirements.txt
|
||||
├── .env.example
|
||||
├── feedback.alpinux.org.vhost.conf
|
||||
└── feedback.alpinux.org.service
|
||||
```
|
||||
|
|
@ -1,16 +0,0 @@
|
|||
# portail.alpinux.org
|
||||
|
||||
Portail membres de l'association Alpinux.
|
||||
|
||||
## Statut
|
||||
|
||||
Géré directement via **ISPConfig** sur le serveur. Le contenu de ce sous-domaine (Nextcloud, Dolibarr ou autre outil collaboratif) est installé et configuré côté serveur et n'est pas versioné dans ce dépôt.
|
||||
|
||||
## Accès
|
||||
|
||||
- URL : https://portail.alpinux.org
|
||||
- Authentification : AlpID (SSO Keycloak — https://alpid.alpinux.org)
|
||||
|
||||
## Notes
|
||||
|
||||
Ce dossier est un espace réservé. Si un développement spécifique au portail est nécessaire (thème, plugin, scripts de déploiement), il sera ajouté ici.
|
||||
24
scripts/alpinux-admin.service
Normal file
24
scripts/alpinux-admin.service
Normal file
|
|
@ -0,0 +1,24 @@
|
|||
# Systemd unit pour l'app d'administration Alpinux
|
||||
# Copier dans /etc/systemd/system/alpinux-admin.service
|
||||
# puis : sudo systemctl enable --now alpinux-admin
|
||||
|
||||
[Unit]
|
||||
Description=Alpinux Admin — interface de déploiement (Flask + Gunicorn)
|
||||
After=network.target
|
||||
|
||||
[Service]
|
||||
User=alpinux
|
||||
Group=alpinux
|
||||
WorkingDirectory=/home/alpinux/site/admin
|
||||
EnvironmentFile=/etc/alpinux-admin/config.env
|
||||
ExecStart=/home/alpinux/site/admin/venv/bin/gunicorn \
|
||||
--workers 1 \
|
||||
--bind 127.0.0.1:5002 \
|
||||
--access-logfile /var/log/alpinux-admin/access.log \
|
||||
--error-logfile /var/log/alpinux-admin/error.log \
|
||||
app:app
|
||||
Restart=on-failure
|
||||
RestartSec=5
|
||||
|
||||
[Install]
|
||||
WantedBy=multi-user.target
|
||||
67
scripts/alpinux.org.vhost.conf
Normal file
67
scripts/alpinux.org.vhost.conf
Normal file
|
|
@ -0,0 +1,67 @@
|
|||
# Apache vhost pour alpinux.org (page d'accueil)
|
||||
# À créer via ISPConfig : Sites > Ajouter un site web
|
||||
# Domaine : alpinux.org + www.alpinux.org | DocumentRoot : /var/www/clients/client1/web1/web
|
||||
#
|
||||
# Ce vhost gère également la migration SEO depuis l'ancienne infra (DokuWiki)
|
||||
# vers la nouvelle (wiki.alpinux.org + alpinux.org)
|
||||
|
||||
<VirtualHost *:80>
|
||||
ServerName alpinux.org
|
||||
ServerAlias www.alpinux.org
|
||||
Redirect permanent / https://alpinux.org/
|
||||
</VirtualHost>
|
||||
|
||||
<VirtualHost *:443>
|
||||
ServerName alpinux.org
|
||||
ServerAlias www.alpinux.org
|
||||
DocumentRoot /var/www/clients/client1/web1/web
|
||||
|
||||
# ── Redirections www → sans-www ─────────────────────────────────
|
||||
RewriteEngine On
|
||||
RewriteCond %{HTTP_HOST} ^www\.alpinux\.org$ [NC]
|
||||
RewriteRule ^ https://alpinux.org%{REQUEST_URI} [R=301,L]
|
||||
|
||||
# ── Migration SEO : anciennes URLs DokuWiki ──────────────────────
|
||||
# L'ancien wiki tournait sur DokuWiki avec des URLs de type :
|
||||
# /doku.php?id=namespace:page
|
||||
# /wiki/doku.php?id=namespace:page
|
||||
#
|
||||
# Les deux-points (:) sont encodés %3A dans les query strings.
|
||||
# On redirige vers wiki.alpinux.org avec des URLs propres.
|
||||
|
||||
# /doku.php?id=start → wiki.alpinux.org/
|
||||
RewriteCond %{QUERY_STRING} ^id=start$ [NC]
|
||||
RewriteRule ^/doku\.php$ https://wiki.alpinux.org/ [R=301,L]
|
||||
|
||||
# /doku.php?id=alpinux:start → wiki.alpinux.org/alpinux/
|
||||
RewriteCond %{QUERY_STRING} ^id=alpinux(%3A|:)start$ [NC]
|
||||
RewriteRule ^/doku\.php$ https://wiki.alpinux.org/alpinux/ [R=301,L]
|
||||
|
||||
# /doku.php?id=namespace:page → wiki.alpinux.org/namespace/page/
|
||||
# Capture générique : transforme les ":" en "/" dans le chemin
|
||||
RewriteCond %{QUERY_STRING} ^id=([a-z0-9_-]+)(%3A|:)([a-z0-9_-]+)$ [NC]
|
||||
RewriteRule ^/doku\.php$ https://wiki.alpinux.org/%1/%3/ [R=301,L,NE]
|
||||
|
||||
# /doku.php?id=page (namespace racine) → wiki.alpinux.org/page/
|
||||
RewriteCond %{QUERY_STRING} ^id=([a-z0-9_-]+)$ [NC]
|
||||
RewriteRule ^/doku\.php$ https://wiki.alpinux.org/%1/ [R=301,L,NE]
|
||||
|
||||
# /wiki/* → wiki.alpinux.org/* (si l'ancien wiki était monté en sous-répertoire)
|
||||
RewriteRule ^/wiki/(.*)$ https://wiki.alpinux.org/$1 [R=301,L]
|
||||
|
||||
# ── Fichiers statiques ───────────────────────────────────────────
|
||||
<Directory /var/www/clients/client1/web1/web>
|
||||
Options -Indexes +FollowSymLinks
|
||||
AllowOverride None
|
||||
Require all granted
|
||||
DirectoryIndex index.html
|
||||
</Directory>
|
||||
|
||||
# Logs
|
||||
ErrorLog /var/log/apache2/alpinux.org-error.log
|
||||
CustomLog /var/log/apache2/alpinux.org-access.log combined
|
||||
|
||||
SSLEngine on
|
||||
SSLCertificateFile /etc/letsencrypt/live/alpinux.org/fullchain.pem
|
||||
SSLCertificateKeyFile /etc/letsencrypt/live/alpinux.org/privkey.pem
|
||||
</VirtualHost>
|
||||
24
scripts/dynamic.alpinux.org.service
Normal file
24
scripts/dynamic.alpinux.org.service
Normal file
|
|
@ -0,0 +1,24 @@
|
|||
# Systemd unit pour l'app Flask dynamic.alpinux.org
|
||||
# Copier dans /etc/systemd/system/dynamic-alpinux.service
|
||||
# puis : sudo systemctl enable --now dynamic-alpinux
|
||||
|
||||
[Unit]
|
||||
Description=Alpinux Dynamic — Quiz interactifs (Flask + Gunicorn)
|
||||
After=network.target
|
||||
|
||||
[Service]
|
||||
User=alpinux
|
||||
Group=alpinux
|
||||
WorkingDirectory=/home/alpinux/dynamic
|
||||
EnvironmentFile=/etc/dynamic-alpinux/config.env
|
||||
ExecStart=/home/alpinux/dynamic/venv/bin/gunicorn \
|
||||
--workers 2 \
|
||||
--bind 127.0.0.1:5001 \
|
||||
--access-logfile /var/log/dynamic-alpinux/access.log \
|
||||
--error-logfile /var/log/dynamic-alpinux/error.log \
|
||||
app:app
|
||||
Restart=on-failure
|
||||
RestartSec=5
|
||||
|
||||
[Install]
|
||||
WantedBy=multi-user.target
|
||||
33
scripts/dynamic.alpinux.org.vhost.conf
Normal file
33
scripts/dynamic.alpinux.org.vhost.conf
Normal file
|
|
@ -0,0 +1,33 @@
|
|||
# Apache vhost pour dynamic.alpinux.org
|
||||
# L'app Flask tourne derrière Gunicorn sur 127.0.0.1:5001
|
||||
|
||||
<VirtualHost *:80>
|
||||
ServerName dynamic.alpinux.org
|
||||
Redirect permanent / https://dynamic.alpinux.org/
|
||||
</VirtualHost>
|
||||
|
||||
<VirtualHost *:443>
|
||||
ServerName dynamic.alpinux.org
|
||||
|
||||
# ── Proxy vers Gunicorn ──────────────────────────────────────
|
||||
ProxyPreserveHost On
|
||||
ProxyPass / http://127.0.0.1:5001/
|
||||
ProxyPassReverse / http://127.0.0.1:5001/
|
||||
|
||||
# En-têtes transmis à Flask
|
||||
RequestHeader set X-Forwarded-Proto "https"
|
||||
RequestHeader set X-Forwarded-For "%{REMOTE_ADDR}s"
|
||||
|
||||
# ── Sécurité ─────────────────────────────────────────────────
|
||||
Header always set X-Content-Type-Options "nosniff"
|
||||
Header always set X-Frame-Options "SAMEORIGIN"
|
||||
Header always set Referrer-Policy "strict-origin-when-cross-origin"
|
||||
|
||||
# ── Logs ─────────────────────────────────────────────────────
|
||||
ErrorLog /var/log/apache2/dynamic.alpinux.org-error.log
|
||||
CustomLog /var/log/apache2/dynamic.alpinux.org-access.log combined
|
||||
|
||||
SSLEngine on
|
||||
SSLCertificateFile /etc/letsencrypt/live/dynamic.alpinux.org/fullchain.pem
|
||||
SSLCertificateKeyFile /etc/letsencrypt/live/dynamic.alpinux.org/privkey.pem
|
||||
</VirtualHost>
|
||||
10
scripts/portail.alpinux.org.admin.conf
Normal file
10
scripts/portail.alpinux.org.admin.conf
Normal file
|
|
@ -0,0 +1,10 @@
|
|||
# Bloc à ajouter dans le VirtualHost HTTPS de portail.alpinux.org
|
||||
# (dans ISPConfig : Sites > portail.alpinux.org > Directives Apache personnalisées)
|
||||
#
|
||||
# L'app admin Flask tourne sur Gunicorn à 127.0.0.1:5002
|
||||
|
||||
# ── Admin Alpinux : /admin/ → Gunicorn port 5002 ────────────────
|
||||
ProxyPass /admin/ http://127.0.0.1:5002/
|
||||
ProxyPassReverse /admin/ http://127.0.0.1:5002/
|
||||
RequestHeader set X-Forwarded-Proto "https"
|
||||
RequestHeader set X-Script-Name "/admin"
|
||||
37
scripts/static.alpinux.org.vhost.conf
Normal file
37
scripts/static.alpinux.org.vhost.conf
Normal file
|
|
@ -0,0 +1,37 @@
|
|||
# Apache vhost pour static.alpinux.org
|
||||
# À créer via ISPConfig : Sites > Ajouter un site web
|
||||
# Domaine : static.alpinux.org | DocumentRoot : /var/www/clients/clientX/webY/web
|
||||
# Activer SSL Let's Encrypt dans ISPConfig
|
||||
#
|
||||
# Ou, si créé manuellement, coller ce fichier dans /etc/apache2/sites-enabled/
|
||||
|
||||
<VirtualHost *:80>
|
||||
ServerName static.alpinux.org
|
||||
Redirect permanent / https://static.alpinux.org/
|
||||
</VirtualHost>
|
||||
|
||||
<VirtualHost *:443>
|
||||
ServerName static.alpinux.org
|
||||
DocumentRoot /var/www/clients/client1/web-static/web
|
||||
|
||||
# En-têtes CORS — permet au wiki et à la page d'accueil de charger les assets
|
||||
Header always set Access-Control-Allow-Origin "*"
|
||||
Header always set Cache-Control "public, max-age=31536000, immutable"
|
||||
|
||||
# Pas d'exécution PHP
|
||||
php_admin_flag engine Off
|
||||
|
||||
<Directory /var/www/clients/client1/web-static/web>
|
||||
Options -Indexes +FollowSymLinks
|
||||
AllowOverride None
|
||||
Require all granted
|
||||
</Directory>
|
||||
|
||||
# Logs
|
||||
ErrorLog /var/log/apache2/static.alpinux.org-error.log
|
||||
CustomLog /var/log/apache2/static.alpinux.org-access.log combined
|
||||
|
||||
SSLEngine on
|
||||
SSLCertificateFile /etc/letsencrypt/live/static.alpinux.org/fullchain.pem
|
||||
SSLCertificateKeyFile /etc/letsencrypt/live/static.alpinux.org/privkey.pem
|
||||
</VirtualHost>
|
||||
66
scripts/wiki.alpinux.org.vhost.conf
Normal file
66
scripts/wiki.alpinux.org.vhost.conf
Normal file
|
|
@ -0,0 +1,66 @@
|
|||
# Apache vhost pour wiki.alpinux.org
|
||||
# À créer via ISPConfig : Sites > Ajouter un site web
|
||||
# Domaine : wiki.alpinux.org | DocumentRoot : /var/www/clients/client1/web2/web/wiki-static
|
||||
#
|
||||
# Ce vhost sert le wiki MkDocs (statique) et gère la migration SEO
|
||||
# depuis l'éventuelle ancienne structure DokuWiki sur ce sous-domaine.
|
||||
|
||||
<VirtualHost *:80>
|
||||
ServerName wiki.alpinux.org
|
||||
Redirect permanent / https://wiki.alpinux.org/
|
||||
</VirtualHost>
|
||||
|
||||
<VirtualHost *:443>
|
||||
ServerName wiki.alpinux.org
|
||||
DocumentRoot /var/www/clients/client1/web2/web/wiki-static
|
||||
|
||||
RewriteEngine On
|
||||
|
||||
# ── Migration SEO : anciennes URLs DokuWiki sur ce sous-domaine ──
|
||||
# Si l'ancien DokuWiki était hébergé ici avant la migration MkDocs
|
||||
|
||||
# /doku.php?id=start → /
|
||||
RewriteCond %{QUERY_STRING} ^id=start$ [NC]
|
||||
RewriteRule ^/doku\.php$ https://wiki.alpinux.org/ [R=301,L]
|
||||
|
||||
# /doku.php?id=alpinux:start → /alpinux/
|
||||
RewriteCond %{QUERY_STRING} ^id=alpinux(%3A|:)start$ [NC]
|
||||
RewriteRule ^/doku\.php$ https://wiki.alpinux.org/alpinux/ [R=301,L]
|
||||
|
||||
# /doku.php?id=namespace:page → /namespace/page/
|
||||
RewriteCond %{QUERY_STRING} ^id=([a-z0-9_-]+)(%3A|:)([a-z0-9_-]+)$ [NC]
|
||||
RewriteRule ^/doku\.php$ https://wiki.alpinux.org/%1/%3/ [R=301,L,NE]
|
||||
|
||||
# /doku.php?id=page → /page/
|
||||
RewriteCond %{QUERY_STRING} ^id=([a-z0-9_-]+)$ [NC]
|
||||
RewriteRule ^/doku\.php$ https://wiki.alpinux.org/%1/ [R=301,L,NE]
|
||||
|
||||
# URLs sans slash final → avec slash (cohérence MkDocs)
|
||||
RewriteCond %{REQUEST_FILENAME} !-f
|
||||
RewriteCond %{REQUEST_URI} !/$
|
||||
RewriteRule ^(.+)$ $1/ [R=301,L]
|
||||
|
||||
# ── Fichiers statiques MkDocs ────────────────────────────────────
|
||||
<Directory /var/www/clients/client1/web2/web/wiki-static>
|
||||
Options -Indexes +FollowSymLinks
|
||||
AllowOverride None
|
||||
Require all granted
|
||||
DirectoryIndex index.html
|
||||
# Cache long pour les assets versionnés MkDocs
|
||||
<FilesMatch "\.(css|js|woff2?|png|svg|ico)$">
|
||||
Header set Cache-Control "public, max-age=31536000, immutable"
|
||||
</FilesMatch>
|
||||
# Pas de cache sur le HTML (contenu mis à jour)
|
||||
<FilesMatch "\.html$">
|
||||
Header set Cache-Control "public, max-age=3600"
|
||||
</FilesMatch>
|
||||
</Directory>
|
||||
|
||||
# Logs
|
||||
ErrorLog /var/log/apache2/wiki.alpinux.org-error.log
|
||||
CustomLog /var/log/apache2/wiki.alpinux.org-access.log combined
|
||||
|
||||
SSLEngine on
|
||||
SSLCertificateFile /etc/letsencrypt/live/wiki.alpinux.org/fullchain.pem
|
||||
SSLCertificateKeyFile /etc/letsencrypt/live/wiki.alpinux.org/privkey.pem
|
||||
</VirtualHost>
|
||||
|
|
@ -1,26 +0,0 @@
|
|||
# static.alpinux.org
|
||||
|
||||
CDN pour les fichiers binaires et assets statiques de l'association : logos, favicons, images Open Graph.
|
||||
|
||||
## Contenu hébergé
|
||||
|
||||
| Fichier | Usage |
|
||||
|---------|-------|
|
||||
| `logo/alpinux-logo-512.png` | Logo 512 px — page d'accueil alpinux.org, balises OG |
|
||||
| `logo/alpinux-logo-192.png` | Logo 192 px — PWA / Android home screen |
|
||||
| `logo/favicon-32.png` | Favicon 32 px |
|
||||
| `logo/favicon-16.png` | Favicon 16 px |
|
||||
| `logo/favicon.ico` | Favicon ICO multi-taille |
|
||||
|
||||
Ces fichiers sont **générés** par `wiki/scripts/build-assets.py` (à partir du SVG source `wiki/docs/assets/alpinux-logo.svg`) et **copiés manuellement** sur le serveur dans le répertoire web de static.alpinux.org. Ils ne sont pas versionés dans ce dépôt.
|
||||
|
||||
## Déploiement Apache
|
||||
|
||||
Configurer le VirtualHost avec le fichier `static.alpinux.org.vhost.conf` présent dans ce dossier.
|
||||
|
||||
```bash
|
||||
# Sur le serveur, dans ISPConfig ou directement :
|
||||
sudo cp static.alpinux.org.vhost.conf /etc/apache2/sites-available/
|
||||
sudo a2ensite static.alpinux.org
|
||||
sudo systemctl reload apache2
|
||||
```
|
||||
Loading…
Reference in a new issue