Zum Hauptinhalt springen
S-EDV news
← Alle Anleitungen
📘 Anleitung Synology / NAS 11.06.2026 · 9 min Lesezeit

Matomo auf dem Synology NAS installieren: DSGVO-konforme Webanalyse

Matomo als Stack aus drei Containern auf dem Synology NAS einrichten: compose.yaml mit MariaDB, Archivierungs-Cron, Reverse Proxy und cookielosem Tracking. Alle Analysedaten bleiben unter Ihrer Kontrolle.

Geprüft am 30.09.2026 · für matomo 5.14.0

WerbelinksMit * markierte Links sind Werbelinks: Bei einem Kauf erhalten wir eine Provision, der Preis bleibt gleich. Als Amazon-Partner verdiene ich an qualifizierten Verkäufen. Mehr dazu

Kompaktes NAS mit zwei Laufwerksschächten auf Holzschreibtisch neben Pflanze und Monitor mit farbigem Balkendiagramm

Wer Website-Statistiken erfassen will, ohne Daten an Google oder andere Dritte zu übermitteln, hostet die Webanalyse selbst. Matomo ist eine quelloffene Web-Analyse-Plattform, bei der alle Rohdaten auf Ihrer eigenen Hardware bleiben. Auf dem Synology NAS betreiben Sie Matomo mit dem Container Manager als Stack aus drei Diensten: MariaDB als Datenbank, die Matomo-App und ein Cron-Container für die Archivierung. Mit cookielosem Tracking und IP-Anonymisierung lässt sich Matomo in vielen Fällen ohne Einwilligungsbanner betreiben.

Voraussetzungen

  1. Synology NAS mit DSM 7.2 oder neuer, x86_64-Architektur empfohlen (z. B. DS923+, DS1522+, DS720+)
  2. Container Manager aus dem Paket-Zentrum installiert
  3. Mindestens 2 GB freier RAM, 4 GB empfohlen für größere Installationen
  4. Mindestens 5 GB freier Speicher auf dem NAS-Volume (ca. 1 GB pro 1 Million gespeicherter Seitenaufrufe)
  5. SSH-Zugang zum NAS für die docker-Prüfbefehle (siehe SSH auf dem Synology NAS aktivieren)
  6. Domain oder Subdomain (z. B. analytics.ihredomain.de) mit gültigem TLS-Zertifikat für den HTTPS-Betrieb
  7. Zugang zu den Websites, die getrackt werden sollen, um den Tracking-Code einzubauen

Schritt 1: Verzeichnisse anlegen und Berechtigungen setzen

Legen Sie in File Station im freigegebenen Ordner docker den Ordner matomo mit den Unterordnern data und db an. Per SSH erledigt das:

sudo mkdir -p /volume1/docker/matomo/data /volume1/docker/matomo/db

Setzen Sie kein chmod 777. Beide Images setzen die Rechte beim ersten Start selbst: Der Matomo-Container übergibt /var/www/html an www-data (UID 33), der MariaDB-Container sein Datenverzeichnis an den Benutzer mysql. Erscheint im Setup dennoch „not writable“, setzen Sie gezielt den Eigentümer:

sudo chown -R 33:33 /volume1/docker/matomo/data

Verifizieren: Prüfen Sie, ob beide Verzeichnisse existieren:

ls -la /volume1/docker/matomo/
# Erwartete Ausgabe: zwei Unterordner „data“ und „db“

Schritt 2: Compose-Projekt im Container Manager anlegen

Öffnen Sie im DSM den Container Manager und wählen Sie Projekt → Erstellen. Vergeben Sie den Projektnamen matomo, setzen Sie den Pfad auf /volume1/docker/matomo und fügen Sie folgende compose.yaml ein:

