# 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 вікно (видалити старий ключ).