Архитектура и развёртывание
Архитектура сервиса, требования к серверу, структура кода, локальный запуск и production-конфигурация с systemd.
PrimeMeet — это Node.js/Express backend со встроенным фронтендом, SQLite-хранилищем и набором внешних подсистем: LiveKit для WebRTC, TURN для сложных сетей, MediaMTX для HDMI/RTSP и Python-worker для транскрипции. Ниже — архитектура, требования, получение кода, локальный запуск и production-конфигурация.
Архитектура сервиса
Клиенты: Web/PWA, Capacitor Android, Electron
│ HTTPS + WebSocket
▼
PrimeMeet Node: Express HTTP API, WebSocket /ws, background jobs
├── Хранилище: SQLite app.db, data/uploads, data/audio
├── Медиа: LiveKit → TURN, MediaMTX
└── AI: PrimeResume worker, DeepSeek
Backend
| Модуль | Назначение |
|---|---|
backend/server.js | HTTP routes, middleware, static, webhooks |
backend/runtime.js | Запуск и фоновые интервалы |
backend/store.js | SQLite schema и запросы |
backend/auth.js | JWT разных типов |
backend/realtime.js | WebSocket |
backend/calls.js | LiveKit tokens и RoomService |
backend/conferences.js | Lifecycle конференций |
backend/transcripts.js | Очередь транскрипции |
backend/summaries.js | LLM summaries |
backend/notifications.js | FCM и Web Push |
backend/reports.js | Шаблоны и отчеты |
Хранилище
data/app.db SQLite
data/app.db-wal SQLite WAL
data/app.db-shm SQLite shared memory
data/uploads/ вложения чатов
data/audio/ аудио PrimeResume
data/office-previews/ PDF preview Office
data/report-examples/ примеры отчетов
data/vapid.json Web Push keys
data/fcm-service-account.json FCM credentials
WebSocket
Клиент подключается:
wss://host/ws?token=<session-jwt>
Основные события: presence, typing, dm, chat groups, calls, conferences, transcripts, summaries, servers, voice channels.
Background runtime
Runtime выполняет: GC call sessions, GC stream tokens, GC conference participants, conference lifecycle, transcript queue, transcript retention, summary queue, email invitations, meeting reminders.
Требования к серверу
Минимум для теста
| Ресурс | Значение |
|---|---|
| CPU | 4 vCPU |
| RAM | 8 ГБ |
| SSD | 100 ГБ |
| ОС | Ubuntu Server LTS |
| Node.js | Совместимый с dependencies проекта |
| Python | 3.10+ для worker |
Production без GPU
Для небольшого количества пользователей: 8–16 CPU cores, 32 ГБ RAM, NVMe, отдельный объем для data, ffmpeg, локальные модели, оптимизированные под CPU. Транскрипция может выполняться медленнее реального времени.
Production с GPU
GPU ускоряет Whisper/ASR, но не заменяет CPU и память. Для небольших моделей подходит NVIDIA с 6–12 ГБ VRAM при совместимой CUDA-конфигурации.
Отдельные узлы
При росте нагрузки разделите Node backend, LiveKit, TURN, PrimeResume worker, файловое хранилище и backup.
Порты
Типовая схема:
| Порт | Сервис | Публикация |
|---|---|---|
| 443/TCP | Reverse proxy | Да |
| 3000/TCP | PrimeMeet Node | Нет |
| 7880/TCP | LiveKit API/WS | Через proxy |
| 7881/TCP | LiveKit RTC TCP | По конфигурации |
| UDP range | LiveKit media | Да |
| 3478/UDP/TCP | TURN | Да |
| 5349/TCP | TURN TLS | Да |
| 8001/TCP | Whisper worker | Только localhost |
| 8888/8889 | MediaMTX | Через proxy |
Сверяйте порты с реальными конфигурациями LiveKit, TURN и firewall.
Получение и структура кода
Клонирование
git clone http://198.51.100.2/prime-web/prime-meet.git
cd prime-meet
Для приватного GitLab потребуется учетная запись с доступом к группе.
Каталоги
| Каталог | Назначение |
|---|---|
backend/ | Node.js/Express |
frontend/ | Web/PWA |
workers/whisper/ | ASR worker |
mobile/ | Android Capacitor |
electron/ | Desktop shell |
scripts/ | Запуск и MediaMTX |
docs/ | Документация |
design/ | Макеты |
data/ | Runtime data, не Git |
runtime/ | Generated config, не Git |
Ветка
Формат:
<type>/primemeet-<task-id>-<short-desc>
Пример:
feat/primemeet-00-recorder-import
Секреты
Перед публикацией:
git status --short
git grep -nE 'glpat-|sk-[A-Za-z0-9]{20,}|BEGIN .*PRIVATE KEY'
Также проверьте untracked файлы.
Локальный запуск
Зависимости
node --version
npm --version
ffmpeg -version
Установка
cp .env.example .env
npm install
npm start
Откройте:
http://127.0.0.1:3000/meet
Health
curl -fsS http://127.0.0.1:3000/api/health
Ожидается:
{"ok":true,"service":"primemeet"}
Без LiveKit
Без LIVEKIT_* доступны регистрация, профиль, большинство чатов, файлы и календарный UI. Звонки и конференции не подключатся.
Тесты и проверки синтаксиса
npm test
node --check backend/server.js
node --check backend/runtime.js
git diff --check
Тесты должны завершиться без failure.
Production-конфигурация
Runtime paths
Текущая production-совместимая структура:
APP_ROOT_DIR=/opt/primebroadcast
APP_PUBLIC_DIR=/opt/primebroadcast/frontend
APP_DATA_DIR=/opt/primebroadcast/data
APP_RUNTIME_DIR=/opt/primebroadcast/runtime
MEDIA_WORK_DIR=/opt/primebroadcast/.bin/mediamtx
MEDIA_BINARY_PATH=/opt/primebroadcast/.bin/mediamtx/mediamtx
APP_HOST=127.0.0.1
PORT=3000
Примечание. Историческое имя
/opt/primebroadcastсохраняется ради совместимости. Пользовательское название сервиса — PrimeMeet.
Обязательные секреты
NODE_ENV=production
APP_JWT_SECRET=<unique-long-secret>
STREAM_JWT_SECRET=<unique-long-secret>
LIVEKIT_API_KEY=<livekit-key>
LIVEKIT_API_SECRET=<livekit-secret>
Генерация секретов
openssl rand -base64 64
Создайте разные значения для разных назначений.
Права
sudo useradd --system --home /opt/primebroadcast --shell /usr/sbin/nologin primebroadcast
sudo chown -R primebroadcast:primebroadcast /opt/primebroadcast
sudo chmod 700 /opt/primebroadcast/runtime
sudo chmod 700 /opt/primebroadcast/data
sudo chmod 600 /opt/primebroadcast/runtime/env
Systemd
[Unit]
Description=PrimeMeet backend
After=network-online.target
Wants=network-online.target
[Service]
Type=simple
User=primebroadcast
Group=primebroadcast
WorkingDirectory=/opt/primebroadcast
EnvironmentFile=/opt/primebroadcast/runtime/env
ExecStart=/usr/bin/node /opt/primebroadcast/scripts/start.js
Restart=on-failure
RestartSec=3
KillSignal=SIGTERM
TimeoutStopSec=10
[Install]
WantedBy=multi-user.target
Запуск
sudo systemctl daemon-reload
sudo systemctl enable --now primebroadcast-backend
sudo systemctl status primebroadcast-backend --no-pager
Важно. Не копируйте
data/из Git. Production-БД и пользовательские файлы живут отдельно от кода.
Следующий шаг — настройка подсистем: LiveKit, TURN, TLS и интеграции.