Bot Telegram sur un serveur : lancement et démarrage automatique
Comment héberger un bot Telegram sur un VPS : isolation sous son propre utilisateur, un service systemd, stockage du token, journaux, et gestion des coupures réseau.
Mis à jour le 23 août 2026
Un bot a besoin d'un processus constamment actif — c'est là que l'hébergement gratuit s'arrête et que le VDS commence. Un bot consomme très peu de ressources : même un VDS-1 (1 cœur, 2 Go) fait tourner un bot avec des milliers d'utilisateurs.
Mise en place
Un utilisateur et un répertoire dédiés — pour que le bot ne tourne pas en root :
useradd -r -m -d /srv/bot -s /usr/sbin/nologin botuser
cd /srv/bot && sudo -u botuser git clone https://github.com/you/bot.git .
sudo -u botuser python3 -m venv venv
sudo -u botuser venv/bin/pip install -r requirements.txt
Pour Node.js : npm ci --omit=dev au lieu d'un venv.
Conservez le token dans un fichier d'environnement, pas dans le code :
install -o botuser -g botuser -m 600 /dev/null /srv/bot/.env
echo 'BOT_TOKEN=123456:ABC...' > /srv/bot/.env
Le fichier contenant le token ne doit pas se retrouver dans le dépôt : ajoutez-le au .gitignore avant le premier commit.
Service
/etc/systemd/system/tgbot.service :
[Unit]
Description=Telegram bot
After=network-online.target
Wants=network-online.target
[Service]
User=botuser
WorkingDirectory=/srv/bot
EnvironmentFile=/srv/bot/.env
ExecStart=/srv/bot/venv/bin/python -u bot.py
Restart=always
RestartSec=10
NoNewPrivileges=true
[Install]
WantedBy=multi-user.target
systemctl daemon-reload
systemctl enable --now tgbot
journalctl -u tgbot -f
L'option -u de Python désactive la mise en tampon de la sortie — sans elle, les logs apparaîtront dans le journal avec plusieurs minutes de retard, voire pas du tout.
Long polling ou webhook
Le long polling est plus simple : le bot interroge Telegram lui-même et vous n'avez rien à exposer. Cela suffit pour la plupart des tâches.
Un webhook est plus rapide et plus économe en trafic, mais il exige un domaine et un certificat :
location /bot/token {
proxy_pass http://127.0.0.1:8080;
proxy_set_header Host $host;
}
Vous aurez besoin de Let's Encrypt et d'un reverse proxy. Telegram accepte à contrecœur les certificats auto-signés — utilisez un certificat classique.
Il ne doit jamais y avoir deux copies du bot en fonctionnement simultané : Telegram ne livre les mises à jour qu'à un seul destinataire, et les bots se mettront à répondre par intermittence. Après des modifications, faites un restart, pas un second lancement.
Données
SQLite suffit pour les paramètres et les statistiques — un fichier à côté du bot. Un serveur de base de données séparé n'est nécessaire que si le bot dispose d'un panneau web ou de plusieurs processus.
Erreurs courantes
| Symptôme | Cause |
|---|---|
Conflict: terminated by other getUpdates | Deux copies du bot sont en fonctionnement |
| Le bot devient muet après une nuit | Restart=always n'est pas configuré et le processus a planté lors d'une coupure réseau |
Unauthorized | Le token a été révoqué ou copié avec des espaces en trop |
| Aucun log | Mise en tampon de la sortie, ou écriture dans un fichier au lieu de stdout |
| Fonctionne manuellement, plante en service | Variables d'environnement absentes dans systemd |
Un token apparu dans une capture d'écran, un dépôt public ou la conversation de quelqu'un d'autre est considéré comme compromis. Révoquez-le via BotFather et modifiez le fichier
.env— ne comptez pas sur le fait que personne ne le remarque.