Aller au contenu principal

Checklist Production

Vérifications essentielles avant de passer en production avec l'API MONCRENEAU.

1. Configuration des Clés API

✅ Clés de Production

  • Les clés API sont stockées dans les variables d'environnement (pas hardcodées)
  • Les clés ne sont PAS commitées dans Git (.env dans .gitignore)
  • Rotation des clés planifiée (tous les 6 mois minimum)
  • Accès aux clés limité aux personnes autorisées
# ❌ MAUVAIS
const apiKey = "mk_abc123..."; // hardcodé dans le code

# ✅ BON
const apiKey = process.env.MONCRENEAU_API_KEY;

✅ Environnements Séparés

  • Configuration développement pour tests locaux
  • Configuration production avec clés séparées
  • Variables d'environnement différentes par environnement

2. Webhooks

✅ Configuration

  • URL webhook en HTTPS (certificat SSL valide)
  • URL webhook accessible publiquement (pas localhost)
  • Secret webhook sécurisé (32+ caractères aléatoires)
  • Vérification de la signature HMAC implémentée
  • Réponse en moins de 5 secondes
  • Traitement asynchrone configuré (queue)

✅ Idempotence

  • Déduplication des événements (tracking par event.id)
  • Gestion des livraisons multiples du même événement
  • Tests de rejeu d'événements
// Exemple de déduplication
const exists = await db.processedEvents.findOne({
eventId: event.id
});
if (exists) return { status: 'already_processed' };

3. Sécurité

✅ HTTPS

  • Toutes les requêtes API en HTTPS
  • Certificat SSL valide et à jour
  • Pas de HTTP en production

✅ Authentification

[object Object]
  • Clé API dans header Authorization: Bearer <key>
  • Pas de clé API dans les URLs (logs visibles)
  • Timeout des requêtes configuré (30s max)

✅ Limitations

  • Rate limiting implémenté côté client (100 requêtes/min)
  • Gestion des erreurs 429 (Too Many Requests)
  • Exponential backoff pour les retry
// Rate limiting avec p-throttle
const pThrottle = require('p-throttle');

const throttle = pThrottle({
limit: 100,
interval: 60000
});

const createAppointment = throttle(async (data) => {
return api.post('/appointments', data);
});

4. Gestion des Erreurs

✅ Codes d'Erreur

  • Gestion des erreurs 4xx (validation, crédits insuffisants)
  • Gestion des erreurs 5xx (retry avec backoff)
  • Logs structurés des erreurs avec contexte
  • Alertes sur erreurs critiques (Slack, PagerDuty)

✅ Retry Logic

  • Retry automatique pour erreurs 5xx et timeouts
  • Exponential backoff (2s, 4s, 8s, 16s)
  • Maximum 3 tentatives
  • Dead letter queue pour échecs définitifs
async function createAppointmentWithRetry(data, maxAttempts = 3) {
for (let attempt = 1; attempt <= maxAttempts; attempt++) {
try {
return await api.post('/appointments', data);
} catch (error) {
if (error.response?.status >= 500 && attempt < maxAttempts) {
await sleep(Math.pow(2, attempt) * 1000);
continue;
}
throw error;
}
}
}

5. Crédits et Paiements

✅ Gestion des Crédits

  • Vérification du solde avant création de rendez-vous
  • Gestion des erreurs INSUFFICIENT_CREDITS
  • Alertes quand crédits < seuil (ex: 10 crédits)
  • Process de recharge automatique ou manuel configuré

✅ Orange Money

  • Webhooks de paiement configurés et testés
  • Gestion des statuts PENDING, SUCCESSFUL, FAILED
  • Timeout de paiement géré (5 minutes)
  • Rechargement automatique des crédits après paiement validé

6. Monitoring et Observabilité

✅ Métriques

  • Nombre de rendez-vous créés/jour
  • Taux de succès/erreur des requêtes API
  • Temps de réponse moyen (< 200ms)
  • Nombre d'événements webhook reçus
  • Solde de crédits restants
// Exemple avec Prometheus
const { Counter, Histogram } = require('prom-client');

const apiRequestsTotal = new Counter({
name: 'moncreneau_api_requests_total',
help: 'Total API requests',
labelNames: ['method', 'status']
});

const apiDuration = new Histogram({
name: 'moncreneau_api_duration_seconds',
help: 'API request duration'
});

✅ Logs

  • Logs structurés (JSON)
  • Niveau de log approprié (INFO en prod, DEBUG en dev)
  • Corrélation des requêtes (request ID)
  • Pas de données sensibles loggées (clés API, tokens)
logger.info('Appointment created', {
requestId: req.id,
appointmentId: appointment.id,
organizationId: org.id,
duration: Date.now() - start
});

✅ Alertes

  • Alertes sur erreurs 5xx (> 5% des requêtes)
  • Alertes sur crédits insuffisants
  • Alertes sur échecs de paiement
  • Alertes sur webhooks non traités (> 1h)

7. Performance

✅ Optimisations

  • Requêtes API en parallèle quand possible
  • Cache des données peu changeantes (départements, services)
  • Pagination pour les listes (max 100 par page)
  • Compression activée (gzip)
// Créer plusieurs rendez-vous en parallèle
const appointments = await Promise.all([
api.post('/appointments', data1),
api.post('/appointments', data2),
api.post('/appointments', data3)
]);

8. Tests

✅ Tests Automatisés

  • Tests unitaires des fonctions critiques
  • Tests d'intégration avec API
  • Tests de charge (100 requêtes/min)
  • Tests des webhooks (ngrok + événements de test)
  • Tests de la gestion d'erreurs

✅ Scénarios Testés

  • Création de rendez-vous
  • Modification de rendez-vous
  • Annulation avec remboursement crédit
  • Crédits insuffisants
  • Webhook reçu et traité
  • Paiement Orange Money de bout en bout

9. Documentation

✅ Documentation Interne

  • Architecture du système documentée
  • Runbook pour incidents (qui contacter, procédures)
  • Gestion des clés API documentée
  • Process de rotation des clés
  • Dashboard de monitoring accessible

10. Backup et Rollback

✅ Plan de Secours

  • Stratégie de rollback définie (< 5 minutes)
  • Backup des données critiques
  • Feature flags pour désactiver fonctionnalités
  • Contact d'urgence MONCRENEAU connu

Vérification Finale

Avant le lancement:

[object Object]

Ressources