Skip to content
VDS · Situs web dan server web

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

GejalaPenyebab
status=203/EXECPath ke node atau ke file di ExecStart salah — gunakan path absolut
Layanan restart berulangAplikasi crash saat startup: periksa journalctl -u myapp -n 50
EADDRINUSEProses yang dijalankan manual masih berjalan: ss -tulpn | grep 3000
Berfungsi lewat SSH, tetapi tidak sebagai layananVariabel lingkungan tidak ada — systemd tidak memilikinya, atur di EnvironmentFile
Build kehabisan memori di VDS-1Build 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.