# Приклад оточення для docker compose. Скопіювати в .env у корені # репозиторію й заповнити. Файл .env у git не потрапляє. # Домен, на який дивиться A-запис. Caddy візьме під нього сертифікат. NETPULSE_DOMAIN=netpulse.example.com # Пошта для Let's Encrypt: на неї приходять листи про проблеми з # продовженням сертифіката. Порожньо — ACME без контакту. ACME_EMAIL=admin@example.com # Пароль ролі netpulse у PostgreSQL — власника схеми. Ним ходять # міграції та утиліти netpulse-user і netpulse-secret. # openssl rand -hex 24 POSTGRES_PASSWORD= # --- ролі бази й Row Level Security ----------------------------------- # # Два паролі нижче — це вимикач другого рубежу ізоляції. # # Заповнені: API й колектор ходять у базу роллю netpulse_app БЕЗ # BYPASSRLS, тобто під політиками RLS, а фонові такти — окремою роллю # netpulse_worker. Забутий предикат tenant_id у коді дає порожній # результат замість чужих даних. # # Порожні: застосунок ходить роллю власника (суперкористувач), і жодна # з політик RLS не діє. Ізоляцію кабінетів тримає лише те, що кожен # запит у коді фільтрує tenant_id руками. # # НОВА ІНСТАЛЯЦІЯ: заповнити обидва, більше нічого не робити. # netpulse-migrate побачить порожню базу, накотить схему й сам видасть # ці паролі ролям — RLS працює з першого запуску. Установник заповнює # ці рядки за вас. # # ІНСТАЛЯЦІЯ, СТАРША ЗА 0063: не чіпати цих рядків, поки не пройдено # deploy/RLS-EXISTING-INSTALL.md. На непорожній базі мігратор паролів не # видає навмисно — там паролі видає людина, з перевіркою після кожного # кроку й зі шляхом назад. # # Обидва або жодного. Заповнений NETPULSE_APP_PASSWORD без # NETPULSE_WORKER_PASSWORD — найгірший стан із можливих: інтерфейс # працює, а бекапи, алерти й події мовчки не відбуваються. Мігратор # такої пари не приймає й зупиняє запуск. # # ТІЛЬКИ HEX, і це не стиль, а вимога. Пароль їде всередині DSN # postgres://роль:пароль@db, тому не кожен символ лишається собою: # `/` (звичайний символ base64) обриває пароль і перетворює його хвіст # на ім'я бази, а `%` читається як початок %XX і мовчки робить пароль # іншим рядком. У журналі це «database ... does not exist» або # «authentication failed», а на вигляд — «RLS усе зламав». # openssl rand -hex 24 NETPULSE_APP_PASSWORD= # openssl rand -hex 24 NETPULSE_WORKER_PASSWORD= # Ключ шифрування секретів (паролі SSH, SNMP-community). # Формат: =<32 байти hex>. Id потрібен для зміни ключа: старий # лишається в списку, щоб розшифрувати вже записане. # echo "np1=$(openssl rand -hex 32)" # # ВТРАТА ЦЬОГО КЛЮЧА — ВТРАТА ВСІХ ЗБЕРЕЖЕНИХ ПАРОЛІВ. Бекап бази без # нього не відновлюється: у БД лежить лише шифротекст. NETPULSE_DEK= # Ключ підпису сесійних токенів, не менше 32 байтів. # openssl rand -base64 48 NETPULSE_JWT_SECRET= # --- необовʼязкове --------------------------------------------------- # Часовий пояс: у ньому рахуються розклади бекапів і вікна тиші. TZ=Europe/Kyiv # Як часто перевіряються правила сповіщень. NETPULSE_ALERT_INTERVAL=30s # debug|info|warn|error NETPULSE_LOG_LEVEL=info # Розмір shared_buffers PostgreSQL. Орієнтир — чверть памʼяті хоста. PG_SHARED_BUFFERS=512MB # Версія для тегів образів і рядка -version у бінарниках. NETPULSE_VERSION=dev NETPULSE_COMMIT=none # Запрошення для локального зонда (профіль agent). Береться в # інтерфейсі: Зонди → Додати зонд. NETPULSE_ENROLL= NETPULSE_AGENT_NAME=локальний зонд