Ich habe bereits schon hier eine Anleitung geschrieben, wie ihr Matomo (ehemals Piwik) normal „von Hand“ installieren könnt. Nun zeige ich euch, wie ihr dies in wenigen Minuten mit Docker realisiert. Traefik dient uns hier als Reverse Proxy und stellt später den Dienst verschlüsselt per TLS bereit.
Datum | Änderungen |
---|---|
01.04.2020 | Erstellung dieser Anleitung |
29.05.2023 | Anpassung an neue Traefik Anleitung, Kapitel 5, 6, 7 hinzugefügt |
Als Grundlage meiner Anleitung dient die offizielle Matomo Anleitung für Docker.
0. Grundvoraussetzung
- Docker & Docker Compose v2 (Debian / Ubuntu)
- TRAEFIK V2 + 3 – REVERSE-PROXY MIT CROWDSEC IM STACK EINRICHTEN
1. Ordner anlegen
Zuerst legen wir uns passende Ordner-Strukturen an.
mkdir -p /opt/containers/matomo/{database,app}
2. Docker Compose anlegen
Nun legen wir die eigentliche Docker Datei an. Hierfür habe ich mir die offizielle Matomo Compose genommen und diese abgeändert für Traefik.
nano /opt/containers/matomo/docker-compose.yml
Inhalt
version: '3' services: matomo-db: image: mariadb command: --max-allowed-packet=64MB restart: unless-stopped volumes: - ./database:/var/lib/mysql environment: - MYSQL_RANDOM_ROOT_PASSWORD= '1' - MYSQL_PASSWORD=abc ## Hier Passwort eingeben ## - MYSQL_DATABASE=matomo - MYSQL_USER=matomo networks: - default matomo-app: image: matomo:fpm-alpine restart: unless-stopped volumes: - ./app:/var/www/html environment: - MATOMO_DATABASE_HOST=matomo-db - MATOMO_DATABASE_ADAPTER=mysql - MATOMO_DATABASE_TABLES_PREFIX=matomo_ - MATOMO_DATABASE_USERNAME=matomo - MATOMO_DATABASE_PASSWORD=abc ## Hier selbes Passwort eingeben ## - MATOMO_DATABASE_DBNAME=matomo networks: - default matomo-web: image: nginx:alpine restart: unless-stopped volumes: - ./app:/var/www/html:ro - ./matomo.conf:/etc/nginx/conf.d/default.conf:ro labels: - "traefik.enable=true" - "traefik.http.routers.matomo.entrypoints=websecure" - "traefik.http.routers.matomo.rule=Host(`matomo.euredomain.de`)" - "traefik.http.routers.matomo.tls=true" - "traefik.http.routers.matomo.tls.certresolver=http_resolver" - "traefik.http.routers.matomo.service=matomo" - "traefik.http.services.matomo.loadbalancer.server.port=80" - "traefik.docker.network=proxy" - "traefik.http.routers.matomo.middlewares=default@file" networks: - default - proxy networks: proxy: external: true
Notwendige Anpassungen:
- MySQL User Kennwort ändern
- eure Domain bei Traefik anpassen („matomo.euredomain.de“)
3. matomo.conf anlegen
In diesem Schritt müssen wir noch eine Konfigurationsdatei für den Webserver innerhalb des Containers anlegen. Diese Datei kommt direkt vom Hersteller.
nano /opt/containers/matomo/matomo.conf
Inhalt
upstream php-handler { server matomo-app:9000; } server { listen 80; add_header Referrer-Policy origin; # make sure outgoing links don't show the URL to the Matomo instance root /var/www/html; # replace with path to your matomo instance index index.php; try_files $uri $uri/ =404; ## only allow accessing the following php files location ~ ^/(index|matomo|piwik|js/index|plugins/HeatmapSessionRecording/configs).php { # regex to split $uri to $fastcgi_script_name and $fastcgi_path fastcgi_split_path_info ^(.+\.php)(/.+)$; # Check that the PHP script exists before passing it try_files $fastcgi_script_name =404; include fastcgi_params; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; fastcgi_param PATH_INFO $fastcgi_path_info; fastcgi_param HTTP_PROXY ""; # prohibit httpoxy: https://httpoxy.org/ fastcgi_pass php-handler; } ## deny access to all other .php files location ~* ^.+\.php$ { deny all; return 403; } ## disable all access to the following directories location ~ /(config|tmp|core|lang) { deny all; return 403; # replace with 404 to not show these directories exist } location ~ /\.ht { deny all; return 403; } location ~ js/container_.*_preview\.js$ { expires off; add_header Cache-Control 'private, no-cache, no-store'; } location ~ \.(gif|ico|jpg|png|svg|js|css|htm|html|mp3|mp4|wav|ogg|avi|ttf|eot|woff|woff2|json)$ { allow all; ## Cache images,CSS,JS and webfonts for an hour ## Increasing the duration may improve the load-time, but may cause old files to show after an Matomo upgrade expires 1h; add_header Pragma public; add_header Cache-Control "public"; } location ~ /(libs|vendor|plugins|misc/user) { deny all; return 403; } ## properly display textfiles in root directory location ~/(.*\.md|LEGALNOTICE|LICENSE) { default_type text/plain; } }
4. Matomo starten
Den Server startet ihr wie gewohnt mit folgendem Befehl:
docker compose -f /opt/containers/matomo/docker-compose.yml up -d
Nun solltet ihr folgendes sehen:
5. Matomo einrichten
Hier sollte nun alles “grün” bei euch sein. Scrollt anschließend ganz nach unten und klickt weiter.
Nun wird die Datenbank eingerichtet. Hier sollten alle Werte bereits vorausgefüllt sein. Ihr müsst also einfach nur weiter klicken.
Wenn alles geklappt hat, solltet ihr diese Meldung erhalten.
Gebt jetzt die Daten eures Administrators ein.
Nun könnt ihr noch einen Namen eurer Webseite vergeben, welche später “überwacht” werden soll. Diese Angaben könnt ihr aber später jederzeit wieder einsehen und verändern.
Jetzt seht ihr den Tracking Code für diese Webseite. Diesen müsst ihr jetzt aber nicht speichern. Ihr könnt ihn euch später jederzeit anzeigen lassen und noch anpassen.
Jetzt seid ihr schon durch mit der Einrichtung.
6. Matomo Tracking ohne Cookies
Ich habe bereits eine Anleitung geschrieben, welche beschreibt, wie ihr Matomo ohne Cookies, also DSGVO konform, nutzen könnt. Diese findet ihr hier.
7. Matomo Intergration in WordPress
Matomo könnt ihr innerhalb weniger Minuten in WordPress integrieren. Wie genau das funktioniert erfahrt ihr hier.
8. Quellen
https://github.com/matomo-org/docker
https://hub.docker.com/_/matomo/
https://github.com/matomo-org/docker/blob/master/.examples/nginx/docker-compose.yml
Docker: Matomo startet:
Ich erhalte bei “3. Datenbank einrichten” die Fehlermeldung:
Fehler beim Verbindungsaufbau zur Datenbank: SQLSTATE[HY000] [2002] php_network_getaddresses: getaddrinfo failed: Name does not resolve
Passwörter stimmen überein (nur Zahlen und Buchstaben, keine Sonderzeichen verwendet. Die Angaben mit docker-compose stimmen überein.
Hat jemand eine Idee?
Hallo Christian,
wenn ich versuche, beim Login das PW zu reseten/neu anzufordern kommt es zu einem Timeout.
matomo-web_1 | 2021/08/10 14:02:19 [error] 26#26: *1 upstream timed out (110: Operation timed out) while reading response header from upstream, client: 172.19.0.2, server: , request: “POST /index.php HTTP/1.1”, upstream: “fastcgi://172.21.0.3:9000”, host: “matomo.xyz.de”, referrer: “https://matomo.xyz.de/”
Wie kreise ich das Problem ein?
MfG
ChrisR
awesome, thanks! 🙂
Das Passwort sollte kein / enthalten. Sonnst gibt es Zugriffsprobleme zur Datenbank.