Node.js: Premiers pas

Apprenez à déployer un service Node.js sur Stackhero rapidement et en toute sécurité

👋 Bienvenue sur la documentation de Stackhero !

Stackhero propose une solution Node.js cloud prête à l'emploi qui offre de nombreux avantages, notamment :

  • Déployez votre application en quelques secondes avec un simple git push.
  • Utilisez votre propre nom de domaine et bénéficiez de la configuration automatique des certificats HTTPS pour une sécurité renforcée.
  • Profitez de la tranquillité d'esprit avec des sauvegardes automatiques, des mises à jour en un clic, et une tarification simple, transparente et prévisible.
  • Obtenez des performances optimales et une sécurité robuste grâce à une VM privée et dédiée.

Gagnez du temps et simplifiez-vous la vie : il ne faut que 5 minutes pour essayer la solution d'hébergement cloud Node.js de Stackhero !

Déployer un service Node.js sur Stackhero est rapide, efficace et fiable. Ce guide vous accompagne à travers les étapes essentielles pour déployer votre application en quelques secondes tout en garantissant une sécurité et des performances optimales.

Commencez par créer un service Node.js sur Stackhero. Cette étape pose les bases de votre déploiement d'application et vous prépare à explorer tous les avantages de la solution d'hébergement cloud de Stackhero.

Avant de déployer sur Stackhero, assurez-vous d'avoir les outils suivants installés :

  1. Git. Vous pouvez le télécharger depuis https://git-scm.com/downloads.
  2. Pour les utilisateurs Windows, nous suggérons d'utiliser Windows Terminal disponible via le Microsoft Store pour une meilleure expérience.

La seule configuration nécessaire est la mise à jour de votre clé publique SSH. Cette clé permet à Stackhero d'accéder en toute sécurité à votre dépôt de code.

Pour localiser votre clé publique, exécutez l'une de ces commandes :

cat ~/.ssh/id_rsa.pub

ou

cat ~/.ssh/id_ed25519.pub

Si vous n'avez pas encore de paire de clés SSH, vous pouvez en générer une en exécutant ssh-keygen sur Linux ou macOS ou ssh-keygen.exe sur Windows.

Après avoir récupéré votre clé publique, connectez-vous au tableau de bord Stackhero, sélectionnez votre service Node.js, accédez à sa configuration et collez votre clé.

Astuce : Vous pouvez définir votre clé publique SSH globalement afin que tous les futurs services l'incluent automatiquement. Pour ce faire, allez sur le tableau de bord Stackhero, cliquez sur votre photo de profil (située en haut à droite), accédez à 'Votre profil' et collez votre clé publique SSH.

Une application Node.js d'exemple est fournie pour illustrer le processus de déploiement sur Stackhero. Vous pouvez cloner le dépôt avec les commandes suivantes :

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

Déployer votre application via git est rapide, fiable et simple sur Stackhero. Sur la page principale de votre service, vous trouverez une commande pour ajouter un dépôt distant git. Cela pourrait ressembler à ceci :

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

Il suffit de copier et coller la commande dans votre terminal.

Poussez votre code vers Stackhero en utilisant la commande suivante :

git push stackhero main

La première fois que vous poussez, il vous sera demandé d'ajouter l'empreinte de la clé. Tapez "yes" pour continuer.

Après quelques instants, votre application sera en ligne. Vous pouvez vérifier son statut en visitant l'URL du site fournie sur le tableau de bord Stackhero (par exemple, https://XXXXX.stackhero-network.com).

C'est tout. Votre application est maintenant déployée !

Si vous apportez des modifications au fichier app.js, il vous suffit de valider et de pousser vos modifications :

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

Pour les applications existantes, ajoutez le dépôt distant comme décrit précédemment sous Configurer le serveur de dépôt distant. Ensuite, déployez vos modifications avec :

git push stackhero main

Si vous rencontrez l'erreur suivante :

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.

Cette erreur indique que votre dépôt local n'est pas synchronisé avec le dépôt distant. Dans ce cas, vous pouvez forcer le push en exécutant :

git push -f stackhero main

Si vous voyez cette erreur lors de l'exécution de git push stackhero main :

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

Cela indique que la branche main n'existe pas. Vous pouvez essayer de pousser la branche master à la place :

git push stackhero master

Si git répond "Everything up-to-date" mais que vos modifications ne sont pas déployées, cela peut être parce que vous avez oublié de valider vos modifications. Dans ce cas, exécutez :

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

