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 teloxide 24/7

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

Pour héberger un bot teloxide 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 de bot chez PlayNHost (à partir de 1,99 $US par mois), où vous envoyez le programme terminé et où le panel lui donne le token et le relance s’il plante. Dans notre test, un bot teloxide 0.17.0 a utilisé environ 13 Mo de mémoire. Un bot Rust se compile sur votre propre ordinateur en un seul programme Linux x86-64 : rien n’est compilé sur le serveur. Bot::from_env() de teloxide lit le token dans TELOXIDE_TOKEN, un nom que le panel définit pour vous. Les étapes sur PlayNHost :

  1. Compilez votre bot pour Linux x86-64 sur votre ordinateur, comme indiqué plus bas sous Compiler pour 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 Rust.
  3. Ouvrez votre serveur dans le panel. 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 Rust Bot.
  4. Sur Connexion à Telegram, collez le token reçu 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. Sur 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 Rust 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 Rust. Cette page porte sur teloxide : 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
teloxide (Telegram)0.17.013 Mo0,1 s3,0 Mo
serenity (Discord)0.12.510 Mo0,4 s13,4 Mo

Méthode : sur notre propre nœud, dans un conteneur jetable configuré comme une offre de bot de 1 Go avec un CPU et l’image Debian sur laquelle tourne notre type Rust Bot, chaque programme a appelé Telegram ou Discord avec un faux token, qui a été refusé. La mémoire est la mémoire résidente 15 secondes après cette réponse, le temps de démarrage va du lancement à la réponse, et chaque valeur est la médiane des essais 2 à 4. Les deux programmes ont été compilés avec Rust stable et cargo build --release sur cette même image, avec pkg-config et libssl-dev ajoutés pour la compilation ; la compilation de teloxide a pris 107 s avec un CPU, téléchargements compris, prenez donc cette valeur comme un ordre de grandeur.

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

Un bot teloxide minimal

Il répond à /start, lit le token que lui donne le panel, affiche une ligne de démarrage et signale clairement quand Telegram refuse le token. Créez un projet avec cargo new bot et utilisez ces deux fichiers. Le nom de paquet bot donne le programme bot, le Fichier d’entrée par défaut.

Cargo.toml

[package]
name = "bot"
version = "0.1.0"
edition = "2021"

[dependencies]
teloxide = { version = "0.17", features = ["macros"] }
tokio = { version = "1", features = ["macros", "rt-multi-thread"] }
pretty_env_logger = "0.5"

src/main.rs

use teloxide::{prelude::*, utils::command::BotCommands, ApiError, RequestError};

#[derive(BotCommands, Clone)]
#[command(rename_rule = "lowercase")]
enum Command {
    /// Say hello.
    Start,
}

async fn answer(bot: Bot, msg: Message, cmd: Command) -> ResponseResult<()> {
    match cmd {
        Command::Start => {
            bot.send_message(msg.chat.id, "Hello! I am running on PlayNHost.").await?;
        }
    }
    Ok(())
}

#[tokio::main]
async fn main() {
    // Prints teloxide's errors, such as a 409 Conflict while polling. Without a logger they are silent.
    pretty_env_logger::init();

    // Reads TELOXIDE_TOKEN, which the panel sets from the token on the Telegram pane.
    let bot = Bot::from_env();

    match bot.get_me().await {
        Ok(me) => println!("Logged in as @{}", me.username()),
        Err(RequestError::Api(ApiError::InvalidToken)) => {
            println!("Telegram did not accept the bot token. Paste the current one from @BotFather, then restart.");
            std::process::exit(1);
        }
        Err(err) => {
            println!("Could not start the bot: {err}");
            std::process::exit(1);
        }
    }

    // Long polling: removes a webhook left on the bot, then asks Telegram for messages.
    Command::repl(bot, answer).await;
}

La ligne Logged in as @your_bot fait passer la pastille à En ligne sur Telegram. Command::repl tourne jusqu’à l’arrêt du bot. Le code suit l’exemple de commande du dépôt de teloxide lui-même ; pretty_env_logger est le logger qu’utilisent les exemples de teloxide.

Compiler pour Linux

Le serveur exécute votre programme sur Debian 13, avec glibc 2.41 et OpenSSL 3. Un .exe Windows ou une compilation macOS ne s’y exécute pas : 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. Deux façons de compiler :

Sous Linux, avec les fonctionnalités par défaut de teloxide

