fix(deploy): порядок вычисления FILES_DOMAIN и чистота рендера шаблонов
- resolve_derived_values(): производные значения (files.<domain>) считаются до записи .env; раньше set -u ронял установщик на write_env_file - убраны local-объявления, маскировавшие turn_external_tls/use_external_ip/ disable_simulcast/compose_template внутри render_all_templates - из рендера compose убрана неиспользуемая пара IMAGE_TAG - guard чётности аргументов рендера пишет в журнал, а не в консоль: проверка результата — отсутствие незаполненных плейсхолдеров
This commit is contained in:
+18
-13
@@ -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() {
|
validate_inputs() {
|
||||||
case "$PROFILE" in
|
case "$PROFILE" in
|
||||||
auto | lite | standard | plus | pro | custom | none) ;;
|
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/"
|
cp "${DEPLOY_DIR}/fail2ban/filter-glchat-auth.conf" "${TARGET_DIR}/fail2ban/"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
local files_root
|
|
||||||
if [ "$FILES_SUBDOMAIN" = "true" ]; then
|
|
||||||
files_root="files.${DOMAIN}"
|
|
||||||
else
|
|
||||||
files_root="${DOMAIN}"
|
|
||||||
fi
|
|
||||||
FILES_DOMAIN_RESOLVED="$files_root"
|
|
||||||
|
|
||||||
# В режиме внешнего прокси собственный Caddy не нужен вовсе: сервис
|
# В режиме внешнего прокси собственный Caddy не нужен вовсе: сервис
|
||||||
# выносится в несуществующий профиль, чтобы `docker compose up` его не поднимал.
|
# выносится в несуществующий профиль, чтобы `docker compose up` его не поднимал.
|
||||||
CADDY_PROFILE="embedded-proxy"
|
CADDY_PROFILE="embedded-proxy"
|
||||||
@@ -583,14 +587,14 @@ render_all_templates() {
|
|||||||
|
|
||||||
# Вариант compose выбирается по режиму: в тестовом прогоне (--skip-tls)
|
# Вариант compose выбирается по режиму: в тестовом прогоне (--skip-tls)
|
||||||
# порты LiveKit не публикуются, чтобы не занимать порты хост-машины.
|
# порты LiveKit не публикуются, чтобы не занимать порты хост-машины.
|
||||||
local compose_template="${DEPLOY_DIR}/compose.yaml.tpl"
|
compose_template="${DEPLOY_DIR}/compose.yaml.tpl"
|
||||||
if [ "$LIVEKIT_PUBLISH" != "true" ]; then
|
if [ "$LIVEKIT_PUBLISH" != "true" ]; then
|
||||||
compose_template="${DEPLOY_DIR}/compose.test.yaml.tpl"
|
compose_template="${DEPLOY_DIR}/compose.test.yaml.tpl"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
render_template "${compose_template}" "${TARGET_DIR}/compose.yaml" \
|
render_template "${compose_template}" "${TARGET_DIR}/compose.yaml" \
|
||||||
"DOMAIN=${DOMAIN}" "FILES_DOMAIN=${FILES_DOMAIN_RESOLVED}" "INSTANCE_NAME=${INSTANCE_NAME}" \
|
"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}" \
|
"APP_PORT=${APP_PORT}" "LIVEKIT_WS_PORT=${LIVEKIT_WS_PORT}" \
|
||||||
"LIVEKIT_TCP_PORT=${LIVEKIT_TCP_PORT}" "LIVEKIT_UDP_PORT=${LIVEKIT_UDP_PORT}" \
|
"LIVEKIT_TCP_PORT=${LIVEKIT_TCP_PORT}" "LIVEKIT_UDP_PORT=${LIVEKIT_UDP_PORT}" \
|
||||||
"DATA_DIR=${GLCHAT_DATA_DIR}" "LOG_LEVEL=${LOG_LEVEL}" \
|
"DATA_DIR=${GLCHAT_DATA_DIR}" "LOG_LEVEL=${LOG_LEVEL}" \
|
||||||
@@ -617,13 +621,13 @@ render_all_templates() {
|
|||||||
"PROXY_MODE=${PROXY_MODE}"
|
"PROXY_MODE=${PROXY_MODE}"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
local turn_external_tls="false"
|
turn_external_tls="false"
|
||||||
[ "$PROXY_MODE" = "external" ] && turn_external_tls="true"
|
[ "$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_SIMULCAST:-0}" -gt 0 ] 2>/dev/null && disable_simulcast="false"
|
||||||
PROFILE_LIVEKIT_DISABLE_SIMULCAST="$disable_simulcast"
|
PROFILE_LIVEKIT_DISABLE_SIMULCAST="$disable_simulcast"
|
||||||
|
|
||||||
local use_external_ip="true"
|
use_external_ip="true"
|
||||||
if [ "$PROXY_MODE" = "embedded" ]; then
|
if [ "$PROXY_MODE" = "embedded" ]; then
|
||||||
use_external_ip="true"
|
use_external_ip="true"
|
||||||
fi
|
fi
|
||||||
@@ -977,6 +981,7 @@ main() {
|
|||||||
check_os
|
check_os
|
||||||
interactive_defaults
|
interactive_defaults
|
||||||
validate_inputs
|
validate_inputs
|
||||||
|
resolve_derived_values
|
||||||
check_resources
|
check_resources
|
||||||
check_dns "$DOMAIN" || true
|
check_dns "$DOMAIN" || true
|
||||||
check_ports_free
|
check_ports_free
|
||||||
|
|||||||
@@ -198,11 +198,11 @@ detect_profile() {
|
|||||||
render_template() {
|
render_template() {
|
||||||
local src="$1" dst="$2"
|
local src="$1" dst="$2"
|
||||||
shift 2
|
shift 2
|
||||||
# Нечётное число аргументов означает, что вызов неполный: сообщаем об этом,
|
# Нечётное число аргументов означает неполный вызов: пишем в журнал
|
||||||
# но продолжаем — значения, которые всё же переданы, будут применены,
|
# установки, но продолжаем — реальная проверка ниже (незаполненные
|
||||||
# а незаполненные плейсхолдеры видны в предупреждении ниже.
|
# плейсхолдеры в результате рендера).
|
||||||
if [ $(( $# % 2 )) -ne 0 ]; then
|
if [ $(( $# % 2 )) -ne 0 ]; then
|
||||||
warn "render_template($(basename "$src")): нечётное число аргументов: $#"
|
log_file_only "render_template($(basename "$src")): нечётное число аргументов: $#"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# export "$pair" разбирает KEY=value сам; export "${pair}" трактует всю
|
# export "$pair" разбирает KEY=value сам; export "${pair}" трактует всю
|
||||||
|
|||||||
Reference in New Issue
Block a user