Schon eine passende Backup-Strategie für Matomo? Nein? Nicht so schlimm, in den folgenden Absätzen stelle ich dir mein kürzlich veröffentlichtes Backup Script für Matomo vor.

Du kannst Abends nicht mit gutem Gewissen einschlafen, da du kein aktuelles Backup deiner Matomo Installation besitzt? Jedem, dem es so oder so ähnlich geht, sei gesagt, in diesem Artikel gibt es die richtige Medizin.

Wo finde ich das Script?

Die aktuelle Version findest du immer auf GitHub. Der folgende Link bringt dich direkt zu dem aktuellen Release:

Wenn du schon mal da bist, freue ich mich natürlich, wenn du ein Sternchen da lassen würdest. Wirklich!

Was wird benötigt?

Wenn du das Script nutzen möchtest, sollte dein Hoster folgende Dinge bereitstellen:

Ein sicherer Ort für deine Backups

Jetzt hast du sicherlich bereits das Script auf deinem Server und willst starten. Klar, das machen wir gleich, aber vorher noch eine kurze Sicherheitseinweisung.

Damit das Script überhaupt ein Backup erstellen kann, konfigurierst du in den folgenden Absätzen die Konfigurationsdateien des Scripts. Dort enthalten sind, Zugangsdaten für die Datenbank und weitere kritische Informationen, die es zu schützen gilt. Keine gute Idee, diese Dateien und schon gar nicht die Backups in einem öffentlichen Ordner auf dem Server liegenzulassen.

Die Lösung liegt auf der Hand. Man nutzt selbstverständlich einen Ordner außerhalb des öffentlichen Verzeichnisses.

Mein kleines Beispiel geht davon aus, dass sich im Root Verzeichnis der öffentliche Ordner "html" befindet, dort liegt eure Matomo Installation und weitere Projekte. Der "backup" Ordner befindet sich hier auf derselben Ebene wie "html", ist aber nicht öffentlich zugänglich. Dort entpackst du das Backup Script oder führst ein git clone https://github.com/felix-berlin/matomo-backup-restore.git aus. So liegt das Script mit den heiklen Zugangsdaten sicher.

├── backups (nicht öffentlicher Ordner)
└── matomo-backup-restore
├── html (öffentlicher Ordner)
└── matomo (Deine Matomo Installation)

Das Bash Script konfigurieren

Nachdem du das Script abgelegt hast, geht es nun ans Konfigurieren. Mein Backup Script kommt mit zwei Beispiel-Konfigurationsdateien, zu finden im Ordner "config". Eine für den Datenbank-Zugriff, die andere für das Script selbst.

Ich empfehle, beide Konfig-Dateien zu duplizieren und anschließend umzubenennen. Dazu löschst du lediglich das ".example" aus dem Dateinamen.

Das Ganze hat den Vorteil, dass wenn du ein Update mit git pull machst, deine bisherigen Konfigs nicht überschrieben werden und auch nicht von git getrackt werden.

Das Script Konfigurieren

In der Hauptkonfigurations-Datei (main.config.sh) muss nicht zwangsläufig alles angepasst werden. Folgende Variablen sind jedoch notwendig:

#!/bin/bash

#
# IMPORTANT
# You have to customize this script (directories etc.) for your actual environment.
# All entries which need to be customized are tagged with "TODO".
#

echo "Load config: ${0}"

# Variables
backupMainDir=$1

if [ -z "$backupMainDir" ]; then
	# TODO: The directory where you store the Matomo backups (when not specified by args)
    backupMainDir='/backup/matomo'
fi

currentDate=$(date +"%Y%m%d_%H%M%S")

# The actual directory of the current backup - this is a subdirectory of the main directory above with a timestamp
backupdir="${backupMainDir}/${currentDate}/"

pathToMatomo=$2

if [ -z "$pathToMatomo" ]; then
# TODO: The directory of your Matomo installation (this is a directory under your web root)
pathToMatomo='/html/matomo'
fi

# TODO: You may wish to backup some other files
matomoBackupFiles='.htaccess robots.txt config/config.ini.php plugins/'

# TODO: The maximum number of backups to keep (when set to 0, all backups are kept)
maxNrOfBackups=12

# File names for backup files
nameBackupFileDir="${currentDate}_matomo-data.tar.gz"

fileNameBackupDb="${currentDate}_matomo-db.sql"

#
# Database config
#
# IMPORTANT
# Make sure to customize all entries under [client] in the database.config.cnf
#

# TODO: Your Matomo database name
matomoDatabase='myMatomoDatabaseName'

