code/emeeting-ui- React + TypeScript frontendcode/emeeting-backend- Go (Gin) backend API + WebSocketcode/ai-gateway- Python gateway for WS/AI handlers (DeepFace, отчёты, вызов ASR)code/speech-service- HTTP ASR (stub или faster-whisper), см.SPEECH_ASR_ENGINEdocker-compose.yml/docker-compose.prod.yml- оркестрация стека
- Индекс (
code/docs/README.md): контракты API/WS, наблюдаемость, планы UI и AI, ссылки на README сервисов. - Отчёты и хранение аналитики (
code/docs/REPORTS_AND_ANALYTICS_STORAGE.md): маршруты/reports, что пишется в БД, поля stub-отчёта,face_debugбез persist. - Замена заглушек AI (
code/docs/AI_STUB_TO_PRODUCTION_ROADMAP.md): фазы и связь с беклогом BL-AI-101… вcode/cursor backlog.md. - Беклог задач:
code/cursor backlog.md.
Requirements:
- Docker Desktop (or Docker Engine)
- Docker Compose plugin
- Start stack без тяжёлого AI (db + backend + ui):
docker compose up --build- Опционально — AI профиль (speech-service + ai-gateway; первый запуск Whisper может долго качать модель):
docker compose --profile ai up --buildПеременные (опционально):
SPEECH_ASR_ENGINE=stub— быстрый контрактный stub без распознавания (меньше CPU/RAM при сборке).AI_GATEWAY_SESSION_ID— ID комнаты WS (SESSION_IDв контейнере gateway), должен совпадать с тем же номером в URL встречи в UI (по умолчанию1).
В Docker gateway читает конфиг code/ai-gateway/modules.docker.json (speech_service_url: http://speech-service:8090). Локально без Compose используйте modules.default.json и свой URL.
- Open services:
- UI:
http://localhost:5173 - Backend API:
http://localhost:8080 - Backend health:
http://localhost:8080/ws/health - Postgres:
localhost:5432
- Stop stack:
docker compose down- Reset DB data (fresh bootstrap):
docker compose down -vcd code/emeeting-backend
go test ./...
go run ./cmd/serverDefault backend URL: http://localhost:8080
cd code/emeeting-ui
npm install
npm run lint
npm run build
npm run devDefault UI URL: http://localhost:5173
In dev mode Vite proxies /api and /ws to http://localhost:8080, so VITE_API_URL=/api and VITE_WS_URL=/ws work locally without extra env.
cd code/ai-gateway
python -m pip install -r requirements.txt
export SESSION_ID=1 # совпадайте с id сессии в UI
python main.pyКонфиг модулей: по умолчанию modules.default.json; переопределение путём AI_GATEWAY_MODULES_CONFIG=/path/to.json.
cd code/speech-service
python -m pip install -r requirements.txt
# опционально: export SPEECH_ASR_ENGINE=whisper (нужен ffmpeg)
uvicorn main:app --host 0.0.0.0 --port 8090Подробнее: code/speech-service/README.md.
- Versioned SQL migrations live in:
code/emeeting-backend/migrations/upcode/emeeting-backend/migrations/down
- On fresh startup,
docker composeauto-applies onlyupscripts via/docker-entrypoint-initdb.d. - Rollback instructions are documented in
code/emeeting-backend/migrations/README.md.
docker compose up --buildstarts all services without crash loops.GET http://localhost:8080/ws/healthreturns statusok.- UI opens and can call backend endpoints (
/sessions,/auth/login,/sessions/:id/analysis/reportдля организатора, страницы/reports). - Backend tests pass locally:
go test ./.... - UI quality checks pass locally:
npm run lint && npm run build. - Для AI-пайплайна (профиль
ai) в live-сессии появляются WS событияtext_analysisиaudio_analysis. analysis_report_partialв gateway нормализуется по стабильной структуре перед отправкой в UI.
- Backend fails to connect DB
- Check
POSTGRES_DSNin compose/env. - Ensure DB container is healthy before backend start.
- Check
- UI cannot reach API or WS
- Check
VITE_API_URLandVITE_WS_URL. - Verify backend exposed on port
8080.
- Check
- WS closes immediately
- Confirm
GET /ws/sessions/:idis reachable. - Check backend logs for upgrade errors.
- Confirm
- AI profile is up, but no transcript
- Verify
docker compose --profile ai psshows healthyspeech-service. - Ensure meeting URL session id matches
AI_GATEWAY_SESSION_ID. - Temporarily set
SPEECH_ASR_ENGINE=stubto isolate ASR performance/model issues.
- Verify
- DB schema missing
- Reset volumes (
docker compose down -v) and start again. - Verify scripts exist in
migrations/up.
- Reset volumes (
- Backend config in compose:
POSTGRES_DSNSERVER_PORTCORS_ALLOW_ORIGIN
- UI config in compose:
VITE_API_URLVITE_WS_URL- path prefix mode (
/ws) or absolute ws base (ws://host:port)
- path prefix mode (
- AI gateway config in compose:
BACKEND_WS_BASE_URLSESSION_ID(илиAI_GATEWAY_SESSION_IDв корневомdocker-compose.yml)AI_GATEWAY_MODULES_CONFIG(в образе с Compose:/app/modules.docker.json)AI_GATEWAY_CONFIG_POLL_SEC(период опроса файла конфига для hot-reload; в prod см.docker-compose.prod.yml)
- Speech service (
--profile ai):SPEECH_ASR_ENGINE(stub|whisper)WHISPER_MODEL_SIZE(напримерbase,tiny)
Демо пользователи хранятся в таблице auth_user (пароли — bcrypt в password_hash; при необходимости при первом входе выполняется rehash со старых схем).
demo1@example.com/demo1passdemo2@example.com/demo2pass
В UI поля логина/пароля по умолчанию заполнены для пользователя demo1.
TODO: будет cookie-based auth (HttpOnly cookie / session token) вместо хранения только isAuthenticated в frontend state.
- A VDS with Docker Engine + Docker Compose plugin
- A domain name pointing to your VDS IP (A/AAAA records)
- Open ports 80 and 443 in firewall/security group
docker-compose.prod.yml– production stack (db + backend + ui + caddy)Caddyfile– HTTPS + reverse proxy.env.prod.example– example environment file
Те же сервисы, что и локально, включаются профилем ai:
docker compose -f docker-compose.prod.yml --env-file .env.prod --profile ai up -d --buildБез профиля поднимаются только db, backend, ui, caddy. Убедитесь, что ресурсов хватает под Whisper (CPU/RAM) или задайте SPEECH_ASR_ENGINE=stub.
- Copy
.env.prod.exampleto.env.prodand fill values:
DOMAIN(your domain)JWT_SECRET(generate a long random string)POSTGRES_PASSWORD
- Start the stack:
docker compose -f docker-compose.prod.yml --env-file .env.prod up -d --build- Open the app:
https://<DOMAIN>/
- Camera/mic:
getUserMediaworks onhttps://<DOMAIN>and onhttp://localhost(browser secure-context rules). - Caddy TLS: certificates are stored in
caddy_datavolume.