Repository d’infrastructure pour la plateforme d’analyse vidéo sportive.
Ce repo orchestre la stack applicative complète via Docker Compose, consomme des images déjà publiées sur GHCR (sans build local applicatif) et expose une gateway unique Traefik pour le routage HTTP interne/externe.
- Orchestrer la stack de référence (prod locale / cible prod).
- Consommer les images publiées par les repos applicatifs (
front-service,auth-service,analysis-store-service). - Centraliser les conventions de routage Traefik, de santé applicative et de variables d’environnement.
Services démarrés par le compose principal :
traefik: point d’entrée HTTP unique (http://localhost).front-service: service front SSR (port conteneur4000).auth-service: service d’authentification (port conteneur3000, dépend demongo).analysis-store-service: service de stockage d’analyses (port conteneur3001, dépend depostgres).analysis-store-migrate: service one-shot exécutant les migrations PostgreSQL deanalysis-store-service.mongo: base interne pourauth-service.postgres: base interne pouranalysis-store-service.rabbitmq: broker d'evenements metier AMQP, avec UI management locale.
Routage Traefik :
/auth,/users,/me,/health->auth-service/analysis->analysis-store-service(Traefik strip/analysisavant backend)- tout le reste (
/, pages SSR, assets) ->front-service
Préfixe public analysis :
- requête publique du front :
/analysis/api/... - Traefik retire
/analysis(StripPrefix) - backend
analysis-store-serviceservi en interne sous/api/...
Chaîne d’auth analysis (gateway) :
- Le front appelle Traefik en same-origin avec
Authorization: Bearer <jwt>(il ne forge jamais de headers internesx-auth-*) - Traefik supprime d'abord tout header client
x-auth-*entrant - Traefik délègue la validation JWT à
auth-serviceviaforwardAuthsur l’endpoint interneGET /internal/auth/context, en transmettant explicitementAuthorization - Traefik ne propage vers
analysis-store-serviceque les headers d'identité retournés par cette validation (x-auth-user-id,x-auth-club-ids,x-auth-roles) x-auth-club-idsn’est pas fourni actuellement parauth-service, mais reste propagé pour compatibilité future
Contexte identité/auth :
- validation JWT en gateway via
forwardAuth(endpoint interneauth-service /internal/auth/context), puis propagation interne des headers d’identité (x-auth-user-id,x-auth-club-ids,x-auth-roles) vers les services qui en dépendent.
docker-compose.yml: orchestration principale de tous les services.traefik/traefik.yml: configuration statique Traefik..env.example: exemple de configuration (images GHCR, secrets, runtime)..env: configuration locale réelle (non versionnée).docs/contracts/: contrats importés depuis les repos applicatifs.docs/: documentation d’architecture, sécurité, exploitation locale.
cp .env.example .env
# 1) renseigner les images GHCR (FRONT_IMAGE, AUTH_IMAGE, ANALYSIS_STORE_IMAGE)
# 2) renseigner les secrets requis (AUTH_*, ANALYSIS_STORE_MASTER_KEY, ANALYSIS_STORE_DB_PASSWORD)
# login GHCR (si packages privés)
docker login ghcr.io
# pull + start de la stack complète
make pull
make up
make ps
make healthLe compose exécute automatiquement analysis-store-migrate (one-shot) avant analysis-store-service.
Vérifications rapides :
curl -i http://localhost/
curl -i http://localhost/health
curl -i http://localhost/analysis/api/healthArrêt :
make downVariables clés :
- Images :
FRONT_IMAGE,AUTH_IMAGE,ANALYSIS_STORE_IMAGE - Auth :
AUTH_JWT_SECRET,AUTH_ADMIN_*,AUTH_DB_NAME, etc. - Analysis store :
ANALYSIS_STORE_MASTER_KEY,ANALYSIS_STORE_DB_*,ANALYSIS_STORE_DATABASE_URL(override optionnel) - RabbitMQ :
RABBITMQ_URL,RABBITMQ_EXCHANGE,RABBITMQ_USER,RABBITMQ_PASSWORD, queues de suppression utilisateur
Stratégie images GHCR :
- Chaque variable
*_IMAGEdoit contenir une référence complète :ghcr.io/<owner>/<repo>:<tag>ghcr.io/<owner>/<repo>@sha256:<digest>
- En prod, préférer les digests immuables (
@sha256) quand disponibles.
- Accès GHCR refusé : vérifier
docker login ghcr.ioet les droitsread:packages. - Image inchangée après update : vérifier que tag/digest a réellement changé, puis relancer
make pull. - Doute sur la résolution compose : exécuter
docker compose config. - Vérifier les images réellement lancées :
docker compose pspuisdocker inspect <container>. - Schéma PostgreSQL non initialisé (volume existant/incohérent) :
docker compose run --rm analysis-store-migratedocker compose up -d analysis-store-service