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:
Alexandr
2026-04-03 08:36:35 +03:00
parent 4da9b13a86
commit 85eb61b576
21 changed files with 611 additions and 32 deletions

View File

@ -14,19 +14,3 @@ async def create_pool(settings: Settings) -> asyncpg.Pool | None:
return None
dsn = normalize_dsn(settings.database_url.strip())
return await asyncpg.create_pool(dsn=dsn, min_size=1, max_size=10)
MIGRATION_001 = """
CREATE TABLE IF NOT EXISTS ingress_events (
id uuid PRIMARY KEY DEFAULT gen_random_uuid(),
source text NOT NULL,
received_at timestamptz NOT NULL DEFAULT now(),
body jsonb NOT NULL
);
CREATE INDEX IF NOT EXISTS ingress_events_received_at_idx ON ingress_events (received_at DESC);
"""
async def migrate(pool: asyncpg.Pool) -> None:
async with pool.acquire() as conn:
await conn.execute(MIGRATION_001)