alpinux-static/app/CHANGELOG.md
Alpinux d4fe8614c2 feat(cache): IP→ASN cache PostgreSQL + fix deploy venv permissions
- psycopg2-binary ajouté aux dépendances
- Cache ip-api.com dans table ip_asn_cache (PostgreSQL, TTL 30 j)
- ThreadedConnectionPool partagé par worker, schéma auto-créé au démarrage
- Graceful degradation si DATABASE_URL absent
- deploy-app.sh : pip tourne sous static-cdn (sudo -u) pour respecter les droits

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-06 13:39:14 +02:00

5.9 KiB
Raw Blame History

Changelog — Alpinux Static

[1.6.1] — 2026-05-06

Modifié

  • Cache IP→ASN migré de la mémoire process vers PostgreSQL (ip_asn_cache) — TTL 30 jours, partagé entre tous les workers gunicorn, pas de lock SQLite
  • Pool de connexions ThreadedConnectionPool (13 conns par worker), schéma créé automatiquement au premier démarrage
  • Graceful degradation : si DATABASE_URL absent ou PostgreSQL indisponible, l'app appelle ip-api.com sans cache

[1.6.0] — 2026-05-06

Ajouté

  • Erreurs 404 : clic sur 🔨 affiche l'AS de l'IP (via ip-api.com) avec le nom, le pays et le nombre de préfixes IPv4
  • Bannir l'IP seule ou bannir tout l'AS d'un coup (tous ses préfixes CIDR via RIPE Stat, cache 30 jours)
  • Erreurs 404 : les IPs déjà bannies dans fail2ban (global-blacklist) sont masquées de la liste et du détail

Modifié

  • fail2ban ignoreip : ton IP publique (82.65.88.34) protégée sur toutes les jails
  • Sudoers static-cdn : ajout de la permission fail2ban-client status global-blacklist

[1.5.2] — 2026-05-06

Ajouté

  • Erreurs 404 : champ de recherche dynamique — filtre les lignes par chemin ou adresse IP à chaque frappe, avec compteur de résultats

[1.5.1] — 2026-05-06

Corrigé

  • Ignorer une IP : /opt/static-cdn/ appartenait à abonnelc alors que le service tourne sous static-cdn — écriture de ignored_ips.json silencieusement impossible ; corrigé par chown -R static-cdn + script de déploiement mis à jour
  • Ignorer une IP : invalidation du cache multi-worker gunicorn basée sur le mtime de ignored_ips.json (chaque worker re-parse dès que le fichier change)
  • Bannir une IP : règle sudoers créée pour static-cdn (compte de service réel, pas abonnelc) avec chemins absolus /usr/bin/sudo et /usr/bin/fail2ban-client

[1.5.0] — 2026-05-06

Ajouté

  • Onglet Erreurs dans la navigation : analyse des logs Apache des 7 derniers jours (fichiers .gz inclus)
  • Tableau des erreurs 404 trié par fréquence, avec badge statut coloré (✗ actif / ✓ résolu) cliquable
  • Détail par chemin (AJAX) : liste des IPs avec compteur, dernière date, referers
  • Ignorer une IP (devs, tests, IPs internes) — persisté dans ignored_ips.json, cache invalidé
  • Bannir une IP directement depuis l'interface via fail2ban-client set global-blacklist banip
  • Section des IPs ignorées avec suppression individuelle

[1.4.2] — 2026-05-06

Corrigé

  • Statistiques : la page affichait une erreur de génération alors qu'ISPConfig génère déjà le rapport GoAccess chaque nuit — STATS_FILE pointe maintenant directement sur le fichier ISPConfig

[1.4.1] — 2026-05-06

Corrigé

  • Changelog : TypeError au rendu — clé items du dict en conflit avec la méthode Python dict.items() en Jinja2 (renommée entries)
  • Sélecteur de largeur : boutons L et ∞ sans effet — max-width:none + margin:auto sur flex child rétrécissait <main> ; remplacé par data-cw sur <html> + sélecteurs CSS d'attribut

[1.4.0] — 2026-05-06

Ajouté

  • Sélecteur de largeur du contenu dans le header : Étroit (900 px), Normal (1 200 px), Large (1 600 px), Plein — préférence mémorisée dans le navigateur
  • Changelog avec numéro de version sémantique, accessible depuis le footer

Corrigé

  • Décalage de largeur entre les pages dû à l'apparition/disparition de la scrollbar (scrollbar-gutter: stable)
  • Labels EXIF non traduits : ResolutionUnit, XResolution, YResolution
  • Valeur numérique brute pour ColorSpace → libellé lisible (sRGB, Adobe RGB, Non calibré)

Modifié

  • Contenu principal en pleine largeur (suppression du max-width fixe sur <main>)

[1.3.0] — 2026-05-06

Ajouté

  • Prévisualisation des fichiers depuis la corbeille (propriétés, métadonnées, téléchargement)
  • Footer sur toutes les pages avec liens de navigation et numéro de version
  • Stats corbeille dans le tableau de bord (nombre de fichiers, taille totale, date du plus ancien)

Modifié

  • Header compact : avatar initiale + prénom + icône déconnexion (suppression du bouton texte)
  • Suppression du lien « Tableau de bord » dans la navigation (doublon avec le logo)
  • user, humansize, trash_count centralisés dans le context processor Flask (disponibles sur toutes les pages)

[1.2.0] — 2026-05-06

Ajouté

  • Corbeille : mise à la corbeille depuis /browse, restauration avec gestion des conflits (écraser / renommer), suppression définitive
  • Purge automatique des éléments en corbeille depuis plus de 30 jours
  • Badge dans la navigation indiquant le nombre d'éléments en corbeille
  • Page /trash avec tableau partagé (mode browse / trash) et bouton « Vider la corbeille »

[1.1.0] — 2026-05-06

Ajouté

  • Redimensionnement d'images depuis la prévisualisation : tailles prédéfinies, dimension libre, formats PNG/JPG/ICO
  • Gestion des conflits lors du redimensionnement (backup, écraser, renommer, ignorer)
  • Renommage de fichiers inline dans /browse et la page de prévisualisation
  • Affichage des métadonnées image (dimensions, format, mode couleur, DPI, EXIF)
  • Dimension libre avec contrainte de proportions (mode « carré »)

Corrigé

  • Échec du redimensionnement sur les fichiers ICO en mode palette (conversion RGBA avant LANCZOS)
  • Aucune sélection de taille ou format → copie à l'identique (comportement par défaut)

[1.0.0] — 2026-05-03

Ajouté

  • Upload de fichiers par glisser-déposer avec gestion des conflits (écraser, backup, renommer, ignorer)
  • Parcourir les assets CDN depuis /browse avec fil d'Ariane
  • Statistiques de consultation via GoAccess (/stats), générées à la demande
  • Authentification SSO via AlpID (Keycloak / OpenID Connect)
  • Recherche dans les fichiers
  • Scripts rsync push-assets.sh et pull-assets.sh pour la synchronisation locale ↔ serveur
  • Script deploy-app.sh pour le déploiement de l'application Flask