De bot op de achtergrond uitvoeren¶
In dit artikel
Om een Python-bot (of een andere) continu te laten draaien, automatisch te laten herstarten bij fouten en na een serverherstart te laten starten, is het simpelweg uitvoeren van python main.py niet voldoende. Je hebt een volwaardige achtergrondservice nodig.
Hieronder staan drie bewezen methoden: van de eenvoudige screen tot de industriële systemd. Kies op basis van uw vereisten.
Het omgeving voorbereiden¶
-
Plaats de botcode, bijvoorbeeld in
/home/user/bot: -
Maak een virtuele omgeving aan en activeer deze om afhankelijkheden te isoleren:
-
Installeer afhankelijkheden:
-
Test de handmatige start:
Opmerking
Voer de bot niet uit als root, tenzij dit noodzakelijk is. Het is beter om een toegewijde gebruiker aan te maken:
Methode 1. screen — snelle start (voor testen en ontwikkeling)¶
Voordelen: het makkelijkst om aan de slag te gaan.
Nadelen: start niet opnieuw op na een crash of herstart — niet geschikt voor productie.
Installatie:
Starten:
Beheer:
| Actie | Opdracht |
|---|---|
| Loskoppelen van sessie (achtergrond laten draaien) | Ctrl + A, dan D |
| Lijst van sessies bekijken | screen -ls |
| Terugkeren naar sessie | screen -r bot |
| Sessie beëindigen van binnenuit | Ctrl + A, dan K > Y |
Informatie
Bij een serverherstart of scriptcrash blijft de bot gestopt. Gebruik dit alleen voor tijdelijke taken.
Methode 2. systemd — Linux-standaard voor services (aanbevolen)¶
Voordelen: autostart, herstart bij fouten, logging, systeemintegratie.
Nadelen: vereist het schrijven van een configuratie.
-
Maak een unit-bestand aan:
-
Plak de configuratie (pas paden en gebruiker aan!):
[Unit] Description=Telegram Bot Service After=network.target StartLimitIntervalSec=30 StartLimitBurst=5 [Service] Type=simple User=botuser # ← aanbevolen niet root! Group=botuser WorkingDirectory=/home/user/bot ExecStart=/home/user/bot/venv/bin/python /home/user/bot/main.py Restart=always RestartSec=10 Environment="PYTHONUNBUFFERED=1" # zodat logs niet worden gebufferd # Beveiliging (optioneel, maar aanbevolen) NoNewPrivileges=true PrivateTmp=true ProtectSystem=strict ProtectHome=true ReadWritePaths=/home/user/bot/data/ # als de bot toegang tot data nodig heeft [Install] WantedBy=multi-user.target -
Schakel de service in:
-
Controleer status en logs:
Beveiligingstips
Beperk de service om toegang te krijgen tot onnodige delen van het systeem (via ProtectSystem, ReadOnlyPaths); Als de bot alleen internet nodig heeft — voeg RestrictNetwork=true toe en configureer IPAddressAllow=...; Gebruik RuntimeDirectory= voor tijdelijke bestanden.
Methode 3. PM2 — procesbeheerder (voor Node.js, maar ondersteunt Python)¶
Voordelen: eenvoud, ingebouwde logs, monitoring, webinterface.
Nadelen: vereist Node.js, overkill voor eenvoudige Python-bots.
Installatie:
# Installeer Node.js en npm (als deze nog niet zijn geïnstalleerd)
curl -fsSL https://deb.nodesource.com/setup_lts.x | sudo -E bash -
sudo apt install -y nodejs
# Installeer PM2 globaal
sudo npm install -g pm2
Start de Python-bot:
Nuttige opdrachten:
| Opdracht | Doel |
|---|---|
pm2 list | Lijst van processen |
pm2 logs my-bot | Logs bekijken |
pm2 monit | Realtime monitoring |
pm2 startup | Autostart configureren na herstart |
pm2 save | Huidige processen opslaan |
Informatie
Na pm2 startup, volg de instructies in de terminal — PM2 zal een systemd-unit genereren voor autostart.
Vergelijking van methoden¶
| Criterium | screen | systemd | PM2 |
|---|---|---|---|
| Autostart na herstart | Nee | Ja | Ja (vereist pm2 startup) |
| Herstart bij crash | Nee | Ja | Ja |
| Logging | Alleen in sessie | journalctl | Ingebouwde logs |
| Beveiliging | Laag | Hoog (isolatie-instellingen) | Gemiddeld |
| Configuratiecomplexiteit | Laag | Gemiddeld | Laag (maar vereist Node.js) |
| Geschikt voor productie | Nee | Aanbevolen | Ja (als Node.js al wordt gebruikt) |
Aanvullend
Stel waarschuwingen in wanneer de bot stopt (bijv. via systemd + healthchecks.io);
Werk afhankelijkheden regelmatig bij pip list --outdated;
Gebruik .env-bestanden en python-dotenv om tokens op te slaan (en sluit ze uit van Git!).