Systemd & Service Management — DevOps

Apa itu Systemd? Systemd adalah init system default di hampir semua distro Linux modern (Ubuntu, Debian, RHEL, CentOS). Tugasnya: boot system, start service…

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

Dependencies: After= vs Requires=

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?

Yang akan kamu pelajari