deploy: require redis auth (--requirepass) across all consumers

Redis without a password was the root cause of the security incident
(cron miner via unauthenticated replication RCE, see
.forcc/deploy/SESSION2-FINDINGS.md). Loopback binding alone doesn't
protect against a compromised container inside the same compose
network, so wire REDIS_PASSWORD as a required secret everywhere redis
is used: backend/worker/worker-transcriber(-gpu), redis-exporter,
livekit and egress (via rendered templates). docker compose now
refuses to start without it instead of silently running unauthenticated.
This commit is contained in:
2026-07-25 22:59:34 +03:00
parent d593add0f3
commit 5e42f6d11b
9 changed files with 77 additions and 15 deletions

View File

@@ -35,18 +35,38 @@ POSTGRES_DB=vidconf
## Redis (очередь Celery)
### REDIS_PASSWORD
**Тип:** `str` | **Обязателен** (нет дефолта — `${REDIS_PASSWORD:?}` в `deploy/docker-compose.yml`)
**Описание:** Пароль Redis (`--requirepass`). Без него `docker compose up` не
стартует — намеренно: инцидент безопасности на этом проекте начался именно
с redis без пароля, опубликованного наружу (см. `.forcc/deploy/SESSION2-FINDINGS.md`
во внутренних заметках сессии деплоя). `install.sh` генерирует случайное
значение при первой установке. Используется backend/worker/livekit/egress —
все читают его через `REDIS_URL`/секцию `redis:` своих конфигов, генерируемых
из `.env` (см. `deploy/render-templates.sh`).
**Пример:**
```bash
REDIS_PASSWORD=a1b2c3...
```
### REDIS_URL
**Тип:** `str` | **Default:** `redis://localhost:6379/0`
**Описание:** URL Redis для брокера Celery (очередь задач) и кэша сеансов.
Значим только при запуске backend/worker НА ХОСТЕ вне docker-сети — внутри
контейнеров `docker-compose.yml` всегда подставляет
`redis://:${REDIS_PASSWORD}@redis:6379/0` сам, это значение игнорируя.
**Пример:**
```bash
REDIS_URL=redis://localhost:6379/0
REDIS_URL=redis://:password@localhost:6379/0
REDIS_URL=redis://:password@redis.example.com:6379/1 # с паролем, БД 1
```
**Проде:** Используйте Redis с паролем и настройте мониторинг/резервные копии.
**Проде:** Redis публикуется только на `127.0.0.1` (loopback) — снаружи
недоступен даже с паролем; удалённый доступ — через ssh-туннель.
---
@@ -440,7 +460,8 @@ SMTP_TIMEOUT_S=30
```bash
# Database & Redis
DATABASE_URL=postgresql+asyncpg://vidconf:vidconf@localhost:5432/vidconf
REDIS_URL=redis://localhost:6379/0
REDIS_PASSWORD=change-me-redis-secret
REDIS_URL=redis://:change-me-redis-secret@localhost:6379/0
# App
PLUGINS_CONFIG_PATH=config/plugins.yaml
@@ -468,6 +489,7 @@ MEDIA_ROOT=/app/media
```bash
# Database & Redis
DATABASE_URL=postgresql+asyncpg://vidconf:secure-pass@db.example.com:5432/vidconf
REDIS_PASSWORD=redis-password
REDIS_URL=redis://:redis-password@redis.example.com:6379/0
# App