TokkNet

Mailcow Backup Mit Systemd Timern

Tokk 551 Wörter ~3 Min.

Ein elementarer Teil der Betriebssicherheit eines IT-Systems ist die Datensicherung. Spätestens wenn man Dienste auch Freunden und Familie zur Verfügung stellt ist die Sicherung ein Muss. Wem seine eigenen Daten lieb sind, sollte sich natürlich auch schon vorher damit beschäftigen. Ein Mailserver ist hier ein Paradebeispiel, der Grundgedanke sollte aber auf alle anderen Dienste übertragen werden.

Die Mailcow-Dokumentation zur Datensicherung ist ein guter Einstiegspunkt, beschäftigt sich allerdings nur mit der periodischen Ausführung mittels cron. Auf meinem Server habe ich kein Cron installiert, da ich im laufe der Zeit die Vorteile von Systemd-Timern schätzen gelernt habe.

Einrichtung

Zunächst erstellen wir einen Systemd-Service, der beim Starten ein Backup von Mailcow erstellt und sich dann wieder beendet. Hierzu legen wir die Datei /etc/systemd/system/mailcowBackup.service mit folgendem Inhalt an:

[Unit]
Description=Mailcow Backup

[Service]
Type=oneshot
Environment="MAILCOW_BACKUP_LOCATION=/opt/backup"
ExecStart=/opt/mailcow-dockerized/helper-scripts/backup_and_restore.sh backup all --delete-days 5

[Install]
WantedBy=multi-user.target

Type=oneshot bedeutet hierbei, dass es sich um einen Prozess handlet der gestartet wird und sich nach getaner Arbeit beendet - das ist wichtig, das Backup soll ja nicht direkt wieder gestartet werden. Die Environment-Variable MAILCOW_BACKUP_LOCATION steuert den Ausgabepfad des fertigen Backups, daher muss diese Variable natürlich gesetzt und entsprechend angepasst werden

Sobald diese Service-Unit existiert kann der Backup-Prozess mittels systemctl start mailcowBackup.service jederzeit manuell gestartet werden.

Die Ausgabe des Backup-Skriptes wird im Systemlog erfasst und kann daher über systemctl status mailcowBackup.service und journalctl -f -u mailcowBackup.service eingesehen werden.

[user@server]$ sudo systemctl status mailcowBackup.service
○ mailcowBackup.service - Mailcow Backup
     Loaded: loaded (/etc/systemd/system/mailcowBackup.service; disabled; preset: disabled)
     Active: inactive (dead)

Aug 07 07:32:16 mailcow.url backup_and_restore.sh[14066]: /backup_mariadb/ib_buffer_pool
Aug 07 07:32:16 mailcow.url backup_and_restore.sh[14066]: /backup_mariadb/aria_log.00000001
Aug 07 07:32:16 mailcow.url backup_and_restore.sh[14066]: /backup_mariadb/aria_log_control
Aug 07 07:32:16 mailcow.url backup_and_restore.sh[14066]: /backup_mariadb/xtrabackup_checkpoints
Aug 07 07:32:16 mailcow.url backup_and_restore.sh[14066]: /backup_mariadb/backup-my.cnf
Aug 07 07:32:16 mailcow.url backup_and_restore.sh[14066]: /backup_mariadb/xtrabackup_info
Aug 07 07:32:16 mailcow.url backup_and_restore.sh[14066]: /backup_mariadb/xtrabackup_binlog_pos_innodb
Aug 07 07:32:16 mailcow.url systemd[1]: mailcowBackup.service: Deactivated successfully.
Aug 07 07:32:16 mailcow.url systemd[1]: Finished Mailcow Backup.
Aug 07 07:32:16 mailcow.url systemd[1]: mailcowBackup.service: Consumed 1.056s CPU time, 14.1M memory peak.sudo 

Periodische Ausführung mittels Timer

Der nächste Schritt ist die Anlage eines Timers, der die neu angelegte Unit zu definierten Zeitpunkten startet.
Hierzu legen wir die Datei /etc/systemd/system/mailcowBackup.timer wie folgt an:

[Unit]
Description=Starts the Mailcow Backup every night
Requires=mailcowBackup.service

[Timer]
Unit=mailcowBackup.service
OnCalendar=*-*-* 00:30:00
[Install]
WantedBy=timers.target 

Wichtig ist hier neben der Angabe der entsprechenden Service-Unit die Zeile OnCalendar=*-*-* 00:30:00, die besagt, dass der Timer An jedem Tag jeden Monats jeden Jahres um 00:30 aktiv werden soll. Der Timer muss abschließend noch aktiviert und gestartet werden. Dies erfolgt analog zu Service Units: systemctl enable --now mailcowBackup.timer.
Mittels systemctl list-timers können aktive Timer eingesehen werden. Der Befehl zeigt eine Auflistung aller Timer inklusive dem absoluten und relativen Zeitpunkt der nächsten sowie vorherigen Ausführung.

[tokk@mx-web backup]$ systemctl list-timers
NEXT                            LEFT LAST                              PASSED UNIT                             ACTIVATES
[...]
Thu 2024-08-08 00:30:00 UTC      16h -                                      - mailcowBackup.timer              mailcowBackup.service
Wed 2024-08-14 07:05:57 UTC   6 days Wed 2024-08-07 07:05:57 UTC    33min ago certbot-renewal.timer            certbot-renewal.service
[...]

Auch hier landet die Ausgabe des Backups im System-Log und kann via journalctl eingesehen werden. Die komplette Ausgabe der tagesaktuellen Sicherung lasen sich zum Beispiel mittels journalctl -S today -u mailcowBackup.service anzeigen.

Weiterführende Gedanken

Nach der Einrichtung des Timers wird jede Nacht ein Backup unter dem spezifizierten Pfad angelegt. Sollte die Festplatte des Servers oder der ganze Server jedoch ausfallen ist dadurch jedoch nicht nur Mailcow betroffen, sondern auch das Backup.
Daher ist es dringend notwendig, die Backups automatisiert noch anderweitig abzulegen.