Version 2.2 par Mélodie le 2026/05/07 13:02

Afficher les derniers auteurs
1 = Compteur de téléchargements Python =
2
3 == Objectif ==
4
5 Mettre en place un compteur automatique de téléchargements pour les fichiers ISO hébergés sur ##downloads.linuxvillage.org##, avec :
6
7 * parsing quotidien des logs Apache
8 * dédoublonnage par IP + fichier + jour (pour éviter les faux multiples liés aux requêtes HTTP 206 des téléchargements repris)
9 * cumul des compteurs mois par mois dans un fichier JSON
10 * génération automatique d'une page publique listant les ISOs disponibles
11 * génération automatique d'une page de statistiques mensuelles privée
12
13 == Prérequis ==
14
15 * Python 3 installé (##/usr/bin/python3##)
16 * Accès root au serveur
17 * Logs Apache disponibles sous ##/var/log/apache2/downloads-ssl-access.log*##
18 * Paquet ##cron## installé : ##apt install cron##
19
20 == Installation du script ==
21
22 Créer le répertoire et y déposer le script (pièce jointe à cette page, à renommer sans le ##.txt## final) :
23
24 {{code language="bash"}}
25 mkdir -p /opt/download_stats
26 # déposer download_stats.py dans ce répertoire
27 chmod 750 /opt/download_stats/download_stats.py
28 {{/code}}
29
30 == Structure du répertoire .stats ==
31
32 Le script crée et gère automatiquement le répertoire caché ##.stats## à la racine de l'espace de téléchargements :
33
34 {{code language="bash"}}
35 mkdir /var/www/file-server/.stats
36 {{/code}}
37
38 Ce répertoire contiendra :
39
40 * ##counts.json## — historique cumulatif des compteurs mensuels
41 * ##index.html## — page de statistiques privée
42
43 La page de statistiques est accessible à l'URL :
44 ##https:~/~/downloads.linuxvillage.org/.stats/##
45
46 Cette URL est accessible mais n'est pas référencée publiquement.
47
48 == Configuration du cron ==
49
50 En tant que root :
51
52 {{code language="bash"}}
53 crontab -e
54 {{/code}}
55
56 Ajouter la ligne suivante (exécution quotidienne à 01h00 UTC) :
57
58 {{code language="bash"}}
59 0 1 * * * /usr/bin/python3 /opt/download_stats/download_stats.py
60 {{/code}}
61
62 == Remise à zéro du JSON ==
63
64 En cas de besoin (changement de structure, réinitialisation des compteurs) :
65
66 {{code language="bash"}}
67 echo '{}' > /var/www/file-server/.stats/counts.json
68 /usr/bin/python3 /opt/download_stats/download_stats.py
69 {{/code}}
70
71 == Pages générées ==
72
73 Le script génère deux pages HTML à chaque exécution :
74
75 ; Page publique
76 : ##/var/www/file-server/index.html## — liste les ISOs présents avec leur taille, leur date de mise en ligne, et les liens vers les sommes de contrôle (.md5, .sha512). Le contenu est détecté automatiquement par scan du répertoire.
77
78 ; Page de statistiques (privée)
79 : ##/var/www/file-server/.stats/index.html## — tableau des téléchargements mois par mois, avec total par fichier et total général.
80
81 == Logique du script ==
82
83 ; Parsing des logs
84 : Le script parcourt tous les fichiers ##downloads-ssl-access.log*## (y compris les fichiers gzippés issus de la rotation). Seules les requêtes GET et HEAD sur les fichiers ##.iso## avec code HTTP 200 ou 206 sont retenues.
85
86 ; Dédoublonnage
87 : Pour chaque ligne retenue, une clé ##(ip, fichier, jour)## est construite. Si cette clé a déjà été vue dans la même passe, la ligne est ignorée. Cela évite de compter plusieurs fois un téléchargement repris qui génère de multiples requêtes 206.
88
89 ; Structure JSON mensuelle
90 : Les compteurs sont stockés par fichier et par mois (##YYYY-MM##). À chaque exécution, le script fusionne les nouveaux compteurs avec l'historique en prenant le maximum entre les deux valeurs — ce qui préserve les données antérieures à la fenêtre de rétention des logs (14 jours) sans créer de double-comptage.
91
92 ; Scan du répertoire
93 : La liste des fichiers affichés sur les pages HTML est construite dynamiquement à chaque exécution. L'ajout d'une nouvelle version ISO ne nécessite aucune intervention manuelle.
94
95 == Pièce jointe ==
96
97 Le fichier ##download_stats.py.txt## joint à cette page est le script Python source.
98 À renommer en ##download_stats.py## après téléchargement, puis :
99
100 {{code language="bash"}}
101 chmod 750 /opt/download_stats/download_stats.py
102 {{/code}}

Langues / Languages

🇫🇷 Français | 🇬🇧 English