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¶
-
Bot kodunu, örneğin
/home/user/botdizinine yerleştirin: -
Bağımlılıkları izole etmek için bir sanal ortam oluşturun ve aktifleştirin:
-
Bağımlılıkları yükleyin:
-
Manuel başlatmayı test edin:
Not
Gerekli olmadıkça botu root olarak çalıştırmayın. Özel bir kullanıcı oluşturmak daha iyidir:
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:
Başlatma:
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.
-
Bir unit dosyası oluşturun:
-
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 -
Servisi etkinleştirin:
-
Durumu ve logları kontrol edin:
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:
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!).