Optimierter Docker Stack für Matomo Analytics mit Traefik Reverse Proxy, Redis Caching und automatischen Backups.
Optimiert für: 10-15 Websites, ~500 User/Tag pro Site, ~10.000 Page Views/Tag
- Voraussetzungen
- Installation
- Matomo Konfiguration
- Ofelia CronJobs
- Wartung
- Troubleshooting
- Performance Monitoring
- Backup & Restore
-
Traefik Reverse Proxy muss laufen
- Netzwerk:
traefik_proxy_network - Benötigte Middlewares (in Traefik
dynamic.yml):security-headers@filecompression@filerate-limit@fileredirect-to-https@file
- TLS Options:
modern@file
- Netzwerk:
-
Ofelia CronJob Scheduler muss laufen
- Docker Socket muss gemountet sein
- Repository: https://github.com/csaeum/DockerStackOfelia
- RAM: Mindestens 6GB verfügbar
- CPU: 2+ Cores empfohlen
- Speicher: SSD mit min. 50GB freiem Platz
- Docker: Version 24.0+
- Docker Compose: Version 2.20+
git clone https://github.com/IhrUsername/DockerStackMatomo.git
cd DockerStackMatomomkdir -p volumes/html
mkdir -p volumes/sqlcp .env.example .env
nano .envWichtige Anpassungen in .env:
# Projekt-Name (wird für Container-Namen verwendet)
COMPOSE_PROJECT_NAME=matomo
# Backup-Verzeichnis (anpassen!)
BACKUPVOLUME=/pfad/zu/ihrem/backup
# Ihre Domains (anpassen!)
HOSTRULE=Host(`matomo.ihre-domain.de`)
# Sichere Passwörter generieren:
# openssl rand -base64 32
REDIS_PASSWORD=HIER_GENERIERTES_PASSWORT
SQL_PASSWORD=HIER_GENERIERTES_PASSWORT
SQL_ROOT_PASSWORD=HIER_GENERIERTES_PASSWORTdocker compose up -d-
Browser öffnen:
https://ihre-domain.de -
Matomo Setup-Wizard durchlaufen:
- Datenbank-Host:
sql - Datenbank-Name:
MatomoDB - Datenbank-User:
MatomoUser - Datenbank-Passwort: Ihr
SQL_PASSWORDaus.env - Tabellen-Präfix:
matomo_(Standard)
- Datenbank-Host:
-
Admin-User anlegen
-
Erste Website hinzufügen
Nach der Installation sollten Sie die Matomo System-Diagnose prüfen:
Administration → System → Systemprüfung
Alle Punkte sollten grün sein, insbesondere:
- ✅ Empfohlene private Verzeichnisse -
/tmp/und/config/sollten nicht erreichbar sein - ✅ Datei-Integrität
- ✅ PHP-Konfiguration
Testen Sie den Schutz:
# Diese URLs sollten 403 Forbidden zurückgeben:
curl -I https://ihre-domain.de/tmp/
curl -I https://ihre-domain.de/config/
curl -I https://ihre-domain.de/config/config.ini.phpNach der Installation müssen Sie die Matomo-Konfiguration anpassen für optimale Performance.
Wichtig: Dies ist der wichtigste Performance-Boost!
Bearbeiten Sie volumes/html/config/config.ini.php:
docker exec -it matomo-php-apache nano /var/www/html/config/config.ini.phpFügen Sie am Ende der Datei hinzu:
[Cache]
backend = redis
[RedisCache]
host = "redis"
port = 6379
password = "IHR_REDIS_PASSWORD_AUS_ENV"
database = 0
timeout = 0.0
[QueuedTracking]
; Redis für Session-Storage verwenden
backend = "redis"
host = "redis"
port = 6379
password = "IHR_REDIS_PASSWORD_AUS_ENV"
database = 1Ersetzen Sie IHR_REDIS_PASSWORD_AUS_ENV mit dem Wert aus Ihrer .env Datei!
Wichtig: Verhindert Performance-Probleme durch gleichzeitige Report-Generierung.
In derselben config.ini.php Datei:
[General]
enable_browser_archiving_triggering = 0
browser_archiving_disabled_enforce = 1Fügen Sie alle Ihre Domains als Trusted Hosts hinzu:
[General]
trusted_hosts[] = "matomo.ihre-domain.de"
trusted_hosts[] = "matomo.andere-domain.com"[General]
session_save_handler = "dbtable"
[RedisSession]
host = "redis"
port = 6379
password = "IHR_REDIS_PASSWORD_AUS_ENV"
database = 2[Tracker]
; IP-Anonymisierung aktivieren (DSGVO-konform)
ip_address_mask_length = 2
[PrivacyManager]
; IPs anonymisieren
anonymizeIpEnabled = 1
; Referrer anonymisieren
anonymizeReferrerEnabled = 1
; User-ID anonymisieren
anonymizeUserIdEnabled = 1[General]
; Archivierungs-Timeout erhöhen für große Installationen
archiving_query_max_execution_time = 7200
; Browser-Archivierung komplett deaktivieren
enable_browser_archiving_triggering = 0
[Tracker]
; Tracking-Requests optimieren
bulk_requests_max_requests_to_process = 100Nach allen Änderungen:
docker compose restart php-apacheDie folgenden CronJobs werden automatisch von Ofelia ausgeführt (konfiguriert in docker-compose.yaml):
Schedule: 0 * * * * # Jede Stunde zur vollen Stunde
Command: php /var/www/html/console core:archiveGeneriert Reports für alle konfigurierten Websites automatisch. Läuft im Hintergrund ohne UI-Belastung.
Hinweis: Ohne --url Parameter werden alle in Matomo angelegten Sites archiviert. Optional können Sie eine spezifische Site archivieren mit --url=https://ihre-domain.de.
Schedule: 0 2 * * * # Täglich um 2:00 Uhr
Command: php /var/www/html/console core:delete-logs-data --dates=180Löscht Tracking-Logs älter als 180 Tage (6 Monate). Spart Speicherplatz.
Schedule: 0 3 * * * # Täglich um 3:00 Uhr
Command: php /var/www/html/console core:purge-old-archive-dataBereinigt alte temporäre Archive und Cache-Dateien.
# Ofelia-Logs anzeigen
docker logs -f ofelia
# Manuell Archivierung testen (alle Sites)
docker exec matomo-php-apache php /var/www/html/console core:archive
# Oder nur eine spezifische Site archivieren
docker exec matomo-php-apache php /var/www/html/console core:archive --url=https://ihre-domain.de# Alle Services
docker compose logs -f
# Nur PHP/Apache
docker compose logs -f php-apache
# Nur MariaDB
docker compose logs -f sql
# Nur Redis
docker compose logs -f redis# Alle Container
docker compose restart
# Nur PHP/Apache
docker compose restart php-apache
# Nur Datenbank
docker compose restart sql# Images aktualisieren
docker compose pull
# Stack neu starten mit neuen Images
docker compose up -d
# Alte Images aufräumen
docker image prune -fMatomo kann über das Web-Interface aktualisiert werden:
- Login als Admin
- Administration → System → Updates
- Automatisches Update durchführen
- Nach Update Container neu starten:
docker compose restart php-apache
Lösung:
# Prüfen ob MariaDB läuft
docker compose ps sql
# MariaDB Logs prüfen
docker compose logs sql
# Healthcheck testen
docker exec matomo-sql mariadb-admin ping -uroot -p"${SQL_ROOT_PASSWORD}"Lösung:
# Ofelia-Logs prüfen
docker logs ofelia
# Manuell Archivierung ausführen
docker exec matomo-php-apache php /var/www/html/console core:archive
# Browser-Archivierung in config.ini.php deaktivieren (siehe oben)Lösung:
# Redis-Status prüfen
docker exec matomo-redis redis-cli -a "${REDIS_PASSWORD}" ping
# Redis-Logs prüfen
docker compose logs redis
# Passwort in config.ini.php überprüfenSchritte zur Diagnose:
-
Container-Ressourcen prüfen:
docker stats
-
MariaDB Buffer Pool Status:
docker exec matomo-sql mariadb -uroot -p"${SQL_ROOT_PASSWORD}" -e "SHOW VARIABLES LIKE 'innodb_buffer_pool_size';"
-
Redis Memory Usage:
docker exec matomo-redis redis-cli -a "${REDIS_PASSWORD}" INFO memory
-
PHP OPcache Status:
- Browser:
https://ihre-domain.de/index.php?module=Installation&action=systemCheck - Prüfen: "OPcache" sollte grün sein
- Browser:
Lösung:
# Alte Logs löschen (manuell)
docker exec matomo-php-apache php /var/www/html/console core:delete-logs-data --dates=90
# Temporäre Dateien bereinigen
docker exec matomo-php-apache php /var/www/html/console core:purge-old-archive-data
# Docker Volumes Größe prüfen
du -sh volumes/*Browser: https://ihre-domain.de/index.php?module=Installation&action=systemCheck
Grüne Häkchen sollten sein bei:
- ✅ PHP Version 8.3
- ✅ MySQL/MariaDB
- ✅ Required PHP Extensions
- ✅ File Integrity
- ✅ OPcache aktiviert
# Redis Stats
docker exec matomo-redis redis-cli -a "${REDIS_PASSWORD}" INFO stats
# Memory Usage
docker exec matomo-redis redis-cli -a "${REDIS_PASSWORD}" INFO memory
# Connected Clients
docker exec matomo-redis redis-cli -a "${REDIS_PASSWORD}" CLIENT LIST# Database Size
docker exec matomo-sql mariadb -uroot -p"${SQL_ROOT_PASSWORD}" -e "
SELECT
table_schema 'Database',
ROUND(SUM(data_length + index_length) / 1024 / 1024, 2) 'Size (MB)'
FROM information_schema.tables
WHERE table_schema = 'MatomoDB'
GROUP BY table_schema;"
# InnoDB Status
docker exec matomo-sql mariadb -uroot -p"${SQL_ROOT_PASSWORD}" -e "SHOW ENGINE INNODB STATUS\G"# Archivierung mit Timer
time docker exec matomo-php-apache php /var/www/html/console core:archive
# Detaillierte Statistiken
docker exec matomo-php-apache php /var/www/html/console core:archive --concurrent-requests-per-website=3SQL-Backups werden automatisch erstellt durch den sqlbackup Container:
- Frequenz: Alle 6 Stunden (3:00, 9:00, 15:00, 21:00)
- Speicherort:
${BACKUPVOLUME}/matomo/ - Aufbewahrung: Letzte 12 Backups
- Kompression: GZIP Level 9
# Datenbank Backup
docker exec matomo-sql mariadb-dump \
-uroot -p"${SQL_ROOT_PASSWORD}" \
--single-transaction \
--quick \
--lock-tables=false \
MatomoDB > backup_$(date +%Y%m%d_%H%M%S).sql
# Matomo-Dateien sichern (config, plugins, etc.)
tar -czf matomo_files_$(date +%Y%m%d_%H%M%S).tar.gz volumes/html/config volumes/html/plugins# 1. Stack stoppen
docker compose down
# 2. Datenbank wiederherstellen
docker compose up -d sql
docker exec -i matomo-sql mariadb -uroot -p"${SQL_ROOT_PASSWORD}" MatomoDB < backup_20250101_120000.sql
# 3. Dateien wiederherstellen (optional)
tar -xzf matomo_files_20250101_120000.tar.gz
# 4. Stack vollständig starten
docker compose up -dKomplette Neuinstallation mit Backup:
# 1. Repository klonen
git clone https://github.com/IhrUsername/DockerStackMatomo.git
cd DockerStackMatomo
# 2. .env konfigurieren
cp .env.example .env
nano .env # Passwörter MÜSSEN identisch sein!
# 3. Volumes vorbereiten
mkdir -p volumes/html volumes/sql
# 4. Nur Datenbank starten
docker compose up -d sql
# 5. Backup einspielen
docker exec -i matomo-sql mariadb -uroot -p"${SQL_ROOT_PASSWORD}" MatomoDB < backup.sql
# 6. Matomo-Dateien wiederherstellen
tar -xzf matomo_files.tar.gz -C volumes/html/
# 7. Stack vollständig starten
docker compose up -d
# 8. Permissions korrigieren
docker exec matomo-php-apache chown -R www-data:www-data /var/www/html/config
docker exec matomo-php-apache chown -R www-data:www-data /var/www/html/tmpDer Stack schützt automatisch folgende Verzeichnisse vor öffentlichem Zugriff:
/tmp/- Temporäre Dateien und Cache/config/- Konfigurationsdateien (inkl.config.ini.php)/lang/- Sprachdateien/vendor/- Composer Dependencies.git/- Git-Repository (falls vorhanden)- Backup-Dateien (
.bak,.backup,.sql, etc.)
Konfiguration: configs/apache/matomo-security.conf
Diese wird automatisch von Apache geladen. Bei Zugriff auf diese Verzeichnisse erhalten Besucher einen 403 Forbidden Fehler.
# 1. Neue Passwörter in .env eintragen
nano .env
# 2. Redis Passwort ändern
docker compose restart redis
# 3. MariaDB Passwörter ändern
docker exec matomo-sql mariadb -uroot -p"${OLD_PASSWORD}" -e "
ALTER USER 'root'@'%' IDENTIFIED BY '${NEW_ROOT_PASSWORD}';
ALTER USER 'MatomoUser'@'%' IDENTIFIED BY '${NEW_USER_PASSWORD}';
FLUSH PRIVILEGES;"
# 4. config.ini.php aktualisieren (Redis-Passwort)
nano volumes/html/config/config.ini.php
# 5. Stack neu starten
docker compose restartWerden automatisch von Traefik mit Let's Encrypt verwaltet.
Prüfen:
# SSL Labs Test
https://www.ssllabs.com/ssltest/analyze.html?d=ihre-domain.decurl -I https://ihre-domain.deSollte enthalten:
Strict-Transport-SecurityX-Frame-OptionsX-Content-Type-OptionsContent-Security-Policy
QueuedTracking Plugin installieren:
- In Matomo: Administration → Marketplace
- "QueuedTracking" suchen und installieren
- In
docker-compose.yamlzusätzlichen CronJob hinzufügen:
# Ofelia Label hinzufügen:
- ofelia.job-exec.${COMPOSE_PROJECT_NAME}-queue-worker.schedule=* * * * *
- ofelia.job-exec.${COMPOSE_PROJECT_NAME}-queue-worker.command=php /var/www/html/console queuedtracking:process- Stack neu starten:
docker compose up -d
In docker-compose.yaml:
# MariaDB RAM erhöhen
sql:
deploy:
resources:
limits:
memory: "8G" # von 4G auf 8G
# Redis RAM erhöhen
redis:
command:
- --maxmemory
- 2gb # von 1gb auf 2gbDann configs/sql/custom.cnf anpassen:
innodb_buffer_pool_size = 6G # 75% von 8G- Matomo Dokumentation: https://matomo.org/guides/
- Traefik Labels: https://github.com/csaeum/DockerStackTraefik/blob/main/LABELS-CHECKLIST.md
- Ofelia CronJobs: https://github.com/csaeum/DockerStackOfelia
- Matomo Forums: https://forum.matomo.org/
- Performance FAQ: https://matomo.org/faq/on-premise/how-to-configure-matomo-for-speed/
- ✅ Initial Release
- ✅ Optimiert für 10-15 Sites, ~500 User/Tag
- ✅ Redis Caching Integration
- ✅ Traefik Security Middlewares
- ✅ Apache Security Config (blockiert /tmp/, /config/, etc.)
- ✅ Automatische Backups
- ✅ Ofelia CronJobs für Archivierung
- ✅ Performance-optimierte MariaDB Config
- ✅ PHP 8.3 mit OPcache + JIT
Dieses Projekt ist unter der GPL-3.0-or-later Lizenz lizenziert.
Made with ❤️ by WSC - Web SEO Consulting
Dieses Projekt ist kostenlos und Open Source. Wenn es dir geholfen hat, freue ich mich über deine Unterstützung:
- 🐛 Bug Reports: GitHub Issues
- 💬 Diskussionen: GitHub Discussions
- 📧 Kontakt: info@web-seo-consulting.eu
Weitere Sprachen: