v1.1.0: Alembic, pytest, домен и документация
- Миграции PostgreSQL через Alembic; DDL убран из lifespan приложения. - Тесты: health, status, ingress Grafana; моки Vault/Grafana/Forgejo. - Пакет onguard24/domain/ (сущности, шина событий), docs/DOMAIN.md. - Обновлены README, CHANGELOG, ARCHITECTURE. Made-with: Cursor
This commit is contained in:
@ -1,15 +1,18 @@
|
||||
# Архитектура onGuard24 (для разработки и доработок)
|
||||
|
||||
Цель продукта: **модульный монолит** в духе IRM — ядро + подключаемые области (дежурства, контакты, «светофор» по сервисам). Текущая версия — **каркас v1**: HTTP, БД, ingress Grafana, проверки интеграций.
|
||||
Цель продукта: **модульный монолит** в духе IRM — ядро + подключаемые области (дежурства, контакты, «светофор» по сервисам). Текущая версия — **каркас v1.1**: HTTP, БД, ingress Grafana, проверки интеграций, Alembic, задел домена в `onguard24/domain/`.
|
||||
|
||||
## Дерево пакетов
|
||||
|
||||
```
|
||||
onGuard24/
|
||||
├── alembic/ # Ревизии миграций PostgreSQL (Alembic)
|
||||
├── alembic.ini
|
||||
├── onguard24/
|
||||
│ ├── main.py # FastAPI app, lifespan, маршруты верхнего уровня
|
||||
│ ├── config.py # Settings: .env из корня репозитория (не от cwd)
|
||||
│ ├── db.py # asyncpg pool, миграция ingress_events
|
||||
│ ├── db.py # asyncpg pool (без DDL)
|
||||
│ ├── domain/ # Сущности и шина событий (задел под модули)
|
||||
│ ├── status_snapshot.py # Единый сборщик JSON для /api/v1/status
|
||||
│ ├── root_html.py # HTML главной страницы со статусами
|
||||
│ ├── vaultcheck.py # Vault /v1/sys/health
|
||||
@ -20,6 +23,8 @@ onGuard24/
|
||||
│ └── modules/ # Заглушки: schedules, contacts, statusboard
|
||||
├── web/ # Vite + React (опционально)
|
||||
├── pyproject.toml
|
||||
├── pytest.ini
|
||||
├── tests/ # pytest: health, status, ingress
|
||||
├── CHANGELOG.md
|
||||
└── docs/
|
||||
```
|
||||
@ -35,8 +40,8 @@ onGuard24/
|
||||
| Задача | Место |
|
||||
|--------|--------|
|
||||
| Новый HTTP-роут модуля | `onguard24/modules/<name>.py` + `include_router` в `main.py` |
|
||||
| Общая логика инцидентов / событий | позже: `onguard24/core/` или сервисный слой + события из БД |
|
||||
| Новая таблица БД | пока: SQL в `db.py` (MIGRATION_00N); позже: Alembic |
|
||||
| Общая логика инцидентов / событий | задел: `onguard24/domain/` + [DOMAIN.md](DOMAIN.md); позже сервисный слой и БД |
|
||||
| Новая таблица БД | Alembic: `alembic revision`, правка `alembic/versions/`, `alembic upgrade head` |
|
||||
| Новая внешняя интеграция | `onguard24/integrations/<name>.py`, вызов из `status_snapshot` при необходимости |
|
||||
|
||||
## Конфигурация
|
||||
@ -46,10 +51,10 @@ onGuard24/
|
||||
## Зависимости между компонентами
|
||||
|
||||
- `status_snapshot.build(request)` читает `request.app.state.pool` и `request.app.state.settings` (устанавливаются в `lifespan`).
|
||||
- Модули **не** зависят друг от друга; общий контракт позже можно ввести через **таблицы БД** и **внутренние события** (ещё не реализовано).
|
||||
- Модули **не** зависят друг от друга; контракт заделан через **доменные события** (`domain/events.py`, `EventBus`) и описан в [DOMAIN.md](DOMAIN.md); проводка в HTTP пока не подключена.
|
||||
|
||||
## Известные ограничения v1
|
||||
## Известные ограничения
|
||||
|
||||
- Нет единой модели «инцидент» в БД — только сырой ingest в `ingress_events`.
|
||||
- Нет единой модели «инцидент» в БД — только сырой ingest в `ingress_events` (в коде есть Pydantic-модели в `domain/entities.py` как задел).
|
||||
- Нет очереди/воркеров для эскалаций.
|
||||
- Нет auth на GET `/api/v1/status` (только для внутренней сети / за reverse proxy с ограничением).
|
||||
|
||||
34
docs/DOMAIN.md
Normal file
34
docs/DOMAIN.md
Normal file
@ -0,0 +1,34 @@
|
||||
# Доменная модель onGuard24
|
||||
|
||||
Версия **1.1.0** вводит явные сущности и задел под **события** между модулями. Таблицы БД для инцидентов пока не добавлены — см. [Alembic](../alembic/versions/).
|
||||
|
||||
## Сущности (код: `onguard24/domain/entities.py`)
|
||||
|
||||
| Сущность | Назначение |
|
||||
|----------|------------|
|
||||
| **Alert** | Нормализованный алерт после парсинга webhook (Grafana и др.): `severity`, `labels`, `payload`. |
|
||||
| **Incident** | Жизненный цикл инцидента: статус, связь с алертами (`alert_ids`). |
|
||||
| **EscalationPolicy** / **EscalationStep** | Цепочка эскалаций (уведомления, паузы) — задел под модуль schedules/IRM. |
|
||||
|
||||
**Severity** — перечисление: `info`, `warning`, `critical`.
|
||||
|
||||
## События (код: `onguard24/domain/events.py`)
|
||||
|
||||
| Событие | Когда |
|
||||
|---------|--------|
|
||||
| **AlertReceived** (`name=alert.received`) | Алерт принят и (в будущем) сохранён/сопоставлен. |
|
||||
|
||||
**EventBus** — протокол; **InMemoryEventBus** — простая реализация для тестов и прототипа.
|
||||
|
||||
### Как модули подписываются (план)
|
||||
|
||||
1. Модуль реализует **`Module`**: свойство `name`, метод `on_event(event)`.
|
||||
2. При старте приложения модуль регистрируется: `bus.subscribe("alert.received", handler)`.
|
||||
3. После успешного INSERT в `ingress_events` (или нормализации) ядро вызывает `await bus.publish(AlertReceived(...))`.
|
||||
|
||||
Сейчас **ingress** ещё не публикует в шину — подключение в следующих версиях.
|
||||
|
||||
## Связь с БД
|
||||
|
||||
- **ingress_events** — сырой JSON от Grafana (`alembic` миграция `001_initial`).
|
||||
- Сущности **Alert** / **Incident** — пока только в памяти; позже — таблицы и маппинг.
|
||||
Reference in New Issue
Block a user