Переменные окружения
Всё, что нужно до подключения к 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/бюджета и число ключей на человека.
Почему в базе: их меняют по ходу эксплуатации, а не при развёртывании, и менять их перезапуском обоих сервисов — не то, чего хочется в шесть вечера.