Deploy Node.js med systemd og NGINX
Deploy en Node.js-app på Ubuntu 26.04, kjør den som en egen systemd-service og sett opp NGINX med HTTPS.
Denne guiden deployer en Node.js-app til /srv/example-api, kjører den med en egen Linux-bruker og gjør den tilgjengelig gjennom NGINX. Bytt ut api.example.com og eksempelappen med dine egne verdier.
Før du starter
- En Ubuntu 26.04-VPS satt opp med VPS-guiden
- Et domene med A-record og eventuelt AAAA-record som peker til VPS-en
- En vanlig bruker med sudo
- En app med health endpoint og en dokumentert Node.js-versjon
Installer runtime og NGINX
Ubuntu-pakkene er et enkelt utgangspunkt. Sjekk at Node.js-versjonen støttes av appen før du fortsetter.
sudo apt update
sudo apt install nodejs npm nginx certbot python3-certbot-nginx
node --version
npm --version
Bruk installasjonsmetoden Node.js anbefaler hvis appen trenger en annen støttet versjon.
Opprett bruker og kataloger
sudo adduser --system --group --home /srv/example-api example-api
sudo install -d -o example-api -g example-api -m 0750 /srv/example-api/releases
sudo install -d -o root -g example-api -m 0750 /etc/example-api
Last opp appen til en versjonert katalog, for eksempel /srv/example-api/releases/2026-09-21-1. Installer production dependencies som example-api og pek current til releasen:
sudo -u example-api npm --prefix /srv/example-api/releases/2026-09-21-1 ci --omit=dev
sudo ln -sfn /srv/example-api/releases/2026-09-21-1 /srv/example-api/current
Opprett environment-filen med root som eier og lesetilgang for service-gruppen:
sudo install -o root -g example-api -m 0640 /dev/null /etc/example-api/app.env
sudoedit /etc/example-api/app.env
Legg bare runtime-config i filen. Den skal ikke inn i repoet.
NODE_ENV=production
HOST=127.0.0.1
PORT=3000
Opprett systemd-servicen
Lag /etc/systemd/system/example-api.service:
[Unit]
Description=Example Node.js API
After=network.target
[Service]
Type=simple
User=example-api
Group=example-api
WorkingDirectory=/srv/example-api/current
EnvironmentFile=/etc/example-api/app.env
ExecStart=/usr/bin/node server.js
Restart=on-failure
RestartSec=5
PrivateTmp=true
NoNewPrivileges=true
[Install]
WantedBy=multi-user.target
Valider, start og test servicen lokalt:
sudo systemd-analyze verify /etc/systemd/system/example-api.service
sudo systemctl daemon-reload
sudo systemctl enable --now example-api
sudo systemctl status example-api --no-pager
curl --fail http://127.0.0.1:3000/health
Hvis testen feiler, sjekk sudo journalctl -u example-api -n 100 --no-pager før du går videre.
Sett opp NGINX
Opprett /etc/nginx/sites-available/api.example.com:
server {
listen 80;
listen [::]:80;
server_name api.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;
}
}
sudo ln -s /etc/nginx/sites-available/api.example.com /etc/nginx/sites-enabled/api.example.com
sudo nginx -t
sudo systemctl reload nginx
sudo ufw allow 'Nginx Full'
curl --fail http://api.example.com/health
Be om sertifikatet først når DNS og HTTP-testen virker:
sudo certbot --nginx -d api.example.com
sudo certbot renew --dry-run
curl --fail https://api.example.com/health
Deploy en oppdatering og test rollback
Last opp hver release til en ny katalog, kjør npm ci --omit=dev, flytt current-symlinken og restart servicen. Test health endpoint og sjekk logs med en gang.
Hvis testen feiler, peker du current tilbake til forrige release, restarter example-api og tester på nytt. Database migrations trenger en egen plan for rollback eller forward fix.
Sjekkliste for drift
- Bekreft med
sudo ss -lntpat Node.js bare lytter på127.0.0.1:3000. - Monitorer systemd restarts, NGINX-feil, responstid, minne og ledig disk.
- Oppdater Ubuntu, Node.js, dependencies og NGINX regelmessig.
- Ta backup av appdata og config, og test restore separat.
Se webapplikasjoner på VPS for valg av størrelse og driftsansvar.
Kilder: systemd service units, NGINX proxy module og Certbot.