diff --git a/.env.example b/.env.example index 2ce4b78..7c8015a 100644 --- a/.env.example +++ b/.env.example @@ -98,7 +98,7 @@ SMTP_TIMEOUT_S=30 # --- Версия инстанса (релиз v0.0.1) --- # install.sh копирует значение из корневого файла VERSION при каждой # установке/обновлении — руками менять не нужно. -VIDCONF_VERSION=0.0.1 +VIDCONF_VERSION=0.0.2 # --- Профили compose. Дефолт ниже (`media,monitoring`) — только для ручного # `docker compose up` БЕЗ install.sh: медиа (LiveKit+coturn) + мониторинг, diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 0000000..a90458b --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,63 @@ +# Изменения + +Формат основан на [Keep a Changelog](https://keepachangelog.com/ru/1.1.0/), +проект придерживается [семантического версионирования](https://semver.org/lang/ru/). + +## [0.0.2] — 2026-07-26 + +Релиз воспроизводимого боевого развёртывания: конфигурация деплоя перенесена в +репозиторий как источник истины, устранён инцидент безопасности, добавлена +пошаговая инструкция для девопсов. + +### Безопасность +- `postgres` и `redis` сняты с публикации на `0.0.0.0` и привязаны к `127.0.0.1` + (docker писал DNAT в обход `ufw`, порты были открыты в интернет). +- Порты `backend`, `livekit`-signaling, `prometheus`, `grafana`, `llm` также + переведены на loopback — наружу остаются только `80/443/7881` (+ UDP `54000-54100`). +- Для `redis` включена обязательная аутентификация (`--requirepass`); пароль + проброшен во всех потребителей (backend, worker, exporter, livekit, egress). + +### Развёртывание и инфраструктура +- `nginx`/`coturn`/`livekit`: TLS на 443, http→https редирект, ACME-webroot; + конфиги вынесены в `*.template` и рендерятся через `deploy/render-templates.sh` + (`envsubst`). Секреты — только из `.env`, обязательны (`${VAR:?}`), без + небезопасных дефолтов. +- `--env-file .env` добавлен во все вызовы `docker compose` (без него compose не + подхватывал корневой `.env` и брал dev-дефолты — корень бага «конференции не + работают у других» и `WARN: LIVEKIT_API_KEY not set`). +- Мониторинг развязан от опционального LLM: `job=llm`/алерт `LlmDown` + закомментированы для профилей без `llm`/`llm-gpu`. +- `install.sh`: fail-fast валидация — установка останавливается с понятной + ошибкой, если на боевом домене остались dev-плейсхолдеры (`example.com`, + `ws://localhost`, `devkey` и т.п.), вместо тихого подъёма нерабочего прода. +- `install.sh`: флаг `--monitoring` (Grafana/Prometheus раньше не поднимались + ни в одном пресете). +- `.env.example` покрывает все параметры деплоя; дефолтные профили — + `media,monitoring`. + +### Исправления +- `nginx`: `/openapi.json` больше не перехватывается SPA-фолбэком, а отдаётся + схемой backend. +- Предупреждение в `.env.example`: `LIVEKIT_PUBLIC_URL` в HTTPS-проде обязан + быть `wss://`. + +### Документация +- Добавлено `docs/deploy/DEPLOYMENT.md` — полное руководство от голой Ubuntu 24 + до рабочего `https://<домен>`: SSL, `.env`, профили, траблшутинг, доступ к + мониторингу через ssh-туннель, описание панелей, runbook включения + транскрибации/суммаризации. Ссылки добавлены в `README.md`. +- `docs/deploy/install.md`: задокументирован флаг `--monitoring`. + +### Примечания по эксплуатации +- На боевом сервере исправлен certbot deploy-hook (`nginx -s reload` → `restart`): + без этого после автопродления сертификата nginx продолжал бы отдавать старый. +- TURN-раздача клиентам (`rtc.turn_servers` + TURN/TLS на 443) остаётся + опциональной — кросс-сетевое медиа проверено вживую и работает без неё; + нужна только для экстремального NAT (CGNAT/жёсткий корпоративный firewall). + +## [0.0.1] + +Первоначальная версия VidConf. + +[0.0.2]: https://github.com/MaxRonzhin/vidconf_rel/releases/tag/v0.0.2 +[0.0.1]: https://github.com/MaxRonzhin/vidconf_rel/releases/tag/v0.0.1 diff --git a/VERSION b/VERSION index 8acdd82..4e379d2 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -0.0.1 +0.0.2 diff --git a/deploy/docker-compose.yml b/deploy/docker-compose.yml index eb54f02..947721b 100644 --- a/deploy/docker-compose.yml +++ b/deploy/docker-compose.yml @@ -82,7 +82,7 @@ services: MEDIA_ROOT: ${MEDIA_ROOT:-/app/media} # Версия инстанса (релиз v0.0.1) — install.sh копирует значение # из файла VERSION (корень репозитория) в .env; отдаётся в GET /api/health. - VIDCONF_VERSION: ${VIDCONF_VERSION:-0.0.1} + VIDCONF_VERSION: ${VIDCONF_VERSION:-0.0.2} # config/ лежит в корне репозитория и не попадает в образ (контекст сборки — # только backend/), поэтому plugins.yaml монтируется отдельно. volumes: