Operasional VPS9 menit baca

Deploy Aplikasi Node.js ke VPS dengan systemd dan Nginx

Menjalankan `npm start` di terminal SSH bukan deployment: proses berhenti saat sesi ditutup. Di produksi, aplikasi dijalankan oleh process supervisor dan diakses melalui reverse proxy.

Diperbarui

1. Pasang Node.js LTS

curl -fsSL https://deb.nodesource.com/setup_22.x | sudo -E bash -
sudo apt -y install nodejs
node -v && npm -v
Gunakan rilis LTS untuk produksi. Versi ganjil (odd-numbered) memiliki masa dukungan lebih pendek.

2. Siapkan aplikasi

sudo mkdir -p /srv/app && sudo chown $USER:$USER /srv/app
cd /srv/app
git clone <repo-anda> .
npm ci --omit=dev
# variabel lingkungan disimpan di berkas terpisah, permission 600

3. Unit systemd

Simpan sebagai /etc/systemd/system/app.service, lalu aktifkan.

  • sudo systemctl daemon-reload
  • sudo systemctl enable --now app
  • sudo systemctl status app --no-pager
  • journalctl -u app -f (memantau log real time)
# /etc/systemd/system/app.service
[Unit]
Description=Aplikasi Node.js
After=network.target

[Service]
Type=simple
User=deploy
WorkingDirectory=/srv/app
EnvironmentFile=/srv/app/.env
ExecStart=/usr/bin/node /srv/app/server.js
Restart=always
RestartSec=3
NoNewPrivileges=true
PrivateTmp=true

[Install]
WantedBy=multi-user.target

4. Reverse proxy Nginx

server {
  listen 80;
  server_name example.com;

  location / {
    proxy_pass http://127.0.0.1:3000;
    proxy_http_version 1.1;
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto $scheme;
  }
}

5. HTTPS

Setelah DNS mengarah ke IP server, terbitkan sertifikat dengan Certbot. Perpanjangan berjalan otomatis lewat timer systemd.

  • Jalankan aplikasi di 127.0.0.1, bukan 0.0.0.0, agar tidak dapat diakses langsung tanpa proxy.
  • Simpan secret di EnvironmentFile dengan permission 600, bukan di dalam repo.
  • Pantau `journalctl -u app` setelah deploy pertama.
sudo apt -y install certbot python3-certbot-nginx
sudo certbot --nginx -d example.com -d www.example.com --redirect
sudo certbot renew --dry-run