İçindekiler
Sunucuda bir Node.js uygulaması, bir Python betiği ya da küçük bir Go servisi çalıştırmanız gerekti. İlk akla gelen yöntem genelde şudur:
nohup python3 bot.py > bot.log 2>&1 &
Bu yöntem çalışır, ta ki sunucu yeniden başlayana ya da uygulama bir hata yüzünden çökene kadar. O zaman kimse uygulamayı tekrar başlatmaz, siz de durumu ancak bir kullanıcı şikâyet ettiğinde öğrenirsiniz.
Modern Linux dağıtımlarının neredeyse tamamında bulunan systemd, bu işi sizin yerinize yapar.
İlk servis dosyası
/etc/systemd/system/bot.service:
[Unit]
Description=Telegram bildirim botu
After=network-online.target
Wants=network-online.target
[Service]
Type=simple
User=botuser
Group=botuser
WorkingDirectory=/opt/bot
ExecStart=/opt/bot/venv/bin/python /opt/bot/bot.py
Restart=on-failure
RestartSec=5
EnvironmentFile=/opt/bot/.env
[Install]
WantedBy=multi-user.target
Bölümleri kısaca açıklayayım:
After=network-online.target: Ağ hazır olmadan başlama.User=/Group=: Uygulamayı root olarak değil, ayrıcalıksız bir kullanıcıyla çalıştır. Bu çok önemli: Uygulamadaki bir açık bütün sunucuyu ele geçirmesin.ExecStart=: Çalışacak komut. Tam yol yazın; systemd sizin shell ortamınızı vePATHdeğişkeninizi bilmez.Restart=on-failure: Uygulama hata koduyla çıkarsa 5 saniye sonra yeniden başlat.EnvironmentFile=: Şifre ve ayarları bir dosyadan ortam değişkeni olarak yükle.WantedBy=multi-user.target: "Etkinleştir" dediğimde açılışta başlat.
Etkinleştirmek ve başlatmak
systemctl daemon-reload
systemctl enable --now bot
systemctl status bot
daemon-reload, systemd'nin yeni ya da değişmiş birim dosyalarını okumasını sağlar. Servis dosyasını her değiştirdiğinizde bu komutu çalıştırmanız gerekir. enable --now ise hem açılışta başlatmayı ayarlar hem de servisi hemen çalıştırır.
Günlükler: journalctl
nohup ile bir log dosyası tutmanıza gerek kalmaz. Uygulamanın standart çıktısına ve hata çıktısına yazdığı her şey systemd günlüğüne gider:
journalctl -u bot -f # canlı izle
journalctl -u bot --since "1 hour ago"
journalctl -u bot -p err # yalnızca hatalar
Günlükler zamanla dolmaz; journald boyut sınırına göre eskileri kendisi siler.
Sık karşılaşılan sorunlar
Servis başlıyor ve hemen duruyor. systemctl status bot ve journalctl -u bot -n 50 çıktısına bakın. Çoğu zaman sebep şunlardan biridir: yanlış yol, eksik izin ya da sizin shell'inizde tanımlı ama servise verilmemiş bir ortam değişkeni.
"Start request repeated too quickly". Uygulama sürekli çöküyor ve systemd belirli bir süre içinde çok fazla yeniden başlatma denediği için vazgeçti. Önce çökmenin sebebini çözün, sonra şu komutla sayacı sıfırlayın:
systemctl reset-failed bot
Uygulama çalışıyor ama dosyaya yazamıyor. User= ile belirttiğiniz kullanıcının o klasöre yazma izni yoktur. chown ile sahipliği düzeltin.
Biraz daha güvenlik
systemd, uygulamanızı birkaç satırla kum havuzuna (sandbox) almanıza da izin verir:
[Service]
NoNewPrivileges=true
ProtectSystem=strict
ProtectHome=true
ReadWritePaths=/opt/bot/data
PrivateTmp=true
Bu ayarlarla uygulama, sistem dosyalarını yalnızca okuyabilir. Ev dizinlerini göremez ve yalnızca izin verdiğiniz klasöre yazabilir. Hangi ayarların uygulamanızı ne kadar koruduğunu görmek için:
systemd-analyze security bot
Zamanlanmış görevler için timer
systemd, cron'un yerine de kullanılabilir. Bir .timer dosyası bir .service dosyasını belirli aralıklarla çalıştırır. Cron'a göre avantajı, çıktının otomatik olarak günlüğe gitmesi ve sunucu kapalıyken kaçırılan çalışmaları açılışta telafi edebilmesidir (Persistent=true).
Sonuç
Bir servis dosyası yazmak on dakika sürer. Karşılığında uygulamanız açılışta kendiliğinden başlar, çökerse kendini toparlar, günlükleri tek bir yerde durur ve root yetkisi olmadan çalışır. nohup ile kıyaslanmayacak kadar sağlam bir düzen.
Yorumlar
Henüz yorum yok. İlk yorumu siz yazın.