Automatiser le Déploiement sur un VPS en 2026 : Guide Complet

Meta Description: Apprenez à automatiser vos déploiements sur VPS avec Docker, GitHub Actions et Nginx. De la configuration manuelle au CI/CD professionnel en quelques heures. Mots-clés: automatiser déploiement VPS, CI/CD VPS, Docker VPS, GitHub Actions déploiement, nginx reverse proxy, deploy automatique serveur

Vous avez un VPS. Vous déployez en SSH avec git pull && npm restart. Ça marche... jusqu'au jour où ça casse en production un vendredi soir. Ce guide vous emmène du déploiement artisanal au pipeline CI/CD professionnel — sans outil payant.

Pourquoi automatiser vos déploiements ?

Le coût du déploiement manuel

Chaque déploiement manuel :

Ce qu'apporte l'automatisation

Prérequis

> Besoin d'un VPS ? Un VPS à 5-10€/mois suffit largement pour commencer. Hetzner, OVH, ou DigitalOcean sont d'excellents choix.

Étape 1 : Préparer le VPS

Sécurisation de base

# Mettre à jour le système

sudo apt update && sudo apt upgrade -y

Créer un utilisateur dédié (pas root)

sudo adduser deploy

sudo usermod -aG sudo deploy

Configurer SSH (clé uniquement, pas de mot de passe)

sudo nano /etc/ssh/sshd_config

PasswordAuthentication no

PermitRootLogin no

sudo systemctl restart sshd

Firewall

sudo ufw allow 22

sudo ufw allow 80

sudo ufw allow 443

sudo ufw enable

Installer les outils essentiels

# Docker + Docker Compose

curl -fsSL https://get.docker.com | sh

sudo usermod -aG docker deploy

Nginx (reverse proxy)

sudo apt install nginx -y

Certbot (SSL gratuit)

sudo apt install certbot python3-certbot-nginx -y

Node.js (si nécessaire)

curl -fsSL https://deb.nodesource.com/setup_22.x | sudo -E bash -

sudo apt install nodejs -y

Étape 2 : Dockeriser votre application

Pourquoi Docker ?

Dockerfile pour une app Node.js

# Dockerfile

FROM node:22-alpine AS builder

WORKDIR /app

COPY package*.json ./

RUN npm ci --only=production

FROM node:22-alpine

WORKDIR /app

COPY --from=builder /app/node_modules ./node_modules

COPY . .

ENV NODE_ENV=production

EXPOSE 3000

USER node

CMD ["node", "src/index.js"]

Dockerfile pour une app Python

FROM python:3.12-slim

WORKDIR /app

COPY requirements.txt .

RUN pip install --no-cache-dir -r requirements.txt

COPY . .

ENV PYTHONUNBUFFERED=1

EXPOSE 8000

CMD ["gunicorn", "app:app", "--bind", "0.0.0.0:8000", "--workers", "4"]

Docker Compose pour orchestrer

# docker-compose.yml

version: "3.8"

services:

app:

build: .

restart: unless-stopped

ports:

- "3000:3000"

env_file:

- .env

healthcheck:

test: ["CMD", "curl", "-f", "http://localhost:3000/health"]

interval: 30s

timeout: 5s

retries: 3

db:

image: postgres:16-alpine

restart: unless-stopped

volumes:

- pgdata:/var/lib/postgresql/data

environment:

POSTGRES_DB: ${DB_NAME}

POSTGRES_USER: ${DB_USER}

POSTGRES_PASSWORD: ${DB_PASS}

volumes:

pgdata:

Étape 3 : Configurer Nginx comme reverse proxy

# /etc/nginx/sites-available/monapp.com

server {

listen 80;

server_name monapp.com www.monapp.com;

location / {

proxy_pass http://localhost:3000;

proxy_http_version 1.1;

proxy_set_header Upgrade $http_upgrade;

proxy_set_header Connection 'upgrade';

proxy_set_header Host $host;

proxy_set_header X-Real-IP $remote_addr;

proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

proxy_set_header X-Forwarded-Proto $scheme;

proxy_cache_bypass $http_upgrade;

}

}

# Activer le site

sudo ln -s /etc/nginx/sites-available/monapp.com /etc/nginx/sites-enabled/

sudo nginx -t

sudo systemctl reload nginx

SSL automatique

sudo certbot --nginx -d monapp.com -d www.monapp.com

Étape 4 : Pipeline CI/CD avec GitHub Actions

Le workflow complet

# .github/workflows/deploy.yml

name: Deploy to VPS

on:

push:

branches: [main]

jobs:

test:

runs-on: ubuntu-latest

steps:

- uses: actions/checkout@v4

- uses: actions/setup-node@v4

with:

node-version: 22

- run: npm ci

- run: npm test

- run: npm run lint

deploy:

needs: test

runs-on: ubuntu-latest

if: github.ref == 'refs/heads/main'

steps:

- uses: actions/checkout@v4

- name: Deploy to VPS via SSH

uses: appleboy/ssh-action@v1

with:

host: ${{ secrets.VPS_HOST }}

