← 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
- 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.
- „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.
- 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.
- 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
- UmamiWebanalyse für deine Websites, ohne Cookies
- Uptime KumaUptime-Monitoring mit Benachrichtigungen und Statusseiten
- KenerEine Statusseite mit Uptime-Monitoren und Störungsmeldungen
- BeszelSchlankes Server-Monitoring: CPU, RAM, Festplatte, Netzwerk und Docker-Statistiken, mit Verlauf und Alerts
- changedetection.ioÜberwacht Webseiten und sagt dir, wenn sie sich ändern: Preise, Verfügbarkeit, Neuigkeiten
- CheckmateÜberwachung von Erreichbarkeit, Ladezeiten und Servern, mit Statusseiten