无极开物Docs

自托管

运行你自己的 Kaiwu 中继——如何部署、如何配置允许登录的用户,以及服务器会保留哪些数据。

本节介绍如何搭建自己的 Kaiwu 中继(供客户端与设备连接的同步后端)。此处内容完全可选:Kaiwu Cloud 的存在正是为了让你不必自建。

配置完成后,你的客户端和设备将指向你自己的 URL(例如 https://api.example.com),而非云端地址。除此之外,Kaiwu 的使用方式没有任何改变。

选择运行方式

如果不确定该如何选择:若已有进程管理器,推荐使用 Docker;若希望在普通主机上运行托管服务,建议使用自托管运行时;若要对服务端本身进行代码修改,请使用本地仓库方式。

配置服务

  • 环境变量 —— 完整的服务端运行时配置面。标准模板为 apps/server/.env.example。
  • API 速率限制 —— 汇总所有受限端点、默认限制值,以及用于调整限制的两个变量。

配置登录权限

这一环节耗时最长,也最容易出现不易察觉的疏漏。因此,我们针对每个提供商单独提供了一篇指南,而不是堆砌在长篇文档中。

  • 认证概览 —— 策略模型,以及下列各组件如何协同工作。
  • GitHub —— 用于注册和连接的 OAuth,以及允许列表。
  • OIDC —— 支持 Okta、Auth0、Entra ID、Keycloak 及其他通用协议。
  • mTLS —— 来自 MDM 的客户端证书、自动配置,以及将单人的多台设备映射至统一身份。
  • 自定义提供商 —— 无需 fork 核心认证逻辑即可添加自有的提供商。

确定服务端保留的数据

  • 加密与明文存储 —— 会话内容是端到端加密存储,还是对服务端可读。
  • 保留策略 —— 自动清理机制。默认永久保留所有内容。

理解运行机制

  • Kaiwu 架构总览 —— 三大核心组件,以及它们对其前端代理的具体要求。
  • 协议规范 —— 客户端、中继与设备之间的事件契约。

部署版本

两种版本运行相同的 API 和业务逻辑,差异仅在于使用的存储后端不同。

  • 完整版(Full) —— 采用外部 Postgres(默认)或 MySQL 8.0.16+,搭配 S3 或兼容存储(默认配置;可通过 KAIWU_FILES_BACKEND=local 切换为本地磁盘)。Redis 为可选项,仅在多副本实时同步时才需要。
  • 轻量版(Light) —— 基于磁盘的 SQLite(默认)或嵌入式 Postgres(PGlite),本地文件存储由服务端直接通过 GET /files/* 提供服务。

若是多用户共享的服务端,请使用完整版;若追求最简便的单节点部署,请使用轻量版。

在搭配 SQLite 且未配置 DATABASE_URL 的情况下,服务端必须设置 KAIWU_SERVER_LIGHT_DATA_DIR,否则将拒绝启动。

角色划分与扩容

单进程运行是最简单的方式。若要拆分角色,可设置 SERVER_ROLE:

SERVER_ROLE进程职责
未设置(默认 all)同时处理 API、实时通信和后台任务
api仅处理 API 和实时通信 —— 客户端连接此角色
worker仅处理后台任务,不监听 HTTP 请求

在根据上表进行部署前,有两点需要特别注意:

  • 无法识别的值不会报错。 任何非 api 或 worker 的取值(包括拼写错误),都会静默回退为 all。例如将 SERVER_ROLE=wroker 拼写错误,启动的将是第二个完整服务端,而不是 Worker。
  • worker 必须配合 Redis 适配器。 除非已设置 REDIS_URL 且配置了 KAIWU_SOCKET_ADAPTER=redis-streams,否则进程会在启动时抛出异常。这是因为 Worker 需要向自身未直接建立 Socket 连接的房间发布消息。

反之亦然:一旦启用了 Redis 适配器,持久化设备在线状态(presence)的写入操作就会转交由 Worker 处理。如果部署全部为 api 且启用了 Redis,系统会记录日志提示需要 Worker,并且在 Worker 运行之前,在线状态将无法持久化写入。

对于多副本 API 部署,请启用 Redis 扇出(fanout),并在负载均衡器上配置会话保持(sticky sessions)。Docker 文档中提供了一个可用的配置示例。

反向代理基础

在生产环境中,应将 API 部署在满足以下条件的反向代理之后:

  • 负责 TLS 终结;
  • 支持 WebSocket 协议升级 —— Socket.IO 实时通信位于 /v1/updates;
  • 设置足够长的超时时间以支持长连接;
  • 敏感信息保存在平台的环境变量或机密管理器中,而非存入 git。

如果由服务端托管 /files/*(轻量版),还需放行这些路由。

/v1/updates 升级失败是自托管过程中最常见的故障,且表象通常不像网络问题:设备可以正常注册,但随后始终处于离线状态,并显示为 machine.none_online。详情请参阅环境变量 → 网络。

相关内容

本地 stack CLI 还支持通过 SSH 引导配置远程主机,这通常比手动操作更快:

© 乾元执中(南京)科技有限公司 · WUJI-Labs

On this page