Files
vidconf/.env.example
Max Ronzhin daaa480f03
Some checks failed
CI / backend (push) Has been cancelled
CI / frontend (push) Has been cancelled
release: версия 0.0.18
2026-08-01 23:42:53 +03:00

181 lines
11 KiB
Plaintext
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# --- Database ---
POSTGRES_USER=vidconf
POSTGRES_PASSWORD=vidconf
POSTGRES_DB=vidconf
DATABASE_URL=postgresql+asyncpg://vidconf:vidconf@localhost:5432/vidconf
# --- Redis ---
# Обязателен (${REDIS_PASSWORD:?} в docker-compose.yml) — redis запускается
# с --requirepass, публикация без пароля = открытый redis в интернет (см.
# .forcc/deploy/SESSION2-FINDINGS.md — реальный инцидент на этом проекте).
# install.sh генерирует случайное значение при первой установке.
REDIS_PASSWORD=change-me-redis-secret
# REDIS_URL нужен ТОЛЬКО для запуска backend/worker на хосте вне docker-сети
# (см. docs/deploy/dev-setup.md) — внутри контейнеров docker-compose.yml
# всегда подставляет redis://:${REDIS_PASSWORD}@redis:6379/0 сам, это
# значение игнорируя. Держите пароль в этой строке синхронным с REDIS_PASSWORD.
REDIS_URL=redis://:change-me-redis-secret@localhost:6379/0
# --- Seed admin user ---
SEED_ADMIN_EMAIL=admin@vidconf.example
SEED_ADMIN_PASSWORD=change-me
# --- Plugins ---
PLUGINS_CONFIG_PATH=config/plugins.yaml
# --- Auth (JWT + email-подтверждение) ---
JWT_SECRET=change-me-generate-a-long-random-secret
ACCESS_TOKEN_TTL_MINUTES=15
REFRESH_TOKEN_TTL_DAYS=14
EMAIL_VERIFICATION_TTL_HOURS=24
FRONTEND_URL=http://localhost:5173
# false только для dev по http://localhost (Safari не сохраняет
# Secure-cookie без HTTPS); в проде обязательно true.
AUTH_COOKIE_SECURE=false
# --- LiveKit (dev placeholders, replace in real .env) ---
# Без дефолтов в docker-compose.yml (${VAR:?}) — пустое/отсутствующее
# значение остановит `docker compose up` с явной ошибкой, а не тихо
# подставит небезопасный дефолт.
LIVEKIT_API_KEY=devkey
LIVEKIT_API_SECRET=change-me-livekit-secret
LIVEKIT_URL=ws://localhost:7880
# URL, который получает браузер клиента для подключения к LiveKit SFU
# (backend отдаёт его в join.livekit_url, фронт использует как serverUrl).
# ⚠️ КРИТИЧНО для прода на HTTPS: значение ДОЛЖНО быть `wss://<домен>/livekit/`
# (проксируется nginx на livekit:7880). Любой `ws://…` на https-странице =
# mixed-content → браузер режет соединение, конференция не стартует (Safari/
# Yandex жёстче). `ws://localhost:7880` тут — dev-плейсхолдер; в реальном .env
# для vidconf.ru: LIVEKIT_PUBLIC_URL=wss://vidconf.ru/livekit/
LIVEKIT_PUBLIC_URL=ws://localhost:7880
# --- Coturn (dev placeholders) ---
TURN_REALM=vidconf.local
TURN_STATIC_AUTH_SECRET=change-me-turn-secret
# Внешний IP/домен сервера — coturn (network_mode: host) не может определить
# его сам. 127.0.0.1 годится только для локальной разработки (без внешних
# участников конференции); в проде — реальный внешний IP/домен.
# Рендерится в deploy/coturn/turnserver.conf из turnserver.conf.template
# скриптом deploy/render-templates.sh (вызывается install.sh).
TURN_EXTERNAL_IP=127.0.0.1
# --- Nginx: TLS (443) + список доменов — deploy/nginx/nginx.conf.template ---
# Домены, которые обслуживает nginx (через пробел, все — в server_name).
NGINX_SERVER_NAMES=example.com www.example.com
# Каталог сертификата в /etc/letsencrypt/live/ — обычно primary-домен
# certbot-лайнеджа (SAN может покрывать и остальные домены из списка выше).
NGINX_CERT_NAME=example.com
# --- LiveKit: ICE/публичный адрес (deploy/livekit/livekit.yaml.template) ---
# use_external_ip=false + node_ip=127.0.0.1 — режим для локальной разработки
# (подробности — в самом шаблоне). В проде: true + реальный внешний IP/домен.
# Рендерится в deploy/livekit/livekit.yaml скриптом deploy/render-templates.sh
# (вызывается install.sh).
LIVEKIT_USE_EXTERNAL_IP=false
LIVEKIT_NODE_IP=127.0.0.1
# --- Транскрибация (профиль compose `transcribe`: egress + worker-transcriber) ---
# Общий путь тома `recordings` (egress пишет .ogg-треки, worker-transcriber
# читает их для faster-whisper). Внутри docker-сети менять не нужно —
# значение по умолчанию (см. deploy/docker-compose.yml) уже совпадает
# с точкой монтирования тома в обоих сервисах.
RECORDINGS_DIR=/recordings
# --- Производительность backend ---
# Число процессов uvicorn. Один процесс означает, что любой блокирующий вызов
# в обработчике останавливает весь event loop: параллельные входы в конференцию
# и WS-чат всех участников встают в очередь. Дефолт 2 рассчитан на 4-ядерный
# сервер, где ядра делятся с LiveKit (медиа важнее API).
UVICORN_WORKERS=2
# Пул соединений с БД НА КАЖДЫЙ воркер. Общий расход инстанса —
# UVICORN_WORKERS × (DB_POOL_SIZE + DB_MAX_OVERFLOW), плюс соединения Celery
# и alembic. Держите сумму заметно ниже max_connections у Postgres (по
# умолчанию 100), иначе вместо понятной ошибки приложения получите отказ БД.
DB_POOL_SIZE=10
DB_MAX_OVERFLOW=10
DB_POOL_TIMEOUT=10
# --- Email (рассылка саммари + .ics-приглашения) ---
# `console` — дефолт для dev (письмо только логируется, ссылка подтверждения
# email берётся из логов); `smtp` — реальная отправка через aiosmtplib.
# Переключатель — только .env (секреты SMTP никогда не попадают в БД/админку).
EMAIL_BACKEND=console
SMTP_HOST=localhost
SMTP_PORT=587
SMTP_USERNAME=
SMTP_PASSWORD=
SMTP_START_TLS=true
SMTP_USE_TLS=false
SMTP_FROM=VidConf <no-reply@vidconf.example>
SMTP_TIMEOUT_S=30
# --- Версия инстанса (релиз v0.0.1) ---
# install.sh копирует значение из корневого файла VERSION при каждой
# установке/обновлении — руками менять не нужно.
VIDCONF_VERSION=0.0.18
# --- Профили compose. Дефолт ниже (`media,monitoring`) — только для ручного
# `docker compose up` БЕЗ install.sh: медиа (LiveKit+coturn) + мониторинг,
# без ресурсоёмких transcribe/llm (whisper, worker-transcriber, egress,
# llama.cpp) — сервисы остаются в docker-compose.yml, просто не в дефолтном
# наборе профилей. install.sh ПЕРЕЗАПИСЫВАЕТ это значение по выбранному
# пресету инсталлятора (1/2 — media; 3 — +transcribe,llm; 4 — те же,
# WHISPER_MODEL/LLM_MODEL_* другого уровня; 5 — +transcribe-gpu,llm-gpu;
# monitoring install.sh нигде не включает — поднимайте отдельно, см.
# docs/deploy/monitoring.md). ---
COMPOSE_PROFILES=media,monitoring
# --- Настройки модулей инстанса под пресет ---
# install.sh пишет их по выбранному пресету, backend
# читает их при первом бутстрапе instance_settings (lifespan) вместо
# дефолтного «всё enabled: true» из config/plugins.yaml; те же значения
# использует scripts.apply_preset_settings при повторном применении. Пусто —
# бутстрап берёт дефолты plugins.yaml (как раньше, для dev без install.sh). ---
BOOTSTRAP_CHAT_ENABLED=
BOOTSTRAP_TRANSCRIPTION_ENABLED=
BOOTSTRAP_AI_LEVEL=
# --- Обнаруженное железо (install.sh, ADR-004) — читает
# backend/services/ai_levels.py для детекта доступности уровней AI в
# админке; НЕ влияет на то, что реально поднимает docker compose
# (это делает COMPOSE_PROFILES выше) — используется только для
# рекомендации/причин недоступности.
HW_CPUS=
HW_RAM_MB=
HW_GPU_NAME=
HW_VRAM_MB=
# --- Транскрибация: модель faster-whisper уровня AI (профили `transcribe`/
# `transcribe-gpu`) — small (min) / medium (medium) / large-v3 (max, только
# GPU), см. ADR-004. Пишет install.sh по выбранному пресету. ---
WHISPER_MODEL=small
# --- Суммаризация: модель Qwen3.5 уровня AI (профили `llm`/`llm-gpu`) —
# см. ADR-004 и deploy/llm/download-model.sh. Пишет install.sh по выбранному
# пресету; значения ниже — дефолт уровня `min`. ---
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_MIN_SIZE=2000000000
LLM_TOKENIZER_FILE=qwen3.5-4b-instruct.tokenizer.json
LLM_TOKENIZER_URL=https://huggingface.co/Qwen/Qwen3.5-4B/resolve/main/tokenizer.json
# --- Мониторинг (профиль compose `monitoring`) ---
# Prometheus (9090) и Grafana (3001) публикуются ТОЛЬКО на 127.0.0.1
# (deploy/docker-compose.yml) — с боевого сервера доступ через ssh-туннель,
# напр. `ssh -L 3001:127.0.0.1:3001 -L 9090:127.0.0.1:9090 <user>@<host>`,
# затем открыть http://localhost:3001 / :9090 у себя локально. То же для
# backend (8000, локальный curl-дебаг), livekit signaling (7880, снаружи
# работает только через nginx wss://) и llm/llm-gpu (8080/8081).
GRAFANA_ADMIN_USER=admin
GRAFANA_ADMIN_PASSWORD=change-me-grafana
# --- Присутствуют в .env боевого сервера, но НЕ читаются текущим кодом
# (backend/frontend) — ни backend/core/config.py, ни frontend/src не
# ссылаются на них (проверено grep'ом при харденинге репозитория). Оставлены
# здесь только для полноты покрытия реальных ключей сервера; вычистить или
# начать использовать — по итогам Сессии 2 (bug hunt). ---
MEDIA_URL=http://localhost/media/
VITE_API_URL=http://localhost
VITE_LIVEKIT_URL=ws://localhost:7880
NEXT_PUBLIC_LIVEKIT_URL=ws://localhost:7880