username: ${{ secrets.VPS_USER }}

key: ${{ secrets.VPS_SSH_KEY }}

script: |

cd /opt/monapp

git pull origin main

docker compose build --no-cache

docker compose up -d

docker system prune -f

Configurer les secrets GitHub

  • Aller dans le repo → Settings → Secrets and variables → Actions
  • Ajouter :
  • - VPS_HOST : l'IP de votre VPS

    - VPS_USER : deploy

    - VPS_SSH_KEY : la clé privée SSH

    Déploiement zero-downtime

    # Script de déploiement amélioré
    

    script: |

    cd /opt/monapp

    git pull origin main

    # Build la nouvelle image

    docker compose build

    # Démarrer le nouveau conteneur avant d'arrêter l'ancien

    docker compose up -d --no-deps --build app

    # Attendre que le healthcheck passe

    sleep 10

    # Vérifier que l'app répond

    curl -f http://localhost:3000/health || {

    echo "Deploy failed! Rolling back..."

    docker compose up -d --force-recreate app

    exit 1

    }

    # Nettoyer les anciennes images

    docker system prune -f

    Étape 5 : Monitoring et alertes

    Healthcheck simple

    // src/health.js
    

    app.get('/health', (req, res) => {

    res.json({

    status: 'ok',

    uptime: process.uptime(),

    timestamp: new Date().toISOString()

    });

    });

    Script de monitoring basique

    #!/bin/bash
    

    /opt/scripts/monitor.sh

    URL="https://monapp.com/health"

    RESPONSE=$(curl -s -o /dev/null -w "%{http_code}" $URL)

    if [ "$RESPONSE" != "200" ]; then

    echo "$(date) - ALERT: $URL returned $RESPONSE" >> /var/log/monitor.log

    # Envoyer une notification (webhook Discord, email, etc.)

    curl -X POST -H "Content-Type: application/json" \

    -d '{"content":"⚠️ monapp.com is DOWN! Status: '$RESPONSE'"}' \

    $DISCORD_WEBHOOK_URL

    fi

    # Cron job : vérifier toutes les 5 minutes
    

    crontab -e

    /5 * /opt/scripts/monitor.sh

    Alternatives et outils complémentaires

    Coolify — le PaaS self-hosted

    Si vous voulez une expérience type Vercel/Heroku mais sur votre VPS :

    curl -fsSL https://cdn.coolify.io/install.sh | bash

    Coolify gère automatiquement : Docker, SSL, déploiements, backups, monitoring.

    Kamal — déploiement Ruby/Rails (mais pas que)

    gem install kamal
    

    kamal init

    kamal deploy

    Webhook simple pour auto-deploy

    # Installer webhook
    

    sudo apt install webhook

    Configuration

    cat > /etc/webhook.conf << 'EOF'

    [

    {

    "id": "deploy",

    "execute-command": "/opt/scripts/deploy.sh",

    "command-working-directory": "/opt/monapp",

    "trigger-rule": {

    "match": {

    "type": "payload-hmac-sha256",

    "secret": "votre-secret",

    "parameter": {

    "source": "header",

    "name": "X-Hub-Signature-256"

    }

    }

    }

    }

    ]

    EOF

    Checklist de déploiement production

    Sécurité

    Performance

    Fiabilité

    FAQ

    Combien coûte cette stack ?

    Quasiment rien : VPS 5-10€/mois + domaine 10€/an. Tout le reste est gratuit (Docker, GitHub Actions, Let's Encrypt, Nginx).

    GitHub Actions gratuit, c'est suffisant ?

    Oui. Le plan gratuit offre 2 000 minutes/mois de CI/CD. Pour un petit projet, c'est largement suffisant. Un déploiement typique prend 2-5 minutes.

    Docker est-il obligatoire ?

    Non, mais fortement recommandé. Sans Docker, vous pouvez utiliser PM2 (Node.js), systemd, ou un simple script bash. Docker apporte la reproductibilité et le rollback facile.

    Comment gérer les migrations de base de données ?

    Exécutez les migrations avant de redémarrer l'application :

    docker compose exec app npx prisma migrate deploy
    

    docker compose restart app

    Et pour les fichiers uploadés par les utilisateurs ?

    Utilisez un volume Docker monté ou un service S3-compatible (MinIO self-hosted, Cloudflare R2). Ne stockez jamais les uploads dans le conteneur.


    Conclusion

    Automatiser vos déploiements n'est pas un luxe — c'est une nécessité professionnelle. Avec Docker, GitHub Actions et Nginx, vous avez une stack gratuite, fiable et éprouvée qui scale de 1 à 100 000 utilisateurs.

    Vous débutez en DevOps et infrastructure ? NetRevision propose une formation complète gratuite couvrant les réseaux, l'administration système et le DevOps. Le complément idéal pour maîtriser l'infrastructure derrière vos déploiements.

    Nos templates DevOps incluent des configurations Docker, CI/CD et monitoring prêtes à l'emploi pour accélérer vos projets.


    Publié sur templates.quernel-cloud.com — Templates et formations pour développeurs et ingénieurs réseau.