Der Matomo Cronjob
So aktivierst du die automatische Archivierung für Berichte

Du verwendest Matomo "on Premise", also auf einem eigenen Server? Dann solltest du auf jeden Fall die automatische Archivierung über einen sogenannten Cronjob aktivieren.
Wenn du die Matomo Cloud oder das WordPress-Plugin von Matomo verwendest, benötigst du diese Anleitung nicht.
Inhaltsübersicht
- Die zwei Varianten der Archivierung
- Warum ist die Archivierung wichtig?
- Was bedeutet Archivierung?
- Cronjob in Plesk: Geplante Aufgaben anlegen
- Cronjob Manager bei Hetzner in der KonsoleH
- Manueller Crontab per SSH anlegen
- PHP-Skript für einen Webcron
- Webcron bei All-Inkl.com anlegen
- Tipps & Tricks zur automatischen Archivierung
Die zwei Varianten der Archivierung
Die Profi-Variante: lokales Script
Wenn möglich, solltest du diese Variante einsetzen. Hierbei wird der Prozess über einen PHP-Befehl lokal ausgeführt. Dadurch ist keine Authentifizierung notwendig und der Prozess kann in der Regel ohne Beschränkung der Laufzeit seine Tätigkeit ausüben. Denn die Ausführung kann je nach Umfang der erfassten Daten gerne an die 5 bis 10 Minuten – oder auch länger – benötigen.
Wie du das umsetzen kannst, hängt stark vom Provider und dem verwendeten Verwaltungstool ab. Ein paar gängige Umsetzungen findest du im Weiteren. Und wenn du bei den einzelnen Parametern viele Fragezeichen im Kopf hast, dann schau am Ende der Seite in die Tipps & Tricks.
Ausführung über einen Webaufruf
Je nach Provider bestehen erhebliche Einschränkungen in der Ausführung von Cronjobs. Teilweise können keine lokalen PHP-Befehle ausgeführt werden und man muss die Archivierung über eine öffentlich erreichbare URL durchführen. Dies ist beispielsweise bei All-Inkl.com oder IONOS der Fall.
Matomo unterstützt eine solche Berechnung über eine URL. Aber dafür muss der Zugriff autorisiert werden, wofür ein Token benötigt wird. Diesen muss man als Haupt-Administrator anlegen – und genau da schlägt mein Sicherheitssystem Alarm!
Denn Ja: Das ist möglich! Aber aus Sicherheitsgründen empfehle ich, das nicht zu machen.
Warum? Lies dazu bitte den Abschnitt Sicherheitsrisiko Authentifizierungstoken und verwende dann lieber den Weg, den ich im bei PHP-Skript für einen Web Cron beschreibe.
Wichtig: Egal, für welche Variante du dich entscheidest: Sobald die Archivierung über einen Cronjob aktiviert ist, musst du bitte in der Weboberfläche von Matomo die automatische Archivierung im Browser deaktivieren. Gehe dazu in den Bereich der Einstellungen (Zahnradsymbol in der blauen Kopf-Navigation).
Klicke dann auf „System → Allgemeine Einstellungen“ und direkt am Start der Seite findest du die „Archivierungseinstellungen“.
Dort musst du nun die Option „Nein“ aktivieren. (siehe Screenshot)
Warum ist die Archivierung wichtig?
Die automatische Archivierung in Matomo sorgt dafür, dass Berichte und Analysen schnell verfügbar sind, ohne die Benutzeroberfläche oder den Server direkt beim Abruf der Berichte zu belasten. Sie ist besonders hilfreich für Websites mit mittlerem bis hohem Traffic, da sie die Datenverarbeitung von der Benutzeranfrage entkoppelt. Stattdessen werden Berichte regelmäßig im Hintergrund aktualisiert.
Nach der Installation von Matomo ist zunächst die dynamische Archivierung aktiv und wird immer nur dann ausgeführt, wenn du im Matomo eingeloggt bist. Das kann eine Zeit lang gut gehen, aber du verzichtest dann auch auf die Möglichkeit zur automatischen Berichtserstellung per E-Mail und vor allem auf automatisierte Meldungen, den sogenannten Custom Alerts.
Was bedeutet Archivierung?
Matomo speichert alle Daten in einer MySQL-Datenbank. Dabei werden alle Seitenzugriffe, aber auch viele weitere Zahlen wie Ereignisse, Downloads oder angeklickte ausgehende Links von den Besuchern der Webseite erfasst. Je mehr Besuche deine Webseite hat, desto mehr Daten werden gespeichert. Selbst wenn du nur ein paar Dutzend Besuche am Tag hast, müssen diese Daten zusammengefasst werden, damit du die Berichte ansehen kannst. Denn nur so kannst du beispielsweise auf den Besucherüberblick oder die Liste aller ausgerufenen Seiten-URLs zugreifen.
Damit die Aufbereitung der Berichte schneller geht, werden bei der Archivierung viele Zahlen in spezielle Tabellen zusammengefasst und stehen somit mehr oder weniger vorbereitet zur Anzeige zur Verfügung.
Nach der Installation wird die Aufbereitung der Daten automatisch von Matomo durchgeführt werden, während du dir die Berichte ansiehst. Diese kann bei kleinen Datenmengen akzeptabel sein. Aber die Datenbank MySQL ist nicht für solche Aufgaben optimiert. Daher empfehle ich generell die Aktivierung der automatischen Archivierung, denn neben der Aufbereitung der Berichtsdaten sind auch verschiedene Funktionen wie die Custom Alerts, die automatische Erstellung von Reportings mit Versand per E-Mail oder der Import für Daten aus Google Analytics darauf angewiesen, regelmäßig automatisch ausgeführt zu werden.
Der Cron sollte einmal in der Stunde ausgeführt werden. Die Ausführung einmal am Tag, wie es bei manchen Providern nur möglich ist, ist nicht zielführend.
Cronjob in Plesk: Geplante Aufgaben anlegen
Wenn du das Verwaltungstool Plesk im Einsatz hast, kannst du ganz entspannt über die Weboberfläche eine sogenannte "Geplante Aufgabe" anlegen und einen lokalen PHP-Befehl ausführen lassen. Logge dich dazu in Plesk ein und gehe dazu in der verwalteten Seite auf diesen Menüpunkt unter den Entwicklertools und auf der Übersicht der folgenden Seite klicke auf "+ Aufgabe hinzufügen". (Siehe Screenshot)
Beim "Scriptpfad" musst du die Datei "console" im Hauptverzeichnis deiner Matomo-Installation auswählen und die folgende Angabe bei "mit Argumenten" angeben:
core:archive --matomo-domain=data.example.org
Bitte ersetze data.example.org
durch den Hostnamen deiner Matomo-Installation. Es gibt noch verschiedene andere Angaben, die du als Argumente verwenden kannst. Eine Übersicht findest du weiter unten auf dieser Seite.
Zusätzlich wählst du dann die zu verwendende PHP-Version aus, die auch für die Webseite verwendet wird und bei "Ausführen" wählst du "Stündlich" und eine Angabe der Minuten. Im Screenshot habe ich 02 verwendet. Du kannst aber auch 00 stehen lassen.
Cronjob Manager bei Hetzner in der KonsoleH
Wenn du bei Hetzner einen Vertrag mit Zugriff auf die KonsoleH hast, kannst du sehr einfach einen Cronjob anlegen.
Klicke dazu in der linken Navigation im Abschnitt „Konfiguration“ auf „Cronjob Manager“ und dann auf „hinzufügen“.
Wähle bei „Interpreter“ die PHP-Version deiner Webseite und gib im „Skript“ den vollständigen Pfad bis zur Angabe „console“ an. Meist lautet dieser ungefähr wie folgt:
/usr/www/users/example/matomo/console
Die Angabe example
in diesem Pfad muss durch den jeweiligen Nutzer deines Kontos ersetzt werden. Dass dahinter dann „matomo“ als Verzeichnis folgt, ist ebenfalls ein Beispiel. Wenn deine Matomo-Installation unter einem anderen Verzeichnis liegt, verwende diesen Pfad.
Bist du dir unsicher, unter welchem Verzeichnis deine Matomo-Installation sich befindet, dann schau am Ende dieser Seite in den Bereich Tipps & Tricks. Dort findest du ein PHP-Script, das dir diese Angabe anzeigen kann.
Hinter dem Wort „console“ müssen dann zumindest die folgenden Angaben ergänzt werden.
core:archive --matomo-domain=data.example.org
Bitte ersetzte data.example.org
durch den Hostnamen deiner Matomo-Installation. Dieses Beispiel enthält nur die Minimalangaben. Es gibt noch viele weitere Argumente, die weiter unten vorgestellt werden.

