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]