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

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
- Synology NAS mit DSM 7.2 oder neuer, x86_64-Architektur empfohlen (z. B. DS923+, DS1522+, DS720+)
- Container Manager aus dem Paket-Zentrum installiert
- Mindestens 2 GB freier RAM, 4 GB empfohlen für größere Installationen
- Mindestens 5 GB freier Speicher auf dem NAS-Volume (ca. 1 GB pro 1 Million gespeicherter Seitenaufrufe)
- SSH-Zugang zum NAS für die
docker-Prüfbefehle (siehe SSH auf dem Synology NAS aktivieren) - Domain oder Subdomain (z. B.
analytics.ihredomain.de) mit gültigem TLS-Zertifikat für den HTTPS-Betrieb - 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/dbSetzen 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/dataVerifizieren: 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: bridgeErsetzen 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.
| Parameter | Wert | Hinweis |
|---|---|---|
| Image Matomo | matomo:5.14.0-apache | Festgeschriebene Version mit Apache (Stand September 2026) |
| Image MariaDB | mariadb:11.4 | LTS-Version mit Support bis 2029 |
| Host-Port | 8597 | Auf Container-Port 80; in der DSM-Firewall nur fürs LAN freigeben |
| Volume Matomo | /volume1/docker/matomo/data → /var/www/html | config.ini.php, Plugins, GeoIP |
| Volume MariaDB | /volume1/docker/matomo/db → /var/lib/mysql | Alle Analytics-Daten – Pflicht für Persistenz |
| DB-Port | 3306 (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:
- Datenbankserver:
matomo-db(der Container-Name – niemalslocalhostoder127.0.0.1) - Benutzername:
matomouser - Passwort: Ihr Wert für
SICHER_AENDERN_USER - Datenbankname:
matomodb - 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-appLegen 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:
- Quelle: HTTPS, Port 443, Hostname
analytics.ihredomain.de - Ziel: HTTP,
localhost, Port8597
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_FORDiese 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 = 1Verifizieren: Ö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.deTroubleshooting / Typische Fehler
- „Could not connect to database“ im Setup-Wizard: Fast immer startet Matomo, bevor MariaDB bereit ist.
depends_onwartet nur auf den Container-Start, nicht auf die DB-Bereitschaft. Lösung:docker logs matomo-db | grep "ready for connections"abwarten, danndocker restart matomo-app. - „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 777ist nicht nötig. - Falscher DB-Host im Setup: Als Datenbankserver muss der Container-Name
matomo-dbeingetragen werden – nichtlocalhostoder127.0.0.1. Beide Container müssen im gleichen Netzwerk (matomo-net) sein. - 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 = 1undassume_secure_protocol = 1inconfig.ini.phpsetzen. - 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. - „Packet too large“-Fehler bei GeoIP-Import oder großen Exporten: Der
--max_allowed_packet=1073741824-Parameter immatomo-db-Service muss vorhanden sein (bereits in der compose.yaml enthalten). - Nach Image-Update sind Einstellungen weg: Das Volume
/volume1/docker/matomo/datawurde nicht persistent gemountet. Immer den Bind-Mount aus der compose.yaml verwenden – niemals ohne Volume-Eintrag starten. - 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 vorherdbunddata.
Häufige Fragen
Braucht Matomo ohne Cookies einen Cookie-Banner?
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
- DSGVO-Praxis: TOMs dokumentieren und Auftragsverarbeitung regeln
- 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


