From b2a48d80087b4e5c77d5209aa43ef5a32cb2a9a0 Mon Sep 17 00:00:00 2001 From: grendervill Date: Tue, 22 Sep 2026 20:24:38 +0300 Subject: [PATCH] =?UTF-8?q?fix(cli):=20glchat=20profile=20=D1=81=D0=BE?= =?UTF-8?q?=D1=85=D1=80=D0=B0=D0=BD=D1=8F=D0=B5=D1=82=20=D1=84=D0=BE=D1=80?= =?UTF-8?q?=D0=BC=D1=83=20=D1=80=D0=B0=D0=B7=D0=B2=D1=91=D1=80=D1=82=D1=8B?= =?UTF-8?q?=D0=B2=D0=B0=D0=BD=D0=B8=D1=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Переключение профиля — повторная установка, и без флагов она переписала бы compose на встроенный прокси. Теперь CLI восстанавливает домен, режим прокси, адреса привязки, внешний TURN и ignore-ip из .env. --- deploy/glchat-cli.sh | 47 +++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 46 insertions(+), 1 deletion(-) diff --git a/deploy/glchat-cli.sh b/deploy/glchat-cli.sh index a5589ed..fbc7e09 100755 --- a/deploy/glchat-cli.sh +++ b/deploy/glchat-cli.sh @@ -9,6 +9,12 @@ ENV_FILE="${GLCHAT_ETC_DIR}/.env" COMPOSE="docker compose -f ${COMPOSE_FILE}" +# env_get читает значение из .env инстанса (пусто, если ключа нет). +env_get() { + [ -f "$ENV_FILE" ] || return 0 + sed -n "s/^$1=//p" "$ENV_FILE" | tail -1 +} + usage() { cat <<'EOF' glchat — управление инстансом @@ -108,13 +114,52 @@ cmd_fail2ban_status() { done } +# cmd_profile показывает текущий профиль или переключает его. Переключение — +# это повторная установка, поэтому форма развёртывания (внешний прокси, адреса +# привязки, внешний TURN) восстанавливается из .env: иначе `glchat profile lite` +# переписал бы compose на встроенный прокси и сломал инстанс за чужим прокси. cmd_profile() { if [ "$#" -eq 0 ]; then echo "профиль: $(sed -n 's/^PROFILE=//p' "$ENV_FILE" 2>/dev/null || echo unknown)" grep -E '^(SQLITE_|GOMAXPROCS|MAX_UPLOAD_SIZE|APP_CPUS|APP_MEMORY_LIMIT)' "$ENV_FILE" 2>/dev/null || true return fi - GLCHAT_ETC_DIR="$GLCHAT_ETC_DIR" bash "${GLCHAT_ETC_DIR}/install.sh" --profile "$1" --reconfigure --yes + require_stack + local args=() + local domain app_bind livekit_bind proxy_mode relay_host + domain="$(env_get DOMAIN)" + [ -n "$domain" ] || { + echo "glchat: в ${ENV_FILE} нет DOMAIN" >&2 + exit 1 + } + args=(--profile "$1" --reconfigure --yes --domain "$domain") + proxy_mode="$(env_get PROXY_MODE)" + if [ "$proxy_mode" = "external" ]; then + args+=(--external-proxy) + [ "$(env_get TLS_BY_PROXY)" = "true" ] && args+=(--tls-terminated-by-proxy) + fi + app_bind="$(env_get GLCHAT_APP_BIND)" + [ -n "$app_bind" ] && args+=(--app-bind-addr "$app_bind") + livekit_bind="$(env_get GLCHAT_LIVEKIT_BIND)" + [ -n "$livekit_bind" ] && args+=(--livekit-bind-addr "$livekit_bind") + if [ "$(env_get TURN_ENABLED)" = "false" ]; then + args+=(--no-turn) + fi + relay_host="$(env_get TURN_RELAY_HOST)" + if [ -n "$relay_host" ]; then + args+=(--turn-relay-host "$relay_host") + [ -n "$(env_get TURN_RELAY_PORT)" ] && args+=(--turn-relay-port "$(env_get TURN_RELAY_PORT)") + [ -n "$(env_get TURN_RELAY_TLS_PORT)" ] && args+=(--turn-relay-tls-port "$(env_get TURN_RELAY_TLS_PORT)") + [ -n "$(env_get TURN_RELAY_TLS_HOST)" ] && args+=(--turn-relay-tls-host "$(env_get TURN_RELAY_TLS_HOST)") + fi + local ip + for ip in $(env_get FAIL2BAN_IGNOREIP); do + args+=(--ignore-ip "$ip") + done + [ -n "$(env_get ADMIN_EMAIL)" ] && args+=(--admin "$(env_get ADMIN_EMAIL)") + [ -n "$(env_get ADMIN_PASSWORD)" ] && args+=(--password "$(env_get ADMIN_PASSWORD)") + echo "==> переключение профиля на $1 (форма развёртывания берётся из .env)" + GLCHAT_ETC_DIR="$GLCHAT_ETC_DIR" bash "${GLCHAT_ETC_DIR}/install.sh" "${args[@]}" } cmd_security_check() {