Botu arka planda çalıştırma¶
Bu makalede
Python (veya başka) bir botun sürekli çalışması, hatalarda otomatik yeniden başlatılması ve sunucu yeniden başlatıldıktan sonra başlatılması için yalnızca python main.py çalıştırmak yeterli değildir.
Aşağıda üç kanıtlanmış yöntem bulunmaktadır: basit screen'den endüstri seviyesinde systemd'ye kadar. Gereksinimlerinize göre seçin.
Çevreyi Hazırlama¶
-
Bot kodunu, örneğin
/home/user/botiçinde yerleştirin: -
Bağımlılıkları izole etmek için sanal bir ortam oluşturun ve etkinleştirin:
-
Bağımlılıkları kurun:
-
Manuel başlatmayı test edin:
Not
Botu root olarak çalıştırmayın, yalnızca gerekli ise. Özel bir kullanıcı oluşturmak daha iyidir:
Yöntem 1. screen — hızlı başlatma (test ve geliştirme için)¶
Avantajlar: başlamak en kolay.
Dezavantajlar: çökme veya yeniden başlatma sonrası yeniden başlatmaz — üretim için uygun değil.
Kurulum:
Başlat:
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 |
| Oturumu içerden sonlandır | Ctrl + A, ardından K → Y |
Bilgi
Sunucu yeniden başlatıldığında veya betik çökmesi durumunda bot durdurulmuş kalacaktır. Sadece geçici görevler için kullanın.
Yöntem 2. systemd — Linux hizmetleri için standart (önerilen)¶
Avantajlar: otomatik başlatma, hatalarda yeniden başlatma, günlükleme, sistem entegrasyonu.
Dezavantajlar: yapılandırma dosyası yazmayı gerektirir.
- Bir birim dosyası oluşturun:
- 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 yerine ö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" # günlükler tamponlanmasın
# Güvenlik (isteğe bağlı, ama önerilir)
NoNewPrivileges=true
PrivateTmp=true
ProtectSystem=strict
ProtectHome=true
ReadWritePaths=/home/user/bot/data/ # botun veri erişimi gerekiyorsa
[Install]
WantedBy=multi-user.target
- Hizmeti etkinleştirin:
sudo systemctl daemon-reload
sudo systemctl enable bot.service # önyüklemede otomatik başlatma
sudo systemctl start bot.service # şimdi başlat
- Durumu ve günlükleri kontrol edin:
Güvenlik ipuçları
Hizmetin gereksiz sistem bölümlerine erişimini kısıtlayın (ör. ProtectSystem, ReadOnlyPaths); Bot yalnızca internete ihtiyaç duyuyorsa — 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, ama Python'u da destekler)¶
Avantajlar: basitlik, yerleşik loglar, izleme, web arayüzü.
Dezavantajlar: Node.js gerektirir, basit Python botları için aşırı.
Installation:
# Node.js ve npm'i kur (eğer zaten kurulu değilse)
curl -fsSL https://deb.nodesource.com/setup_lts.x | sudo -E bash -
sudo apt install -y nodejs
# PM2'yi küresel olarak kur
sudo npm install -g pm2
Start the Python bot:
Useful commands:
| Komut | Amaç |
|---|---|
pm2 list | İşlemlerin listesi |
pm2 logs my-bot | Logları görüntüle |
pm2 monit | Gerçek‑zaman izleme |
pm2 startup | Yeniden başlatma sonrası otomatik başlatmayı yapılandır |
pm2 save | Geçerli işlemleri kaydet |
Bilgi
After pm2 startup, follow the terminal instructions — PM2 will generate a systemd unit for autostart.
Yöntem Karşılaştırması¶
| Kriter | screen | systemd | PM2 |
|---|---|---|---|
| Yeniden başlatma sonrası otomatik başlatma | Hayır | Evet | Evet (pm2 startup gerekir) |
| Çökme durumunda yeniden başlatma | Hayır | Evet | Evet |
| Kayıt | 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 (Node.js gerekir) |
| Üretim için uygun | Hayır | Önerilen | Evet (Node.js zaten kullanılıyorsa) |
Not
Bot durduğunda uyarı kurun (örneğin systemd + healthchecks.io ile);
Bağımlılıkları düzenli olarak güncelleyin pip list --outdated;
Tokenları saklamak için .env dosyalarını ve python-dotenv'u kullanın (ve Git'ten hariç tutun!).