PrimeMeet

Архитектура и развёртывание

Архитектура сервиса, требования к серверу, структура кода, локальный запуск и 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.jsHTTP routes, middleware, static, webhooks
backend/runtime.jsЗапуск и фоновые интервалы
backend/store.jsSQLite schema и запросы
backend/auth.jsJWT разных типов
backend/realtime.jsWebSocket
backend/calls.jsLiveKit tokens и RoomService
backend/conferences.jsLifecycle конференций
backend/transcripts.jsОчередь транскрипции
backend/summaries.jsLLM summaries
backend/notifications.jsFCM и 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.

Требования к серверу

Минимум для теста

РесурсЗначение
CPU4 vCPU
RAM8 ГБ
SSD100 ГБ
ОСUbuntu Server LTS
Node.jsСовместимый с dependencies проекта
Python3.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/TCPReverse proxyДа
3000/TCPPrimeMeet NodeНет
7880/TCPLiveKit API/WSЧерез proxy
7881/TCPLiveKit RTC TCPПо конфигурации
UDP rangeLiveKit mediaДа
3478/UDP/TCPTURNДа
5349/TCPTURN TLSДа
8001/TCPWhisper workerТолько localhost
8888/8889MediaMTXЧерез 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 и интеграции.

Обновлено: 3 августа 2026 г.