Содержание

Переменные окружения

Всё, что нужно до подключения к Postgres, задаётся окружением. Всё остальное — провайдеры, ключи, лимиты, цены — живёт в базе и правится из панели, потому что две копии одной настройки неизбежно расходятся.

Общие для двух сервисов

Переменная По умолчанию Что делает
ZBGATE_DATABASE_URL postgresql+asyncpg://localhost:5432/zbgate строка подключения
ZBGATE_SECRET_KEY 32 байта для AES-256-GCM, обязательна

ZBGATE_SECRET_KEY — один и тот же ключ у панели и гейта, байт в байт. Принимается в base64 или hex; неверная длина отвергается при старте, а не при первой записи, чтобы неверно настроенный сервис падал до того, как сохранит что-то, чего потом не прочитает.

python -c "import os,base64;print(base64.b64encode(os.urandom(32)).decode())"

Строка подключения

Панель понимает и postgres://, и postgresql://, и postgresql+asyncpg:// — драйвер подставляется сам, если не указан. Это сделано ровно потому, что оба сервиса читают одну переменную, а pgx у гейта принимает libpq-написание.

Логин и пароль лучше передавать через PGUSER/PGPASSWORD — те же переменные, что понимает psql. В строке подключения по умолчанию их нет намеренно: пароль в исходниках — это тот пароль, который потом оказывается в бою.

Только панель

Переменная По умолчанию Что делает
ZBGATE_SESSION_SECRET подпись cookie сессии, обязательна
ZBGATE_ADMIN_HOST 0.0.0.0 адрес прослушивания
ZBGATE_ADMIN_PORT 8081 порт
ZBGATE_COOKIE_SECURE true флаг Secure на cookie
ZBGATE_SESSION_MAX_AGE_SECONDS 43200 срок жизни сессии, 12 часов
ZBGATE_LOG_PAGE_SIZE 50 строк на странице журнала

Смена ZBGATE_SESSION_SECRET разлогинивает всех. ZBGATE_COOKIE_SECURE=false — только для локальной разработки по plain HTTP.

Только гейт

Гейт читает config.yaml; переменные в нём подставляются через ${…}.

server:
  addr: ":8080"
  read_header_timeout: 15s
  # write_timeout намеренно не задан: он ограничивает и потоковые ответы,
  # которые законно живут минутами.
  idle_timeout: 120s
  shutdown_timeout: 30s

database:
  url: ${ZBGATE_DATABASE_URL}
  secret_key: ${ZBGATE_SECRET_KEY}
  # Страховка за LISTEN/NOTIFY — на случай уведомления, потерянного пока
  # слушатель переподключался.
  config_refresh_interval: 60s

Полный пример — config.example.yaml в репозитории гейта.

Только для тестов гейта

Переменная Что делает
ZBGATE_TEST_DATABASE_URL база для тестов с БД; без неё они скипаются
ZBGATE_TEST_DESTRUCTIVE=1 снять отказ работать по непустой базе

БД-тесты делают TRUNCATE контрол-плейна, а строка подключения отличается от боевой только хостом — поэтому по умолчанию они отказываются трогать базу, в которой уже что-то есть. См. Разработка и тесты.

Настройки в базе, а не в окружении

Эти правятся в панели и применяются гейтом без перезапуска:

  • Шлюз — требовать авторизацию, писать тела запросов и ответов, предел размера сохраняемого тела, срок хранения логов.
  • Тарификация — часовой пояс, по которому читаются окна цен; код валюты отображения и её курс к доллару.
  • Самообслуживание — разрешён ли самостоятельный выпуск ключей, потолки rpm/tpm/бюджета и число ключей на человека.

Почему в базе: их меняют по ходу эксплуатации, а не при развёртывании, и менять их перезапуском обоих сервисов — не то, чего хочется в шесть вечера.