systemd ile kendi servisinizi yazmak: screen ve nohup'a veda

Arka planda çalışması gereken bir betik ya da uygulama için screen oturumu açmak işe yarar, ta ki sunucu yeniden başlayana kadar. Otomatik başlayan, çökünce kalkan ve logları tutulan bir systemd servisini adım adım yazıyoruz.

"Uygulamayı nohup ile başlattım, sunucu yeniden başlayınca kapanmış" cümlesini çok duydum. Linux'ta bu işin doğru aracı zaten kurulu geliyor: systemd.

En basit servis dosyası

/etc/systemd/system/uygulama.service:

[Unit]
Description=Benim uygulamam
After=network-online.target
Wants=network-online.target

[Service]
User=uygulama
WorkingDirectory=/srv/uygulama
EnvironmentFile=/srv/uygulama/.env
ExecStart=/usr/bin/node server.js
Restart=on-failure
RestartSec=5

[Install]
WantedBy=multi-user.target
  • User: Servisi root ile çalıştırmayın; ona özel bir kullanıcı açın.
  • Restart=on-failure: Uygulama çökerse 5 saniye sonra yeniden başlatılır.
  • EnvironmentFile: Gizli değerler servis dosyasında değil, izinleri kısıtlı ayrı bir dosyada durur.

Çalıştırmak

sudo systemctl daemon-reload
sudo systemctl enable --now uygulama
systemctl status uygulama

enable --now hem şimdi başlatır hem de açılışta otomatik başlamasını sağlar.

Loglar

Uygulamanın standart çıktısına yazdığı her şey journal'a gider; ayrıca log dosyası yönetmenize gerek kalmaz:

journalctl -u uygulama -f
journalctl -u uygulama --since "1 hour ago"

Bonus: Birkaç satırla sertleştirme

NoNewPrivileges=true
PrivateTmp=true
ProtectSystem=strict
ProtectHome=true
ReadWritePaths=/srv/uygulama/storage

Bu satırlar servisin sistem dosyalarına yazmasını ve yetki yükseltmesini engeller. Uygulama ele geçirilse bile zarar sınırlı kalır. Mevcut durumu puanlamak için:

systemd-analyze security uygulama

Sonuç

Yirmi satırlık bir dosya; karşılığında otomatik başlama, çökme sonrası kurtarma, merkezi loglar ve ek bir güvenlik katmanı. Sunucuda uzun süre çalışacak her şey için ilk tercihim bu.

İlgili Yazılar