Aller au contenu

Exécution du bot en arrière-plan

Dans cet article

Pour qu'un bot Python (ou tout autre langage) s'exécute en continu, redémarre automatiquement en cas d'échec et redémarre après un redémarrage du serveur, il ne suffit pas simplement de lancer python main.py. Vous avez besoin d'un service en arrière-plan à part entière.

Voici trois méthodes éprouvées : de la simple commande screen à systemd de niveau industriel. Choisissez en fonction de vos besoins.

Préparation de l'environnement

  1. Placez le code du bot, par exemple dans /home/user/bot :

    mkdir -p /home/user/bot && cd /home/user/bot
    

  2. Créez et activez un environnement virtuel pour isoler les dépendances :

    python3 -m venv venv
    source venv/bin/activate
    

  3. Installez les dépendances :

    pip install -r requirements.txt
    # If the file does not exist — install manually, e.g., pip install python-telegram-bot
    

  4. Testez le lancement manuel :

    python main.py
    

Remarque

N'exécutez pas le bot en tant que root sauf si cela est nécessaire. Il est préférable de créer un utilisateur dédié :

sudo adduser --disabled-login botuser
sudo chown -R botuser:botuser /home/user/bot

Méthode 1. screen — lancement rapide (pour les tests et le développement)

Avantages : le plus simple pour démarrer.
Inconvénients : ne redémarre pas après un plantage ou un redémarrage — non adapté à la production.

Installation :

sudo apt update && sudo apt install screen -y

Lancement :

screen -S bot  # create a named session
source venv/bin/activate
python main.py

Gestion :

Action Commande
Détacher de la session (laisser en arrière-plan) Ctrl + A, puis D
Voir la liste des sessions screen -ls
Revenir à la session screen -r bot
Terminer la session depuis l'intérieur Ctrl + A, puis K > Y

Information

Lors d'un redémarrage du serveur ou d'un plantage du script, le bot restera arrêté. À utiliser uniquement pour des tâches temporaires.

Méthode 2. systemd — standard Linux pour les services (recommandé)

Avantages : démarrage automatique, redémarrage en cas d'erreur, journalisation, intégration système.
Inconvénients : nécessite la rédaction d'une configuration.

  1. Créez un fichier d'unité :

    sudo nano /etc/systemd/system/bot.service
    

  2. Collez la configuration (adaptez les chemins et l'utilisateur !) :

    [Unit]
    Description=Telegram Bot Service
    After=network.target
    StartLimitIntervalSec=30
    StartLimitBurst=5
    
    [Service]
    Type=simple
    User=botuser                 # ← recommended not 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"  # so logs aren't buffered
    
    # Sécurité (optionnel, mais recommandé)
    NoNewPrivileges=true
    PrivateTmp=true
    ProtectSystem=strict
    ProtectHome=true
    ReadWritePaths=/home/user/bot/data/  # if the bot needs data access
    
    [Install]
    WantedBy=multi-user.target
    

  3. Activez le service :

    sudo systemctl daemon-reload
    sudo systemctl enable bot.service   # autostart on boot
    sudo systemctl start bot.service    # start now
    

  4. Vérifiez l'état et les journaux :

    sudo systemctl status bot.service
    journalctl -u bot.service -f --since "1 hour ago"
    

Conseils de sécurité

Restreignez l'accès du service aux parties inutiles du système (via ProtectSystem, ReadOnlyPaths) ; Si le bot n'a besoin que d'Internet — ajoutez RestrictNetwork=true et configurez IPAddressAllow=... ; Utilisez RuntimeDirectory= pour les fichiers temporaires.

Méthode 3. PM2 — gestionnaire de processus (pour Node.js, mais prend en charge Python)

Avantages : simplicité, journaux intégrés, surveillance, interface web.
Inconvénients : nécessite Node.js, excessif pour les bots Python simples.

Installation :

# Install Node.js and npm (if not already installed)
curl -fsSL https://deb.nodesource.com/setup_lts.x | sudo -E bash -
sudo apt install -y nodejs

# Install PM2 globally
sudo npm install -g pm2

Démarrer le bot Python :

cd /home/user/bot
pm2 start main.py --name "my-bot" --interpreter ./venv/bin/python

Commandes utiles :

Commande Objectif
pm2 list Liste des processus
pm2 logs my-bot Voir les journaux
pm2 monit Surveillance en temps réel
pm2 startup Configurer le démarrage automatique après redémarrage
pm2 save Sauvegarder les processus actuels

Information

Après pm2 startup, suivez les instructions du terminal — PM2 générera une unité systemd pour le démarrage automatique.

Comparaison des méthodes

Critère screen systemd PM2
Démarrage automatique après redémarrage Non Oui Oui (nécessite pm2 startup)
Redémarrage en cas de plantage Non Oui Oui
Journalisation Uniquement dans la session journalctl Journaux intégrés
Sécurité Faible Élevée (paramètres d'isolation) Moyenne
Complexité de configuration Faible Moyenne Faible (mais nécessite Node.js)
Adapté à la production Non Recommandé Oui (si vous utilisez déjà Node.js)

Supplémentaire

Configurez des alertes lorsque le bot s'arrête (par exemple, via systemd + healthchecks.io) ;
Mettez régulièrement à jour les dépendances pip list --outdated ;
Utilisez des fichiers .env et python-dotenv pour stocker les jetons (et excluez-les de Git !)