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:
- Zbuduj swojego bota dla Linuksa x86-64 na swoim komputerze, jak pokazano niżej w Budowanie dla Linuksa.
- 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.
- 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.
- 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.
- 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. - Kliknij Uruchom bota i otwórz Console. Po
[PlayNHost] Starting your bottwój bot wypisujeLogged in as @your_bot, a znacznik na stronie Przegląd zmienia się na Online w Telegramie. - 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
| Biblioteka | Wersja | Pamięć bez obciążenia | Start do odpowiedzi platformy | Rozmiar programu |
|---|---|---|---|---|
| teloxide (Telegram) | 0.17.0 | 13 MB | 0,1 s | 3,0 MB |
| serenity (Discord) | 0.12.5 | 10 MB | 0,4 s | 13,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()czytaTELOXIDE_TOKENi panikuje z komunikatemCannot get the TELOXIDE_TOKEN env variable, gdy go brakuje. Panel ustawia ją, gdy tylko token zostanie zapisany w panelu Telegram, razem zTELEGRAM_BOT_TOKEN,BOT_TOKEN,TOKENiTELEGRAM_TOKEN.from_env()czyta teżTELOXIDE_API_URLiTELOXIDE_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ę naAn 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_LOGo wartościinfo(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.
repliDispatcher::dispatch()uruchamiają long polling z limitem czasu 10 sekund i najpierw wywołujądeleteWebhook, gdy ustawiony jest webhook, zachowując czekające wiadomości. Funkcjewebhooksw teloxide wymagają publicznego adresu HTTPS, którego nasze plany jeszcze nie obejmują, więc użyjrepllubdispatch(). - Czyste zatrzymanie. Panel zatrzymuje bota w Rust przez Ctrl+C (
SIGINT).replwłą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łasnymDispatcherdodaj.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.



