Déployer Express sur un VPS depuis GitHub
1. Se connecter au VPS en SSH
Depuis la machine locale :
Exemple :
2. Générer une clé SSH sur le VPS pour GitHub
Sur le VPS :
Laisser le chemin par défaut :
Puis afficher la clé publique :
Copier la clé affichée.
3. Ajouter la clé SSH dans GitHub
Dans le repo GitHub :
Renseigner :
Laisser Allow write access décoché.
Le VPS a seulement besoin de lire le repo pour faire des git pull.
4. Tester l’accès GitHub depuis le VPS
Sur le VPS :
Si GitHub répond un message du style :
c’est bon.
5. Créer le dossier de l’app sur le VPS
Par exemple :
Puis cloner le projet :
Installer les dépendances :
6. S’assurer que PM2 est disponible
Le plus simple : ajouter pm2 dans le projet.
Ça ajoute pm2 dans le package.json.
Ensuite, lancer l’app avec :
Pour que PM2 relance l’app après un reboot :
La commande va afficher une commande sudo ... à copier/coller.
Puis :
7. Prendre un port libre sur le VPS
Éviter de prendre un port déjà utilisé.
Pour voir les ports déjà occupés :
Exemple : si l’app utilise 3000, vérifier qu’il n’est pas déjà pris.
Dans le .env sur le VPS :
Puis l’app Express doit utiliser ce port :
8. Ajouter les secrets GitHub pour se connecter au VPS
Dans le repo GitHub :
Ajouter :
VPS_HOST=IP_DU_VPS
VPS_USER=deploy
VPS_PORT=22
VPS_SSH_KEY=clé privée SSH permettant à GitHub Actions de se connecter au VPS
La clé VPS_SSH_KEY, c’est une clé privée côté GitHub Actions, pas la clé GitHub du VPS.
Le principe :
Exemple pour générer une clé dédiée depuis la machine locale :
Puis copier la clé publique sur le VPS :
Et mettre le contenu de la clé privée dans GitHub :
9. Créer le workflow GitHub Actions
Créer le fichier :
Avec :
name: CI and Deploy
on:
push:
branches:
- main
jobs:
ci:
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v4
- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: 22
cache: npm
- name: Install dependencies
run: npm ci
- name: Run lint
run: npm run lint --if-present
- name: Run tests
run: npm test
deploy:
runs-on: ubuntu-latest
needs: ci
steps:
- name: Deploy on VPS
uses: appleboy/ssh-action@v1.2.0
with:
host: ${{ secrets.VPS_HOST }}
username: ${{ secrets.VPS_USER }}
key: ${{ secrets.VPS_SSH_KEY }}
port: ${{ secrets.VPS_PORT }}
script: |
cd /var/www/cookieclicker
git fetch origin main
git reset --hard origin/main
npm ci --omit=dev
npx pm2 reload cookieclicker || npx pm2 start npm --name cookieclicker -- start
npx pm2 save
Résumé du flow
push sur main
→ GitHub lance les tests
→ GitHub se connecte au VPS en SSH
→ le VPS récupère le dernier code
→ npm ci --omit=dev
→ PM2 relance l’app
Notes importantes :