services:
  matomo-db:
    image: mariadb:11.4
    container_name: matomo-db
    restart: unless-stopped
    environment:
      MARIADB_ROOT_PASSWORD: SICHER_AENDERN_ROOT
      MARIADB_DATABASE: matomodb
      MARIADB_USER: matomouser
      MARIADB_PASSWORD: SICHER_AENDERN_USER
      TZ: Europe/Berlin
    volumes:
      - /volume1/docker/matomo/db:/var/lib/mysql
    command: --max_allowed_packet=1073741824
    networks:
      - matomo-net

  matomo:
    image: matomo:5.14.0-apache
    container_name: matomo-app
    restart: unless-stopped
    ports:
      - "8597:80"
    environment:
      MATOMO_DATABASE_HOST: matomo-db
      MATOMO_DATABASE_USERNAME: matomouser
      MATOMO_DATABASE_PASSWORD: SICHER_AENDERN_USER
      MATOMO_DATABASE_DBNAME: matomodb
      PHP_MEMORY_LIMIT: 512M
      TZ: Europe/Berlin
    volumes:
      - /volume1/docker/matomo/data:/var/www/html
    depends_on:
      - matomo-db
    networks:
      - matomo-net

  matomo-cron:
    image: matomo:5.14.0-apache
    container_name: matomo-cron
    restart: unless-stopped
    volumes:
      - /volume1/docker/matomo/data:/var/www/html
    entrypoint: >
      /bin/sh -c "while true; do
        php /var/www/html/console core:archive
        --url=https://analytics.ihredomain.de;
        sleep 3600;
      done"
    environment:
      TZ: Europe/Berlin
    depends_on:
      - matomo-db
      - matomo
    networks:
      - matomo-net

networks:
  matomo-net:
    driver: bridge

Ersetzen Sie SICHER_AENDERN_ROOT und SICHER_AENDERN_USER durch starke, einmalige Passwörter (mindestens 16 Zeichen, ohne $). MARIADB_PASSWORD und MATOMO_DATABASE_PASSWORD müssen identisch sein. Passen Sie die URL im matomo-cron-Entrypoint an Ihre Domain an.

ParameterWertHinweis
Image Matomomatomo:5.14.0-apacheFestgeschriebene Version mit Apache (Stand September 2026)
Image MariaDBmariadb:11.4LTS-Version mit Support bis 2029
Host-Port8597Auf Container-Port 80; in der DSM-Firewall nur fürs LAN freigeben
Volume Matomo/volume1/docker/matomo/data → /var/www/htmlconfig.ini.php, Plugins, GeoIP
Volume MariaDB/volume1/docker/matomo/db → /var/lib/mysqlAlle Analytics-Daten – Pflicht für Persistenz
DB-Port3306 (intern)Nicht nach außen exponieren – Docker-Netzwerk genügt

Verifizieren: Starten Sie das Projekt und prüfen Sie, ob alle drei Container laufen:

docker ps --filter "name=matomo"
# Erwartete Ausgabe: matomo-db, matomo-app und matomo-cron mit Status „Up“

Prüfen Sie außerdem die MariaDB-Logs auf den Bereitschaftshinweis:

docker logs matomo-db | grep "ready for connections"
# Erwartete Ausgabe: [Note] mariadbd: ready for connections.

Schritt 3: Datenbankverbindung und Setup-Wizard abschließen

Öffnen Sie im Browser http://NAS-IP:8597. Der Setup-Assistent führt durch die Erstkonfiguration. Am häufigsten scheitert die Datenbankeinrichtung an einem falschen Hostnamen. Tragen Sie ein:

  1. Datenbankserver: matomo-db (der Container-Name – niemals localhost oder 127.0.0.1)
  2. Benutzername: matomouser
  3. Passwort: Ihr Wert für SICHER_AENDERN_USER
  4. Datenbankname: matomodb
  5. Tabellen-Prefix: matomo_ (Standard)

Sollte der Wizard mit „Could not connect to database“ scheitern, obwohl die Zugangsdaten stimmen, ist MariaDB noch nicht vollständig hochgefahren. Starten Sie den Matomo-App-Container neu, sobald die DB-Logs „ready for connections“ zeigen:

docker restart matomo-app

