Skip to content

Развёртывание панели

services:
traefik: # TLS для домена панели
backend: # API + встроенная статика web (go:embed) — один контейнер на обе роли
postgres:

Web-статика встраивается в бинарник backend на этапе сборки: одним контейнером меньше, нет рассинхронизации версий SPA и API. Traefik терминирует TLS и проксирует всё на backend; gRPC control plane — отдельный порт backend (HTTP/2, сквозной mTLS, Traefik его не терминирует).

Минимум для старта:

Переменная Назначение
ASTRAL_DB_DSN PostgreSQL
ASTRAL_MASTER_KEY_FILE Путь к файлу корневого ключа; генерируется при первом старте (Шифрование)
ASTRAL_JWT_SECRET Подпись access-токенов (32+ байта). Смена = инвалидация access на ≤15 мин, сессии переживают через refresh
ASTRAL_BASE_URL Публичный URL панели: ссылки в письмах, OAuth-callback, ссылки подписки
ASTRAL_SMTP_* Хост/порт/креденшелы/от-кого. Обязательно при magic link и открытой регистрации (инварианты)

Остальное (политики аутентификации, OAuth, retention) — опционально, со здравыми дефолтами. Полный справочник генерируется из кода конфигурации.

  1. Backend применяет миграции (advisory lock; отключаемо — миграции).
  2. Генерирует мастер-ключ (если файла нет) и recovery-слот в БД; внутренний CA, если internal_ca пуста.
  3. Печатает setup-токен в лог → создание первого админа (Первый администратор); экран установки показывает recovery-код — единственный раз (Восстановление ключа).

Два артефакта, хранить раздельно:

Что Как Почему раздельно
PostgreSQL pg_dump по расписанию / WAL-архив Всё состояние системы, включая recovery-слот ключа
Recovery-код (или файл ключа) Записан при установке, вне сервера панели Бэкап БД + секрет ключа вместе = расшифровываемый дамп всех секретов у того, кто украл бэкап

Восстановление: поднять compose → restore БД → подложить файл ключа или astral recover --recovery-code …. Ноды всё время недоступности панели обслуживают VPN-трафик на последнем состоянии (границы отказов); после восстановления агенты переподключаются, reconciliation выравнивает дрейф автоматически. Отдельной процедуры ресинхронизации нет.

Матрица потерь (детали):

Потеряно Действие
Файл ключа astral recover --recovery-code … — слот из БД восстанавливает файл
Recovery-код astral recovery-code new при живом файле
Файл и код astral crypto reset — автоматизированный перевыпуск; ссылки подписок переживают, руками — только внешние креденшелы
БД Restore из бэкапа; без бэкапа БД не поможет ничто — это и есть система

docker compose pull && docker compose up -d. Миграции применяются на старте; даунтайм — секунды; ноды обновление панели не затрагивает. Откат версии backend возможен до последней непримененной ломающей миграции (двухфазные миграции делают окно отката шире — конвенция).