sudo apt install build-essential pkg-config libssl-dev
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
cargo build --release

Le programme est target/release/bot. Les fonctionnalités par défaut de teloxide utilisent native-tls, qui lie sous Linux l’OpenSSL du système ; la compilation a donc besoin de pkg-config et libssl-dev ; le serveur a OpenSSL 3. Compilez sous Debian 12 ou 13, ou Ubuntu 22.04 ou 24.04 : leur glibc (2.36, 2.41, 2.35 et 2.39) n’est pas plus récente que celle du serveur. Un programme compilé sur un système plus récent, comme Ubuntu 26.04 avec glibc 2.43, peut demander des fonctions que le serveur n’a pas, et s’arrête alors au démarrage avec une erreur indiquant qu’une version GLIBC_ est introuvable. La compilation musl évite cela.

Depuis Windows, macOS ou n’importe quel Linux : une compilation musl

Un programme musl est un fichier autonome qui ne dépend pas des bibliothèques système du serveur. Faites passer teloxide d’OpenSSL à rustls, qui n’a pas besoin d’OpenSSL et embarque sa propre liste de certificats de confiance. Dans Cargo.toml, remplacez la ligne teloxide par :

teloxide = { version = "0.17", default-features = false, features = ["macros", "ctrlc_handler", "rustls"] }

Gardez ctrlc_handler dans la liste : teloxide ne compile repl qu’avec cette fonctionnalité. Compilez ensuite avec cargo-zigbuild, qui utilise Zig comme éditeur de liens (son installation avec pip installe aussi Zig) :

rustup target add x86_64-unknown-linux-musl
pip install cargo-zigbuild
cargo zigbuild --release --target x86_64-unknown-linux-musl

Le programme se trouve dans target/x86_64-unknown-linux-musl/release/bot. teloxide 0.17 indique Rust 1.82 comme minimum, et les crates qu’il utilise peuvent en demander une version plus récente ; lancez donc rustup update stable avant de compiler.

Si le token est incorrect

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

teloxide::RequestError: A Telegram's error: Invalid bot token

teloxide transforme la réponse Unauthorized de Telegram, et le Not Found que reçoit un token mal formé, en ApiError::InvalidToken. Le bot ci-dessus le vérifie avant de commencer le polling, affiche Telegram did not accept the bot token. Paste the current one from @BotFather, then restart. et s’arrête. Sans cette vérification, Command::repl arrête le programme avec un panic, Couldn't prepare dispatching context: Api(InvalidToken). Le panel reconnaît les deux et affiche la bannière 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 teloxide sur un serveur

  • Le nom du token. Bot::from_env() lit TELOXIDE_TOKEN et panique avec Cannot get the TELOXIDE_TOKEN env variable quand il manque. Le panel le définit dès qu’un token est enregistré dans le volet Telegram, avec TELEGRAM_BOT_TOKEN, BOT_TOKEN, TOKEN et TELEGRAM_TOKEN. from_env() lit aussi TELOXIDE_API_URL et TELOXIDE_PROXY lorsqu’elles sont définies ; omettez-les pour parler directement à Telegram.
  • Sans logger, pas d’erreurs. teloxide signale les problèmes via le crate log, donc un programme sans logger n’affiche rien quand le polling échoue. pretty_env_logger::init() n’affiche que les erreurs, ce qui suffit : quand une autre copie du bot fait du polling avec le même token, la console reçoit une ligne qui se termine par An error from the update listener: Api(TerminatedByOtherGetUpdates) et le panel affiche Votre bot tourne aussi ailleurs. Pour plus de détails, sur la page Bot, volet Environnement, ajoutez la variable RUST_LOG avec la valeur info (Ajouter la variable) et redémarrez.
  • Le polling n’abandonne jamais. Quand la demande de messages à Telegram échoue, teloxide attend et réessaie, en doublant l’attente de 1 seconde jusqu’à 64 secondes, ou aussi longtemps que Telegram le demande après 429 Too Many Requests. Une seconde copie du bot ou un token révoqué pendant l’exécution n’arrête pas le programme : il continue de tourner mais reçoit peu ou pas de messages, et seule l’erreur journalisée en donne la raison : Api(TerminatedByOtherGetUpdates) pour une seconde copie, Api(InvalidToken) pour un token révoqué. Voir Corriger l’erreur 409 Conflict d’un bot Telegram.
  • Un webhook resté sur le bot est retiré pour vous. repl et Dispatcher::dispatch() démarrent le long polling avec un délai de 10 secondes et appellent d’abord deleteWebhook quand un webhook est défini, en conservant les messages en attente. Les fonctionnalités webhooks de teloxide exigent une adresse HTTPS publique, que nos offres n’incluent pas encore ; utilisez donc repl ou dispatch().
  • Un arrêt propre. Le panel arrête un bot Rust avec Ctrl+C (SIGINT). repl active le gestionnaire Ctrl+C de teloxide, qui arrête le polling et indique à Telegram quels messages il a déjà reçus, pour que le prochain démarrage ne les reçoive plus. Avec votre propre Dispatcher, ajoutez .enable_ctrlc_handler() au builder, comme le font les exemples de teloxide.
  • Mises à jour. Le type Rust Bot n’a ni champ Paquets ni source Git : vos crates 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 appuyez sur Démarrer.

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

