livrare lot 2
This commit is contained in:
commit
8ecc78e729
763 changed files with 164593 additions and 0 deletions
208
backend/services/gateway-auth-layer/didiKong/INDEX.md
Normal file
208
backend/services/gateway-auth-layer/didiKong/INDEX.md
Normal file
|
|
@ -0,0 +1,208 @@
|
|||
# didiKong - Index
|
||||
|
||||
API Gateway pentru platforma DIDI. Toate requesturile externe trec prin Kong inainte sa ajunga la serviciile backend. Gestioneaza rutare, rate limiting, CORS, SSL si headere.
|
||||
|
||||
**Imagine**: didi-kong:latest (Kong 3.9.1)
|
||||
**Container**: didi-kong (activ, pe masina de deployment)
|
||||
|
||||
**Mod**: DB-less declarativ (`KONG_DATABASE=off`)
|
||||
**Porturi** (doar loopback `127.0.0.1`): 18000 (proxy HTTP -> container 8000), 18001 (admin API -> 8001), 18443 (proxy TLS -> 8443 ssl)
|
||||
|
||||
---
|
||||
|
||||
## Deployment: container local DB-less (activ)
|
||||
|
||||
Kong ruleaza ca un singur container `didi-kong` pe masina de deployment, in mod **DB-less** (`KONG_DATABASE=off`). Nu exista Kong Cluster, Control Plane, Data Planes sau HAProxy, si nu exista PostgreSQL pentru Kong.
|
||||
|
||||
- Config declarativa din `declarative/kong.yml.didi11-local`, montata in container la `/kong/declarative/kong.yml`.
|
||||
- Porturile sunt legate exclusiv pe loopback (`127.0.0.1`): proxy `18000`, admin API `18001`, proxy TLS `18443`. Kong nu e expus public direct; traficul extern intra prin edge/tunel catre proxy-ul local.
|
||||
- Single source of truth = fisierul declarativ `kong.yml.didi11-local`. Orice modificare de rute/plugin-uri se face in acest fisier + reload.
|
||||
|
||||
---
|
||||
|
||||
## Mod de operare: DB-less (declarativ)
|
||||
|
||||
Configuratia vine integral din fisierul `declarative/kong.yml.didi11-local`. Kong nu are baza de date proprie.
|
||||
```
|
||||
KONG_DATABASE=off
|
||||
KONG_DECLARATIVE_CONFIG=/kong/declarative/kong.yml
|
||||
```
|
||||
|
||||
Nu exista mod PostgreSQL / productie separata pentru Kong: acelasi fisier declarativ este sursa unica de adevar.
|
||||
|
||||
---
|
||||
|
||||
## Servicii inregistrate
|
||||
|
||||
Kong ruteaza catre 2 servicii backend (conform `kong.yml.didi11-local`):
|
||||
|
||||
| Serviciu | Target | Status |
|
||||
|----------|--------|--------|
|
||||
| didi-agent-v3 | http://didi-agent-v3:24803 | activ |
|
||||
| didi-framework | http://didi-framework:3005 | activ |
|
||||
|
||||
Nota: rutele agent-v3 au timeout mare (660s = 11 min) pentru procesarea video.
|
||||
|
||||
---
|
||||
|
||||
## Rute definite
|
||||
|
||||
### Agent service (activ)
|
||||
|
||||
| Path | Metode | Destinatie |
|
||||
|------|--------|------------|
|
||||
| /agent/health | GET | agent-api |
|
||||
| /agent/status | GET | agent-api |
|
||||
| /api/pipelines | GET | agent-api |
|
||||
| /api/analyze | POST | agent-api |
|
||||
| /api/sessions | GET | agent-api |
|
||||
| /api/upload | POST | agent-api |
|
||||
| /api/abort | POST | agent-api |
|
||||
| /api/v3/* | toate | agent-api (acopera si /api/v3/moderation/*) |
|
||||
|
||||
### didiFramework (config + HIL moderation)
|
||||
|
||||
| Path | Metode | Destinatie |
|
||||
|------|--------|------------|
|
||||
| /api/* | toate | didiFramework (acopera /api/moderation-config, /api/sensitive-topics, /api/moderation-roles) |
|
||||
|
||||
Nota: rutele de moderatie (HIL) calatoresc pe regulile generale `/api/v3/*` (agent-v3) si `/api/*` (didiFramework) — nu sunt necesare reguli Kong dedicate.
|
||||
|
||||
> Notă: serviciile Python legacy `orchestrator-api` și `analysis-api` (rute `/api/v1/catalog|pipelines|runs/*`,
|
||||
> `/analysis/*`) NU mai există în config-ul local — au fost eliminate odată cu migrarea pe agent-v3. Config-ul
|
||||
> `kong.yml.didi11-local` rutează exclusiv către `didi-agent-v3` și `didi-framework`.
|
||||
|
||||
### Admin dashboard
|
||||
|
||||
| Path | Metode | Destinatie |
|
||||
|------|--------|------------|
|
||||
| /admin | toate | admin-dashboard |
|
||||
| /admin/api | toate | admin-dashboard |
|
||||
|
||||
---
|
||||
|
||||
## Plugin-uri globale
|
||||
|
||||
5 plugin-uri active pe toate rutele:
|
||||
|
||||
### 1. CORS
|
||||
- Origins: localhost:3000, localhost:3001, localhost:8100, * (wildcard)
|
||||
- Metode: GET, POST, PUT, DELETE, OPTIONS, PATCH
|
||||
- Headere: Accept, Accept-Version, Content-Length, Content-MD5, Content-Type, Date, Authorization, X-Request-ID
|
||||
- Exposed headers: X-Auth-Token, X-Request-ID
|
||||
- Credentials: activat
|
||||
- Max age: 3600s
|
||||
- Preflight continue: nu
|
||||
|
||||
### 2. Rate Limiting
|
||||
- 100 requests/minut per consumer
|
||||
- 2000 requests/ora per consumer
|
||||
- 10000 requests/zi per consumer
|
||||
- Politica: local (fara state distribuit)
|
||||
- Fault tolerant: da
|
||||
|
||||
### 3. Correlation ID (Request ID Tracking)
|
||||
- Header: X-Request-ID
|
||||
- Generator: UUID
|
||||
- Echo downstream: da (returnat in raspuns)
|
||||
|
||||
### 4. Request Size Limiting
|
||||
- Max payload: 100MB (pentru upload media)
|
||||
- Require content-length: nu
|
||||
|
||||
### 5. Response Transformer
|
||||
- Adauga: X-Gateway: DIDI-Kong, X-API-Version: 2.0
|
||||
- Sterge: Server, Via (ascunde detalii interne)
|
||||
|
||||
---
|
||||
|
||||
## Upstreams (load balancing)
|
||||
|
||||
Config-ul local (`kong.yml.didi11-local`) NU definește upstream-uri — rutarea se face
|
||||
direct către serviciile `didi-agent-v3:24803` și `didi-framework:3005`. Scalarea orizontală
|
||||
a workerilor se face la nivel de agent-v3 (`scale-workers.sh`), nu prin upstream-uri Kong.
|
||||
|
||||
---
|
||||
|
||||
## SSL/TLS
|
||||
|
||||
- Certificat self-signed pentru <host-local>
|
||||
- Locatie: certs/server.crt, certs/server.key
|
||||
- Valabil: feb 2026 - feb 2027
|
||||
- Emitent: DIDI, Bucharest, RO
|
||||
- Servit pe proxy-ul TLS local `127.0.0.1:18443`
|
||||
|
||||
---
|
||||
|
||||
## Integrare Keycloak (LOCAL) + enforcement JWT (Modul 4 Gateway)
|
||||
|
||||
Kong valideaza token-urile emise de instanta Keycloak **locala** (`didi-keycloak`, port `28080`, servita sub `/auth`). Realm-urile locale sunt `didi-clients` (useri finali) si `didi-admins` (operatori). Issuer-ele locale au forma `http://localhost:28080/auth/realms/didi-clients` si `.../didi-admins`.
|
||||
|
||||
Enforcement-ul se face prin pluginul Kong `jwt` (nu OIDC/introspection): validare de semnatura **RS256** cu chei publice statice, `key_claim_name: iss` (Kong potriveste tokenul dupa claim-ul `iss` cu un `jwt_secret` inregistrat pe consumer).
|
||||
|
||||
Consumer: **`didi-keycloak-users`** — detine `jwt_secrets` (RS256, `rsa_public_key`) pentru toate issuer-ele acceptate, cheia fiind chiar valoarea `iss`:
|
||||
- local: `http://localhost:28080/realms/didi-clients`, `http://localhost:28080/realms/didi-admins`
|
||||
- plus issuer-ele externe/edge folosite in fata proxy-ului: `https://didi365.eu/auth/realms/{didi-clients,didi-admins}`, `https://<sso-extern>/realms/...`, `https://<sso-extern>/realms/...`, `https://<host-local>/auth/realms/...`, `https://10.11.10.11:{3001,8443}/auth/realms/...`
|
||||
|
||||
Pluginul `jwt` este activ pe **16 rute protejate** de pe cele doua servicii (`didi-agent-v3` si `didi-framework`), incluzand ruta **`/framework`** (route `didi-framework-direct`, jwt adaugat 2026-07-08). Rutele publice raman fara jwt (health/status, media public, verify-email, waitlist), iar rutele de extensie folosesc autentificare separata prin `X-API-Key` + rate-limiting.
|
||||
|
||||
JWT validation flow:
|
||||
1. Clientul (SPA/extensie) obtine token JWT de la Keycloak local (`/auth/realms/didi-clients` sau `/auth/realms/didi-admins`).
|
||||
2. Trimite request cu `Authorization: Bearer {token}`.
|
||||
3. Kong potriveste `iss` cu `jwt_secret`-ul consumer-ului `didi-keycloak-users` si valideaza semnatura RS256; token invalid/lipsa -> `401`.
|
||||
4. Daca valid, ruteaza requestul catre serviciul backend local (`didi-agent-v3:24803` / `didi-framework`).
|
||||
5. Serviciul backend decodeaza tokenul pentru `user_id`/`email`/`realm_access.roles` (fara re-validare — Kong a validat deja).
|
||||
|
||||
---
|
||||
|
||||
## Configurare performanta
|
||||
|
||||
```
|
||||
KONG_NGINX_WORKER_PROCESSES=auto
|
||||
KONG_MEM_CACHE_SIZE=256m
|
||||
KONG_NGINX_PROXY_PROXY_BUFFER_SIZE=128k
|
||||
KONG_NGINX_PROXY_PROXY_BUFFERS=4 256k
|
||||
KONG_NGINX_PROXY_PROXY_BUSY_BUFFERS_SIZE=256k
|
||||
KONG_NGINX_HTTP_LARGE_CLIENT_HEADER_BUFFERS=4 64k
|
||||
```
|
||||
|
||||
Buffer-urile mari sunt necesare pentru headerele JWT de la Keycloak (token-urile pot fi foarte mari).
|
||||
|
||||
---
|
||||
|
||||
## Fisiere
|
||||
|
||||
```
|
||||
Dockerfile -- Imagine didi-kong (Kong 3.9), instaleaza curl, entrypoint
|
||||
entrypoint.sh -- Pornire Kong DB-less + wait for ready + log servicii
|
||||
declarative/
|
||||
kong.yml.didi11-local -- Configurare declarativa activa (single source of truth, montata la /kong/declarative/kong.yml)
|
||||
certs/
|
||||
server.crt -- Certificat SSL self-signed
|
||||
server.key -- Cheie privata SSL
|
||||
```
|
||||
|
||||
Zero cod custom. Zero plugin-uri Lua custom. Doar configurare declarativa si certificat SSL.
|
||||
|
||||
---
|
||||
|
||||
## Health check
|
||||
|
||||
```
|
||||
kong health (interval 30s, timeout 10s, retries 3, start period 60s)
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Consumers
|
||||
|
||||
Configuratia declarativa defineste un singur consumer Kong: **`didi-keycloak-users`** (username + custom_id `didi-keycloak-users`), care detine `jwt_secrets`-urile RS256 pentru toate issuer-ele Keycloak locale/edge acceptate (vezi sectiunea Integrare Keycloak). Acest consumer este cel pe care pluginul `jwt` il rezolva la validarea tokenului.
|
||||
|
||||
Limitele per-tier (free/paid/enterprise) provin din atributele de grup Keycloak (realm-urile locale `didi-clients` / `didi-admins`) si sunt disponibile in claim-urile JWT pentru rate limiting; rutele de extensie au propriul rate-limiting per `X-API-Key` (30/min).
|
||||
|
||||
## Recent Changes
|
||||
|
||||
- **2026-07-08 — jwt pe `/framework`**: pluginul `jwt` (RS256, `key_claim_name: iss`) adaugat pe ruta `didi-framework-direct` (path `/framework`). Enforcement JWT acum activ pe 16 rute protejate pe `didi-agent-v3` + `didi-framework`.
|
||||
- **jwt_secrets pentru issuer-ele locale** pe consumer `didi-keycloak-users`: `http://localhost:28080/realms/didi-clients` + `.../didi-admins`, alaturi de issuer-ele edge (`didi365.eu/auth`, `<sso-extern>`, `<sso-extern>`, `<host-local>/auth`, `10.11.10.11:{3001,8443}/auth`) pentru realm-urile `didi-clients` si `didi-admins`.
|
||||
- **Rute de extensie** (`didi-agent-extension-analyze`, `-async`, `-status`, `-upload`): autentificare `X-API-Key` + `rate-limiting` 30/min + `request-transformer`; CORS extins cu origins `chrome-extension://[a-z]+`, `moz-extension://[a-z0-9-]+` + header `X-API-Key`.
|
||||
- **Single source of truth** = `declarative/kong.yml.didi11-local` (DB-less). Fara cluster, fara decK sync.
|
||||
Loading…
Add table
Add a link
Reference in a new issue