alpinux-static/app/CHANGELOG.md
Alpinux 785a4639af v1.8.0 — Fusion pages Bannis et Erreurs en un seul onglet
La page /errors/ intègre désormais deux onglets (Erreurs 404 et Bannissements)
activés via hash URL (#errors / #banned). Le lien "Bannis" disparaît de la nav,
la route /errors/banned/ redirige vers /errors/#banned.

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

153 lines
6.8 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Changelog — Alpinux Static
## [1.8.0] — 2026-05-06
### Modifié
- Fusion des pages **Erreurs 404** et **Bannis** en une seule page avec deux onglets (URL `/errors/`)
- L'onglet actif est mémorisé dans le hash d'URL (`#errors` / `#banned`)
- Suppression du lien « Bannis » dans la navigation (accessible via l'onglet de la page Erreurs)
- Route `/errors/banned/` redirige vers `/errors/#banned`
---
## [1.7.0] — 2026-05-06
### Ajouté
- Page **Bannis** (`/errors/banned/`) : liste tous les bannissements fail2ban (`global-blacklist`) groupés par AS, avec nom de l'opérateur et pays
- Débloquer une IP/CIDR individuelle ou tout un AS d'un seul clic
- Filtre de recherche dynamique par IP, CIDR ou nom d'AS
- Mise à jour en temps réel des lignes après déblocage (pas de rechargement)
- Sudoers `static-cdn` : ajout de la permission `unbanip`
---
## [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