diff --git a/README.md b/README.md index 7c6c35c..8e71938 100644 --- a/README.md +++ b/README.md @@ -82,7 +82,7 @@ cp .env.example .env **Вариант B: Вручную (базовый стек без AI)** ```bash -docker compose -f deploy/docker-compose.yml up -d +docker compose -f deploy/docker-compose.yml --env-file .env up -d ``` Это запустит PostgreSQL, Redis, backend (FastAPI) и Nginx. API доступен по адресу: @@ -91,7 +91,7 @@ docker compose -f deploy/docker-compose.yml up -d **Вариант C: Вручную с видеоконференциями и AI** ```bash -docker compose -f deploy/docker-compose.yml \ +docker compose -f deploy/docker-compose.yml --env-file .env \ --profile media --profile transcribe --profile llm up -d ``` @@ -118,7 +118,7 @@ Frontend запущен на `http://localhost:5173` (dev сервер). Для использования видеоконференций с LiveKit + Coturn: ```bash -docker compose -f deploy/docker-compose.yml --profile media up -d +docker compose -f deploy/docker-compose.yml --env-file .env --profile media up -d ``` Полные детали настройки см. в [docs/deploy/dev-setup.md](docs/deploy/dev-setup.md). @@ -261,16 +261,16 @@ VidConf использует единый инсталлятор `install.sh` с ```bash # Минимум (только backend, БД, Redis) -docker compose -f deploy/docker-compose.yml up -d +docker compose -f deploy/docker-compose.yml --env-file .env up -d # + видеоконференции (LiveKit + Coturn) -docker compose -f deploy/docker-compose.yml --profile media up -d +docker compose -f deploy/docker-compose.yml --env-file .env --profile media up -d # + AI transcription/summarization (CPU) -docker compose -f deploy/docker-compose.yml --profile media --profile transcribe --profile llm up -d +docker compose -f deploy/docker-compose.yml --env-file .env --profile media --profile transcribe --profile llm up -d # + мониторинг (Prometheus + Grafana) -docker compose -f deploy/docker-compose.yml --profile monitoring up -d +docker compose -f deploy/docker-compose.yml --env-file .env --profile monitoring up -d ``` ## Вклад в проект diff --git a/docs/architecture/README.md b/docs/architecture/README.md index 6518cf3..59b0344 100644 --- a/docs/architecture/README.md +++ b/docs/architecture/README.md @@ -488,8 +488,8 @@ END:VCALENDAR ### Локальная разработка (вручную) ```bash -docker compose -f deploy/docker-compose.yml up -d # пресет 1 (без AI) -docker compose -f deploy/docker-compose.yml \ +docker compose -f deploy/docker-compose.yml --env-file .env up -d # пресет 1 (без AI) +docker compose -f deploy/docker-compose.yml --env-file .env \ --profile media --profile transcribe --profile llm up -d # пресет 3 (с AI min) ``` diff --git a/docs/deploy/capacity.md b/docs/deploy/capacity.md index b6a9d31..43acca3 100644 --- a/docs/deploy/capacity.md +++ b/docs/deploy/capacity.md @@ -248,7 +248,7 @@ production-релизом крупной инсталляции (пресеты brew install livekit-cli # или бинарь с github.com/livekit/livekit-cli/releases # 2. Локальный стек (без AI-профилей) -docker compose -f deploy/docker-compose.yml --profile media up -d livekit coturn +docker compose -f deploy/docker-compose.yml --env-file .env --profile media up -d livekit coturn # 3. Прогон одной ступени (пример 10×10) export LIVEKIT_URL=ws://localhost:7880 diff --git a/docs/deploy/dev-setup.md b/docs/deploy/dev-setup.md index 509362e..ece9c91 100644 --- a/docs/deploy/dev-setup.md +++ b/docs/deploy/dev-setup.md @@ -27,8 +27,8 @@ SEED_ADMIN_PASSWORD=admin123 ## 3. Запуск базового стека (без видеоконференций) ```bash -docker compose -f deploy/docker-compose.yml up -d -docker compose -f deploy/docker-compose.yml ps +docker compose -f deploy/docker-compose.yml --env-file .env up -d +docker compose -f deploy/docker-compose.yml --env-file .env ps ``` Это запустит: @@ -47,7 +47,7 @@ Backend API доступен: Для включения видеоконференций с LiveKit SFU + Coturn TURN сервером: ```bash -docker compose -f deploy/docker-compose.yml --profile media up -d +docker compose -f deploy/docker-compose.yml --env-file .env --profile media up -d ``` Это добавит: @@ -124,7 +124,7 @@ cd backend && uv run alembic current curl http://localhost:5173 # Worker жив (если запущен) -docker compose -f deploy/docker-compose.yml exec worker celery -A workers.celery_app inspect ping +docker compose -f deploy/docker-compose.yml --env-file .env exec worker celery -A workers.celery_app inspect ping ``` ## 7. Тестирование и проверка качества @@ -148,7 +148,7 @@ npm run lint npm run build # Валидация docker-compose -docker compose -f deploy/docker-compose.yml config -q +docker compose -f deploy/docker-compose.yml --env-file .env config -q ``` ## 8. Пресеты инсталлятора @@ -169,12 +169,12 @@ VidConf поддерживает **5 пресетов инсталлятора** **Backend не может подключиться к БД:** ```bash -docker compose -f deploy/docker-compose.yml logs postgres +docker compose -f deploy/docker-compose.yml --env-file .env logs postgres ``` **Ошибка подключения Redis:** ```bash -docker compose -f deploy/docker-compose.yml logs redis +docker compose -f deploy/docker-compose.yml --env-file .env logs redis ``` **Сборка Frontend не удаётся:** diff --git a/docs/deploy/install.md b/docs/deploy/install.md index b171e0e..b2b9f5e 100644 --- a/docs/deploy/install.md +++ b/docs/deploy/install.md @@ -126,7 +126,7 @@ CPU-only — отдельного GPU-варианта профилей для - Чистая установка (пресеты 1 и 3) на пустом `.env`/чистых volume. - Апгрейд 1 → 3 (повторный запуск с другим `--preset`, секреты сохранены). - Рекомендация детекта соответствует реальному железу текущей машины. -- `bash -n install.sh`, `docker compose -f deploy/docker-compose.yml config -q` +- `bash -n install.sh`, `docker compose -f deploy/docker-compose.yml --env-file .env config -q` для всех сочетаний профилей — минимальная валидация без реального подъёма. Полную установку на чистой машине/VM гоняют вручную (использование сети diff --git a/docs/deploy/llm-setup.md b/docs/deploy/llm-setup.md index 1e01587..4c9a314 100644 --- a/docs/deploy/llm-setup.md +++ b/docs/deploy/llm-setup.md @@ -54,7 +54,7 @@ LLM_MODEL_FILE=qwen3.5-4b-instruct-q4_k_m.gguf \ LLM_MODEL_URL=https://huggingface.co/unsloth/Qwen3.5-4B-GGUF/resolve/main/Qwen3.5-4B-Q4_K_M.gguf \ LLM_TOKENIZER_FILE=qwen3.5-4b-instruct.tokenizer.json \ LLM_TOKENIZER_URL=https://huggingface.co/Qwen/Qwen3.5-4B/resolve/main/tokenizer.json \ -docker compose -f deploy/docker-compose.yml --profile llm run --rm llm-model-init +docker compose -f deploy/docker-compose.yml --env-file .env --profile llm run --rm llm-model-init ``` ## 3. Запуск профиля @@ -62,14 +62,14 @@ docker compose -f deploy/docker-compose.yml --profile llm run --rm llm-model-ini CPU (уровни `min`/`medium`, пресеты 3/4): ```bash -docker compose -f deploy/docker-compose.yml \ +docker compose -f deploy/docker-compose.yml --env-file .env \ --profile media --profile transcribe --profile llm up -d ``` GPU (уровень `max`, пресет 5 — GPU обязателен): ```bash -docker compose -f deploy/docker-compose.yml \ +docker compose -f deploy/docker-compose.yml --env-file .env \ --profile media --profile transcribe-gpu --profile llm-gpu up -d ``` @@ -96,7 +96,7 @@ curl http://localhost:8080/health перезапустить `worker`: ```bash -docker compose -f deploy/docker-compose.yml up -d --force-recreate worker +docker compose -f deploy/docker-compose.yml --env-file .env up -d --force-recreate worker ``` ## 5. Проверка вручную diff --git a/docs/deploy/quality-tiers.md b/docs/deploy/quality-tiers.md index a92e7e9..9ac0aa7 100644 --- a/docs/deploy/quality-tiers.md +++ b/docs/deploy/quality-tiers.md @@ -61,7 +61,7 @@ **Как запускался:** ```bash -docker compose -f deploy/docker-compose.yml --profile llm up -d \ +docker compose -f deploy/docker-compose.yml --env-file .env --profile llm up -d \ llm-models-init llm-model-init llm # дождаться docker compose ps → llm healthy (LLM_MODEL_FILE не задан в .env # — дефолт download-model.sh совпадает с уровнем min, Qwen3.5-4B) @@ -185,7 +185,7 @@ LLM_MODEL_FILE=qwen3.5-9b-instruct-q4_k_m.gguf \ LLM_MODEL_URL=https://huggingface.co/unsloth/Qwen3.5-9B-GGUF/resolve/main/Qwen3.5-9B-Q4_K_M.gguf \ LLM_TOKENIZER_FILE=qwen3.5-9b-instruct.tokenizer.json \ LLM_TOKENIZER_URL=https://huggingface.co/Qwen/Qwen3.5-9B/resolve/main/tokenizer.json \ -docker compose -f deploy/docker-compose.yml --profile llm up -d +docker compose -f deploy/docker-compose.yml --env-file .env --profile llm up -d cd backend && uv run python ../workers/summarizer/eval/run_tiers.py \ --levels medium --base-url http://localhost:8080/v1 @@ -210,7 +210,7 @@ LLM_MODEL_FILE=qwen3.5-35b-a3b-instruct-q4_k_m.gguf \ LLM_MODEL_URL=https://huggingface.co/unsloth/Qwen3.5-35B-A3B-GGUF/resolve/main/Qwen3.5-35B-A3B-Q4_K_M.gguf \ LLM_TOKENIZER_FILE=qwen3.5-35b-a3b-instruct.tokenizer.json \ LLM_TOKENIZER_URL=https://huggingface.co/Qwen/Qwen3.5-35B-A3B/resolve/main/tokenizer.json \ -docker compose -f deploy/docker-compose.yml --profile llm-gpu up -d +docker compose -f deploy/docker-compose.yml --env-file .env --profile llm-gpu up -d cd backend && uv run python ../workers/summarizer/eval/run_tiers.py \ --levels max --base-url http://localhost:8081/v1 diff --git a/docs/deploy/scaling.md b/docs/deploy/scaling.md index 7162901..12ae386 100644 --- a/docs/deploy/scaling.md +++ b/docs/deploy/scaling.md @@ -98,7 +98,7 @@ consumer'у одной и той же очереди — дублировани суммаризации/уведомлений), реплицируем сервис командой `--scale`: ```bash -docker compose -f deploy/docker-compose.yml -f deploy/docker-compose.override.yml \ +docker compose -f deploy/docker-compose.yml --env-file .env -f deploy/docker-compose.override.yml \ up -d --scale worker-summarize=3 ``` @@ -128,7 +128,7 @@ docker compose -f deploy/docker-compose.yml -f deploy/docker-compose.override.ym Для `worker-transcriber` тот же приём уже применим на уровне профиля: ```bash -docker compose -f deploy/docker-compose.yml --profile transcribe \ +docker compose -f deploy/docker-compose.yml --env-file .env --profile transcribe \ up -d --scale worker-transcriber=2 ``` diff --git a/docs/plugins/summarizer.md b/docs/plugins/summarizer.md index 7c5f8c3..36f60cb 100644 --- a/docs/plugins/summarizer.md +++ b/docs/plugins/summarizer.md @@ -349,7 +349,7 @@ summarizer: 1. Поднять профиль `llm`: ```bash - docker compose -f deploy/docker-compose.yml --profile llm up -d llm-model-init llm + docker compose -f deploy/docker-compose.yml --env-file .env --profile llm up -d llm-model-init llm ``` 2. Дождаться готовности: @@ -366,7 +366,7 @@ summarizer: 4. Перезапустить worker: ```bash - docker compose -f deploy/docker-compose.yml up -d --force-recreate worker + docker compose -f deploy/docker-compose.yml --env-file .env up -d --force-recreate worker ``` ## Примеры использования @@ -472,7 +472,7 @@ CELERY_ALWAYS_EAGER=True uv run pytest tests/test_summarize_task.py -v # Webhook room_finished → очередь run_pipeline # → обработка пайплайна → видеть логи worker - docker compose -f deploy/docker-compose.yml logs -f worker + docker compose -f deploy/docker-compose.yml --env-file .env logs -f worker # Смотреть: transcribing → summarizing → ready to notify ``` diff --git a/install.sh b/install.sh index bf67e77..9f3b2d9 100755 --- a/install.sh +++ b/install.sh @@ -114,6 +114,17 @@ ensure_secret() { fi } +# Установить дефолт для НЕ-секретного ключа только если он ещё не задан — +# аналог ensure_secret, но без генерации случайного значения. Не трогает +# значение, уже заданное вручную (реальный домен/IP боевого сервера). +ensure_default() { + key="$1" + default="$2" + if [ -z "$(get_env_var "$key")" ]; then + set_env_var "$key" "$default" + fi +} + # --------------------------------------------------------------------------- # Автодетект железа (ADR-004, таблица требований). # --------------------------------------------------------------------------- @@ -270,6 +281,16 @@ set_env_var HW_RAM_MB "$HW_RAM_MB" set_env_var HW_GPU_NAME "$HW_GPU_NAME" set_env_var HW_VRAM_MB "$HW_VRAM_MB" +# nginx/coturn/livekit — дефолты для локальной разработки (localhost/127.0.0.1), +# только если ещё не заданы. На боевом сервере ДО первого запуска install.sh +# задайте в .env реальные значения (домены, внешний IP) — ensure_default их +# не перезапишет. +ensure_default NGINX_SERVER_NAMES "localhost" +ensure_default NGINX_CERT_NAME "localhost" +ensure_default LIVEKIT_USE_EXTERNAL_IP "false" +ensure_default LIVEKIT_NODE_IP "127.0.0.1" +ensure_default TURN_EXTERNAL_IP "127.0.0.1" + # Профили compose и модели по пресету. GPU-профили — ТОЛЬКО для пресета 5 # (max): в текущей матрице уровней (backend/services/ai_tiers.py, ADR-004) # уровень `medium` фиксированно CPU-only (GPU для него — ручная настройка @@ -351,14 +372,17 @@ for _p in "${_profiles[@]}"; do [ -n "$_p" ] && PROFILE_ARGS+=(--profile "$_p") done +echo "[install] Рендерю coturn/livekit из шаблонов (deploy/render-templates.sh)" +"$SCRIPT_DIR/deploy/render-templates.sh" + echo "[install] docker compose pull (лучше сразу, но необязательный шаг — образы, которых нет в реестре под текущим тегом, пропускаются)" -docker compose -f "$COMPOSE_FILE" "${PROFILE_ARGS[@]}" pull --ignore-buildable 2>/dev/null || true +docker compose -f "$COMPOSE_FILE" --env-file "$ENV_FILE" "${PROFILE_ARGS[@]}" pull --ignore-buildable 2>/dev/null || true echo "[install] docker compose build" -docker compose -f "$COMPOSE_FILE" "${PROFILE_ARGS[@]}" build +docker compose -f "$COMPOSE_FILE" --env-file "$ENV_FILE" "${PROFILE_ARGS[@]}" build echo "[install] Поднимаю postgres/redis (--wait) — нужны для миграций до старта backend" -docker compose -f "$COMPOSE_FILE" up -d --wait postgres redis +docker compose -f "$COMPOSE_FILE" --env-file "$ENV_FILE" up -d --wait postgres redis # backend.lifespan бутстрапит instance_settings при КАЖДОМ старте приложения, # поэтому миграции обязаны применяться ДО первого запуска backend/worker — @@ -366,8 +390,8 @@ docker compose -f "$COMPOSE_FILE" up -d --wait postgres redis # exist" и healthcheck (--wait) никогда не проходит. `compose run` запускает # одноразовый контейнер с нужной командой, не поднимая uvicorn/lifespan. echo "[install] Применяю миграции Alembic и seed (админ/справочники) — до старта backend" -docker compose -f "$COMPOSE_FILE" run --rm backend uv run alembic upgrade head -docker compose -f "$COMPOSE_FILE" run --rm backend uv run python -m scripts.seed +docker compose -f "$COMPOSE_FILE" --env-file "$ENV_FILE" run --rm backend uv run alembic upgrade head +docker compose -f "$COMPOSE_FILE" --env-file "$ENV_FILE" run --rm backend uv run python -m scripts.seed echo "[install] docker compose up -d --wait (backend/worker/nginx и остальные сервисы профиля)" # Первый старт backend/worker включает `uv run` (синхронизация окружения + @@ -378,12 +402,12 @@ echo "[install] docker compose up -d --wait (backend/worker/nginx и остал # уже стартующих контейнеров, ничего не пересоздавая. UP_ATTEMPTS=3 for attempt in $(seq 1 "$UP_ATTEMPTS"); do - if docker compose -f "$COMPOSE_FILE" "${PROFILE_ARGS[@]}" up -d --wait; then + if docker compose -f "$COMPOSE_FILE" --env-file "$ENV_FILE" "${PROFILE_ARGS[@]}" up -d --wait; then break fi if [ "$attempt" -eq "$UP_ATTEMPTS" ]; then echo "[install] ОШИБКА: сервисы не стали healthy за $UP_ATTEMPTS попыток." >&2 - echo "[install] Проверьте логи: docker compose -f $COMPOSE_FILE logs backend worker" >&2 + echo "[install] Проверьте логи: docker compose -f $COMPOSE_FILE --env-file $ENV_FILE logs backend worker" >&2 exit 1 fi echo "[install] Не все сервисы healthy (попытка $attempt/$UP_ATTEMPTS) — жду 10с и повторяю..." @@ -413,7 +437,7 @@ if [ "$FRESH_ENV" != "1" ]; then fi if [ "$APPLY_PRESET_SETTINGS" = "1" ]; then echo "[install] Применяю настройки модулей инстанса под пресет ${PRESET}" - docker compose -f "$COMPOSE_FILE" exec -T backend uv run python -m scripts.apply_preset_settings --force + docker compose -f "$COMPOSE_FILE" --env-file "$ENV_FILE" exec -T backend uv run python -m scripts.apply_preset_settings --force else echo "[install] Настройки модулей инстанса НЕ изменены — сохранены ручные правки администратора" fi @@ -436,7 +460,7 @@ cat <