Skip to main content

Ajout d'un service dans systemd

Mettre un bot Python dans systemd

Ce guide explique comment exécuter un bot Python comme service systemd sur Linux, avec un environnement virtuel et un fichier de variables d'environnement. Le point clé est d'utiliser le binaire Python du virtualenv directement dans ExecStart, puis d'activer le service pour qu'il démarre automatiquement au boot [cite:150][cite:160].

Prérequis

Le projet doit idéalement contenir :

  • bot.py
  • un virtualenv, ici nommé env
  • un fichier .env pour les variables sensibles comme le token Discord

Exemple d'arborescence :

/home/toto/discord-bot-application/
├── bot.py
├── .env
└── env/

Le virtualenv peut avoir n'importe quel nom, mais il faut ensuite pointer vers le bon chemin dans ExecStart [cite:150][cite:342].

Vérifier les chemins

Avant de créer le service, il faut vérifier que les chemins existent réellement :

ls -la /home/toto/discord-bot-application
ls -la /home/toto/discord-bot-application/env/bin/python

Si le second chemin existe, systemd pourra lancer le script avec le Python du virtualenv [cite:164][cite:345].

Créer le fichier .env

Le fichier .env sert à stocker les variables d'environnement du bot, comme le token Discord ou les IDs du serveur et du salon. Avec systemd, ce fichier peut être chargé via EnvironmentFile= [cite:167][cite:349].

Exemple :

DISCORD_BOT_TOKEN=TON_TOKEN_ICI
DISCORD_GUILD_ID=TON_SERVER_ID
DISCORD_CHANNEL_ID=TON_CHANNEL_ID

Le format attendu est CLE=VALEUR, sans export [cite:167][cite:178].

Pour limiter l'accès au fichier :

chmod 600 /home/toto/discord-bot-application/.env

Tester le bot manuellement

Avant de passer par systemd, il est préférable de confirmer que le script démarre correctement à la main depuis le virtualenv [cite:150][cite:160].

cd /home/toto/discord-bot-application
source env/bin/activate
python bot.py

Si le bot affiche un message comme Bot prêt, la partie Python est probablement correcte [cite:150].

Créer le service systemd

Créer le fichier du service :

sudo nano /etc/systemd/system/discord-job-bot.service

Puis coller ce contenu :

[Unit]
Description=Discord Job Bot
After=network.target

[Service]
Type=simple
User=toto
Group=toto
WorkingDirectory=/home/toto/discord-bot-application
EnvironmentFile=/home/toto/discord-bot-application/.env
Environment=PYTHONUNBUFFERED=1
ExecStart=/home/toto/discord-bot-application/env/bin/python /home/toto/discord-bot-application/bot.py
Restart=always
RestartSec=5

[Install]
WantedBy=multi-user.target
Explication des lignes importantes
  • User et Group : définissent l'utilisateur Linux qui exécutera le bot [cite:150].
  • WorkingDirectory : fixe le dossier courant du projet [cite:151][cite:160].
  • EnvironmentFile : charge les variables du fichier .env [cite:167][cite:178].
  • Environment=PYTHONUNBUFFERED=1 : force l'affichage immédiat des logs Python dans journalctl [cite:334].
  • ExecStart : lance directement le script avec le Python du virtualenv env [cite:150][cite:152].
  • Restart=always : redémarre automatiquement le bot s'il s'arrête [cite:333][cite:338].

Recharger systemd et démarrer le service

Après création ou modification du fichier .service, il faut recharger la configuration systemd, activer le service au démarrage, puis le lancer [cite:150][cite:332].

sudo systemctl daemon-reload
sudo systemctl enable discord-job-bot.service
sudo systemctl start discord-job-bot.service

Vérifier l'état du service

Pour vérifier que le service est bien actif :

sudo systemctl status discord-job-bot.service

Pour suivre les logs en direct :

journalctl -u discord-job-bot.service -f

journalctl est l'outil standard pour consulter les logs systemd et diagnostiquer les problèmes de démarrage [cite:336][cite:334].

Commandes utiles

Redémarrer le service après modification du code :

sudo systemctl restart discord-job-bot.service

Arrêter le service :

sudo systemctl stop discord-job-bot.service

Désactiver le lancement automatique au démarrage :

sudo systemctl disable discord-job-bot.service

Erreurs fréquentes

Les problèmes les plus fréquents sont :

  • mauvais chemin dans ExecStart
  • mauvais utilisateur dans User
  • fichier .env absent ou mal formaté
  • dépendances Python non installées dans le virtualenv
  • permissions insuffisantes sur les fichiers du projet [cite:150][cite:152][cite:335]

Pour afficher les 50 dernières lignes de logs sans pagination :

journalctl -u discord-job-bot.service -n 50 --no-pager

Exemple final prêt à copier

Fichier service
[Unit]
Description=Discord Job Bot
After=network.target

[Service]
Type=simple
User=toto
Group=toto
WorkingDirectory=/home/toto/discord-bot-application
EnvironmentFile=/home/toto/discord-bot-application/.env
Environment=PYTHONUNBUFFERED=1
ExecStart=/home/toto/discord-bot-application/env/bin/python /home/toto/discord-bot-application/bot.py
Restart=always
RestartSec=5

[Install]
WantedBy=multi-user.target
Commandes d'activation
sudo systemctl daemon-reload
sudo systemctl enable discord-job-bot.service
sudo systemctl start discord-job-bot.service
sudo systemctl status discord-job-bot.service
journalctl -u discord-job-bot.service -f