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:-}