Ana içeriğe geç

Botu arka planda çalıştırma

Bu makalede - Ortamı hazırlama - Yöntem 1. screen — hızlı başlatma (test ve geliştirme için) - Yöntem 2. systemd — servisler için Linux standardı (önerilen) - Yöntem 3. PM2 — işlem yöneticisi (Node.js için, ancak Python'u destekler) - Yöntem Karşılaştırması

Bir Python (veya başka bir) botun kesintisiz çalışması, hatalarda otomatik yeniden başlaması ve sunucu yeniden başlatıldıktan sonra başlaması için yalnızca 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'den endüstriyel düzeyde systemd'ye kadar üç kanıtlanmış yöntem bulunmaktadır. İhtiyaçlarınıza göre seçim yapın.

Ortamı hazırlama

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

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

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

    python3 -m venv venv
    source venv/bin/activate
    

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

    pip install -r requirements.txt
    # Dosya yoksa — manuel olarak yükleyin, örn. pip install python-telegram-bot
    

  4. Manuel başlatmayı test edin:

    python main.py
    

Not

Botu gerekmedikçe 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)

Artıları: başlamak en kolay olanı.
Eksileri: çökme veya yeniden başlatma sonrası yeniden başlamaz — üretim için uygun değildir.

Kurulum:

sudo apt update && sudo apt install screen -y

Başlatma:

screen -S bot  # adlandırılmış bir oturum oluşturun
source venv/bin/activate
python main.py

Yönetim:

Eylem Komut
Oturumdan ayrıl (arka planda bırak) Ctrl + A, ardından D
Oturum listesini görüntüle screen -ls
Oturuma geri dön screen -r bot
İçeriden oturumu sonlandır Ctrl + A, ardından K > Y

Bilgi

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

Yöntem 2. systemd — servisler için Linux standardı (önerilen)

Artıları: otomatik başlatma, hatalarda yeniden başlatma, günlük kaydı, sistem entegrasyonu.
Eksileri: yapılandırma yazmayı gerektirir.

  1. Birim dosyası oluşturun:

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

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

    [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"  # böylece günlükler tamponlanmaz
    
    
    # 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 günlükleri kontrol edin:

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

Güvenlik ipuçları

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

Yöntem 3. PM2 — işlem yöneticisi (Node.js için, ancak Python'u destekler)

Artıları: basitlik, yerleşik günlükler, izleme, web arayüzü.
Eksileri: Node.js gerektirir, basit Python botları için gereğinden fazla.

Kurulum:

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


# PM2'yi küresel 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 İşlem listesi
pm2 logs my-bot Günlükleri görüntüle
pm2 monit Gerçek zamanlı izleme
pm2 startup Yeniden başlatma sonrası otomatik başlatmayı yapılandır
pm2 save Mevcut işlemleri kaydet

Bilgi

pm2 startup komutundan sonra terminal talimatlarını izleyin — PM2, otomatik başlatma için bir systemd birimi 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
Günlük kaydı Yalnızca oturumda journalctl Yerleşik günlükler
Güvenlik Düşük Yüksek (izolasyon ayarları) Orta
Yapılandırma karmaşıklığı Düşük Orta Düşük (ancak Node.js gerektirir)
Üretim için uygunluk Hayır Önerilen Evet (zaten Node.js kullanılıyorsa)

Ek

Bot durduğunda uyarı 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 kullanın (ve bunları Git'ten hariç tutun!).