Bir teloxide botunu 24/7 barındırmak için onu her zaman açık kalan bir makinede çalıştırırsınız: durduğunda yeniden başlatan bir systemd servisi olan bir Linux VPS ya da PlayNHost üzerinde bir bot planı (aylık US$1,99'dan başlayan fiyatla). Bot planında hazır programı yüklersiniz, panel ona token'ı verir ve bot çökerse yeniden başlatır. Testimizde teloxide 0.17.0 ile yazılmış bir bot yaklaşık 13 MB bellek kullandı. Bir Rust botu kendi bilgisayarınızda tek bir Linux x86-64 programı olarak derlenir: sunucuda hiçbir şey derlenmez. teloxide'in Bot::from_env() çağrısı token'ı TELOXIDE_TOKEN değişkeninden okur; bu adı panel sizin için ayarlar. PlayNHost üzerindeki adımlar:
- Botunuzu bilgisayarınızda Linux x86-64 için derleyin; aşağıda Linux için derleme başlığında gösterilmiştir.
- Telegram bot barındırma sayfasında bir planda Sunucu oluştur düğmesine tıklayın. Sipariş penceresinde Botunuz hangi platform için? sorusunu Telegram ile yanıtlayın ve Rust seçeneğini seçin.
- Sunucunuzu panelde açın. Genel bakış sayfasındaki Botunuzu kurun kartı Telegram’a bağlan adımında açılır; ilk adımı olan Ne çalışır kısmı Bu bot Rust Bot çalıştırır. demelidir.
- Telegram’a bağlan adımında @BotFather'dan aldığınız token'ı Bot token’ınızı yapıştırın alanına yapıştırın, Bağlan düğmesine tıklayın, gösterilen bot adını kontrol edin ve Evet, devam düğmesine tıklayın.
- Kodunuz adımında Dosya yükle düğmesine tıklayın, sonra Files bölümünde Yükle düğmesine tıklayıp adı
botolan programınızı seçin. Ya da sunucunun indirmesine izin verin: Bot sayfasında Kod bölmesindeki Ayarlar kartında, İndirme bağlantısı (isteğe bağlı) alanına programın https bağlantısını yazın ve Kaydet düğmesine tıklayın. - Botu başlat düğmesine tıklayın ve Console sayfasını açın.
[PlayNHost] Starting your botsatırından sonra botunuzLogged in as @your_botyazdırır ve Genel bakış sayfasındaki rozet Telegram’da çevrimiçi olarak değişir. - Bot sayfasında Telegram bölmesinde Telegram’da aç düğmesine tıklayın ve botunuza
/startgönderin.
Botu @BotFather'da oluşturma ve kurulum kartı Telegram botu nasıl barındırılır yazısında anlatılır. Rust Bot türünün kendisi (Giriş dosyası, Başlangıç argümanları (isteğe bağlı) ve indirme bağlantısı) Discord ve Telegram botları için aynıdır: Rust Discord botu nasıl barındırılır. Bu sayfa teloxide ile ilgilidir: sunucuda neyi kullandığı ve barındırmadan önce bilmeniz gerekenler.
Ne ölçtük
| Kütüphane | Sürüm | Yüksüz bellek | Başlangıçtan platformun yanıtına | Program boyutu |
|---|---|---|---|---|
| teloxide (Telegram) | 0.17.0 | 13 MB | 0,1 sn | 3,0 MB |
| serenity (Discord) | 0.12.5 | 10 MB | 0,4 sn | 13,4 MB |
Yöntem: kendi düğümümüzde, 1 GB'lık ve tek CPU'lu bir bot planı gibi ayarlanmış, Rust Bot türümüzün çalıştığı Debian imajına sahip geçici bir konteynerde her program sahte bir token ile Telegram'ı ya da Discord'u çağırdı ve token reddedildi. Bellek, bu yanıttan 15 saniye sonraki resident bellektir, başlangıç süresi çalıştırmadan yanıta kadar geçen süredir ve her değer 2 ile 4 arasındaki çalıştırmaların medyanıdır. İki program da aynı imajda kararlı Rust ve cargo build --release ile derlendi, derleme için pkg-config ve libssl-dev eklendi; teloxide derlemesi tek CPU ile indirmeler dahil 107 sn sürdü, bu yüzden bunu kaba bir değer olarak görün.
Bunlar alt sınırlardır: henüz sohbeti ve verisi olmayan bir program. Kendi kodunuz, bellekte tuttukları ve sohbet sayısı bunların üstüne eklenir; yine de minimal bir teloxide programı 0,5 GB'lık STARTER planının küçük bir kısmını kullanır.
Minimal bir teloxide botu
/start komutuna yanıt verir, panelin verdiği token'ı okur, hazır satırını yazdırır ve Telegram token'ı reddettiğinde bunu açıkça söyler. cargo new bot ile bir proje oluşturun ve şu iki dosyayı kullanın. bot paket adı programı bot yapar; bu, varsayılan Giriş dosyasıdır.
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;
}
Logged in as @your_bot satırı rozeti Telegram’da çevrimiçi durumuna getirir. Command::repl bot durdurulana kadar çalışır. Kod, teloxide'in kendi deposundaki komut örneğini izler; pretty_env_logger, teloxide'in örneklerinin kullandığı günlükleyicidir.
Linux için derleme
Sunucu programınızı Debian 13 üzerinde, glibc 2.41 ve OpenSSL 3 ile çalıştırır. Windows'a ait bir .exe dosyası ya da macOS derlemesi orada çalışmaz: konsol bu durumda şunu yazar: [PlayNHost] bot is not a Linux program. Build it for Linux x86-64 (not Windows or macOS) and upload it again. Derlemenin iki yolu var:
Linux'ta, teloxide'in varsayılan özellikleriyle
sudo apt install build-essential pkg-config libssl-dev
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
cargo build --release
Program target/release/bot yolundadır. teloxide'in varsayılan özellikleri native-tls kullanır; bu, Linux'ta sistemin OpenSSL'ini bağlar, bu yüzden derleme için pkg-config ve libssl-dev gerekir; sunucuda OpenSSL 3 vardır. Debian 12 veya 13 ya da Ubuntu 22.04 veya 24.04 üzerinde derleyin: bunların glibc sürümleri (2.36, 2.41, 2.35 ve 2.39) sunucununkinden yeni değildir. Glibc 2.43 olan Ubuntu 26.04 gibi daha yeni bir sistemde derlenen program, sunucuda bulunmayan işlevler isteyebilir ve başlangıçta bir GLIBC_ sürümünün bulunamadığını söyleyen bir hatayla durur. musl derlemesi bunu önler.
Windows, macOS veya herhangi bir Linux'tan: musl derlemesi
Bir musl programı, sunucunun sistem kütüphanelerine bağlı olmayan, kendi kendine yeten tek bir dosyadır. teloxide'i OpenSSL'den rustls'e geçirin; rustls OpenSSL gerektirmez ve kendi güvenilir sertifika listesini taşır. Cargo.toml dosyasında teloxide satırını şununla değiştirin:
teloxide = { version = "0.17", default-features = false, features = ["macros", "ctrlc_handler", "rustls"] }
ctrlc_handler özelliğini listede tutun: teloxide repl işlevini yalnızca bu özellikle derler. Sonra bağlayıcı olarak Zig kullanan cargo-zigbuild ile derleyin (pip ile kurmak Zig'i de kurar):
rustup target add x86_64-unknown-linux-musl
pip install cargo-zigbuild
cargo zigbuild --release --target x86_64-unknown-linux-musl
Program target/x86_64-unknown-linux-musl/release/bot yoluna düşer. teloxide 0.17 asgari Rust sürümü olarak 1.82'yi belirtir, kullandığı crate'ler daha yenisini isteyebilir; bu yüzden derlemeden önce rustup update stable çalıştırın.
Token yanlışsa
Testimizde sahte bir token ile bot.get_me() şu hatayı döndürdü (test programımız bunu hata türünden sonra yazdırdı):
teloxide::RequestError: A Telegram's error: Invalid bot token
teloxide, Telegram'ın Unauthorized yanıtını ve hatalı biçimlendirilmiş bir token'ın aldığı Not Found yanıtını ApiError::InvalidToken değerine çevirir. Yukarıdaki bot, polling'e başlamadan önce bunu kontrol eder, Telegram did not accept the bot token. Paste the current one from @BotFather, then restart. yazdırır ve durur. Bu kontrol olmazsa Command::repl programı bir panic ile durdurur: Couldn't prepare dispatching context: Api(InvalidToken). Panel ikisini de tanır ve Console üzerinde Telegram bot token’ınızı kabul etmedi başlıklı bir uyarı gösterir.
Düzeltmek için @BotFather'da /mybots gönderin, botunuzu seçin, sonra API Token seçeneğini seçin ve token'ı yeniden kopyalayın. Bot sayfasında Telegram bölmesinde Token’ı değiştir düğmesine tıklayın, token'ı yapıştırın, Token’ı kaydet düğmesine tıklayın, sonra Şimdi yeniden başlat düğmesine tıklayın.
Bir sunucuda teloxide hakkında bilmeniz gerekenler
- Token adı.
Bot::from_env()çağrısıTELOXIDE_TOKENdeğişkenini okur ve değişken yoksaCannot get the TELOXIDE_TOKEN env variableiletisiyle panic verir. Panel, Telegram bölmesinde bir token kaydedilir kaydedilmez bunu ayarlar; yanındaTELEGRAM_BOT_TOKEN,BOT_TOKEN,TOKENveTELEGRAM_TOKENda ayarlanır.from_env()ayrıcaTELOXIDE_API_URLveTELOXIDE_PROXYdeğişkenlerini ayarlıysa okur; Telegram ile doğrudan konuşmak için bunları tanımlamayın. - Günlükleyici yoksa hata da yok. teloxide sorunları
logcrate'i üzerinden bildirir, bu yüzden günlükleyicisi olmayan bir program polling başarısız olduğunda hiçbir şey yazdırmaz.pretty_env_logger::init()yalnızca hataları gösterir ve bu yeterlidir: botun başka bir kopyası aynı token ile polling yaptığında konsolaAn error from the update listener: Api(TerminatedByOtherGetUpdates)ile biten bir satır düşer ve panel Botunuz başka bir yerde de çalışıyor uyarısını gösterir. Daha fazla ayrıntı için Bot sayfasında Ortam bölmesindeRUST_LOGdeğişkeniniinfodeğeriyle ekleyin (Değişken ekle) ve yeniden başlatın. - Polling asla pes etmez. Telegram'dan mesaj isteme başarısız olduğunda teloxide bekler ve yeniden dener; bekleme süresi 1 saniyeden 64 saniyeye kadar ikiye katlanır ya da
429 Too Many Requestssonrasında Telegram ne kadar isterse o kadar sürer. Botun ikinci bir kopyası ya da çalışırken iptal edilen bir token programı durdurmaz: program çalışmaya devam eder ama az mesaj alır ya da hiç almaz ve nedeni yalnızca günlüğe yazılan hata gösterir: ikinci kopya içinApi(TerminatedByOtherGetUpdates), iptal edilen token içinApi(InvalidToken). Bkz. Telegram botu 409 Conflict hatasını düzeltin. - Botta kalan webhook sizin için kaldırılır.
replveDispatcher::dispatch(), 10 saniyelik zaman aşımıyla long polling başlatır ve webhook ayarlıysa öncedeleteWebhookçağırır; bekleyen mesajlar korunur. teloxide'inwebhooksözellikleri herkese açık bir HTTPS adresi gerektirir, planlarımız bunu henüz içermez; bu yüzdenreplya dadispatch()kullanın. - Temiz durdurma. Panel bir Rust botunu Ctrl+C (
SIGINT) ile durdurur.repl, teloxide'in Ctrl+C işleyicisini açar; bu işleyici polling'i durdurur ve Telegram'a hangi mesajları zaten aldığını bildirir, böylece sonraki başlangıçta aynı mesajlar tekrar gelmez. KendiDispatchernesnenizde, teloxide'in örneklerinin yaptığı gibi builder'a.enable_ctrlc_handler()ekleyin. - Güncellemeler. Rust Bot türünde Paketler alanı ve Git kaynağı yoktur: crate'leriniz programın içindedir. Güncellemek için Files bölümündeki eski programı silin, yeni derlemeyi yükleyin ve yeniden başlatın. İndirme bağlantısı kullanıyorsanız yeni derlemeyi o bağlantıda yayımlayın, Files bölümündeki programı silin ve Başlat düğmesine basın.
Bir Linux VPS'te kendiniz barındırın
Derlediğiniz programı VPS'e kopyalayın; orada Rust'a gerek yoktur. Varsayılan özelliklerle derlenmiş bir program, Debian 12 ve 13 ile Ubuntu 22.04 ve 24.04'te bulunan OpenSSL 3'e ve en az derlediğiniz sistem kadar yeni bir glibc'ye ihtiyaç duyar. musl derlemesi ikisine de ihtiyaç duymaz.
Bot için bir kullanıcı oluşturun, programı onun klasörüne koyun ve token'ı yalnızca root'un okuyabileceği bir dosyada tutun:
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
/etc/systemd/system/mybot.service dosyasını oluşturun:
[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
Şimdi ve her açılışta başlatın, sonra çıktısını izleyin:
sudo systemctl daemon-reload
sudo systemctl enable --now mybot
sudo journalctl -u mybot -f
KillSignal=SIGINT ayarı systemctl stop komutunun Ctrl+C göndermesini sağlar; teloxide'in işleyicisi bunu temiz bir durdurma için yakalar. systemd'in varsayılanı olan SIGTERM programı hemen sonlandırır. Restart=always botu bir çökmeden ya da çıkıştan sonra yeniden başlatır. Önce başka kopyaları durdurun, yoksa Telegram 409 Conflict ile yanıt verir.
Kendi kendine barındırma ya da bot planı
Kendiniz yönettiğiniz bir VPS'te:
- İşletim sistemi güncellemeleri ve güvenliği, ayrıca derlemenizle uyumlu OpenSSL ve glibc sürümleri.
- Her yeni derlemeyi, servis dosyasını, token dosyasını ve izinlerini kopyalamak.
- Botun neden durduğunu anlamak için
journalctlokumak. - Botun verilerinin yedekleri.
Karşılığında bir VPS her şeyi çalıştırır ve ona bir webhook için HTTPS'li bir alan adı verebilirsiniz.
PlayNHost bot planında bunu panel sizin için yapar:
- Linux x86-64 programı çalıştıran bir Debian imajı ve dosya Windows ya da macOS derlemesiyse bunu söyleyen bir başlangıç kontrolü.
- Files bölümünden yükleme ya da sunucunun başlangıçta çektiği bir indirme bağlantısı.
- Telegram ile doğrulanan, şifrelenmiş olarak saklanan ve programınıza
TELOXIDE_TOKENolarak verilen token. - Çökmeden sonra botu yeniden başlatma. Bir dakika içinde yine çökerse durmuş kalır ve Console nedenini söyler.
- Telegram token'ı reddettiğinde ya da başka bir kopya çalıştığında nedeni belirten, Console üzerindeki uyarılar ve Telegram bölmesinde bir Webhook’u kaldır düğmesi.
İnsanların sorduğu sorular
teloxide botum neden hiçbir şey yazdırmıyor?
teloxide log crate'i üzerinden yazar ve bir günlükleyici kurulana kadar hiçbir şey yazdırmaz. Yukarıdaki botun yaptığı gibi pretty_env_logger::init() (ya da başka bir günlükleyici) çağrısını main işlevinin en başına koyun. Kendi println! satırlarınız Console bölümünde her zaman görünür.
teloxide'in webhooks özelliğine ihtiyacım var mı?
Hayır. Bir webhook herkese açık bir HTTPS adresi gerektirir, planlarımız bunu henüz içermez. repl ve dispatch() adres gerektirmeyen long polling kullanır: bot Telegram'dan yeni mesajları ister. Ayrıca eski bir barındırıcının botta bıraktığı webhook'u da kaldırırlar.
Sunucu Rust kodumu derleyebilir mi?
Hayır. Rust Bot türü hazır bir programı çalıştırır ve hiçbir şey derlemez, bu yüzden planınızın tüm belleği bota gider. Bilgisayarınızda ya da bir GitHub Actions iş akışında derleyin, programı bir sürüme ekleyin ve dosyanın bağlantısını İndirme bağlantısı (isteğe bağlı) alanına yazın.
teloxide botu bir Python botundan daha az bellek kullanır mı?
Sayılara bakın: aynı testte python-telegram-bot 22.8 44 MB, aiogram 3.31.0 ise 173 MB kullandı; teloxide 13 MB kullandı. Üçü de kendi kodunuza yer bırakarak 0,5 GB'lık STARTER planına sığar, bu yüzden yazmak istediğiniz dili seçin.
teloxide botunuzu günün her saati çalıştırmaya hazır mısınız? Planları Telegram bot barındırma sayfasında görün.