Legen Sie danach einen Super-User an, fügen Sie Ihre erste Website hinzu und notieren Sie die Website-ID für den Tracking-Code.

Verifizieren: Prüfen Sie die angelegten Tabellen (das Passwort fragt der Befehl ab, damit es nicht in der Shell-Historie landet):

docker exec -it matomo-db mariadb -u matomouser -p matomodb -e "SHOW TABLES LIKE 'matomo_%';"
# Erwartete Ausgabe: Liste der Matomo-Tabellen (matomo_site, matomo_log_visit, …)

Schritt 4: Reverse Proxy und HTTPS einrichten

Für den Produktivbetrieb ist HTTPS Pflicht, auch um die übertragenen Besucherdaten zu verschlüsseln. Legen Sie im DSM-Reverse-Proxy (Systemsteuerung → Anmeldungsportal → Erweitert → Reverse Proxy) eine neue Regel an:

  1. Quelle: HTTPS, Port 443, Hostname analytics.ihredomain.de
  2. Ziel: HTTP, localhost, Port 8597

Anschließend muss Matomo wissen, dass es hinter einem Proxy läuft. Öffnen Sie die Datei /volume1/docker/matomo/data/config/config.ini.php und ergänzen Sie unter der Sektion [General]:

force_ssl = 1
assume_secure_protocol = 1
proxy_client_headers[] = HTTP_X_FORWARDED_FOR

Diese drei Zeilen sorgen dafür, dass Matomo echte Besucher-IPs korrekt ausliest statt der Proxy-IP 127.0.0.1 zu protokollieren, und dass alle internen Links auf HTTPS umgestellt werden.

Verifizieren: Rufen Sie https://analytics.ihredomain.de im Browser auf. Das Matomo-Dashboard muss ohne Zertifikatswarnung und ohne HTTP-Weiterleitungsschleife erscheinen. In der Matomo-Verwaltung unter Diagnose → System-Check darf kein Fehler bezüglich HTTPS oder Proxy-Headern stehen.

Schritt 5: Cookieloses Tracking und IP-Anonymisierung aktivieren

Dieser Schritt ist die technische Grundlage für einen Betrieb ohne Consent-Banner. Matomo hält das bei cookielosem Tracking und ausreichender IP-Anonymisierung in vielen Fällen für möglich. Ob das für Ihre Website gilt, hängt nach § 25 TDDDG und DSGVO vom Einzelfall ab; stimmen Sie die Konfiguration mit Ihrem Datenschutzbeauftragten ab.

IP-Anonymisierung: Öffnen Sie in der Matomo-Verwaltung Datenschutz → Daten anonymisieren, aktivieren Sie die IP-Anonymisierung und wählen Sie 2 Byte (Standard) oder 3 Byte. Bei 2 Byte speichert Matomo die letzten zwei Oktette der IPv4-Adresse nicht, bei 3 Byte die letzten drei.

Cookieless Tracking: Fügen Sie im Tracking-Code für den <head>-Bereich Ihrer Website vor dem trackPageView-Aufruf diese Zeile ein:

_paq.push(['disableCookies']);

Der vollständige Tracking-Code sieht dann so aus:

<script>
  var _paq = window._paq = window._paq || [];
  _paq.push(['disableCookies']);
  _paq.push(['trackPageView']);
  _paq.push(['enableLinkTracking']);
  (function() {
    var u="https://analytics.ihredomain.de/";
    _paq.push(['setTrackerUrl', u+'matomo.php']);
    _paq.push(['setSiteId', '1']);
    var d=document, g=d.createElement('script'), s=d.getElementsByTagName('script')[0];
    g.async=true; g.src=u+'matomo.js'; s.parentNode.insertBefore(g,s);
  })();
</script>

Browser-Archivierung deaktivieren: Da der Cron-Container die Archivierung übernimmt, deaktivieren Sie die browsergesteuerte Archivierung. Setzen Sie in config.ini.php unter [General]:

browser_archiving_disabled_enforce = 1

