fix(install): пустые OAUTH_* не ломают .env и docker compose

Установщик писал значения OAuth в кавычках, а при повторной установке
снимал их из .env вместе с кавычками и добавлял новые: получалось
`OAUTH_GITHUB_CLIENT_ID=""""`, и docker compose отказывался читать .env
(«unexpected character "\"" in variable name»), из-за чего стек не
поднимался после --reconfigure.

Теперь oauth_value снимает кавычки при чтении, а env_quote ставит их
только значениям со спецсимволами. Заодно уже испорченный .env лечится
сам: кавычки снимаются, значение записывается пустым.
This commit is contained in:
2026-09-26 15:20:46 +03:00
parent 11b491d6d3
commit e305b417e8
+26 -16
View File
@@ -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:-}