Datenbank Konfiguration

Die database.config.cnf Datei ist ein reiner Copy & Paste Job. Alle nötigen Zugangsdaten findest du im Matomo Ordner unter "config" → "config.ini.php".

[client]
host=localhost
user=databaseUser
password=my_P@SsworD

[mysqldump]
extended-insert
no-autocommit
quick
single-transaction
add-drop-table

Hier passiert der eigentliche Zauber

Jetzt kannst du noch einen Blick auf das eigentliche Script werfen. Ich lasse das mal "unkommentiert" ;)

#!/bin/bash

#
# Bash script for creating backups of Matomo.
#
# Version 1.1.1
#

#
# IMPORTANT
# You have to customize the following config files: .main.config.sh and .database.config.cnf
#

. config/.main.config.sh

# Function for error messages
errorecho() { cat <<< "$@" 1>&2; }

#
# Print information
#
echo "Backup directory: ${backupMainDir}"


#
# Check if backup dir already exists
#
if [ ! -d "${backupdir}" ]
then
	mkdir -p "${backupdir}"
else
	errorecho "ERROR: The backup directory ${backupdir} already exists!"
	exit 1
fi

#
# Backup DB
#
echo
echo "1. Backup Matomo database (MySQL/MariaDB)..."

if ! [ -x "$(command -v mysqldump)" ]; then
	errorecho "ERROR: MySQL/MariaDB not installed (command mysqldump not found)."
	errorecho "ERROR: No backup of database possible!"
else
	mysqldump --defaults-extra-file=config/.database.config.cnf "${matomoDatabase}" > "${backupdir}/${fileNameBackupDb}"

	echo
	echo "1.1 Compress database backup with tar and gzip..."
	tar -cpzf "${backupdir}/${currentDate}_matomo-db.tar.gz" -C ${backupdir} ${fileNameBackupDb}
	echo "Compress database completed!"

	echo
	echo "1.2 Delete uncompressed database backup file"
	rm "${backupdir}/${fileNameBackupDb}"
	echo "Delete uncompressed database backup completed!"
fi

echo
echo "Database backup completed!"
echo

#
# Backup matomo
#
echo "2. Backup Matomo's files..."
tar -cpzf "${backupdir}/${nameBackupFileDir}" -C "${pathToMatomo}" ${matomoBackupFiles}
echo "File backup completed!"
echo

#
# Delete old backups
#
if [ ${maxNrOfBackups} != 0 ]
then
	nrOfBackups=$(ls -l ${backupMainDir} | grep -c ^d)

	if [[ ${nrOfBackups} > ${maxNrOfBackups} ]]
	then
		echo "3. Removing old backups..."
		ls -t ${backupMainDir} | tail -$(( nrOfBackups - maxNrOfBackups )) | while read -r dirToRemove; do
			echo "${dirToRemove}"
			rm -r "${backupMainDir}/${dirToRemove:?}"
			echo "Removing old backups completed!"
			echo
		done
	fi
fi

echo
echo "DONE!"
echo "Backup created: ${backupdir}"

Wie wird das Script genutzt?

Du schaltest dich mit SSH oder SFTP auf deinen Server auf und navigierst mit cd in das Verzeichnis, wo sich die matomo_backup.sh Datei befindet. Jetzt einfach das Script via ./matomo_backup.sh starten. Wer sich den Code oberhalb angesehen hat, wird sag: "Hey, was ist mit den optionalen Argumenten!". Stimmt, es gibt zwei ($1, $2) optionale Argumente, mit denen ihr das Backup-Verzeichnis ($1) und oder das Matomo-Verzeichnis ($2) manuell bestimmen könnt. Praktisch, oder?

Nun einfach zurücklehnen und den echos zugucken!

Screenshot: Ausführung des Backup Scripts

Backups automatisieren

Damit du so richtig entspannen kannst, empfehle ich dir diesen ganzen Prozess zu automatisieren.

Das Stichwort lautet Cronjob!

Die unter euch, die ihren Server selbst verwalten, wissen mit hoher Wahrscheinlichkeit, was jetzt zu tun ist. All diejenigen, die ein Shared-Hosting oder einen Managed Server mieten, können dies meist über das Admin-Dashboard ihres Anbieters steuern. Das einzige, worauf hier geachtet werden sollte ist, dass du das Script mit dem richtigen Interpreter ansprichst. In diesem Fall ist das Bash. Jetzt noch schnell das für dich geeignete Intervall auswählen und schon gibt es regelmäßig Matomo Backups!