diff --git a/deploy/install.sh b/deploy/install.sh index 73aea5b..b29d610 100755 --- a/deploy/install.sh +++ b/deploy/install.sh @@ -215,6 +215,18 @@ detect_ssh_port() { # --- подготовка ----------------------------------------------------------- +# resolve_derived_values вычисляет значения, которые нужны и в .env, и в шаблонах. +# Раньше FILES_DOMAIN_RESOLVED считался внутри render_all_templates, из-за чего +# write_env_file обращался к ещё не заданной переменной (set -u → падение). +resolve_derived_values() { + if [ "$FILES_SUBDOMAIN" = "true" ]; then + FILES_DOMAIN_RESOLVED="files.${DOMAIN}" + else + FILES_DOMAIN_RESOLVED="${DOMAIN}" + fi + export FILES_DOMAIN_RESOLVED +} + validate_inputs() { case "$PROFILE" in auto | lite | standard | plus | pro | custom | none) ;; @@ -564,14 +576,6 @@ render_all_templates() { cp "${DEPLOY_DIR}/fail2ban/filter-glchat-auth.conf" "${TARGET_DIR}/fail2ban/" fi - local files_root - if [ "$FILES_SUBDOMAIN" = "true" ]; then - files_root="files.${DOMAIN}" - else - files_root="${DOMAIN}" - fi - FILES_DOMAIN_RESOLVED="$files_root" - # В режиме внешнего прокси собственный Caddy не нужен вовсе: сервис # выносится в несуществующий профиль, чтобы `docker compose up` его не поднимал. CADDY_PROFILE="embedded-proxy" @@ -583,14 +587,14 @@ render_all_templates() { # Вариант compose выбирается по режиму: в тестовом прогоне (--skip-tls) # порты LiveKit не публикуются, чтобы не занимать порты хост-машины. - local compose_template="${DEPLOY_DIR}/compose.yaml.tpl" + compose_template="${DEPLOY_DIR}/compose.yaml.tpl" if [ "$LIVEKIT_PUBLISH" != "true" ]; then compose_template="${DEPLOY_DIR}/compose.test.yaml.tpl" fi render_template "${compose_template}" "${TARGET_DIR}/compose.yaml" \ "DOMAIN=${DOMAIN}" "FILES_DOMAIN=${FILES_DOMAIN_RESOLVED}" "INSTANCE_NAME=${INSTANCE_NAME}" \ - "PROFILE=${PROFILE_RESOLVED}" "APP_IMAGE=${APP_IMAGE}" "IMAGE_TAG=${IMAGE_TAG}" \ + "PROFILE=${PROFILE_RESOLVED}" "APP_IMAGE=${APP_IMAGE}" \ "APP_PORT=${APP_PORT}" "LIVEKIT_WS_PORT=${LIVEKIT_WS_PORT}" \ "LIVEKIT_TCP_PORT=${LIVEKIT_TCP_PORT}" "LIVEKIT_UDP_PORT=${LIVEKIT_UDP_PORT}" \ "DATA_DIR=${GLCHAT_DATA_DIR}" "LOG_LEVEL=${LOG_LEVEL}" \ @@ -617,13 +621,13 @@ render_all_templates() { "PROXY_MODE=${PROXY_MODE}" fi - local turn_external_tls="false" + turn_external_tls="false" [ "$PROXY_MODE" = "external" ] && turn_external_tls="true" - local disable_simulcast="true" + disable_simulcast="true" [ "${PROFILE_LIVEKIT_SIMULCAST:-0}" -gt 0 ] 2>/dev/null && disable_simulcast="false" PROFILE_LIVEKIT_DISABLE_SIMULCAST="$disable_simulcast" - local use_external_ip="true" + use_external_ip="true" if [ "$PROXY_MODE" = "embedded" ]; then use_external_ip="true" fi @@ -977,6 +981,7 @@ main() { check_os interactive_defaults validate_inputs + resolve_derived_values check_resources check_dns "$DOMAIN" || true check_ports_free diff --git a/deploy/lib/common.sh b/deploy/lib/common.sh index 3bf7538..e0e9e16 100644 --- a/deploy/lib/common.sh +++ b/deploy/lib/common.sh @@ -198,11 +198,11 @@ detect_profile() { render_template() { local src="$1" dst="$2" shift 2 - # Нечётное число аргументов означает, что вызов неполный: сообщаем об этом, - # но продолжаем — значения, которые всё же переданы, будут применены, - # а незаполненные плейсхолдеры видны в предупреждении ниже. + # Нечётное число аргументов означает неполный вызов: пишем в журнал + # установки, но продолжаем — реальная проверка ниже (незаполненные + # плейсхолдеры в результате рендера). if [ $(( $# % 2 )) -ne 0 ]; then - warn "render_template($(basename "$src")): нечётное число аргументов: $#" + log_file_only "render_template($(basename "$src")): нечётное число аргументов: $#" fi # export "$pair" разбирает KEY=value сам; export "${pair}" трактует всю