static.alpinux.org — CDN assets logos et favicons
Find a file
Alpinux 3e8b18b127 feat: dimension libre pour le redimensionnement d'images
Ajout d'un champ W×H dans la carte resize, contraint à la résolution
source. Option "carré" synchronise les deux valeurs. Le bouton Générer
s'active si au moins un format est sélectionné et une taille valide
(prédéfinie ou libre) est renseignée.

Supprime le code mort dans la route /resize (errors_pre).

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-06 10:03:48 +02:00
app feat: dimension libre pour le redimensionnement d'images 2026-05-06 10:03:48 +02:00
logo initial commit — migration depuis monorepo alpinux.site.2026 2026-05-03 17:48:11 +02:00
scripts feat: génération GoAccess à la demande + README complet 2026-05-03 20:39:25 +02:00
.env.example fix: supprime --delete, exclut wiki/ et fichiers ISPConfig 2026-05-03 18:22:45 +02:00
.gitignore feat: scripts push/pull rsync pour static.alpinux.org 2026-05-03 18:02:43 +02:00
favicon.ico initial commit — migration depuis monorepo alpinux.site.2026 2026-05-03 17:48:11 +02:00
README.md Ajouter référence au README principal de l'espace de travail 2026-05-03 21:00:07 +02:00

static.alpinux.org

CDN pour les fichiers binaires et assets statiques de l'association : logos, favicons, images Open Graph. Tableau de bord d'administration accessible sur https://static.alpinux.org (authentification AlpID).


Flux de publication

Il y a deux cibles distinctes sur le serveur, gérées par des scripts séparés :

Quoi Destination serveur Script Passe par git ?
Assets CDN (logo/, wiki/, stats/, error/…) /var/www/clients/client1/web17/web push-assets.sh Non — rsync direct
App Flask (app/) /opt/static-cdn/ + redémarrage service deploy-app.sh Non — rsync direct

Git sert à versionner et sauvegarder le code sur Gitea. Il n'est pas dans la boucle de déploiement : les scripts rsynchent depuis le dépôt local, pas depuis Gitea.

Modifier les assets CDN (logo, wiki, stats…)

# 1. Modifier les fichiers dans static/
# 2. Versionner (optionnel mais recommandé)
git add <fichiers>
git commit -m "..."
git push                        # sauvegarde sur gitea.alpinux.org

# 3. Pousser sur le serveur
./scripts/push-assets.sh        # aperçu + confirmation
./scripts/push-assets.sh -y     # sans confirmation

push-assets.sh exclut automatiquement app/, scripts/, .git/, .env, README.md. Il envoie : logo/, wiki/, stats/, error/, favicon.ico, robots.txt, standard_index.html.

Modifier l'app Flask (app/)

# 1. Modifier les fichiers dans static/app/
# 2. Versionner
git add app/
git commit -m "..."
git push                        # sauvegarde sur gitea.alpinux.org

# 3. Déployer sur le serveur
./scripts/deploy-app.sh         # rsync + pip install + restart service
./scripts/deploy-app.sh -n      # dry-run

deploy-app.sh rsync app/ vers /opt/static-cdn/, met à jour le venv Python, et redémarre le service systemd static-cdn.


Configuration locale (.env)

cp .env.example .env
Variable Obligatoire Description
STATIC_HOST oui Alias SSH ou nom d'hôte (alpinux.org)
STATIC_PATH oui Chemin absolu du web root sur le serveur
LOCAL_ASSETS_DIR oui Chemin absolu du dépôt local (static/)
STATIC_USER non Login SSH — laisser vide si ~/.ssh/config définit l'utilisateur

Si l'hôte est déclaré dans ~/.ssh/config (recommandé), laisser STATIC_USER vide. Sinon, renseigner STATIC_USER=<login> — les scripts construisent alors USER@HOST:PATH.


Scripts

# Synchroniser les assets CDN
./scripts/pull-assets.sh        # serveur → local (aperçu + confirmation)
./scripts/pull-assets.sh -y     # sans confirmation
./scripts/pull-assets.sh -n     # dry-run

