XteVision SecuChat 是什么,适合哪些用户?
XteVision SecuChat(xtevision-secuchat v1.0.0)是一个轻量级、本地优先、自托管的聊天服务器和单页网页客户端,用于快速局域网消息传输和点对点视频通话。数据存储在 data.json,界面从 public/ 提供,上传文件保存到 uploads/。设计用于最小化配置——无需外部数据库。
scrypt 密码哈希进行注册/登录uploads/5009)高层设计和通信流程
┌─────────────────────────────────────────────────────────────────┐
│ 浏览器(单页客户端) │
│ ┌────────┐ ┌──────────┐ ┌────────┐ ┌────────┐ ┌──────────────┐ │
│ │ 登录 │ │ 聊天 │ │ 联系人 │ │ 通话 │ │ AI 助手 │ │
│ └────────┘ └──────────┘ └────────┘ └────────┘ └──────────────┘ │
└──────────────────────────────┬──────────────────────────────────┘
│ HTTP / SSE
┌──────────────────────────────┴──────────────────────────────────┐
│ Node.js 服务器(端口 5008) │
│ ┌───────────┐ ┌──────────┐ ┌──────────┐ ┌────────────────────┐ │
│ │ 认证 │ │ 消息 │ │ 联系人 │ │ AI 代理(可选) │ │
│ │(scrypt) │ │(SSE) │ │(请求/接受) │ │ → 本地/远程 LLM │ │
│ │ │ │ │ │ │ └────────────────────┘ │
│ └───────────┘ └──────────┘ └──────────┘ │
│ ┌───────────┐ ┌───────────────────────────────────────────────┐ │
│ │ 上传 │ │ data.json(用户、消息、联系人) │ │
│ │ (uploads/ │ │ public/(提供的界面) │ │
│ └───────────┘ └───────────────────────────────────────────────┘ │
└──────────────────────────────┬──────────────────────────────────┘
│ PeerJS 信令
┌──────────────────────────────┴──────────────────────────────────┐
│ 本地 PeerServer(端口 5009) │
│ 对等之间的 P2P 媒体连接(视频通话) │
└───────────────────────────────────────────────────────────────────┘5009)信令,然后媒体点对点流动XteVision SecuChat 设计用于自托管、局域网优先的运行方式:
前端、后端和基础设施技术
| 层次 | 技术 | 用途 |
|---|---|---|
| 运行时 | Node.js(≥ 16) | 服务器运行时 |
| 服务器 | Express.js | HTTP 服务器 + API 路由 |
| 认证 | crypto.scrypt | 加盐密码哈希 |
| 实时 | SSE(服务器发送事件) | 在线状态和消息事件 |
| 存储 | data.json | 用户、消息、联系人 |
| 文件上传 | multer → uploads/ | 附件和头像 |
| P2P 信令 | PeerJS + PeerServer | 视频通话信令(端口 5009) |
| AI 后端 | LLM 兼容 API | 聊天、翻译、摘要、嵌入、审核 |
| 前端 | 原生 HTML/CSS/JS | 从 public/ 提供的单页客户端 |
在您的服务器上运行 XteVision SecuChat
peerjs/)安装依赖项,然后可选择安装用于 P2P 回退的 Peer 服务器。
# 1. 安装服务器依赖
npm install
# 2. (可选)安装 Peer 服务器以用于 P2P 回退
cd peerjs
npm install
cd ..
http://您的服务器IP:5008
服务器默认运行在端口 5008。从局域网连接。用于 P2P 视频通话的 PeerServer 使用端口 5009。
# 开发环境
npm run dev # 若在 package.json 中定义
# 生产环境
NODE_ENV=production npm start
# 或: node server.js
config.json 中的运行时设置
XteVision 从项目根目录下的 config.json 读取运行时设置。在启动服务器之前,根据您的部署值进行编辑。
| 部分 | 设置 |
|---|---|
| server | HTTP 端口、PeerJS 端口/路径、文件路径、Cookie 设置、大小限制、CSP 来源 |
| ai | AI 用户身份、默认引擎,以及每引擎的 host/port/path/model 设置 |
| client | P2P 信令设置和默认的客户端 AI 引擎 |
| 变量 | 描述 |
|---|---|
| PORT | HTTP 服务器端口(默认 5008) |
| AI_BASE_URL | 本地/远程 AI 服务的基础 URL(配置时优先使用) |
| AI_API_KEY | 从环境变量读取的 API 密钥——绝不记录 |
| AI_STREAM | 设置为 true 以通过 SSE 接收增量 AI token |
| AI_LOCAL_ONLY | 设置为 true 以阻止将内容转发到外部服务 |
| AI_RATE_LIMIT | 每客户端请求速率限制,防止滥用 |
目录结构和关键文件
xtevision-secuchat/ ├── server.js # 主 Express 服务器:路由、SSE、上传、AI 代理 ├── config.json # 运行时配置(server / ai / client) ├── data.json # 用户、消息和联系人(手动编辑前先备份) ├── public/ # 单页界面(作为静态资源提供) ├── uploads/ # 附件和头像(服务器端强制执行大小限制) ├── peerjs/ # 可选的本地 PeerServer,用于 P2P 回退 └── package.json # 依赖项和脚本
| 文件 | 用途 |
|---|---|
| server.js | 主 Express 服务器——所有 API 路由、SSE、上传、AI 代理、静态提供 |
| config.json | server、ai 和 client 的运行时配置 |
| data.json | 持久化的用户、消息和联系人——手动编辑前先备份 |
| public/ | 单页客户端界面,静态提供 |
| uploads/ | 附件和头像(服务器端强制执行大小限制) |
| peerjs/ | 可选的本地 PeerServer(端口 5009),用于 P2P 回退 |
data.json。确保服务器进程能够写入 uploads/。过大上传会被服务器端拒绝。API 路由及其用途
| 类别 | 方法 & 路径 | 用途 |
|---|---|---|
| 认证 | POST /api/register | 创建账户 |
| 认证 | POST /api/login | 获取会话 |
| 联系人 | POST /api/contacts/request | 发送联系人请求 |
| 联系人 | POST /api/contacts/accept | 接受联系人请求 |
| 消息 | POST /api/messages | 发送消息(multipart 用于附件) |
| 消息 | GET /api/messages/:conversationId | 列出消息 |
| SSE | GET /sse | 订阅实时事件(在线状态、消息) |
| 上传 | POST /api/uploads | 上传文件(附件和头像) |
可选——需要配置的 AI 服务。确切参数名和响应格式请参考服务器代码。
| 方法 & 路径 | 用途 |
|---|---|
POST /api/ai/chat | 对话式助手。接受 { messages: [{ role, content }], model? }。通过 Accept: text/event-stream(SSE)支持流式传输。 |
POST /api/ai/translate | 翻译文本(需要 AI 服务) |
POST /api/ai/summarize | 摘要文本 |
POST /api/ai/embeddings | 为文本数组生成嵌入;返回嵌入数组 |
POST /api/ai/moderate | 检查内容安全(可选) |
本地优先的可选 AI 助手
AI_BASE_URL),将优先使用;请求将按配置通过代理发送到该服务,附带模型和密钥。AI_STREAM=true 并使用 Accept: text/event-stream 请求,以接收增量 AI token(SSE)。/api/ai/embeddings 获取向量表示,用于搜索或聚类;批处理由 AI_BATCH_EMBEDDINGS 控制。AI_LOCAL_ONLY=true 以阻止将内容转发到外部服务。API 密钥从环境变量读取,不会被记录。聊天(非流式):
curl -s -X POST http://localhost:5008/api/ai/chat \
-H "Content-Type: application/json" \
-d '{"messages":[{"role":"user","content":"摘要这条消息: ..."}]}
聊天(流式 SSE):
curl -N -X POST http://localhost:5008/api/ai/chat \
-H "Content-Type: application/json" \
-H "Accept: text/event-stream" \
-d '{"messages":[{"role":"user","content":"用一段话介绍 XteVision。"}]}, "model":"gpt-4o-mini"}
嵌入:
curl -s -X POST http://localhost:5008/api/ai/embeddings \
-H "Content-Type: application/json" \
-d '{"texts":["你好","世界"]}
安全头、密钥和隐私控制
scrypt——不存储明文密码AI_API_KEY)保存在服务器环境中,应按机密对待——服务器不会记录密钥。AI_BASE_URL 指向外部服务,将把内容转发到该服务——在注重隐私的部署中启用 AI_LOCAL_ONLY。AI_RATE_LIMIT)有助于防止滥用和意外费用。常见问题及解决方案
PORT 空闲,或通过环境变量更改它。uploads/ 目录的写入权限。AI_BASE_URL、AI_API_KEY 和模型名称;检查速率限制并适当设置 AI_STREAM_TIMEOUT。如果使用了本地 AI 服务,确保它健康且可访问。