π©πͺ Deutsch | π¬π§ English | π«π· FranΓ§ais
Optimized Docker Stack for Matomo Analytics with Traefik Reverse Proxy, Redis Caching, and automatic backups.
Optimized for: 10-15 websites, ~500 users/day per site, ~10,000 page views/day
- β PHP 8.3 with OPcache + JIT compiler
- β MariaDB 11.4 with performance-optimized configuration
- β Redis 7 for caching and sessions
- β Traefik integration with security middlewares
- β Automatic SSL/TLS via Let's Encrypt
- β Automatic database backups every 6 hours
- β Ofelia CronJobs for archiving and maintenance
- β Apache security configuration (blocks /tmp/, /config/, etc.)
- β tmpfs for improved I/O performance
-
Traefik Reverse Proxy must be running
- Network:
traefik_proxy_network - Required Middlewares:
security-headers@file,compression@file,rate-limit@file,redirect-to-https@file - TLS Options:
modern@file
- Network:
-
Ofelia CronJob Scheduler must be running
- Repository: https://github.com/csaeum/DockerStackOfelia
- RAM: At least 6GB available
- CPU: 2+ cores recommended
- Storage: SSD with min. 50GB free space
- Docker: Version 24.0+
- Docker Compose: Version 2.20+
git clone https://github.com/csaeum/DockerStackMatomo.git
cd DockerStackMatomomkdir -p volumes/html volumes/sqlcp .env.example .env
nano .envImportant settings in .env:
COMPOSE_PROJECT_NAME=matomo
BACKUPVOLUME=/path/to/your/backup
HOSTRULE=Host(`matomo.your-domain.com`)
# Generate secure passwords:
# openssl rand -base64 32
REDIS_PASSWORD=YOUR_GENERATED_PASSWORD
SQL_PASSWORD=YOUR_GENERATED_PASSWORD
SQL_ROOT_PASSWORD=YOUR_GENERATED_PASSWORDdocker compose up -d- Open browser:
https://your-domain.com - Follow Matomo setup wizard:
- Database Host:
sql - Database Name:
MatomoDB - Database User:
MatomoUser - Database Password: Your
SQL_PASSWORDfrom.env
- Database Host:
Edit volumes/html/config/config.ini.php:
docker exec -it matomo-php-apache nano /var/www/html/config/config.ini.phpAdd at the end:
[Cache]
backend = redis
[RedisCache]
host = "redis"
port = 6379
password = "YOUR_REDIS_PASSWORD"
database = 0
timeout = 0.0
[QueuedTracking]
backend = "redis"
host = "redis"
port = 6379
password = "YOUR_REDIS_PASSWORD"
database = 1In the same config.ini.php:
[General]
enable_browser_archiving_triggering = 0
browser_archiving_disabled_enforce = 1docker compose restart php-apacheConfigured via Ofelia (in docker-compose.yaml):
- Archiving: Hourly (generates reports for all sites)
- Log Deletion: Daily at 2 AM (removes logs older than 180 days)
- Temp Cleanup: Daily at 3 AM (purges old archive data)
docker logs -f ofelia
# Manual test
docker exec matomo-php-apache php /var/www/html/console core:archivedocker compose logs -f
docker compose logs -f php-apache
docker compose logs -f sqldocker compose restart
docker compose restart php-apachedocker compose pull
docker compose up -d
docker image prune -fdocker compose ps sql
docker compose logs sql
docker exec matomo-sql mariadb-admin ping -uroot -p"${SQL_ROOT_PASSWORD}"docker logs ofelia
docker exec matomo-php-apache php /var/www/html/console core:archivedocker exec matomo-redis redis-cli -a "${REDIS_PASSWORD}" ping
docker compose logs redisSQL backups are created automatically by sqlbackup container:
- Frequency: Every 6 hours
- Location:
${BACKUPVOLUME}/matomo/ - Retention: Last 12 backups
- Compression: GZIP Level 9
docker exec matomo-sql mariadb-dump \
-uroot -p"${SQL_ROOT_PASSWORD}" \
--single-transaction \
MatomoDB > backup_$(date +%Y%m%d_%H%M%S).sqldocker compose down
docker compose up -d sql
docker exec -i matomo-sql mariadb -uroot -p"${SQL_ROOT_PASSWORD}" MatomoDB < backup.sql
docker compose up -dInstall QueuedTracking Plugin:
- In Matomo: Administration β Marketplace
- Search for "QueuedTracking" and install
- Add to
docker-compose.yaml:
- 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# In docker-compose.yaml
sql:
deploy:
resources:
limits:
memory: "8G" # from 4G to 8G
redis:
command:
- --maxmemory
- 2gb # from 1gb to 2gbUpdate configs/sql/custom.cnf:
innodb_buffer_pool_size = 6G # 75% of 8G- Matomo Documentation: https://matomo.org/guides/
- Traefik Labels: https://github.com/csaeum/DockerStackTraefik/blob/main/LABELS-CHECKLIST.md
- Ofelia CronJobs: https://github.com/csaeum/DockerStackOfelia
- Performance FAQ: https://matomo.org/faq/on-premise/how-to-configure-matomo-for-speed/
- β Initial Release
- β Optimized for 10-15 sites, ~500 users/day
- β Redis caching integration
- β Traefik security middlewares
- β Apache security config
- β Automatic backups
- β Ofelia CronJobs
- β Performance-optimized MariaDB
- β PHP 8.3 with OPcache + JIT
This project is licensed under the GPL-3.0-or-later License.
Made with β€οΈ by WSC - Web SEO Consulting
This project is free and open source. If it helped you, I appreciate your support:
- π Bug Reports: GitHub Issues
- π¬ Discussions: GitHub Discussions
- π§ Contact: info@web-seo-consulting.eu