Matomo в Docker Compose: готовый файл
Google Analytics передаёт данные о посетителях вашего сайта третьей стороне, требует баннер согласия на cookie и всё чаще блокируется рекламными фильтрами и VPN. Matomo — open-source аналитика, которая хранит всё на вашем сервере: вы сами решаете, что логировать, кому показывать дашборды и как долго держать данные. Ниже — рабочий docker-compose.yml, с которым Matomo поднимается на чистом VPS за одну команду, плюс нюансы, которые обычно всплывают уже после установки.
Содержание
Обсудить статью, задать вопрос или начать новую тему
Есть вопрос по этой статье, идея для обсуждения или просто хотите поделиться опытом? Сообщество MAATRIX ждёт. Для общения, пожалуйста, зарегистрируйтесь в нашем личном кабинете.
Перейти в сообщество →Что понадобится и почему именно Docker Compose
Matomo — это PHP-приложение поверх MySQL/MariaDB, и в его официальном образе уже есть Apache с настроенным PHP-FPM, поэтому связка получается короткой: контейнер с самой Matomo плюс контейнер с базой. Ставить это без Docker можно (пакеты для Ubuntu есть в репозиториях), но тогда вы вручную тянете PHP-модули нужных версий, настраиваете Apache/Nginx и следите за версией MySQL, которая должна быть Matomo-совместимой. Docker Compose снимает эту головную боль: один файл, один docker compose up -d, и версии зафиксированы явно.
Минимальные требования под реальную нагрузку (не тестовый стенд):
- 2 vCPU, 4 ГБ RAM — на старте достаточно, но при десятках тысяч визитов в сутки лучше сразу закладывать 8 ГБ, потому что MySQL и PHP-FPM вместе прожорливы на пике архивации отчётов;
- 20+ ГБ диска — сырые логи посещений растут быстрее, чем кажется, особенно если не настроена архивация старых данных;
- Ubuntu 24.04 с установленным Docker Engine и плагином
docker compose(не старымdocker-composeчерез pip).
Если сервера ещё нет — под Matomo с запасом на рост подойдёт любой VPS от 4 ГБ RAM; для проекта с заметным трафиком (сотни тысяч визитов) лучше сразу брать 8 ГБ и вынести MySQL на отдельный диск SSD.
Структура проекта и переменные окружения
Разложите проект так, чтобы пароли не лежали в docker-compose.yml открытым текстом:
matomo/
├── docker-compose.yml
├── .env
└── config/ # сюда Matomo сложит config.ini.php после установки
Файл .env:
MYSQL_ROOT_PASSWORD=сгенерируйте_длинный_пароль
MYSQL_DATABASE=matomo
MYSQL_USER=matomo
MYSQL_PASSWORD=ещё_один_длинный_пароль
MATOMO_DATABASE_HOST=db
Пароли сгенерируйте командой openssl rand -base64 24 — не используйте словарные фразы, база с сырыми IP-адресами и user-agent посетителей представляет интерес для взлома сама по себе.
Нужен сервер под эту задачу?
Разверните VPS MAATRIX за пару минут: NVMe, AMD EPYC, root-доступ, локации UK, США, Франция и РФ. Оплата картой РФ и по СБП.
Арендовать серверГотовый docker-compose.yml
Рабочий файл на два сервиса — MariaDB и Matomo, с volumes для персистентности данных и healthcheck на базу, чтобы Matomo не стартовал раньше, чем MySQL готов принимать соединения:
services:
db:
image: mariadb:10.11
restart: unless-stopped
environment:
MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}
MYSQL_DATABASE: ${MYSQL_DATABASE}
MYSQL_USER: ${MYSQL_USER}
MYSQL_PASSWORD: ${MYSQL_PASSWORD}
volumes:
- db_data:/var/lib/mysql
command: --max-allowed-packet=64MB
healthcheck:
test: ["CMD", "healthcheck.sh", "--connect", "--innodb_initialized"]
interval: 10s
timeout: 5s
retries: 6
matomo:
image: matomo:5-apache
restart: unless-stopped
depends_on:
db:
condition: service_healthy
environment:
MATOMO_DATABASE_HOST: db
MATOMO_DATABASE_USERNAME: ${MYSQL_USER}
MATOMO_DATABASE_PASSWORD: ${MYSQL_PASSWORD}
MATOMO_DATABASE_DBNAME: ${MYSQL_DATABASE}
ports:
- "127.0.0.1:8080:80"
volumes:
- matomo_data:/var/www/html
- ./config:/var/www/html/config
volumes:
db_data:
matomo_data:
Обратите внимание на ports: "127.0.0.1:8080:80" — порт пробрасывается только на localhost, наружу Matomo будет отдан через reverse proxy с SSL (раздел ниже). Открывать 8080 в интернет напрямую не стоит: страница установки без пароля и без TLS — это открытая дверь на первые несколько минут жизни контейнера.
Поднимаем:
docker compose up -d
docker compose ps
Через 20–30 секунд оба контейнера должны быть healthy/running. Логи первого старта Matomo (создание таблиц) смотрите так:
docker compose logs -f matomo
Первичная настройка через веб-мастер
Пока сервис доступен только на localhost, зайдите через SSH-туннель:
ssh -L 8080:127.0.0.1:8080 user@ваш-сервер
Откройте http://127.0.0.1:8080 в браузере — запустится мастер установки Matomo:
- Проверка системных требований (все зависимости уже в образе, проблем обычно нет).
- Подключение к базе — данные уже прописаны через переменные окружения, мастер их подхватит автоматически.
- Создание таблиц.
- Создание учётной записи суперпользователя — здесь задайте отдельный сложный пароль, это не тот же пароль, что у MySQL.
- Настройка первого сайта — домен, часовой пояс, тип сайта (обычный сайт, мобильное приложение и т.д.).
- Мастер выдаст код трекинга — JavaScript-сниппет для вставки на страницы сайта.
После завершения мастера файл config/config.ini.php появится в примонтированной директории на хосте — сохраните его в бэкапе отдельно, в нём хранится соль для токенов аутентификации.
Reverse proxy и SSL: выводим Matomo наружу
Аналитика без HTTPS бессмысленна — браузеры блокируют трекинг-скрипты со смешанным контентом, а данные посетителей будут идти открытым текстом. Проще всего повесить перед Matomo Traefik или Nginx с Let's Encrypt. Если у вас уже есть Traefik на сервере — читайте Traefik как reverse proxy для докера и просто добавьте лейблы к сервису matomo:
matomo:
# ...
ports: [] # убираем проброс на 8080, отдаём через Traefik
labels:
- "traefik.enable=true"
- "traefik.http.routers.matomo.rule=Host(`analytics.example.com`)"
- "traefik.http.routers.matomo.tls.certresolver=letsencrypt"
- "traefik.http.services.matomo.loadbalancer.server.port=80"
networks:
- traefik-net
Если Traefik не используется — работает связка Nginx + Certbot, конфиг стандартный: proxy_pass http://127.0.0.1:8080; плюс сертификат на поддомен analytics.example.com. Отдельный поддомен для аналитики — хорошая практика: часть рекламных блокировщиков режет пути вида /matomo/ или /piwik/, а на своём домене трекер живёт спокойнее.
Cron-задачи: архивация отчётов
Matomo умеет считать отчёты «на лету» при заходе в интерфейс, но на трафике от нескольких тысяч визитов в день это начинает тормозить дашборд. Правильный вариант — вынести архивацию в cron внутри контейнера:
# на хосте, в crontab пользователя
*/5 * * * * docker compose -f /path/to/matomo/docker-compose.yml exec -T matomo /usr/local/bin/php /var/www/html/console core:archive --url=https://analytics.example.com > /var/log/matomo-archive.log 2>&1
После этого в интерфейсе Matomo (Администрирование → Общие настройки → Архивация отчётов) отключите архивацию по браузерным запросам — это разгрузит PHP-FPM и уберёт задержки при открытии отчётов постфактум.
Резервное копирование
Два независимых актива, которые нужно бэкапить: дамп базы MySQL и файл config/config.ini.php (без него после восстановления базы Matomo не найдёт свои учётные данные и соль токенов).
#!/bin/bash
# backup-matomo.sh
DATE=$(date +%F)
docker compose exec -T db mysqldump -u root -p"${MYSQL_ROOT_PASSWORD}" matomo | gzip > /backups/matomo-db-${DATE}.sql.gz
cp /path/to/matomo/config/config.ini.php /backups/matomo-config-${DATE}.ini.php
find /backups -name "matomo-*" -mtime +14 -delete
Для более отказоустойчивой схемы с версионированием и внешним хранилищем есть отдельный разбор — автоматизация резервного копирования баз данных. Если проект уже вырос настолько, что MySQL стал узким местом, стоит заранее прочитать про установку MySQL на VPS — многие из советов по тюнингу (буферы InnoDB, лимиты соединений) применимы и к контейнерной MariaDB через переменную command: в compose-файле.
Обновление и обслуживание
Matomo сама подсказывает в админке, когда вышла новая версия. Обновление в Docker сводится к смене тега образа и пересозданию контейнера — файлы и база не теряются, потому что лежат в volumes:
# в docker-compose.yml поменять matomo:5-apache на конкретную нужную версию
docker compose pull matomo
docker compose up -d matomo
Дальше Matomo сама предложит применить миграции базы через веб-интерфейс или консольную команду console core:update. Перед крупным обновлением (смена мажорной версии) сделайте свежий дамп базы — откат на контейнерах без него будет означать полную переустановку.
Полезно вынести лимиты памяти PHP, если сайт с большим трафиком упирается в memory_limit:
matomo:
environment:
PHP_MEMORY_LIMIT: 512M
Нужен сервер под эту задачу?
Разверните VPS MAATRIX за пару минут: NVMe, AMD EPYC, root-доступ, локации UK, США, Франция и РФ. Оплата картой РФ и по СБП.
Арендовать серверНужны сами нейросети для контента?
Генерируйте изображения, видео и озвучку нейросетями на falapi.io — десятки моделей в одном окне. Оплата картой РФ и по СБП.
Частые вопросы
Можно ли использовать вместо MariaDB обычный MySQL?
Да, Matomo официально поддерживает оба варианта. Разница на практике минимальна, но если у вас уже есть накопленный опыт эксплуатации одной из СУБД — сравнение есть в статье MariaDB или MySQL: что выбрать для сервера.
Matomo действительно не передаёт данные Google или другим третьим лицам?
По умолчанию — нет, весь трафик и хранение остаются на вашем сервере. Единственное исключение — если вы сами включите плагины интеграции с внешними сервисами (например, импорт данных из Google Ads), тогда обмен идёт целенаправленно и явно, а не фоново.
Нужен ли баннер согласия на cookie при self-hosted Matomo?
Зависит от юрисдикции и настроек трекинга. Matomo умеет работать в режиме анонимизации IP и без персистентных cookie (visitor ID хранится иначе), что во многих странах снимает требование обязательного consent-баннера — но это вопрос локального законодательства, а не технической конфигурации, уточняйте у юриста для вашего случая.
Что делать, если после обновления версии Matomo контейнер не стартует?
Сначала смотрите docker compose logs matomo — почти всегда причина в незавершённой миграции базы. Откатите тег образа на предыдущий рабочий, восстановите дамп базы, затем обновляйтесь заново, обязательно проходя шаг core:update до конца.
Как перенести Matomo на другой сервер?
Скопируйте volume db_data (или его дамп) и matomo_data вместе с config/config.ini.php, поднимите тот же docker-compose.yml на новом сервере и восстановите данные до первого запуска — тогда мастер установки не запустится повторно и подхватит существующую конфигурацию.
Обсудить статью, задать вопрос или начать новую тему
Есть вопрос по этой статье, идея для обсуждения или просто хотите поделиться опытом? Сообщество MAATRIX ждёт. Для общения, пожалуйста, зарегистрируйтесь в нашем личном кабинете.
Перейти в сообщество →