Ana içeriğe geç

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

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

    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ı kurun:

    pip install -r requirements.txt
    # Dosya yoksa, manuel kurun, örneğin pip install python-telegram-bot
    

  4. Manuel başlatmayı test edin:

    python main.py
    

Not

Botu root olarak çalıştırmayın, yalnızca gerekli ise. Ö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şlamak en kolay.
Dezavantajlar: çökme veya yeniden başlatma sonrası yeniden başlatmaz — üretim için uygun değil.

Kurulum:

sudo apt update && sudo apt install screen -y

Başlat:

screen -S bot  # adlandırılmış oturum oluştur
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
Oturumu içerden sonlandır Ctrl + A, ardından KY

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.

  1. Bir birim dosyası oluşturun:
sudo nano /etc/systemd/system/bot.service
  1. 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
  1. 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
  1. 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ı

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:

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

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!).