From 3847476798a40928e20a4a62c397f17db58cf6a5 Mon Sep 17 00:00:00 2001 From: Max Ronzhin Date: Mon, 3 Aug 2026 18:45:20 +0300 Subject: [PATCH] =?UTF-8?q?chore(deploy):=20render-templates.sh=20=D1=83?= =?UTF-8?q?=D0=BC=D0=B5=D0=B5=D1=82=20=D1=87=D0=B8=D1=82=D0=B0=D1=82=D1=8C?= =?UTF-8?q?=20=D0=B4=D1=80=D1=83=D0=B3=D0=BE=D0=B9=20=D1=84=D0=B0=D0=B9?= =?UTF-8?q?=D0=BB=20=D0=B7=D0=BD=D0=B0=D1=87=D0=B5=D0=BD=D0=B8=D0=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Путь к файлу со значениями был жёстко зашит как `<корень>/.env`. На машине разработчика корневой `.env` держит боевые адреса (LIVEKIT_NODE_IP/TURN_EXTERNAL_IP смотрят на прод), поэтому рендерить из него конфиги для локального стенда нельзя, а подменить нечем — локальные сессии дважды повторяли логику скрипта вручную через envsubst, что означало расхождение с реальным рендером при первой же правке шаблонов. Теперь источник значений задаётся переменной ENV_FILE: ENV_FILE=.env.local ./deploy/render-templates.sh Поведение по умолчанию не меняется — тот же корневой `.env`. install.sh свою переменную ENV_FILE не экспортирует, так что она сюда не протекает; вызов из install.sh и рендер на сервере работают как раньше. Скрипт дополнительно печатает, из какого файла взяты значения, и подсказывает про ENV_FILE, если файл не найден. --- deploy/render-templates.sh | 18 +++++++++++++++++- docs/deploy/DEPLOYMENT.md | 8 ++++++++ 2 files changed, 25 insertions(+), 1 deletion(-) diff --git a/deploy/render-templates.sh b/deploy/render-templates.sh index 00bc73e..670fa62 100755 --- a/deploy/render-templates.sh +++ b/deploy/render-templates.sh @@ -9,16 +9,32 @@ # запускайте ПЕРЕД `docker compose up` (и после каждого изменения .env, # влияющего на эти конфиги) — из корня репозитория: # ./deploy/render-templates.sh +# +# Источник значений можно подменить переменной ENV_FILE: +# ENV_FILE=.env.local ./deploy/render-templates.sh +# Это нужно для локальных стендов: корневой `.env` рабочего чекаута обычно +# держит боевые значения (LIVEKIT_NODE_IP/TURN_EXTERNAL_IP смотрят на прод), и +# рендерить конфиги из него для локального запуска нельзя. Без этой переменной +# путь был жёстко зашит, и локальные сессии повторяли логику скрипта вручную +# через envsubst — расхождение с реальным рендером ждало своего часа. +# По умолчанию — как раньше, `<корень репозитория>/.env`, поэтому install.sh +# и сервер ничего не замечают (свою переменную ENV_FILE install.sh не +# экспортирует, так что она сюда не протекает). set -euo pipefail SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" -ENV_FILE="$SCRIPT_DIR/../.env" +# Относительный путь разрешаем от текущей директории вызова (`ENV_FILE=.env.local` +# из корня репозитория), абсолютный — как есть. +ENV_FILE="${ENV_FILE:-$SCRIPT_DIR/../.env}" if [ ! -f "$ENV_FILE" ]; then echo "render-templates.sh: не найден $ENV_FILE — сначала запустите ./install.sh или скопируйте .env.example в .env" >&2 + echo "render-templates.sh: другой файл значений можно задать так: ENV_FILE=.env.local $0" >&2 exit 1 fi +echo "[render] источник значений: $ENV_FILE" + # Читаем только нужные ключи через grep/cut (НЕ `source .env`) — .env содержит # значения вроде `SMTP_FROM=VidConf `, где `<` — # валидный литерал для docker-compose/pydantic, но невалидный bash-синтаксис diff --git a/docs/deploy/DEPLOYMENT.md b/docs/deploy/DEPLOYMENT.md index 2b1b6d0..3d68549 100644 --- a/docs/deploy/DEPLOYMENT.md +++ b/docs/deploy/DEPLOYMENT.md @@ -191,6 +191,14 @@ chmod 600 .env # секреты внутри — только root может собирает образы, поднимает `postgres`/`redis`, применяет миграции Alembic + seed, поднимает остальной стек (`up -d --wait`). +По умолчанию `render-templates.sh` читает корневой `.env`. Другой файл +значений задаётся переменной окружения — это нужно, когда рядом с рабочим +`.env` (боевые адреса) поднимается локальный стенд: + +```bash +ENV_FILE=.env.local ./deploy/render-templates.sh +``` + **Не запускайте `docker compose` вручную без `--env-file .env`** — без него compose не подхватывает корневой `.env` (файл на уровень выше `deploy/docker-compose.yml`) и подставляет небезопасные дефолты из самого