Si aucune modification n'a été apportée mais que vous souhaitez tout de même forcer un déploiement, vous pouvez forcer un commit vide :

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

Si vous souhaitez déployer une branche autre que main, comme production, vous pouvez utiliser la commande suivante :

git push stackhero production:main

Si vous travaillez avec des tags et souhaitez déployer un tag spécifique (par exemple, v1.0), exécutez :

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

Ici, ^{} garantit que le commit associé au tag est poussé.

Si vous devez déployer un commit spécifique, identifiez d'abord le hash du commit en utilisant git log. Puis déployez-le avec :

git push -f stackhero <HASH>:main

Vous pouvez configurer plusieurs services Node.js pour différents environnements, tels que production et staging. Pour renommer le dépôt distant actuel de stackhero à stackhero-staging, exécutez :

git remote rename stackhero stackhero-staging

Ensuite, créez un nouveau service Node.js dans le tableau de bord Stackhero et ajoutez-le comme stackhero-production :

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

Déployez en production ou en staging en utilisant les commandes respectives :

git push stackhero-production main

ou

git push stackhero-staging main

Sur macOS, il se peut que vous soyez invité à entrer le mot de passe de votre clé SSH chaque fois que vous poussez votre code. Pour plus de commodité et de sécurité (sans supprimer le mot de passe de votre clé), vous pouvez l'enregistrer dans le trousseau macOS en exécutant :

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

Cette commande enregistre le mot de passe de votre clé dans le trousseau afin que vous ne soyez plus invité lors des futurs déploiements.

Pour les environnements de staging et de production, gérer les secrets tels que les tokens ou les mots de passe de manière sécurisée est essentiel. Au lieu de stocker ces secrets directement dans votre dépôt, utilisez des variables d'environnement pour une sécurité renforcée.

Vous pouvez ajouter des variables d'environnement via le tableau de bord Stackhero et y accéder dans votre code Node.js. Par exemple, si vous définissez une variable nommée mySecret, vous pouvez y accéder dans votre application comme suit :

process.env.mySecret

Si votre application n'utilise pas HTTP, vous devrez peut-être ouvrir des ports TCP et UDP supplémentaires via le tableau de bord Stackhero. Spécifiez simplement le port d'entrée public, le port de destination sur votre service Node.js et le protocole (TCP ou UDP) pour assurer une connectivité adéquate.

Pour stocker des fichiers tels que des photos d'utilisateurs, il est préférable d'utiliser une solution d'object storage. Cette approche permet le partage de fichiers entre plusieurs services et instances tout en gardant votre code séparé de vos données. Nous recommandons MinIO comme solution simple, rapide et puissante compatible avec le protocole Amazon S3.

Si vous préférez le stockage local, vous pouvez utiliser le stockage persistant disponible avec votre instance Node.js. Ce stockage est situé à /persistent/storage/.

ATTENTION : Ne stockez jamais de données en dehors du dossier /persistent/storage/ !

Les données stockées en dehors de ce dossier peuvent être perdues si votre instance redémarre ou si vous poussez des modifications de code.

Lors du déploiement d'une nouvelle version de votre application, l'ancienne version reçoit un signal de terminaison à l'avance. Cela lui laisse le temps de fermer gracieusement les connexions à la base de données et d'arrêter d'autres services.

Le signal de terminaison SIGTERM est émis. Vous pouvez capturer ce signal dans votre code comme suit :

process.on('SIGTERM', () => {
  // Ce log apparaît sur le tableau de bord Stackhero dans l'onglet 'logs'
  console.info('😯 Signal SIGTERM reçu.');

  // Fermez ici les connexions à la base de données ou d'autres services
  // ...
});

Par défaut, Node.js s'exécute sur un seul cœur en utilisant un seul thread. Pour tirer pleinement parti de tous les cœurs CPU disponibles, envisagez d'utiliser l'API cluster de Node.js. Vous pouvez consulter la documentation officielle ici : https://nodejs.org/api/cluster.html.

Voici un exemple simple qui crée un serveur HTTP utilisant tous les CPUs disponibles :

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 {
  // Les workers partagent toute connexion TCP ; dans ce cas, un serveur HTTP
  http.createServer((req, res) => {
    res.writeHead(200);
    res.end('hello world\n');
  }).listen(8000);

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