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 avecpnpm 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.