Matomo (ehemals Piwik) ist eine Open-Source Web-Analyse-Plattform. Als selbst gehostete Alternative zu Google Analytics ermöglicht sie DSGVO-konforme Besucherstatistiken.
Warum Matomo?
Vorteile
- 100% Datenhoheit
- DSGVO-konform möglich
- Kein Cookie-Banner nötig (bei cookieloser Nutzung)
- Echtzeit-Statistiken
- Heatmaps, Session Recording
- E-Commerce-Tracking
- Custom Reports
- API-Zugriff
Matomo vs Google Analytics
| Aspekt | Matomo | Google Analytics |
|---|
| Hosting | Selbst | Google |
| Datenhoheit | 100% | Bei Google |
| DSGVO | Konform | Problematisch |
| Cookie-Banner | Optional | Erforderlich |
| Kosten | Free/Premium | Free/Premium |
Voraussetzungen
Systemanforderungen
- PHP 7.4+ (8.x empfohlen)
- MySQL 5.7+ / MariaDB 10.2+
- 128 MB RAM (256+ empfohlen)
- Apache/Nginx
PHP-Erweiterungen
apt install php8.2-fpm php8.2-mysql php8.2-xml php8.2-curl php8.2-gd php8.2-mbstring php8.2-cli
Installation
Datenbank erstellen
CREATE DATABASE matomo CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
CREATE USER 'matomo'@'localhost' IDENTIFIED BY 'sicheres_passwort';
GRANT ALL ON matomo.* TO 'matomo'@'localhost';
FLUSH PRIVILEGES;
Matomo herunterladen
cd /var/www
wget https://builds.matomo.org/matomo-latest.zip
unzip matomo-latest.zip
chown -R www-data:www-data matomo
chmod -R 755 matomo
Nginx-Konfiguration
# /etc/nginx/sites-available/matomo
server {
listen 80;
server_name analytics.example.de;
return 301 https://$host$request_uri;
}
server {
listen 443 ssl http2;
server_name analytics.example.de;
ssl_certificate /etc/letsencrypt/live/analytics.example.de/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/analytics.example.de/privkey.pem;
root /var/www/matomo;
index index.php;
# Logging
access_log /var/log/nginx/matomo.access.log;
error_log /var/log/nginx/matomo.error.log;
location / {
try_files $uri $uri/ /index.php?$args;
}
# PHP
location ~ \.php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/run/php/php8.2-fpm.sock;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
}
# Matomo-spezifische Regeln
location ~ ^/(config|tmp|core|lang) {
deny all;
return 403;
}
location ~ /\.ht {
deny all;
return 403;
}
location ~ js/container_.*_preview\.js$ {
expires off;
add_header Cache-Control 'private, no-cache, no-store';
}
location ~ \.(gif|ico|jpg|png|svg|js|css|htm|html|mp3|mp4|wav|ogg|avi|ttf|eot|woff|woff2)$ {
allow all;
expires 1y;
add_header Pragma public;
add_header Cache-Control "public";
}
}
Web-Installation
1. https://analytics.example.de aufrufen
2. Systemcheck durchführen
3. Datenbank-Verbindung:
- Host: localhost
- User: matomo
- Password: sicheres_passwort
- Database: matomo
4. Super-User erstellen
5. Erste Website hinzufügen
6. Tracking-Code erhalten
Tracking-Code
Standard JavaScript
<!-- Matomo -->
<script>
var _paq = window._paq = window._paq || [];
_paq.push(['trackPageView']);
_paq.push(['enableLinkTracking']);
(function() {
var u="https://analytics.example.de/";
_paq.push(['setTrackerUrl', u+'matomo.php']);
_paq.push(['setSiteId', '1']);
var d=document, g=d.createElement('script'), s=d.getElementsByTagName('script')[0];
g.async=true; g.src=u+'matomo.js'; s.parentNode.insertBefore(g,s);
})();
</script>
<!-- End Matomo Code -->
Cookieless Tracking (DSGVO)
<script>
var _paq = window._paq = window._paq || [];
// Keine Cookies setzen
_paq.push(['disableCookies']);
_paq.push(['trackPageView']);
_paq.push(['enableLinkTracking']);
(function() {
var u="https://analytics.example.de/";
_paq.push(['setTrackerUrl', u+'matomo.php']);
_paq.push(['setSiteId', '1']);
var d=document, g=d.createElement('script'), s=d.getElementsByTagName('script')[0];
g.async=true; g.src=u+'matomo.js'; s.parentNode.insertBefore(g,s);
})();
</script>
PHP Tracking (serverseitig)
<?php
require_once '/var/www/matomo/MatomoTracker.php';
$matomoTracker = new MatomoTracker(1, 'https://analytics.example.de/');
$matomoTracker->setUrl($_SERVER['REQUEST_URI']);
$matomoTracker->doTrackPageView($_SERVER['REQUEST_URI']);
DSGVO-Konfiguration
IP-Anonymisierung
Administration → Privatsphäre → Daten anonymisieren
- IP-Adressen anonymisieren: Ja
- Anzahl Bytes: 2 (empfohlen)
Daten löschen
Administration → Privatsphäre → Daten löschen
- Alte Logs regelmäßig löschen: Ja
- Logs löschen älter als: 180 Tage
- Alte Reports löschen: Optional
Opt-Out iFrame
<iframe
style="border: 0; height: 200px; width: 600px;"
src="https://analytics.example.de/index.php?module=CoreAdminHome&action=optOut&language=de">
</iframe>
Do Not Track
Administration → Privatsphäre → Benutzer-Privatsphäre
- Do Not Track respektieren: Ja
Cron-Archivierung
Einrichten
# Tracking-Archivierung per Cron (nicht Browser)
# /etc/cron.d/matomo
5 * * * * www-data /usr/bin/php /var/www/matomo/console core:archive --url=https://analytics.example.de/ > /dev/null
Browser-Archivierung deaktivieren
Administration → System → Allgemeine Einstellungen
- Archivierung bei Browseranfrage: Nein
Plugins
Installation
Administration → Plattform → Marketplace
Oder manuell in /var/www/matomo/plugins/
Empfohlene Plugins
# Kostenlos
CustomDimensions # Benutzerdefinierte Dimensionen
TagManager # Tag-Management
LogViewer # Echtzeit-Logs
SecurityInfo # Sicherheitsprüfung
# Premium
HeatmapSessionRecording # Heatmaps
FormAnalytics # Formular-Analyse
MediaAnalytics # Video/Audio Tracking
Tag Manager
Aktivieren
Administration → Plattform → Marketplace → Tag Manager
Container erstellen
Tag Manager → Neuer Container
Container-Code in Website einfügen
Tag Manager → Tags → Neuer Tag
Trigger:
- Pageview
- Click
- Form Submit
- Custom Event
Benutzerrollen
Rollen
| Rolle | Rechte |
|---|
| View | Nur Ansicht |
| Write | Ziele bearbeiten |
| Admin | Website-Einstellungen |
| Super User | Voller Zugriff |
Benutzer hinzufügen
Administration → System → Benutzer → Benutzer hinzufügen
API-Zugriff
Token erstellen
Administration → Plattform → API → Token generieren
API-Abfragen
# Besucher heute
curl "https://analytics.example.de/index.php?module=API&method=VisitsSummary.getVisits&idSite=1&period=day&date=today&format=JSON&token_auth=YOUR_TOKEN"
# Live-Besucher
curl "https://analytics.example.de/index.php?module=API&method=Live.getCounters&idSite=1&lastMinutes=30&format=JSON&token_auth=YOUR_TOKEN"
PHP-Client
<?php
$matomoUrl = 'https://analytics.example.de/';
$token = 'YOUR_TOKEN';
$siteId = 1;
$url = $matomoUrl . '?module=API'
. '&method=VisitsSummary.get'
. '&idSite=' . $siteId
. '&period=day&date=today'
. '&format=JSON'
. '&token_auth=' . $token;
$data = json_decode(file_get_contents($url), true);
echo "Besucher heute: " . $data['nb_visits'];
GeoIP2
# GeoIP-Datenbank
cd /var/www/matomo/misc
wget https://download.db-ip.com/free/dbip-city-lite-2026-01.mmdb.gz
gunzip dbip-city-lite-2026-01.mmdb.gz
mv dbip-city-lite-2026-01.mmdb DBIP-City.mmdb
Administration → System → Geolocation
Provider: DBIP / GeoIP 2
QueuedTracking
Marketplace → QueuedTracking installieren
Verarbeitet Tracking-Requests über Queue (Redis/MySQL)
MySQL-Optimierung
-- Für große Installationen
SET GLOBAL innodb_buffer_pool_size = 1073741824; -- 1GB
SET GLOBAL innodb_log_file_size = 268435456; -- 256MB
Updates
Automatisch (Empfohlen)
Administration → System → Allgemeine Einstellungen
- Automatische Updates: Aktiviert
Manuell
cd /var/www/matomo
php console core:update
Per Download
cd /var/www
wget https://builds.matomo.org/matomo-latest.zip
unzip -o matomo-latest.zip
chown -R www-data:www-data matomo
Backup
Datenbank
mysqldump -u matomo -p matomo > matomo-backup-$(date +%Y-%m-%d).sql
Konfiguration
cp /var/www/matomo/config/config.ini.php ~/matomo-config-backup.php
Vollständig
tar -czf matomo-backup-$(date +%Y-%m-%d).tar.gz /var/www/matomo
Troubleshooting
Keine Daten
# Tracking-Log prüfen
tail -f /var/www/matomo/tmp/logs/matomo.log
# Cron-Archivierung prüfen
/usr/bin/php /var/www/matomo/console core:archive --url=https://analytics.example.de/
Langsame Reports
- Cron-Archivierung einrichten
- Browser-Archivierung deaktivieren
- QueuedTracking verwenden
- MySQL optimieren
Berechtigungsfehler
chown -R www-data:www-data /var/www/matomo
chmod -R 755 /var/www/matomo
chmod -R 777 /var/www/matomo/tmp
Zusammenfassung
| Einstellung | DSGVO-Empfehlung |
|---|
| Cookies | Deaktiviert |
| IP-Anonymisierung | 2 Bytes |
| Daten löschen | 180 Tage |
| Do Not Track | Respektieren |
| Opt-Out | Bereitstellen |
| Datei | Funktion |
|---|
| config/config.ini.php | Konfiguration |
| matomo.php | Tracking-Endpoint |
| console | CLI-Tool |
| API-Methode | Beschreibung |
|---|
| VisitsSummary.get | Besucherübersicht |
| Live.getCounters | Live-Statistiken |
| Actions.getPageUrls | Seitenaufrufe |
| Referrers.getAll | Referrer |
Fazit
Matomo ist die beste selbst gehostete Alternative zu Google Analytics. Mit der richtigen Konfiguration ist DSGVO-Konformität ohne Cookie-Banner möglich. Die Cron-Archivierung ist essentiell für gute Performance. Der Tag Manager bietet Flexibilität ohne zusätzliche externe Dienste. Für datenschutzbewusste Website-Betreiber ist Matomo die klare Empfehlung.