v1.0 Novembre 2025
Document 10.2

Documentation Technique Ops

Référence technique pour l'équipe Operations

24 novembre 2025
Version 1.0
1

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
2

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
ContainersDocker / CapRoverScaling manuel 2-10 instances
Base de donnéesPostgreSQL 15Conteneur Docker
CacheRedis 7Conteneur Docker
StockageMinIOCompatible S3, Versioning activé
Reverse ProxyTraefik (intégré CapRover)HTTPS, compression gzip
Load BalancerTraefikHealth checks, SSL termination
DNSDNS Provider externeFailover routing
SecretsVariables env CapRoverGestion via dashboard
LogsCapRover Logs / LokiRétention 30 jours

2.2Architecture Réseau (VPC)

Subnets VPC

Subnet CIDR Zone Rôle
Public A10.0.1.0/24Serveur principalTraefik, Docker Network
Public B10.0.2.0/24Serveur backupTraefik (failover)
Privé App A10.0.10.0/24Docker NetworkServices Docker
Privé App B10.0.11.0/24Docker NetworkServices Docker
Privé Data A10.0.20.0/24Docker NetworkPostgreSQL, Redis
Privé Data B10.0.21.0/24Docker NetworkPostgreSQL, Redis

2.3Security Groups

Règles Security Groups

Nom Port Source Description
rewapp-alb-sg4430.0.0.0/0HTTPS public
rewapp-app-sg3000rewapp-alb-sgTrafic depuis ALB
rewapp-db-sg5432rewapp-app-sgPostgreSQL
rewapp-redis-sg6379rewapp-app-sgRedis
rewapp-bastion-sg22IP VPNSSH 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
3

CONFIGURATION DES SERVICES

3.1Microservices Backend

Services et Ports

Service Port Container Docker Health Check
auth-service3001rewapp-[ENV]-auth/health
user-service3002rewapp-[ENV]-user/health
merchant-service3003rewapp-[ENV]-merchant/health
transaction-service3004rewapp-[ENV]-transaction/health
points-service3005rewapp-[ENV]-points/health
banking-service3006rewapp-[ENV]-banking/health
notification-service3007rewapp-[ENV]-notification/health
api-gateway3000rewapp-[ENV]-gateway/health

3.2Configuration PostgreSQL (Docker Container)

Configuration par environnement

Paramètre DEV STAGING PRODUCTION
Instancedb.t3.microdb.t3.smalldb.t3.medium
Storage20 GB50 GB100 GB
Multi-AZNonNonOui
Backup Retention7 jours14 jours30 jours
Maintenance Windowdim. 03:00-04:00

Paramètres PostgreSQL optimisés

PostgreSQL Config
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 Typecache.t3.microcache.t3.microcache.t3.small
Nodes113 (cluster)
Maxmemory Policyvolatile-lru

Clés Redis principales

Pattern Usage TTL
session:{userId}Sessions utilisateur24h
cache:api:{endpoint}:{params}Cache APIVariable
qr:{code}QR codes temporaires60s
locked:{userId}:{qrCode}Points bloqués60s
rate:{ip} ou rate:{userId}Rate limiting60s

3.4Configuration S3

Buckets S3

Bucket Usage Lifecycle Réplication
rewapp-[ENV]-assetsImages, logos partenairesGlacier après 90jNon
rewapp-[ENV]-documentsDocuments KYCGlacier après 30jNon
rewapp-[ENV]-logsLogs applicatifsSuppression après 365jNon
rewapp-prod-backupBackups PostgreSQLGlacier Deep Archive après 90jCross-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_URLURL connexion PostgreSQLSecrets Manager
REDIS_URLURL connexion RedisSecrets Manager
JWT_SECRETClé signature JWT (RS256)Secrets Manager
BANKING_API_KEYClé API Budget InsightSecrets Manager
SENDGRID_API_KEYClé API SendGridSecrets Manager
FCM_SERVER_KEYClé serveur FirebaseSecrets Manager
SENTRY_DSNDSN Sentry error trackingParameter Store
LOG_LEVELNiveau de logParameter Store
4

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-AdminTous environnementsAccès complet (déploiement, config)
Ops-ReadOnlyTous environnementsLecture seule
Dev-StagingDev + StagingAccès complet
SupportProductionLecture logs et métriques uniquement

