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).