Trois défauts vus en déployant la création de dossier en production.
Le rsync --delete emportait goaccess.html et goaccess.json, générés sur le
serveur chaque nuit — la même famille que #51 et #48, jamais refermée. Le
dry-run les montrait en suppression.
L'unit systemd était cherchée à ../../infra/services/, chemin relatif qui
visait org.alpinux.owni/infra quand le dépôt y vivait encore ; depuis le
déménagement il pointe dans le vide. Il passe par INFRA_DIR, surchargeable.
Surtout, cette copie d'unit et le redémarrage partageaient un bloc set -e :
l'unit introuvable a emporté le restart. Le script s'est arrêté après avoir
copié les fichiers, le service a continué de servir le code de juillet. Les
deux sont maintenant séparés — le restart a lieu même sans dépôt infra.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01KtgiPNG3inkbM8k7suMtjL
Le bouton « 📁 Nouveau dossier » ouvre une saisie en ligne à droite du fil
d'Ariane (Entrée valide, Échap annule) et crée le sous-dossier dans le
répertoire affiché.
Endpoint POST /mkdir, réservé aux admins : nom nettoyé par secure_filename,
refus des noms réservés ou cachés (app, scripts, .git…), des traversées de
chemin, et des dossiers déjà existants (409).
Le README porte aussi les chemins locaux remis à jour après le déménagement
du dépôt dans ~/Projects/alpinux.static.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01KtgiPNG3inkbM8k7suMtjL
#53 résumé req/IPs par statut dans Erreurs 404
#54 titre onglet avec compteur non résolus
#2 Tout/Aucun dans resize (tailles + formats)
#7 backup filename affiché dans résultats resize
#8 flash message résumé après upload
#6 renommage inline sur preview_text + preview_other
#23 filtre + tri par nom/taille/date dans corbeille
#20 sélection multiple + batch restore/delete corbeille
#45 /sitemap.xml (assets publics)
#52 ignoreip fail2ban sync sur Ignorer/Retirer une IP
#1 cairosvg>=2.7 dans requirements.txt
#51 ignored_ips.json exclu du rsync --delete
#48 as_cache/ exclu du rsync --delete
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Nouveau endpoint POST /errors/status-batch (jusqu'à 200 chemins)
- Au chargement de la page, tous les dots rouges sont vérifiés en batch
et passent automatiquement en vert si le fichier existe désormais
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- timeout fail2ban-client 5 s → 30 s (sous charge le résultat vide
était mis en cache 60 s, causant « Aucune IP bannie »)
- log explicite en cas d'erreur (returncode, stderr, exception)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
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>
- /errors/banned/ : bannissements groupés par AS (nom, pays, nb entrées)
- Déblocage IP seule ou AS entier via POST /errors/unban
- Filtre dynamique par IP/CIDR/nom AS, mise à jour DOM sans rechargement
- Nav header + sudoers unbanip
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Clic 🔨 : lookup AS via ip-api.com, propose 🔨 IP ou 🔨 AS (N préfixes)
- Ban AS : récupère les CIDRs via RIPE Stat, cache 30 j dans as_cache/
- IPs déjà bannies (global-blacklist) masquées du tableau et du détail AJAX
- ignoreip fail2ban : 82.65.88.34 protégée sur toutes les jails
- Sudoers : permission status global-blacklist pour static-cdn
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Champ de filtre en temps réel au-dessus du tableau des 404 ;
ferme le panneau de détail des lignes masquées.
Corrige aussi rsync via sudo pour préserver les droits static-cdn.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Invalidation du cache 404 basée sur mtime de ignored_ips.json (tous les workers gunicorn voient la mise à jour)
- Chemins complets /usr/bin/sudo et /usr/bin/fail2ban-client pour éviter les erreurs PATH dans systemd
- Version 1.5.1
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Fichier VERSION (1.4.0) lu par l'app au démarrage
- CHANGELOG.md versionné (v1.0.0 → v1.4.0)
- Route /changelog avec parsing du markdown et rendu structuré
- Lien cliquable sur le numéro de version dans le footer
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>