Skip to content

Lâcher Analytics pour Piwik

Banner-piwik-docker

Pourquoi pas mettre en place Piwik en HTTPS sur Docker afin de remplacer le vilain Google Analytics et respecter nos visiteurs ? Pour cela nous allons utiliser Docker-compose pour composer un stack Nginx, MySQL et l’image officielle de Piwik.

Pour mettre en place du HTTPS gratuit, on va utiliser Let’s encrypt, pour cela je vous laisse générer vos certificats dans /etc/letsencrypt avec l’aide par exemple de ce tutoriel.

Une fois prêt, on va créer notre fichier docker-compose.yml afin d’orchestrer nos containers. On se place dans le répertoire /srv/piwik :

db:
  image: mysql
  volumes:
    - ./mysql/runtime:/var/lib/mysql
  environment:
    MYSQL_ROOT_PASSWORD: [email protected]
app:
  image: piwik
  links:
    - db
  volumes:
    - ./config:/var/www/html/config
    - ./ssmtp.conf:/etc/ssmtp/ssmtp.conf
    - ./revaliases:/etc/ssmtp/revaliases
web:
  image: nginx
  volumes:
    - ./nginx.conf:/etc/nginx/nginx.conf:ro
    - ./etc/letsencrypt:/etc/letsencrypt
  links:
    - app
  volumes_from:
    - app
  ports:
    - "8000:443"
cron:
  image: piwik
  links:
    - db
  volumes_from:
    - app
  entrypoint: |
    bash -c 'bash -s <<EOF
    trap "break;exit" SIGHUP SIGINT SIGTERM
    while /bin/true; do
      su -s "/bin/bash" -c "/usr/local/bin/php /var/www/html/console core:archive" www-data
      sleep 3600
    done
    EOF'

Pour expliquer rapidement, ce fichier va lancer 4 containers :

  • Une base MySQL avec un volume dans /srv/piwik/mysql/runtime/ qui contient la db de Piwik.
  • L’App Piwik, image officielle, liée à la db avec plusieurs volumes pour sa configuration.
  • Nginx, qui sera en HTTPS grâce aux volumes Let’s Encrypt et à sa configuration (nginx.conf) lié à l’Appli Piwik et exposé sur le port 8000 (j’y reviens).
  • Piwik Cron, qui lance une image Piwik qui effectue un cron toute les heures (pour indexer la base il me semble).

Cette configuration expose le port 443 de Nginx (HTTPS) sur le port 8000, ce qui me permet d’héberger piwik sur le même serveur que ce blog. Vous pouvez utiliser n’importe quel port élevé si vous avez déjà une application Web ou si vous dédiez un serveur à Piwik (ou une IP), utilisez les ports HTTP/S classiques (80/443).

On va maintenant préparer nos fichiers de configurations et nos certificats avant de pouvoir lancer enfin nos containers :

cd /srv/piwik
mkdir etc/
cp -r /etc/letsencrypt etc/

Vos certificats TLS sont maintenant accessibles par Docker (dans /srv/piwik), on va pouvoir ajouter la configuration de Nginx :

mkdir /srv/piwik/etc/nginx
vim /srv/piwik/etc/nginx/nginx.conf

Ajoutez y cette configuration, en remplaçant bien piwik.domain.com par votre nom de domaine :

worker_processes  1;
events {
    worker_connections  1024;
}
http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;
    gzip on;
    gzip_disable "msie6";  
    gzip_vary on;
    gzip_proxied any;
    gzip_comp_level 6;
    gzip_buffers 16 32k;
    gzip_min_length  256;
    gzip_http_version 1.1;
    gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript application/javascript;
    server {
      listen         80;
      server_name    piwi.domain.com;
      return         301 https://$server_name$request_uri;
    }
    server {
      listen 443 ssl http2;
      ssl_certificate /etc/letsencrypt/live-ecdsa/piwik.domain.com/chain.pem;
      ssl_certificate_key /etc/letsencrypt/live-ecdsa/piwik.domain.com/privkey-p384.pem;
      ssl_session_timeout 1d;
      ssl_session_cache shared:SSL:50m;
      ssl_session_tickets off;
      ssl_protocols TLSv1.2;
      ssl_ciphers 'ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!3DES:!MD5:!PSK';
      ssl_prefer_server_ciphers on;
      add_header Strict-Transport-Security max-age=15768000;
      ssl_stapling on;
      ssl_stapling_verify on;
      ssl_ecdh_curve secp384r1;
      resolver 8.8.8.8 8.8.4.4 valid=86400;
      root /var/www/html;
      index index.php;
      location / {
        try_files $uri $uri/ /index.php?$args;
      }
      location ~* \.(?:ico|css|js|gif|jpe?g|png)$ {
        expires 30d;
        add_header Pragma public;
        add_header Cache-Control "public";
      }
      location ~* ^.+\.(ogg|ogv|svg|svgz|eot|otf|woff|mp4|ttf|rss|atom|jpg|jpeg|gif|png|ico|zip|tgz|gz|rar|bz2|doc|xls|exe|ppt|tar|mid|midi|wav|bmp|rtf)$ {
        access_log off; log_not_found off; expires max;
      }
      location ~ [^/]\.php(/|$) {
        fastcgi_split_path_info ^(.+?\.php)(/.*)$;
        if (!-f $document_root$fastcgi_script_name) {
        	return 404;
        }
          root           /var/www/html;
          fastcgi_pass   app:9000;
          fastcgi_index  index.php;
          fastcgi_param SCRIPT_FILENAME /var/www/html$fastcgi_script_name;
          include        fastcgi_params;
      }    
    }
}

