X-Forwarded-For.
Поддерживаемые примеры
Оба поддерживаются в рабочем состоянии, и оба проверяются в CI.
Пример для Traefik запускается как оверлей compose:
Хосты
BOT_WEBHOOK_DOMAIN может совпадать с хостом API. Держать его отдельно аккуратнее, но не обязательно.
/v1 обязан обслуживаться на веб-хосте
Обе панели обращаются к API на том же origin. Общий браузерный клиент держит базовый URL равным
"" (packages/api-client/src/fetcher.ts), и setBaseUrl никто не вызывает, поэтому запрос из
панели идёт на веб-хост и ожидает, что ответит API. Поэтому оба примера направляют /v1 на
WEB_DOMAIN в контейнер API — с тем же ограничением тела запроса и той же блокировкой операционных
эндпоинтов, что и на публичном хосте API.
Это не удобство. Именно это оставляет сессионную куку first-party, а значит позволяет ей быть
SameSite=Lax и HttpOnly вообще без CORS. Публиковать API панели на другом origin означало бы
SameSite=None, куку Secure, отправляемую при кросс-сайтовых запросах, и список разрешённых
origin с передачей учётных данных — три подвижные части вокруг операторской сессии вместо одной.
API_DOMAIN всё равно стоит публиковать: вебхуки провайдеров, bearer-поверхность /v1/admin и
вебхук Telegram вызывают системы, а не браузер. Установка на одном хосте, обслуживающая только
WEB_DOMAIN, работает для обеих панелей, но ей некуда направить платёжного провайдера.
Не публикуйте операционные эндпоинты
/metrics и /readyz описывают внутреннее устройство установки: здоровье зависимостей, глубину очереди, классификации платежей. Оба примера возвращают для них 404 на публичном хосте API. Собирайте их по внутренней сети или закройте собственной аутентификацией.
/livez безопасно публиковать — он сообщает только о том, что процесс запущен.