Skip to content

Déployer Express sur un VPS depuis GitHub

1. Se connecter au VPS en SSH

Depuis la machine locale :

ssh user@IP_DU_VPS

Exemple :

ssh deploy@123.123.123.123

2. Générer une clé SSH sur le VPS pour GitHub

Sur le VPS :

ssh-keygen -t ed25519 -C "deploy@vps"

Laisser le chemin par défaut :

/home/deploy/.ssh/id_ed25519

Puis afficher la clé publique :

cat ~/.ssh/id_ed25519.pub

Copier la clé affichée.


3. Ajouter la clé SSH dans GitHub

Dans le repo GitHub :

Settings → Deploy keys → Add deploy key

Renseigner :

Title: VPS deploy key
Key: la clé publique copiée

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 :

ssh -T git@github.com

Si GitHub répond un message du style :

Hi username! You've successfully authenticated...

c’est bon.


5. Créer le dossier de l’app sur le VPS

Par exemple :

sudo mkdir -p /var/www
sudo chown -R $USER:$USER /var/www
cd /var/www

Puis cloner le projet :

git clone git@github.com:TON_USER/TON_REPO.git cookieclicker
cd cookieclicker

Installer les dépendances :

npm ci --omit=dev

6. S’assurer que PM2 est disponible

Le plus simple : ajouter pm2 dans le projet.

npm install pm2

Ça ajoute pm2 dans le package.json.

Ensuite, lancer l’app avec :

npx pm2 start npm --name cookieclicker -- start
npx pm2 save

Pour que PM2 relance l’app après un reboot :

npx pm2 startup

La commande va afficher une commande sudo ... à copier/coller.

Puis :

npx pm2 save

7. Prendre un port libre sur le VPS

Éviter de prendre un port déjà utilisé.

Pour voir les ports déjà occupés :

sudo ss -tulpn

Exemple : si l’app utilise 3000, vérifier qu’il n’est pas déjà pris.

Dans le .env sur le VPS :

PORT=3000
NODE_ENV=production

Puis l’app Express doit utiliser ce port :

const port = process.env.PORT || 3000;

8. Ajouter les secrets GitHub pour se connecter au VPS

Dans le repo GitHub :

Settings → Secrets and variables → Actions → New repository secret

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 :

clé privée → dans VPS_SSH_KEY
clé publique → dans /home/deploy/.ssh/authorized_keys sur le VPS

Exemple pour générer une clé dédiée depuis la machine locale :

ssh-keygen -t ed25519 -C "github-actions@deploy" -f ./github-actions-deploy

Puis copier la clé publique sur le VPS :

ssh-copy-id -i ./github-actions-deploy.pub deploy@IP_DU_VPS

Et mettre le contenu de la clé privée dans GitHub :

cat ./github-actions-deploy

9. Créer le workflow GitHub Actions

Créer le fichier :

.github/workflows/deploy.yml

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 :

NB: PM2 doit être disponible dans le projet ou installé sur le VPS.
NB2: L’app doit utiliser un port libre pour éviter les conflits.
NB3: Le VPS doit pouvoir pull le repo GitHub avec sa deploy key.
NB4: GitHub Actions doit pouvoir se connecter au VPS avec les secrets SSH.