Проект разделен на два репозитория

This commit is contained in:
mi
2026-08-14 15:42:45 +03:00
parent e06a77ee1d
commit bbef7a30c9
521 changed files with 2597 additions and 2302 deletions
@@ -0,0 +1,107 @@
# 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:<secret>@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).