← Tilbake til dokumentasjon
Middels

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.

nodejsnginxsystemddeploymenthttps

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 -lntp at 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.