Toujours plus libre De jolies statistiques avec GoAccess

, par Christophe Bresso

Dans votre désir d’indépendance vis-à-vis des majors, vous avez envie de vous passer des "Google Analytics" et autres "Xiti". Vous voulez tout de même savoir ce qui ce passe sur votre site. Eh bien c’est possible avec GoAccess.

GoAccess est un logiciel libre qui vous permet de suivre en temps réel la fréquentation de votre site.

Il vous propose de multiples panneaux qui vont du nombre unique de visiteurs par jour à la géolocalisation en passant par la distribution des visites au cours de la journée et tout plein d’autres choses encore (voir ici). Il est en anglais mais ça reste compréhensible.

Installation

L’installation se fait à partir des sources du logiciel. Il est possible de le faire à partir d’un dépôt mais dans ce cas, vous ne pourrez pas géo-localiser vos visiteurs.

# Commencez par installer les dépendances
sudo apt-get install libncursesw5-dev libmaxminddb-dev
# Puis vous téléchargez l'archive
wget http://tar.goaccess.io/goaccess-1.2.tar.gz
# Pour la décompresser
tar -xzvf goaccess-1.2.tar.gz
cd goaccess-1.2/
./configure --enable-utf8 --enable-geoip=mmdb
make
make install

Configuration

# nano /usr/local/etc/goaccess.conf

time-format %H:%M:%S
date-format %d/%b/%Y
log-format %h %^ [%d:%t %^] "%r" %s %b %R %u

Liste des adresses IP à ne pas comptabiliser

Dans vos statistiques, vous ne voulez sûrement pas compter vos propres visites. Pour cela vous allez créer un fichier où sur chaque ligne vous indiquerez les adresses IP que GoAccess doit ignorer, par exemple celle de votre bureau, de votre maison...

nano /usr/local/etc/ip_exclues_goaccess.conf

127.0.0.1
123.45.67.89
98.76.54.321

La base de données des localisations des adresses IP

Afin de localiser vos visiteurs, vous allez vous appuyer sur la base de donnée libre de Maxmind.com.

Créez le répertoire et vous vous y déplacez :

sudo mkdir /usr/local/share/GeoIP
cd /usr/local/share/GeoIP

Téléchargez la base de donnée :

wget http://geolite.maxmind.com/download/geoip/database/GeoLite2-City.tar.gz

Téléchargez la somme md5 pour vérifier l’intégrité du fichier :

wget http://geolite.maxmind.com/download/geoip/database/GeoLite2-City.tar.gz.md5

Puis générez la somme md5

md5sum GeoLite2-City.tar.gz

Copiez le résultat puis ouvrez avec nano la somme que vous avez téléchargée :

sudo nano GeoLite2-City.tar.gz.md5

Sur la seconde ligne copiez le résultat et vérifiez qu’ils sont identiques. Si c’est le cas vous pouvez passer à l’étape suivante. Sinon, vous devez refaire le téléchargement de la base de donnée, votre fichier a été corrompu.

Vous décompressez l’archive dans le répertoire courant /usr/local/share/GeoIP

sudo tar -xzvf GeoLite2-City.tar.gz --strip=1

Et vous la supprimez :

rm  GeoLite2-City.tar.gz

Un petit script qui automatise tout ça :

sudo nano MajGeoIP.sh

#/bin/bash

cd /usr/local/share/GeoIP
rm md5sum.txt
rm  GeoLite2-City.tar.gz
rm GeoLite2-City.tar.gz.md5

wget http://geolite.maxmind.com/download/geoip/database/GeoLite2-City.tar.gz
wget http://geolite.maxmind.com/download/geoip/database/GeoLite2-City.tar.gz.md5

# Creation md5sum de la base de données GeoLite2.
md5sum < GeoLite2-City.tar.gz > md5sum.txt

# Un peu de nettoyage
sed -i 's/ .*//' md5sum.txt
sed -i 's/$/\d10/' GeoLite2-City.tar.gz.md5

