NOWOŚĆ 📢 Ograniczona oferta na start: do 70% zniżki na pierwszy miesiąc, na każdą grę!Zobacz plany

Jak hostować bota teloxide 24/7

Hosting botów TelegramUpdated Nov 6, 202612 min read

Aby hostować bota teloxide 24/7, uruchamiasz go na maszynie, która jest zawsze włączona: na VPS z Linuksem z usługą systemd, która uruchamia go ponownie, gdy się zatrzyma, albo w planie dla botów w PlayNHost (od 1,99 USD miesięcznie), gdzie wgrywasz gotowy program, a panel podaje mu token i uruchamia go ponownie, jeśli się zawiesi. W naszym teście bot z teloxide 0.17.0 zużył około 13 MB pamięci. Bota w Rust budujesz na własnym komputerze jako jeden program dla Linuksa x86-64: na serwerze nic się nie kompiluje. Bot::from_env() z teloxide czyta token z TELOXIDE_TOKEN, nazwy, którą panel ustawia za ciebie. Kroki w PlayNHost:

  1. Zbuduj swojego bota dla Linuksa x86-64 na swoim komputerze, jak pokazano niżej w Budowanie dla Linuksa.
  2. W hostingu botów Telegram kliknij Utwórz serwer przy wybranym planie. W oknie zamówienia odpowiedz na Na jaką platformę jest Twój bot? wybierając Telegram i wybierz Rust.
  3. Otwórz swój serwer w panelu. Karta Skonfiguruj swojego bota na stronie Przegląd otwiera się na kroku Połącz z Telegramem; jego pierwszy krok, Co działa, powinien pokazywać Ten bot uruchamia Rust Bot.
  4. W kroku Połącz z Telegramem wklej token od @BotFather w polu Wklej token swojego bota, kliknij Połączenie, sprawdź wyświetloną nazwę bota i kliknij Tak, dalej.
  5. W kroku Twój kod kliknij Prześlij pliki, potem w Files kliknij Prześlij i wybierz swój program o nazwie bot. Albo pozwól serwerowi go pobrać: na stronie Bot, w panelu Kod, na karcie Ustawienia, wpisz w polu Link do pobrania (opcjonalnie) link https do programu i kliknij Zapisz.
  6. Kliknij Uruchom bota i otwórz Console. Po [PlayNHost] Starting your bot twój bot wypisuje Logged in as @your_bot, a znacznik na stronie Przegląd zmienia się na Online w Telegramie.
  7. Na stronie Bot, w panelu Telegram, kliknij Otwórz w Telegramie i wyślij swojemu botowi /start.

Tworzenie bota w @BotFather i kartę konfiguracji opisuje Jak hostować bota Telegram. Sam typ Rust Bot (Plik startowy, Argumenty startowe (opcjonalnie) i link do pobrania) jest taki sam dla botów Discord i Telegram: Jak hostować bota Discord w Rust. Ta strona dotyczy teloxide: co zużywa na serwerze i co warto wiedzieć, zanim go zahostujesz.

Co zmierzyliśmy

BibliotekaWersjaPamięć bez obciążeniaStart do odpowiedzi platformyRozmiar programu
teloxide (Telegram)0.17.013 MB0,1 s3,0 MB
serenity (Discord)0.12.510 MB0,4 s13,4 MB

Jak: na naszym własnym węźle, w jednorazowym kontenerze skonfigurowanym jak plan dla botów z 1 GB i jednym CPU, z obrazem Debiana, na którym działa nasz typ Rust Bot, każdy program wywołał Telegram lub Discord z fałszywym tokenem, który został odrzucony. Pamięć to pamięć rezydentna 15 sekund po tej odpowiedzi, czas startu liczy się od uruchomienia do odpowiedzi, a każda wartość to mediana przebiegów od 2 do 4. Oba programy zbudowano stabilnym Rustem i cargo build --release na tym samym obrazie, z dodanymi do budowania pkg-config i libssl-dev; budowanie teloxide trwało 107 s na jednym CPU, razem z pobieraniem, więc traktuj to jako wartość orientacyjną.

To wartości minimalne: program bez czatów i bez danych. Twój własny kod, to, co trzyma w pamięci, i liczba czatów się do nich dodają, więc minimalny program teloxide zajmuje niewielką część planu STARTER o pojemności 0,5 GB.

Minimalny bot teloxide

Odpowiada na /start, czyta token, który daje mu panel, wypisuje linię gotowości i wyraźnie mówi, gdy Telegram odrzuci token. Utwórz projekt poleceniem cargo new bot i użyj tych dwóch plików. Nazwa pakietu bot daje program bot, domyślny Plik startowy.

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;
}

Linia Logged in as @your_bot sprawia, że znacznik zmienia się na Online w Telegramie. Command::repl działa, dopóki bot nie zostanie zatrzymany. Kod opiera się na przykładzie poleceń z repozytorium teloxide; pretty_env_logger to logger, którego używają przykłady teloxide.

Budowanie dla Linuksa

