Zuhause / Guides / Node.js

Bereitstellen einer Node.js App in 15 Minuten

Kein Docker, kein PaaS, keine Magie. Node.js plus systemd und Nginx ist ein Stack, der Neustarts, Abstürze und Verkehr überlebt - und Sie können alles lesen.

1. Node.js installieren

apt update && apt install -y curl
curl -fsSL https://deb.nodesource.com/setup_22.x | bash -
apt install -y nodejs
node --version

2. Erstellen Sie einen App-Benutzer

Führen Sie niemals eine Web-App als root aus. Ein separater benutzer begrenzt den schaden, wenn die app jemals kompromittiert wird.

adduser --system --group --home /opt/myapp app
mkdir -p /opt/myapp
chown app:app /opt/myapp

3. App hochladen

Von Ihrem Laptop aus, mit rsync über SSH - kein Git-Server erforderlich:

rsync -avz --exclude node_modules ./app/ root@YOUR_SERVER_IP:/opt/myapp/

Auf dem Server installieren Sie Abhängigkeiten und testen Sie einmal im Vordergrund:

cd /opt/myapp
sudo -u app npm ci --omit=dev
sudo -u app PORT=3000 node server.js

Die App muss zuhören 127.0.0.1:3000 Nicht auf der öffentlichen Schnittstelle. Nginx wird sich dem Internet stellen.

Systemd hält es am Leben

cat > /etc/systemd/system/myapp.service <<'EOF'
[Unit]
Description=My Node.js app
After=network-online.target
[Service]
User=app
WorkingDirectory=/opt/myapp
Environment=NODE_ENV=production
Environment=PORT=3000
ExecStart=/usr/bin/node server.js
Restart=always
RestartSec=3
[Install]
WantedBy=multi-user.target
EOF
systemctl daemon-reload
systemctl enable --now myapp
systemctl status myapp

Crash? Es wird in drei Sekunden neu gestartet. Reboot? Es startet automatisch. Eine neue Version bereitstellen? rsync, dann systemctl restart myapp.

5. Nginx vorn

apt install -y nginx
cat > /etc/nginx/sites-available/myapp <<'EOF'
server {
    listen 80;
    server_name example.com;
    location / {
        proxy_pass http://127.0.0.1:3000;
        proxy_set_header Host $host;
        proxy_set_header X-Forwarded-For $remote_addr;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}
EOF
ln -s /etc/nginx/sites-available/myapp /etc/nginx/sites-enabled/myapp
nginx -t && systemctl reload nginx

Richten Sie dann den A-Record Ihrer Domain auf den Server und fügen Sie HTTPS hinzu - der vollständige Durchlauf befindet sich im Nginx und HTTPS Guide.

6. Logbuch überprüfen

journalctl -u myapp -f --no-pager
tail -f /var/log/nginx/error.log

Die Konsolenausgabe Ihrer App landet automatisch in einem Journal – es müssen keine Protokolldateien konfiguriert werden.

Schnelle Antworten

Benötige ich PM2?

Nicht wirklich. systemd macht alles, was PM2 für einen einzelnen Server tut - Auto-Neustart, Bootstart, Protokolle - ohne zusätzliche Abhängigkeit. PM2 ist vor allem dann sinnvoll, wenn Sie mehrere Node-Prozesse mit Clustering ausführen.

Wie viel RAM benötigt eine Node App?

Eine typische Express-App läuft zwischen 80 und 150 MB. Ein 2-GB-Server führt es bequem neben Nginx und PostgreSQL aus; Build-Schritte wie Webpack sind der speicherhungrige Teil, also Build in CI oder auf Ihrem Laptop.

Wie kann ich eine neue Version ohne Downtime bereitstellen?

rsync den neuen Code, dann neu starten - die Lücke ist unter einer Sekunde, weil systemd den Prozess sofort neu startet. Für Null-Downtime würden Sie zwei Ports ausführen und Nginx stromaufwärts wechseln, aber die meisten Projekte brauchen es nie.

Dieser Stapel passt bequem in Buran-1 bei €6.5/Monat.

Related