Bei „Ausführungszeit“ verwendest du entweder die Angabe „Intervall: Stündlich“ oder du kannst eine manuelle Einstellung vornehmen.
Die „Exklusive Ausführung“ solltest du aktiviert lassen. Damit wird sichergestellt, dass dieser Cronjob bis zum Ende ausgeführt wird und kein weiterer Cronjob sich dazwischen mogeln kann.
Tipp: Wenn du Hilfe bei den Pfaden benötigst: Am Ende der Seite habe ich ein PHP-Skript zur Ermittlung deiner Cronjob-Details bereitgestellt.
Manueller Crontab per SSH anlegen
Wenn du dich für diese Variante interessierst, gehe ich davon aus, dass du Erfahrung mit SSH und der Kommandozeile auf Unix/Linux-Servern hast. Der Crontab-Eintrag sollte mindestens einmal stündlich ausgeführt werden und muss natürlich den Pfad zum PHP-Interpreter und dann den absoluten Pfad bis zum Matomo-Verzeichnis und darin das Script "console
" ausführen. Wie du vielleicht bei den vorherigen Beispielen gesehen hast, müssen dann noch der Befehl "core:archive
" und der Domainname deiner Matomo-Installation folgen. Alles in allem könnte der Befehl für die crontab wie folgt aussehen:
5 * * * * www-data /usr/bin/php /path/to/matomo/console core:archive --matomo-domain=data.example.org
Anstelle von www-data
musst du bitte den User verwenden, der auch für die Ausführung über den Webserver verwendet wird. Andernfalls kann es zu Fehlern in den Zugriffsrechten kommen, denn bei der Archivierung werden verschiedene Templates erneuert und auch ggf. der Matomo-Tag-Manager-Code neu geschrieben. Wenn das mit den falschen Zugriffsrechten passiert, wirst du regelmäßig Fehler in Matomo sehen.
Die Angabe /usr/bin/php
muss durch den korrekten PHP-Interpreter mit der gleichen Version ersetzt werden, unter der auch der Webserver läuft.
Und die Angabe /path/to/matomo/console
muss der vollständige Pfad zum Verzeichnis von Matomo incl. der ausführbaren Dateien "console" sein.
Die nachfolgenden Parameter hast du bereits weiter oben kennengelernt. Diese Angaben sind ebenfalls nur als Mindestangaben anzusehen und können durch viele weitere Parameter ergänzt werden.
Tipp: Wenn du dir unsicher mit den Pfaden bist, dann schau mal am Ende der Seite! Dort habe ich ein PHP-Skript zur Ermittlung deiner Cronjob-Details bereitgestellt.
PHP-Skript für einen Webcron
Wenn der Cronjob keinen lokalen Befehl ausführen kann, bleibt häufig nur der Gedanke an einen Web-Cronjob mit einem Authentifizierungstoken (Access-Token) aus Matomo. Aber das ist nicht notwendig. Du kannst ein simples PHP-Skript erstellen, welches den Befehl lokal ausführt. Damit erspart man sich das Sicherheitsrisiko des Access-Tokens und kann entspannt die Archivierung durchführen lassen.
Leider hat diese Variante auch seine Schattenseiten. Diese liegen in den möglichen Begrenzungen des Providers hinsichtlich der Ausführungszeit von PHP-Seiten. Es kommt also im Fall der Fälle auf einen Versuch an. Bei All-Inkl.com habe ich mit dieser Lösung bislang gute Erfahrungen gemacht.
Das PHP-Script sieht wie folgt aus:
<?php
$cmd = "/usr/bin/php83 /www/htdocs/example/matomo/console core:archive --matomo-domain=data.example.org";
system($cmd);
Hinweis: Der Codeblock ist breiter, als er angezeigt wird.
Kopiere den gesamten Code in eine Text-Datei und speichere diese unter dem Namen "cronjob.php" oder "matomo-archivierung.php" ab. Diese Datei musst du dann auf deinen Webserver übertragen und kannst diese sodann über einen normalen Webseiten-Aufruf ausführen lassen.
Vorher musst du aber noch ein paar Änderungen vornehmen:
Der Teil /usr/bin/php83
gibt den Pfad und den PHP-Interpreter aus. Hier musst du ggf. bei deinem Provider die Angabe prüfen.
Der Teil /www/htdocs/example/matomo/console
ist der Pfad bis zum Programm "console". Auch diesen Pfad musst du entsprechend anpassen. Wenn du nicht weißt, wo sich deine Matomo-Installation befindet, schau mal am Ende der Seite in die Tipps & Tricks. Dort findest du ein PHP-Skript, das dir bei diesen Angaben hilft.
Hinter dem Wort "console" müssen dann zumindest die folgenden Angaben ergänzt werden.
core:archive --matomo-domain=data.example.org
Bitte ersetze data.example.org
durch den Hostnamen deiner Matomo-Installation. Hier siehst du nur die notwendigen Angaben. Es gibt noch viele weitere Argumente, die weiter unten vorgestellt werden.
Webcron bei All-Inkl.com anlegen
Beim Hoster All-Inkl.com können leider keine PHP-Skripte direkt ausgeführt werden. Daher ist hier der Weg über ein PHP-Skript für einen Web-Cronjob notwendig, den ich zuvor beschrieben habe.
Nachdem du die PHP-Datei angepasst und auf deinen Webspace bei All-Inkl.com hochgeladen hast, wählst du bitte das Protokoll "https://" aus und nutzt dann den vollständigen Aufruf zu deiner Webseite, also z.B. data.example.org/cronjob.php
Die Beschreibung ist optional, hilft dir aber dabei, verschiedene Cronjobs zu unterscheiden.
Der "Zeitpunkt der Ausführung" sollte "stündlich" sein. In meinem Beispiel immer 2 Minuten nach der vollen Stunde.
Weitere Angaben sind nicht notwendig.
Tipps & Tricks zur automatischen Archivierung
Nachfolgend findest du ein paar Tipps & Tricks rund um die automatische Archivierung für Matomo. Wenn du etwas vermisst, dann schreib mir gerne eine E-Mail. Ich werde diese Liste sicherlich immer wieder mal erweitern.
Warum sollte ich keinen Access-Token verwenden?
Du kannst natürlich einen Access-Token in Matomo für einen Haupt-Administrator anlegen und diesen dann für einen Cronjob nutzen. Ich halte dies jedoch für ein Sicherheitsrisiko, denn mit diesem Token kann nicht nur die Archivierung durchgeführt werden, sondern man kann über die verschiedenen APIs von Matomo auch andere Verwaltungsaufgaben ausführen. Du kannst darüber unter anderem neue Benutzer anlegen, Webseiten einrichten oder Einstellungen ändern, aber du kannst darüber auch Webseiten löschen. Das ist systemkritisch.
Nun kannst du sagen: Den Token sieht doch keiner … Oh doch. Der wird bei jedem Seitenanruf übergeben und damit landet er auch in den Logfiles des Webservers. Spätestens wenn hier ein Angriff vorliegt, kann der Angreifer auch die Oberhand über dein Matomo übernehmen. Das wäre doch schade.
Daher ist mein Tipp, mit dem zuvor vorgestellten PHP-Skript einfach den Web-Cronjob ausführen zu lassen. Schon brauchst du keinen Token zu erstellen.
PHP-Skript zur Ermittlung deiner Cronjob-Details
Das alles mit den Pfaden und dem PHP-Interpreter ist schwierig. Und dabei möchte ich dir helfen.
Ich habe ein kleines PHP-Script erstellt, welches versucht, anhand der gängigen Umgebungen zu ermitteln, wie genau der Befehl für den Cronjob auszusehen hat.
Dabei gibt dir dieses Script die folgenden Informationen aus:
- Pfad, in dem du das Script installiert hast
- Die Version von PHP des Webservers
- Basierend darauf versucht das Script, den lokalen PHP-Interpreter zu finden.
Nur, wenn das gelingt, können die nächsten Tests erfolgen. - Es wird versucht, den „console“ Befehl mit dem PHP-Interpreter aufzuführen.
Nur wenn dies gelingt, siehst du die Version deiner Matomo-Installation. - Zu guter Letzt wird der gesamte Befehl für den Cronjob angezeigt.
Ausgabe der Archivierung als Logdatei
In allen oben genannten Einstellungen fehlt eine möglicherweise wichtige Ergänzung!
Während der Archivierung erzeugt Matomo hilfreiche Debug-Ausgaben. Daher solltest du überlegen, die Ausgaben der Archivierung in einer Logdatei zu speichern. Wenn es Probleme bei der Archivierung gibt, kannst du dann hervorragend aus dieser Logdatei wichtige Informationen erhalten.
Warum habe ich das aber in den Beispielen oben unterschlagen, wenn es doch so wichtig ist? Naja: bei den allermeisten Installationen wird nie in das Logdatei geschaut und Probleme damit gar nicht erst gesehen. Und wenn man dann das Logfile bei jeder stündlichen Ausführung einfach überschreibt, dann sieht man nur die Fehler bei der letzten Ausführung. Was ist aber mit den Fehlern, die vor 5 oder vor 36 Stunden aufgetreten sind? Sind diese egal? Nope. Auch die können sehr wichtig sein.
Daher solltest du die Archivierung immer konsequent in deine Prozesse einbeziehen und die Logdatei immer fortschreiben, aber dann auch eine automatische Prüfung der Inhalte des Logfiles etablieren.
Wenn das alles für dich gerade böhmische Dörfer sind, dann lass es. Ignoriere diesen Hinweis und bleib einfach bei den Einstellungen, die ich oben beschrieben habe. Wenn du aber wirklich Wert auf deine Daten in Matomo legst, dann solltest du die Ausgabe mit >> an eine Datei leiten. Diese beiden Zeichen >>, an die obigen Parameter angehängt und mit dem Namen der Logdatei (natürlich dem kompletten Pfad) ergänzt, bewirkt, dass die Datei immer weiter ergänzt wird. Aber Achtung: Diese Datei wird nach kurzer Zeit einige MB groß und kann schnell auch die Grenze von 1 GB überschreiten! Daher muss diese Logdatei auch regelmäßig rotiert werden.
P.S. Wenn du auf diesen ganzen Kram keine Lust hast, dann sollten wir über meinen Update-Service sprechen. Buche dazu sehr gerne ein unverbindliches Erstgespräch mit mir.
Mögliche Parameter für die Archivierung
Wenn du auf der Konsole den Befehl:
php console help core:archive
ausführst, dann werden dir viele weitere Parameter, die man im Rahmen der Archivierung verwenden kann, angezeigt.
Erwähnenswert ist die Option "--url", welche häufig anstelle der von mir verwendeten "--matomo-domain" verwendet wird. Seit Matomo 5 wird eher die von mir verwendete Option genutzt. Aber du kannst genauso "--url" verwenden, wenn dir das lieber ist.
Eine weitere wichtige Option kann "--concurrent-archivers" sein. Hiermit kannst du die Anzahl der zeitgleichen Archivierungen beeinflussen. Im Standard ist dieser Wert auf 3 gesetzt. In den meisten Instanzen wird das ausreichen. Bei größeren Installationen mit vielen Tausenden von Zugriffen pro Stunde kann die Archivierung auch mal länger als 60 Minuten dauern, dann hilft ein paralleler Einsatz mehrerer Archivierungsprozesse.
Witzig finde ich, dass bei der Ausgabe der Hilfe weiterhin von Piwik und nicht von Matomo gesprochen wird. Der Namenswechsel ist 2018 erfolgt und noch immer verfolgt uns Piwik auf Schritt und Tritt.
Hier folgt nun die Ausgabe der Hilfe mit dem obigen Befehl. Bitte beachte, dass der folgende Textblock breiter als die Anzeige ist. Du darfst gerne nach rechts scrollen.
Description: Runs the CLI archiver. It is an important tool for general maintenance and to keep Piwik very fast. Usage: core:archive [options] Options: --url=URL Forces the value of this option to be used as the URL to Piwik.
If your system does not support archiving with CLI processes, you may need to set this in order for the archiving HTTP requests to use the desired URLs.
--skip-idsites[=SKIP-IDSITES] If specified, archiving will be skipped for these websites (in case these website ids would have been archived).
--skip-all-segments If specified, all segments will be skipped during archiving.
--force-idsites[=FORCE-IDSITES] If specified, archiving will be processed only for these Sites Ids (comma separated)
--skip-segments-today If specified, segments will be only archived for yesterday, but not today. If the segment was created or changed recently, then it will still be archived for today and the setting will be ignored for this segment.
--force-periods[=FORCE-PERIODS] If specified, archiving will be processed only for these Periods (comma separated eg. day,week,month,year,range)
--force-date-last-n[=FORCE-DATE-LAST-N] Deprecated. Please use the "process_new_segments_from" INI configuration option instead.
--force-date-range[=FORCE-DATE-RANGE] If specified, archiving will be processed only for periods included in this date range. Format: YYYY-MM-DD,YYYY-MM-DD
--force-idsegments=FORCE-IDSEGMENTS If specified, only these segments will be processed (if the segment should be applied to a site in the first place).
Specify stored segment IDs, not the segments themselves, eg, 1,2,3.
Note: if identical segments exist w/ different IDs, they will both be skipped, even if you only supply one ID.
--concurrent-requests-per-website[=CONCURRENT-REQUESTS-PER-WEBSITE] When processing a website and its segments, number of requests to process in parallel [default: 3]
--concurrent-archivers[=CONCURRENT-ARCHIVERS] The number of max archivers to run in parallel. Depending on how you start the archiver as a cronjob, you may need to double the amount of archivers allowed if the same process appears twice in the `ps ex` output. [default: 3]
--max-websites-to-process=MAX-WEBSITES-TO-PROCESS Maximum number of websites to process during a single execution of the archiver. Can be used to limit the process lifetime e.g. to avoid increasing memory usage.
--max-archives-to-process=MAX-ARCHIVES-TO-PROCESS Maximum number of archives to process during a single execution of the archiver. Can be used to limit the process lifetime e.g. to avoid increasing memory usage.
--stop-processing-after[=STOP-PROCESSING-AFTER] Number of seconds how long a job is allowed to start new archiving processes. When limit is reached job will wrap up after finishing current processes. [default: 86400]
--disable-scheduled-tasks Skips executing Scheduled tasks (sending scheduled reports, db optimization, etc.).
--accept-invalid-ssl-certificate It is _NOT_ recommended to use this argument. Instead, you should use a valid SSL certificate!
Pro-Tipp: Richte zeitgleich ein Backup ein
Wie heißt es so schön: kein Backup, kein Mitleid!
Wenn du bereits dabei bist, einen automatisierten Prozess anzulegen, dann solltest du dir auch gleich Gedanken über das Backup deiner Datenbank machen.
Ich hatte gerade erst vor kurzem wieder den Fall, dass man sich auf das Backup des Providers verlassen hat, und dieses dann leider doch nicht funktionierte.
Von einer MySQL-Datenbank kann man sehr einfach ein Backup über die Kommandozeile mit dem Befehl mysqldump ausführen. Ich erstelle dafür gerne ein kleines Shellscript, dass ich dann ähnlich die den Cron für Matomo einrichte, aber das nur einmal am Tag.
Der Befehl, den ich verwende, lautet wie folgt:
mysqldump --add-drop-table --lock-tables=false -h localhost -u USER -p'PASS' DBNAME > backupdir/matomo.sql
Natürlich darfst du hier die Angaben USER durch den Datenbanknutzer, das PASS durch das Passwort und DBNAME durch den Namen der Datenbank ersetzen.
Sinnvollerweise ergänzt man das dann noch durch die Komprimierung der SQL-Datei und vielleicht auch durch ein dynamisches Datum, damit man den letzten Dump nicht durch den aktuellen überschreibt.
Die Angabe mit "add-drop-table" nutze ich, damit ich beim Import die alte Datenbank nicht ggf. zuvor löschen muss. Ich bin da etwas faul :-)
Die Angabe "lock-tables" bewirkt, dass während des Backups die Datenbank nicht blockiert wird. Das sollte man aber vorsichtig nutzen, denn dadurch kann das Backup im Zweifelsfall inkonsistent sein. Aber wenn deine Datenbank sehr groß ist, dann kann der Prozess des Backups auch gerne mal 10 oder 20 Minuten dauern. Und in dieser Zeit wird dann Matomo ggf. keine Daten erfassen. Daher denke auch sehr gerne über eine Datenbank-Replikation nach.