Модель данных инфраструктурного портала
Связано: Инфраструктурный портал и мониторинг — план работ Связано: Инфраструктурный портал и мониторинг — backlog исполнения Связано: Архитектура мониторинга и портала Связано: Inventory серверов и VPS — черновик структуры
Назначение
Зафиксировать сущности, их поля и связи. Без модели данных UI и discovery будут хаотичными и их придётся переделывать.
Принцип разделения данных
- Live-discovered — собирается автоматически с хостов.
- Manual inventory — хранится в
infra-inventory.yaml, сшивается поserver.id. - В UI оба источника объединяются, но в backend-модели они разделены.
Сущности MVP
1. Server
Источник: live + inventory
| Поле | Источник | Описание |
|---|---|---|
id | inventory | canonical short id: assist, assistai, api |
hostname | live | фактический hostname |
public_ip | inventory | внешний IP |
os | live | ОС и версия |
cpu_cores | live | кол-во ядер |
ram_gb | live | всего RAM |
disk_gb | live | всего диска |
uptime | live | аптайм |
provider | inventory | VPS-провайдер |
location | inventory | регион/ДЦ |
plan | inventory | тариф |
paid_till | inventory | оплачено до |
days_left | inventory | остаток дней |
purpose | inventory | назначение |
roles | inventory | роли сервера |
notes | inventory | заметки |
2. Disk
Источник: live
| Поле | Источник |
|---|---|
server_id | live |
device | live |
size_gb | live |
type | live (nvme/ssd/hdd) |
3. Partition
Источник: live
| Поле | Источник |
|---|---|
server_id | live |
device | live |
mountpoint | live |
fstype | live |
size_gb | live |
used_gb | live |
free_gb | live |
used_pct | live |
inodes_total | live |
inodes_used_pct | live |
4. Service (systemd)
Источник: live
| Поле | Источник |
|---|---|
server_id | live |
name | live |
status | live (active/inactive/failed) |
enabled | live |
5. Container (docker)
Источник: live
| Поле | Источник |
|---|---|
server_id | live |
name | live |
image | live |
status | live |
ports | live |
mounts | live |
networks | live |
6. Port (listening)
Источник: live
| Поле | Источник |
|---|---|
server_id | live |
port | live |
protocol | live (tcp/udp) |
bind | live (127.0.0.1 / 0.0.0.0 / ::) |
process | live |
linked_service | derived |
linked_container | derived |
7. Route (Caddy)
Источник: live
| Поле | Источник |
|---|---|
server_id | live |
domain | live |
upstream | live (например 127.0.0.1:18789) |
tls_expiry | live |
8. Domain (public)
Источник: live + inventory
| Поле | Источник |
|---|---|
name | live |
server_id | live |
route_id | live |
tls_expiry | live |
purpose | inventory (опционально) |
9. VPS metadata
Источник: inventory
Поля совпадают с Server inventory-частью: provider, location, plan, paid_till, days_left, purpose, roles, notes, плюс billing.* второй очереди.
Связи
Основные связи
Server 1 — N DiskServer 1 — N PartitionServer 1 — N ServiceServer 1 — N ContainerServer 1 — N PortServer 1 — N RouteServer 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.upstream→Port— поhost:portсопоставлению.
Canonical naming
server.id— lowercase, без домена:assist,assistai,api.server.hostname— FQDN.domain.name— FQDN без схемы.route.upstream—host: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 без переделок.