Et voilà, on va pouvoir lancer nos containers !

cd /srv/piwik
docker-compose up -d

Nos containers se lance en mode détachés, on peut utiliser docker-compose logs pour débugguer.

Vous pouvez vous rendre sur le port que vous avez attribué à Piwik (8000 dans ce cas) :

welcome_piwik

L’installation ne devrait pas poser de problèmes, utilisez le mot de passe MySQL définis dans le docker-compose.yml ainsi que le nom d’hôte « db » pour le serveur MySQL.
Une fois l’installation terminée, connectez-vous à Piwik et vous devriez avoir le message suivant :

nodata-piwik

Normal ! Vous n’avez pas ajouté le tracker Javascript sur votre site !
Pour cela, copiez le code que Piwik vous fournis plus bas dans la page et collez le dans le header ou le footer de votre site Web. Si vous êtes sur WordPress, utilisez l’éditeur de thème pour coller ce code dans le footer.php. Il existe également une extension WP-Piwik mais elle n’est pas nécessaire.

Après quelques visites, vous devriez avoir accès à vos statistiques :

piwik-datas

58958135

Published inDockerLinuxMonitoringTLSTutorielWebWeb server

6 Comments

  1. Ay,

    Sympa l’article ! Moi qui voulait bouger de Google Analytics pour mes PBN.

    Mais pourquoi ne pas utiliser le docker Let’s Encrypt pour générer automatiuement le certif’ (et le renouveler) ? 😉
    Docker-compose.yml

    • valentin valentin

      Oui t’a pas tord que c’est plus simple avec Docker. Merci pour le compose.yml !

  2. jb jb

    Bonjour,

    Je débute avec docker, et j’utilisais piwik précédemment installé classiquement. Aussi l’article m’a particulièrement intéressé.
    Je me posais deux questions philosophiques.

    Concernant,
    – ./nginx.conf:/etc/nginx/nginx.conf:ro
    – ./etc/letsencrypt:/etc/letsencrypt

    Pourquoi ne pas renseigner directement le dossier où se trouve le certificat (j’avais let’s encrypt d’installer en dehors de docker):
    /etc/letsencrypt/live/piwik/

    Et le fichier de configuration dans site-available comme c’est actuellement le cas pour moi sans docker?

    Concernant Let’s encrypt évoqué par Nicolas, il suffit de lié un autre conteneur à web.

    Bonne journée.

    • valentin valentin

      Bonjour JB,

      Tu peux bien sûr pointer les « Volumes » de ton container vers le dossier voulus.
      Pour ma part j’ai pris l’habitude d’utiliser un seul dossier pour toute ma conf afin de centraliser tout les fichiers.

      =)

      • jb jb

        Merci Valentin pour votre réponse.

        J’ai fait quelques modifications sur le fichier docker-compose.yml:
        – modification des volumes locaux
        – utilisation de mariadb
        – modification du cron. En effet, j’avais noté le problème suivant: https://github.com/indiehosters/piwik/issues/4

        Apparemment la modification suivante:
        entrypoint: ./config/cronScript
        Et peut-être le script, j’avais laissé celui proposé dans le depot piwik, pas celui de l’issue…
        On aboutit sur une erreur pour le conteneur *cron*:
        ERROR: for cron Container command ‘./config/cronScript’ could not be invoked.
        Traceback (most recent call last):
        File «  », line 3, in
        File « compose/cli/main.py », line 63, in main
        AttributeError: ‘ProjectError’ object has no attribute ‘msg’

        D’ailleurs, le fichier n’a pas les mêmes droits dans ./config:
        -rw-r–r– 1 www-data users 222 May 13 06:21 cronScript
        drwxr-xr-x 2 www-data 1000 4096 Dec 23 02:06 environment
        -rw-r–r– 1 www-data 1000 39258 Feb 4 07:10 global.ini.php
        -rw-r–r– 1 www-data 1000 3102 Nov 18 06:09 global.php
        -rw-r–r– 1 www-data 1000 693638 Feb 4 07:10 manifest.inc.php

        En tout cas, je poursuis la recherche.

        Ensuite se posera la question de l’accès par l’url configuré dans le nginx.conf. En effet, j’avais nginx d’installer sur le serveur hors docker. Est-ce que les configuration ne risquerai pas d’être en conflit?

        Bonne journée,,
        jB

        Ps: Au passage, je ne trouve pas cela terrible que l’on utilise le root pour se connecter à la base de donnée piwik, non? C’est bien un accès qui sera partagé avec d’autres applications utilisant mysql?

  3. Bonjour,

    merci pour ce tutoriel très utile.

    Après une mise à jour de Piwik 3.0.2 vers 3.0.4 depuis l’interface de Piwik, une simple mise à jour du container avec ~$ docker-compose pull ne marchera pas, il faut aussi modifier le docker-compose.yml en modifiant l’image « piwik » en « piwik:fpm » comme dans ce commit :

    https://github.com/indiehosters/piwik/commit/7803577ba2b9a1eec634c14aa196c79e086c8cec

    Si ça peut faire gagner un peu de temps à certains 🙂

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Proudly hosted with Open-sources Softwares.