Node.js: Erste Schritte
Erfahren Sie, wie Sie einen Node.js-Service 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 Ihres Node.js-Services auf Stackhero ist darauf ausgelegt, schnell, effizient und zuverlässig zu sein. In dieser Anleitung führen wir Sie durch die wichtigsten Schritte, um Ihre Anwendung in wenigen Minuten zum Laufen zu bringen – mit Fokus auf Sicherheit und Performance.
Node.js-Service starten
Beginnen wir damit, einen Node.js-Service auf Stackhero zu erstellen. Dies bildet die Grundlage für Ihre Anwendungsbereitstellung und verschafft Ihnen Zugang zu allen Vorteilen des Stackhero Cloud Hostings.
Voraussetzungen
Bevor Sie starten, stellen Sie sicher, dass Sie folgende Tools bereit haben:
- Git: Sie können es unter https://git-scm.com/downloads herunterladen.
- Windows-Nutzer: Für ein reibungsloseres Arbeiten empfiehlt es sich, das Windows Terminal aus dem Microsoft Store zu verwenden.
Service konfigurieren
Der wichtigste Konfigurationsschritt ist das Aktualisieren Ihres SSH Public Keys. Dieser Schlüssel ermöglicht Stackhero den sicheren Zugriff auf Ihr Code-Repository.
Um Ihren Public Key zu finden, führen Sie einen der folgenden Befehle im Terminal aus:
cat ~/.ssh/id_rsa.pub
oder
cat ~/.ssh/id_ed25519.pub
Falls Sie noch kein SSH-Schlüsselpaar besitzen, können Sie eines mit ssh-keygen unter Linux oder macOS oder mit ssh-keygen.exe unter Windows erzeugen.
Sobald Sie Ihren Public Key haben, melden Sie sich im Stackhero-Dashboard an, wählen Sie Ihren Node.js-Service, gehen Sie in den Konfigurationsbereich und fügen Sie Ihren Schlüssel in das vorgesehene Feld ein.
Tip: Wenn Sie möchten, dass Ihr SSH Public Key für alle zukünftigen Services verfügbar ist, können Sie ihn global hinterlegen. Gehen Sie dazu einfach ins Stackhero-Dashboard, klicken Sie auf Ihr Profilbild (oben rechts), wählen Sie "Ihr Profil" und fügen Sie dort Ihren SSH Public Key ein.
Beispiel klonen
Um Ihnen den Einstieg zu erleichtern, stellen wir eine Beispielanwendung für Node.js bereit, die zeigt, wie das Deployment auf Stackhero funktioniert. Sie können das Repository mit folgenden Befehlen klonen:
git clone https://github.com/stackhero-io/nodejsGettingStarted.git stackhero-nodejs-getting-started
cd stackhero-nodejs-getting-started
Remote-Repository-Server konfigurieren
Das Deployment Ihrer Anwendung via Git auf Stackhero ist unkompliziert. Auf der Hauptseite Ihres Services finden Sie einen Befehl, um ein Git-Remote hinzuzufügen. Dieser sieht beispielsweise so aus:
git remote add stackhero ssh://stackhero@<XXXXXX>.stackhero-network.com:222/project.git
Kopieren Sie diesen Befehl und fügen Sie ihn in Ihr Terminal ein, um das Remote einzurichten.
Ihre Node.js-Anwendung bereitstellen
Um zu deployen, pushen Sie Ihren Code einfach mit:
git push stackhero main
Beim ersten Push werden Sie aufgefordert, den Key-Fingerprint zu bestätigen. Geben Sie einfach "yes" ein, um fortzufahren.
Nach wenigen Augenblicken sollte Ihre Anwendung live sein. Sie können den Status überprüfen, indem Sie die im Stackhero-Dashboard angezeigte Website-URL aufrufen (zum Beispiel https://<XXXXXX>.stackhero-network.com).
Das war's – Ihre Anwendung ist jetzt bereitgestellt.
Wenn Sie Änderungen vornehmen möchten, aktualisieren Sie einfach Ihre app.js, committen und pushen Sie Ihre Änderungen:
git add -A .
git commit -m "Update app.js"
git push stackhero main
Eine bestehende Anwendung bereitstellen
Wenn Sie bereits eine Node.js-Anwendung haben, können Sie das Stackhero-Remote wie oben beschrieben hinzufügen und Ihren Code mit folgendem Befehl deployen:
git push stackhero main
Fehler "failed to push some refs to '[...]'" beheben
Falls Sie diesen 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.
bedeutet das, dass Ihr lokales Repository nicht mit dem Remote synchronisiert ist. Sie können das Pushen erzwingen mit:
git push -f stackhero main
Fehler "src refspec main does not match any" beheben
Wenn Sie beim Pushen Folgendes sehen:
error: src refspec main does not match any
error: failed to push some refs to 'ssh://<XXXXXX>.stackhero-network.com:222/project.git'
bedeutet das in der Regel, dass der Branch main nicht existiert. Versuchen Sie stattdessen, den Branch master zu pushen:
git push stackhero master
Fehler "Everything up-to-date" beim Pushen beheben
Wenn Git meldet "Everything up-to-date", Ihre Änderungen aber nicht bereitgestellt werden, haben Sie vermutlich vergessen, Ihre Änderungen zu committen. Versuchen Sie Folgendes:
git add -A .
git commit -m "Ihr Commit-Text"
git push stackhero main
Falls Sie keine Änderungen vorgenommen haben, aber dennoch ein Deployment auslösen möchten, können Sie einen leeren Commit erzwingen:
git commit --allow-empty -m "Force update"
git push stackhero main
Einen anderen Branch als main deployen
Wenn Sie einen anderen Branch als main deployen möchten, zum Beispiel production, können Sie Folgendes verwenden:
git push stackhero production:main
Einen Tag deployen
Wenn Sie Tags verwenden und einen bestimmten Tag (z. B. v1.0) deployen möchten, führen Sie aus:
git push stackhero 'v1.0^{}:main'
Das ^{} sorgt dafür, dass der Commit, der mit dem Tag verknüpft ist, gepusht wird.
Rollback oder einen bestimmten Commit deployen
Wenn Sie einen bestimmten Commit deployen möchten, ermitteln Sie zunächst den Commit-Hash mit git log. Anschließend deployen Sie ihn mit:
git push -f stackhero <HASH>:main
In mehrere Umgebungen deployen
Sie möchten vielleicht separate Umgebungen für Produktion und Staging. Um das aktuelle Remote von stackhero in stackhero-staging umzubenennen, führen Sie aus:
git remote rename stackhero stackhero-staging
Erstellen Sie anschließend im Stackhero-Dashboard einen neuen Node.js-Service und fügen Sie ihn als stackhero-production hinzu:
git remote add stackhero-production ssh://stackhero@<XXXXXX>.stackhero-network.com:222/project.git
Sie können dann in die jeweilige Umgebung deployen mit:
git push stackhero-production main
oder
git push stackhero-staging main
SSH Private Key Passwort im macOS-Schlüsselbund speichern
Unter macOS kann es sein, dass Sie bei jedem Push nach dem Passwort Ihres SSH-Keys gefragt werden. Für mehr Komfort und Sicherheit können Sie das Passwort im macOS-Schlüsselbund speichern, indem Sie Folgendes ausführen:
/usr/bin/ssh-add --apple-use-keychain ~/.ssh/id_rsa
Mit diesem Befehl wird das Passwort gespeichert, sodass Sie bei zukünftigen Deployments nicht erneut gefragt werden.
Secrets verwalten
Wenn Sie mit Staging- und Produktionsumgebungen arbeiten, ist es wichtig, Secrets wie Tokens oder Passwörter sicher zu verwalten. Anstatt Secrets im Repository zu speichern, nutzen Sie besser Umgebungsvariablen für zusätzliche Sicherheit.
Sie können Umgebungsvariablen im Stackhero-Dashboard hinzufügen und in Ihrem Node.js-Code darauf zugreifen. Wenn Sie beispielsweise eine Variable namens mySecret definieren, greifen Sie in Ihrer App so darauf zu:
process.env.mySecret
Weitere Netzwerkports öffnen
Falls Ihre Anwendung andere Protokolle als HTTP benötigt, können Sie zusätzliche TCP- oder UDP-Ports öffnen. Dies können Sie direkt im Stackhero-Dashboard tun, indem Sie den öffentlichen Eingangsport, den Zielport auf Ihrem Node.js-Service und das Protokoll (TCP oder UDP) angeben.
Dateien speichern
Für das Speichern von Benutzerdaten wie Fotos empfiehlt sich eine Object Storage-Lösung. Damit können Sie Dateien zwischen mehreren Services und Instanzen teilen und Ihren Code von den Daten trennen. Wir empfehlen MinIO als schnelle, einfache und leistungsfähige Lösung, die mit dem Amazon S3-Protokoll kompatibel ist.
Wenn Sie lokalen Speicher bevorzugen, können Sie den persistenten Speicher Ihrer Node.js-Instanz nutzen. Dieser befindet sich unter /persistent/storage/.
ACHTUNG: Speichern Sie Ihre Daten immer im Ordner
/persistent/storage/.Daten außerhalb dieses Ordners können verloren gehen, wenn Ihre Instanz neu startet oder Sie Codeänderungen pushen.
Graceful Shutdown
Wenn Sie eine neue Version Ihrer App deployen, erhält die vorherige Version vor dem Herunterfahren ein Terminationssignal. So hat Ihre Anwendung Zeit, Datenbankverbindungen und andere Dienste sauber zu schließen.
Das Terminationssignal SIGTERM wird an Ihre App gesendet. Sie können dieses Signal in Ihrem Code wie folgt behandeln:
process.on('SIGTERM', () => {
// Dieses Log erscheint im Stackhero-Dashboard im Tab "logs"
console.info('SIGTERM signal received.');
// Schließen Sie hier offene Datenbankverbindungen oder andere Services
// ...
});
Ihren Code auf mehreren CPU-Kernen ausführen
Standardmäßig nutzt Node.js nur einen Kern und einen Thread. Um alle verfügbaren CPU-Kerne zu nutzen, empfiehlt sich die Node.js-cluster-API. Die offizielle Dokumentation finden Sie hier: https://nodejs.org/api/cluster.html.
Hier ein einfaches Beispiel, das einen HTTP-Server mit allen verfügbaren CPUs erstellt:
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 {
// Worker teilen sich jede TCP-Verbindung, hier einen HTTP-Server
http.createServer((req, res) => {
res.writeHead(200);
res.end('hello world\n');
}).listen(8000);
console.log(`Worker ${process.pid} started`);
}