From e305b417e846bf174627e41e64e02b5089deecbf Mon Sep 17 00:00:00 2001 From: grendervill Date: Sat, 26 Sep 2026 15:20:46 +0300 Subject: [PATCH] =?UTF-8?q?fix(install):=20=D0=BF=D1=83=D1=81=D1=82=D1=8B?= =?UTF-8?q?=D0=B5=20OAUTH=5F*=20=D0=BD=D0=B5=20=D0=BB=D0=BE=D0=BC=D0=B0?= =?UTF-8?q?=D1=8E=D1=82=20.env=20=D0=B8=20docker=20compose?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Установщик писал значения OAuth в кавычках, а при повторной установке снимал их из .env вместе с кавычками и добавлял новые: получалось `OAUTH_GITHUB_CLIENT_ID=""""`, и docker compose отказывался читать .env («unexpected character "\"" in variable name»), из-за чего стек не поднимался после --reconfigure. Теперь oauth_value снимает кавычки при чтении, а env_quote ставит их только значениям со спецсимволами. Заодно уже испорченный .env лечится сам: кавычки снимаются, значение записывается пустым. --- deploy/install.sh | 42 ++++++++++++++++++++++++++---------------- 1 file changed, 26 insertions(+), 16 deletions(-) diff --git a/deploy/install.sh b/deploy/install.sh index 6f270fe..b19085f 100755 --- a/deploy/install.sh +++ b/deploy/install.sh @@ -640,14 +640,13 @@ generate_secrets() { # (оператор задал при запуске), затем из существующего .env. oauth_value() { local key="$1" - local from_env="${!key:-}" - if [ -n "$from_env" ]; then - printf '%s' "$from_env" - return - fi - if [ "$env_existing" = "1" ]; then - env_get "$key" || true + local value="${!key:-}" + if [ -z "$value" ] && [ "$env_existing" = "1" ]; then + value="$(env_get "$key" || true)" fi + # Кавычки из .env снимаем: иначе при перезаписи файла они удваиваются + # (`KEY=""` → `KEY=""""`) и docker compose отказывается читать .env. + printf '%s' "${value//\"/}" } secret_or_new() { @@ -750,6 +749,16 @@ ensure_age_key() { } write_env_file() { + # env_quote оформляет значение для .env: простые значения пишем как есть, + # сложные — в кавычках (docker compose разбирает .env своим парсером). + env_quote() { + local value="$1" + case "$value" in + *[!A-Za-z0-9._~:/@+=-]*) printf '"%s"' "${value//\"/\\\"}" ;; + *) printf '%s' "$value" ;; + esac + } + info "пишем ${GLCHAT_ENV_FILE}" if [ "$DRY_RUN" = "1" ]; then log_file_only "DRY-RUN: .env не записывается" @@ -935,15 +944,16 @@ LIVEKIT_API_KEY=${LIVEKIT_API_KEY} LIVEKIT_API_SECRET=${LIVEKIT_API_SECRET} LIVEKIT_PUBLIC_URL=${LIVEKIT_PUBLIC_URL} -# OAuth-провайдеры (Фаза 7): пусто — провайдер выключен. Кавычки обязательны: -# секреты провайдеров содержат символы, значимые для оболочки. -OAUTH_GITHUB_CLIENT_ID="${OAUTH_GITHUB_CLIENT_ID:-}" -OAUTH_GITHUB_CLIENT_SECRET="${OAUTH_GITHUB_CLIENT_SECRET:-}" -OAUTH_GOOGLE_CLIENT_ID="${OAUTH_GOOGLE_CLIENT_ID:-}" -OAUTH_GOOGLE_CLIENT_SECRET="${OAUTH_GOOGLE_CLIENT_SECRET:-}" -OAUTH_DISCORD_CLIENT_ID="${OAUTH_DISCORD_CLIENT_ID:-}" -OAUTH_DISCORD_CLIENT_SECRET="${OAUTH_DISCORD_CLIENT_SECRET:-}" -OAUTH_REDIRECT_BASE="${OAUTH_REDIRECT_BASE:-}" +# OAuth-провайдеры (Фаза 7): пусто — провайдер выключен. Кавычки добавляет +# установщик только для значений со спецсимволами (docker compose разбирает +# .env своим парсером и пустые кавычки ему не нравятся). +OAUTH_GITHUB_CLIENT_ID=$(env_quote "$OAUTH_GITHUB_CLIENT_ID") +OAUTH_GITHUB_CLIENT_SECRET=$(env_quote "$OAUTH_GITHUB_CLIENT_SECRET") +OAUTH_GOOGLE_CLIENT_ID=$(env_quote "$OAUTH_GOOGLE_CLIENT_ID") +OAUTH_GOOGLE_CLIENT_SECRET=$(env_quote "$OAUTH_GOOGLE_CLIENT_SECRET") +OAUTH_DISCORD_CLIENT_ID=$(env_quote "$OAUTH_DISCORD_CLIENT_ID") +OAUTH_DISCORD_CLIENT_SECRET=$(env_quote "$OAUTH_DISCORD_CLIENT_SECRET") +OAUTH_REDIRECT_BASE=$(env_quote "$OAUTH_REDIRECT_BASE") # Offsite-бэкапы: цель и срок хранения задаются вручную после установки. BACKUP_OFFSITE_TARGET=${BACKUP_OFFSITE_TARGET:-}