-- GHard Monitor: схема SQLite.
-- Время — UTC ISO-8601 (строки, лексикографически сортируются корректно).
CREATE TABLE IF NOT EXISTS servers (
id INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT NOT NULL, -- отображаемое имя, задаётся в UI
hostname TEXT NOT NULL DEFAULT '', -- как назвался агент
os TEXT NOT NULL DEFAULT '',
kernel TEXT NOT NULL DEFAULT '',
ips_json TEXT NOT NULL DEFAULT '[]', -- адреса интерфейсов из пакета агента
source_ip TEXT NOT NULL DEFAULT '', -- адрес входящего соединения
note TEXT NOT NULL DEFAULT '', -- заметка: одна на сервер, edit в UI
key_hash TEXT NOT NULL UNIQUE, -- sha256 ключа агента (plaintext нигде не храним)
interval INTEGER NOT NULL DEFAULT 30, -- интервал агента, сек (для детекта offline)
created_at TEXT NOT NULL,
last_seen TEXT -- время последнего ingest (по часам panel)
);
CREATE TABLE IF NOT EXISTS metrics (
id INTEGER PRIMARY KEY AUTOINCREMENT,
server_id INTEGER NOT NULL REFERENCES servers(id) ON DELETE CASCADE,
ts TEXT NOT NULL, -- timestamp пакета (агент или panel)
cpu REAL NOT NULL DEFAULT 0, -- cpu, %
load1 REAL NOT NULL DEFAULT 0,
load5 REAL NOT NULL DEFAULT 0,
load15 REAL NOT NULL DEFAULT 0,
ram_used INTEGER NOT NULL DEFAULT 0,
ram_total INTEGER NOT NULL DEFAULT 0,
swap_used INTEGER NOT NULL DEFAULT 0,
swap_total INTEGER NOT NULL DEFAULT 0,
uptime INTEGER NOT NULL DEFAULT 0, -- сек
net_in_mbs REAL NOT NULL DEFAULT 0, -- суммарный вход, МБ/с (panel считает по дельте)
net_out_mbs REAL NOT NULL DEFAULT 0, -- суммарный выход, МБ/с
disks_json TEXT NOT NULL DEFAULT '[]',
net_json TEXT NOT NULL DEFAULT '[]', -- сырые счётчики интерфейсов — для следующей дельты
processes_json TEXT NOT NULL DEFAULT '[]',
docker_json TEXT NOT NULL DEFAULT '[]',
extra_json TEXT NOT NULL DEFAULT '{}' -- temps, smart и прочее, что panel пока не разбирает
);
CREATE INDEX IF NOT EXISTS idx_metrics_server_ts ON metrics(server_id, ts);
CREATE TABLE IF NOT EXISTS events (
id INTEGER PRIMARY KEY AUTOINCREMENT,
server_id INTEGER REFERENCES servers(id) ON DELETE CASCADE,
type TEXT NOT NULL, -- cpu_high, server_offline, disk_added, ...
severity TEXT NOT NULL DEFAULT 'info', -- info | warning | critical
message TEXT NOT NULL,
data_json TEXT NOT NULL DEFAULT '{}',
ts TEXT NOT NULL,
acknowledged INTEGER NOT NULL DEFAULT 0
);
CREATE INDEX IF NOT EXISTS idx_events_server_ts ON events(server_id, ts);