Déployer son application NodeJS sur un VPS

Je mets toujours des heures à faire ça, alors j'ai imaginé ce prossus pour ne plus perdre de temps et je pense que cela vous aidera.

Connexion au VPS

Pour vous connecter à votre VPS, utilisez un logiciel de SSH comme Termius (mon préféré) ou PuTTY. Les informations de connexion vous sont fournies par votre hébergeur.

J'utilise un VPS qui tourne sous Ubuntu 22.04 LTS, version que je vous recommande pour éviter les ennuis avec Docker.

Installation de NodeJS

Première chose à faire : installer NodeJS.

sudo apt-get update
sudo apt-get install -y ca-certificates curl gnupg
sudo mkdir -p /etc/apt/keyrings
curl -fsSL https://deb.nodesource.com/gpgkey/nodesource-repo.gpg.key | sudo gpg --dearmor -o /etc/apt/keyrings/nodesource.gpg

NODE_MAJOR=20
echo "deb [signed-by=/etc/apt/keyrings/nodesource.gpg] https://deb.nodesource.com/node_$NODE_MAJOR.x nodistro main" | sudo tee /etc/apt/sources.list.d/nodesource.list

sudo apt-get update
sudo apt-get install nodejs -y

Installation de PNPM

Vous pouvez utiliser npm ou yarn mais je préfère pnpm, c'est plus optimisé.

sudo npm install -g pnpm

Clonage d’un répertoire GitHub

On installe git :

sudo apt install git

Maintenant on va se connecter à Github pour pouvoir cloner notre application.

On génère donc une clé SSH pour Github et on fait entrée pour garder la localisation par défaut.

ssh-keygen -t rsa -b 4096 -C "<votre_email>"

On récupère la clé publique :

cat ~/.ssh/id_rsa.pub

On va sur Github sur ce lien et on ajoute la clé SSH.

Une fois que c'est fait, on peut cloner notre repo privé.

git clone git@github.com:tim-tiret/mon-application.git

C'est coooool !

Pensez à installer vos dépendances avec pnpm install, à build votre application avec pnpm build et à créer votre fichier .env pour les variables d'environnement.

Installation de Docker

Tant qu'on y est, on installe Docker, ce sera utile pour la base de données.

On met à jour les sources :

sudo apt-get update
sudo apt-get install ca-certificates curl
sudo install -m 0755 -d /etc/apt/keyrings
sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
sudo chmod a+r /etc/apt/keyrings/docker.asc

On ajoute le repository à la source :

echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu \
  $(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \
  sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt-get update

On installe Docker :

sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

On teste :

sudo docker run hello-world

Si votre terminal affiche "Hello from Docker !", c'est que Docker est installé et fonctionnel, félicitations !

Installation de MySQL et PhpMyAdmin

Une base de données c'est important mais c'est galère à configurer, du coup voici la méthode que je préfère.

Je crée un dossier db pour mettre mon docker-compose.yml.

mkdir db
nano db/docker-compose.yml

Je met ça dedans :

services:
  db:
    container_name: mysql8
    image: mysql:8.0
    command: --default-authentication-plugin=mysql_native_password
    environment:
      MYSQL_ROOT_PASSWORD: <votre_mot_de_passe>
      MYSQL_DATABASE: mysql
      MYSQL_USER: myuser
      MYSQL_PASSWORD: <votre_mot_de_passe>
    ports:
      - 3306:3306
    restart: always

  phpmya:
    image: phpmyadmin/phpmyadmin:latest
    container_name: phpmyadmin
    environment:
      PMA_ARBITRARY: 1
      PMA_HOST: db
      UPLOAD_LIMIT: 20M
    ports:
      - 8080:80
    depends_on:
      - db
    restart: always

Ce fichier permet de lancer MySQL et PhpMyAdmin facilement et de les redémarrer automatiquement en cas de crash ou de redémarrage du VPS.

On peut lancer les conteneurs avec la commande suivante :

docker compose -f db/docker-compose.yml up -d

Et on peut accéder à PhpMyAdmin à l'url suivante : http://<votre_ip_vps>:8080.

L'identifiant est root et le mot de passe est le mot de passe que vous avez choisi dans le fichier docker-compose.yml.

Configuration de PM2

J'installe PM2 qui est un outil de gestion de processus. Ça permet de lancer proprement une ou plusieurs applications NodeJS en arrière-plan et de redémarrer automatiquement une application qui crash.

npm install -g pm2

Pour configurer PM2, je vous recommande de créer un fichier pm2.config.js, ce sera plus facile à gérer, surtout si vous prévoyez de déployer plusieurs applications sur le même VPS.

nano pm2.config.js

Voci ce que je mets dans le fichier :

module.exports = {
  apps: [
    {
      name: "mon-application",
      script: "pnpm",
      args: "start",
      cwd: "/root/mon-application/",
    },
  ],
};

Vous pouvez mettre autant d'applications que vous voulez dans la liste.

C'est parti, on lance l'application !

pm2 start pm2.config.js

Normalement est est accessible à l'url suivante : http://<votre_ip_vps>:<port_de_votre_application>.

On va simplement faire en sorte que PM2 démarre avec le système avec votre application.

pm2 startup

En on enregistre l'état actuel des applications lancées pour le redémarrage :

pm2 save

Youpi !

Installation et configuration de Caddy

Maintenant pour mettre un certificat SSL et un reverse proxy, on va utiliser Caddy.

sudo apt install -y debian-keyring debian-archive-keyring apt-transport-https curl
curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/gpg.key' | sudo gpg --dearmor -o /usr/share/keyrings/caddy-stable-archive-keyring.gpg
curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/debian.deb.txt' | sudo tee /etc/apt/sources.list.d/caddy-stable.list
sudo apt update
sudo apt install caddy

Une fois installé, on va créer un fichier Caddyfile.

nano Caddyfile

Et on met ça dedans :

<votre_domaine> {
    reverse_proxy localhost:<port_de_votre_application>
}

Exemple pour moi :

timtiret.com {
    reverse_proxy localhost:3000
}

On lance Caddy :

caddy start

Et voilà !

Vous pouvez maintenant accéder à votre application à l'url suivante : https://<votre_domaine>.

Merci pour ta lecture !

Si ça t'a aidé, dis le moi juste en dessous stp.

Déployer son application NodeJS sur un VPS