NOUVEAU 📢 Offre de lancement limitée : jusqu'à 70 % de remise sur votre premier mois, pour tous les jeux !Voir les offres

Comment héberger un bot telebot 24/7 (Go, Telegram)

Hébergement de bots TelegramUpdated Nov 6, 202614 min read

Pour héberger un bot telebot 24/7, vous le faites tourner sur une machine toujours allumée : un VPS Linux avec un service systemd qui le relance quand il s’arrête, ou une offre bot chez PlayNHost (à partir de 1,99 $US par mois), où vous envoyez le programme terminé et où le panneau lui donne le token et le relance s’il plante. Lors de notre test, un bot telebot 3.3.8 (gopkg.in/telebot.v3) a utilisé environ 11 Mo de mémoire. Un bot Go se compile sur votre propre ordinateur en un seul programme Linux x86-64 : rien n’est compilé sur le serveur. Les étapes chez PlayNHost :

  1. Compilez votre bot pour Linux x86-64 sur votre ordinateur, comme indiqué plus bas sous Build it for Linux.
  2. Sur l’hébergement de bots Telegram, cliquez sur Créer un serveur pour une offre. Dans la fenêtre de commande, répondez à Pour quelle plateforme est votre bot ? par Telegram et choisissez Go.
  3. Ouvrez votre serveur dans le panneau. La carte Configurer votre bot sur Aperçu s’ouvre sur Connexion à Telegram ; sa première étape, Ce qui tourne, doit indiquer Ce bot fait tourner Go Bot.
  4. Dans Connexion à Telegram, collez le token de @BotFather sous Collez le token de votre bot, cliquez sur Connexion, vérifiez le nom du bot affiché et cliquez sur Oui, continuer.
  5. Dans Votre code, cliquez sur Téléverser des fichiers, puis dans Files cliquez sur Téléverser et choisissez votre programme, nommé bot. Ou laissez le serveur le récupérer : sur la page Bot, volet Code, carte Paramètres, renseignez Lien de téléchargement (facultatif) avec un lien https vers le programme et cliquez sur Enregistrer.
  6. Cliquez sur Démarrer le bot et ouvrez Console. Après [PlayNHost] Starting your bot, votre bot affiche Logged in as @your_bot, et la pastille sur Aperçu passe à En ligne sur Telegram.
  7. Sur la page Bot, volet Telegram, cliquez sur Ouvrir dans Telegram et envoyez /start à votre bot.

La création du bot dans @BotFather et la carte de configuration sont expliquées dans Comment héberger un bot Telegram. Le type Go Bot lui-même (le Fichier d’entrée, les Arguments de démarrage (facultatif) et le lien de téléchargement) est le même pour les bots Discord et Telegram : Comment héberger un bot Discord Go. Cette page parle de telebot : ce qu’il utilise sur un serveur et ce qu’il faut savoir avant de l’héberger.

Ce que nous avons mesuré

BibliothèqueVersionMémoire sans chargeDu démarrage à la réponse de la plateformeTaille du programme
telebot (Telegram)3.3.811 Mo0,1 s8,1 Mo
go-telegram/bot (Telegram)1.27.011 Mo0,1 s8,1 Mo
discordgo (Discord)0.29.012 Mo0,3 s9,0 Mo
Un programme Go sans bibliothèqueGo 1.23.122 Moaucune2,1 Mo

Méthode : sur notre propre nœud, dans un conteneur jetable configuré comme une offre bot de 1 Go avec un CPU et l’image Debian sur laquelle tourne notre type Go Bot, le programme de chaque bibliothèque a appelé Telegram ou Discord avec un faux token, qui a été refusé ; le programme sans bibliothèque n’a fait aucun appel. La mémoire est la mémoire résidente 15 secondes après cette réponse, le temps de démarrage court du lancement à la réponse, et chaque valeur est la médiane des exécutions 2 à 4. Les programmes ont été compilés avec Go 1.23.12 et CGO_ENABLED=0.

Ce sont des planchers : un programme sans conversations ni données. Votre propre code, ce qu’il garde en mémoire et le nombre de conversations s’y ajoutent, donc un programme telebot minimal n’utilise qu’une petite partie de l’offre STARTER de 0,5 Go.

Un bot telebot minimal

