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

Tags und Trigger

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'];

Performance

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.