Web-app-matomo Roleยถ
Description: Self-hosted, privacy-first web analytics platform for real-time visitor tracking and site metrics
Variablesยถ
author: Kevin Veen-Birkenbach
description: Self-hosted, privacy-first web analytics platform for real-time visitor tracking and site metrics
license: Infinito.Nexus Community License (Non-Commercial)
company: Kevin Veen-Birkenbach https://www.veen.world
galaxy_tags: [โmatomoโ, โdockerโ, โanalyticsโ, โopen-sourceโ]
issue_tracker_url: https://s.infinito.nexus/issues
min_ansible_version: 2.9
platforms: [{โnameโ: โArchLinuxโ, โversionsโ: [โallโ]}, {โnameโ: โDebianโ, โversionsโ: [โallโ]}, {โnameโ: โELโ, โversionsโ: [โallโ]}, {โnameโ: โFedoraโ, โversionsโ: [โallโ]}, {โnameโ: โUbuntuโ, โversionsโ: [โallโ]}]
READMEยถ
Matomoยถ
Descriptionยถ
Experience the power of Matomo, an innovative open-source analytics platform that delivers real-time insights, robust visitor tracking, and privacy-first features to elevate your website performance. Dive into actionable data with unmatched precision and clarity.
Overviewยถ
This role deploys Matomo using Docker, automating the setup of your analytics platform along with its underlying database. With support for health checks, persistent storage for configuration and data, and integration with an NGINX reverse proxy, Matomo is configured to provide reliable and scalable analytics for your digital presence.
Cosmosยถ
The diagram places Matomo in the Infinito.Nexus cosmos: the components it deploys (capabilities), the central services it consumes (dependencies), and its outward reach (federation and bridged external networks).
flowchart LR
subgraph deps [Dependencies]
dep_svc_bkp_volume_2_local["svc-bkp-volume-2-local ๐ป"]
dep_svc_db_mariadb["svc-db-mariadb ๐ณ๐"]
dep_svc_db_redis["svc-db-redis ๐ณ๐"]
dep_svc_net_tor["svc-net-tor ๐ณ๐"]
dep_web_app_dashboard["web-app-dashboard ๐ณ๐"]
dep_web_app_keycloak["web-app-keycloak ๐ณ๐"]
dep_web_app_prometheus["web-app-prometheus ๐ณ๐"]
dep_web_svc_css["web-svc-css ๐ป"]
dep_web_svc_logout["web-svc-logout ๐ณ๐"]
end
subgraph role [web-app-matomo ๐ณ๐]
svc_sso["sso โ"]
svc_logout["logout"]
svc_dashboard["dashboard"]
svc_matomo["matomo"]
svc_bootstrap["bootstrap"]
svc_mariadb["mariadb"]
svc_redis["redis"]
svc_css["css"]
svc_prometheus["prometheus"]
svc_tor["tor"]
svc_container_backup["container_backup"]
end
subgraph dependents [Dependents]
dpt_web_app_akaunting["web-app-akaunting ๐ณ๐"]
dpt_web_app_baserow["web-app-baserow ๐ณ๐"]
dpt_web_app_bigbluebutton["web-app-bigbluebutton ๐ณ๐"]
dpt_web_app_bluesky["web-app-bluesky ๐ณ๐"]
dpt_web_app_bookwyrm["web-app-bookwyrm ๐ณ๐"]
dpt_web_app_bridgy_fed["web-app-bridgy-fed ๐ณ๐"]
dpt_web_app_checkmk["web-app-checkmk ๐ณ๐"]
dpt_web_app_chess["web-app-chess ๐ณ๐"]
dpt_web_app_confluence["web-app-confluence ๐ณ๐"]
dpt_web_app_dashboard["web-app-dashboard ๐ณ๐"]
dpt_web_app_decidim["web-app-decidim ๐ณ๐"]
dpt_web_app_discourse["web-app-discourse ๐ณ๐"]
dpt_more["..."]
end
dep_svc_bkp_volume_2_local -. "0..1" .-> svc_container_backup
dep_svc_db_mariadb -. "0..1" .-> svc_mariadb
dep_svc_db_redis -. "0..1" .-> svc_redis
dep_svc_net_tor -. "0..1" .-> svc_tor
dep_web_app_dashboard -. "0..1" .-> svc_dashboard
dep_web_app_keycloak -- "0..0" --> svc_sso
dep_web_app_prometheus -. "0..1" .-> svc_prometheus
dep_web_svc_css -. "0..1" .-> svc_css
dep_web_svc_logout -. "0..1" .-> svc_logout
svc_sso -- "1:1" --> dpt_more
svc_sso -. "0..1" .-> dpt_web_app_akaunting
svc_sso -. "0..1" .-> dpt_web_app_baserow
svc_sso -. "0..1" .-> dpt_web_app_bigbluebutton
svc_sso -. "0..1" .-> dpt_web_app_bluesky
svc_sso -. "0..1" .-> dpt_web_app_bookwyrm
svc_sso -. "0..1" .-> dpt_web_app_bridgy_fed
svc_sso -. "0..1" .-> dpt_web_app_checkmk
svc_sso -. "0..1" .-> dpt_web_app_chess
svc_sso -. "0..1" .-> dpt_web_app_confluence
svc_sso -. "0..1" .-> dpt_web_app_dashboard
svc_sso -. "0..1" .-> dpt_web_app_decidim
svc_sso -. "0..1" .-> dpt_web_app_discourse
linkStyle 5 stroke:red;Solid 1:1 edges are fixed relationships; dashed 0..1 edges are
conditional (enabled only in matching deployments); red 0..0 edges
are turned off in this role. Node markers show the roleโs deploy modes
(๐ป host, ๐ณ compose, ๐ swarm); โ marks a service that is explicitly
turned off, and โ๏ธ an Ansible role dependency declared in
meta/main.yml.
Featuresยถ
Real-Time Analytics: Monitor visitor activity and generate detailed insights instantly.
Robust Tracking: Track user interactions across your website with comprehensive analytics tools.
Privacy-First: Enjoy a self-hosted solution that prioritizes data ownership and privacy.
Customizable Setup: Configure database connections, admin credentials, and server settings via environment variables and a TOML configuration file.
Scalable Deployment: Use Docker to ensure your analytics platform can grow with your traffic demands.
Quick Setupยถ
Developmentยถ
Clone, set up the workstation, and deploy Matomo onto the local stack:
git clone https://github.com/infinito-nexus/core.git
cd core
make onboard
make compose-deploy mode=reinstall apps=web-app-matomo full_cycle=false
Productionยถ
Run the published image to provision the inventory and deploy Matomo to a managed server (the mounted volume persists the inventory):
APP=web-app-matomo
HOST=<your-server>
DOMAIN=<your-domain>
TLS_MODE=self_signed
SSH_PUBLIC_KEY="<your-ssh-public-key>"
docker run --rm -it \
-v "$PWD/inventories:/etc/infinito.nexus/inventories" \
-e APP="$APP" -e HOST="$HOST" -e DOMAIN="$DOMAIN" -e TLS_MODE="$TLS_MODE" -e SSH_PUBLIC_KEY="$SSH_PUBLIC_KEY" \
ghcr.io/infinito-nexus/core/debian bash -c '
INVENTORY=/etc/infinito.nexus/inventories/production
infinito administration inventory provision "$INVENTORY" \
--inventory-file "$INVENTORY/devices.yml" \
--host "$HOST" \
--include "$APP" \
--vars "{\"TLS_MODE\": \"$TLS_MODE\", \"DOMAIN_PRIMARY\": \"$DOMAIN\", \"users\": {\"administrator\": {\"authorized_keys\": [\"$SSH_PUBLIC_KEY\"]}}}" &&
infinito administration deploy dedicated "$INVENTORY/devices.yml" \
--password-file "$INVENTORY/.password" \
--diff -vv'
Further Resourcesยถ
Persona contract opt-outsยถ
This role declares PERSONA_ADMINISTRATOR_BLOCKED and
PERSONA_BIBER_BLOCKED in templates/playwright.env.j2.
meta/services.yml pins sso.enabled: false โ Matomo holds no
Keycloak client, so the OIDC round-trip the shared helper waits for
never happens; the administrator signs in on Matomoโs native
index.php?module=Login form against the local superuser configured
in vars/main.yml. Biber is blocked for a different reason: the role
provisions exactly one Matomo account, that same superuser, and has no
per-user provisioning, so biber has no Matomo identity at all.
The administrator journey is covered bespoke in
files/playwright/auth.spec.js, which drives the native form and the
module=Login&action=logout sign-out. The same file owns the
deny-probe proving biber cannot reach the admin surface โ the
provider-side assertion the persona helpers deliberately no longer
duplicate. The path back to the generic personas is a Keycloak client
for Matomo plus group-driven user provisioning.
Creditsยถ
Implemented by Kevin Veen-Birkenbach. Part of the Infinito.Nexus Project and maintained by Kevin Veen-Birkenbach. Licensed under the Infinito.Nexus Community License (Non-Commercial).