Ü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.