<link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=IBM+Plex+Mono:wght@500&family=IBM+Plex+Sans:wght@400;500;600&family=Instrument+Sans:wght@600;700&family=Noto+Sans+Georgian:wght@400..700&display=swap"> Zum Inhalt springen
Binwi logo

Eine Node.js-App betreiben

In den Beispielen ist svm123 Ihr Benutzername und SERVER_IP Ihre Serveradresse — beides steht auf dem Tab „Zugriff“ Ihrer SVM in der Konsole.

Starten Sie die App als Dienst, der von selbst startet und nach dem Abmelden weiterläuft, und leiten Sie nginx darauf:

# 1. the app: listen on the socket (or port) it is given
cd ~/apps && git clone https://github.com/you/app.git myapp && cd myapp
npm install
#    app.listen(process.env.SOCK || process.env.PORT)

# 2. keep it running, also after you log out and after reboots
cp ~/.config/systemd/user/app.service.example ~/.config/systemd/user/myapp.service
nano ~/.config/systemd/user/myapp.service      # WorkingDirectory=%h/apps/myapp
systemctl --user daemon-reload
systemctl --user enable --now myapp

# 3. send your domain to it
cp ~/nginx/conf.d/node-app.conf.example ~/nginx/conf.d/myapp.conf
nano ~/nginx/conf.d/myapp.conf                 # server_name example.com www.example.com;
systemctl --user reload svm-nginx

Der Beispieldienst gibt der App einen privaten Socket in SOCK. Kann die App nur einen TCP-Port nutzen, verwenden Sie einen Ihrer eigenen Ports auf 127.0.0.1 — sie stehen auf dem Tab „Nutzung“ — und setzen Sie PORT. Andere Ports sind gesperrt.

Next.js

next start kann nicht auf einem Socket lauschen. Geben Sie ihm einen Ihrer eigenen Ports (auf dem Tab „Nutzung“) und leiten Sie nginx auf 127.0.0.1 mit diesem Port:

# ~/.config/systemd/user/mynext.service
[Service]
WorkingDirectory=%h/apps/mynext
Environment=NODE_ENV=production
ExecStart=%h/apps/mynext/node_modules/.bin/next start -p 10000 -H 127.0.0.1
Restart=on-failure

[Install]
WantedBy=default.target
# ~/nginx/conf.d/mynext.conf
server {
    listen unix:/run/svm/svm123/nginx.sock;
    server_name example.com www.example.com;
    location / {
        proxy_pass http://127.0.0.1:10000;
        proxy_http_version 1.1;
        proxy_set_header Host $host;
        proxy_set_header X-Forwarded-For $remote_addr;
        proxy_set_header X-Forwarded-Proto $http_x_forwarded_proto;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection $connection_upgrade;
    }
}
npx next build --webpack            # not Turbopack — see below
systemctl --user daemon-reload
systemctl --user enable --now mynext
systemctl --user reload svm-nginx

Bauen Sie mit webpack, nicht mit Turbopack. Next.js 16 nutzt standardmäßig Turbopack, das mit seinen Hilfsprozessen über zufällige lokale Ports spricht — auf SVM darf jedes Konto nur seine eigenen Ports nutzen, daher bricht ein Turbopack-Build mit „binding to a port: Operation not permitted“ ab. Der webpack-Build liefert dasselbe Ergebnis. Am einfachsten tragen Sie das Flag in package.json ein:

// package.json — so npm run build / npm run dev work as usual
"scripts": {
  "dev": "next dev --webpack",
  "build": "next build --webpack",
  "start": "next start"
}

Der Build braucht mehr Speicher als der Betrieb: next build braucht etwa 1 GB, die laufende App rund 150 MB. Bricht ein Build mit „Killed“ ab, hat der Speicher des Tarifs nicht gereicht — bauen Sie auf Ihrem Computer und laden Sie das Projekt samt .next-Ordner hoch, oder nehmen Sie einen größeren Tarif. Seiten, die beim Build Ihre eigene API abfragen, brauchen eine funktionierende API.