Node.js: Aan de slag

Leer hoe u snel en veilig een Node.js-service op Stackhero uitrolt

👋 Welkom bij de documentatie van Stackhero!

Stackhero biedt een kant-en-klare Node.js cloud oplossing die tal van voordelen biedt, waaronder:

  • Implementeer uw applicatie in seconden met een eenvoudige git push.
  • Gebruik uw eigen domeinnaam en profiteer van de automatische configuratie van HTTPS-certificaten voor verbeterde beveiliging.
  • Geniet van gemoedsrust met automatische back-ups, updates met één klik, en eenvoudige, transparante en voorspelbare prijzen.
  • Krijg optimale prestaties en robuuste beveiliging dankzij een privé en dedicated VM.

Bespaar tijd en vereenvoudig uw leven: het kost slechts 5 minuten om de Node.js cloud hosting oplossing van Stackhero te proberen!

Het uitrollen van uw Node.js-service op Stackhero is ontworpen om snel, efficiënt en betrouwbaar te zijn. In deze gids nemen we u stap voor stap mee om uw applicatie binnen enkele minuten operationeel te krijgen, met aandacht voor zowel beveiliging als prestaties.

Laten we beginnen met het aanmaken van een Node.js-service op Stackhero. Dit vormt de basis voor het uitrollen van uw applicatie en geeft u toegang tot alle voordelen van Stackhero's cloud hosting.

Zorg ervoor dat u de volgende tools gereed heeft voordat u begint:

  1. Git: U kunt dit downloaden via https://git-scm.com/downloads.
  2. Windows-gebruikers: Voor een soepelere ervaring raden wij aan om Windows Terminal te gebruiken, beschikbaar in de Microsoft Store.

De belangrijkste configuratiestap is het bijwerken van uw SSH-public key. Met deze sleutel kan Stackhero veilig toegang krijgen tot uw code repository.

Om uw public key te vinden, voert u een van de volgende commando's uit in uw terminal:

cat ~/.ssh/id_rsa.pub

of

cat ~/.ssh/id_ed25519.pub

Als u nog geen SSH-sleutelpaar heeft, kunt u er een genereren met ssh-keygen op Linux of macOS, of ssh-keygen.exe op Windows.

Zodra u uw public key heeft, logt u in op het Stackhero-dashboard, selecteert u uw Node.js-service, gaat u naar het configuratiegedeelte en plakt u uw sleutel in het daarvoor bestemde veld.

Tip: Wilt u dat uw SSH-public key beschikbaar is voor al uw toekomstige services? Stel deze dan globaal in. Ga naar het Stackhero-dashboard, klik op uw profielfoto (rechtsboven), ga naar "Uw profiel" en plak daar uw SSH-public key.

Om u op weg te helpen, bieden wij een voorbeeld Node.js-applicatie die laat zien hoe deployment op Stackhero werkt. U kunt de repository clonen met deze commando's:

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

Het uitrollen van uw applicatie via Git op Stackhero is eenvoudig. Op de hoofdpagina van uw service vindt u een commando om een Git remote toe te voegen, bijvoorbeeld:

git remote add stackhero ssh://stackhero@<XXXXXX>.stackhero-network.com:222/project.git

U kunt dit commando kopiëren en plakken in uw terminal om de remote in te stellen.

Om te deployen, pusht u simpelweg uw code naar Stackhero met:

git push stackhero main

Bij de eerste push wordt u gevraagd om de key fingerprint te bevestigen. Typ "yes" om door te gaan.

