📚 Ressources & Cheatsheets

Référence rapide pour toutes les plateformes et outils de déploiement.

🐙 GitHub Pages
🌿 Netlify
▲ Vercel
🏠 Hostinger VPS
🌐 DNS & Domaines
⚡ CI/CD Actions
CLI — gh-pages package
CommandeDescription
npm install -D gh-pagesInstaller gh-pages en dev dependency
npx gh-pages -d distDéployer le dossier dist/ sur la branche gh-pages
npx gh-pages -d dist -b mainDéployer sur une branche custom
package.json scripts
"scripts": { "predeploy": "npm run build", "deploy": "gh-pages -d dist" }
predeploy s'exécute automatiquement avant deploy — garantit un build frais.
GitHub Actions — méthode Pages API
name: Deploy GitHub Pages on: push: branches: [main] permissions: contents: read pages: write id-token: write jobs: build: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - uses: actions/setup-node@v4 with: node-version: '20' cache: 'npm' - run: npm ci - run: npm run build - uses: actions/upload-pages-artifact@v3 with: path: dist/ deploy: needs: build runs-on: ubuntu-latest environment: name: github-pages url: ${{ steps.deployment.outputs.page_url }} steps: - uses: actions/deploy-pages@v4 id: deployment
Domaine custom — fichier CNAME
monsite.fr
Créez le fichier CNAME dans public/ (Vite le copie automatiquement dans dist/). Contient uniquement le nom de domaine, sans https://.
Enregistrements DNS pour GitHub Pages
TypeNomValeur
A@185.199.108.153
A@185.199.109.153
A@185.199.110.153
A@185.199.111.153
CNAMEwwwusername.github.io
CLI Netlify
CommandeDescription
npm install -g netlify-cliInstaller la CLI globalement
netlify loginAuthentification OAuth
netlify initLier le dossier à un site Netlify
netlify deploy --dir=distDéploiement preview
netlify deploy --dir=dist --prodDéploiement production
netlify statusInformations du site lié
netlify env:set NOM VALEURAjouter une variable d'environnement
netlify env:listLister les variables
netlify openOuvrir le dashboard dans le navigateur
netlify.toml complet
[build] command = "npm run build" publish = "dist" [[redirects]] from = "/*" to = "/index.html" status = 200 [[headers]] for = "/static/*" [headers.values] Cache-Control = "public, max-age=31536000, immutable" [[headers]] for = "/*" [headers.values] Strict-Transport-Security = "max-age=31536000; includeSubDomains" X-Frame-Options = "DENY" X-Content-Type-Options = "nosniff"
status = 200 (rewrite) est obligatoire pour les SPA. status = 301 ou 302 casserait la navigation client-side.
Netlify Function
// netlify/functions/hello.js exports.handler = async (event, context) => { return { statusCode: 200, headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ message: 'Hello from Netlify!' }) }; };
CLI Vercel
CommandeDescription
npm install -g vercelInstaller la CLI globalement
vercel loginAuthentification
vercelDéploiement preview
vercel --prodDéploiement production
vercel devServeur de développement local
vercel lsLister les déploiements
vercel rollbackRevenir au déploiement précédent
vercel env add NOM productionAjouter une variable production
vercel env pullTélécharger les variables en .env.local
vercel domains add monsite.frAjouter un domaine custom
vercel.json
{ "buildCommand": "npm run build", "outputDirectory": "dist", "framework": "vite", "routes": [ { "src": "/(.*)", "dest": "/index.html" } ], "headers": [ { "source": "/static/(.*)", "headers": [{ "key": "Cache-Control", "value": "public, max-age=31536000, immutable" }] } ] }
Serverless Function Vercel
// api/hello.js export default function handler(req, res) { res.status(200).json({ message: 'Hello from Vercel!' }); }
Chaque fichier dans api/ devient une route : api/hello.js → /api/hello
Enregistrements DNS Vercel
TypeNomValeur
A@76.76.21.21
CNAMEwwwcname.vercel-dns.com
Configuration initiale
CommandeDescription
ssh root@IPConnexion SSH
apt update && apt upgrade -yMise à jour système
curl -fsSL https://deb.nodesource.com/setup_20.x | bash -Installer Node.js 20 via NodeSource
apt install -y nodejsInstaller Node.js
npm install -g pm2Installer PM2
apt install -y nginxInstaller Nginx
apt install -y certbot python3-certbot-nginxInstaller Certbot
PM2
CommandeDescription
pm2 start server.js --name monappDémarrer une application
pm2 listLister les processus
pm2 logs monappAfficher les logs en temps réel
pm2 restart monappRedémarrer
pm2 stop monappArrêter
pm2 delete monappSupprimer de la liste
pm2 saveSauvegarder la liste des processus
pm2 startupConfigurer le démarrage auto au boot
Nginx — configuration SPA + API
server { listen 80; server_name monsite.fr www.monsite.fr; root /var/www/monsite/dist; index index.html; location / { try_files $uri $uri/ /index.html; } location /api/ { proxy_pass http://localhost:3000; 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; } location ~* \.(js|css|png|jpg|svg|ico|woff2)$ { expires 1y; add_header Cache-Control "public, immutable"; } }
Nginx — commandes
CommandeDescription
nginx -tTester la syntaxe de la configuration
systemctl reload nginxRecharger sans couper les connexions
systemctl restart nginxRedémarrer complètement
systemctl status nginxVérifier le statut
ln -s /etc/nginx/sites-available/site /etc/nginx/sites-enabled/Activer un site
Certbot (Let's Encrypt)
CommandeDescription
certbot --nginx -d monsite.fr -d www.monsite.frObtenir et configurer SSL automatiquement
certbot renew --dry-runTester le renouvellement automatique
certbot certificatesLister les certificats installés
Types d'enregistrements DNS
A
Nom → IPv4 (ex: monsite.fr → 76.76.21.21)
AAAA
Nom → IPv6
CNAME
Alias → autre nom (ex: www → monsite.fr)
MX
Serveur mail — avec priorité (10, 20...)
TXT
Texte libre : SPF, DKIM, vérification domaine
NS
Name Server — délègue la gestion DNS
IPs par plateforme
PlateformeTypeValeur
VercelA76.76.21.21
Vercel wwwCNAMEcname.vercel-dns.com
NetlifyA75.2.60.5
Netlify wwwCNAMEmonsite.netlify.app
GitHub Pages (×4)A185.199.108/109/110/111.153
GitHub Pages wwwCNAMEusername.github.io
Commandes de diagnostic DNS
CommandeDescription
nslookup monsite.frRésolution DNS simple
dig monsite.frRésolution détaillée (Linux/Mac)
dig monsite.fr +shortRésolution courte — juste l'IP
dig MX monsite.frEnregistrements mail
dig TXT monsite.frEnregistrements texte
HTTPS & Sécurité
En-têteDescription
Strict-Transport-SecurityHSTS — force HTTPS pour max-age secondes
X-Frame-Options: DENYEmpêche l'iframe (clickjacking)
X-Content-Type-Options: nosniffEmpêche le MIME sniffing
Content-Security-PolicyContrôle les sources de contenu autorisées
TTL recommandé : 300s (5min) lors d'un changement DNS, puis 3600s (1h) ou 86400s (24h) en régime normal.
Anatomie d'un workflow GitHub Actions
name: Pipeline CI/CD # Nom affiché dans l'onglet Actions on: # Déclencheur(s) push: branches: [main] pull_request: branches: [main] jobs: ci: # Nom du job runs-on: ubuntu-latest # Runner steps: - uses: actions/checkout@v4 - uses: actions/setup-node@v4 with: node-version: '20' cache: 'npm' - run: npm ci # Install reproductible - run: npm run lint - run: npm test - run: npm run build deploy: needs: ci # Dépend du job ci if: github.ref == 'refs/heads/main' # Seulement sur main runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - run: npx vercel --prod --token=${{ secrets.VERCEL_TOKEN }}
Conditions utiles
ConditionDescription
if: github.ref == 'refs/heads/main'Seulement sur la branche main
if: github.event_name == 'push'Seulement sur push (pas PR)
if: success()Si le job précédent a réussi (défaut)
if: failure()Si le job précédent a échoué
continue-on-error: trueContinuer même si cette step échoue
Matrix strategy
jobs: test: runs-on: ubuntu-latest strategy: matrix: node: [18, 20, 22] steps: - uses: actions/checkout@v4 - uses: actions/setup-node@v4 with: node-version: ${{ matrix.node }} - run: npm ci && npm test
strategy.matrix crée un job parallèle par combinaison. 3 versions Node = 3 jobs simultanés.
Déploiement VPS via SSH
- name: Deploy via SSH uses: appleboy/ssh-action@master with: host: ${{ secrets.SERVER_IP }} username: ${{ secrets.SERVER_USER }} key: ${{ secrets.SSH_PRIVATE_KEY }} script: | cd /var/www/monsite git pull origin main npm ci --production pm2 restart monsite
Variables d'environnement
SyntaxeDescription
${{ secrets.NOM_DU_SECRET }}Secret configuré dans Settings > Secrets
${{ vars.NOM_VARIABLE }}Variable non-secrète configurée dans Settings > Variables
env:\n NOM: valeurVariable locale à la step ou au job
${{ github.sha }}SHA du commit en cours
${{ github.actor }}Utilisateur qui a déclenché le workflow