Il répond à /start, lit le token que lui donne le panneau, affiche une ligne de démarrage, dit clairement quand Telegram refuse le token et s’arrête proprement quand vous cliquez sur Arrêter. Mettez les deux fichiers dans un même dossier, puis lancez go mod tidy, qui télécharge telebot et écrit go.sum.

go.mod

module bot

go 1.23

require gopkg.in/telebot.v3 v3.3.8

main.go

package main

import (
	"errors"
	"fmt"
	"os"
	"os/signal"
	"strings"
	"syscall"
	"time"

	tele "gopkg.in/telebot.v3"
	"gopkg.in/telebot.v3/middleware"
)

func main() {
	token := os.Getenv("TELEGRAM_BOT_TOKEN")
	if token == "" {
		fmt.Println("TELEGRAM_BOT_TOKEN is not set. Paste your token on the Bot page, Telegram, then restart.")
		os.Exit(1)
	}
	// Network errors contain the request address, and the address contains the token.
	hide := func(err error) string { return strings.ReplaceAll(err.Error(), token, "<token>") }

	b, err := tele.NewBot(tele.Settings{
		Token:  token,
		Poller: &tele.LongPoller{Timeout: 10 * time.Second},
	})
	if errors.Is(err, tele.ErrUnauthorized) {
		fmt.Println("Telegram did not accept the bot token. Paste the current one from @BotFather, then restart.")
		os.Exit(1)
	}
	if err != nil {
		fmt.Println("Could not start the bot:", hide(err))
		os.Exit(1)
	}

	// Without this, a panic in one handler stops the whole program.
	b.Use(middleware.Recover())

	b.Handle("/start", func(c tele.Context) error {
		return c.Send("Hello! I am running on PlayNHost.")
	})

	// A webhook left on the bot blocks polling. Remove it and keep the messages that are waiting.
	if err := b.RemoveWebhook(); err != nil {
		fmt.Println("Could not remove the webhook:", hide(err))
	}

	fmt.Println("Logged in as @" + b.Me.Username)
	go b.Start()

	// The panel stops the bot with Ctrl+C (SIGINT).
	stop := make(chan os.Signal, 1)
	signal.Notify(stop, os.Interrupt, syscall.SIGTERM)
	<-stop
	b.Stop()
}

La ligne Logged in as @your_bot est ce qui fait passer la pastille à En ligne sur Telegram. Le panneau donne le token à votre programme sous le nom TELEGRAM_BOT_TOKEN, et aussi TOKEN, BOT_TOKEN, TELEGRAM_TOKEN et TELOXIDE_TOKEN. L’exemple du README de telebot lit os.Getenv("TOKEN"), donc sa ligne de token fonctionne aussi sans changement.

Compiler pour Linux

Depuis le dossier de votre projet, sur n’importe quel ordinateur :

# macOS or Linux
GOOS=linux GOARCH=amd64 CGO_ENABLED=0 go build -o bot

# Windows PowerShell
$env:GOOS="linux"; $env:GOARCH="amd64"; $env:CGO_ENABLED="0"; go build -o bot

CGO_ENABLED=0 produit un seul fichier autonome qui ne dépend pas des bibliothèques système du serveur, il fonctionne donc sur notre image Debian quel que soit le système sur lequel vous compilez. Le résultat est un fichier nommé bot, sans extension. Un .exe Windows ou une compilation macOS ne fonctionne pas sur le serveur : la console affiche alors [PlayNHost] bot is not a Linux program. Build it for Linux x86-64 (not Windows or macOS) and upload it again.

Si le token est incorrect

Lors de notre test, avec un faux token, tele.NewBot a renvoyé cette erreur (notre programme de test l’a affichée après le type de l’erreur) :

*telebot.Error: telegram: Unauthorized (401)

NewBot demande à Telegram qui est le bot (getMe) avant de rendre la main, donc un token refusé arrête le programme avant qu’il ne fasse du polling. telebot renvoie son erreur ErrUnauthorized pour la réponse Unauthorized de Telegram. L’exemple du README termine le programme avec log.Fatal(err) ; le bot ci-dessus affiche à la place Telegram did not accept the bot token. Paste the current one from @BotFather, then restart., une ligne que le panneau reconnaît : il affiche alors le bandeau Telegram n’a pas accepté le token de votre bot au-dessus de Console.