Serwer uruchamia twój program na Debianie 13, z glibc 2.41 i OpenSSL 3. Plik .exe z Windowsa ani build dla macOS tam nie działa: konsola pokazuje wtedy [PlayNHost] bot is not a Linux program. Build it for Linux x86-64 (not Windows or macOS) and upload it again. Są dwa sposoby budowania:

Na Linuksie, z domyślnymi funkcjami teloxide

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

Program to target/release/bot. Domyślne funkcje teloxide używają native-tls, które na Linuksie linkuje systemowy OpenSSL, więc do budowania potrzebne są pkg-config i libssl-dev; serwer ma OpenSSL 3. Buduj na Debianie 12 lub 13 albo Ubuntu 22.04 lub 24.04: ich glibc (2.36, 2.41, 2.35 i 2.39) nie jest nowsze niż to na serwerze. Program zbudowany na nowszym systemie, na przykład Ubuntu 26.04 z glibc 2.43, może wymagać funkcji, których serwer nie ma, i wtedy przy starcie zatrzymuje się z błędem, że nie znaleziono wersji GLIBC_. Build z musl tego unika.

Z Windowsa, macOS lub dowolnego Linuksa: build z musl

Program musl to jeden samodzielny plik, który nie zależy od bibliotek systemowych serwera. Przełącz teloxide z OpenSSL na rustls, który nie potrzebuje OpenSSL i ma własną listę zaufanych certyfikatów. W Cargo.toml zastąp linię teloxide taką:

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

Zostaw ctrlc_handler na liście: teloxide buduje repl tylko z tą funkcją. Potem zbuduj za pomocą cargo-zigbuild, który używa Zig jako linkera (instalacja przez pip instaluje też Zig):

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

Program ląduje w target/x86_64-unknown-linux-musl/release/bot. teloxide 0.17 podaje Rust 1.82 jako minimum, a używane przez niego crate'y mogą wymagać nowszego, więc uruchom rustup update stable przed budowaniem.

Gdy token jest błędny

W naszym teście z fałszywym tokenem bot.get_me() zwróciło ten błąd (nasz program testowy wypisał go po typie błędu):

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

teloxide zamienia odpowiedź Unauthorized od Telegrama, oraz Not Found, które dostaje źle zbudowany token, na ApiError::InvalidToken. Bot powyżej sprawdza to przed rozpoczęciem pollingu, wypisuje Telegram did not accept the bot token. Paste the current one from @BotFather, then restart. i się zatrzymuje. Bez tego sprawdzenia Command::repl zatrzymuje program paniką, Couldn't prepare dispatching context: Api(InvalidToken). Panel rozpoznaje oba przypadki i pokazuje nad Console baner Telegram nie przyjął tokena twojego bota.

Aby to naprawić, wyślij w @BotFather /mybots, wybierz swojego bota, potem API Token i skopiuj token jeszcze raz. Na stronie Bot, w panelu Telegram, kliknij Zastąp token, wklej go, kliknij Zapisz token, a potem Zrestartuj teraz.

Co warto wiedzieć o teloxide na serwerze

  • Nazwa tokena. Bot::from_env() czyta TELOXIDE_TOKEN i panikuje z komunikatem Cannot get the TELOXIDE_TOKEN env variable, gdy go brakuje. Panel ustawia ją, gdy tylko token zostanie zapisany w panelu Telegram, razem z TELEGRAM_BOT_TOKEN, BOT_TOKEN, TOKEN i TELEGRAM_TOKEN. from_env() czyta też TELOXIDE_API_URL i TELOXIDE_PROXY, gdy są ustawione; pomiń je, aby rozmawiać z Telegramem bezpośrednio.
  • Bez loggera nie ma błędów. teloxide zgłasza problemy przez crate log, więc program bez loggera nic nie wypisze, gdy polling zawiedzie. pretty_env_logger::init() pokazuje tylko błędy, co wystarcza: gdy inna kopia bota odpytuje Telegram tym samym tokenem, konsola dostaje linię kończącą się na An error from the update listener: Api(TerminatedByOtherGetUpdates), a panel pokazuje Twój bot działa też gdzie indziej. Aby uzyskać więcej szczegółów, na stronie Bot, w panelu Środowisko, dodaj zmienną RUST_LOG o wartości info (Dodaj zmienną) i zrestartuj.
  • Polling nigdy się nie poddaje. Gdy pobieranie wiadomości z Telegrama zawodzi, teloxide czeka i próbuje ponownie, podwajając czas oczekiwania od 1 sekundy do 64 sekund, albo tak długo, jak zażąda Telegram po 429 Too Many Requests. Druga kopia bota lub token unieważniony w trakcie działania nie zatrzymuje programu: działa dalej, ale dostaje mało wiadomości lub wcale, a powód pokazuje tylko zapisany błąd: Api(TerminatedByOtherGetUpdates) dla drugiej kopii, Api(InvalidToken) dla unieważnionego tokena. Zobacz Jak naprawić błąd 409 Conflict bota Telegram.
  • Webhook pozostawiony na bocie jest usuwany za ciebie. repl i Dispatcher::dispatch() uruchamiają long polling z limitem czasu 10 sekund i najpierw wywołują deleteWebhook, gdy ustawiony jest webhook, zachowując czekające wiadomości. Funkcje webhooks w teloxide wymagają publicznego adresu HTTPS, którego nasze plany jeszcze nie obejmują, więc użyj repl lub dispatch().
  • Czyste zatrzymanie. Panel zatrzymuje bota w Rust przez Ctrl+C (SIGINT). repl włącza obsługę Ctrl+C w teloxide, która zatrzymuje polling i mówi Telegramowi, które wiadomości już odebrano, żeby następny start nie dostał ich ponownie. Przy własnym Dispatcher dodaj .enable_ctrlc_handler() do buildera, jak robią to przykłady teloxide.
  • Aktualizacje. Typ Rust Bot nie ma pola Pakiety ani źródła Git: twoje crate'y są w programie. Aby zaktualizować, usuń stary program w Files, wgraj nowy build i zrestartuj. Przy linku do pobrania opublikuj nowy build pod tym linkiem, usuń program w Files i naciśnij Uruchom.

