Auf meinem Homeserver läuft der Docker-Container Snowflake Proxy, eine Software des Tor-Project, dass es Internetnutzern erlaubt, unter anderem staatliche Internetzensur zu umgehen.
Leider verliert der Proxy nach 1-2 Tagen die Verbindung und kann nur durch einen Neustart des Containers wieder in Betrieb genommen werden. Ich suchte eine Möglichkeit, dies alle 24 Stunden durchzuführen.
Durch das Buch Linux Administration Cookbook, dass ich mir vor ein paar Tagen selbst geschenkt habe, kam ich auf die Idee, statt Cronjobs doch Systemd Timer– und Service-Units zu benutzen. Mein Homeserver läuft mit Ubuntu Server 22.04 und bietet damit die Möglichkeit.
Im weiteren orientiere ich mich an diesem Guide sowie an der Fedora-Dokumentation.
Alle Schritte werden als root bzw. sudo -i durchgeführt. Benutzerdefinierte Service und Timer befinden sich unter /etc/systemd/system/. Zunächst muss die Service-Unit definitiert werden: nano /etc/systemd/system/dockerSnowflakeRestart.service – der Name ist vor .service frei wählbar. Inhalt:
# This service controls Docker snowflake container. Used by
# dockerSnowflakeRestart.timer to restart Snowflake every day.
[Unit]
Description=Restart Docker Snowflake container
Wants=dockerSnowflakeRestart.timer
Requires=docker.service
[Service]
Type=oneshot
ExecStart=/bin/docker-compose /verzeichnis/zu/docker-compose.yml down
ExecStart=/bin/docker-compose /verzeichnis/zu/docker-compose-yml up -d
ExecStartPost=/bin/bash -c "echo 'Snowflake wurde neugestartet' | mail -s 'dockerSnowflakeRestart.service ausgefuehrt' root"
[Install]
WantedBy=multiuser.target
Ich lösche und kreiere den Container über docker-compose jedes Mal neu. Grund ist, dass ich in der docker-compose.yml die Option -verbose für das Logging aktiviert habe und so die Logs nicht ins Unendliche anwachsen. Nachdem der Container wieder gestartet ist, bekommt der User root eine Email, die mir wie hier beschrieben an mein Postfach weitergeleitet wird.
Der Befehl systemctl daemon-reload bindet die neue Service-Unit in Systemd ein. Mit systemctl start dockerSnowflakeRestart.service wird der Dienst einmalig ausgeführt. Bei Erfolg wird eine Mail verschickt. Details können in journalctl ausgelesen werden.
Im nächsten Schritt werden Intervall und Zeitpunkt für den Neustart des Containers definiert. Dafür braucht es die Timer-Unit, die in der Service-Unit bereits definiert ist: nano /etc/systemd/system/dockerSnowflakeRestart.timer. Inhalt:
# This timer unit controls restart interval of
# dockerSnowflakeRestart.service
[Unit]
Description=Controls interval of dockerSnowflakeRestart.service
Requires=dockerSnowflakeRestart.service
[Timer]
Unit=dockerSnowflakeRestart.service
OnCalendar=*-*-* 00:00:00
[Install]
WantedBy=timers.target
In diesem Fall wird die Service-Unit jeden Tag um 0:00 Uhr ausgeführt. Zur Aktivierung reicht systemctl start dockerSnowflakeRestart.service.