# module-04-vm2. Redis Safety ВМ2 Processing > Статус: целевая спецификация Redis на ВМ2. > Канонический контракт (ключи, TTL, Lua, AOF, ACL, eviction) — [`arch-09-redis.md`](../../architectory/arch-09-redis.md). > Redis DB0/DB1 ВМ1 — [`module-04-redis-vm1.md`](../../VM1_app/documentation/module-04-redis-vm1.md). Hostname Redis ВМ1 не используется. ## 1. Назначение и границы Отдельный instance Redis Safety: hot cache, rate limiting caller и optional worker wake-up. PostgreSQL `message_safety.safety_tasks` — единственный queue/lease source (`FOR UPDATE SKIP LOCKED`, fencing generation). Redis не хранит authoritative task state, locks или leases. `bitrix-sync` этот Redis не использует. Guest API rate/idempotency/realtime — на ВМ1. Cache loss/restart безопасно восстанавливается из PostgreSQL; Redis outage не выключает core Safety. ## 2. URL и ACL ```text MESSAGE_SAFETY_REDIS_URL=redis://message_safety:@redis:6379/0 ``` Только на ВМ2. Credential доставляется secret file и не входит в общий `.env` ВМ1. `message_safety` ACL: только prefixes `han:safety:*`. `REDIS_URL` / `REDIS_REALTIME_URL` на ВМ2 отсутствуют. Logical DB index `/0` — локальный этой instance, не DB0 ВМ1. ## 3. Карта ключей | Key | Тип/value | TTL | |---|---|---| | `han:safety:rl:service:{caller}:{window}` | counter | window+jitter | | `han:safety:text:{analysis_hash}:{rules_version}` | hot text-rules result, monitor rule ids без raw text | active config, seed ≤48h | | `han:safety:verdict:{content_hash}:{config_version}:{detector_bundle}` | hot file verdict cache | active config, seed ≤30d | | `han:safety:link:{url_hash}:{rules_version}:{config_version}` | stable local policy cache | active config, seed ≤48h | | `han:safety:dns:{host_hash}:{rrtype}` | DNS answer; classification повторяется под текущей policy | actual TTL, active hard max seed 900s | | `han:safety:wakeup` | Pub/Sub notification only | no storage | Raw message text, file bytes, presigned URL и task/lease documents запрещены. Legacy v1 stub DB2 живёт на ВМ1 и **не** создаётся на ВМ2. ## 4. Lua scripts ВМ2 Обязательные: - rate-limit evaluate для `han:safety:rl:*`; - при необходимости — atomic cache set с TTL/version stamp. Lua `safety task get+increment poll` на ВМ2 **запрещён**: poll/lease принадлежат PostgreSQL. `NOSCRIPT` reload — arch-09 §6. ## 5. Sizing ВМ2 ```text Redis Safety = hot verdict/link/DNS entries + rate windows + Pub/Sub buffers total × 1.5 allocator/fragmentation × 1.3 growth reserve ``` Volume `redis-data` rebuildable: бизнес-restore из dump не требуется. ## 6. Degraded behavior ВМ2 При Redis недоступен: - production Safety продолжает task claim/poll через PostgreSQL; - hot cache/rate/wakeup деградируют и прогреваются после восстановления; - Redis hot cache не является core gate `/health/ready` (capability map module-05 / arch-03); - `bitrix-sync` не деградирует из-за этого Redis. Restore: поднять пустой или проверенный instance; Safety прогревает cache лениво. Не копировать dump в небезопасное место. ## 7. Metrics ВМ2 Общие — arch-09 §14 и [`module-09-observability-vm2.md`](module-09-observability-vm2.md). Дополнительно: Safety hot-cache hit/miss, DNS TTL cap, wakeup subscribers, rate-limit decisions caller. ## 8. Тесты ВМ2 - ACL: `message_safety` видит только `han:safety:*`; `han:api:*` / `han:rt:*` недоступны; - порт 6379 недоступен с host/public network и с ВМ1 Docker DNS; - Safety cache loss/rebuild, DNS TTL cap и доказательство отсутствия task/lease state в Redis; - rate Lua concurrency; - `NOSCRIPT` reload; - all application keys имеют TTL (кроме Pub/Sub channel); - max value/invalid serialization; raw text/file не сохраняются; - restart with AOF/RDB, corrupted AOF rehearsal, empty restore; - Redis outage не останавливает PostgreSQL claim/poll; - logs/metrics не содержат secret/value/PII/message text. ## 9. Definition of Done ВМ2 Дополнительно к arch-09 §15: - prefixes `han:safety:*` реализованы; task/lease keys отсутствуют; - cache loss/rebuild и DNS TTL cap доказаны; - health/degraded §6 согласованы с capability readiness Safety; - dashboards/alerts Redis Safety готовы; - `MESSAGE_SAFETY_REDIS_URL` не появляется в репозитории/Compose ВМ1. ## 10. TBD ВМ2 - R1/R2: maxmemory и eviction после load profile Safety. - R4: Safety task TTL/recovery margin — в PostgreSQL / [`module-05-message-safety.md`](module-05-message-safety.md), не в Redis. - R3: имя `MESSAGE_SAFETY_REDIS_URL` — arch-04. ## 11. Ссылки - Контракт: [`arch-09-redis.md`](../../architectory/arch-09-redis.md). - ВМ1: [`module-04-redis-vm1.md`](../../VM1_app/documentation/module-04-redis-vm1.md). - Указатель: [`module-04-redis.md`](module-04-redis.md). - Safety: [`module-05-message-safety.md`](module-05-message-safety.md).