Hosting na własnym VPS z Linuksem

Skopiuj zbudowany program na VPS; Rust nie jest tam potrzebny. Program zbudowany z domyślnymi funkcjami wymaga OpenSSL 3, który mają Debian 12 i 13 oraz Ubuntu 22.04 i 24.04, oraz glibc co najmniej tak nowego jak w systemie, na którym budowałeś. Build z musl nie potrzebuje żadnego z nich.

Utwórz użytkownika dla bota, umieść program w jego katalogu i trzymaj token w pliku, który może czytać tylko root:

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

Utwórz /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

Uruchom go teraz i przy każdym starcie systemu, potem śledź jego wyjście:

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

KillSignal=SIGINT sprawia, że systemctl stop wysyła Ctrl+C, który obsługa teloxide przechwytuje, by czysto się zatrzymać; domyślny sygnał systemd, SIGTERM, kończy program od razu. Restart=always uruchamia bota ponownie po awarii lub zakończeniu. Najpierw zatrzymaj każdą inną kopię, inaczej Telegram odpowie 409 Conflict.

Własny serwer czy plan dla botów

Na VPS, którym zarządzasz sam:

  • Aktualizacje i bezpieczeństwo systemu operacyjnego oraz wersje OpenSSL i glibc zgodne z twoim buildem.
  • Kopiowanie każdego nowego buildu, pliku usługi, pliku z tokenem i jego uprawnień.
  • Czytanie journalctl, aby sprawdzić, dlaczego bot się zatrzymał.
  • Kopie zapasowe danych bota.

W zamian VPS uruchomi wszystko i możesz mu nadać domenę z HTTPS dla webhooka.

W planie dla botów PlayNHost robi to za ciebie panel:

  • Obraz Debiana uruchamiający program dla Linuksa x86-64 oraz sprawdzenie przy starcie, które o tym informuje, gdy plik jest buildem dla Windowsa lub macOS.
  • Wgrywanie w Files albo link do pobrania, który serwer pobiera przy starcie.
  • Token, sprawdzony w Telegramie, przechowywany w postaci zaszyfrowanej i przekazywany twojemu programowi jako TELOXIDE_TOKEN.
  • Ponowne uruchomienie bota po awarii. Jeśli zawiesi się ponownie w ciągu minuty, zostaje zatrzymany, a Console podaje powód.
  • Banery nad Console, które wskazują przyczynę, gdy Telegram odrzuca token lub działa inna kopia, oraz przycisk Usuń webhook w panelu Telegram.

Pytania, które zadają ludzie

Dlaczego mój bot teloxide nic nie wypisuje?

teloxide zapisuje przez crate log i nic nie wypisuje, dopóki nie skonfigurujesz loggera. Wywołaj pretty_env_logger::init() (lub inny logger) na początku main, jak robi to bot powyżej. Twoje własne linie println! zawsze pokazują się w Console.

Czy potrzebuję funkcji webhooks w teloxide?

Nie. Webhook wymaga publicznego adresu HTTPS, którego nasze plany jeszcze nie obejmują. repl i dispatch() używają long pollingu, który adresu nie potrzebuje: bot pyta Telegram o nowe wiadomości. Usuwają też webhook pozostawiony na bocie przez dawnego hosta.

Czy serwer może skompilować mój kod Rust?

Nie. Typ Rust Bot uruchamia gotowy program i niczego nie kompiluje, więc cała pamięć twojego planu trafia do bota. Buduj na swoim komputerze albo w workflow GitHub Actions, dołącz program do wydania i wpisz link do pliku w Link do pobrania (opcjonalnie).

Czy bot teloxide zużywa mniej pamięci niż bot w Pythonie?

Porównaj liczby: w tym samym teście python-telegram-bot 22.8 zużył 44 MB, a aiogram 3.31.0 zużył 173 MB, wobec 13 MB dla teloxide. Wszystkie trzy mieszczą się w planie STARTER o pojemności 0,5 GB z zapasem na twój kod, więc wybierz język, w którym chcesz pisać.

Gotowy, by uruchomić swojego bota teloxide całą dobę? Zobacz plany w hostingu botów Telegram.

Twój bot działa już gdzie indziej? Przenieś go do nas

NASZE OSTATNIE WPISY