Zum Inhalt springen
CitexNode
Alle Anleitungen

Python, venv und Dienste

Python 3 mit virtueller Umgebung und pip, und ein Bot oder Skript als systemd-Dienst.

4 Min. Lesezeit

Gilt für Debian 12/13, Ubuntu 22.04/24.04, AlmaLinux 9 und Rocky Linux 9. Am Ende läuft dein Python-Programm in einer eigenen Umgebung als Dienst, mit Logs im Journal.

1. Python installieren

Python 3 ist auf allen Systemen schon da. Es fehlen meist nur venv und pip.

Debian und Ubuntu:

bash
apt install -y python3 python3-venv python3-pip

AlmaLinux und Rocky Linux:

bash
dnf install -y python3 python3-pip

Welche Version du hast:

Systempython3
Debian 123.11
Debian 133.13
Ubuntu 22.043.10
Ubuntu 24.043.12
AlmaLinux/Rocky 93.9

Braucht dein Programm auf AlmaLinux oder Rocky eine neuere Version, installier sie zusätzlich. python3 bleibt dabei 3.9, weil das System es braucht:

bash
dnf install -y python3.12 python3.12-pip

Dann nimmst du überall unten python3.12 statt python3.

bash
python3 --version

2. Benutzer und Ordner

bash
useradd --system --create-home --home-dir /opt/pybot --shell /usr/sbin/nologin pybot

Bring deinen Code nach /opt/pybot/app, per Git oder SFTP, und gib ihn dem Benutzer:

bash
chown -R pybot:pybot /opt/pybot

3. Virtuelle Umgebung und pip

Eine virtuelle Umgebung (venv) ist ein eigener Ordner mit Python und Paketen nur für dieses Programm. So kommen sich Programme nicht in die Quere, und du brauchst kein root für pip.

bash
sudo -u pybot python3 -m venv /opt/pybot/venv
sudo -u pybot /opt/pybot/venv/bin/pip install --upgrade pip
sudo -u pybot /opt/pybot/venv/bin/pip install -r /opt/pybot/app/requirements.txt

Ohne requirements.txt installierst du Pakete einzeln, etwa …/pip install discord.py.

Zum Arbeiten von Hand aktivierst du die Umgebung:

bash
source /opt/pybot/venv/bin/activate
python --version
deactivate

4. Geheimnisse in eine Env-Datei

Tokens und Passwörter gehören nicht in den Code:

bash
install -d -m 0750 /etc/pybot
nano /etc/pybot/pybot.env
ini
DISCORD_TOKEN=dein-token
bash
chmod 600 /etc/pybot/pybot.env

Im Code:

python
import os
token = os.environ["DISCORD_TOKEN"]

5. systemd-Dienst

bash
nano /etc/systemd/system/pybot.service
ini
[Unit]
Description=Python-Bot
After=network-online.target
Wants=network-online.target

[Service]
Type=simple
User=pybot
WorkingDirectory=/opt/pybot/app
EnvironmentFile=/etc/pybot/pybot.env
Environment=PYTHONUNBUFFERED=1
ExecStart=/opt/pybot/venv/bin/python main.py
Restart=on-failure
RestartSec=5
NoNewPrivileges=true
ProtectSystem=full
ProtectHome=true

[Install]
WantedBy=multi-user.target

Ersetz main.py durch deine Startdatei. PYTHONUNBUFFERED=1 sorgt dafür, dass print() sofort im Journal landet statt erst später.

bash
systemctl daemon-reload
systemctl enable --now pybot

Ein Skript regelmäßig ausführen

Für ein Skript, das nicht dauerhaft läuft, sondern etwa stündlich, nimm einen Timer statt Restart. Im Dienst Type=oneshot setzen und Restart-Zeilen sowie [Install] weglassen, dann:

bash
nano /etc/systemd/system/pybot.timer
ini
[Unit]
Description=Python-Skript stündlich

[Timer]
OnCalendar=hourly
Persistent=true

[Install]
WantedBy=timers.target
bash
systemctl daemon-reload
systemctl enable --now pybot.timer
systemctl list-timers pybot.timer

Prüfen, ob es läuft

bash
systemctl status pybot
journalctl -u pybot -f

active (running) und deine Ausgaben im Journal. Strg+C beendet nur die Anzeige.

Aktualisieren

bash
cd /opt/pybot/app
sudo -u pybot git pull
sudo -u pybot /opt/pybot/venv/bin/pip install -r requirements.txt
systemctl restart pybot

Nach einem Upgrade der Distribution auf eine neue Python-Version (etwa Debian 12 auf 13) die venv neu anlegen: Ordner löschen, Schritt 3 wiederholen.

Häufige Fehler

MeldungUrsache und Lösung
error: externally-managed-environmentpip install ohne venv. Das System schützt seine eigenen Pakete. Nimm die venv aus Schritt 3.
The virtual environment was not created successfully because ensurepip is not availablepython3-venv fehlt (Debian/Ubuntu): apt install python3-venv.
ModuleNotFoundError im Dienst, von Hand geht esDer Dienst nutzt ein anderes Python. ExecStart muss auf /opt/pybot/venv/bin/python zeigen.
status=203/EXECPfad in ExecStart falsch oder venv fehlt.
KeyError: 'DISCORD_TOKEN'Variable fehlt in der Env-Datei oder EnvironmentFile ist falsch geschrieben.
Keine Ausgabe im JournalPYTHONUNBUFFERED=1 fehlt.

Wie es weitergeht