Architecture
Vue d'ensemble du projet : une API FastAPI déployée en conditions production-grade sur AWS EKS, de la CI/CD au runtime.
Vue d'ensemble (diagram as code)

- GitLab CI/CD : build des images api + frontend (Kaniko), scan (Trivy), promote ECR par digest, puis write-back du tag dans Git — le déploiement est GitOps pull-based (#72) : ArgoCD réconcilie FastAPI et le frontend depuis Git, la CI ne touche pas au cluster.
- Terraform provisionne l'infra AWS, séparée en deux cycles de vie (persistent : ECR api + frontend ; éphémère : VPC + EKS + RDS).
- Exposition : Cloudflare DNS → NLB (#70) → Envoy Gateway partagé →
api.(FastAPI),app.(SPA frontend, #110),grafana.etargocd.(#105). - Secrets : External Secrets Operator synchronise AWS Secrets Manager vers un Secret Kubernetes, authentifié par IRSA (aucun secret en clair).
- TLS : cert-manager émet le certificat via Let's Encrypt (challenge DNS-01 Cloudflare).
- Observabilité : métriques (Prometheus, #74), logs (Alloy → Loki, #75) et traces (OTLP → OTel Collector → Tempo, #107/#108), corrélées dans Grafana.
Ce schéma est généré depuis diagrams/architecture.py
(voir la section régénération en bas de page).
Les schémas détaillés ci-dessous sont à rafraîchir. Ils datent de la planification (Sprint 0-1) et ne reflètent plus l'état actuel. Écarts connus : ALB → Envoy Gateway (Gateway API, #34/#28), Route53 → Cloudflare DNS, GitLab Agent → GitOps ArgoCD pull-based (#72, write-back CI au lieu de
kubectl apply -k), docker build → Kaniko, ESO + IRSA pour les secrets (plus de lien direct pod → Secrets Manager), stack observabilité = Sprint 4 (en cours).
CI/CD Pipeline Detail
sequenceDiagram
participant Dev as 👨💻 Developer
participant GL as GitLab
participant CI as GitLab CI/CD
participant ECR as AWS ECR
participant EKS as AWS EKS
Dev->>GL: git push / Merge Request
GL->>CI: trigger pipeline
rect rgb(220, 240, 220)
Note over CI: Stage: test ✅ Sprint 0
CI->>CI: pytest (37 tests)
CI->>CI: coverage report (XML)
CI->>GL: coverage badge
end
rect rgb(255, 243, 205)
Note over CI: Stage: security 🔄 Sprint 1
CI->>CI: SAST (GitLab)
CI->>CI: Trivy container scan
CI->>CI: Secret Detection
end
rect rgb(220, 235, 255)
Note over CI: Stage: build 🔄 Sprint 1
CI->>CI: docker build
CI->>ECR: docker push
end
rect rgb(240, 220, 255)
Note over CI: Stage: deploy ⏳ Sprint 3
CI->>EKS: GitLab Agent sync
EKS->>ECR: pull image
EKS->>EKS: rolling update
end
Local Development Stack
graph LR
subgraph HOST["Host Machine"]
DEV["👨💻 Developer\nbrowser / curl"]
end
subgraph COMPOSE["Docker Compose (docker-compose-dev.yaml)"]
API["fastapi-app-dev\nuvicorn :8080\n+ alembic migrate"]
DB["postgres-db-dev\nPostgreSQL 16 :5432"]
PGA["pgadmin-dev\npgAdmin4 :8081"]
end
DEV -->|":8080"| API
DEV -->|":8081"| PGA
API -->|"SQLAlchemy"| DB
PGA --> DB
API -->|"healthcheck\ncurl /"| API
DB -->|"healthcheck\npg_isready"| DB
Régénérer le schéma d'ensemble
Le schéma d'ensemble est généré en diagram as code (lib
mingrammer/diagrams). Après une évolution de
l'architecture, mettre à jour diagrams/architecture.py et régénérer dans la
même MR :
python -m venv ~/.venvs/diagrams && source ~/.venvs/diagrams/bin/activate
pip install -r docs/diagrams/requirements.txt
sudo apt install -y graphviz
cd docs/diagrams && python architecture.py # régénère devsecops-eks.png ici