Node.js: Erste Schritte

Erfahren Sie, wie Sie einen Node.js-Dienst schnell und sicher auf Stackhero bereitstellen

👋 Willkommen in der Stackhero-Dokumentation!

Stackhero bietet eine einsatzbereite Node.js Cloud Lösung, die zahlreiche Vorteile bietet, darunter:

  • Deployen Sie Ihre Anwendung in Sekundenschnelle mit einem einfachen git push.
  • Nutzen Sie Ihren eigenen Domainnamen und profitieren Sie von der automatischen Konfiguration von HTTPS-Zertifikaten für erhöhte Sicherheit.
  • Genießen Sie sorgenfreie automatische Backups, Ein-Klick-Updates und eine einfache, transparente und vorhersehbare Preisgestaltung.
  • Erhalten Sie optimale Performance und robuste Sicherheit dank einer privaten und dedizierten VM.

Sparen Sie Zeit und vereinfachen Sie Ihr Leben: Es dauert nur 5 Minuten, um die Node.js Cloud Hosting Lösung von Stackhero auszuprobieren!

Das Bereitstellen eines Node.js-Dienstes auf Stackhero ist schnell, effizient und zuverlässig. Dieser Leitfaden führt Sie durch die wesentlichen Schritte, um Ihre App in Sekundenschnelle bereitzustellen und dabei höchste Sicherheit und Leistung zu gewährleisten.

Beginnen Sie mit der Erstellung eines Node.js-Dienstes auf Stackhero. Dieser Schritt legt die Grundlage für Ihre Anwendungsbereitstellung und bereitet Sie darauf vor, alle Vorteile der Cloud-Hosting-Lösung von Stackhero zu nutzen.

Bevor Sie auf Stackhero bereitstellen, stellen Sie sicher, dass Sie die folgenden Tools installiert haben:

  1. Git. Sie können es von https://git-scm.com/downloads herunterladen.
  2. Für Windows-Nutzer empfehlen wir die Verwendung von Windows Terminal, das über den Microsoft Store verfügbar ist, für eine bessere Erfahrung.

Die einzige Konfiguration, die Sie benötigen, ist das Aktualisieren Ihres öffentlichen SSH-Schlüssels. Dieser Schlüssel ermöglicht Stackhero den sicheren Zugriff auf Ihr Code-Repository.

Um Ihren öffentlichen Schlüssel zu finden, führen Sie einen der folgenden Befehle aus:

cat ~/.ssh/id_rsa.pub

oder

cat ~/.ssh/id_ed25519.pub

Wenn Sie noch kein SSH-Schlüsselpaar haben, können Sie eines erstellen, indem Sie ssh-keygen auf Linux oder macOS oder ssh-keygen.exe auf Windows ausführen.

Nachdem Sie Ihren öffentlichen Schlüssel erhalten haben, melden Sie sich beim Stackhero-Dashboard an, wählen Sie Ihren Node.js-Dienst aus, navigieren Sie zu dessen Konfiguration und fügen Sie Ihren Schlüssel ein.

Tipp: Sie können Ihren öffentlichen SSH-Schlüssel global festlegen, sodass alle zukünftigen Dienste ihn automatisch enthalten. Gehen Sie dazu zum Stackhero-Dashboard, klicken Sie auf Ihr Profilbild (oben rechts), navigieren Sie zu 'Ihr Profil' und fügen Sie Ihren öffentlichen SSH-Schlüssel ein.

Eine Beispielanwendung für Node.js wird bereitgestellt, um den Bereitstellungsprozess auf Stackhero zu veranschaulichen. Sie können das Repository mit den folgenden Befehlen klonen:

git clone https://github.com/stackhero-io/nodejsGettingStarted.git stackhero-nodejs-getting-started
cd stackhero-nodejs-getting-started

Das Bereitstellen Ihrer Anwendung über git ist auf Stackhero schnell, zuverlässig und unkompliziert. Auf der Hauptseite Ihres Dienstes finden Sie einen Befehl zum Hinzufügen eines git-Remote. Es könnte so aussehen:

git remote add stackhero ssh://stackhero@XXXXX.stackhero-network.com:222/project.git

