netpulse-migrate замість PowerShell-скрипта: у контейнері немає ані psql, ані PowerShell, а тягнути клієнт Postgres в образ заради одного запуску — це половина дистрибутива на порожньому місці. Міграції вшиті через embed і переїхали в server/migrations: embed не бачить нічого за межами кореня свого модуля, а міграції поруч із бінарником, який їх накочує, не можуть розійтися версіями. Накочування під advisory-блокуванням: два інстанси при rolling update інакше застосували б ту саму міграцію двічі. Кожен файл в одній транзакції разом із записом у schema_migrations; виняток — continuous aggregates, які TimescaleDB забороняє в транзакції. Змінена вже застосована міграція зупиняє запуск: у різних інсталяціях інакше опиниться різна схема під одним номером. Перевірено на чистій базі: 23 міграції, 101 таблиця, повторний запуск каже «схема актуальна». Веб віддає сам API через embed: на self-hosted це прибирає з інструкції встановлення цілий компонент. Три політики кешування — назавжди для assets із хешем у імені, ніколи для index.html, коротко для решти. Знайдено живим прогоном: невідомий шлях під /api/ віддавав 200 з index.html, і клієнт падав на розборі HTML як JSON замість чесного 404. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
58 lines
3.5 KiB
SQL
58 lines
3.5 KiB
SQL
-- =====================================================================
|
||
-- NetPulse :: 0016_templates_any_check.sql
|
||
-- Шаблон перестає бути «набором OID» і стає набором перевірок будь-якого
|
||
-- типу: пінг, HTTP, SNMP.
|
||
--
|
||
-- Причина проста: «як опитувати цей клас пристроїв» — це одне рішення, і
|
||
-- ділити його на «пінг заводиться руками, а SNMP шаблоном» означає
|
||
-- змусити людину пам'ятати, що саме шаблон покриває, а що ні.
|
||
-- =====================================================================
|
||
|
||
-- Параметри перевірки для типів, які не описуються одним OID:
|
||
-- {"count":3,"packet_size":56} для icmp.ping, {"url":"…"} для http.status.
|
||
ALTER TABLE tpl.items
|
||
ADD COLUMN params jsonb NOT NULL DEFAULT '{}'::jsonb;
|
||
|
||
-- OID і ключ метрики більше не обов'язкові: у пінга немає ані того, ані
|
||
-- іншого — його метрики фіксовані самим типом перевірки.
|
||
ALTER TABLE tpl.items ALTER COLUMN oid DROP NOT NULL;
|
||
ALTER TABLE tpl.items ALTER COLUMN metric_key DROP NOT NULL;
|
||
|
||
-- ---------------------------------------------------------------------
|
||
-- Один чек на елемент для негрупованих типів
|
||
-- ---------------------------------------------------------------------
|
||
|
||
-- Пачкою в один PDU збираються лише OID (snmp.get). Два пінги з різними
|
||
-- параметрами в одному чеку не існують, тому для решти типів елемент
|
||
-- шаблону відповідає окремому чеку — і його треба вміти впізнати.
|
||
--
|
||
-- Ключ елемента, а не його id: SaveTemplate перезаписує елементи цілком,
|
||
-- тож id живуть недовго, а ключ стабільний за визначенням.
|
||
ALTER TABLE core.checks
|
||
ADD COLUMN template_item_key text NOT NULL DEFAULT '';
|
||
|
||
DROP INDEX IF EXISTS core.checks_template_uniq;
|
||
CREATE UNIQUE INDEX checks_template_uniq
|
||
ON core.checks (device_id, template_id, check_type, interval_sec, template_item_key)
|
||
WHERE template_id IS NOT NULL;
|
||
|
||
-- ---------------------------------------------------------------------
|
||
-- Вбудований шаблон доступності
|
||
--
|
||
-- Пінг — єдина перевірка, яка працює будь-де без налаштування, тому
|
||
-- саме він має бути тим шаблоном, який чіпляють першим.
|
||
-- ---------------------------------------------------------------------
|
||
|
||
INSERT INTO tpl.templates (id, tenant_id, key, name, description, vendor, is_builtin) VALUES
|
||
('00000000-0000-0000-0000-0000000000c5'::uuid, NULL, 'icmp-basic',
|
||
'Доступність (ICMP)',
|
||
'Пінг раз на 30 секунд: час відгуку, втрати, джитер. Працює будь-де без доступів і є основою для правил недоступності.',
|
||
NULL, true)
|
||
ON CONFLICT DO NOTHING;
|
||
|
||
INSERT INTO tpl.items
|
||
(template_id, key, name, check_type, oid, metric_key, unit, scale, interval_sec, params)
|
||
VALUES
|
||
('00000000-0000-0000-0000-0000000000c5', 'ping', 'Пінг',
|
||
'icmp.ping', NULL, NULL, 'ms', 1, 30, '{"count":3,"packet_size":56}'::jsonb)
|
||
ON CONFLICT DO NOTHING;
|