docs: SoT product version EventHubSpec/VERSION + build in health.
MAJOR.MINOR from Spec; per-repo CI run_number as build; health exposes version/build/git_sha/built_at. Admin UI / API / UI labels documented in WORKFLOW. Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
+10
-7
@@ -163,9 +163,12 @@ EventHub — платформа для управления событиями
|
|||||||
- `GET /v1/admin/audit` — просмотр аудита.
|
- `GET /v1/admin/audit` — просмотр аудита.
|
||||||
|
|
||||||
#### 2.10.3. Статистика для дашборда с учётом ролей
|
#### 2.10.3. Статистика для дашборда с учётом ролей
|
||||||
- `GET /v1/admin/stats` — базовая статистика (количество пользователей, событий, бронирований).
|
- `GET /v1/admin/stats` — агрегированная статистика дашборда (totals, by_day, breakdowns по роли).
|
||||||
- В будущем планируется расширенная аналитика на основе данных из таблицы `stats`.
|
- 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)
|
### 2.11. Real-time уведомления (WebSocket)
|
||||||
- Пользовательский WebSocket (порт 8081): подписка на обновления событий календаря.
|
- Пользовательский WebSocket (порт 8081): подписка на обновления событий календаря.
|
||||||
- Административный WebSocket (порт 8446): подписка на новые жалобы и тикеты.
|
- Административный WebSocket (порт 8446): подписка на новые жалобы и тикеты.
|
||||||
@@ -212,8 +215,7 @@ EventHub — платформа для управления событиями
|
|||||||
- Логирование в JSON-формате.
|
- Логирование в JSON-формате.
|
||||||
- Экспорт метрик для Prometheus (HTTP-эндпоинт `/metrics`).
|
- Экспорт метрик для Prometheus (HTTP-эндпоинт `/metrics`).
|
||||||
- Встроенный Observer Web для мониторинга Erlang-системы.
|
- Встроенный Observer Web для мониторинга Erlang-системы.
|
||||||
- Сбор статистики использования (события, бронирования, отзывы) через триггеры Mnesia с сохранением в таблице `stats` (задача #16).
|
- Сбор admin-статистики через триггеры Mnesia (`detailed` subscribe): upsert-счётчики `stats_counter` и дневные бакеты `stats_daily` (#42; ранее пробный append-only `stats` в #16).
|
||||||
|
|
||||||
### 3.5. CI/CD
|
### 3.5. CI/CD
|
||||||
- Контейнеризация (Docker).
|
- Контейнеризация (Docker).
|
||||||
- Makefile для автоматизации задач.
|
- Makefile для автоматизации задач.
|
||||||
@@ -249,6 +251,7 @@ src/
|
|||||||
## 6. ОСНОВНЫЕ API (КРАТКО)
|
## 6. ОСНОВНЫЕ API (КРАТКО)
|
||||||
|
|
||||||
### Пользовательские (порт 8080)
|
### Пользовательские (порт 8080)
|
||||||
|
- `GET /health` — health + build identity: `status`, `service`, `version`, `build`, `git_sha`, `built_at` (как admin health).
|
||||||
- `POST /v1/register` — регистрация.
|
- `POST /v1/register` — регистрация.
|
||||||
- `POST /v1/login` — вход.
|
- `POST /v1/login` — вход.
|
||||||
- `POST /v1/refresh` — обновление токена.
|
- `POST /v1/refresh` — обновление токена.
|
||||||
@@ -274,7 +277,7 @@ src/
|
|||||||
- `GET /v1/calendars/:calendar_id/view?month=YYYY-MM` — HTML-календарь (владелец), включая архив.
|
- `GET /v1/calendars/:calendar_id/view?month=YYYY-MM` — HTML-календарь (владелец), включая архив.
|
||||||
|
|
||||||
### Административные (порт 8445)
|
### Административные (порт 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` — агрегированная статистика дашборда.
|
- `GET /v1/admin/stats` — агрегированная статистика дашборда.
|
||||||
- `POST /v1/admin/login` — вход администратора.
|
- `POST /v1/admin/login` — вход администратора.
|
||||||
- `POST /v1/admin/refresh` — обновление пары access/refresh JWT администратора.
|
- `POST /v1/admin/refresh` — обновление пары access/refresh JWT администратора.
|
||||||
@@ -371,7 +374,7 @@ src/
|
|||||||
- Дисковое хранение и индексы (задача #13)
|
- Дисковое хранение и индексы (задача #13)
|
||||||
- Репликация между узлами кластера с автоочисткой (задача #14)
|
- Репликация между узлами кластера с автоочисткой (задача #14)
|
||||||
- Архивирование исторических данных и серверный рендеринг календаря (задача #15)
|
- Архивирование исторических данных и серверный рендеринг календаря (задача #15)
|
||||||
- Сбор статистики через триггеры Mnesia (задача #16)
|
- Сбор статистики через триггеры Mnesia: upsert `stats_counter` / `stats_daily` (#42, развитие #16)
|
||||||
- Механизм миграций схемы данных (задача #17)
|
- Механизм миграций схемы данных (задача #17)
|
||||||
|
|
||||||
## 8. ОГРАНИЧЕНИЯ И ДОПУЩЕНИЯ
|
## 8. ОГРАНИЧЕНИЯ И ДОПУЩЕНИЯ
|
||||||
|
|||||||
@@ -213,7 +213,7 @@
|
|||||||
|
|
||||||
## 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/`.
|
- Production-сборка: `npm run build` → папка `dist/`.
|
||||||
- Docker-образ на основе Nginx Alpine.
|
- Docker-образ на основе Nginx Alpine.
|
||||||
- Контейнер подключается к сети `eventhub_network`.
|
- Контейнер подключается к сети `eventhub_network`.
|
||||||
|
|||||||
+39
-16
@@ -191,34 +191,57 @@ Issue: https://git.sabilin.com/EventHub/EventHubBack/issues/24
|
|||||||
|
|
||||||
## 6. Версии и деплой (IFT / stage)
|
## 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-деплоев.
|
- В `EventHubBack` / `EventHubFrontAdmin` (и будущем client UI) файл `VERSION` — только **fallback** для локальных сборок без доступа к Spec.
|
||||||
- Ручные git-теги `v*` для выкладки на stage **не** нужны.
|
- CI на push/PR **читает Spec** (`scripts/resolve-product-version.sh`), не локальный файл (если Spec доступен).
|
||||||
|
|
||||||
### Идентичность сборки
|
### Build number
|
||||||
|
|
||||||
| Поле | Откуда | Назначение |
|
| Поле | Откуда | Одинаково между репо? |
|
||||||
|------|--------|------------|
|
|------|--------|------------------------|
|
||||||
| product version | `VERSION` | «линейка» продукта |
|
| `version` (`MAJOR.MINOR`) | `EventHubSpec/VERSION` | **да** |
|
||||||
| git sha | `GITHUB_SHA` (12 символов) | точная сборка |
|
| `build` | `GITHUB_RUN_NUMBER` workflow CI | **нет** (у каждого репо свой счётчик) |
|
||||||
| built_at | время CI UTC | диагностика |
|
| `git_sha` | `GITHUB_SHA` (12 символов) | нет |
|
||||||
|
| `built_at` | время CI UTC | нет |
|
||||||
|
|
||||||
- **FrontAdmin:** bake в Vite (`VITE_APP_VERSION`, `VITE_GIT_SHA`, `VITE_BUILT_AT`) на шаге CI.
|
### Идентичность сборки (health / UI)
|
||||||
- **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)`.
|
**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 / окружения
|
### Registry / окружения
|
||||||
|
|
||||||
| Окружение | Тег образа | Когда |
|
| Окружение | Тег образа | Когда |
|
||||||
|-----------|------------|--------|
|
|-----------|------------|--------|
|
||||||
| IFT / push CI | `sha-<12>` + floating `:ift` / `:dev` | после зелёного CI |
|
| 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)
|
### E2E Admin UI (Playwright)
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user