Skip to content
VDS · Sajtovi i veb serveri

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

SimptomUzrok
status=203/EXECPogrešna putanja do node-a ili do fajla u ExecStart — koristi apsolutne putanje
Servis se restartuje u krugAplikacija pada pri pokretanju: proveri journalctl -u myapp -n 50
EADDRINUSERučno pokrenut proces još radi: ss -tulpn | grep 3000
Radi preko SSH, ali ne kao servisNedostaju promenljive okruženja — systemd ih nema, podesi ih u EnvironmentFile
Build ostane bez memorije na VDS-1Napravi 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.