# lumen-meeting **Repository Path**: stringlxd_admin/lumen-meeting ## Basic Information - **Project Name**: lumen-meeting - **Description**: lumen 会议 开源视频会议 解决方案 为 中小企业 定制 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 1 - **Forks**: 0 - **Created**: 2026-04-29 - **Last Updated**: 2026-05-09 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # Lumen Meeting Lumen Meeting 是一个基于 LiveKit 的视频会议项目,当前优先完善桌面端、H5 复用、API 服务和运维管理端。项目目标不是前端 Demo,而是把会议创建、加入、账号、会控、音视频、屏幕共享、聊天、录制、白板、文件附件、API 配置和部署链路完整串起来。 ## 当前能力 - 桌面端:Tauri 2 + Vue 3,支持自定义标题栏、系统托盘、快速会议、发起会议、预约会议、加入会议、最近会议、API 地址配置和入会链接解析。 - 手机 H5:复用桌面端 Vue 前端,根据平台切换移动端布局;支持手机浏览器拉起摄像头和麦克风入会,观看屏幕共享和聊天。 - 账号体系:邮箱注册、登录、当前用户查询、退出登录、前端登录拦截;用户昵称优先来自登录账号。 - 实时会议:LiveKit 音视频、远端音频、远端视频、屏幕共享、共享优先布局、参会者宫格、会议邀请复制。 - 会控能力:主持人结束会议、转让主持人、锁定会议、移除成员、全员静音、成员昵称修改、会议设置实时同步。 - 会议设置:创建/预约/会议中可配置成员默认音视频、成员屏幕共享、成员白板、成员聊天权限。 - 白板 MVP:会议内 Canvas 白板,支持画笔、橡皮、清空,通过 LiveKit data channel 同步,不做持久化。 - 聊天增强:文本聊天、图片预览、常用文件附件、历史记录、未读提示;附件由 API 本地目录保存。 - 录制:LiveKit RoomComposite Egress 输出 MP4,支持手动录制、主持人入会自动录制、短期链接下载和 MP4 预览播放;未配置 Egress 时自动关闭录制入口。 - 文件治理:管理端可查看本地录制/附件目录占用、保留天数、过期文件数量,并可清理过期文件。 - 质量诊断:展示 API、LiveKit、连接质量、重连、码率、丢包、RTT、设备和媒体统计。 - API 管理端:独立 `apps/admin`,支持总览、会议管理、用户管理、录制/附件文件管理、系统诊断和审计日志。 - 数据存储:默认内存仓储,支持 PostgreSQL 持久化账号、会话、会议、参会记录、聊天记录、录制记录、附件元数据和审计日志。 ## 技术栈 | 模块 | 技术 | | --- | --- | | 桌面端 | Tauri 2、Rust | | 前端 | Vue 3、Vite、TypeScript | | UI | TDesign Vue Next、TDesign Icons | | 状态管理 | Pinia | | 实时音视频 | LiveKit、livekit-client | | API 服务 | Rust、axum、tokio、tower-http | | 业务核心 | Rust workspace crate:`meeting-core`、`common` | | 数据库 | 内存仓储、PostgreSQL、sqlx | | 认证 | 邮箱密码、argon2、服务端登录会话 | | 部署组件 | LiveKit、Redis、PostgreSQL、coturn、Docker Compose | ## 项目结构 ```text lumen-meeting/ |- apps/ | |- api/ # Rust API 服务 | |- admin/ # Vue 3 + TDesign API 管理端 | `- desktop/ # Tauri 2 + Vue 3 桌面端和 H5 前端 |- crates/ | |- common/ # 公共 DTO、配置和错误模型 | `- meeting-core/ |- deploy/ | |- livekit/ | |- coturn/ | `- docker-compose.yml `- docs/ |- deployment.md |- technical-plan.md `- task-plan.md ``` ## 本地开发 安装桌面端依赖: ```powershell cd apps\desktop pnpm.cmd install ``` 启动 LiveKit: ```cmd cd E:\workespace\2026\rust\lumen-meeting\deploy\livekit start-dev.bat ``` 启动桌面端: ```powershell cd E:\workespace\2026\rust\lumen-meeting\apps\desktop pnpm.cmd tauri:dev ``` Tauri 会在后台启动内嵌 API,默认地址是: ```text http://127.0.0.1:3000 ``` 只运行 Vite 时不会启动 Tauri 和内嵌 API,需要先单独启动 API: ```powershell cargo run -p lumen-meeting-api pnpm.cmd -C apps\desktop dev ``` ## API 管理端 管理端是独立 Web 应用,不打进 Tauri 桌面端: ```powershell cd apps\admin pnpm.cmd install pnpm.cmd dev ``` 默认访问地址: ```text http://127.0.0.1:5174 ``` 管理端登录复用 `/api/auth/login`,登录后调用 `/api/admin/me` 校验管理员身份。管理员账号不自动初始化,需要在 PostgreSQL 中手动设置角色: ```sql UPDATE user_accounts SET role = 'admin' WHERE email = 'admin@example.com'; UPDATE user_accounts SET role = 'super_admin' WHERE email = 'owner@example.com'; UPDATE user_accounts SET role = 'admin', admin_permissions = ARRAY['admin_read', 'meeting_manage', 'user_manage']::text[] WHERE email = 'ops@example.com'; ``` 角色说明: - `user`:普通用户,不能访问 `/api/admin/*`。 - `admin`:管理员,按 `admin_permissions` 控制细权限;旧数据权限为空时兼容为全部权限。 - `super_admin`:超级管理员,拥有全部权限,并可调整其他用户角色和权限。 权限点说明:`admin_read` 基础只读,`meeting_manage` 会议管理,`user_manage` 用户启停,`file_manage` 录制/附件删除,`audit_read` 审计查看,`diagnostics_read` 系统诊断。 管理端 v1 覆盖: - 总览:会议、参会、用户、录制和附件统计。 - 会议管理:分页查询、查看详情、强制结束、锁定/解锁、移除参会者。 - 用户管理:分页查询、禁用/启用、调整角色和管理员权限。 - 文件管理:录制和聊天附件分页查询、目录占用统计、过期文件清理、删除文件并保留业务记录。 - 系统诊断:API、存储、LiveKit、录制目录和附件目录状态。 - 审计日志:所有管理端写操作记录管理员、动作、目标、结果、请求 IP、User-Agent、前后快照和原因,支持 CSV 导出。 ## 关键环境变量 ```text LUMEN_API_HOST=127.0.0.1 LUMEN_API_PORT=3000 LUMEN_ADMIN_ALLOWED_IPS= LUMEN_STORAGE=memory DATABASE_URL=postgres://lumen:lumen@127.0.0.1:5432/lumen_meeting LUMEN_RUN_MIGRATIONS=true LIVEKIT_URL=ws://127.0.0.1:7880 LIVEKIT_API_KEY=devkey LIVEKIT_API_SECRET=secret LIVEKIT_EGRESS_URL= LUMEN_RECORDING_DIR=./recordings LIVEKIT_EGRESS_OUTPUT_DIR=/recordings LUMEN_CHAT_UPLOAD_DIR=./chat-uploads LUMEN_RECORDING_RETENTION_DAYS=0 LUMEN_CHAT_ATTACHMENT_RETENTION_DAYS=0 LUMEN_FILE_QUOTA_BYTES= LUMEN_DOWNLOAD_TOKEN_TTL_SECONDS=300 ``` `LUMEN_ADMIN_ALLOWED_IPS` 用于限制 `/api/admin/*` 的来源 IP,逗号分隔,支持单个 IP 和 CIDR,例如 `127.0.0.1,::1,10.0.0.0/8`。为空时默认放行,便于本地开发;生产环境建议显式配置。 录制能力默认关闭。配置 `LIVEKIT_EGRESS_URL` 且 API 具备 LiveKit key/secret 后,`/health` 会返回 `recordingEnabled=true`,会议页主持人才会看到录制入口。 聊天附件默认保存到 `LUMEN_CHAT_UPLOAD_DIR`。单文件上限为 `10MB`,支持图片 `jpg/jpeg/png/gif/webp` 和常用文件 `pdf/doc/docx/xls/xlsx/ppt/pptx/txt/zip`。 文件治理默认不自动清理。`LUMEN_RECORDING_RETENTION_DAYS` 和 `LUMEN_CHAT_ATTACHMENT_RETENTION_DAYS` 大于 `0` 时,管理端“文件治理”可按保留天数清理过期文件;`LUMEN_FILE_QUOTA_BYTES` 用于展示本地磁盘配额;`LUMEN_DOWNLOAD_TOKEN_TTL_SECONDS` 控制录制和附件下载链接有效期。 ## API 概览 健康检查: ```text GET /health ``` 账号接口: ```text POST /api/auth/register POST /api/auth/login GET /api/auth/me POST /api/auth/logout ``` 会议接口: ```text POST /api/meetings GET /api/meetings/scheduled GET /api/meetings/{meetingNo} POST /api/meetings/join POST /api/meetings/{meetingNo}/leave POST /api/meetings/{meetingNo}/end POST /api/meetings/{meetingNo}/cancel GET /api/meetings/{meetingNo}/participants PATCH /api/meetings/{meetingNo}/participants/{participantIdentity} POST /api/meetings/{meetingNo}/participants/{participantIdentity}/remove POST /api/meetings/{meetingNo}/lock POST /api/meetings/{meetingNo}/settings POST /api/meetings/{meetingNo}/host GET /api/meetings/{meetingNo}/messages POST /api/meetings/{meetingNo}/messages POST /api/meetings/{meetingNo}/messages/attachments GET /api/meetings/{meetingNo}/messages/{messageId}/attachment?downloadToken=... GET /api/meetings/{meetingNo}/recordings?participantIdentity=... POST /api/meetings/{meetingNo}/recordings/start POST /api/meetings/{meetingNo}/recordings/{recordingId}/stop GET /api/meetings/{meetingNo}/recordings/{recordingId}/file?downloadToken=... ``` 管理端接口: ```text GET /api/admin/me GET /api/admin/overview GET /api/admin/system/diagnostics GET /api/admin/meetings GET /api/admin/meetings/{meetingNo} POST /api/admin/meetings/{meetingNo}/end POST /api/admin/meetings/{meetingNo}/lock POST /api/admin/meetings/{meetingNo}/unlock POST /api/admin/meetings/{meetingNo}/participants/{participantIdentity}/remove GET /api/admin/users POST /api/admin/users/{userId}/disable POST /api/admin/users/{userId}/enable POST /api/admin/users/{userId}/role GET /api/admin/recordings GET /api/admin/recordings/{recordingId} DELETE /api/admin/recordings/{recordingId} GET /api/admin/chat-attachments DELETE /api/admin/chat-attachments/{attachmentId} GET /api/admin/files/stats POST /api/admin/files/cleanup GET /api/admin/audit-logs GET /api/admin/audit-logs/export ``` ## 验证命令 ```powershell cargo test pnpm.cmd -C apps\desktop typecheck pnpm.cmd -C apps\desktop build pnpm.cmd -C apps\admin typecheck pnpm.cmd -C apps\admin build ``` 桌面端构建可能提示主包超过 500 kB,主要原因是 `livekit-client` 进入主包;这是构建体积警告,不是功能错误。 ## 部署方案 本地开发: - LiveKit 使用 `deploy/livekit/start-dev.bat`。 - `pnpm tauri:dev` 会通过 `embedded-api` feature 启用内嵌 API 线程,也可以单独运行 `cargo run -p lumen-meeting-api`。 - 存储默认使用内存仓储。 - 客户端 API 地址使用 `http://127.0.0.1:3000`。 局域网测试: - LiveKit 使用 `start-dev.bat 0.0.0.0`。 - `LIVEKIT_URL` 改成运行 LiveKit 机器的局域网 IP。 - 放行 `3000/TCP`、`7880/TCP`、`7881/TCP`、`7882/UDP`。 服务器部署: - API 独立运行,建议 `LUMEN_STORAGE=postgres`。 - LiveKit 使用 `deploy/livekit/docker-compose.yml`。 - PostgreSQL 使用 `deploy/docker-compose.yml` 或外部托管数据库。 - 公网环境必须使用 HTTPS/WSS,并认真配置 TURN。 - 正式桌面端不启用 `embedded-api` feature,也不会内嵌编译或启动 API,需要在客户端配置生产 API 地址,或构建时设置 `VITE_API_BASE_URL`。 - 管理端 `apps/admin` 构建后可作为静态站点部署,运行时只需要配置正确的 API 地址。 更完整的部署细节见 [部署手册](docs/deployment.md)。 ## 当前限制 - 内存仓储只适合本地开发,API 重启后会议和账号数据会丢失。 - 管理端第一版不做管理员自动初始化,需要手动 SQL 设置角色。 - 白板 MVP 不持久化,断线重连后不会恢复历史笔迹。 - 录制当前只输出 MP4 文件,不做云存储、转码和完整白板/聊天归档;白板和聊天不会进入 MP4。 - 聊天附件不做病毒扫描、云存储、缩略图生成和复杂配额强制;当前配额只在管理端统计展示。 - 多实例 API 部署时,当前内存限流不会跨进程共享,生产环境应在网关、反向代理或 Redis 侧补统一限流。