Verifizieren: Öffnen Sie die getrackte Website, drücken Sie F12, wechseln Sie zum Netzwerk-Tab und laden Sie die Seite neu. Der Filter matomo zeigt zwei erfolgreiche Anfragen:

matomo.js    → HTTP 200
matomo.php   → HTTP 200 (oder 204)

Unter Besucher → Echtzeit erscheint Ihr eigener Seitenaufruf innerhalb weniger Sekunden. Im Browser-Cookie-Speicher (Entwicklertools → Anwendung → Cookies) darf kein _pk_id- oder _pk_ses-Cookie vorhanden sein.

Schritt 6: Archivierungs-Cron im Container verifizieren

Der matomo-cron-Container läuft als dauerhafter Prozess, der stündlich core:archive ausführt. Das entspricht dem Compose-Beispiel der Matomo-Dokumentation. Gegenüber einem Eintrag im DSM-Aufgabenplaner bleibt so alles im Compose-Projekt und startet mit dem Stack neu.

Der erste Lauf startet direkt mit dem Container, danach folgt alle 3600 Sekunden ein weiterer. Neue Besuche erscheinen in den Berichten deshalb erst nach dem nächsten Lauf; der Echtzeit-Bericht funktioniert sofort.

Verifizieren: Prüfen Sie die Cron-Container-Logs auf erfolgreiche Archivierungsläufe:

docker logs matomo-cron --tail 30
# Erwartete Ausgabe nach dem ersten Durchlauf:
# Starting Matomo reports archiving...
# Archived website id = 1, 0 visits …

Einen Lauf außer der Reihe stoßen Sie manuell an:

docker exec matomo-app php /var/www/html/console core:archive --url=https://analytics.ihredomain.de

Troubleshooting / Typische Fehler

  1. „Could not connect to database“ im Setup-Wizard: Fast immer startet Matomo, bevor MariaDB bereit ist. depends_on wartet nur auf den Container-Start, nicht auf die DB-Bereitschaft. Lösung: docker logs matomo-db | grep "ready for connections" abwarten, dann docker restart matomo-app.
  2. „not writable“-Fehler beim Setup: Die Verzeichnisse unter /volume1/docker/matomo/data/ haben unzureichende Schreibrechte für UID 33. Lösung: sudo chown -R 33:33 /volume1/docker/matomo/data, dann den Container neu starten. chmod 777 ist nicht nötig.
  3. Falscher DB-Host im Setup: Als Datenbankserver muss der Container-Name matomo-db eingetragen werden – nicht localhost oder 127.0.0.1. Beide Container müssen im gleichen Netzwerk (matomo-net) sein.
  4. Tracking-Requests schlagen fehl (404/CORS): Die URL im Tracking-Code muss exakt der Matomo-Installations-URL entsprechen (inklusive abschließendem Schrägstrich). Bei HTTPS hinter dem Reverse Proxy: force_ssl = 1 und assume_secure_protocol = 1 in config.ini.php setzen.
  5. Dashboard zeigt keine historischen Daten: Archivierung wurde noch nicht ausgeführt. Cron-Container-Logs prüfen oder manuell mit docker exec matomo-app php /var/www/html/console core:archive --url=… anstoßen.
  6. „Packet too large“-Fehler bei GeoIP-Import oder großen Exporten: Der --max_allowed_packet=1073741824-Parameter im matomo-db-Service muss vorhanden sein (bereits in der compose.yaml enthalten).
  7. Nach Image-Update sind Einstellungen weg: Das Volume /volume1/docker/matomo/data wurde nicht persistent gemountet. Immer den Bind-Mount aus der compose.yaml verwenden – niemals ohne Volume-Eintrag starten.
  8. Nach Matomo-Update erscheinen Fehler im Dashboard: Nach einem Update (neuen Tag in der compose.yaml eintragen, Projekt im Container Manager neu erstellen) zeigt Matomo beim nächsten Aufruf den Assistenten für das Datenbank-Update. Führen Sie ihn aus oder nutzen Sie docker exec matomo-app php /var/www/html/console core:update --yes. Sichern Sie vorher db und data.

