Licence CC BY-NC

Lancer nodejs au démarrage de debian

Comment lancer nodejs plusieurs fois au démarrage ?

Dernière mise à jour :
Auteur :
Catégories :
Temps de lecture estimé : 5 minutes

En utilisant nodejs pour plusieurs applications serveurs, j’ai vite eu besoin de laisser tourner nodejs en permanence. Je devais donc pouvoir relancer nodejs automatiquement en cas d’arrêt de l’ordinateur.

Comment faire ?

J’ai vite trouvé la solution évidente. Lancer nodejs au démarrage en respectant quelques contraintes :

  • L’application nodejs reste ouverte (en permanence) ;
  • Ouvrir plusieurs applications nodejs en même temps ;
  • L’application n’est pas tous les privilèges (soit lancé en sudo). Pour ne pas compromettre la sécurité et pour prévenir de tout dysfonctionnement problématique.

Pour que l’application tourne en permanence, j’utilise screen1. Screen permet aussi de lancer plusieurs applications nodejs simultanément.

Pour ne pas avoir à lancer l’utilisateur root quand j’utilise le port 80 ou 443, j’utilise la première commande :

iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-port $mon_port

iptables -L -vt nat

La première commande permet d’ajouter une redirection du port externe 80 vers le port local $mon_port. Donc il suffit de remplacer $mon_port par 1080 dans la commande. Et dans votre application vous devez remplacer le port 80 par 1080.

La deuxième commande permet de voir les règles présentes. A chaque redémarrage de votre machine les règles iptables s’effacent. La solution est d’utiliser iptables-save.

Comment ça fonctionne ?

J’ai créé un service (script init.d) qui exécute les fichiers se trouvant dans le dossier /home/utilisateur_g/node/ et qui sont nommés de cette façon : node_xxxxxx.sh (xxxxxx est le nom ou le mot que vous voulez utiliser).


  1. Documentation : debian et ubuntu qui est mieux expliquée.

Script init.d pour le lancement au démarrage

Créer le fichier /etc/init.d/screen.sh et ajouter le contenu ci-dessous. Puis remplacer 5 fois utilisateur_g par votre compte utilisateur. N’utilisez pas l’utilisateur root, c’est inutile et risqué.

Avant d’essayer de lancer pour la première fois votre service, vous devez faire : systemctl daemon-reload. A présent, vous pouvez faire : service screen.sh start.

Vous pouvez interagir avec ce service en utilisateur root avec service screen.sh start et service screen.sh stop.

#! /bin/sh
### BEGIN INIT INFO
# Provides:          screen
# Required-Start:    $local_fs $remote_fs
# Required-Stop:     $local_fs $remote_fs
# Should-Start:      $network
# Should-Stop:       $network
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: Start screen session
# Description:       Enable screen session.
### END INIT INFO

PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin

case "$1" in
    start)
        echo "start"
        cd /home/utilisateur_g/node
        for y in node_*.sh; do
            echo "open: +A_$y"
            su utilisateur_g -c "screen -dmS +A_$y /home/utilisateur_g/node/$y" 
        done
        ;;
    stop)
        echo "stop"
        cd /home/utilisateur_g/node
        for y in node_*.sh; do
            echo "kill: +A_$y"
            su utilisateur_g -c "screen -X -S +A_$y quit"
        done
        ;;
    *)
        echo "Usage: $0 {start|stop}"
        exit 1
        ;;
esac

exit 0

Une fois le fichier créé, vous n’avez plus besoin de modifier ce fichier.

Ajouter une application

Pour chaque application vous devez créer un fichier node_monapplication1.sh dans le dossier /home/utilisateur_g/node/.

#! /bin/sh

cd /home/utilisateur_g/node/monapplication1
node /home/utilisateur_g/node/monapplication1/index.js

Utilisez le chemin complet/absolu. Il est important de laisser le chemin de façon complète comme l’exemple l’indique. La commande cd est indispensable pour le bon déroulement de votre application. Si vous voulez utiliser un autre répertoire de travail utilisez process.chdir plutôt que de modifier la commande.

Répétez cette manip ou supprimez le fichier selon vos besoin.


Voila. :)

8 commentaires

Je plussoie SpaceFox. Screen n’est pas fait pour faire ça (c’est avant tout un multiplexeur de terminal, tout comme tmux). Et tu as pensé à ce qui se passerait si Node.js plante ? Il va rester arrêté ?

Édité par motet-a

+0 -0

Je ne connais pas systemd, je vais me documenter.

Je plussoie SpaceFox. Screen n’est pas fait pour faire ça (c’est avant tout un multiplexeur de terminal, tout comme tmux). Et tu as pensé à ce qui se passerait si Node.js plante ? Il va rester arrêté ?

motet-a

Nodejs a une bonne gestion d’erreur. Et lorsque ça plante "trop fort", on m’a conseillé de ne pas le relancer automatiquement.

Il y a des utilitaires comme pm2 pour lancer plusieurs applications node en parallèle. On peut alors revenir sur l’état et les logs de ces applications n’importe quand.

ShiiFu

Je ne connaissais pas. J’avais essayé des concurrents et je n’ai pas aimé, ils étaient trop limités ou je n’arrivais pas à les faire correspondre à mon usage. À l’occasion j’essayerai.

Édité par A-312

✈️ // 🐺 Ami des loups // 🎮 Coding Game // 🐤 Twitter @A312_zds // :B // L’hiver vient // @**A-312** pour me ping

+0 -0

L’outil pm2 est aussi à prendre en considération.

Nek

Ça fonctionne ? As-tu essayé la solution personnellement dans ce cas de figure ?

A-312

Ça fonctionne super bien, oui :) . Je l’ai utilisé en pro pour faire tourner un petit serveur de WebSockets (à des fins de synchro WebRTC).

+0 -0

En effet, je viens d’essayer pm2 via zmarkdown ça fonctionne très bien. Des explications francophone ici.

Il faudra modifier le passage avec la commande screen ... par pm2.

Je n’ai pas testé mais ceci devrait être bon :

su utilisateur_g -c "pm2 start --name=A_$y -f /home/utilisateur_g/node/$y" 

et :

su utilisateur_g -c "pm2 stop A_$y"

✈️ // 🐺 Ami des loups // 🎮 Coding Game // 🐤 Twitter @A312_zds // :B // L’hiver vient // @**A-312** pour me ping

+0 -0
Vous devez être connecté pour pouvoir poster un message.
Connexion

Pas encore inscrit ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte