Netpulse_SasS/server/migrations/0016_templates_any_check.sql
byrsapty 205dd5e079 Пакування: runner міграцій і вшитий у бінарник фронтенд
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>
2026-08-25 01:01:55 +03:00

58 lines
3.5 KiB
SQL
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

-- =====================================================================
-- 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;