@Eugene Sukhodolskiy Eugene Sukhodolskiy authored 23 minutes ago
alembic Каркас #33: FastAPI + Celery + Postgres в докере, Vue 3 SPA на gnexus-ui-kit 1 hour ago
app SPA-fallback вместо StaticFiles(html=True): /oauth/callback и прочие SPA-роуты отдают index.html 26 minutes ago
docker Каркас #33: FastAPI + Celery + Postgres в докере, Vue 3 SPA на gnexus-ui-kit 1 hour ago
frontend SPA на каркасе gnexus-ui-kit: GnNavigationShell + GnPageHeader 23 minutes ago
.env.example dev-порт vite 5173 -> 5174 (5173 занят на машине) 29 minutes ago
.gitignore Каркас #33: FastAPI + Celery + Postgres в докере, Vue 3 SPA на gnexus-ui-kit 1 hour ago
CLAUDE.md Single sign-out: logout gnexus-auth отзывает токены Synapse через вебхуки 34 minutes ago
Dockerfile Каркас #33: FastAPI + Celery + Postgres в докере, Vue 3 SPA на gnexus-ui-kit 1 hour ago
README.md dev-порт vite 5173 -> 5174 (5173 занят на машине) 29 minutes ago
alembic.ini Каркас #33: FastAPI + Celery + Postgres в докере, Vue 3 SPA на gnexus-ui-kit 1 hour ago
docker-compose.yml Локальный gnexus-auth: host-gateway для gnexus-auth.local в docker-compose 49 minutes ago
requirements.txt Каркас #33: FastAPI + Celery + Postgres в докере, Vue 3 SPA на gnexus-ui-kit 1 hour ago
README.md

Gnexus Synapse

Централизованный хаб уведомлений экосистемы Gnexus: сервисы присылают событие «что случилось», Synapse решает — кому, куда и каким каналом доставить (Telegram, Email, Push, внутренний лог, system-to-system в Navi).

Стек

  • API: Python, FastAPI, SQLAlchemy 2 + Alembic
  • Очередь: Celery + Redis
  • БД: PostgreSQL (в докере, вместе с приложением)
  • Админка: SPA на Vue 3 + Gnexus UI Kit, раздаётся статикой из контейнера FastAPI
  • Аутентификация: gnexus-auth (SSO), доступ к админке — роли admin и выше

Что уже в каркасе

  • FastAPI-приложение: /api/healthz (liveness), /api/readyz (зависимости), /api/docs (Swagger)
  • Гейт админки по ролям gnexus-auth: app/auth/deps.py (get_current_user → require_admin, 401/403)
  • Celery-воркер с каркасной задачей synapse.ping
  • Alembic (миграции пока пустые — схема БД в задаче #34)
  • Vue 3 SPA: вход (dev-заглушка), дашборд, экран «доступ запрещён» для роли ниже admin
  • docker-compose: api + worker + postgres + redis, миграции применяются при старте

Quickstart

cp .env.example .env   # заполнить пароль БД, gnexus-auth-креды появятся после регистрации клиента
docker compose up -d --build
curl http://localhost:8000/api/healthz

После сборки админка доступна на http://localhost:8000/ (SPA раздаёт контейнер api).

Локальная разработка без docker

# терминал 1 — API (нужны работающие Postgres/Redis, DATABASE_URL хост = localhost)
python -m venv .venv && source .venv/bin/activate
pip install -r requirements.txt
uvicorn app.main:app --reload

# терминал 2 — воркер
celery -A app.worker.celery_app worker --loglevel=info

# терминал 3 — SPA dev-сервер (проксирует /api на :8013)
cd frontend && npm install && npm run dev   # http://localhost:5174

Проверка воркера

docker compose exec api celery -A app.worker.celery_app call synapse.ping   # возвращает task id

Вход в админку

SSO-поток целиком на сервере (gnexus-auth-client-py, OAuth2 Authorization Code + PKCE):

  1. Зарегистрировать OAuth-клиент synapse в gnexus-auth, redirect URI — <публичный URL synapse>/auth/callback; креды в .env (GAUTH_*).
  2. GET /auth/login кладёт state+PKCE в Redis и уводит браузер на форму логина gnexus-auth.
  3. GET /auth/callback обменивает код, проверяет system_role: админ получает токен (access+refresh в URL-фрагменте), пользователю ниже admin токен не выдаётся — access-токен сразу revoke, браузер уходит на экран «Доступ запрещён».
  4. SPA делает тихое обновление токена через POST /auth/refresh, логаут — POST /auth/revoke. API продолжает проверять каждый запрос через GET /oauth/userinfo.

Проверка без живого gnexus-auth

curl -i http://localhost:8013/auth/login   # 302 на authorize endpoint с client_id/code_challenge/state

Структура

app/
  main.py            FastAPI: роуты API + статики SPA
  config.py          настройки из .env
  database.py        SQLAlchemy engine/session
  auth/deps.py       SSO-валидация + гейт ролей admin/superadmin
  api/routes.py      healthz, readyz, admin/me
  worker/            Celery: celery_app, tasks
alembic/             миграции (env.py читает DATABASE_URL из .env)
frontend/            Vue 3 SPA админки (сборка кладётся в spa_static/ образа)
docker/entrypoint.sh режимы api (миграции+uvicorn) / worker (celery)
docker-compose.yml   api, worker, postgres, redis

Roadmap (задачи gntodo, проект 9)

#33 скелет → #34 схема БД → #32 контракты API → #31 Ingestion → #30 Routing Engine → #29 Provider Adapters → #28 System-to-System (Navi) → #27 тесты и деплой.