Apa itu Systemd?
Systemd adalah init system default di hampir semua distro Linux modern (Ubuntu, Debian, RHEL, CentOS). Tugasnya: boot system, start service di urutan yang benar, restart service yang crash, dan jadi "PID 1" yang induk semua proses lain.
Unit Files: .service
Setiap service yang dikelola systemd didefinisikan oleh unit file. Lokasinya di /etc/systemd/system/ (custom) atau /lib/systemd/system/ (dari package).
# /etc/systemd/system/myapp.service
[Unit]
Description=My Node.js App
Documentation=https://github.com/me/myapp
After=network.target postgresql.service
Requires=postgresql.service
[Service]
Type=simple
User=deploy
WorkingDirectory=/var/www/myapp
ExecStart=/usr/bin/node /var/www/myapp/server.js
Restart=on-failure
RestartSec=5
Environment=NODE_ENV=production
EnvironmentFile=/etc/myapp/env
# Security hardening
NoNewPrivileges=true
PrivateTmp=true
ProtectSystem=strict
ReadWritePaths=/var/log/myapp
[Install]
WantedBy=multi-user.target
Tiga Bagian Unit File
- [Unit] — metadata + dependencies (
After=,Requires=,Wants=) - [Service] — cara menjalankan (
ExecStart,Restart,User) - [Install] — kapan di-enable (target yang me-trigger start)
Dependencies: After= vs Requires=
After=postgresql.service— urutan start (myapp start setelah postgres), tapi jika postgres gagal, myapp tetap dicoba startRequires=postgresql.service— jika postgres gagal/stop, myapp juga di-stopWants=— lebih lunak dari Requires (best-effort dependency)
Restart Policies
Restart=no # default — jangan restart
Restart=on-failure # restart kalau exit code bukan 0 (paling umum untuk app)
Restart=always # restart apapun alasannya, bahkan exit 0
Restart=on-abnormal # signal kill atau timeout
RestartSec=5 # tunggu 5 detik sebelum restart
StartLimitIntervalSec=60
StartLimitBurst=5 # kalau gagal 5x dalam 60 detik, berhenti coba
systemctl: Kelola Service
# Lifecycle
sudo systemctl start myapp # start sekarang
sudo systemctl stop myapp # stop sekarang
sudo systemctl restart myapp # stop + start
sudo systemctl reload myapp # kirim SIGHUP (kalau app support config reload)
sudo systemctl status myapp # status + recent log
# Persistensi antar reboot
sudo systemctl enable myapp # auto-start saat boot
sudo systemctl disable myapp # jangan auto-start
sudo systemctl is-enabled myapp
# Setelah edit unit file
sudo systemctl daemon-reload # reload definisi unit
sudo systemctl restart myapp
# List
systemctl list-units --type=service --state=running
systemctl list-unit-files # semua service termasuk disabled
journalctl: Baca Log Systemd
# Log satu service
sudo journalctl -u myapp
sudo journalctl -u myapp -f # follow (tail -f)
sudo journalctl -u myapp --since "1 hour ago"
sudo journalctl -u myapp --since "2025-04-15 10:00"
# Filter by priority (err, warning, info, debug)
sudo journalctl -u myapp -p err
# Semua log sejak boot terakhir
sudo journalctl -b
Socket Activation (Singkat)
Systemd bisa menjadwalkan start service baru saat ada koneksi datang ke port tertentu, bukan boot langsung. Ini menghemat resource untuk service yang jarang dipakai. Mirip konsep lama inetd.
# myapp.socket mendengarkan port 3000
# myapp.service akan di-start hanya saat ada koneksi pertama
[Socket]
ListenStream=3000
Accept=no
Systemd vs Docker: Kapan Pakai Apa?
- Systemd — service native di VPS, tidak butuh isolasi container, dependensi jelas dengan service OS lain (Nginx, Postgres yang juga systemd). Lebih ringan, integrasi journal, resource control via cgroup
- Docker — butuh isolasi, portability antar environment, banyak service dengan dependensi kompleks, deploy via image
- Kombinasi: systemd unit yang menjalankan
docker runataudocker compose up— dapat restart policy dari systemd + isolasi Docker