diff --git a/CLAUDE.md b/CLAUDE.md index 4f87808..afd7f46 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -24,9 +24,8 @@ Открытые вопросы — фиксировать выбранный вариант *здесь и в описании задачи gntodo*, после решения убрать из списка: -1. Хост и домен деплоя (synapse.gnexus.space?) — VM на libvirt или существующий VPS. -2. Telegram-бот — новый или существующий токен. -3. Привязка «user_id ↔ идентичность в канале» (tg chat_id, push-подписка) — отложено до #29: общий механизм пер-канальных привязок пользователя (процедура самопривязки, не ручной ввод админом), приоритет — push и s2s. +1. Telegram-бот — новый или существующий токен (отложен до #29). +2. Привязка «user_id ↔ идентичность в канале» (tg chat_id, push-подписка) — отложено до #29: общий механизм пер-канальных привязок пользователя (процедура самопривязки, не ручной ввод админом), приоритет — push и s2s. ## Интеграция с gnexus-auth (SSO) @@ -71,7 +70,7 @@ - **gnexus-auth** (SSO, 192.168.1.167) — единая аутентификация экосистемы. - **Navi swarm** — инстансы: rei, ayame, tsukiko, pilar, melody, zoe, Kael. Доставка system-to-system через их API/webhook. -- Публичный доступ — через gnexus.space (nginx), внутренняя сеть 192.168.1.0/24. +- Публичный доступ — через gnexus.space (nginx), внутренняя сеть 192.168.1.0/24. Домен Synapse — **synapse.gnexus.space**; рантбук развёртывания для агента на целевой машине — docs/08 (OAuth-клиент владелец регистрирует после подъёма, §5). ## Рабочие правила diff --git a/docs/08-deploy-runbook.md b/docs/08-deploy-runbook.md index ffc12cb..7a57537 100644 --- a/docs/08-deploy-runbook.md +++ b/docs/08-deploy-runbook.md @@ -1,22 +1,23 @@ # 08 · Рантбук развёртывания Synapse (для ИИ-агента) Пошаговая инструкция для ИИ-агента, разворачивающего Synapse на проде. -Агент работает на целевом хосте с shell-доступом (docker, git). Всё, что -не определено этим документом и `.env`-примером — **подтверждать у владельца, -не выбирать молча** (см. открытые вопросы в CLAUDE.md). +Агент работает на целевом хосте с shell-доступом (docker, git). Основные +развилки уже решены владельцем (§0); всё, что сверх этого, не описано +документом и `.env`-примером — **подтверждать у владельца, не выбирать +молча** (см. открытые вопросы в CLAUDE.md). -## 0. Подтвердить у владельца до старта +## 0. Решения владельца (2026-10-04, зафиксированы) -1. **Хост** — VM на libvirt или существующий VPS (открытый вопрос №1 CLAUDE.md). -2. **Домен** — synapse.gnexus.space? (публичный вход через nginx gnexus.space, - внутренняя сеть 192.168.1.0/24). -3. **Telegram-бот** — новый или существующий токен (вопрос №2; слот - `telegram_bot_token` создаётся через админку, канал #29). -4. **OAuth-клиент в gnexus-auth** — зарегистрирован ли; если нет, кто создаёт - (владелец на сервере auth или агент с доступом к админке auth). Понадобятся: - redirect URI = `https://<домен>/auth/callback`, скоупы - `openid email profile roles permissions`, вебхук `auth.logout` / - `auth.global_logout` / `session.revoked` → `GAUTH_WEBHOOK_SECRET`. +1. **Хост** — целевая машина, на которой работает агент (VM/VPS-развилка + не важна); рантбук рассчитан на любой docker-хост. +2. **Домен** — `synapse.gnexus.space`, публичный вход через nginx + gnexus.space, TLS по его сертификату (§4). +3. **Telegram-бот** — отложен: канал добавляется позже (задача #29); + слот `telegram_bot_token` тогда создадут через админку (Настройки). + Не искать токен, не ставить в .env. +4. **OAuth-клиент в gnexus-auth** — владелец регистрирует **в процессе + настройки, после развёртывания** (§5). Стек поднимается и без него: + healthz/приём событий/воркер работают, SPA-вход — после §5. ## 1. Предполёт (checklist) @@ -44,7 +45,7 @@ |---|---| | `POSTGRES_PASSWORD`, `DATABASE_URL` | `openssl rand -hex 16` в пароль (одинаковый в обоих полях) | | `GAUTH_BASE_URL` | URL prod-gnexus-auth (192.168.1.167), согласовать схему (http/https) | -| `GAUTH_CLIENT_ID` / `GAUTH_CLIENT_SECRET` | зарегистрированный OAuth-клиент в gnexus-auth (шаг 0.4) | +| `GAUTH_CLIENT_ID` / `GAUTH_CLIENT_SECRET` | зарегистрированный OAuth-клиент в gnexus-auth (§5; до этого можно оставить placeholder — вход в SPA не работает, стек работает) | | `GAUTH_REDIRECT_URI` | `https://<домен>/auth/callback` | | `SPA_PUBLIC_URL` | пусто (тот же origin — SPA раздаётся этим же контейнером, docs/06) | | `GAUTH_WEBHOOK_SECRET` | секрет вебхука клиента в gnexus-auth (показывается один раз) | @@ -87,7 +88,30 @@ Smoke: `https://<домен>/` открывает SPA, `GET /api/healthz` зелёный. `GET /mcp` без токена → 401 (MCP включён) или 200 index (не включён) — не 500. -## 5. SSO smoke +## 5. OAuth-клиент в gnexus-auth (владелец, после подъёма) + +Стек уже живёт; вход в SPA включен этим шагом. Попросить владельца +зарегистрировать в gnexus-auth приложение Synapse с настройками: + +- redirect URI: `https://synapse.gnexus.space/auth/callback` +- скоупы: `openid email profile roles permissions` +- вебхуки: `auth.logout`, `auth.global_logout`, `session.revoked` → + endpoint `https://synapse.gnexus.space/auth/webhooks` (маршрут + `POST /auth/webhooks`, секрет = значение ниже) +- из формы выдачи взять: `GAUTH_CLIENT_ID`, `GAUTH_CLIENT_SECRET`, + `GAUTH_WEBHOOK_SECRET` (секрет показывается один раз) → в `.env` + и в gnexus-creds. + +Затем перезаписать `.env` и перечитать конфиг: + +```bash +docker compose up -d # api пересоздаётся с новыми GAUTH_* +``` + +Проверка: `curl -s localhost:8013/auth/login -o /dev/null -w '%{http_code}\n'` +→ `302` на authorize gnexus-auth (до §5 будет ошибка/401 — это ок). + +## 6. SSO smoke 1. Открыть `https://<домен>/` → редирект на gnexus-auth → логин владельца (роль `admin`/`superadmin`) → колбэк → дашборд. @@ -96,7 +120,7 @@ 3. Логаут (`POST /auth/logout` + вебхук из gnexus-auth) завершает сессию: через ~45 сек SPA после 401 уходит на `/login` (single sign-out, CLAUDE.md). -## 6. Push-канал (если включаем сразу) +## 7. Push-канал (если включаем сразу) 1. Сгенерировать пару VAPID по рецепту docs/06-settings-pwa.md («Как задать VAPID»): `docker compose exec api python3 - <