← Todas las plantillas · Analítica y monitoreo
Despliega Matomo en un clic
Analítica web de código abierto, la alternativa a Google Analytics que conserva cada visita
Una alternativa autoalojada a Google Analytics.
¿Qué es Matomo?
Matomo es una plataforma de analítica web de código abierto y la alternativa más conocida a Google Analytics. Un código de seguimiento en las páginas de un sitio registra cada visita, y los informes muestran visitantes, páginas, páginas de entrada y de salida, referencias, motores de búsqueda, campañas, países, dispositivos, objetivos y ventas de comercio electrónico, con segmentos, anotaciones, envío programado de informes por correo y una API HTTP. En “Registro de visitas” y “Tiempo real” las visitas se ven a medida que ocurren, los datos nunca se muestrean y Matomo Tag Manager viene incluido. Según Matomo, lo usan más de un millón de organizaciones.
Esta plantilla ejecuta Matomo On-Premise, la edición gratuita bajo la GPL v3, desde la imagen oficial con MariaDB. El Superusuario y el primer sitio web se crean con los datos de los campos antes de que la página responda a nadie, así que el instalador de Matomo nunca queda abierto a ningún visitante. Las direcciones IP de los visitantes se anonimizan, como hace Matomo por defecto; la base de datos gratuita de ubicaciones de DB-IP se descarga y se actualiza cada mes; y el archivado de los informes se ejecuta cada 15 minutos, como pide la “Comprobación del sistema” de Matomo. Los plugins de pago, como Heatmap & Session Recording, Funnels, A/B Testing y Form Analytics, se obtienen en el “Mercado” de Matomo.
Hosting de Matomo en Pethost
- Inicias sesión en Pethost con una passkey, GitHub o Google. ¿Aún no tienes máquina? Eliges un plan, y el enlace espera hasta que esté lista.
- Nuevo proyecto se abre en Matomo. Rellenas lo que pide y haces clic en Crear proyecto: Nombre de usuario, Correo electrónico, Contraseña de administrador, Sitio web que medir.
- En un par de minutos Matomo está en marcha en su propia dirección con HTTPS. Sus secretos se generan al azar, y sus datos entran en el backup de cada noche.
- Es un proyecto como cualquier otro: tú o tu agente lo pueden cambiar, volver a una versión anterior o restaurar.
Preguntas sobre Matomo
¿Matomo es gratis?
Sí. Matomo On-Premise, la edición que ejecuta esta plantilla, es gratis y de código abierto bajo la GPL v3 o posterior. Matomo Cloud es el servicio alojado de su fabricante, y los plugins premium de su “Mercado” son de pago.
¿Matomo o Google Analytics?
Los dos ofrecen informes de visitas, fuentes de tráfico, objetivos y comercio electrónico. Matomo conserva todas las visitas, sin muestreo, en su propia base de datos, donde lo despliegues, y anonimiza las direcciones IP por defecto. Google Analytics Importer, un plugin gratuito de Matomo, trae el historial de una propiedad de Google Analytics.
¿Necesito un banner de cookies con Matomo?
Depende de dónde estén tus visitantes y de cómo esté configurado Matomo. Matomo puede hacer el seguimiento sin cookies, y sus preguntas frecuentes enumeran las condiciones en las que la CNIL de Francia le permite funcionar sin consentimiento, como anonimizar las direcciones IP y no usar el “Registro de visitas” ni el User ID. En otros lugares, el consentimiento puede seguir siendo necesario.
¿Cómo agrego Matomo a mi sitio web?
Pega el código de seguimiento de Administración → Sitios de internet → Código de seguimiento antes de </head> en cada página, o instálalo con Matomo Tag Manager. La página de integraciones de Matomo enumera plugins para WordPress, Drupal, Joomla y muchas otras plataformas que lo agregan por ti.
¿Puedo usar mi propio dominio para Matomo?
Sí. Agrega el dominio al proyecto en Pethost y luego, con la sesión iniciada en la dirección del proyecto, agrégalo en Administración → Sistema → Ajustes generales → Nombre del servidor de confianza de Matomo. Hasta entonces, Matomo no deja que nadie inicie sesión en ese dominio.
¿Cómo actualizo Matomo?
Cambia el tag de la imagen en el compose.yaml por el de una versión más reciente de Matomo y despliega. Al iniciarse, el contenedor copia el nuevo Matomo en su volumen y actualiza la base de datos, y la configuración, los plugins y los datos quedan como estaban.
¿Cuánta memoria y disco necesita Matomo?
Matomo ocupa unos 250 MB de memoria con MariaDB en reposo, y su base de datos crece alrededor de 1 GB por cada 5 millones de páginas vistas, según estima Matomo. En Pethost le basta el plan Starter, y queda sitio para otras apps a su lado.
El archivo Docker Compose de Matomo
La plantilla es este compose.yaml y las variables que se escriben en el .env del proyecto al crearlo. Pethost ejecuta el archivo tal como está escrito.
Contenedores: matomo (matomo:5.14-apache), archiver (matomo:5.14-apache), mariadb (mariadb:11.8).
Volúmenes, en el backup de cada noche: matomo, db.
services:
matomo:
image: matomo:5.14-apache
restart: unless-stopped
environment:
HOST: ${HOST}
MARIADB_PASSWORD: ${MARIADB_PASSWORD}
ADMIN_USERNAME: ${ADMIN_USERNAME}
ADMIN_EMAIL: ${ADMIN_EMAIL}
ADMIN_PASSWORD: ${ADMIN_PASSWORD}
WEBSITE: ${WEBSITE}
# Matomo's code is kept in the volume with its config, plugins and data, as the image does.
# The image copies it there at the first start; this copies it again when the image brings a
# newer Matomo than the volume holds (Matomo's own one-click update may have put a newer one
# there already), and then updates the database.
#
# A new Matomo offers its installer, which makes the Super User, to whoever opens it first. So
# while it is not installed, the installer runs on port 8081, which nobody reaches, and is
# filled in there: the database, the Super User from the username, email and password given,
# the website to track, and Matomo's own defaults for the rest. Only then does Apache answer
# on port 80. A refusal stops it and says why in its log, and the installer is tried again at
# the next start.
command:
- sh
- -c
- |
set -e
cd /var/www/html
as_matomo() { runuser -u www-data -- "$$@"; }
version() { sed -n "s/.*const VERSION = '\(.*\)';/\1/p" "$$1/core/Version.php"; }
if php -r 'exit(version_compare($$argv[1], $$argv[2], ">") ? 0 : 1);' "$$(version /usr/src/matomo)" "$$(version .)"; then
echo "Matomo $$(version /usr/src/matomo) into the volume, over $$(version .)"
tar cf - --one-file-system -C /usr/src/matomo . | tar xf -
chown -R www-data:www-data .
fi
# MariaDB may still be starting, as after a restart of the project.
until php -r 'new PDO("mysql:host=mariadb;dbname=matomo", "matomo", getenv("MARIADB_PASSWORD"));' 2> /dev/null; do sleep 2; done
installed() {
php -r '$$c = @parse_ini_file("config/config.ini.php", true);
exit(!empty($$c["database"]["username"]) && empty($$c["General"]["installation_in_progress"]) ? 0 : 1);'
}
if ! installed; then
echo "installing Matomo on a port nobody reaches"
as_matomo php -S 127.0.0.1:8081 -t . > /tmp/installer.log 2>&1 &
installer=$$!
# Each step is sent as the project's proxy sends a visitor's request, so Matomo sets
# itself up behind it: the address, HTTPS, and the visitor's IP from X-Forwarded-For.
step() {
action=$$1
shift
curl -sS -o /tmp/step.html -w '%{http_code}' -H "Host: $$HOST" -H 'X-Forwarded-For: 127.0.0.1' -H 'X-Forwarded-Proto: https' \
"$$@" "http://127.0.0.1:8081/index.php?module=Installation&action=$$action"
}
refused() {
php -r 'preg_match("~<div class=\"alert alert-(?:warning|danger)\">(.*?)</div>~s", file_get_contents("/tmp/step.html"), $$m);
fwrite(STDERR, "Matomo refused the " . $$argv[1] . ": " . trim(preg_replace("~\s+~", " ", html_entity_decode(strip_tags($$m[1] ?? "")))) . "\n");' "$$1"
kill $$installer
exit 1
}
until curl -s -o /dev/null http://127.0.0.1:8081/; do sleep 1; done
[ "$$(step databaseSetup --data-urlencode host=mariadb --data-urlencode username=matomo --data-urlencode "password=$$MARIADB_PASSWORD" \
--data-urlencode dbname=matomo --data-urlencode tables_prefix=matomo_ --data-urlencode 'adapter=PDO\MYSQL' --data-urlencode schema=Mariadb)" = 302 ] \
|| refused database
# The tables, made new, or kept and updated where an earlier start made them.
step tablesCreation > /dev/null
step reuseTables > /dev/null
# A Super User made by an earlier start is kept, and this step skipped.
[ "$$(step setupSuperUser --data-urlencode "login=$$ADMIN_USERNAME" --data-urlencode "password=$$ADMIN_PASSWORD" \
--data-urlencode "password_bis=$$ADMIN_PASSWORD" --data-urlencode "email=$$ADMIN_EMAIL")" = 302 ] \
|| refused "Super User"
case "$$WEBSITE" in
*://*) website=$$WEBSITE ;;
*) website=https://$$WEBSITE ;;
esac
name=$${website#*://}
name=$${name%%/*}
[ "$$(step firstWebsiteSetup --data-urlencode "siteName=$$name" --data-urlencode "url=$$website" \
--data-urlencode timezone=UTC --data-urlencode ecommerce=0)" = 302 ] \
|| refused website
# Matomo's defaults: visitors' IPs anonymised, and DB-IP's free location database
# downloaded now and every month.
[ "$$(step finished --data-urlencode anonymise_ip=1 --data-urlencode setup_geoip2=1 --data-urlencode submit=1)" = 302 ] \
|| refused settings
kill $$installer
wait $$installer 2> /dev/null || true
# What Matomo's System Check asks for: HTTPS only, which the proxy always serves, and the
# reports processed by the archiver below rather than as they are opened.
as_matomo php console config:set --section=General --key=force_ssl --value=1
as_matomo php console config:set --section=General --key=enable_browser_archiving_triggering --value=0
echo "Matomo is installed, with the Super User $$ADMIN_USERNAME"
fi
as_matomo php console core:update --yes --no-interaction \
|| echo "Matomo's database update failed: its page says how to finish it" >&2
exec apache2-foreground
volumes:
- matomo:/var/www/html
depends_on:
mariadb:
condition: service_healthy
# Matomo's reports, processed in the background every 15 minutes, as Matomo advises; the Visits
# Log and Real-time show visits at once. Its own entrypoint, so the image's does not copy Matomo
# into the volume a second time.
archiver:
image: matomo:5.14-apache
restart: unless-stopped
init: true
environment:
HOST: ${HOST}
entrypoint:
- sh
- -c
- |
cd /var/www/html
while :; do
if grep -q '^\[database\]' config/config.ini.php 2>/dev/null && ! grep -q '^installation_in_progress' config/config.ini.php; then
runuser -u www-data -- php console core:archive --url="https://$$HOST/" || true
sleep 900
else
sleep 10
fi
done
volumes:
- matomo:/var/www/html
depends_on:
- matomo
mariadb:
image: mariadb:11.8
restart: unless-stopped
stop_grace_period: 15s
# Matomo asks for packets of 64 MB at least.
command: --max-allowed-packet=64M
environment:
MARIADB_AUTO_UPGRADE: "1"
MARIADB_DATABASE: matomo
MARIADB_USER: matomo
MARIADB_PASSWORD: ${MARIADB_PASSWORD}
MARIADB_ROOT_PASSWORD: ${MARIADB_ROOT_PASSWORD}
volumes:
- db:/var/lib/mysql
healthcheck:
test: ["CMD", "healthcheck.sh", "--connect", "--innodb_initialized"]
interval: 5s
timeout: 5s
retries: 10
start_period: 30s
volumes:
matomo:
db:
Más en Analítica y monitoreo
- UmamiAnalítica web para tus sitios, sin cookies
- Uptime KumaMonitores de disponibilidad con alertas y páginas de estado
- KenerUna página de estado con monitores de disponibilidad e incidentes
- BeszelMonitoreo ligero de servidores: CPU, memoria, disco, red y estadísticas de Docker, con historial y alertas
- changedetection.ioUn monitor de páginas web que te avisa cuando cambian: precios, disponibilidad, noticias
- CheckmateMonitoreo de disponibilidad, velocidad de páginas e infraestructura, con páginas de estado