Развёртывание панели
Состав
Section titled “Состав”services: traefik: # TLS для домена панели backend: # API + встроенная статика web (go:embed) — один контейнер на обе роли postgres:Web-статика встраивается в бинарник backend на этапе сборки: одним контейнером меньше, нет рассинхронизации версий SPA и API. Traefik терминирует TLS и проксирует всё на backend; gRPC control plane — отдельный порт backend (HTTP/2, сквозной mTLS, Traefik его не терминирует).
Конфигурация
Section titled “Конфигурация”Минимум для старта:
| Переменная | Назначение |
|---|---|
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) — опционально, со здравыми дефолтами. Полный справочник генерируется из кода конфигурации.
Первый старт
Section titled “Первый старт”- Backend применяет миграции (advisory lock; отключаемо — миграции).
- Генерирует мастер-ключ (если файла нет) и recovery-слот в БД; внутренний CA, если
internal_caпуста. - Печатает 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 из бэкапа; без бэкапа БД не поможет ничто — это и есть система |
Обновление
Section titled “Обновление”docker compose pull && docker compose up -d. Миграции применяются на старте; даунтайм — секунды; ноды обновление панели не затрагивает. Откат версии backend возможен до последней непримененной ломающей миграции (двухфазные миграции делают окно отката шире — конвенция).