Na enkele ogenblikken zou uw applicatie live moeten zijn. U kunt de status controleren door de website-URL te bezoeken die op uw Stackhero-dashboard wordt weergegeven (bijvoorbeeld https://<XXXXXX>.stackhero-network.com).

Dat is alles, uw applicatie is nu uitgerold.

Wilt u wijzigingen aanbrengen? Werk dan uw app.js-bestand bij, commit en push uw aanpassingen:

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

Heeft u al een Node.js-applicatie? Voeg dan de Stackhero remote toe zoals hierboven beschreven en deploy uw code met:

git push stackhero main

Als u deze foutmelding krijgt:

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.

Dit betekent dat uw lokale repository niet gesynchroniseerd is met de remote. U kunt forceren met:

git push -f stackhero main

Als u het volgende ziet bij het pushen:

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

Dit betekent meestal dat de main-branch niet bestaat. Probeer dan de master-branch te pushen:

git push stackhero master

Als Git aangeeft "Everything up-to-date" maar uw wijzigingen niet zijn uitgerold, bent u waarschijnlijk vergeten te committen. Probeer dan:

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

Heeft u geen wijzigingen maar wilt u toch een deployment forceren? Maak dan een lege commit aan:

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

Wilt u een andere branch dan main deployen, bijvoorbeeld production? Gebruik dan:

git push stackhero production:main

Gebruikt u tags en wilt u een specifieke tag deployen (bijvoorbeeld v1.0)? Voer dan uit:

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

De ^{} zorgt ervoor dat de commit die bij de tag hoort wordt gepusht.

Wilt u een specifieke commit deployen? Zoek dan eerst de commit hash op met git log. Deploy vervolgens met:

git push -f stackhero <HASH>:main

Wilt u aparte omgevingen voor productie en staging? Hernoem dan de huidige remote van stackhero naar stackhero-staging met:

git remote rename stackhero stackhero-staging

Maak vervolgens een nieuwe Node.js-service aan in uw Stackhero-dashboard en voeg deze toe als stackhero-production:

git remote add stackhero-production ssh://stackhero@<XXXXXX>.stackhero-network.com:222/project.git

U kunt nu naar elke omgeving deployen met:

git push stackhero-production main

of

git push stackhero-staging main

Op macOS kan het zijn dat u bij elke push om het wachtwoord van uw SSH-sleutel wordt gevraagd. Voor gemak en veiligheid kunt u dit opslaan in de macOS-sleutelhanger met:

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

Met dit commando wordt uw sleutelwachtwoord opgeslagen, zodat u bij toekomstige deployments niet opnieuw wordt gevraagd.

Wanneer u werkt met staging- en productieomgevingen, is het belangrijk om secrets zoals tokens of wachtwoorden veilig te beheren. In plaats van secrets in uw repository op te slaan, gebruikt u bij voorkeur omgevingsvariabelen voor extra veiligheid.

U kunt omgevingsvariabelen toevoegen in het Stackhero-dashboard en deze benaderen in uw Node.js-code. Als u bijvoorbeeld een variabele mySecret definieert, kunt u deze in uw app als volgt gebruiken:

process.env.mySecret

Heeft uw applicatie andere protocollen dan HTTP nodig? Dan kunt u extra TCP- of UDP-poorten openen. Dit regelt u direct in het Stackhero-dashboard door de publieke ingangspoort, de bestemmingspoort op uw Node.js-service en het protocol (TCP of UDP) op te geven.

Voor het opslaan van gebruikersbestanden, zoals foto's, is het aan te raden een object storage-oplossing te gebruiken. Hiermee kunt u bestanden delen tussen meerdere services en instances, en houdt u uw code gescheiden van uw data. Wij bevelen MinIO aan als een snelle, eenvoudige en krachtige oplossing die compatibel is met het Amazon S3-protocol.

Geeft u de voorkeur aan lokale opslag, dan kunt u het persistente opslagvolume van uw Node.js-instance gebruiken. Deze opslag bevindt zich op /persistent/storage/.

LET OP: Sla uw data altijd op in de map /persistent/storage/.

Data buiten deze map kan verloren gaan bij een herstart van uw instance of bij het pushen van codewijzigingen.

Wanneer u een nieuwe versie van uw app uitrolt, krijgt de vorige versie een terminatiesignaal voordat deze wordt afgesloten. Dit geeft uw app de tijd om databaseverbindingen en andere services netjes af te sluiten.

Het terminatiesignaal SIGTERM wordt naar uw app gestuurd. U kunt dit signaal in uw code als volgt afhandelen:

process.on('SIGTERM', () => {
  // Deze log verschijnt op het Stackhero-dashboard onder het tabblad "logs"
  console.info('SIGTERM signal received.');

  // Sluit hier openstaande databaseverbindingen of andere services af
  // ...
});

Standaard gebruikt Node.js één core en één thread. Wilt u alle beschikbare CPU-cores benutten, gebruik dan de Node.js cluster API. De officiële documentatie vindt u hier: https://nodejs.org/api/cluster.html.

Hieronder een eenvoudig voorbeeld dat een HTTP-server op alle beschikbare CPU's start:

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 delen elke TCP-verbinding, in dit geval een HTTP-server
  http.createServer((req, res) => {
    res.writeHead(200);
    res.end('hello world\n');
  }).listen(8000);

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