./scripts/push-assets.sh        # local → serveur (aperçu + confirmation)
./scripts/push-assets.sh -y     # sans confirmation
./scripts/push-assets.sh -n     # dry-run

# Déployer l'app Flask
./scripts/deploy-app.sh         # déploie et redémarre le service
./scripts/deploy-app.sh -n      # dry-run

Tableau de bord Flask (app/)

Application Flask déployée sur le serveur via deploy-app.sh. Accessible sur https://static.alpinux.org (proxy Apache → 127.0.0.1:5003). Authentification SSO via AlpID (Keycloak).

Fonctionnalités

Route Description
/ Tableau de bord — statistiques CDN par dossier
/browse/ Navigateur de fichiers — aperçu, suppression, upload
/search Recherche par nom / contenu / date
/stats/ Rapport de trafic GoAccess

Upload de fichiers

Dans le navigateur (/browse/), une zone de dépôt est affichée en bas de chaque dossier. Elle accepte plusieurs fichiers à la fois (glisser-déposer ou sélection). Les chemins protégés (.git, app, scripts, etc.) sont refusés avec 403.

Pour limiter la taille des uploads, ajouter dans app/app.py :

app.config['MAX_CONTENT_LENGTH'] = 50 * 1024 * 1024  # 50 Mo

Variables d'environnement de l'app

Le fichier de référence est app/.env.example. Sur le serveur : /opt/static-cdn/.env.

Auth & Flask

Variable Obligatoire Description
SECRET_KEY oui Clé secrète Flask (chaîne aléatoire longue)
ALPID_CLIENT_ID oui Client Keycloak (static-cdn)
ALPID_CLIENT_SECRET oui Secret client Keycloak
ALPID_DISCOVERY_URL oui URL OIDC discovery AlpID
ADMIN_GROUPS non Groupes Keycloak autorisés (défaut : admins)
ADMIN_EMAILS non Fallback si le claim groups est absent du token
ASSETS_ROOT oui Racine du CDN (/var/www/clients/client1/web17/web en prod)

Stats GoAccess

Variable Description
STATS_FILE Rapport HTML GoAccess servi dans /stats/ (défaut : /opt/static-cdn/goaccess.html)
STATS_JSON Rapport JSON GoAccess pour les badges "Vues" (défaut : /opt/static-cdn/goaccess.json)
STATS_LOG_FILE Log Apache à analyser pour la génération à la demande
STATS_GENERATE_CMD Commande GoAccess complète — remplace la commande par défaut si renseigné

Première installation (nouveau serveur)

1. Créer le site dans ISPConfig

https://owni.alpinux.org:8080Sites → Ajouter un site web

  • Domaine : static.alpinux.org
  • Activer Let's Encrypt SSL
  • DocumentRoot : /var/www/clients/client1/web17/web

2. Configurer le proxy Apache

Dans ISPConfig → onglet Directives Apache SSL du site :

# CDN public → Apache sert directement depuis DocumentRoot
ProxyPass /logo/        !
ProxyPass /wiki/        !
ProxyPass /error/       !
ProxyPass /favicon.ico  !
ProxyPass /robots.txt   !

# Tableau de bord → Flask
RequestHeader set X-Forwarded-Proto "https"
ProxyPreserveHost On
ProxyPass        / http://127.0.0.1:5003/
ProxyPassReverse / http://127.0.0.1:5003/

3. Déployer l'app Flask

# Depuis la machine locale
./scripts/deploy-app.sh

# Sur le serveur — créer /opt/static-cdn/.env (voir app/.env.example)
ssh alpinux.org
nano /opt/static-cdn/.env

# Activer le service
sudo systemctl enable --now static-cdn

4. Pousser les assets CDN

./scripts/push-assets.sh -y

Voir aussi

Vue d'ensemble des projets, procédures de déploiement globales et accès :
~/Projects/org.alpinux.owni/README.md