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.
apt update && apt install -y curl
curl -fsSL https://deb.nodesource.com/setup_22.x | bash -
apt install -y nodejs
node --version
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
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.
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.
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.
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.
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.
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.
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.