Aplikasi Node.js di bawah systemd
Cara menjalankan aplikasi Node di VDS agar tetap hidup saat SSH terputus dan mesin reboot: unit systemd, variabel environment, log.
Diperbarui 23 Agustus 2026
node index.js yang dijalankan secara manual akan mati bersama sesi SSH. Agar aplikasi tetap berjalan permanen dan kembali aktif setelah reboot, jalankan sebagai layanan systemd — ini mekanisme bawaan sistem, jadi tidak ada yang perlu dipasang.
Persiapan
Pasang Node dari repositori resmi, bukan dari paket sistem lama:
curl -fsSL https://deb.nodesource.com/setup_22.x | bash -
apt install -y nodejs
node -v
Buat pengguna khusus — aplikasi tidak boleh berjalan sebagai root:
useradd -r -m -d /srv/app -s /usr/sbin/nologin appuser
chown -R appuser:appuser /srv/app
sudo -u appuser npm ci --omit=dev --prefix /srv/app
Layanan systemd
File /etc/systemd/system/myapp.service:
[Unit]
Description=My Node app
After=network-online.target
Wants=network-online.target
[Service]
Type=simple
User=appuser
WorkingDirectory=/srv/app
EnvironmentFile=/srv/app/.env
ExecStart=/usr/bin/node /srv/app/index.js
Restart=always
RestartSec=5
NoNewPrivileges=true
PrivateTmp=true
[Install]
WantedBy=multi-user.target
systemctl daemon-reload
systemctl enable --now myapp
systemctl status myapp
Restart=always mengembalikan proses setelah crash. EnvironmentFile adalah file KEY=value biasa tanpa tanda kutip dan tanpa export; atur izinnya ke 600, karena berisi kata sandi.
Mengeksposnya melalui proxy
Aplikasi sebaiknya hanya mendengarkan di 127.0.0.1:3000, dan web server dengan sertifikat melayaninya ke luar:
location / {
proxy_pass http://127.0.0.1:3000;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
Untuk detail selengkapnya, lihat reverse proxy dan Let's Encrypt. Jika aplikasi mendengarkan di 0.0.0.0, aplikasi dapat dijangkau dari internet dengan melewati proxy dan tanpa enkripsi.
Log dan pembaruan
journalctl -u myapp -f
journalctl -u myapp --since "1 hour ago" -p err
systemctl restart myapp
Output ke stdout otomatis masuk ke journal — Anda tidak perlu menyiapkan file log sendiri atau rotasi log.
Kesalahan umum
| Gejala | Penyebab |
|---|---|
status=203/EXEC | Path ke node atau ke file di ExecStart salah — gunakan path absolut |
| Layanan restart berulang | Aplikasi crash saat startup: periksa journalctl -u myapp -n 50 |
EADDRINUSE | Proses yang dijalankan manual masih berjalan: ss -tulpn | grep 3000 |
| Berfungsi lewat SSH, tetapi tidak sebagai layanan | Variabel lingkungan tidak ada — systemd tidak memilikinya, atur di EnvironmentFile |
| Build kehabisan memori di VDS-1 | Build secara lokal dan unggah hasil build ke mesin |
Jangan menaruh pm2 di atas systemd. Dua supervisor pada satu proses menimbulkan kebingungan: systemd menganggap proses masih hidup sementara pm2 me-restart-nya.