Überarbeitet am 8. September 2026.
Matomo läuft bei mir schon lange als selbst gehostete Analytics-Lösung. Wenn Docker ohnehin auf dem Server vorhanden ist, lässt sich Matomo sehr angenehm zusammen mit einer eigenen MariaDB als Compose-Projekt betreiben.
Meine alte Anleitung verwendete noch Bitnami-Images, Docker Compose v1 und öffentlich gebundene Container-Ports. Heute orientiere ich mich lieber am offiziellen Matomo-Docker-Projekt und lasse HTTPS vom vorhandenen Nginx auf dem Host erledigen.
Wenn du Matomo lieber klassisch ohne Docker installieren möchtest, habe ich dafür ebenfalls eine Anleitung: Matomo Analytics installieren. Die Grundlagen der Compose-Datei erkläre ich unter Docker Compose erklärt.
1. Projektverzeichnis anlegen
sudo mkdir -p /opt/matomo
sudo chown $USER:$USER /opt/matomo
cd /opt/matomo
2. Passwörter in .env speichern
Zwei zufällige Passwörter lassen sich beispielsweise so erzeugen:
openssl rand -base64 24
openssl rand -base64 24
Danach erstelle ich:
nano /opt/matomo/.env
MARIADB_ROOT_PASSWORD=ERSTES_LANGES_PASSWORT
MARIADB_PASSWORD=ZWEITES_LANGES_PASSWORT
Die Datei sollte nicht für andere Benutzer lesbar sein:
chmod 600 /opt/matomo/.env
3. compose.yaml erstellen
Das aktuelle offizielle Matomo-Docker-Projekt verwendet ebenfalls einen Matomo-Container und MariaDB. Meine Variante ergänzt lediglich die lokale Portbindung für den Reverse Proxy:
services:
db:
image: mariadb:lts
restart: unless-stopped
command: --max-allowed-packet=64MB
environment:
MARIADB_AUTO_UPGRADE: "1"
MARIADB_DATABASE: matomo
MARIADB_USER: matomo
MARIADB_PASSWORD: "${MARIADB_PASSWORD}"
MARIADB_ROOT_PASSWORD: "${MARIADB_ROOT_PASSWORD}"
volumes:
- db_data:/var/lib/mysql
app:
image: matomo
restart: unless-stopped
depends_on:
- db
environment:
MATOMO_DATABASE_ADAPTER: mysql
MATOMO_DATABASE_HOST: db
MATOMO_DATABASE_DBNAME: matomo
MATOMO_DATABASE_USERNAME: matomo
MATOMO_DATABASE_PASSWORD: "${MARIADB_PASSWORD}"
MATOMO_DATABASE_TABLES_PREFIX: matomo_
volumes:
- matomo_data:/var/www/html
ports:
- "127.0.0.1:8087:80"
volumes:
db_data:
matomo_data:
Die Datenbank besitzt bewusst keine Portfreigabe auf dem Host. Der Matomo-Container erreicht MariaDB intern einfach über den Service-Namen db.
Auch Matomo selbst ist auf Port 8087 nur lokal erreichbar. Von außen kommt später ausschließlich Nginx auf HTTPS-Port 443 zum Einsatz.
4. Container starten
cd /opt/matomo
docker compose config
docker compose up -d
docker compose ps
Beim ersten Start braucht MariaDB einen Moment. Falls Matomo unmittelbar danach noch keine Verbindung bekommt, würde ich kurz warten und die Logs ansehen:
docker compose logs -f --tail 100
Der lokale Matomo-Webserver lässt sich testen mit:
curl -I http://127.0.0.1:8087/
5. Nginx als Reverse Proxy
Als Beispiel verwende ich analytics.example.de:
server {
listen 80;
server_name analytics.example.de;
return 301 https://$host$request_uri;
}
server {
listen 443 ssl;
server_name analytics.example.de;
ssl_certificate /etc/letsencrypt/live/analytics.example.de/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/analytics.example.de/privkey.pem;
client_max_body_size 100M;
location / {
proxy_pass http://127.0.0.1:8087;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
Die Zertifikatspfade musst du natürlich an deine Domain anpassen. Ich pflege die eigentlichen TLS-Einstellungen lieber zentral in meiner Nginx-Konfiguration, statt einen jahrealten Cipher-Block in jeden einzelnen Blogartikel zu kopieren.
sudo nginx -t
sudo systemctl reload nginx
6. Matomo im Browser einrichten
Danach öffnest du https://analytics.example.de. Wenn die Datenbankwerte bereits über Environment-Variablen gesetzt sind, hat Matomo die wichtigsten Verbindungsdaten schon zur Verfügung.
Falls der Installationsassistent die Datenbankdaten abfragt, lauten sie in unserem Beispiel:
- Datenbankserver:
db - Datenbank:
matomo - Benutzer:
matomo - Passwort: Wert aus
MARIADB_PASSWORD
Anschließend wird der Matomo-Administrator angelegt und die erste Webseite eingetragen.
7. Archivierung per Cron
Bei produktiven Matomo-Installationen sollte die Archivierung nicht nur über Browseraufrufe ausgelöst werden. Der Befehl im Container lautet:
docker compose exec -T app \
php /var/www/html/console core:archive
Diesen Befehl kann man beispielsweise stündlich per System-Cron oder systemd-Timer ausführen. Das offizielle Matomo-Docker-FAQ beschreibt alternativ einen eigenen Cron-Container.
8. Backups nicht vergessen
Für eine vollständige Sicherung sind vor allem zwei Bereiche wichtig: die MariaDB-Daten und die persistente Matomo-Konfiguration beziehungsweise Plugins im Matomo-Volume.
Bei der Datenbank würde ich für ein Backup einen konsistenten Dump erstellen und nicht nur blind das laufende Datenverzeichnis kopieren. Das passt gut zu meiner aktuellen Anleitung BorgBackup unter Debian und Ubuntu einrichten.
9. Matomo aktualisieren
Beim Docker-Setup wird nicht die Software im laufenden Container dauerhaft manuell aktualisiert. Stattdessen zieht man das neue Image und erstellt den Container neu:
cd /opt/matomo
docker compose pull
docker compose up -d
Die Daten bleiben durch die persistenten Volumes erhalten. Vor größeren Updates würde ich trotzdem immer ein aktuelles Backup kontrollieren.
10. Webserver-Logs in Matomo importieren
Matomo kann nicht nur per JavaScript messen. Wer Nginx- oder Apache-Access-Logs auswerten möchte, findet dazu meine frisch aktualisierte Anleitung Matomo: Nginx- und Apache-Logs importieren.
Das offizielle Matomo-Docker-Projekt beschreibt ebenfalls, wie import_logs.py zusammen mit einem Docker-Setup verwendet werden kann.
Weiterführend: Matomo mit Docker Compose installieren und das offizielle Matomo-Docker-Projekt.
Gedanken dazu 0 Kommentare
Noch ist es ruhig hier. Dein Gedanke könnte der erste sein.
Was denkst du dazu?
Dein Kommentar erscheint nach der Freigabe.