Copiez le programme compilé sur le VPS ; il n’y a pas besoin de Rust là-bas. Un programme compilé avec les fonctionnalités par défaut a besoin d’OpenSSL 3, que Debian 12 et 13 et Ubuntu 22.04 et 24.04 fournissent, et d’une glibc au moins aussi récente que celle du système sur lequel vous avez compilé. La compilation musl n’a besoin ni de l’un ni de l’autre.

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 "TELOXIDE_TOKEN=123456789:your-token" > /etc/mybot.env'
sudo chmod 600 /etc/mybot.env

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

[Unit]
Description=teloxide 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
KillSignal=SIGINT

[Install]
WantedBy=multi-user.target

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

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

KillSignal=SIGINT fait envoyer Ctrl+C par systemctl stop, que le gestionnaire de teloxide intercepte pour un arrêt propre ; la valeur par défaut de systemd, SIGTERM, termine le programme immédiatement. Restart=always relance le bot après un plantage ou une sortie. Arrêtez d’abord toute autre copie, sinon Telegram répond 409 Conflict.

Auto-hébergement ou offre de bot

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

  • Les mises à jour et la sécurité du système, et des versions d’OpenSSL et de glibc compatibles avec votre compilation.
  • La copie de chaque nouvelle compilation, du fichier de service, du fichier de token et de ses permissions.
  • La lecture de journalctl pour savoir 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 en HTTPS pour un webhook.

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

  • Une image Debian qui exécute un programme Linux x86-64, et une vérification au démarrage qui le signale quand le fichier est une compilation Windows ou macOS.
  • L’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 transmis à votre programme sous le nom TELOXIDE_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.
  • Des bannières au-dessus de Console qui nomment la cause quand Telegram refuse le token ou qu’une autre copie tourne, et un bouton Retirer le webhook dans le volet Telegram.

Questions fréquentes

Pourquoi mon bot teloxide n’affiche-t-il rien du tout ?

teloxide écrit via le crate log et n’affiche rien tant qu’un logger n’est pas configuré. Appelez pretty_env_logger::init() (ou un autre logger) au début de main, comme le fait le bot ci-dessus. Vos propres lignes println! s’affichent toujours dans Console.

Ai-je besoin de la fonctionnalité webhooks de teloxide ?

Non. Un webhook a besoin d’une adresse HTTPS publique, que nos offres n’incluent pas encore. repl et dispatch() utilisent le long polling, qui n’a besoin d’aucune adresse : le bot demande à Telegram les nouveaux messages. Ils retirent aussi un webhook laissé sur le bot par un ancien hébergeur.

Le serveur peut-il compiler mon code Rust ?

Non. Le type Rust Bot exécute un programme terminé et ne compile rien, donc toute la mémoire de votre offre va au bot. Compilez sur votre ordinateur, ou dans un workflow GitHub Actions, joignez le programme à une release et mettez le lien du fichier dans Lien de téléchargement (facultatif).

Un bot teloxide utilise-t-il moins de mémoire qu’un bot Python ?

Comparez les chiffres : dans le même test, python-telegram-bot 22.8 a utilisé 44 Mo et aiogram 3.31.0 a utilisé 173 Mo, contre 13 Mo pour teloxide. Les trois tiennent dans l’offre STARTER de 0,5 Go avec de la marge pour votre propre code ; choisissez donc le langage dans lequel vous voulez écrire.

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

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

NOS DERNIERS ARTICLES