This guide uses Docker Compose to run Matomo. The latest version is Matomo 5.7.1 (released February 3, 2026).
For Docker installation, see Docker.
mkdir matomo && cd matomo
Create a docker-compose.yml file:
version: '3.8'
services:
matomo:
image: matomo:5.7.1-apache
restart: unless-stopped
ports:
- "8080:80"
environment:
- MATOMO_DATABASE_HOST=db
- MATOMO_DATABASE_ADAPTER=mysql
- MATOMO_DATABASE_TABLES_PREFIX=matomo_
- MATOMO_DATABASE_USERNAME=matomo
- MATOMO_DATABASE_PASSWORD=matomo_password
- MATOMO_DATABASE_DBNAME=matomo
- PHP_MEMORY_LIMIT=512M
volumes:
- matomo_data:/var/www/html
depends_on:
- db
networks:
- matomo-network
db:
image: mysql:8.0
restart: unless-stopped
environment:
MYSQL_ROOT_PASSWORD: root_password
MYSQL_DATABASE: matomo
MYSQL_USER: matomo
MYSQL_PASSWORD: matomo_password
volumes:
- matomo_db:/var/lib/mysql
networks:
- matomo-network
volumes:
matomo_data:
matomo_db:
networks:
matomo-network:
driver: bridge
docker compose up -d
http://your-server-ip:8080 in your browserFor production use, set up a reverse proxy with SSL:
version: '3.8'
services:
matomo:
image: matomo:5.7.1-apache
restart: unless-stopped
expose:
- "80"
environment:
- MATOMO_DATABASE_HOST=db
- MATOMO_DATABASE_ADAPTER=mysql
- MATOMO_DATABASE_TABLES_PREFIX=matomo_
- MATOMO_DATABASE_USERNAME=matomo
- MATOMO_DATABASE_PASSWORD=matomo_password
- MATOMO_DATABASE_DBNAME=matomo
- MATOMO_PROXY_SSL=true
- MATOMO_URL=https://matomo.yourdomain.com
- PHP_MEMORY_LIMIT=512M
volumes:
- matomo_data:/var/www/html
depends_on:
- db
networks:
- matomo-network
db:
image: mysql:8.0
restart: unless-stopped
environment:
MYSQL_ROOT_PASSWORD: root_password
MYSQL_DATABASE: matomo
MYSQL_USER: matomo
MYSQL_PASSWORD: matomo_password
volumes:
- matomo_db:/var/lib/mysql
networks:
- matomo-network
nginx:
image: nginx:alpine
restart: unless-stopped
ports:
- "80:80"
- "443:443"
volumes:
- ./nginx.conf:/etc/nginx/nginx.conf
- ./ssl:/etc/nginx/ssl
depends_on:
- matomo
networks:
- matomo-network
volumes:
matomo_data:
matomo_db:
networks:
matomo-network:
driver: bridge
events {
worker_connections 1024;
}
http {
upstream matomo_backend {
server matomo:80;
}
server {
listen 80;
server_name matomo.yourdomain.com;
return 301 https://$server_name$request_uri;
}
server {
listen 443 ssl http2;
server_name matomo.yourdomain.com;
ssl_certificate /etc/nginx/ssl/cert.pem;
ssl_certificate_key /etc/nginx/ssl/key.pem;
location / {
proxy_pass http://matomo_backend;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
}
For better performance, disable browser archiving and set up a cron job:
# Create a cron job for archiving
docker exec -it matomo_matomo_1 crontab -e
# Or run archiving externally
docker exec -it matomo_matomo_1 /usr/local/bin/php /var/www/html/console core:archive --url=https://matomo.yourdomain.com
Add these environment variables to your docker-compose.yml:
environment:
- PHP_MEMORY_LIMIT=1G
- PHP_MAX_EXECUTION_TIME=300
- PHP_MAX_INPUT_TIME=300
- PHP_POST_MAX_SIZE=512M
- PHP_UPLOAD_MAX_FILESIZE=512M
# Backup database
docker exec matomo_db_1 mysqldump -u matomo -p matomo > matomo_backup_$(date +%Y-%m-%d).sql
# Restore database
docker exec -i matomo_db_1 mysql -u matomo -p matomo < matomo_backup.sql
# Backup volumes
docker run --rm -v matomo_data:/data -v $(pwd)/backup:/backup alpine tar czf /backup/matomo_data_$(date +%Y-%m-%d).tar.gz -C /data .
To update to the latest version:
# Pull the latest image
docker pull matomo:5.7.1-apache
# Update the docker-compose.yml to use the new version
# Then recreate the containers
docker compose down
docker compose up -d
Any questions?
Feel free to contact us. Find all contact information on our contact page.