file1="md5sum.txt"
file2="GeoLite2-City.tar.gz.md5"


# comparez!
if ! cmp --silent "$file1" "$file2"; then
mail -s "Resultats de la mise a jour de GeoLites" vous@monsupernom.fr <<< "md5sum for GeoLite2-City failed. Please check the md5sum. File may possibly be corrupted."
else
tar -xzvf GeoLite2-City.tar.gz --strip=1
mail -s "Resultats de la mise a jour de GeoLites" vous@monsupernom.fr <<< "Votre base de données GeoLite2-City a bien ete mise a jour."
fi

Vous enregistrez puis vous le rendez exécutable

chmod +x MajGeoIP.sh

Dans ce petit script, vous pouvez voir la nouvelle commande ’mail’. Elle fonctionnera si vous avez suivi les recommandations de cet article : Un serveur de messagerie et suivants. Ça peut aussi marcher plus simplement mais j’ai pas chercher.

Un petit tour dans le crontab pour rajouter la ligne qui va exécuter le script le premier mercredi de chaque mois à 4h00 du matin. Maxmind met à jour sa base de données libre le premier mardi de chaque mois.

sudo crontab -e

# Mise à jour de la base de données GeoLite2 de maxmind
0 04 1-7 * * [ "$(date '+\%a')" = "Wed" ] && /usr/local/share/GeoIP/MajGeoIP.sh

Générer les stats

Ben oui, c’est quand même l’objectif de l’article !

zcat -f /var/log/nginx/monsupernom.fr.access.log* | grep -v -f /usr/local/etc/ip_exclues_goaccess.conf | sudo goaccess -a  --geoip-database /usr/local/share/GeoIP/GeoLite2-City.mmdb --ignore-crawlers -o /var/www/html/monsupernom.fr/statistiques.html

Cette ligne de code ne doit pas vous effrayer. C’est ce que l’on appelle un pipe. Les barres verticales séparent les actions à effectuées et les tirets indiquent les options à appliquer à l’action. zcat va lire vos fichiers de log, grep va faire un tri dans ce que vient de lire zcat pour exclure les adresses IP que vous ne voulez pas prendre en compte et finalement goaccess va générer les statistiques, ici en ignorant les robots de recherche. Votre rapport est maintenant visible à http://monsupernom.fr/statistiques.html.

Et pour automatiser la tâche tous les matins à 02h50, vous allez écrire un petit script que vous lancerez ensuite avec le cron.

sudo nano /var/www/html/monsupernom/genererStats.sh

#!/bin/bash
zcat -f /var/log/nginx/monsupernom.fr.access.log* | grep -v -f /usr/local/etc/ip_exclues_goaccess.conf > /tmp/logStats
goaccess /tmp/logStats -a  --geoip-database /usr/local/share/GeoIP/GeoLite2-City.mmdb --ignore-crawlers --html-report-title='Rapport de stats pour monsupernom.fr' -o /var/www/html/monsupernom.fr/statistiques.html

Maintenant vous le rendez exécutable :

sudo chmod +x /var/www/html/monsupernom/genererStats.sh

Et vous le lancer à heure régulière avec le cron :

sudo crontab -e

# Env
SHELL=/bin/bash
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games
...
# Goaccess
50 02 * * *  /var/www/html/monsupernom/genererStats.sh

Pensez à bien rajouter ces deux variables d’environnement (SHELL et PATH) en début de votre fichier crontab. Comme vous avez enregistrer le fichier exécutable à la racine du site, vous allez ajouter une restriction d’accès dans votre fichier de configuration de Nginx.

sudo nano /etc/nginx/sites-available/monsupernom.fr

...
 location ~ \.sh$ {
    return 403;
 }

Et vous redémarrez Nginx

service nginx restart
Hop, ça c’est fait...

Évènements à venir

N'hésitez pas à vous inscrire

Mots-clés