Hier ein kurzer Abriss wie ein Pythonprojekt als Systemservice unter Systemd eingerichtet werden kann. Python kann schon ziemlich Spaß machen und die Virtuelle Umgebung ist schon ziemlich nice. Eine Feature, dass ich gerne auch bei Ruby sehen würde. Ich bin kein genereller Pythonprogrammierer und damit ist mein Verständnis von der Virtuellen Umgebung eher wage. Mir ist bekannt, dass es verschiedene Möglichkeiten gibt, so eine Umgebung einzurichten und das letzten Endes einige Pfadangaben umgeleitet werden. Aber wo und wann das genau passiert ist mir schleierhaft. Glücklicher Weise ist es ziemlich einfauch aus einen Pyhtonprogramm mit Virtueller Umgebung ein Systemddienst zu machen, da die Pfadangabe direkt gesetzt werden kann. Aber sehen wir uns das an einem Beispiel an:
Als Beispiel dient Calibre-Web, dass als alternative Webanwendung für eine Calibredatenbank verwendet werden kann, falls die mitgelieferte von Calibre nicht zusagt.
Wir nehmen an, dass wir Calibre-Web eingerichtet haben und das dazugehörige GIT Archiv auf einer Linuxmaschine in ‚/opt‘ also als ‚/opt/calibre-web‘ liegt. Als ‚venv‘ Ordner nutzen wir ‚/opt/calibre-web/venv‘. Außerdem nutzen wir den Nutzer ‚UserA‘, der auf das Verzeichnis zugreifen darf.
Dann legen wir mit:
sudo nano /etc/systemd/system/cps.service
unsere Systemservicedatei an.
Normalerweise würden wir erst in die virtuelle Umgebung wechseln, wenn wir ‚cps‘ von Hand starten möchten. Hier ist es jedoch nicht nötig, da wir ‚python‘ direkt im ‚venv‘ Ordner über die Systemservicedatei aufrufen können und ‚python‘ sich selbst die richtigen Dateien zusammensucht.
Als Inhalt schreiben wir folgendes rein:
[Unit]
Description=Calibre-Web
[Service]
Type=simple
User=UserA
ExecStart=/opt/calibre-web/venv/bin/python3 /opt/calibre-web/venv/bin/cps
WorkingDirectory=/opt/calibre-web/
[Install]
WantedBy=multi-user.target
Bei ExecStart sehen wir, dass wir genau die python3 Version aus der Virtuellen Umgebung aufrufen. So einfach kann es sein. (User anpassen nicht vergessen)
Am Ende noch:
systemctl daemon-reload
auszuführen.
systemctl status cps.service
Ausgabe:
● cps.service - calibre-web
Loaded: loaded (/etc/systemd/system/cps.service; disabled; vendor preset: enabled)
Active: inactive (dead)
Jetzt kann der Dienst noch für den Dauerbetrieb eingestellt werden (oder auch nicht):
sudo systemctl enable cps.service
Und dann einfach starten:
sudo systemctl start cps.service
Dann unter http://localhost:8083 öffnen.
