# LiveServer-M1 Образовательная видеоконференц-платформа на базе LiveKit. Демонстрация экрана, AI-транскрипция, модерация, пост-лекционные артефакты. ## Стек - **Frontend:** Next.js 16, React 19, TypeScript, Tailwind CSS v4 - **Video:** LiveKit (`@livekit/components-react`) - **Backend:** Next.js Route Handlers, `livekit-server-sdk` - **Auth:** `better-auth` + Prisma adapter - **AI Agent:** Python, `livekit-agents`, Deepgram STT, OpenAI GPT - **DB:** PostgreSQL + Prisma 7 + PgBouncer (connection pooling) - **Cache/PubSub:** Redis 7 (real-time chat, lobby, rate limiting) - **Storage:** MinIO (S3-compatible) - **Proxy:** Traefik v3 + Let's Encrypt (production) ## Быстрый старт (автоматический) ```bash git clone && cd LiveServer-M1 chmod +x setup.sh # Первоначальная установка (интерактивная) ./setup.sh install # Ежедневная разработка (одна команда: pull + deps + containers + prisma + run) ./setup.sh dev ``` Скрипт `./setup.sh install` проведёт через все шаги: проверит зависимости, спросит настройки, сгенерирует `.env`, поднимет Docker, применит миграции, создаст S3 bucket, создаст первого администратора. `./setup.sh dev` — автоматически обновляет код, ставит зависимости, поднимает контейнеры, ждёт их готовности, синхронизирует схему БД, освобождает порт 3000 и запускает dev-сервер. ## Быстрый старт (ручной) ### 1. Клонировать и установить зависимости ```bash git clone && cd LiveServer-M1 npm install ``` ### 2. Настроить окружение ```bash cp .env.example .env ``` Заполни в `.env`: | Переменная | Описание | |---|---| | `DATABASE_URL` | PostgreSQL connection string. Для Docker: `postgresql://postgres:postgres@localhost:5432/liveserver` | | `LIVEKIT_URL` | URL LiveKit сервера (`wss://...livekit.cloud` или self-hosted) | | `LIVEKIT_API_KEY` | API Key из LiveKit Dashboard | | `LIVEKIT_API_SECRET` | API Secret из LiveKit Dashboard | | `BETTER_AUTH_SECRET` | Любая случайная строка для подписи сессий | | `DEV_ACCESS_KEY` | Ключ доступа для локалки (защита от посторонних в сети) | Остальные переменные опциональны для начала — AI Agent и MinIO нужны позже. ### 3. Запустить базу данных ```bash docker compose up -d postgres minio redis pgbouncer ``` Поднимет PostgreSQL (`localhost:5432`), MinIO (`localhost:9000`, консоль: `9001`), Redis (`localhost:6379`), PgBouncer (`localhost:6432`). ### 4. Применить миграции ```bash npx prisma migrate dev --name init ``` Или для быстрого прототипирования без миграций: ```bash npx prisma db push ``` ### 5. Запустить приложение ```bash npm run dev ``` Приложение: `http://localhost:3000` (или `https://localhost:3000` с `npm run dev:https` для доступа к камере/микрофону по LAN) **Первый администратор:** первый зарегистрированный пользователь автоматически получает роль ADMIN. ### 6. (Опционально) AI Agent ```bash cd ai-agent pip install -r requirements.txt python main.py start ``` Требует `DEEPGRAM_API_KEY` и `OPENAI_API_KEY` в `.env`. ## Защита на локалке Когда `DOMAIN` не задан, middleware блокирует доступ без ключа: ``` http://192.168.x.x:3000?key=mySecretKey123 ``` Ключ задаётся в `DEV_ACCESS_KEY`. После первого входа ставится cookie на 7 дней. Дополнительно можно ограничить по IP: ```env ALLOWED_IPS=192.168.1.10,192.168.1.11 ``` Localhost (`127.0.0.1`, `::1`) разрешён всегда. ## Production (с доменом) ### 1. Настроить DNS Направить на IP сервера: - `live.example.com` → приложение - `s3.live.example.com` → MinIO API - `minio.live.example.com` → MinIO Console ### 2. Заполнить `.env` ```env DOMAIN=live.example.com ACME_EMAIL=admin@example.com POSTGRES_PASSWORD= MINIO_ROOT_PASSWORD= BETTER_AUTH_SECRET= BETTER_AUTH_URL=https://live.example.com NEXT_PUBLIC_APP_URL=https://live.example.com ``` ### 3. Запустить ```bash docker compose -f docker-compose.yml -f docker-compose.prod.yml up -d --build ``` Traefik автоматически получит SSL-сертификат через Let's Encrypt. ## Команды ```bash # Setup script (рекомендуемый способ) ./setup.sh # Интерактивное меню ./setup.sh dev # Обновить + запустить dev-сервер (one command) ./setup.sh install # Первоначальная установка ./setup.sh update # git pull + npm install + prisma + rebuild ./setup.sh doctor # Диагностика и автоисправление ./setup.sh status # Статус всех сервисов ./setup.sh admin # Создать администратора ./setup.sh restart # Перезапуск контейнеров ./setup.sh logs [service] # Логи сервиса (default: app) ./setup.sh reset # Полный сброс (с подтверждением) # Разработка (ручной запуск) npm run dev # Next.js dev server npm run dev:https # Dev server с HTTPS (для камеры/микрофона по LAN) npm run lint # TypeScript type-check (tsc --noEmit) npm run build -- --webpack # Production build (Webpack, не Turbopack — WASM на Windows) # База данных npx prisma generate # Регенерация Prisma Client npx prisma db push # Синхронизировать схему без миграции npx prisma studio # GUI для БД # Docker docker compose up -d postgres minio redis pgbouncer # Инфра для dev docker compose up -d --build # Локалка с билдом app docker compose -f docker-compose.yml -f docker-compose.prod.yml up -d --build # Прод docker compose logs -f app # Логи приложения ``` ## Структура проекта ``` ├── src/ │ ├── app/ │ │ ├── api/ │ │ │ ├── auth/[...all]/ # better-auth handler │ │ │ ├── rooms/ # CRUD комнат │ │ │ ├── rooms/[roomId]/ # join, lobby, chat, files, moderate, start, end │ │ │ ├── rooms/by-code/[code]/ # Публичный поиск по инвайт-коду │ │ │ └── livekit/ # token, webhook │ │ ├── (dashboard)/ # Дашборд хоста/админа │ │ ├── join/[code]/ # Страница входа гостя │ │ ├── room/[code]/ # Комната видеоконференции │ │ ├── login/ # Вход │ │ └── register/ # Регистрация │ ├── components/ │ │ ├── room/ # ChatPanel, ModerationPanel │ │ └── lobby/ # WaitingRoom, LobbyManager │ ├── lib/ # prisma, auth, livekit, auth-helpers │ ├── middleware.ts # Защита локалки (DEV_ACCESS_KEY, ALLOWED_IPS) │ └── types/ ├── ai-agent/ # Python LiveKit Agent │ ├── main.py │ ├── requirements.txt │ └── Dockerfile ├── prisma/ │ └── schema.prisma ├── docker-compose.yml # Базовые сервисы ├── docker-compose.override.yml # Локальные порты (автоподхват) ├── docker-compose.prod.yml # Traefik + SSL ├── Dockerfile # Multi-stage build Next.js └── .env.example ``` ## API Endpoints ### Публичные (без авторизации) | Метод | Путь | Описание | |---|---|---| | `*` | `/api/auth/*` | better-auth (login, register, session) | | `GET` | `/api/rooms/by-code/:code` | Инфо о комнате по инвайт-коду | | `POST` | `/api/rooms/:id/join` | Вход гостя (PIN, fingerprint) | | `GET` | `/api/rooms/:id/lobby/stream` | SSE ожидание в лобби | | `POST` | `/api/livekit/webhook` | Вебхуки LiveKit | ### Требуют авторизации (Host/Admin) | Метод | Путь | Описание | |---|---|---| | `GET/POST` | `/api/rooms` | Список / создание комнат | | `GET/PATCH/DELETE` | `/api/rooms/:id` | Управление комнатой | | `POST` | `/api/rooms/:id/start` | Старт лекции | | `POST` | `/api/rooms/:id/end` | Завершение лекции | | `GET/POST` | `/api/rooms/:id/lobby` | Управление лобби | | `POST` | `/api/rooms/:id/moderate` | Kick, ban, mute all (self-ban protected) | | `POST` | `/api/livekit/token` | Генерация токена LiveKit | ### Требуют участия в комнате (sessionId) | Метод | Путь | Описание | |---|---|---| | `GET/POST` | `/api/rooms/:id/chat` | Чат комнаты | | `GET/POST` | `/api/rooms/:id/files` | Файлы комнаты | ## Роли | Роль | Возможности | |---|---| | **ADMIN** | Всё + глобальная панель, мониторинг всех комнат | | **HOST** | Создание комнат, модерация, настройки безопасности | | **GUEST** | Вход по ссылке, участие в лекции (без регистрации) | ## Возможности v0.0.1 - Видеоконференции (камера, микрофон, демонстрация экрана) - Google Meet-style UI: нижняя панель управления, тёмная тема - Автофокус при демонстрации экрана (карусель камер + фокус на экране) - Зал ожидания (lobby) с SSE через Redis pub/sub - PIN-коды для комнат (bcrypt + rate limiting) - Real-time чат (SSE + optimistic UI, дедупликация) - Модерация: kick, ban по fingerprint, mute all - Поднятие руки (вебинар-режим) - Первый пользователь автоматически → ADMIN - HTTPS для локальной разработки (`--experimental-https`) - Универсальный setup.sh (install/dev/doctor/status/update)