Déploiement
Déploiement • Chapitre 13 : Maintenance et dépannage en production

Surveillance de la disponibilité du site et de l'API

Ne découvrez jamais que votre site est en panne par un message furieux d'un client. Mettez en place une surveillance synthétique 24/7 avec sondes mondiales, configurez des alertes instantanées sur Telegram/Slack et offrez de la transparence via une page de statut publique.

💓
Health Check (/health)

Endpoint de santé dédié vérifiant en 50 ms la connexion active à la base de données.

🌍
Sondes Mondiales

Pings HTTP réguliers (toutes les 60s) depuis l'Europe, les USA et l'Asie (BetterStack/UptimeRobot).

🚨
Alertes Instantanées

Notification sur Telegram, Slack ou appel téléphonique dès que 2 sondes échouent d'affilée.

📊
Status Page Publique

Page indépendante (status.learnweb.com) affichant la disponibilité et informant des maintenances.

api-healthcheck-endpoint.ts
// Implémentation robuste d'un endpoint /health dans Express :
import express from 'express';
import { db } from './database';

const router = express.Router();

router.get('/health', async (req, res) => {
  const startTime = Date.now();
  const healthStatus = {
    uptime: process.uptime(),
    timestamp: new Date().toISOString(),
    status: 'UP',
    checks: {
      database: 'UNKNOWN',
      memory: 'OK'
    },
    latencyMs: 0
  };

  try {
    // 1. Tester la réactivité réelle de la base de données
    await db.raw('SELECT 1');
    healthStatus.checks.database = 'UP';

    // 2. Vérifier la consommation mémoire
    const memUsage = process.memoryUsage().heapUsed / 1024 / 1024;
    if (memUsage > 500) { // Plus de 500 Mo consommés
      healthStatus.checks.memory = 'WARNING_HIGH_USAGE';
    }

    healthStatus.latencyMs = Date.now() - startTime;
    return res.status(200).json(healthStatus);
  } catch (error: any) {
    // Si la base ne répond pas : renvoyer un statut HTTP 503 Service Unavailable
    healthStatus.status = 'DOWN';
    healthStatus.checks.database = 'DOWN';
    healthStatus.latencyMs = Date.now() - startTime;
    return res.status(503).json(healthStatus);
  }
});

export default router;

Guide Approfondi & Architecture Système

1. Pourquoi un Endpoint /health Dédié et pas juste / ?

La subtilité technique est majeure :

Si votre sonde externe interroge simplement https://learnweb.com/, elle teste uniquement le serveur web Nginx ou le cache CDN. Même si votre base de données est complètement écroulée, la page d'accueil statique peut renvoyer 200 OK !

L'endpoint /health interroge explicitement les composants critiques (BDD, cache Redis, passerelle de paiement) et renvoie 503 Service Unavailable dès qu'un élément vital flanche.

2. Les Règles pour Éviter les Fausses Alertes (Flapping)

Pour ne pas être réveillé à 4h du matin pour un paquet réseau égaré :
  • Exigez que 2 centres de données différents (ex: Paris et Francfort) constatent la panne avant d'émettre l'alerte.
  • Attendez 2 échecs consécutifs (ex: panne confirmée pendant au moins 2 minutes consécutives).
  • Configurez le renvoi d'une alerte verte de rétablissement (« RECOVERED : API is back up ») dès le retour à la normale.

Tableau Comparatif : Outils de Surveillance et de Monitoring

ServiceIntervalle de Test GratuitCanaux d'AlertePage de Statut Offerte ?
BetterStack (Uptime)Toutes les 3 minutesEmail, SMS, Slack, Telegram, Webhook✅ Oui, personnalisable et responsive
UptimeRobotToutes les 5 minutesEmail, Application mobile, Webhook✅ Oui, sous-domaine dédié
ChecklyToutes les 60 secondesSlack, PagerDuty, SMS✅ Oui, spécialisé sur les scénarios Playwright
Grafana CloudTemps réel continuSlack, Discord, PagerDuty✅ Oui, orienté métriques techniques CPU/RAM