Netpulse_SasS/server/migrations/0017_backup_defaults.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

36 lines
2.2 KiB
SQL
Raw 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 :: 0017_backup_defaults.sql
-- Глобальний розклад збору конфігів плюс перевизначення на хості.
--
-- Досі розклад існував лише поштучно: щоб бекапити сто пристроїв, треба
-- було сто разів відкрити форму. Глобальне правило — це те, чим воно й
-- має бути: значення за замовчуванням, від якого хост може відступити.
-- =====================================================================
CREATE TABLE ncm.backup_defaults (
tenant_id uuid PRIMARY KEY REFERENCES core.tenants(id) ON DELETE CASCADE,
enabled boolean NOT NULL DEFAULT false,
cron text NOT NULL DEFAULT '0 3 * * *',
-- Профіль і доступ теж можуть бути спільними: у більшості мереж
-- обладнання однорідне, і задавати їх поштучно — марна робота.
profile_id uuid REFERENCES ncm.profiles(id) ON DELETE SET NULL,
credential_id uuid REFERENCES inv.credentials(id) ON DELETE SET NULL,
updated_at timestamptz NOT NULL DEFAULT now()
);
-- Чи слідує хост глобальному розкладу.
--
-- Прапорець, а не порівняння значень: розклад хоста може випадково
-- збігтися з глобальним, і тоді зміна глобального мовчки потягла б за
-- собою хост, який навмисно налаштували окремо.
ALTER TABLE ncm.device_policies
ADD COLUMN follows_default boolean NOT NULL DEFAULT false;
ALTER TABLE ncm.backup_defaults ENABLE ROW LEVEL SECURITY;
ALTER TABLE ncm.backup_defaults FORCE ROW LEVEL SECURITY;
CREATE POLICY tenant_isolation ON ncm.backup_defaults
USING (tenant_id = core.current_tenant())
WITH CHECK (tenant_id = core.current_tenant());
GRANT SELECT, INSERT, UPDATE, DELETE ON ncm.backup_defaults
TO netpulse_app, netpulse_worker;