Telegram Botunu VPS'te 7/24 Çalıştırma (systemd)
Bilgisayarınız kapanınca botunuz da susmasın. Python Telegram botunu Ubuntu 24.04 VPS'te systemd ile 7/24 çalıştırmayı, token'ı güvenle saklamayı ve logları izlemeyi adım adım anlatıyoruz.
Telegram botunuzu kendi bilgisayarınızda yazıp denediniz, çalışıyor. Sorun şu: bilgisayarı kapattığınızda, internet koptuğunda ya da Windows güncelleme yapıp yeniden başladığında bot da susuyor. Kullanıcılarınız ise mesaj attığında cevap bekliyor. Bu yazıda Telegram botunu VPS'te 7/24 çalıştırmayı anlatıyoruz: ayrı bir kullanıcı, Python sanal ortamı, token'ın güvenli saklanması ve botu çöktüğünde kendiliğinden ayağa kaldıran bir systemd servisi. Komutlar Ubuntu 24.04 içindir; Debian 12'de de aynı şekilde çalışır.
Neden ev bilgisayarı değil de VPS?
- Kesintisiz çalışma: VPS bir veri merkezinde, sürekli açık bir sunucuda çalışır. Elektrik kesintisi, modem yeniden başlatması ya da bilgisayarınızı kapatmanız botu etkilemez.
- Sabit IP ve kararlı bağlantı: Ev bağlantılarında IP değişebilir; sunucuda bağlantı daha öngörülebilirdir.
- Bilgisayarınız serbest kalır: Botun açık kalması için laptopunuzu gece gündüz açık bırakmanız gerekmez.
- Düşük maliyet: Basit bir Telegram botu çok az kaynak kullanır. Küçük bir Linux VPS çoğu bot için yeterlidir.
Python uygulamalarını sunucuda çalıştırmanın genel mantığını VPS'te Python uygulaması çalıştırma yazımızda anlattık; burada konuyu Telegram botu ve systemd özelinde ele alıyoruz.
1. Adım: BotFather ile bot oluşturun ve token'ı alın
Telegram'da @BotFather hesabını açın, /newbot komutunu gönderin, botunuza bir ad ve _bot ile biten bir kullanıcı adı verin. BotFather size şuna benzer bir token verir:
123456789:AAF...uzun-bir-karakter-dizisi
Bu token, botunuzun şifresidir. Kodun içine gömmeyin, GitHub'a yüklemeyin, ekran görüntüsünde paylaşmayın. Token sızarsa BotFather'da /revoke ile yenisini alabilirsiniz.
2. Adım: Sunucuyu hazırlayın
SSH ile ya da müşteri panelindeki web terminaliyle sunucunuza bağlanın ve sistemi güncelleyin:
sudo apt update && sudo apt upgrade -y
sudo apt install -y python3-venv python3-pip git
Bot için ayrı bir kullanıcı oluşturun
Botu root ile çalıştırmak gereksiz bir risktir. Kodunuzda ya da kullandığınız bir kütüphanede açık çıkarsa saldırgan tüm sunucuyu ele geçirebilir. Bunun yerine giriş yetkisi olmayan bir sistem kullanıcısı oluşturalım:
sudo adduser --system --group --home /opt/telegram-bot botuser
Bu komut botuser adında, şifresi ve giriş kabuğu olmayan bir kullanıcı ile /opt/telegram-bot dizinini oluşturur.
3. Adım: Sanal ortam (venv) ve kütüphane
Sistem Python'unu kirletmemek için botun kendi sanal ortamını kuruyoruz. Ubuntu 24.04, sistem genelinde pip install yapılmasını zaten engeller; venv doğru yoldur.
sudo -u botuser python3 -m venv /opt/telegram-bot/venv
sudo -u botuser /opt/telegram-bot/venv/bin/pip install --upgrade pip
sudo -u botuser /opt/telegram-bot/venv/bin/pip install "python-telegram-bot>=21"
python-telegram-bot 20 ve sonraki sürümler async tabanlıdır. Aşağıdaki örnek 21 ve üzeri sürümler için yazılmıştır.
4. Adım: Basit bir bot yazın
Dosyayı oluşturun:
sudo nano /opt/telegram-bot/bot.py
İçine şu kodu yapıştırın:
import logging
import os
from telegram import Update
from telegram.ext import Application, CommandHandler, ContextTypes, MessageHandler, filters
logging.basicConfig(
format="%(asctime)s %(levelname)s %(name)s: %(message)s",
level=logging.INFO,
)
TOKEN = os.environ["BOT_TOKEN"]
async def start(update: Update, context: ContextTypes.DEFAULT_TYPE) -> None:
await update.effective_message.reply_text("Merhaba! Bu bot bir VPS üzerinde 7/24 çalışıyor.")
async def echo(update: Update, context: ContextTypes.DEFAULT_TYPE) -> None:
await update.effective_message.reply_text(update.effective_message.text)
def main() -> None:
app = Application.builder().token(TOKEN).build()
app.add_handler(CommandHandler("start", start))
app.add_handler(MessageHandler(filters.TEXT & ~filters.COMMAND, echo))
app.run_polling(allowed_updates=Update.ALL_TYPES)
if __name__ == "__main__":
main()
Dosyanın sahibini bot kullanıcısı yapın:
sudo chown botuser:botuser /opt/telegram-bot/bot.py
Dikkat ederseniz token kodda yok; BOT_TOKEN ortam değişkeninden okunuyor.
5. Adım: Token'ı güvenli bir dosyada saklayın
sudo nano /etc/telegram-bot.env
Dosyaya tek satır yazın (tırnak kullanmayın):
BOT_TOKEN=123456789:AAF...sizin-tokeniniz
Dosyayı yalnızca root'un okuyabileceği hâle getirin:
sudo chown root:root /etc/telegram-bot.env
sudo chmod 600 /etc/telegram-bot.env
systemd bu dosyayı servis başlarken root olarak okur ve değişkeni bota aktarır. Böylece bot kullanıcısı bile dosyayı doğrudan okuyamaz.
6. Adım: systemd servisini oluşturun
systemd servis oluşturma işin kalbidir. systemd, botu açılışta başlatır, çökerse yeniden başlatır ve çıktısını günlüğe yazar.
sudo nano /etc/systemd/system/telegram-bot.service
[Unit]
Description=Telegram bot
After=network-online.target
Wants=network-online.target
[Service]
Type=simple
User=botuser
Group=botuser
WorkingDirectory=/opt/telegram-bot
EnvironmentFile=/etc/telegram-bot.env
Environment=PYTHONUNBUFFERED=1
ExecStart=/opt/telegram-bot/venv/bin/python /opt/telegram-bot/bot.py
Restart=always
RestartSec=5
# Temel sıkılaştırma
NoNewPrivileges=true
PrivateTmp=true
ProtectSystem=strict
ProtectHome=true
ReadWritePaths=/opt/telegram-bot
[Install]
WantedBy=multi-user.target
Önemli satırlar:
Restart=alwaysveRestartSec=5: Bot herhangi bir nedenle kapanırsa 5 saniye sonra yeniden başlatılır.PYTHONUNBUFFERED=1: Python çıktısı gecikmeden loglara düşer.ProtectSystem=strictveReadWritePaths: Bot sistem dosyalarına yazamaz, yalnızca kendi dizinine yazabilir. Botunuz SQLite veritabanı ya da dosya tutuyorsa onları/opt/telegram-botaltında saklayın.NoNewPrivileges=true: Süreç sonradan ek yetki kazanamaz.
7. Adım: Servisi başlatın ve logları izleyin
sudo systemctl daemon-reload
sudo systemctl enable --now telegram-bot
sudo systemctl status telegram-bot
active (running) görüyorsanız Telegram'dan botunuza /start yazın. Canlı logları izlemek için:
sudo journalctl -u telegram-bot -f
Son 100 satırı görmek için sudo journalctl -u telegram-bot -n 100 --no-pager kullanabilirsiniz. Servis yönetiminde işinize yarayacak diğer komutları sunucu yönetimi komutları yazımızda topladık.
Botun gerçekten kendini toparladığını test etmek isterseniz süreci zorla kapatın ve birkaç saniye sonra durumuna bakın:
sudo systemctl kill telegram-bot
sleep 6
sudo systemctl status telegram-bot
Kodu güncelleme
Kodunuzu Git ile tutuyorsanız, depoyu /opt/telegram-bot içine bot kullanıcısıyla klonlayın. Güncelleme iki komuttur:
sudo -u botuser git -C /opt/telegram-bot pull
sudo systemctl restart telegram-bot
Yeni bir kütüphane eklediyseniz önce requirements.txt dosyanızı kurun:
sudo -u botuser /opt/telegram-bot/venv/bin/pip install -r /opt/telegram-bot/requirements.txt
Servis dosyasını değiştirdiğinizde ise sudo systemctl daemon-reload komutunu unutmayın.
Polling mi, webhook mu?
Yukarıdaki bot polling yöntemini kullanıyor: bot, Telegram sunucularına düzenli olarak "yeni mesaj var mı?" diye soruyor. Avantajı, sunucunuzda hiçbir portu dışarıya açmanız gerekmemesi ve alan adı ya da SSL sertifikası istememesidir. Çoğu bot için en basit ve yeterli yöntem budur.
Webhook yönteminde ise Telegram, her yeni mesajı sizin sunucunuzdaki bir HTTPS adresine gönderir. Çok sayıda kullanıcıya hizmet veren botlarda tercih edilir; ancak bir alan adı, geçerli bir SSL sertifikası ve önde bir web sunucusu gerekir. Bunun için Nginx ve Let's Encrypt SSL kurulumu rehberimizi izleyebilirsiniz.
Node.js ve Discord botları için de aynı yöntem
systemd dile bağımlı değildir. Node.js ile yazılmış bir botta yalnızca ExecStart satırı değişir:
ExecStart=/usr/bin/node /opt/telegram-bot/index.js
Discord botları, Python ile yazılmış Telegram kullanıcı botları ya da zamanlanmış görev yapan küçük betikler de aynı yapıyla çalıştırılabilir. Her bot için ayrı bir servis dosyası (discord-bot.service gibi) ve ayrı bir env dosyası kullanın.
Ne kadar kaynak gerekir?
Basit bir komut/yanıt botu genellikle onlarca megabayt RAM ile çalışır ve işlemciyi neredeyse hiç kullanmaz. Bu yüzden giriş seviyesi bir VPS çoğu bot için yeterlidir. Botunuz görsel işliyor, büyük dosya indiriyor, bir yapay zekâ API'sine yoğun istek atıyor ya da veritabanı tutuyorsa daha fazla RAM'e ihtiyaç duyabilirsiniz. Kullanımınızı müşteri panelindeki RAM ve CPU grafiklerinden izleyebilirsiniz.
Sık Sorulan Sorular
Botum çökerse ne olur?
Restart=always sayesinde systemd botu birkaç saniye içinde yeniden başlatır. Sunucu yeniden başlarsa da enable komutu sayesinde bot açılışta otomatik çalışır. Hatanın nedenini journalctl -u telegram-bot ile görebilirsiniz.
Aynı sunucuda birden fazla bot çalıştırabilir miyim?
Evet. Her bot için ayrı bir dizin, ayrı bir env dosyası ve ayrı bir servis dosyası oluşturun (bot1.service, bot2.service gibi). Toplam RAM kullanımına dikkat etmeniz yeterlidir.
screen veya tmux ile çalıştırmak yetmez mi?
Kısa denemeler için yeterlidir, ama sunucu yeniden başladığında bot kendiliğinden açılmaz ve çökerse kimse yeniden başlatmaz. Kalıcı çalışma için systemd çok daha güvenilirdir.
Botunuz için bir sunucu
TürkiyeVPS'in İstanbul'daki VPS paketleri aylık $0.89'dan başlar; Ubuntu 24.04 veya Debian 12, tam root erişimi ve limitsiz trafikle gelir. Ödemeniz onaylandıktan sonra sunucunuz otomatik kurulur ve müşteri panelindeki web terminaliyle hemen bağlanabilirsiniz. Takıldığınız bir yer olursa sitedeki canlı destekten ya da destek talebi oluşturarak bize yazabilirsiniz.
Bunları da okuyun
512 MB veya 1 GB RAM'li bir VPS'te uygulamalarınız kapanıyorsa swap alanı ilk yardımdır. Ubuntu 24.04'te swap...
Metin2 sunucusu kuracaksınız ama VPS mi VDS mi alacağınızdan emin değil misiniz? Kaynak paylaşımı, RAM, disk,...
Alan adınızı VPS'e yönlendirin, Nginx'i kurun, sitenizi yayınlayın ve Certbot ile ücretsiz Let's Encrypt SSL a...