Matomo è una piattaforma di analisi web, che consente di ottenere statistiche sui visitatori e sui contenuti dei nostri siti web.

Ciò che contraddistingue Matomo (ma anche altre piattaforme analoghe) dal grosso e facile Google Analytics, è il fatto che con il primo abbiamo il totale controllo e proprietà dei dati.

In questo articolo vediamo come fare self-hosting di Matomo, con un setup composto da:

Inoltre assumiamo di aver già un container con un progetto web attivo (es. Apache, Ghost, WordPress), configurato sotto reverse proxy; in particolare per questa guida consideriamo:

Cosa vogliamo

Supponiamo di avere un progetto web su miosito.boh. Noi vogliamo ficcare Matomo in un sottodominio stats.miosito.boh.

Per farlo abbiamo bisogno banalmente di:

  • Configurare un record DNS di tipo CNAME che renda il sottodominio un alias del dominio principale.
  • Installare Matomo ed esporlo su https://stats.miosito.boh.

Dopo aver creato quel record, passiamo al secondo punto.

Preparazione

Creiamo una cartella ~/matomo con dentro:

docker-compose.yml

version: "2"

services:
  matomo:
    container_name: matomo
    image: matomo
    ports:
      - 8080:80
    environment:
      - MATOMO_DATABASE_HOST=matomo_db
      - VIRTUAL_HOST=stats.miosito.boh
      - LETSENCRYPT_HOST=stats.miosito.boh
      - LETSENCRYPT_EMAIL=email@qualcosa.boh
    env_file:
      - ./db.env
    networks:
      - proxy
      - net
    depends_on:
      - matomo_db
    restart: unless-stopped

  matomo_db:
    container_name: matomo_db
    image: mariadb
    command: --max-allowed-packet=64MB
    environment:
      - MYSQL_ROOT_PASSWORD=inventa
    env_file:
      - ./db.env
    networks:
      - net
    restart: unless-stopped

networks:
  proxy:
    external:
      name: nginx-proxy
  net:
    driver: bridge

Cose notevoli:

  • Abbiamo attaccato matomo alla rete già esistente nginx-proxy, su cui gira anche il nostro progetto web.
  • Abbiamo definito una nuova rete net, in cui sono presenti sia matomo che matomo_db, ma non serve che quest'ultimo faccia parte di nginx-proxy.
  • Le variabili d'ambiente LETSENCRYPT_* servono per letsencrypt-nginx-proxy-companion.
  • Abbiamo definito una relazione di dipendenza (e quindi di ordine di partenza) tra i due container.

db.env

MYSQL_PASSWORD=inventa2
MYSQL_DATABASE=matomo
MYSQL_USER=matomo
MATOMO_DATABASE_ADAPTER=mysql
MATOMO_DATABASE_TABLES_PREFIX=matomo_
MATOMO_DATABASE_USERNAME=matomo
MATOMO_DATABASE_PASSWORD=
MATOMO_DATABASE_DBNAME=matomo

Appena siamo pronti docker-compose up -d

Verifichiamo che i nostri bei container siano in esecuzione con docker ps. Se tutto va bene andiamo avanti.

Notiamo che a questo punto dovremmo già avere un certificato SSL attivo e funzionante per il nostro sottodominio.

Installazione di Matomo

Dopo aver fatto partire il nostro stack, se andiamo su stats.miosito.boh saremo accolti dalla schermata di installazione di Matomo.

Ci basta andare avanti fino alla configurazione del DB, che sarà già compilata (grazie alle variabili d'ambiente MATOMO_*), tranne per la password del DB, che dovrà essere il valore di MYSQL_PASSWORD.

Dopo aver confermato, la connessione al DB dovrebbe funzionare e Matomo si installerà senza problemi.

Configurazione iniziale di Matomo

Prima di incollare il codice di tracciamento nel nostro sito, ci conviene configurare l'archiviazione dei report; se non facciamo questa piccola cosa sperimenteremo l'ebbrezza di un sito lentissimo e un downtime alto alto alto.

Cos'è l'archiviazione: è semplicemente Matomo che processa i dati raccolti e ce li rende visibili.

Di default l'archiviazione viene eseguita ogni tanto ed attivata dalle visite dei nostri utenti. Ciò significa che tra le richieste a stats.miosito.boh/matomo.php ce ne sarà qualcuna che dice "Hey Matomo, avvia l'archiviazione".

Ciò che vogliamo è disattivare questo comportamento e mettere il controllo nelle nostre mani, configurando un processo automatico che ogni tot esegue l'archiviazione.

Archiviazione dei report

Semplice:

  1. Accediamo a stats.miosito.boh con il SuperUser definito durante l'installazione;
  2. Andiamo nella sezione Sistema->Impostazioni generali;
  3. Impostiamo l'archiviazione attivata dal browser a No.

Ora dobbiamo configurare un qualcosa di automatico. Abbiamo un paio di strade:

  • Definire un container sidecar chiamato matomo_cron, con la stessa immagine di matomo ed eventualmente gli stessi volumi, con uno script entrypoint che essenzialmente fa due cose:
    • Dorme per tot secondi;
    • Esegue lo script di archiviazione.
  • Definire banalmente un cron job sul sistema host.

In questo articolo seguiamo la seconda strada, anche se un po' meno elegante.

Cron Job

Sul sistema host e con l'utente con cui normalmente gestiamo Docker ed eseguiamo mkdir -p $HOME/logs , poi crontab -e e incolliamo 'sta roba:

5 * * * * if [ $(docker inspect -f '{{.State.Running}}' matomo) ]; then docker exec -t matomo su -s "/bin/bash" -c "/usr/local/bin/php /var/www/html/console core:archive --url=https://stats.miosito.boh" www-data; fi >> $HOME/logs/matomo-archive.log

Dato che lo abbiamo definito con crontab -e, verrà eseguito dall'utente attuale, e i campi hanno (in ordine) questo significato: minuti, ore, giorni, mesi, giorni della settimana, comando.

Se spezzettiamo il nostro codice:

  • Viene eseguito ogni ora al minuto 05;
  • Se matomo è in esecuzione:
    • Esegue l'archiviazione per il sito, con l'utente (nel container) www-data;
  • Sputa l'output in ~/logs/matomo-archive.log.

La linea vuota finale è nelle specifiche di cron e la sua assenza può determinare il fallimento dello script.

Comunque consiglio di testare lo script subito e verificare che tutto sia ok.

Conclusioni

A questo punto possiamo incollare il codice di tracciamento nel sito, e goderci statistiche:

  • Fatte in casa;
  • Facilmente gestibili a livello di privacy;
  • Auto-aggiornanti ogni ora.

Se vogliamo fare i fighi, ci scarichiamo anche l'app mobile di Matomo e guardiamo le statistiche anche da lì.