install.sh, docs: pass --env-file explicitly to docker compose
docker compose определяет .env для подстановки ${VAR} по каталогу
compose-файла (deploy/), а не по текущей директории — repo-root .env,
который использует install.sh и вся документация, молча не подхватывался.
Это и была причина "WARN: LIVEKIT_API_KEY not set" на боевом сервере:
секреты были в .env, но compose их не видел и подставлял небезопасные
дефолты (см. таблицу разведки сервера).
Теперь ставшие обязательными ${VAR:?} в docker-compose.yml (см. предыдущий
коммит) без этого немедленно проваливали бы конфиг на любой из
документированных команд. Добавлен `--env-file .env`/"$ENV_FILE" ко всем
вызовам docker compose в install.sh и в командах из README/docs.
install.sh дополнительно: ensure_default (аналог ensure_secret без генерации
секрета) для новых не-секретных параметров nginx/coturn/livekit
(NGINX_SERVER_NAMES, NGINX_CERT_NAME, LIVEKIT_USE_EXTERNAL_IP,
LIVEKIT_NODE_IP, TURN_EXTERNAL_IP) — дефолты только для локальной
разработки, не перезаписывают значения, заданные вручную на боевом
сервере. Плюс вызов deploy/render-templates.sh перед сборкой/подъёмом
стека.
This commit is contained in:
14
README.md
14
README.md
@@ -82,7 +82,7 @@ cp .env.example .env
|
|||||||
|
|
||||||
**Вариант B: Вручную (базовый стек без AI)**
|
**Вариант B: Вручную (базовый стек без AI)**
|
||||||
```bash
|
```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 доступен по адресу:
|
Это запустит PostgreSQL, Redis, backend (FastAPI) и Nginx. API доступен по адресу:
|
||||||
@@ -91,7 +91,7 @@ docker compose -f deploy/docker-compose.yml up -d
|
|||||||
|
|
||||||
**Вариант C: Вручную с видеоконференциями и AI**
|
**Вариант C: Вручную с видеоконференциями и AI**
|
||||||
```bash
|
```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
|
--profile media --profile transcribe --profile llm up -d
|
||||||
```
|
```
|
||||||
|
|
||||||
@@ -118,7 +118,7 @@ Frontend запущен на `http://localhost:5173` (dev сервер).
|
|||||||
Для использования видеоконференций с LiveKit + Coturn:
|
Для использования видеоконференций с LiveKit + Coturn:
|
||||||
|
|
||||||
```bash
|
```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).
|
Полные детали настройки см. в [docs/deploy/dev-setup.md](docs/deploy/dev-setup.md).
|
||||||
@@ -261,16 +261,16 @@ VidConf использует единый инсталлятор `install.sh` с
|
|||||||
|
|
||||||
```bash
|
```bash
|
||||||
# Минимум (только backend, БД, Redis)
|
# Минимум (только 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)
|
# + видеоконференции (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)
|
# + 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)
|
# + мониторинг (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
|
||||||
```
|
```
|
||||||
|
|
||||||
## Вклад в проект
|
## Вклад в проект
|
||||||
|
|||||||
@@ -488,8 +488,8 @@ END:VCALENDAR
|
|||||||
|
|
||||||
### Локальная разработка (вручную)
|
### Локальная разработка (вручную)
|
||||||
```bash
|
```bash
|
||||||
docker compose -f deploy/docker-compose.yml up -d # пресет 1 (без AI)
|
docker compose -f deploy/docker-compose.yml --env-file .env up -d # пресет 1 (без AI)
|
||||||
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 # пресет 3 (с AI min)
|
--profile media --profile transcribe --profile llm up -d # пресет 3 (с AI min)
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|||||||
@@ -248,7 +248,7 @@ production-релизом крупной инсталляции (пресеты
|
|||||||
brew install livekit-cli # или бинарь с github.com/livekit/livekit-cli/releases
|
brew install livekit-cli # или бинарь с github.com/livekit/livekit-cli/releases
|
||||||
|
|
||||||
# 2. Локальный стек (без AI-профилей)
|
# 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)
|
# 3. Прогон одной ступени (пример 10×10)
|
||||||
export LIVEKIT_URL=ws://localhost:7880
|
export LIVEKIT_URL=ws://localhost:7880
|
||||||
|
|||||||
@@ -27,8 +27,8 @@ SEED_ADMIN_PASSWORD=admin123
|
|||||||
## 3. Запуск базового стека (без видеоконференций)
|
## 3. Запуск базового стека (без видеоконференций)
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
docker compose -f deploy/docker-compose.yml up -d
|
docker compose -f deploy/docker-compose.yml --env-file .env up -d
|
||||||
docker compose -f deploy/docker-compose.yml ps
|
docker compose -f deploy/docker-compose.yml --env-file .env ps
|
||||||
```
|
```
|
||||||
|
|
||||||
Это запустит:
|
Это запустит:
|
||||||
@@ -47,7 +47,7 @@ Backend API доступен:
|
|||||||
Для включения видеоконференций с LiveKit SFU + Coturn TURN сервером:
|
Для включения видеоконференций с LiveKit SFU + Coturn TURN сервером:
|
||||||
|
|
||||||
```bash
|
```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
|
curl http://localhost:5173
|
||||||
|
|
||||||
# Worker жив (если запущен)
|
# 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. Тестирование и проверка качества
|
## 7. Тестирование и проверка качества
|
||||||
@@ -148,7 +148,7 @@ npm run lint
|
|||||||
npm run build
|
npm run build
|
||||||
|
|
||||||
# Валидация docker-compose
|
# Валидация docker-compose
|
||||||
docker compose -f deploy/docker-compose.yml config -q
|
docker compose -f deploy/docker-compose.yml --env-file .env config -q
|
||||||
```
|
```
|
||||||
|
|
||||||
## 8. Пресеты инсталлятора
|
## 8. Пресеты инсталлятора
|
||||||
@@ -169,12 +169,12 @@ VidConf поддерживает **5 пресетов инсталлятора**
|
|||||||
|
|
||||||
**Backend не может подключиться к БД:**
|
**Backend не может подключиться к БД:**
|
||||||
```bash
|
```bash
|
||||||
docker compose -f deploy/docker-compose.yml logs postgres
|
docker compose -f deploy/docker-compose.yml --env-file .env logs postgres
|
||||||
```
|
```
|
||||||
|
|
||||||
**Ошибка подключения Redis:**
|
**Ошибка подключения Redis:**
|
||||||
```bash
|
```bash
|
||||||
docker compose -f deploy/docker-compose.yml logs redis
|
docker compose -f deploy/docker-compose.yml --env-file .env logs redis
|
||||||
```
|
```
|
||||||
|
|
||||||
**Сборка Frontend не удаётся:**
|
**Сборка Frontend не удаётся:**
|
||||||
|
|||||||
@@ -126,7 +126,7 @@ CPU-only — отдельного GPU-варианта профилей для
|
|||||||
- Чистая установка (пресеты 1 и 3) на пустом `.env`/чистых volume.
|
- Чистая установка (пресеты 1 и 3) на пустом `.env`/чистых volume.
|
||||||
- Апгрейд 1 → 3 (повторный запуск с другим `--preset`, секреты сохранены).
|
- Апгрейд 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 гоняют вручную (использование сети
|
Полную установку на чистой машине/VM гоняют вручную (использование сети
|
||||||
|
|||||||
@@ -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_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_FILE=qwen3.5-4b-instruct.tokenizer.json \
|
||||||
LLM_TOKENIZER_URL=https://huggingface.co/Qwen/Qwen3.5-4B/resolve/main/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. Запуск профиля
|
## 3. Запуск профиля
|
||||||
@@ -62,14 +62,14 @@ docker compose -f deploy/docker-compose.yml --profile llm run --rm llm-model-ini
|
|||||||
CPU (уровни `min`/`medium`, пресеты 3/4):
|
CPU (уровни `min`/`medium`, пресеты 3/4):
|
||||||
|
|
||||||
```bash
|
```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
|
--profile media --profile transcribe --profile llm up -d
|
||||||
```
|
```
|
||||||
|
|
||||||
GPU (уровень `max`, пресет 5 — GPU обязателен):
|
GPU (уровень `max`, пресет 5 — GPU обязателен):
|
||||||
|
|
||||||
```bash
|
```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
|
--profile media --profile transcribe-gpu --profile llm-gpu up -d
|
||||||
```
|
```
|
||||||
|
|
||||||
@@ -96,7 +96,7 @@ curl http://localhost:8080/health
|
|||||||
перезапустить `worker`:
|
перезапустить `worker`:
|
||||||
|
|
||||||
```bash
|
```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. Проверка вручную
|
## 5. Проверка вручную
|
||||||
|
|||||||
@@ -61,7 +61,7 @@
|
|||||||
**Как запускался:**
|
**Как запускался:**
|
||||||
|
|
||||||
```bash
|
```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
|
llm-models-init llm-model-init llm
|
||||||
# дождаться docker compose ps → llm healthy (LLM_MODEL_FILE не задан в .env
|
# дождаться docker compose ps → llm healthy (LLM_MODEL_FILE не задан в .env
|
||||||
# — дефолт download-model.sh совпадает с уровнем min, Qwen3.5-4B)
|
# — дефолт 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_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_FILE=qwen3.5-9b-instruct.tokenizer.json \
|
||||||
LLM_TOKENIZER_URL=https://huggingface.co/Qwen/Qwen3.5-9B/resolve/main/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 \
|
cd backend && uv run python ../workers/summarizer/eval/run_tiers.py \
|
||||||
--levels medium --base-url http://localhost:8080/v1
|
--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_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_FILE=qwen3.5-35b-a3b-instruct.tokenizer.json \
|
||||||
LLM_TOKENIZER_URL=https://huggingface.co/Qwen/Qwen3.5-35B-A3B/resolve/main/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 \
|
cd backend && uv run python ../workers/summarizer/eval/run_tiers.py \
|
||||||
--levels max --base-url http://localhost:8081/v1
|
--levels max --base-url http://localhost:8081/v1
|
||||||
|
|||||||
@@ -98,7 +98,7 @@ consumer'у одной и той же очереди — дублировани
|
|||||||
суммаризации/уведомлений), реплицируем сервис командой `--scale`:
|
суммаризации/уведомлений), реплицируем сервис командой `--scale`:
|
||||||
|
|
||||||
```bash
|
```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
|
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` тот же приём уже применим на уровне профиля:
|
Для `worker-transcriber` тот же приём уже применим на уровне профиля:
|
||||||
|
|
||||||
```bash
|
```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
|
up -d --scale worker-transcriber=2
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|||||||
@@ -349,7 +349,7 @@ summarizer:
|
|||||||
|
|
||||||
1. Поднять профиль `llm`:
|
1. Поднять профиль `llm`:
|
||||||
```bash
|
```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. Дождаться готовности:
|
2. Дождаться готовности:
|
||||||
@@ -366,7 +366,7 @@ summarizer:
|
|||||||
|
|
||||||
4. Перезапустить worker:
|
4. Перезапустить worker:
|
||||||
```bash
|
```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
|
# Webhook room_finished → очередь run_pipeline
|
||||||
# → обработка пайплайна → видеть логи worker
|
# → обработка пайплайна → видеть логи 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
|
# Смотреть: transcribing → summarizing → ready to notify
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|||||||
42
install.sh
42
install.sh
@@ -114,6 +114,17 @@ ensure_secret() {
|
|||||||
fi
|
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, таблица требований).
|
# Автодетект железа (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_GPU_NAME "$HW_GPU_NAME"
|
||||||
set_env_var HW_VRAM_MB "$HW_VRAM_MB"
|
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
|
# Профили compose и модели по пресету. GPU-профили — ТОЛЬКО для пресета 5
|
||||||
# (max): в текущей матрице уровней (backend/services/ai_tiers.py, ADR-004)
|
# (max): в текущей матрице уровней (backend/services/ai_tiers.py, ADR-004)
|
||||||
# уровень `medium` фиксированно CPU-only (GPU для него — ручная настройка
|
# уровень `medium` фиксированно CPU-only (GPU для него — ручная настройка
|
||||||
@@ -351,14 +372,17 @@ for _p in "${_profiles[@]}"; do
|
|||||||
[ -n "$_p" ] && PROFILE_ARGS+=(--profile "$_p")
|
[ -n "$_p" ] && PROFILE_ARGS+=(--profile "$_p")
|
||||||
done
|
done
|
||||||
|
|
||||||
|
echo "[install] Рендерю coturn/livekit из шаблонов (deploy/render-templates.sh)"
|
||||||
|
"$SCRIPT_DIR/deploy/render-templates.sh"
|
||||||
|
|
||||||
echo "[install] docker compose pull (лучше сразу, но необязательный шаг — образы, которых нет в реестре под текущим тегом, пропускаются)"
|
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"
|
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"
|
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.lifespan бутстрапит instance_settings при КАЖДОМ старте приложения,
|
||||||
# поэтому миграции обязаны применяться ДО первого запуска backend/worker —
|
# поэтому миграции обязаны применяться ДО первого запуска backend/worker —
|
||||||
@@ -366,8 +390,8 @@ docker compose -f "$COMPOSE_FILE" up -d --wait postgres redis
|
|||||||
# exist" и healthcheck (--wait) никогда не проходит. `compose run` запускает
|
# exist" и healthcheck (--wait) никогда не проходит. `compose run` запускает
|
||||||
# одноразовый контейнер с нужной командой, не поднимая uvicorn/lifespan.
|
# одноразовый контейнер с нужной командой, не поднимая uvicorn/lifespan.
|
||||||
echo "[install] Применяю миграции Alembic и seed (админ/справочники) — до старта backend"
|
echo "[install] Применяю миграции Alembic и seed (админ/справочники) — до старта backend"
|
||||||
docker compose -f "$COMPOSE_FILE" run --rm backend uv run alembic upgrade head
|
docker compose -f "$COMPOSE_FILE" --env-file "$ENV_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 python -m scripts.seed
|
||||||
|
|
||||||
echo "[install] docker compose up -d --wait (backend/worker/nginx и остальные сервисы профиля)"
|
echo "[install] docker compose up -d --wait (backend/worker/nginx и остальные сервисы профиля)"
|
||||||
# Первый старт backend/worker включает `uv run` (синхронизация окружения +
|
# Первый старт backend/worker включает `uv run` (синхронизация окружения +
|
||||||
@@ -378,12 +402,12 @@ echo "[install] docker compose up -d --wait (backend/worker/nginx и остал
|
|||||||
# уже стартующих контейнеров, ничего не пересоздавая.
|
# уже стартующих контейнеров, ничего не пересоздавая.
|
||||||
UP_ATTEMPTS=3
|
UP_ATTEMPTS=3
|
||||||
for attempt in $(seq 1 "$UP_ATTEMPTS"); do
|
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
|
break
|
||||||
fi
|
fi
|
||||||
if [ "$attempt" -eq "$UP_ATTEMPTS" ]; then
|
if [ "$attempt" -eq "$UP_ATTEMPTS" ]; then
|
||||||
echo "[install] ОШИБКА: сервисы не стали healthy за $UP_ATTEMPTS попыток." >&2
|
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
|
exit 1
|
||||||
fi
|
fi
|
||||||
echo "[install] Не все сервисы healthy (попытка $attempt/$UP_ATTEMPTS) — жду 10с и повторяю..."
|
echo "[install] Не все сервисы healthy (попытка $attempt/$UP_ATTEMPTS) — жду 10с и повторяю..."
|
||||||
@@ -413,7 +437,7 @@ if [ "$FRESH_ENV" != "1" ]; then
|
|||||||
fi
|
fi
|
||||||
if [ "$APPLY_PRESET_SETTINGS" = "1" ]; then
|
if [ "$APPLY_PRESET_SETTINGS" = "1" ]; then
|
||||||
echo "[install] Применяю настройки модулей инстанса под пресет ${PRESET}"
|
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
|
else
|
||||||
echo "[install] Настройки модулей инстанса НЕ изменены — сохранены ручные правки администратора"
|
echo "[install] Настройки модулей инстанса НЕ изменены — сохранены ручные правки администратора"
|
||||||
fi
|
fi
|
||||||
@@ -436,7 +460,7 @@ cat <<EOF
|
|||||||
|
|
||||||
Мониторинг (Grafana/Prometheus) — отдельный профиль compose, не входит
|
Мониторинг (Grafana/Prometheus) — отдельный профиль compose, не входит
|
||||||
в базовые пресеты:
|
в базовые пресеты:
|
||||||
docker compose -f ${COMPOSE_FILE} --profile monitoring up -d
|
docker compose -f ${COMPOSE_FILE} --env-file ${ENV_FILE} --profile monitoring up -d
|
||||||
Grafana: http://localhost:3001 (${GRAFANA_USER:-admin} / см. .env GRAFANA_ADMIN_PASSWORD)
|
Grafana: http://localhost:3001 (${GRAFANA_USER:-admin} / см. .env GRAFANA_ADMIN_PASSWORD)
|
||||||
|
|
||||||
Настройки модулей инстанса (чат, уровень AI) синхронизированы под
|
Настройки модулей инстанса (чат, уровень AI) синхронизированы под
|
||||||
|
|||||||
Reference in New Issue
Block a user