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 -vGunakan 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 6003. 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.target4. 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