# Redis — migrat pe clusterul RAG (2026-04-22) > **TL;DR**: DIDI folosește **clusterul Redis RAG** (3 noduri Sentinel + HAProxy VIP). Containerul local `didi-cache` din `production/docker-compose.yml` e **oprit dar păstrat** ca fallback rapid. Conexiunea e centralizată via `agent-v3/src/shared/redis/connection.ts`. --- ## Ce era aici (legacy) `didi-cache` — un container Redis 7 Alpine standalone pe `didi-network` Docker. Single-node, fără HA, fără replicare. 512MB max memory, allkeys-lru eviction. Servea toate sesiunile pipeline + cache-ul framework + lock-uri workeri. ## Ce e acum ### Cluster Redis RAG (productie) | Nod | Hostname | IP | Port Redis | Port Sentinel | |---|---|---|---|---| | rag01 (HAProxy VIP) | `rag01` | `10.11.50.101` | 6379 (replica) | 26379 | | **rag02 (master curent)** | `rag02` | `10.11.50.102` | **6379 (master)** | 26379 | | rag03 | `rag03` | `10.11.50.103` | 6379 (replica) | 26379 | **Endpoint-uri pentru aplicații:** | Scop | Endpoint | |---|---| | **WRITE** (auto-routing master) | `10.11.50.100:16379` | | READ (replica locală rag01) | `10.11.50.100:6379` | | Sentinel discovery | `10.11.50.100:16380` (master name `ragmaster`) | | HAProxy stats | `http://10.11.50.100:8404/stats` | User ACL DIDI: `didi` cu prefix de chei `didi:*` și channels `didi.*`. Parola în vault-ul de credențiale `name='Redis ACL — didi'`. ACL persistent via `--aclfile /data/users.acl` pe toate 3 nodurile (fix permanent 2026-04-22). ### Conexiune centralizată în cod `agent-v3/src/shared/redis/connection.ts` — toate conexiunile ioredis trec prin `createRedisConnection(label)`. Zero `new Redis({...})` inline. Auto-reconnect cu retryStrategy, reconnectOnError pentru `READONLY` / `MASTERDOWN` (failover). ```typescript // Folosire în cod: import { createRedisConnection } from './shared/redis/connection'; const redis = createRedisConnection('framework-cache'); ``` `didiFramework` are propria implementare în `src/lib/redis.ts`. ## Containerul local `didi-cache` Definit în `production/docker-compose.yml`, configurat să pornească dar **manual oprit** ca parte din migrare. Volumul `didi-production-cache-data` e intact — datele anterioare (snapshot-uri RDB + AOF) sunt păstrate. Status curent: `Exited`. ### De ce e păstrat? - **Fallback rapid** dacă cluster RAG e indisponibil (oprit pentru maintenance, network issue, etc.) - Pentru a-l reactiva temporar, există un script switch: ```bash backend/services/orchestration-layer/scripts/redis-switch.sh local redis ``` Asta rescrie `.env` și restart agent-v3 stack pentru a folosi `didi-cache` în loc de cluster. ## Switch rapid cluster ↔ local Script: `backend/services/orchestration-layer/scripts/redis-switch.sh` ```bash # Folosește local fallback (didi-cache) ./redis-switch.sh local redis # Folosește clusterul (default) ./redis-switch.sh cluster redis # Status ./redis-switch.sh status redis ``` Credentialele cluster în sidecar `.cluster-credentials.env` (gitignored). ## Verificare cluster ```bash # Cu redis-cli din host (default user — pentru debug) redis-cli -h 10.11.50.100 -p 16379 -a PING # Cu user DIDI redis-cli -h 10.11.50.100 -p 16379 --user didi -a ACL WHOAMI # Sentinel master discovery redis-cli -h 10.11.50.100 -p 16380 SENTINEL get-master-addr-by-name ragmaster ``` ## Bootstrap automat la fresh deploy `didiFramework` detectează la pornire dacă `didi:framework:manifest` lipsește în Redis și auto-rulează `POST /api/sync-redis` (56 chei populate în ~700ms). Zero intervenție manuală pe cluster nou. ## Chei Redis principale (orientativ) | Pattern | Scop | TTL | |---|---|---| | `didi:framework:*` | Config framework (tehnici, ponderi, verdicts) | permanent | | `didi:config:{component}:v1:*` | Config componente, stage assignments tier-nested | permanent | | `didi:pipeline:{sessionId}:*` | Sesiuni pipeline (status, rezultate) | 7 zile | | `didi:queue:*` | Lock-uri workeri | 30s-5min | | `agent:result:*` | Rezultate intermediare | 7 zile | | `agent:media:*` | Cache media (transcript, vision) | 1 oră | ## Linkuri rapide - Ghid utilizare cluster: `landingzone/redis-rag/README.md` (repo `git.finesynergy.eu/lucian/landingzone`) - Onboarding ACL user nou: `landingzone/redis-rag/CLAUDE_PROMPT.md` - HAProxy stats: `http://10.11.50.100:8404/stats` ## Status - ✅ Migrare aplicată: 2026-04-22 - ✅ User `didi` configurat cu prefix izolat - ✅ Container local păstrat ca fallback (oprit, volum intact) - ✅ Bootstrap framework automat la pornire