Après l'excellent article des Arsouyes sur l'installation de Matomo, je me suis intéressé à l'utilisation de Matomo.

Pourquoi ?

Le respect de la vie privée bien sûr !

Je ne vais pas trop m'attarder sur ce qu'est Matomo et toutes ses fonctionnalités : ce type d'outil permet de se rassurer et d'avoir rapidement les informations souhaitées avec des métrics disponibles immédiatement ( Nombre de visite, Nombre de page vues, etc ) pour son site web.

Je me décide alors à suivre l'article et là, le drame :

Divulgâchage : Aujourd’hui, on vous montre comment l’installer (à l’ancienne).....

Désolé mais je ne peux pas ! Un container ou rien pour moi 😂

Bien évidement une installation manuelle, directement sur votre serveur et sans container, est complètement envisageable. Mais j'aime cloisonner mes processus et les isoler afin de faciliter - à minima - les interventions sur chaque logiciel.

Réalisons donc cette installation mais avec Docker pour la partie conteneurisation et Traefik comme reverse-proxy.

Quickstart 🚀

Comme d'habitude, l'intégralité des configurations sont présentes sur github :

lfache/awesome-traefik
Welcome to Awesome Traefik, a collection of contributions around Traefik. - lfache/awesome-traefik

Tout le nécessaire pour l'installation de Matomo se trouve dans le dossier du même nom.

Dans un premier temps, nous devons avoir une installation de Traefik fonctionnelle. Si ce n'est pas le cas, récupérez les fichiers du dépôt afin de lancer votre reverse-proxy :

$ git clone https://github.com/lfache/awesome-traefik/

Ensuite allez dans le dossier correspondant à Traefik :

$ cd awesome-traefik/traefik

Vous devez modifier la configuration de Traefik afin de la faire correspondre à vos informations :

Variable Fichier à modifier Example
email traefik.yaml foo.bar@mydomain.com

Une fois modifiée, vous pourrez lancer votre instance :

docker-compose up -d

Maintenant, occupons-nous de Matomo :

cd ../matomo

Modifiez les variables d'environnements en générant vos propres mots de passe, ils se trouvent à la racine du dossier :

.mysql.env
.matomo.env

Voici les variables à modifier :

Variable Fichier à modifier Example
MYSQL_PASSWORD .mysql.env MYPASSWORD
MYSQL_DATABASE .mysql.env MYDATABASE
MYSQL_USER .mysql.env MYUSER
MATOMO_DATABASE_USERNAME .matomo.env MYUSER
MATOMO_DATABASE_PASSWORD .matomo.env MYPASSWORD
MATOMO_DATABASE_DBNAME .matomo.env MYDATABASE

Ensuite, pour lancer votre instance Matomo, rien de plus simple. Lancez votre stack en précisant l'URL d'accès de votre instance :

  • MATOMO_URL : l'URL de votre installation de Matomo

Par exemple :

MATOMO_URL=matomo.mydomain.com \
docker-compose up -d

🚩 Attention de prendre le temps de lire la partie Work in pogress et sécurité, l'image de Matomo "Apache" manque de quelques configurations et de sécurité 🚩

Quelques explications 🤔

Un rapide tour sur le Docker Hub permet de trouver une image officielle :

https://hub.docker.com/_/matomo

Et même un fichier d'exemple pour docker-compose :

matomo-org/docker
Official Docker project for Matomo Analytics. Contribute to matomo-org/docker development by creating an account on GitHub.

Il est juste donc nécessaire d'ajouter les éléments liés à l'utilisation de Traefik.

Rien de spécifique ici. Cette déclaration est tout à fait classique.

L'image Matomo utilise des variables d'environnement pour configurer les informations de la base de données.

Vous pouvez utiliser des secrets pour stocker ces informations mais ils seront dans ce cas à saisir manuellement lors de l'installation de Matomo.

Cette installation reste donc relativement très simple ... Si on ne rentre pas dans le détail 😂

Work in progress 🏗️

Après la première configuration du dashboard, et vos premières visites, vous allez remarquer que la localisation par Geo IP ne fonctionne pas.

Vous pouvez utiliser cette librairie disponible ici :

Free IP Geolocation Database Downloads | DB-IP Lite
The free IP geolocation database downloads are updated monthly. They are available in CSV and MMDB format and distributed under the Creative Commons Attribution License. Learn more about these database downloads here along with our other databases and Lite editions.

Et utiliser un volume pour pouvoir mettre à jour la base facilement :

volumes:
      - matomo:/var/www/html
      - DBIP-City.mmdb:/var/www/html/misc/DBIP-City.mmdb

Sécurité

Enfin il faut avouer que niveau sécurité, on peut mieux faire :

  • Le Dashboard est accessible pour tout le monde,
  • ServerTokens en Full et ServerSignature sur On.
Aïeeeeeee

Commençons par le plus simple, ServerTokens et ServerSignature.

Vous pouvez directement modifier la configuration en live sur votre container :