Häufige Fragen

Häufig nicht, aber nicht automatisch. Mit _paq.push(['disableCookies']) speichert Matomo nichts auf dem Endgerät. Zusätzlich sollten IP-Adressen anonymisiert und keine personenbezogenen Daten in URLs oder Seitentiteln erfasst werden. Matomo bildet für die Besuchererkennung aber weiterhin einen Hash aus Gerätemerkmalen; die rechtliche Bewertung nach § 25 TDDDG klären Sie mit Ihrem Datenschutzbeauftragten.

Ist ein Auftragsverarbeitungsvertrag (AVV) nötig?

Nein, solange Matomo auf Ihrem eigenen NAS läuft: Sie sind Verantwortlicher, ein Auftragsverarbeiter ist nicht beteiligt. Einen AVV benötigen Sie, wenn ein externer Dienstleister (Hoster, Agentur, Fernwartung) Zugriff auf die Analysedaten hat. Mehr dazu in der Anleitung DSGVO-Praxis: TOMs dokumentieren und Auftragsverarbeitung regeln.

Wie lässt sich die Datenbankverbindung nach dem Start prüfen?

Drei Schritte: (1) docker logs matomo-db | grep "ready for connections" – zeigt, ob MariaDB gestartet ist. (2) docker exec -it matomo-db mariadb -u matomouser -p matomodb – erfolgreiche Verbindung bestätigt die Zugangsdaten. (3) Im Setup-Wizard Schritt „Datenbank einrichten“ – ein grünes Häkchen bestätigt den Verbindungserfolg.

Wie lässt sich der Tracking-Code nach dem Einbau testen?

Wie in Schritt 5 beschrieben: Netzwerk-Tab der Entwicklertools (F12) auf matomo.js und matomo.php prüfen, danach Besucher → Echtzeit.

Läuft Matomo hinter dem Synology-Reverse-Proxy?

Ja, und für den Produktivbetrieb ist das die empfohlene Variante. Im DSM-Reverse-Proxy: Quelle HTTPS:443 → Ziel HTTP:localhost:8597. In config.ini.php dann force_ssl = 1, assume_secure_protocol = 1 und proxy_client_headers[] = HTTP_X_FORWARDED_FOR setzen, damit die echten Besucher-IPs übermittelt werden.

Was ist der Unterschied zu Umami als Alternative?

Beide laufen self-hosted und sind DSGVO-konform. Umami ist schlanker und schneller aufgesetzt. Matomo bietet deutlich mehr: Ziel-Tracking, E-Commerce-Auswertung, Heatmaps (via Plugin), A/B-Tests und eine detailliertere Segmentierung. Wer nur Seitenaufrufe und Herkunft braucht, findet in der Anleitung Umami auf dem Synology NAS installieren eine schlankere Alternative.

Fazit

Matomo auf dem Synology NAS gibt Website-Betreibern im DACH-Raum volle Datenkontrolle ohne Drittlandtransfer und ohne Google-Abhängigkeit. Das Compose-Projekt mit drei Diensten ist in unter einer Stunde einsatzbereit. Der persistente MariaDB-Mount schützt vor Datenverlust, der Cron-Container archiviert die Berichte zuverlässig, und disableCookies mit IP-Anonymisierung schafft die technische Grundlage für einen Betrieb ohne Consent-Banner. Für reine Seitenaufrufe genügt Umami, für E-Commerce-Tracking, Conversion-Ziele oder Heatmaps ist Matomo die bessere Wahl.

Weiterführende Anleitungen und Quellen

  1. DSGVO-Praxis: TOMs dokumentieren und Auftragsverarbeitung regeln
  2. Nginx Proxy Manager auf der Synology einrichten: Reverse Proxy und SSL

Offizielle Dokumentation: Matomo Docker Hub Official Image · Matomo FAQ: Docker-Installation · Matomo: Cookieless ohne Consent-Banner