Node.js aplikacija pod systemd-om
Kako da pokreneš Node aplikaciju na VDS-u tako da preživi prekid SSH-a i restart mašine: systemd unit, promenljive okruženja, logovi.
Ažurirano 23. avgust 2026.
Ručno pokrenut node index.js umire zajedno sa SSH sesijom. Da bi aplikacija radila stalno i vratila se posle restarta, pokreni je kao systemd servis — to je ugrađeni sistemski mehanizam, pa ništa ne treba da instaliraš.
Priprema
Instaliraj Node iz zvaničnog repozitorijuma, a ne iz starog sistemskog paketa:
curl -fsSL https://deb.nodesource.com/setup_22.x | bash -
apt install -y nodejs
node -v
Napravi namenskog korisnika — aplikacija ne sme da radi kao 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
systemd servis
Fajl /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 vraća proces u život posle pada. EnvironmentFile je običan fajl sa KEY=value, bez navodnika i bez export; postavi mu dozvole na 600, jer u njemu stoje lozinke.
Izlaganje kroz proksi
Aplikacija treba da sluša samo na 127.0.0.1:3000, a veb server sa sertifikatom je poslužuje ka spolja:
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;
}
Za više detalja pogledaj obrnuti proksi i Let's Encrypt. Ako aplikacija sluša na 0.0.0.0, dostupna je sa interneta mimo proksija i bez enkripcije.
Logovi i ažuriranja
journalctl -u myapp -f
journalctl -u myapp --since "1 hour ago" -p err
systemctl restart myapp
Izlaz na stdout automatski ide u journal — ne moraš da praviš sopstvene log fajlove ni rotaciju logova.
Česte greške
| Simptom | Uzrok |
|---|---|
status=203/EXEC | Pogrešna putanja do node-a ili do fajla u ExecStart — koristi apsolutne putanje |
| Servis se restartuje u krug | Aplikacija pada pri pokretanju: proveri journalctl -u myapp -n 50 |
EADDRINUSE | Ručno pokrenut proces još radi: ss -tulpn | grep 3000 |
| Radi preko SSH, ali ne kao servis | Nedostaju promenljive okruženja — systemd ih nema, podesi ih u EnvironmentFile |
| Build ostane bez memorije na VDS-1 | Napravi build lokalno i prebaci gotov build na mašinu |
Ne stavljaj pm2 povrh systemd-a. Dva nadzornika nad jednim procesom stvaraju zbrku: systemd smatra da je proces živ dok ga pm2 restartuje.