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>
36 lines
2.2 KiB
SQL
36 lines
2.2 KiB
SQL
-- =====================================================================
|
||
-- 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;
|