Pour corriger, dans @BotFather envoyez /mybots, choisissez votre bot, puis API Token, et copiez à nouveau le token. Sur la page Bot, volet Telegram, cliquez sur Remplacer le token, collez-le, cliquez sur Enregistrer le token, puis sur Redémarrer maintenant.

Ce qu’il faut savoir sur telebot sur un serveur

  • Les erreurs pendant le polling sont silencieuses. Quand la demande de messages à Telegram échoue, le LongPoller de telebot réessaie aussitôt, sans pause, et n’affiche l’erreur que si Verbose est activé. Ainsi, quand une autre copie du bot fait du polling avec le même token (409 Conflict), qu’un webhook est défini ou que le token est révoqué pendant que le bot tourne, votre bot continue de tourner mais reçoit peu ou pas de messages, et la console reste muette. Arrêtez toute autre copie avant de le démarrer ici, et consultez Corriger l’erreur 409 Conflict d’un bot Telegram.
  • Voir ce que fait le polling. Verbose: true dans tele.Settings journalise chaque requête et la réponse de Telegram, si bien que le texte 409 Conflict apparaît dans Console et que le panneau peut afficher Votre bot tourne aussi ailleurs. Il journalise aussi les messages que les gens envoient à votre bot : activez-le pour un test, pas en permanence.
  • Un webhook resté sur le bot. b.Start() ne supprime pas de webhook, et tant qu’il y en a un, le polling échoue en silence. Le bot ci-dessus appelle b.RemoveWebhook() avant de démarrer, ce qui conserve les messages en attente. Vous pouvez aussi cliquer sur Retirer le webhook dans le volet Telegram. Le poller Webhook de telebot a besoin d’une adresse HTTPS publique, que nos offres n’incluent pas encore : utilisez LongPoller.
  • Un panic dans un handler arrête le programme. telebot exécute chaque handler dans sa propre goroutine (sauf si Synchronous est activé), et un panic à cet endroit arrête tout. b.Use(middleware.Recover()) transforme un panic en erreur qui est affichée. Appelez b.Use avant b.Handle : le middleware est attaché au moment où un handler est ajouté.
  • Les erreurs des handlers sont affichées pour vous. Une erreur renvoyée par votre handler va au gestionnaire d’erreurs par défaut de telebot, qui affiche le numéro de la mise à jour et l’erreur. Définissez OnError dans tele.Settings pour changer cela.
  • Votre token dans les messages d’erreur. telebot place le token dans l’adresse de chaque requête (/bot suivi du token), et les erreurs réseau de Go incluent cette adresse. Le bot ci-dessus remplace le token avant d’afficher une erreur. Ne partagez pas la sortie brute de la console d’un bot qui affiche les erreurs telles quelles.
  • Un arrêt propre. Le panneau arrête un bot Go avec Ctrl+C (SIGINT). b.Start() tourne jusqu’à l’appel de b.Stop(), donc le bot ci-dessus le lance dans une goroutine, attend le signal puis appelle b.Stop(), qui annule la requête en cours.
  • Mises à jour. Le type Go Bot n’a pas de champ Paquets ni de source Git : vos modules sont dans le programme. Pour mettre à jour, supprimez l’ancien programme dans Files, envoyez la nouvelle compilation et redémarrez. Avec un lien de téléchargement, publiez la nouvelle compilation à ce lien, supprimez le programme dans Files et cliquez sur Démarrer.

L’héberger vous-même sur un VPS Linux

Copiez le programme compilé sur le VPS ; il n’a pas besoin de Go là-bas, et une compilation avec CGO_ENABLED=0 ne dépend pas des bibliothèques système du VPS. Créez un utilisateur pour le bot, placez le programme dans son dossier et gardez le token dans un fichier que seul root peut lire :

sudo useradd --system --create-home --home-dir /opt/mybot mybot
sudo install -o mybot -m 755 bot /opt/mybot/bot
sudo sh -c 'echo "TELEGRAM_BOT_TOKEN=123456789:your-token" > /etc/mybot.env'
sudo chmod 600 /etc/mybot.env

Créez /etc/systemd/system/mybot.service :

[Unit]
Description=telebot Telegram bot
Wants=network-online.target
After=network-online.target

