fix(install,e2e): установка на VPS владельца — четыре дефекта шаблонов и хелперов

Установка на VPS (Debian 13, 1 vCPU/2 ГБ) с внешним прокси на том же хосте
вскрыла дефекты, которые не проявлялись на стенде:

- compose: с --no-turn порты TURN всё равно публиковались, и стек не стартовал
  («failed to bind host port 0.0.0.0:3478/udp» — порт держит чужой coturn).
  Теперь строки портов TURN подставляет установщик (GLCHAT_TURN_PORTS).
- LiveKit: добавлен отдельный адрес публикации медиапортов
  (--livekit-media-bind-addr / GLCHAT_LIVEKIT_MEDIA_BIND): сигналинг остаётся
  внутренним для прокси, а 7881/tcp и 7882/udp доступны клиентам из интернета.
- external-proxy.conf: адреса апстримов берутся из фактической привязки
  (--app-bind-addr/--livekit-bind-addr), а не жёсткого 127.0.0.1.
- при --no-files-subdomain шаблоны внешнего прокси и встроенного Caddy писали
  два блока с одним адресом сайта (Caddy отвергает такой конфиг и в embedded
  режиме установка ломалась целиком): блок пользовательского контента теперь
  появляется только при отдельном домене (GLCHAT_FILES_BLOCK).
- e2e: postWithRetry/repeat429 читают retry_after_ms из конверта ошибки
  ({"error":{...}}) — без этого хелперы сдавались раньше, чем сервер разрешал
  повтор, и регистрация пробных аккаунтов на свежем инстансе падала.
- e2e: voice.spec.ts ищет комнату «Голос» точным именем: пока сайдбар
  дорисовывает сервер, видны комнаты предыдущего («Голос A»/«Голос B»).
This commit is contained in:
2026-09-27 17:40:58 +03:00
parent 1fd9734fff
commit a835903938
6 changed files with 110 additions and 39 deletions
+6 -12
View File
@@ -1,7 +1,8 @@
# Сгенерировано deploy/install.sh — не редактируйте вручную.
# Режим: внешний reverse proxy (--external-proxy). Собственный Caddy не запускается:
# блок ниже нужно вставить в конфиг вашего прокси (например, Caddyfile) и перезагрузить его.
# Приложение и LiveKit слушают только 127.0.0.1.
# Приложение и LiveKit слушают ${APP_BIND}:${APP_PORT} и ${LIVEKIT_BIND}:${LIVEKIT_WS_PORT}
# (по умолчанию 127.0.0.1 — в этом случае прокси и стек на одном хосте).
{
email ${ACME_EMAIL}
}
@@ -31,7 +32,7 @@ ${DOMAIN} {
# WebSocket Gateway (фаза 1): длинные соединения без таймаутов.
@gateway path /gateway
handle @gateway {
reverse_proxy 127.0.0.1:${APP_PORT} {
reverse_proxy ${APP_BIND}:${APP_PORT} {
transport http {
read_timeout 1h
write_timeout 1h
@@ -42,7 +43,7 @@ ${DOMAIN} {
# LiveKit сигналинг (WebSocket).
@rtc path /rtc*
handle @rtc {
reverse_proxy 127.0.0.1:${LIVEKIT_WS_PORT} {
reverse_proxy ${LIVEKIT_BIND}:${LIVEKIT_WS_PORT} {
transport http {
read_timeout 1h
write_timeout 1h
@@ -52,16 +53,9 @@ ${DOMAIN} {
# API и статика клиента.
handle {
reverse_proxy 127.0.0.1:${APP_PORT}
reverse_proxy ${APP_BIND}:${APP_PORT}
}
}
# Пользовательский контент — отдельный origin (изоляция cookies/CSP).
${FILES_DOMAIN} {
encode zstd gzip
import glchat_security_headers
handle {
reverse_proxy 127.0.0.1:${APP_PORT}
}
}
${GLCHAT_FILES_BLOCK}
# --- glchat: конец блока --------------------------------------------------