Documentation Technique Ops
Référence technique pour l'équipe Operations
INTRODUCTION
1.1Objectif du Document
Ce document constitue la référence technique pour l'équipe Ops de REWAPP. Il centralise toutes les informations nécessaires à l'exploitation quotidienne de la plateforme : configurations, commandes, procédures et guides de troubleshooting.
1.2Public Cible
- Ingénieurs Ops et SRE
- Administrateurs système
- Équipe d'astreinte
- DevOps Engineers
1.3Prérequis
Pour utiliser ce document, les opérateurs doivent disposer de :
- Accès au dashboard CapRover avec credentials appropriés
- CapRover CLI configuré avec le serveur rewapp
- Accès VPN pour staging et production
- Client SSH configuré avec clé RSA
- Docker et Docker Compose installés
1.4Conventions
Conventions utilisées
| Notation | Signification |
|---|---|
[ENV] | À remplacer par dev, staging ou prod |
[SERVICE] | Nom du microservice (auth, user, merchant, transaction, points, banking, notification) |
| ⚠️ | Action critique nécessitant validation |
| ✅ | Action validée ou attendue |
| ❌ | Action interdite ou erreur |
INFRASTRUCTURE ET ARCHITECTURE
2.1Vue d'Ensemble
INFRASTRUCTURE CAPROVER
L'infrastructure REWAPP est déployée sur CapRover (France) avec architecture microservices conteneurisée sur Docker.
Services CapRover / Docker
| Composant | Service | Configuration |
|---|---|---|
| Containers | Docker / CapRover | Scaling manuel 2-10 instances |
| Base de données | PostgreSQL 15 | Conteneur Docker |
| Cache | Redis 7 | Conteneur Docker |
| Stockage | MinIO | Compatible S3, Versioning activé |
| Reverse Proxy | Traefik (intégré CapRover) | HTTPS, compression gzip |
| Load Balancer | Traefik | Health checks, SSL termination |
| DNS | DNS Provider externe | Failover routing |
| Secrets | Variables env CapRover | Gestion via dashboard |
| Logs | CapRover Logs / Loki | Rétention 30 jours |
2.2Architecture Réseau (VPC)
Subnets VPC
| Subnet | CIDR | Zone | Rôle |
|---|---|---|---|
| Public A | 10.0.1.0/24 | Serveur principal | Traefik, Docker Network |
| Public B | 10.0.2.0/24 | Serveur backup | Traefik (failover) |
| Privé App A | 10.0.10.0/24 | Docker Network | Services Docker |
| Privé App B | 10.0.11.0/24 | Docker Network | Services Docker |
| Privé Data A | 10.0.20.0/24 | Docker Network | PostgreSQL, Redis |
| Privé Data B | 10.0.21.0/24 | Docker Network | PostgreSQL, Redis |
2.3Security Groups
Règles Security Groups
| Nom | Port | Source | Description |
|---|---|---|---|
rewapp-alb-sg | 443 | 0.0.0.0/0 | HTTPS public |
rewapp-app-sg | 3000 | rewapp-alb-sg | Trafic depuis ALB |
rewapp-db-sg | 5432 | rewapp-app-sg | PostgreSQL |
rewapp-redis-sg | 6379 | rewapp-app-sg | Redis |
rewapp-bastion-sg | 22 | IP VPN | SSH accès restreint |
2.4Environnements
URLs par environnement
| Environnement | URL API | URL Admin | URL Partenaire |
|---|---|---|---|
| DEV | dev.api.rewapp.fr |
dev.admin.rewapp.fr |
dev.partner.rewapp.fr |
| STAGING | staging.api.rewapp.fr |
staging.admin.rewapp.fr |
staging.partner.rewapp.fr |
| PROD | api.rewapp.fr |
admin.rewapp.fr |
partner.rewapp.fr |
CONFIGURATION DES SERVICES
3.1Microservices Backend
Services et Ports
| Service | Port | Container Docker | Health Check |
|---|---|---|---|
auth-service | 3001 | rewapp-[ENV]-auth | /health |
user-service | 3002 | rewapp-[ENV]-user | /health |
merchant-service | 3003 | rewapp-[ENV]-merchant | /health |
transaction-service | 3004 | rewapp-[ENV]-transaction | /health |
points-service | 3005 | rewapp-[ENV]-points | /health |
banking-service | 3006 | rewapp-[ENV]-banking | /health |
notification-service | 3007 | rewapp-[ENV]-notification | /health |
api-gateway | 3000 | rewapp-[ENV]-gateway | /health |
3.2Configuration PostgreSQL (Docker Container)
Configuration par environnement
| Paramètre | DEV | STAGING | PRODUCTION |
|---|---|---|---|
| Instance | db.t3.micro | db.t3.small | db.t3.medium |
| Storage | 20 GB | 50 GB | 100 GB |
| Multi-AZ | Non | Non | Oui |
| Backup Retention | 7 jours | 14 jours | 30 jours |
| Maintenance Window | dim. 03:00-04:00 | ||
Paramètres PostgreSQL optimisés
max_connections = 200
shared_buffers = 256MB
work_mem = 16MB
maintenance_work_mem = 128MB
effective_cache_size = 768MB
log_min_duration_statement = 1000 # log requêtes > 1s
3.3Configuration Redis (Docker)
Configuration Redis
| Paramètre | DEV | STAGING | PRODUCTION |
|---|---|---|---|
| Node Type | cache.t3.micro | cache.t3.micro | cache.t3.small |
| Nodes | 1 | 1 | 3 (cluster) |
| Maxmemory Policy | volatile-lru | ||
Clés Redis principales
| Pattern | Usage | TTL |
|---|---|---|
session:{userId} | Sessions utilisateur | 24h |
cache:api:{endpoint}:{params} | Cache API | Variable |
qr:{code} | QR codes temporaires | 60s |
locked:{userId}:{qrCode} | Points bloqués | 60s |
rate:{ip} ou rate:{userId} | Rate limiting | 60s |
3.4Configuration S3
Buckets S3
| Bucket | Usage | Lifecycle | Réplication |
|---|---|---|---|
rewapp-[ENV]-assets | Images, logos partenaires | Glacier après 90j | Non |
rewapp-[ENV]-documents | Documents KYC | Glacier après 30j | Non |
rewapp-[ENV]-logs | Logs applicatifs | Suppression après 365j | Non |
rewapp-prod-backup | Backups PostgreSQL | Glacier Deep Archive après 90j | Cross-region |
3.5Variables d'Environnement
SECRETS
Les secrets sont stockés dans les variables d'environnement CapRover et injectés dans les containers Docker.
Variables d'environnement
| Variable | Description | Source |
|---|---|---|
DATABASE_URL | URL connexion PostgreSQL | Secrets Manager |
REDIS_URL | URL connexion Redis | Secrets Manager |
JWT_SECRET | Clé signature JWT (RS256) | Secrets Manager |
BANKING_API_KEY | Clé API Budget Insight | Secrets Manager |
SENDGRID_API_KEY | Clé API SendGrid | Secrets Manager |
FCM_SERVER_KEY | Clé serveur Firebase | Secrets Manager |
SENTRY_DSN | DSN Sentry error tracking | Parameter Store |
LOG_LEVEL | Niveau de log | Parameter Store |
ACCÈS ET AUTHENTIFICATION
4.1Accès Dashboard CapRover
Les accès sont gérés via le dashboard CapRover avec authentification sécurisée.
Rôles Utilisateurs
| Rôle | Accès | Permissions |
|---|---|---|
Ops-Admin | Tous environnements | Accès complet (déploiement, config) |
Ops-ReadOnly | Tous environnements | Lecture seule |
Dev-Staging | Dev + Staging | Accès complet |
Support | Production | Lecture logs et métriques uniquement |
Connexion CapRover
-
1
Accéder au dashboard CapRover
Ouvrir
https://captain.rewapp.fr -
2
S'authentifier
Utiliser le mot de passe CapRover
-
3
Sélectionner l'application
Choisir l'application et l'environnement approprié
4.2Accès SSH (Bastion Host)
L'accès SSH aux instances se fait via un bastion host accessible uniquement depuis le VPN.
Host rewapp-bastion-prod
HostName bastion.rewapp.fr
User ec2-user
IdentityFile ~/.ssh/rewapp-prod.pem
Port 22
Host rewapp-*-prod
ProxyJump rewapp-bastion-prod
User ec2-user
IdentityFile ~/.ssh/rewapp-prod.pem
Commandes de connexion
# Connexion au bastion
ssh rewapp-bastion-prod
# Connexion à une instance via bastion
ssh rewapp-app-prod
4.3Accès VPN
OBLIGATOIRE
Le VPN est obligatoire pour accéder aux environnements staging et production.
| Fournisseur | Serveur | Port | Protocole |
|---|---|---|---|
| OpenVPN | vpn.rewapp.fr | 1194 | UDP |
4.4Gestion des Clés et Secrets
Rotation des secrets (Variables CapRover) :
- Secrets critiques (JWT, API keys) : rotation tous les 90 jours
- Credentials base de données : rotation tous les 30 jours
- Notification automatique 7 jours avant expiration
# Rotation manuelle d'un secret via Dashboard CapRover
# Apps > [APP_NAME] > App Configs > Environmental Variables
# Modifier la variable concernée puis Save & Update
COMMANDES OPÉRATIONNELLES
5.1CapRover CLI - Configuration Préalable
# Installation de CapRover CLI
npm install -g caprover
# Configuration du serveur
caprover serversetup
# Login au serveur CapRover
caprover login
# Vérification de la connexion
caprover api --path "/user/system/info" --method GET
5.2Gestion des Services Docker / CapRover
# Lister les applications CapRover
caprover api --path "/user/apps" --method GET
# Voir l'état d'une application
docker ps --filter "name=srv-captain--[APP_NAME]"
# Forcer le redéploiement d'une application
caprover api --appName [APP_NAME] --method restartApp
# Modifier le nombre d'instances (scaling manuel)
# Via Dashboard CapRover : Apps > [APP_NAME] > App Configs > Instance Count
# Voir les logs d'un container
docker logs srv-captain--[APP_NAME] --tail 100 -f
# Voir les logs via CapRover dashboard
# Dashboard > Apps > [APP_NAME] > App Logs
5.3Gestion PostgreSQL (Docker Container)
# Connexion à la base de données via Docker
docker exec -it srv-captain--postgres psql -U rewapp_admin -d rewapp_prod
# Vérifier l'état du container PostgreSQL
docker ps --filter "name=srv-captain--postgres"
# Créer un backup manuel
docker exec srv-captain--postgres pg_dump -U rewapp rewapp_prod > backup_$(date +%Y%m%d).sql
# Lister les backups
ls -la /captain/data/backups/
# Redémarrer PostgreSQL (⚠️ downtime)
docker restart srv-captain--postgres
Requêtes SQL utiles
-- Vérifier les connexions actives
SELECT pid, usename, application_name, client_addr, state, query_start, query
FROM pg_stat_activity
WHERE state = 'active';
-- Voir les requêtes lentes (> 5s)
SELECT pid, now() - pg_stat_activity.query_start AS duration, query
FROM pg_stat_activity
WHERE (now() - pg_stat_activity.query_start) > interval '5 seconds';
-- Tuer une requête bloquante
SELECT pg_terminate_backend(pid);
-- Vérifier la taille des tables
SELECT relname AS table_name,
pg_size_pretty(pg_total_relation_size(relid)) AS total_size
FROM pg_catalog.pg_statio_user_tables
ORDER BY pg_total_relation_size(relid) DESC
LIMIT 10;
-- Vérifier les locks
SELECT blocked_locks.pid AS blocked_pid,
blocked_activity.usename AS blocked_user,
blocking_locks.pid AS blocking_pid,
blocking_activity.usename AS blocking_user,
blocked_activity.query AS blocked_statement
FROM pg_catalog.pg_locks blocked_locks
JOIN pg_catalog.pg_stat_activity blocked_activity
ON blocked_activity.pid = blocked_locks.pid
JOIN pg_catalog.pg_locks blocking_locks
ON blocking_locks.locktype = blocked_locks.locktype
JOIN pg_catalog.pg_stat_activity blocking_activity
ON blocking_activity.pid = blocking_locks.pid
WHERE NOT blocked_locks.granted;
5.4Gestion Redis (Docker)
# Connexion Redis via Docker
docker exec -it srv-captain--redis redis-cli
# Vérifier l'état du container Redis
docker stats srv-captain--redis
Commandes Redis utiles
# Vérifier la connexion
PING
# Voir les statistiques mémoire
INFO memory
# Voir les clés par pattern
KEYS session:*
KEYS qr:*
KEYS rate:*
# Compter les clés
DBSIZE
# Voir le TTL d'une clé
TTL session:user123
# Supprimer une clé
DEL session:user123
# Invalider le cache API
KEYS cache:api:* | xargs redis-cli DEL
# Flush database (⚠️ ATTENTION - perte de données)
FLUSHDB
5.5Gestion des Logs (CapRover / Docker)
# Voir les logs d'une application
docker logs srv-captain--[APP_NAME] --tail 100 -f
# Stream des logs en temps réel
docker logs srv-captain--auth-service --follow
# Rechercher dans les logs (avec grep)
docker logs srv-captain--auth-service 2>&1 | grep "ERROR"
# Via CapRover Dashboard
# Apps > [APP_NAME] > App Logs
# Exporter les logs vers un fichier
docker logs srv-captain--auth-service > auth-service-logs.txt 2>&1
# Voir les logs Loki (si configuré)
# Dashboard Grafana > Explore > Loki
5.6Gestion du Stockage (MinIO)
# Configuration client MinIO (mc)
mc alias set rewapp http://minio.rewapp.fr ACCESS_KEY SECRET_KEY
# Lister les buckets
mc ls rewapp/
# Lister le contenu d'un bucket
mc ls rewapp/rewapp-prod-assets/
# Copier un fichier
mc cp local-file.png rewapp/rewapp-prod-assets/images/
# Synchroniser un dossier
mc mirror ./backup rewapp/rewapp-prod-backup/manual/
# Télécharger un fichier
mc cp rewapp/rewapp-prod-backup/daily/latest.sql ./
5.7Gestion des Secrets (Variables CapRover)
# Via Dashboard CapRover :
# Apps > [APP_NAME] > App Configs > Environmental Variables
# Voir les variables d'environnement d'un container
docker exec srv-captain--[APP_NAME] env
# Mettre à jour une variable via CapRover API
caprover api --path "/user/apps/appData/[APP_NAME]" --method POST --data '{"envVars":[{"key":"API_KEY","value":"new-value"}]}'
# Note: Après modification, redéployer l'application
# Dashboard > Apps > [APP_NAME] > Save & Update
PROCÉDURES DE MAINTENANCE
6.1Démarrage/Arrêt des Services
Arrêt graceful d'un service
-
1
Vérifier les opérations en cours
S'assurer qu'aucune opération critique n'est en cours
-
2
Mettre en maintenance
Configurer ALB health check fail
-
3
Drain connections
Attendre la fin des requêtes en cours
-
4
Arrêter le service
Exécuter la commande d'arrêt
# Mettre le service en maintenance
docker stop srv-captain--[SERVICE]
# Vérifier que le container est arrêté
docker ps --filter "name=srv-captain--[SERVICE]"
Redémarrage d'un service
# Remettre le service en ligne
docker start srv-captain--[SERVICE]
# Forcer un nouveau déploiement via CapRover
caprover api --appName [SERVICE] --method restartApp
# Ou via Dashboard : Apps > [SERVICE] > Save & Update
6.2Scaling Horizontal/Vertical
Scaling horizontal (ajout d'instances)
# Via Dashboard CapRover :
# Apps > [SERVICE] > App Configs > Instance Count > 6
# Vérifier le scaling
docker ps --filter "name=srv-captain--[SERVICE]"
# Ou via API CapRover
caprover api --path "/user/apps/appData/[SERVICE]" --method GET
SCALING VERTICAL
Nécessite une mise à jour de la configuration Docker : modifier les ressources allouées au container via CapRover Dashboard, puis redéployer l'application.
6.3Mise à Jour des Configurations
# Via Dashboard CapRover :
# Apps > [SERVICE] > App Configs > Environmental Variables
# Ajouter/modifier : LOG_LEVEL=debug
# Puis Save & Update pour appliquer les changements
# Ou via CapRover API
caprover api --path "/user/apps/appData/[SERVICE]" --method POST --data '{"envVars":[{"key":"LOG_LEVEL","value":"debug"}]}'
6.4Gestion des Certificats SSL
Les certificats SSL sont gérés via Let's Encrypt intégré à CapRover avec renouvellement automatique.
# Les certificats Let's Encrypt sont gérés automatiquement par CapRover
# Via Dashboard CapRover :
# Apps > [APP_NAME] > HTTP Settings > Enable HTTPS
# Vérifier l'état SSL d'une application
openssl s_client -connect rewapp.fr:443 -servername rewapp.fr | openssl x509 -noout -dates
# Les certificats sont renouvelés automatiquement 30 jours avant expiration
6.5Maintenance Base de Données
-- Vacuum complet d'une table
VACUUM FULL VERBOSE transactions;
-- Analyze pour mettre à jour les statistiques
ANALYZE transactions;
-- Vacuum et Analyze complet
VACUUM ANALYZE;
-- Reindexer une table
REINDEX TABLE transactions;
-- Reindexer toute la base
REINDEX DATABASE rewapp_prod;
TROUBLESHOOTING
7.1Problèmes Courants et Solutions
Diagnostic rapide
| Problème | Symptômes | Cause probable | Solution |
|---|---|---|---|
| API lente | Latence > 500ms | Requêtes DB lentes ou cache miss | Vérifier pg_stat_activity, invalider cache |
| 502 Bad Gateway | ALB retourne 502 | Service indisponible | Vérifier logs Docker, redéployer |
| 503 Service Unavailable | ALB retourne 503 | Tasks unhealthy | Vérifier health checks, scaling |
| 429 Too Many Requests | Rate limiting actif | Trop de requêtes | Vérifier logs, ajuster rate limits |
| Connexions DB épuisées | Connection pool exhausted | Trop de connexions ouvertes | Redémarrer service, vérifier leaks |
| Redis saturé | Éviction de clés | Cache trop volumineux | Augmenter cluster ou réduire TTL |
| QR Code invalide | Erreur scan commerçant | QR expiré (> 60s) | Demander régénération |
| Webhooks non reçus | Transactions non créditées | Problème réseau/IP | Vérifier firewall, contacter Budget Insight |
7.2Logs à Consulter
Logs par type de problème
| Type de problème | Log Group | Filtres |
|---|---|---|
| Authentification | srv-captain--auth-service | ERROR, WARN, "login failed" |
| Transactions | srv-captain--transaction-service | ERROR, "webhook", "banking" |
| QR Codes | srv-captain--points-service | ERROR, "qr", "scan" |
| Notifications | srv-captain--notification-service | ERROR, "fcm", "sendgrid" |
| Base de données | srv-captain--postgres | ERROR, "deadlock", "timeout" |
| Traefik | captain-traefik | 5xx, 4xx |
7.3Commandes de Diagnostic
Diagnostic réseau
# Accès au shell d'un container Docker
docker exec -it srv-captain--[APP_NAME] /bin/sh
# Dans le container
curl -v https://api.budgetinsight.com/health
telnet postgres 5432
redis-cli -h redis PING
Diagnostic CPU/mémoire
# Métriques Docker
docker stats srv-captain--[APP_NAME]
# Via Prometheus/Grafana
# Dashboard > Grafana > Docker Metrics
# Via CapRover Dashboard
# Apps > [APP_NAME] > App Configs > Monitor
7.4Procédure de Rollback
Rollback déploiement Docker/CapRover
# Via CapRover Dashboard : Apps > [APP_NAME] > Deployment
# Voir l'historique des images et sélectionner une version précédente
# Ou via Docker CLI
docker images | grep [APP_NAME]
# Redéployer une image précédente
caprover deploy --imageName [REGISTRY]/[APP_NAME]:[PREVIOUS_TAG]
ROLLBACK BASE DE DONNÉES
Opération critique - Nécessite validation manager. Identifier le snapshot, créer nouvelle instance, mettre à jour configs, valider fonctionnement, supprimer ancienne instance.
RUNBOOKS OPÉRATIONNELS
8.1Runbook : Service Indisponible
SITUATION
Un service ne répond plus (erreurs 502/503)
Étape 1 : Vérifier l'état du service Docker
docker ps --filter "name=srv-captain--[SERVICE]"
Vérifier les logs récents
docker logs srv-captain--[SERVICE] --tail 100 -f
Vérifier les métriques
Consulter Prometheus/Grafana Dashboard (CPU, mémoire)
Si OutOfMemory
Augmenter les ressources ou optimiser le code
Forcer un nouveau déploiement
caprover api --appName [SERVICE] --method restartApp
Si le problème persiste
Rollback vers la version précédente
8.2Runbook : Base de Données Lente
SITUATION
Les requêtes PostgreSQL sont lentes (> 1s)
Identifier les requêtes lentes
Exécuter la requête pg_stat_activity avec filtre duration > 1 second
Vérifier les locks
SELECT * FROM pg_locks WHERE NOT granted;
Si requête bloquante
SELECT pg_terminate_backend(pid);
Vérifier les index manquants
SELECT * FROM pg_stat_user_tables WHERE seq_scan > idx_scan;
Exécuter ANALYZE
ANALYZE transactions;
8.3Runbook : Cache Redis Saturé
SITUATION
Redis retourne des erreurs OOM ou éviction excessive
Vérifier la mémoire utilisée
redis-cli INFO memory
Identifier les clés volumineuses
redis-cli --bigkeys
Nettoyer les clés obsolètes
redis-cli KEYS "cache:api:old:*" | xargs redis-cli DEL
Réduire les TTL si nécessaire
Ajuster la configuration des TTL dans le code applicatif
8.4Runbook : Incident Sécurité
SITUATION CRITIQUE
Détection d'une tentative d'intrusion ou activité suspecte
⚠️ Alerter immédiatement
Contacter le Security Lead
Isoler la source
Bloquer l'IP au niveau WAF, révoquer les tokens compromis
Collecter les preuves
Exporter les logs CapRover/Loki, sauvegarder les métriques
Évaluer l'impact
Données accédées ? Comptes compromis ?
Documentation post-mortem
Documenter l'incident complet
Si données personnelles impactées
Notifier la CNIL sous 72h
CONTACTS ET ESCALADE
9.1Matrice d'Escalade
Niveaux d'escalade
| Niveau | Délai réponse | Qui contacter | Comment |
|---|---|---|---|
| N1 - Ops | 15 min | Équipe Ops (astreinte) | Slack #ops-alerts, PagerDuty |
| N2 - Lead | 30 min | Tech Lead | Slack + Téléphone |
| N3 - Management | 1h | CTO | Téléphone direct |
9.2Contacts Tiers
Support externes
| Service | Contact | Support |
|---|---|---|
| Hébergeur Support | Dashboard CapRover | Support 24/7 |
| Budget Insight | support@budget-insight.com | Business Hours |
| SendGrid | support.sendgrid.com | Ticket |
| Twilio | twilio.com/console | Ticket |
| Sentry | sentry.io | Standard |
9.3Canaux de Communication
- Slack #ops-production : Alertes et discussions ops
- Slack #incidents : Gestion des incidents majeurs
- PagerDuty : Alertes critiques et astreinte
- Email ops@rewapp.fr : Communications non urgentes
CONCLUSION
10.1Récapitulatif
Ce document centralise l'ensemble des informations techniques nécessaires à l'exploitation quotidienne de la plateforme REWAPP :
- Infrastructure CapRover/Docker détaillée
- Configurations des services
- Commandes opérationnelles essentielles
- Procédures de maintenance
- Guides de troubleshooting
- Runbooks pour les incidents courants
10.2Mises à Jour
MAINTENANCE DU DOCUMENT
Ce document doit être mis à jour : à chaque changement d'infrastructure, lors de l'ajout de nouveaux services, après chaque incident majeur, et revue trimestrielle obligatoire.