TürkiyeVPS

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.

6 dk okuma

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=always ve RestartSec=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=strict ve ReadWritePaths: Bot sistem dosyalarına yazamaz, yalnızca kendi dizinine yazabilir. Botunuz SQLite veritabanı ya da dosya tutuyorsa onları /opt/telegram-bot altı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.