diff --git a/EventHubBackSpec.md b/EventHubBackSpec.md index 2a0d7c9..9b00036 100644 --- a/EventHubBackSpec.md +++ b/EventHubBackSpec.md @@ -163,9 +163,12 @@ EventHub — платформа для управления событиями - `GET /v1/admin/audit` — просмотр аудита. #### 2.10.3. Статистика для дашборда с учётом ролей -- `GET /v1/admin/stats` — базовая статистика (количество пользователей, событий, бронирований). -- В будущем планируется расширенная аналитика на основе данных из таблицы `stats`. - +- `GET /v1/admin/stats` — агрегированная статистика дашборда (totals, by_day, breakdowns по роли). +- Section endpoints: `GET /v1/admin/{users|events|calendars|reviews|reports|tickets|subscriptions}/stats`. +- Источник агрегатов: `stats_collector` (Mnesia `detailed` subscribe) → ETS → upsert в `stats_counter` / `stats_daily` (#42, развитие #16). +- Totals (`*_total`) — `mnesia:table_info(size)` где достаточно; by_status / by_role / by_type / by_day — из счётчиков. +- Tops (все 9 полей section stats) — ETS `stats_tops` (#45, #46); avg resolution — running sum/count (#44); per-admin — индексы (#43). +- Retention дневных бакетов: 730 дней. При старте — load из Mnesia или backfill. ### 2.11. Real-time уведомления (WebSocket) - Пользовательский WebSocket (порт 8081): подписка на обновления событий календаря. - Административный WebSocket (порт 8446): подписка на новые жалобы и тикеты. @@ -212,8 +215,7 @@ EventHub — платформа для управления событиями - Логирование в JSON-формате. - Экспорт метрик для Prometheus (HTTP-эндпоинт `/metrics`). - Встроенный Observer Web для мониторинга Erlang-системы. -- Сбор статистики использования (события, бронирования, отзывы) через триггеры Mnesia с сохранением в таблице `stats` (задача #16). - +- Сбор admin-статистики через триггеры Mnesia (`detailed` subscribe): upsert-счётчики `stats_counter` и дневные бакеты `stats_daily` (#42; ранее пробный append-only `stats` в #16). ### 3.5. CI/CD - Контейнеризация (Docker). - Makefile для автоматизации задач. @@ -249,6 +251,7 @@ src/ ## 6. ОСНОВНЫЕ API (КРАТКО) ### Пользовательские (порт 8080) +- `GET /health` — health + build identity: `status`, `service`, `version`, `build`, `git_sha`, `built_at` (как admin health). - `POST /v1/register` — регистрация. - `POST /v1/login` — вход. - `POST /v1/refresh` — обновление токена. @@ -274,7 +277,7 @@ src/ - `GET /v1/calendars/:calendar_id/view?month=YYYY-MM` — HTML-календарь (владелец), включая архив. ### Административные (порт 8445) -- `GET /admin/health` и `GET /v1/admin/health` — состояние сервера + build identity: `status`, `service`, `version` (из `VERSION` / `EVENTHUB_VERSION`), `git_sha`, `built_at`. `/admin/health` — CT/Traefik; `/v1/admin/health` — admin SPA. +- `GET /admin/health` и `GET /v1/admin/health` — состояние сервера + build identity: `status`, `service`, `version` (`MAJOR.MINOR` из `EventHubSpec/VERSION`), `build` (CI `run_number`, per-repo), `git_sha`, `built_at`. `/admin/health` — CT/Traefik; `/v1/admin/health` — Admin UI. - `GET /v1/admin/stats` — агрегированная статистика дашборда. - `POST /v1/admin/login` — вход администратора. - `POST /v1/admin/refresh` — обновление пары access/refresh JWT администратора. @@ -371,7 +374,7 @@ src/ - Дисковое хранение и индексы (задача #13) - Репликация между узлами кластера с автоочисткой (задача #14) - Архивирование исторических данных и серверный рендеринг календаря (задача #15) -- Сбор статистики через триггеры Mnesia (задача #16) +- Сбор статистики через триггеры Mnesia: upsert `stats_counter` / `stats_daily` (#42, развитие #16) - Механизм миграций схемы данных (задача #17) ## 8. ОГРАНИЧЕНИЯ И ДОПУЩЕНИЯ diff --git a/EventHubFrontAdminSpec.md b/EventHubFrontAdminSpec.md index 6df0388..5496cf2 100644 --- a/EventHubFrontAdminSpec.md +++ b/EventHubFrontAdminSpec.md @@ -213,7 +213,7 @@ ## 7. Развёртывание -- Product version: файл `VERSION` (`MAJOR.MINOR`); в CI bake как `VITE_APP_*`. Образы: `sha-<12>` + floating `:ift` / `:stage` (см. `EventHubSpec/WORKFLOW.md` §6). +- Product version: SoT `EventHubSpec/VERSION` (`MAJOR.MINOR`); CI bake `VITE_APP_VERSION` + `VITE_APP_BUILD` (`run_number`) + `VITE_GIT_SHA` / `VITE_BUILT_AT`. В UI: `Admin UI {version}.{build} ({sha})`, API из `/v1/admin/health`. Образы: `sha-<12>` + floating `:ift` / `:stage` (см. `EventHubSpec/WORKFLOW.md` §6). - Production-сборка: `npm run build` → папка `dist/`. - Docker-образ на основе Nginx Alpine. - Контейнер подключается к сети `eventhub_network`. diff --git a/VERSION b/VERSION new file mode 100644 index 0000000..49d5957 --- /dev/null +++ b/VERSION @@ -0,0 +1 @@ +0.1 diff --git a/WORKFLOW.md b/WORKFLOW.md index 8fd328d..8900557 100644 --- a/WORKFLOW.md +++ b/WORKFLOW.md @@ -191,34 +191,57 @@ Issue: https://git.sabilin.com/EventHub/EventHubBack/issues/24 ## 6. Версии и деплой (IFT / stage) -### Product version (`VERSION`) +### Product version (`EventHubSpec/VERSION`) -В корне `EventHubBack` и `EventHubFrontAdmin` лежит файл **`VERSION`** в формате **`MAJOR.MINOR`** (сейчас `0.1`). +Единый источник правды: **`EventHubSpec/VERSION`** — формат **`MAJOR.MINOR`** (сейчас `0.1`). -- Бампается **вручную и редко** (релиз продуктовой линейки), не на каждый push. -- Patch-уровень SemVer **не** используется для stage-деплоев. -- Ручные git-теги `v*` для выкладки на stage **не** нужны. +- Бампается **вручную и редко** (смена продуктовой линейки). +- В `EventHubBack` / `EventHubFrontAdmin` (и будущем client UI) файл `VERSION` — только **fallback** для локальных сборок без доступа к Spec. +- CI на push/PR **читает Spec** (`scripts/resolve-product-version.sh`), не локальный файл (если Spec доступен). -### Идентичность сборки +### Build number -| Поле | Откуда | Назначение | -|------|--------|------------| -| product version | `VERSION` | «линейка» продукта | -| git sha | `GITHUB_SHA` (12 символов) | точная сборка | -| built_at | время CI UTC | диагностика | +| Поле | Откуда | Одинаково между репо? | +|------|--------|------------------------| +| `version` (`MAJOR.MINOR`) | `EventHubSpec/VERSION` | **да** | +| `build` | `GITHUB_RUN_NUMBER` workflow CI | **нет** (у каждого репо свой счётчик) | +| `git_sha` | `GITHUB_SHA` (12 символов) | нет | +| `built_at` | время CI UTC | нет | -- **FrontAdmin:** bake в Vite (`VITE_APP_VERSION`, `VITE_GIT_SHA`, `VITE_BUILT_AT`) на шаге CI. -- **Back:** bake в Docker image (`EVENTHUB_VERSION`, `EVENTHUB_GIT_SHA`, `EVENTHUB_BUILT_AT`) → `GET /admin/health` и `GET /v1/admin/health` (`version`, `git_sha`, `built_at`). -- В UI (меню профиля): `Admin 0.1 (sha)` + `API 0.1 (sha)`. +### Идентичность сборки (health / UI) + +**API** (`GET /health`, `GET /admin/health`, `GET /v1/admin/health`): + +```json +{ + "status": "ok", + "service": "eventhub", + "version": "0.1", + "build": 338, + "git_sha": "2b65a804d354", + "built_at": "2026-07-17T18:00:00Z" +} +``` + +- **Back:** bake `EVENTHUB_VERSION`, `EVENTHUB_BUILD`, `EVENTHUB_GIT_SHA`, `EVENTHUB_BUILT_AT`. +- **Admin UI:** bake `VITE_APP_VERSION`, `VITE_APP_BUILD`, `VITE_GIT_SHA`, `VITE_BUILT_AT`. +- **Client UI (будущее):** те же `VITE_APP_*`, лейбл компонента — `UI`. + +Отображение в Admin UI (меню профиля): + +- `Admin UI 0.1.341 (eb37476)` +- `API 0.1.338 (2b65a804d354)` + +Третье число в лейбле — **build**, не semver-patch релиза. ### Registry / окружения | Окружение | Тег образа | Когда | |-----------|------------|--------| | IFT / push CI | `sha-<12>` + floating `:ift` / `:dev` | после зелёного CI | -| Stage | тот же `sha-<12>` + floating `:stage` | auto после успешного CI на `master` (`deploy-stage.yml` → promote + SSH deploy) | +| Stage | тот же `sha-<12>` + floating `:stage` | auto после успешного CI на `master` | -IFT и stage крутят **одну и ту же** сборку `sha-*`. Product version из `VERSION` на деплой не влияет. +IFT и stage крутят **одну и ту же** сборку `sha-*`. Product version / build на выбор тега деплоя не влияют. ### E2E Admin UI (Playwright)