π³ Matomo (formerly Piwik) Docker image based on Alpine Linux and Nginx.
If you are interested, check out my other π³ Docker images!
- Alpine Linux 3.8, Nginx, PHP 7.2
- Tarball authenticity checked during building process
- Config, plugins and user preferences in the same folder
- GeoLite data created by MaxMind for geolocation
- Cron tasks to archive Matomo reports and update GeoLite data as a "sidecar" container
- Ability to pass additional options during cron archive
- Plugins and config are kept across upgrades of this image
- SSMTP for SMTP relay to send emails
- OPCache enabled to store precompiled script bytecode in shared memory
- Redis enabled and ready to enhance server performance
- Traefik as reverse proxy and creation/renewal of Let's Encrypt certificates
- Redis image ready to use as Redis cache or QueuedTracking plugin for better scalability
- MariaDB image as database instance
- Cron jobs as a "sidecar" container
TZ
: The timezone assigned to the container (default:UTC
)MEMORY_LIMIT
: PHP memory limit (default:256M
)UPLOAD_MAX_SIZE
: Upload max size (default:16M
)OPCACHE_MEM_SIZE
: PHP OpCache memory consumption (default:128
)LOG_LEVEL
: Log level of Matomo UI (default:WARN
)SIDECAR_CRON
: Mark the container as a sidecar cron job (default:0
)SSMTP_HOST
: SMTP server hostSSMTP_PORT
: SMTP server port (default:25
)SSMTP_HOSTNAME
: Full hostname (default:$(hostname -f)
)SSMTP_USER
: SMTP usernameSSMTP_PASSWORD
: SMTP passwordSSMTP_TLS
: SSL/TLS (default:NO
)
The following environment variables are only used if you run the container as "sidecar" mode :
ARCHIVE_OPTIONS
: Pass additional options during cron archiveCRON_GEOIP
: Periodically update GeoIP data (disabled if empty ; ex0 4 * * *
)CRON_ARCHIVE
: Periodically execute Matomo archive (disabled if empty ; ex0 * * * *
)
/data
: Contains GeoIP databases, configuration, installed plugins (not core ones), tmp and user folders to store your custom logo
80
: HTTP port
Docker compose is the recommended way to run this image. Copy the content of folder examples/compose in /var/matomo/
on your host for example. Edit the compose and env files with your preferences and run the following commands :
touch acme.json
chmod 600 acme.json
docker-compose up -d
docker-compose logs -f
You can also use the following minimal command :
docker run -d -p 80:80 --name matomo \
-v $(pwd)/data:/data \
crazymax/matomo:latest
On a HA environment, enable backend sticky sessions on your load balancer.
If you want to enable the cron job, you have to run a "sidecar" container like in the docker-compose file or run a simple container like this :
docker run -d --name matomo-cron \
--env-file $(pwd)/matomo.env \
-e "SIDECAR_CRON=1" \
-e "CRON_ARCHIVE=0 * * * *" \
-e "ARCHIVE_OPTIONS=--concurrent-requests-per-website=3" \
-v $(pwd)/data:/data \
crazymax/matomo:latest
Then if you have enabled CRON_ARCHIVE
to automatically archive the reports, you have to disable Matomo archiving to trigger from the browser. Go to System > General settings :
As GeoIP module for Nginx is installed and uses GeoIP data, you have to select GeoIP (HTTP Server Module) in System > Geolocation :
If you are running Matomo behind a reverse proxy, add this to your config.ini.php :
[General]
assume_secure_protocol = 1 # 0=http 1=https
proxy_client_headers[] = HTTP_X_FORWARDED_FOR
proxy_client_headers[] = HTTP_X_REAL_IP
proxy_host_headers[] = HTTP_X_FORWARDED_HOST
To use Redis as a cache (useful if your Matomo environment consists of multiple servers), add this to your config.ini.php :
[Cache]
backend = chained
[ChainedCache]
backends[] = array
backends[] = redis
[RedisCache]
host = "redis" # Docker service name for Redis
port = 6379
timeout = 0.0
password = ""
database = 14
In case you are using queued tracking: Make sure to configure a different database! Otherwise queued requests will be flushed.
If you are on a HA environment, there is no need to set multi_server_environment = 1
in your config.
matomo_watch_plugins script will take care of plugins synchronization from /data/plugins/
to /var/www/plugins/
.
You can upgrade Matomo automatically through the UI, it works well. But I recommend to recreate the container whenever I push an update :
docker-compose pull
docker-compose up -d
All kinds of contributions are welcome π!
The most basic way to show your support is to star π the project, or to raise issues π¬
But we're not gonna lie to each other, I'd rather you buy me a beer or two π»!
MIT. See LICENSE
for more details.