Files
microdao-daarion/docs/runbook/secrets-rotation.md
2026-03-02 09:32:18 -08:00

101 lines
4.3 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Runbook: Secrets Rotation (Sofiia Stack)
Ціль: безпечно ротувати секрети для `sofiia-console`/router/gateway/memory без простою або з мінімальним вікном деградації.
## 1) Інвентар секретів (класи)
- Telegram bot tokens (`TELEGRAM_BOT_TOKEN`, агентні токени).
- LLM/model provider keys (`OPENAI_API_KEY`, `DEEPSEEK_API_KEY`, `ANTHROPIC_API_KEY`, інші provider keys).
- Redis auth (`SOFIIA_REDIS_URL` з паролем, якщо увімкнено auth).
- DB encryption / signing keys (якщо використовується шифрування або signing).
- JWT/session signing keys (якщо застосовуються в BFF/API).
- Internal service tokens (`SUPERVISOR_API_KEY`, `ROUTER_API_KEY`, внутрішні service-to-service ключі).
## 2) Де вони живуть
- `.env` / docker compose env blocks.
- systemd/launchd env (для процесів поза Docker).
- Цільовий стан: централізований secrets manager (Vault/1Password/GitHub Encrypted Secrets) + мінімум секретів у файлах.
## 3) Процедура ротації (порядок і команди)
### 3.1 Підготувати нові секрети
```bash
# Приклад генерації (локально, не комітити)
openssl rand -hex 32
```
Зафіксувати у change-log: які ключі, коли, хто, який rollout order.
### 3.2 Внести нові значення у runtime env (без друку значень)
```bash
cd /path/to/microdao-daarion
# оновити .env/.env.node* або secrets manager
```
### 3.3 Dual-accept / dual-write (де можливо)
- Якщо сервіс підтримує два ключі: додати `NEW`, залишити `OLD` на перехідний період.
- Якщо не підтримує: ротувати покроково з перевірками після кожного restart.
### 3.4 Rollout порядок по нодах
Рекомендований порядок для цього стеку:
1. **NODA2 (control-plane) — precheck**
- Переконатися, що нові env підхоплюються локально.
2. **NODA1 (production runtime)**
- Оновити env, перезапустити критичні сервіси по черзі.
3. **NODA2 (control-plane) — finalize**
- Перезапустити `sofiia-console`, підтвердити керування нодами.
### 3.5 Команди перезапуску (приклади)
```bash
# NODA1 (remote)
ssh root@144.76.224.179 "cd /opt/microdao-daarion && docker compose -f docker-compose.node1.yml up -d router gateway memory-service"
# NODA2 (local control plane)
cd /Users/apple/github-projects/microdao-daarion
docker compose -f docker-compose.node2-sofiia.yml up -d sofiia-console router
```
## 4) Перевірки після ротації
```bash
# 1) статус API
curl -fsS http://127.0.0.1:8002/api/status/full > /dev/null
# 2) дашборд нод
curl -fsS http://127.0.0.1:8002/api/nodes/dashboard > /dev/null
# 3) метрики живі
curl -fsS http://127.0.0.1:8002/metrics | rg "sofiia_"
# 4) distributed idempotency smoke (A/B)
bash ops/redis_idempotency_smoke.sh
```
Паралельно виконати preflight:
```bash
bash ops/preflight_sofiia_console.sh
STRICT=1 bash ops/preflight_sofiia_console.sh
```
## 5) Rollback
1. Повернути попередні значення секретів (із безпечного backup/manager).
2. Перезапустити сервіси в зворотному порядку:
- NODA2 control-plane -> NODA1 runtime (або за вашим SOP).
3. Повторити перевірки з розділу 4.
4. Зафіксувати інцидент/rollback у операційному журналі.
## 6) Операційні правила
- Ніколи не комітити реальні секрети в git.
- Логувати лише факт наявності/відсутності секрету, не значення.
- Після ротації закривати перехідний dual-accept вікно (видалити старий ключ).