a835903938
Установка на 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»).
62 lines
1.8 KiB
Smarty
62 lines
1.8 KiB
Smarty
# Сгенерировано deploy/install.sh — не редактируйте вручную.
|
||
# Режим: внешний reverse proxy (--external-proxy). Собственный Caddy не запускается:
|
||
# блок ниже нужно вставить в конфиг вашего прокси (например, Caddyfile) и перезагрузить его.
|
||
# Приложение и LiveKit слушают ${APP_BIND}:${APP_PORT} и ${LIVEKIT_BIND}:${LIVEKIT_WS_PORT}
|
||
# (по умолчанию 127.0.0.1 — в этом случае прокси и стек на одном хосте).
|
||
{
|
||
email ${ACME_EMAIL}
|
||
}
|
||
|
||
(glchat_security_headers) {
|
||
header {
|
||
Strict-Transport-Security "max-age=31536000; includeSubDomains"
|
||
X-Content-Type-Options "nosniff"
|
||
Referrer-Policy "strict-origin-when-cross-origin"
|
||
X-Frame-Options "DENY"
|
||
-Server
|
||
}
|
||
}
|
||
|
||
# --- glchat: начало блока -------------------------------------------------
|
||
${DOMAIN} {
|
||
encode zstd gzip
|
||
import glchat_security_headers
|
||
log {
|
||
output file /opt/glchat/caddy/logs/access.log {
|
||
roll_size 10mb
|
||
roll_keep 3
|
||
}
|
||
format json
|
||
}
|
||
|
||
# WebSocket Gateway (фаза 1): длинные соединения без таймаутов.
|
||
@gateway path /gateway
|
||
handle @gateway {
|
||
reverse_proxy ${APP_BIND}:${APP_PORT} {
|
||
transport http {
|
||
read_timeout 1h
|
||
write_timeout 1h
|
||
}
|
||
}
|
||
}
|
||
|
||
# LiveKit сигналинг (WebSocket).
|
||
@rtc path /rtc*
|
||
handle @rtc {
|
||
reverse_proxy ${LIVEKIT_BIND}:${LIVEKIT_WS_PORT} {
|
||
transport http {
|
||
read_timeout 1h
|
||
write_timeout 1h
|
||
}
|
||
}
|
||
}
|
||
|
||
# API и статика клиента.
|
||
handle {
|
||
reverse_proxy ${APP_BIND}:${APP_PORT}
|
||
}
|
||
}
|
||
|
||
${GLCHAT_FILES_BLOCK}
|
||
# --- glchat: конец блока --------------------------------------------------
|