Deutsch
Loslegen

← Alle Vorlagen · Analytics und Monitoring

Matomo mit einem Klick deployen

Open-Source-Webanalyse: die Alternative zu Google Analytics, die jeden Besuch behält

Eine selbst gehostete Alternative zu Google Analytics.

Was ist Matomo?

Matomo ist eine Open-Source-Plattform für Webanalyse und die bekannteste Alternative zu Google Analytics. Ein Tracking-Code auf den Seiten einer Website erfasst jeden Besuch, und die Berichte zeigen Besuche, Seiten, Einstiegs- und Ausstiegsseiten, Verweise, Suchmaschinen, Kampagnen, Länder, Geräte, Ziele und E-Commerce-Umsätze, dazu kommen Segmente, Anmerkungen, geplante Berichte per E-Mail und eine HTTP-API. Das „Besucher-Log“ und „Echtzeit“ zeigen Besuche, während sie passieren, die Daten beruhen nie auf Stichproben, und Matomo Tag Manager gehört dazu. Laut Matomo nutzen es mehr als eine Million Organisationen.

Diese Vorlage betreibt Matomo On-Premise, die kostenlose Edition unter der GPL v3, aus dem offiziellen Image mit MariaDB. Der Hauptadministrator und die erste Website werden aus den Feldern angelegt, bevor die Seite irgendwem antwortet, sodass niemand, der die Adresse öffnet, den Installer von Matomo zu sehen bekommt. Die IP-Adresse jedes Besuchs wird anonymisiert, wie Matomo es standardmäßig tut; die kostenlose Standortdatenbank von DB-IP wird heruntergeladen und jeden Monat aktualisiert; und ein Archivierungsprozess verarbeitet die Berichte alle 15 Minuten, wie es die „Systemprüfung“ von Matomo verlangt. Kostenpflichtige Plugins wie Heatmap & Session Recording, Funnels, A/B Testing und Form Analytics gibt es im Marketplace von Matomo.

Matomo-Hosting auf Pethost

  1. Du meldest dich bei Pethost an, mit Passkey, GitHub oder Google. Noch keine Maschine? Du wählst einen Tarif, und der Link wartet, bis sie bereit ist.
  2. „Neues Projekt“ öffnet sich bei Matomo. Du füllst aus, was die App braucht, und klickst auf „Projekt erstellen“: Benutzername, E-Mail, Admin-Passwort, Zu messende Website.
  3. In ein, zwei Minuten läuft Matomo unter eigener Adresse mit HTTPS. Die Secrets werden zufällig erzeugt, und die Daten sind im nächtlichen Backup.
  4. Es ist ein Projekt wie jedes andere: Du oder dein Agent könnt es ändern, zurückrollen oder wiederherstellen.

Fragen zu Matomo

Ist Matomo kostenlos?

Ja. Matomo On-Premise, das diese Vorlage betreibt, ist kostenlos und Open Source unter der GPL v3 oder neuer. Matomo Cloud ist das gehostete Angebot des Herstellers, und die Premium-Plugins in seinem Marketplace sind kostenpflichtig.

Matomo oder Google Analytics?

Beide zeigen Besuche, Traffic-Quellen, Ziele und E-Commerce. Matomo behält jeden Besuch ohne Stichproben in seiner eigenen Datenbank, dort, wo du es deployst, und anonymisiert IP-Adressen standardmäßig. Der Google Analytics Importer, ein kostenloses Plugin von Matomo, übernimmt die bisherigen Daten einer Google-Analytics-Property.

Brauche ich mit Matomo einen Cookie-Banner?

Das hängt davon ab, wo die Menschen sind, die deine Website besuchen, und wie Matomo eingerichtet ist. Matomo kann ohne Cookies tracken, und seine FAQ nennt die Bedingungen, unter denen die französische CNIL den Einsatz ohne Einwilligung erlaubt, etwa anonymisierte IP-Adressen, kein „Besucher-Log“ und keine User-ID. Anderswo kann trotzdem eine Einwilligung nötig sein.

Wie baue ich Matomo in meine Website ein?

Füg den Tracking-Code aus „Administration“ → „Webseiten“ → „Tracking-Code“ auf jeder Seite vor </head> ein, oder installier ihn mit Matomo Tag Manager. Auf der Integrationsseite von Matomo stehen Plugins für WordPress, Drupal, Joomla und viele andere Plattformen, die das für dich übernehmen.

Kann ich eine eigene Domain für Matomo nutzen?

Ja. Füg die Domain in Pethost zum Projekt hinzu, melde dich dann unter der Adresse des Projekts an und trag sie unter „Administration“ → „System“ → „Allgemeine Einstellungen“ → „Vertrauter Matomo Hostname“ ein. Bis dahin meldet Matomo auf dieser Domain niemanden an.

Wie aktualisiere ich Matomo?

Ändere den Image-Tag in der compose.yaml auf eine neuere Matomo-Version und deploy neu. Beim Start kopiert der Container das neue Matomo in sein Volume und aktualisiert die Datenbank, und Konfiguration, Plugins und Daten bleiben, wie sie waren.

Wie viel RAM und Speicherplatz braucht Matomo?

Matomo braucht mit MariaDB im Ruhezustand etwa 250 MB RAM, und seine Datenbank wächst um etwa 1 GB pro 5 Millionen Seitenaufrufe, wie Matomo schätzt. Auf Pethost reicht dafür der Tarif Starter, mit Platz für weitere Apps daneben.

Matomo: die Docker-Compose-Datei

Die Vorlage ist diese compose.yaml und die Variablen, die beim Erstellen in die .env des Projekts geschrieben werden. Pethost führt die Datei so aus, wie sie geschrieben ist.

Container: matomo (matomo:5.14-apache), archiver (matomo:5.14-apache), mariadb (mariadb:11.8).

Volumes, im nächtlichen Backup: 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:

Mehr in Analytics und Monitoring