docker exec -it matomo_app_1 sed -i 's/ServerTokens\ Full/ServerTokens\ Prod/g' \
/etc/apache2/conf-enabled/security.conf
docker exec -it matomo_app_1 sed -i 's/ServerSignature\ On/ServerSignature\ Off/g' \
/etc/apache2/conf-enabled/security.conf

Validez les modifications :

docker exec -it matomo_app_1 cat /etc/apache2/conf-enabled/security.conf

Si les modifications sont correctes :

docker exec -it matomo_app_1 /usr/sbin/apache2ctl -k restart

Il est bien sûr possible d'utiliser un volume pour gérer le fichier et ne pas refaire les modifications à chaque redémarrage :

volumes:
      - matomo:/var/www/html
      - DBIP-City.mmdb:/var/www/html/misc/DBIP-City.mmdb
      - security.conf:/etc/apache2/conf-available/security.conf

Enfin l'accès à notre dashboard. Vous pouvez restreindre cet accès de plusieurs manières :

  • Autorisation par IP,
  • Par identifiant/mot de passe.

Je vais choisir la restriction par IP. Il faut savoir que tout le dossier de Matomo ne doit pas être bloqué, sinon le javascript présent sur votre site ne va pas se charger ...

Il faut donc faire des exclusions à notre blocage. Cette solution est trop complexe pour la réaliser directement avec Traefik.  Je vais utiliser la méthode du bon vieux temps : le fichier .htaccess !

C'est plutôt simple en réalité, on trouve même une bonne partie de la réponse sur le forum Matomo :

<Files "*">
        # Allow localhost IPv4 IPv6
        Require ip 127.0.0.1 ::1
        # Allow HTTP API // cf forum Matomo 
        Require ip 0.0.0.0
        # Allow admin IP
        Require ip X.X.X.X
</Files>

# Allow public access to basic Matomo files
<FilesMatch "(^piwik\.(php|js)|^matomo\.(php|js)|^container_.*\.js|robots\.txt|optOut.js)">
        Require all granted
</FilesMatch>

Sauf que... nous sommes derrière un reverse proxy. L'IP présentée à Apache est donc celle de Traefik, et non celle du client lui même !

Il va falloir récupérer l'en-tête X-Forwarded-For :

Le champ d'en-tête HTTP X-Forwarded-For est une méthode courante pour identifier l'adresse IP d'origine d'un client se connectant à un serveur Web via un proxy HTTP ou un équilibreur de charge

Pour cela je vais utiliser le module remoteip d'Apache :

docker exec -it matomo_app_1 a2enmod remoteip

Enfin il faut lui ajouter une petite configuration :

docker exec -it matomo_app_1 echo "RemoteIPHeader X-Forwarded-For" >> /etc/apache2/conf-available/remoteip.conf
docker exec -it matomo_app_1 echo "RemoteIPTrustedProxy 172.0.0.0/8 127.0.0.1 ::1" >> /etc/apache2/conf-available/remoteip.conf 

RemoteIPTrustedProxy 172.0.0.0/8 : C'est le range possible des IP de mes containers Docker. On pourrait pousser plus loin la sécurité et définir uniquement l'IP de Traefik. Mais sans fixer cette adresse, on prend le risque qu'elle change au prochain re-démarrage.

Ne reste plus qu'à activer ma configuration :

docker exec -it matomo_app_1 a2enconf remoteip

Et relancez apache :

docker exec -it matomo_app_1 /usr/sbin/apache2ctl -k restart

Comme précédemment, il serait judicieux d'utiliser deux volumes pour :

  • Charger le module remoteip,
  • La configuration du module.

Enfin il est possible de pousser encore un peu plus loin ... Oui désolé il reste un header  X-Powered-By.... 🚪 Vous pouvez utiliser l'exemple présent dans le dossier Wordpress du dépôt !

Voila, il ne vous reste plus qu'à découvrir l'utilisation de Matomo !  


Nous venons donc de voir ensemble comment Dockerizer Matomo. Et en plus cela nous a permis d’approfondir nos connaissances dans l'utilisation d'un reverse proxy !

Vous avez maintenant le choix pour l'utilisation d'un outil de Web Analytics qui respectent la vie privée de vos visiteurs !

Une nouvelle fois, je vous présente ici une façon de réaliser cette installation mais ce n'est bien évidemment pas la solution unique !

Plus globalement, j'ai fini par me demander : On peut faire sans outil de web analytics sinon ?

Oui, sans aucun doute. Mon utilisation de l'outil reste très basique et sommaire. Je pourrais sûrement trouver mon bonheur avec un analyseur de logs voire même utiliser Kibana ou Grafana pour faire de l'analyse en temps réel.  Prochaine étape pour moi? Probablement...

En tout cas  n'hésitez pas à m'apporter des remarques ou des commentaires sur Twitter  ou via les commentaires 👇 ! C'est toujours un plaisir d'avoir des retours ! 😇