[Service]
User=mybot
WorkingDirectory=/opt/mybot
EnvironmentFile=/etc/mybot.env
ExecStart=/opt/mybot/bot
Restart=always
RestartSec=5

[Install]
WantedBy=multi-user.target

Démarrez-le maintenant et à chaque démarrage, puis suivez sa sortie :

sudo systemctl daemon-reload
sudo systemctl enable --now mybot
sudo journalctl -u mybot -f

systemctl stop envoie SIGTERM par défaut, que le bot ci-dessus écoute aussi, il s’arrête donc proprement. Restart=always relance le bot après un plantage ou une sortie. Arrêtez d’abord toute autre copie : avec telebot, un 409 Conflict n’affiche rien non plus dans journalctl.

Auto-hébergement ou offre bot

Sur un VPS que vous gérez vous-même, vous vous occupez de :

  • Les mises à jour et la sécurité du système d’exploitation.
  • La copie de chaque nouvelle compilation, le fichier de service, le fichier du token et ses permissions.
  • La lecture de journalctl pour comprendre pourquoi le bot s’est arrêté.
  • Les sauvegardes des données du bot.

En échange, un VPS exécute n’importe quoi, et vous pouvez lui donner un domaine avec HTTPS pour un webhook.

Sur une offre bot PlayNHost, le panneau s’en charge pour vous :

  • Une image Debian qui exécute un programme Linux x86-64, et une vérification au démarrage qui vous le dit quand le fichier est une compilation Windows ou macOS.
  • Envoi dans Files, ou un lien de téléchargement que le serveur récupère au démarrage.
  • Le token, vérifié auprès de Telegram, stocké chiffré et donné à votre programme sous les noms TELEGRAM_BOT_TOKEN et TOKEN.
  • Le redémarrage du bot après un plantage. S’il replante dans la minute, il reste arrêté et Console en donne la raison.
  • Un bouton Retirer le webhook dans le volet Telegram, et un bandeau au-dessus de Console quand votre bot affiche que Telegram a refusé le token.

Questions fréquentes

Faut-il utiliser telebot v3 ou v4 ?

v3.3.8 (6 août 2024) est la dernière version stable, et celle que nous avons mesurée. Le travail est passé à v4 : c’est la branche par défaut du dépôt et son README installe gopkg.in/telebot.v4, mais c’est encore une bêta (v4.0.0-beta.10, 16 juin 2026). Les bêtas v4 ajoutent des versions plus récentes de l’API Bot de Telegram, jusqu’à Bot API 10.1 dans v4.0.0-beta.10, que v3.3.8 n’a pas. L’exemple de démarrage du README est le même dans les deux, hormis le chemin d’import. Les deux fonctionnent de la même façon sur nos serveurs : compiler, envoyer, démarrer.

Pourquoi mon bot telebot tourne mais ne répond pas ?

Le plus souvent, une autre copie fait du polling avec le même token, sur votre PC ou un ancien hébergeur, ou un webhook est défini. telebot n’affiche ni l’un ni l’autre, donc la console a l’air normale. Arrêtez l’autre copie, ou révoquez le token dans @BotFather et collez le nouveau dans le volet Telegram ; vérifiez dans le même volet s’il y a un webhook. Pour voir la cause, redémarrez une fois avec Verbose: true.

Puis-je utiliser le webhook de telebot à la place du polling ?

Pas encore. Un webhook a besoin d’une adresse HTTPS publique, que nos offres n’incluent pas encore. LongPoller n’a besoin d’aucune adresse : le bot demande à Telegram les nouveaux messages, avec une attente de 10 secondes dans le bot ci-dessus.

telebot ou go-telegram/bot ?

Les deux fonctionnent de la même façon sur le type Go Bot. Lors de notre test, go-telegram/bot a utilisé 11 Mo contre 11 Mo pour telebot, la mémoire ne départage donc pas les deux. La dernière version de go-telegram/bot est la v1.27.0, du 11 sept. 2026. Si vous suivez un tutoriel, utilisez la bibliothèque qu’il emploie.

Prêt à faire tourner votre bot telebot en continu ? Consultez les offres sur l’hébergement de bots Telegram.

Votre bot est hébergé ailleurs ? Transférez-le chez nous

NOS DERNIERS ARTICLES