Connexion CapRover

  1. 1
    Accéder au dashboard CapRover

    Ouvrir https://captain.rewapp.fr

  2. 2
    S'authentifier

    Utiliser le mot de passe CapRover

  3. 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.

~/.ssh/config
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

BASH
# 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
OpenVPNvpn.rewapp.fr1194UDP

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
BASH
# Rotation manuelle d'un secret via Dashboard CapRover
# Apps > [APP_NAME] > App Configs > Environmental Variables
# Modifier la variable concernée puis Save & Update
5

COMMANDES OPÉRATIONNELLES

5.1CapRover CLI - Configuration Préalable

BASH
# 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

BASH
# 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)

BASH
# 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

SQL
-- 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)

BASH
# 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

REDIS
# 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)

BASH
# 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)

BASH
# 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)

BASH
# 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
6

PROCÉDURES DE MAINTENANCE

6.1Démarrage/Arrêt des Services

Arrêt graceful d'un service

  1. 1
    Vérifier les opérations en cours

    S'assurer qu'aucune opération critique n'est en cours

  2. 2
    Mettre en maintenance

    Configurer ALB health check fail

  3. 3
    Drain connections

    Attendre la fin des requêtes en cours

  4. 4
    Arrêter le service

    Exécuter la commande d'arrêt

BASH
# 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

BASH
# 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)

BASH
# 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

BASH
# 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.

BASH
# 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

SQL
-- 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;
7

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
Authentificationsrv-captain--auth-serviceERROR, WARN, "login failed"
Transactionssrv-captain--transaction-serviceERROR, "webhook", "banking"
QR Codessrv-captain--points-serviceERROR, "qr", "scan"
Notificationssrv-captain--notification-serviceERROR, "fcm", "sendgrid"
Base de donnéessrv-captain--postgresERROR, "deadlock", "timeout"
Traefikcaptain-traefik5xx, 4xx

7.3Commandes de Diagnostic

Diagnostic réseau

BASH
# 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

BASH
# 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

BASH
# 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.

8

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]"

2
Vérifier les logs récents

docker logs srv-captain--[SERVICE] --tail 100 -f

3
Vérifier les métriques

Consulter Prometheus/Grafana Dashboard (CPU, mémoire)

4
Si OutOfMemory

Augmenter les ressources ou optimiser le code

5
Forcer un nouveau déploiement

caprover api --appName [SERVICE] --method restartApp

6
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

2
Vérifier les locks

SELECT * FROM pg_locks WHERE NOT granted;

3
Si requête bloquante

SELECT pg_terminate_backend(pid);

4
Vérifier les index manquants

SELECT * FROM pg_stat_user_tables WHERE seq_scan > idx_scan;

5
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

2
Identifier les clés volumineuses

redis-cli --bigkeys

3
Nettoyer les clés obsolètes

redis-cli KEYS "cache:api:old:*" | xargs redis-cli DEL

4
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

URGENT
2
Isoler la source

Bloquer l'IP au niveau WAF, révoquer les tokens compromis

3
Collecter les preuves

Exporter les logs CapRover/Loki, sauvegarder les métriques

4
Évaluer l'impact

Données accédées ? Comptes compromis ?

5
Documentation post-mortem

Documenter l'incident complet

6
Si données personnelles impactées

Notifier la CNIL sous 72h

OBLIGATION LÉGALE
9

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 SupportDashboard CapRoverSupport 24/7
Budget Insightsupport@budget-insight.comBusiness Hours
SendGridsupport.sendgrid.comTicket
Twiliotwilio.com/consoleTicket
Sentrysentry.ioStandard

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
10

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.