Модель данных инфраструктурного портала

Связано: Инфраструктурный портал и мониторинг — план работ Связано: Инфраструктурный портал и мониторинг — backlog исполнения Связано: Архитектура мониторинга и портала Связано: Inventory серверов и VPS — черновик структуры

Назначение

Зафиксировать сущности, их поля и связи. Без модели данных UI и discovery будут хаотичными и их придётся переделывать.


Принцип разделения данных

  • Live-discovered — собирается автоматически с хостов.
  • Manual inventory — хранится в infra-inventory.yaml, сшивается по server.id.
  • В UI оба источника объединяются, но в backend-модели они разделены.

Сущности MVP

1. Server

Источник: live + inventory

ПолеИсточникОписание
idinventorycanonical short id: assist, assistai, api
hostnameliveфактический hostname
public_ipinventoryвнешний IP
osliveОС и версия
cpu_coresliveкол-во ядер
ram_gbliveвсего RAM
disk_gbliveвсего диска
uptimeliveаптайм
providerinventoryVPS-провайдер
locationinventoryрегион/ДЦ
planinventoryтариф
paid_tillinventoryоплачено до
days_leftinventoryостаток дней
purposeinventoryназначение
rolesinventoryроли сервера
notesinventoryзаметки

2. Disk

Источник: live

ПолеИсточник
server_idlive
devicelive
size_gblive
typelive (nvme/ssd/hdd)

3. Partition

Источник: live

ПолеИсточник
server_idlive
devicelive
mountpointlive
fstypelive
size_gblive
used_gblive
free_gblive
used_pctlive
inodes_totallive
inodes_used_pctlive

4. Service (systemd)

Источник: live

ПолеИсточник
server_idlive
namelive
statuslive (active/inactive/failed)
enabledlive

5. Container (docker)

Источник: live

ПолеИсточник
server_idlive
namelive
imagelive
statuslive
portslive
mountslive
networkslive

6. Port (listening)

Источник: live

ПолеИсточник
server_idlive
portlive
protocollive (tcp/udp)
bindlive (127.0.0.1 / 0.0.0.0 / ::)
processlive
linked_servicederived
linked_containerderived

7. Route (Caddy)

Источник: live

ПолеИсточник
server_idlive
domainlive
upstreamlive (например 127.0.0.1:18789)
tls_expirylive

8. Domain (public)

Источник: live + inventory

ПолеИсточник
namelive
server_idlive
route_idlive
tls_expirylive
purposeinventory (опционально)

9. VPS metadata

Источник: inventory

Поля совпадают с Server inventory-частью: provider, location, plan, paid_till, days_left, purpose, roles, notes, плюс billing.* второй очереди.


Связи

Основные связи

  • Server 1 — N Disk
  • Server 1 — N Partition
  • Server 1 — N Service
  • Server 1 — N Container
  • Server 1 — N Port
  • Server 1 — N Route
  • Server 1 — N Domain

Ключевая цепочка маршрутизации

Domain
  → Route (Caddy)
    → Port (localhost bind)
      → Service | Container

Это главная цепочка для topology view. Именно её надо строить и показывать кликабельной.

Производные связи (derived)

  • Port.linked_service — по process/имени сервиса.
  • Port.linked_container — по docker port binding.
  • Route.upstreamPort — по host:port сопоставлению.

Canonical naming

  • server.id — lowercase, без домена: assist, assistai, api.
  • server.hostname — FQDN.
  • domain.name — FQDN без схемы.
  • route.upstreamhost:port формат.
  • container.name — docker container name.
  • service.name — systemd unit name без .service.

Все сравнения и сшивки делать по canonical-форме, не по сырым строкам.


Формат обмена

  • Live-discovery отдаёт нормализованный JSON.
  • Структура:
{
  "servers": [ { "id": "...", ... } ],
  "disks": [...],
  "partitions": [...],
  "services": [...],
  "containers": [...],
  "ports": [...],
  "routes": [...],
  "domains": [...]
}
  • Inventory подмешивается на уровне Server и Domain по id.

Что не входит в MVP-модель

  • volumes и bind mounts как отдельные сущности — вторая очередь;
  • network interfaces как отдельная сущность — вторая очередь;
  • process tree — не входит;
  • logs — не входят, это отдельный слой;
  • alerts — модель алертов определяется после Grafana.

Критерий готовности модели

  • сущности и поля зафиксированы;
  • связи описаны;
  • canonical naming определён;
  • формат обмена зафиксирован;
  • понятно, что auto-discovered, а что ручное.

После этого можно строить discovery и UI без переделок.