Ana içeriğe geç

Botu arka planda çalıştırma

Bu makalede

Bir Python (veya başka bir dildeki) botun sürekli çalışması, hatalarda otomatik olarak yeniden başlatılması ve sunucu yeniden başlatıldıktan sonra başlaması için sadece python main.py komutunu çalıştırmak yeterli değildir. Tam teşekküllü bir arka plan servisine ihtiyacınız vardır.

Aşağıda, basit screen kullanımından endüstriyel düzeydeki systemd yapısına kadar kanıtlanmış üç yöntem bulunmaktadır. İhtiyaçlarınıza göre birini seçin.

Ortamı hazırlama

  1. Bot kodunu, örneğin /home/user/bot dizinine yerleştirin:

    mkdir -p /home/user/bot && cd /home/user/bot
    

  2. Bağımlılıkları izole etmek için bir sanal ortam oluşturun ve aktifleştirin:

    python3 -m venv venv
    source venv/bin/activate
    

  3. Bağımlılıkları yükleyin:

    pip install -r requirements.txt
    # Eğer dosya mevcut değilse — manuel olarak yükleyin, örneğin: pip install python-telegram-bot
    

  4. Manuel başlatmayı test edin:

    python main.py
    

Not

Gerekli olmadıkça botu root olarak çalıştırmayın. Özel bir kullanıcı oluşturmak daha iyidir:

sudo adduser --disabled-login botuser
sudo chown -R botuser:botuser /home/user/bot

Yöntem 1. screen - hızlı başlatma (test ve geliştirme için)

Avantajları: Başlaması en kolay yöntemdir.
Dezavantajları: Çökme veya yeniden başlatma sonrası yeniden başlamaz — production için uygun değildir.

Kurulum:

sudo apt update && sudo apt install screen -y

Başlatma:

screen -S bot  # isimlendirilmiş bir oturum oluşturur
source venv/bin/activate
python main.py

Yönetim:

İşlem Komut
Oturumdan ayrılma (arka planda bırakma) Ctrl + A, ardından D
Oturum listesini görüntüleme screen -ls
Oturuma geri dönme screen -r bot
Oturumu içeriden sonlandırma Ctrl + A, ardından K > Y

Bilgi

Sunucu yeniden başlatıldığında veya script çöktüğünde, bot durdurulmuş olarak kalacaktır. Yalnızca geçici görevler için kullanın.

Yöntem 2. systemd - Servisler için Linux standardı (önerilen)

Avantajları: Otomatik başlatma, hatalarda yeniden başlatma, günlük tutma (logging), sistem entegrasyonu.
Dezavantajları: Bir yapılandırma dosyası yazmayı gerektirir.

  1. Bir unit dosyası oluşturun:

    sudo nano /etc/systemd/system/bot.service
    

  2. Yapılandırmayı yapıştırın (yolları ve kullanıcıyı güncelleyin!):

    [Unit]
    Description=Telegram Bot Service
    After=network.target
    StartLimitIntervalSec=30
    StartLimitBurst=5
    
    [Service]
    Type=simple
    User=botuser                 # ← root olmaması önerilir!
    Group=botuser
    WorkingDirectory=/home/user/bot
    ExecStart=/home/user/bot/venv/bin/python /home/user/bot/main.py
    Restart=always
    RestartSec=10
    Environment="PYTHONUNBUFFERED=1"  # logların tamponlanmaması için
    
    # Güvenlik (isteğe bağlı, ancak önerilir)
    NoNewPrivileges=true
    PrivateTmp=true
    ProtectSystem=strict
    ProtectHome=true
    ReadWritePaths=/home/user/bot/data/  # botun veri erişimine ihtiyacı varsa
    
    [Install]
    WantedBy=multi-user.target
    

  3. Servisi etkinleştirin:

    sudo systemctl daemon-reload
    sudo systemctl enable bot.service   # açılışta otomatik başlatma
    sudo systemctl start bot.service    # şimdi başlat
    

  4. Durumu ve logları kontrol edin:

    sudo systemctl status bot.service
    journalctl -u bot.service -f --since "1 hour ago"
    

Not

Servisin sistemin gereksiz kısımlarına erişimini kısıtlayın (ProtectSystem, ReadOnlyPaths aracılığıyla);
Botun sadece internete ihtiyacı varsa RestrictNetwork=true ekleyin ve IPAddressAllow=... yapılandırın;
Geçici dosyalar için RuntimeDirectory= kullanın.

Yöntem 3. PM2 - süreç yöneticisi (Node.js için, ancak Python destekler)

Avantajları: Basitlik, yerleşik loglar, izleme, web arayüzü.
Dezavantajları: Node.js gerektirir, basit Python botları için gereğinden fazla karmaşıktır.

Kurulum:

# Node.js ve npm yükleyin (eğer yüklü değilse)
curl -fsSL https://deb.nodesource.com/setup_lts.x | sudo -E bash -
sudo apt install -y nodejs

# PM2'yi global olarak yükleyin
sudo npm install -g pm2

Python botunu başlatın:

cd /home/user/bot
pm2 start main.py --name "my-bot" --interpreter ./venv/bin/python

Faydalı komutlar:

Komut Amaç
pm2 list Süreçlerin listesi
pm2 logs my-bot Logları görüntüleme
pm2 monit Gerçek zamanlı izleme
pm2 startup Yeniden başlatma sonrası otomatik başlatmayı yapılandırma
pm2 save Mevcut süreçleri kaydetme

Bilgi

pm2 startup komutundan sonra terminaldeki talimatları izleyin — PM2, otomatik başlatma için bir systemd unit dosyası oluşturacaktır.

Yöntem Karşılaştırması

Kriter screen systemd PM2
Yeniden başlatma sonrası otomatik başlatma Hayır Evet Evet (pm2 startup gerektirir)
Çökme sonrası yeniden başlatma Hayır Evet Evet
Loglama Sadece oturumda journalctl Yerleşik loglar
Güvenlik Düşük Yüksek (izolasyon ayarları) Orta
Yapılandırma karmaşıklığı Düşük Orta Düşük (ancak Node.js gerektirir)
Production için uygunluk Hayır Önerilen Evet (eğer halihazırda Node.js kullanılıyorsa)

Not

Bot durduğunda uyarı verecek bir sistem kurun (örneğin systemd + healthchecks.io aracılığıyla);
Bağımlılıkları düzenli olarak güncelleyin pip list --outdated;
Tokenları saklamak için .env dosyalarını ve python-dotenv paketini kullanın (ve bunları Git'e dahil etmeyin!).