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. # (оператор задал при запуске), затем из существующего .env.
oauth_value() { oauth_value() {
local key="$1" local key="$1"
local from_env="${!key:-}" local value="${!key:-}"
if [ -n "$from_env" ]; then if [ -z "$value" ] && [ "$env_existing" = "1" ]; then
printf '%s' "$from_env" value="$(env_get "$key" || true)"
return
fi
if [ "$env_existing" = "1" ]; then
env_get "$key" || true
fi fi
# Кавычки из .env снимаем: иначе при перезаписи файла они удваиваются
# (`KEY=""` → `KEY=""""`) и docker compose отказывается читать .env.
printf '%s' "${value//\"/}"
} }
secret_or_new() { secret_or_new() {
@@ -750,6 +749,16 @@ ensure_age_key() {
} }
write_env_file() { 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}" info "пишем ${GLCHAT_ENV_FILE}"
if [ "$DRY_RUN" = "1" ]; then if [ "$DRY_RUN" = "1" ]; then
log_file_only "DRY-RUN: .env не записывается" log_file_only "DRY-RUN: .env не записывается"
@@ -935,15 +944,16 @@ LIVEKIT_API_KEY=${LIVEKIT_API_KEY}
LIVEKIT_API_SECRET=${LIVEKIT_API_SECRET} LIVEKIT_API_SECRET=${LIVEKIT_API_SECRET}
LIVEKIT_PUBLIC_URL=${LIVEKIT_PUBLIC_URL} LIVEKIT_PUBLIC_URL=${LIVEKIT_PUBLIC_URL}
# OAuth-провайдеры (Фаза 7): пусто — провайдер выключен. Кавычки обязательны: # OAuth-провайдеры (Фаза 7): пусто — провайдер выключен. Кавычки добавляет
# секреты провайдеров содержат символы, значимые для оболочки. # установщик только для значений со спецсимволами (docker compose разбирает
OAUTH_GITHUB_CLIENT_ID="${OAUTH_GITHUB_CLIENT_ID:-}" # .env своим парсером и пустые кавычки ему не нравятся).
OAUTH_GITHUB_CLIENT_SECRET="${OAUTH_GITHUB_CLIENT_SECRET:-}" OAUTH_GITHUB_CLIENT_ID=$(env_quote "$OAUTH_GITHUB_CLIENT_ID")
OAUTH_GOOGLE_CLIENT_ID="${OAUTH_GOOGLE_CLIENT_ID:-}" OAUTH_GITHUB_CLIENT_SECRET=$(env_quote "$OAUTH_GITHUB_CLIENT_SECRET")
OAUTH_GOOGLE_CLIENT_SECRET="${OAUTH_GOOGLE_CLIENT_SECRET:-}" OAUTH_GOOGLE_CLIENT_ID=$(env_quote "$OAUTH_GOOGLE_CLIENT_ID")
OAUTH_DISCORD_CLIENT_ID="${OAUTH_DISCORD_CLIENT_ID:-}" OAUTH_GOOGLE_CLIENT_SECRET=$(env_quote "$OAUTH_GOOGLE_CLIENT_SECRET")
OAUTH_DISCORD_CLIENT_SECRET="${OAUTH_DISCORD_CLIENT_SECRET:-}" OAUTH_DISCORD_CLIENT_ID=$(env_quote "$OAUTH_DISCORD_CLIENT_ID")
OAUTH_REDIRECT_BASE="${OAUTH_REDIRECT_BASE:-}" OAUTH_DISCORD_CLIENT_SECRET=$(env_quote "$OAUTH_DISCORD_CLIENT_SECRET")
OAUTH_REDIRECT_BASE=$(env_quote "$OAUTH_REDIRECT_BASE")
# Offsite-бэкапы: цель и срок хранения задаются вручную после установки. # Offsite-бэкапы: цель и срок хранения задаются вручную после установки.
BACKUP_OFFSITE_TARGET=${BACKUP_OFFSITE_TARGET:-} BACKUP_OFFSITE_TARGET=${BACKUP_OFFSITE_TARGET:-}