| 2026-10-03 |
Routing Engine полный (#30): payload-матчинг, all/first, шумодав, ретраи
...
- условия правила: payload-матч (точный по top-level ключам, список = any-of)
- ROUTING_MATCH_MODE=all|first (дефолт all — применяются все подошедшие)
- шумодав: throttle_seconds у правила, окно на (channel,target), skipped-
записи с аудит-текстом; critical проходит всегда (договор docs/05)
- ретраи: beat (worker -B) + synapse.retry_due раз в минуту, паузы
30с/2м/10м/30м, 5 попыток -> failed; миграция 0003 (throttle_seconds
+ status skipped в CHECK)
- CLI: --payload и --throttle у add-rule; README/.env.example/docs/04/05
Co-Authored-By: Claude Code <noreply@anthropic.com>
Eugene Sukhodolskiy
committed
23 hours ago
|
Ingestion (#31): приём событий по контракту docs/05
...
- POST /api/v1/events: Bearer-ключ -> source, анти-спуфинг (401/403/422),
дедуп по dedup_key в окне (DEDUP_WINDOW_SECONDS, дефолт 24ч), 202 мгновенно
- POST /api/v1/events/batch: честная частичная валидация по индексам,
202 при хоть одном принятом, dispatch строго после коммита
- GET /api/v1/events/{id}: статус + доставки, только своему источнику
- synapse.ingest: Routing Engine MVP — первое подошедшее правило по weight,
internal_log исполняется сразу (Jinja-рендер), каналы — #29/#28
- app/cli.py: create-source/create-key/add-type/add-target/add-rule для dev
Co-Authored-By: Claude Code <noreply@anthropic.com>
Eugene Sukhodolskiy
committed
23 hours ago
|
| 2026-10-02 |
Схема БД v1 (#34): 7 таблиц + миграция в alembic
...
Конфигурация: sources, api_keys (sha256-хэши, ротация), notification_types
(уникальная тройка source/subject/action), channel_targets (креды каналов —
не здесь, в .env), routing_rules (+actions, условия JSONB, weight).
Поток: events (UUID, dedup-индекс, expires_at, CHECK-статусы), deliveries
(attempts/next_retry_at, rendered_message — аудит).
- alembic upgrade head из пустой базы — проверено в контейнере
- ORM roundtrip всей цепочки — проверен, демо-данные вычищены
- docs/04-database.md: схема, решения, что сознательно не в таблицах
Co-Authored-By: Claude Code <noreply@anthropic.com>
Eugene Sukhodolskiy
committed
23 hours ago
|
dev-порт vite 5173 -> 5174 (5173 занят на машине)
...
Co-Authored-By: Claude Code <noreply@anthropic.com>
Eugene Sukhodolskiy
committed
1 day ago
|
SPA-редирект после callback на тот же origin (дефолт SPA_PUBLIC_URL пустой); порт 8013
...
Co-Authored-By: Claude Code <noreply@anthropic.com>
Eugene Sukhodolskiy
committed
1 day ago
|
Single sign-out: logout gnexus-auth отзывает токены Synapse через вебхуки
...
- logout в gnexus-auth НЕ отзывает OAuth-токены (проверено в его коде:
isUsable = только expiry/revoked) — значит SSO-выход доедает вебхук
- store_login: выданные при callback токены лежат в Redis по user_id (TTL 30d)
- webhook auth.logout / auth.global_logout / session.revoked ->
revoke access+refresh всех логинов пользователя на gnexus-auth + очистка
- POST /auth/logout: выход из Synapse отзывает все входы пользователя
- SPA: heartbeat adminMe каждые 45 c — 401 после logout в auth убивает
сессию SPA автоматически; 403 ведёт на denied
- порт 8001 -> 8012 (на локальной машине занят другим проектом)
Co-Authored-By: Claude Code <noreply@anthropic.com>
Eugene Sukhodolskiy
committed
1 day ago
|
SSO через gnexus-auth-client-py: OAuth-поток на сервере, без ввода токенов в UI
...
- /auth/login: state+PKCE в Redis (переживает рестарты), redirect на authorize
- /auth/callback: обмен кода, проверка system_role до выдачи токена,
не-админу access-токен сразу revoke; токены в URL-фрагменте
- /auth/refresh и /auth/revoke; SPA: кнопка входа, /oauth/callback,
тихий refresh по 401, логаут
- креды только из env (GAUTH_*), GAUTH_VERIFY_TLS для self-signed в LAN
Co-Authored-By: Claude Code <noreply@anthropic.com>
Eugene Sukhodolskiy
committed
1 day ago
|
Каркас #33: FastAPI + Celery + Postgres в докере, Vue 3 SPA на gnexus-ui-kit
...
- FastAPI: healthz/readyz, Swagger на /api/docs, раздача SPA-статики из того же контейнера
- Гейт админки по ролям gnexus-auth (opaque-токены, userinfo, admin/superadmin, 401/403)
- Celery-воркер (redis broker) с каркасной задачей synapse.ping
- Alembic настроен на DATABASE_URL из .env, миграций пока нет (#34)
- docker-compose: api, worker, postgres, redis — одна команда, миграции при старте
- frontend: Vue 3 + Vite + gnexus-ui-kit (git-зависимость), вход-заглушка dev, дашборд, denied-экран
Co-Authored-By: Claude Code <noreply@anthropic.com>
Eugene Sukhodolskiy
committed
1 day ago
|