Kopieren Sie einfach den Befehl und fügen Sie ihn in Ihr Terminal ein.

Pushen Sie Ihren Code zu Stackhero mit dem folgenden Befehl:

git push stackhero main

Beim ersten Push werden Sie aufgefordert, den Schlüssel-Fingerprint hinzuzufügen. Geben Sie "yes" ein, um fortzufahren.

Nach wenigen Augenblicken ist Ihre Anwendung live. Sie können ihren Status überprüfen, indem Sie die auf dem Stackhero-Dashboard angegebene Website-URL besuchen (zum Beispiel https://XXXXX.stackhero-network.com).

Das war's. Ihre Anwendung ist jetzt bereitgestellt!

Wenn Sie Änderungen an der Datei app.js vornehmen, committen und pushen Sie einfach Ihre Änderungen:

git add -A .
git commit -m "Update app.js"
git push stackhero main

Für bestehende Anwendungen fügen Sie das Remote-Repository wie zuvor beschrieben unter Konfigurieren Sie den Remote-Repository-Server hinzu. Dann deployen Sie Ihre Änderungen mit:

git push stackhero main

Wenn Sie den folgenden Fehler erhalten:

error: failed to push some refs to '[...]'
hint: Updates were rejected because the remote contains work that you do
hint: not have locally. This is usually caused by another repository pushing
hint: to the same ref. You may want to first integrate the remote changes
(e.g., 'git pull ...') before pushing again.
hint: See the 'Note about fast-forwards' in 'git push --help' for details.

Dieser Fehler zeigt an, dass Ihr lokales Repository nicht mit dem Remote-Repository synchronisiert ist. In diesem Fall können Sie den Push erzwingen, indem Sie ausführen:

git push -f stackhero main

Wenn Sie diesen Fehler beim Ausführen von git push stackhero main sehen:

error: src refspec main does not match any
error: failed to push some refs to 'ssh://<XXXXXX>.stackhero-network.com:222/project.git'

Dies zeigt an, dass der Branch main nicht existiert. Sie können versuchen, stattdessen den Branch master zu pushen:

git push stackhero master

Wenn git mit "Everything up-to-date" antwortet, aber Ihre Änderungen nicht bereitgestellt werden, kann es sein, dass Sie vergessen haben, Ihre Änderungen zu committen. In solchen Fällen führen Sie aus:

git add -A .
git commit -m "Your commit message"
git push stackhero main

Wenn keine Änderungen vorgenommen wurden, Sie aber dennoch eine Bereitstellung erzwingen möchten, können Sie einen leeren Commit erzwingen:

git commit --allow-empty -m "Force update"
git push stackhero main

Wenn Sie einen anderen Branch als main bereitstellen möchten, wie zum Beispiel production, können Sie den folgenden Befehl verwenden:

git push stackhero production:main

Wenn Sie mit Tags arbeiten und einen bestimmten Tag bereitstellen möchten (zum Beispiel v1.0), führen Sie aus:

git push stackhero 'v1.0^{}:main'

Hierbei stellt ^{} sicher, dass der mit dem Tag verbundene Commit gepusht wird.

Wenn Sie einen bestimmten Commit bereitstellen müssen, identifizieren Sie zuerst den Commit-Hash mit git log. Dann deployen Sie ihn mit:

git push -f stackhero <HASH>:main

Sie können mehrere Node.js-Dienste für verschiedene Umgebungen wie Produktion und Staging einrichten. Um das aktuelle Remote von stackhero in stackhero-staging umzubenennen, führen Sie aus:

git remote rename stackhero stackhero-staging

Erstellen Sie dann einen neuen Node.js-Dienst im Stackhero-Dashboard und fügen Sie ihn als stackhero-production hinzu:

git remote add stackhero-production ssh://stackhero@XXXXX.stackhero-network.com:222/project.git

Deployen Sie in Produktion oder Staging mit den jeweiligen Befehlen:

git push stackhero-production main

oder

git push stackhero-staging main

Auf macOS werden Sie möglicherweise bei jedem Push nach Ihrem SSH-Schlüssel-Passwort gefragt. Für mehr Komfort und Sicherheit (ohne Ihr Schlüssel-Passwort zu entfernen) können Sie es im macOS-Schlüsselbund speichern, indem Sie ausführen:

/usr/bin/ssh-add --apple-use-keychain ~/.ssh/id_rsa

Dieser Befehl speichert Ihr Schlüssel-Passwort im Schlüsselbund, sodass Sie bei zukünftigen Bereitstellungen nicht mehr aufgefordert werden.

Für Staging- und Produktionsumgebungen ist es wichtig, Geheimnisse wie Tokens oder Passwörter sicher zu verwalten. Anstatt diese Geheimnisse direkt in Ihrem Repository zu speichern, verwenden Sie Umgebungsvariablen für erhöhte Sicherheit.

Sie können Umgebungsvariablen über das Stackhero-Dashboard hinzufügen und in Ihrem Node.js-Code darauf zugreifen. Wenn Sie beispielsweise eine Variable namens mySecret definieren, können Sie in Ihrer App wie folgt darauf zugreifen:

process.env.mySecret

Wenn Ihre Anwendung kein HTTP verwendet, müssen Sie möglicherweise zusätzliche TCP- und UDP-Ports über das Stackhero-Dashboard öffnen. Geben Sie einfach den öffentlichen Eingangsport, den Zielport auf Ihrem Node.js-Dienst und das Protokoll (TCP oder UDP) an, um eine ordnungsgemäße Konnektivität sicherzustellen.

Zum Speichern von Dateien wie Benutzerfotos ist es am besten, eine Object-Storage-Lösung zu verwenden. Dieser Ansatz ermöglicht das Teilen von Dateien über mehrere Dienste und Instanzen hinweg, während Ihr Code von Ihren Daten getrennt bleibt. Wir empfehlen MinIO als einfache, schnelle und leistungsstarke Lösung, die mit dem Amazon S3-Protokoll kompatibel ist.

Wenn Sie lokalen Speicher bevorzugen, können Sie den persistenten Speicher verwenden, der mit Ihrer Node.js-Instanz verfügbar ist. Dieser Speicher befindet sich unter /persistent/storage/.

VORSICHT: Speichern Sie niemals Daten außerhalb des Ordners /persistent/storage/!

Daten, die außerhalb dieses Ordners gespeichert werden, können verloren gehen, wenn Ihre Instanz neu startet oder wenn Sie Codeänderungen pushen.

Beim Bereitstellen einer neuen Version Ihrer App erhält die alte Version im Voraus ein Beendigungs-Signal. Dies gibt ihr Zeit, Datenbankverbindungen und andere Dienste ordnungsgemäß zu schließen.

Das Beendigungs-Signal SIGTERM wird gesendet. Sie können dieses Signal in Ihrem Code wie folgt erfassen:

process.on('SIGTERM', () => {
  // Dieses Log erscheint im Stackhero-Dashboard im Tab 'Logs'
  console.info('😯 SIGTERM-Signal empfangen.');

  // Schließen Sie hier offene Datenbankverbindungen oder andere Dienste
  // ...
});

Standardmäßig läuft Node.js auf einem einzigen Kern mit einem Thread. Um alle verfügbaren CPU-Kerne voll auszunutzen, sollten Sie die Node.js cluster API verwenden. Sie können die offizielle Dokumentation hier einsehen: https://nodejs.org/api/cluster.html.

Unten ist ein einfaches Beispiel, das einen HTTP-Server erstellt, der alle verfügbaren CPUs nutzt:

const cluster = require('cluster');
const http = require('http');
const cpusCount = require('os').cpus().length;

if (cluster.isMaster) {
  console.log(`Master ${process.pid} is running`);

  // Fork workers
  for (let i = 0; i < cpusCount; i++) {
    cluster.fork();
  }

  cluster.on('exit', (worker, code, signal) => {
    console.log(`Worker ${worker.process.pid} died`);
  });
} else {
  // Workers teilen jede TCP-Verbindung; in diesem Fall einen HTTP-Server
  http.createServer((req, res) => {
    res.writeHead(200);
    res.end('hello world\n');
  }).listen(8000);

  console.log(`Worker ${process.pid} started`);
}