2026-03-22 11:49:30 +03:00

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)

Быстрый старт (автоматический)

git clone <repo-url> && 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. Клонировать и установить зависимости

git clone <repo-url> && cd LiveServer-M1
npm install

2. Настроить окружение

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. Запустить базу данных

docker compose up -d postgres minio redis pgbouncer

Поднимет PostgreSQL (localhost:5432), MinIO (localhost:9000, консоль: 9001), Redis (localhost:6379), PgBouncer (localhost:6432).

4. Применить миграции

npx prisma migrate dev --name init

Или для быстрого прототипирования без миграций:

npx prisma db push

5. Запустить приложение

npm run dev

Приложение: http://localhost:3000

Первый администратор: первый зарегистрированный пользователь автоматически получает роль ADMIN.

6. (Опционально) AI Agent

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:

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

DOMAIN=live.example.com
ACME_EMAIL=admin@example.com
POSTGRES_PASSWORD=<strong-password>
MINIO_ROOT_PASSWORD=<strong-password>
BETTER_AUTH_SECRET=<random-string>
BETTER_AUTH_URL=https://live.example.com
NEXT_PUBLIC_APP_URL=https://live.example.com

3. Запустить

docker compose -f docker-compose.yml -f docker-compose.prod.yml up -d --build

Traefik автоматически получит SSL-сертификат через Let's Encrypt.

Команды

# 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 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
POST /api/livekit/token Генерация токена LiveKit

Требуют участия в комнате (sessionId)

Метод Путь Описание
GET/POST /api/rooms/:id/chat Чат комнаты
GET/POST /api/rooms/:id/files Файлы комнаты

Роли

Роль Возможности
ADMIN Всё + глобальная панель, мониторинг всех комнат
HOST Создание комнат, модерация, настройки безопасности
GUEST Вход по ссылке, участие в лекции (без регистрации)
Description
Livekit core - Server for VideoHosting
Readme AGPL-3.0 759 KiB
Languages
TypeScript 65%
Shell 28.5%
Python 4.9%
CSS 1%
Dockerfile 0.5%
Other 0.1%