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 :
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 |
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
:
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 :
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.
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 ! 😇