数据留在自己机房,一台机器就能跑起来
先说清楚:这是我们默认的免费 SAAS 之外的一种可选方式。如果你只是想让业务系统跑起来,用免费 SAAS 就够了,不需要看这一页。下面是给「数据有硬性规定必须留在自己机房」的团队准备的——搭建客刻意做得很轻:后端是一个 Go 编译出的单个可执行文件,前端是静态资源,数据库走内嵌方案。没有商业数据库授权,也没有必须上 Docker 或 Kubernetes 的前置条件。
费用:一次性 50000 元,不限人数、不限数据量,含 5 年专属售后服务。与免费版、收费版的逐项对比见价格与版本。
一、什么时候该私有化
私有化不是「更高级的版本」,而是一种取舍:你换来了数据控制权,同时也要承担运维责任。下面这些情况,值得选私有化。
- 数据不能出内网:涉及客户隐私、生产数据、财务数据,或行业监管明确要求数据本地留存。
- 要过等保或内审:需要能说清楚数据存在哪台机器、哪个目录、谁能访问。
- 要和内网系统打通:ERP、MES、财务系统只在内网可达,SaaS 方案接不进去。
- 不希望按年付订阅:一次性部署后长期自持,成本结构更可预期。
- 内网或专网环境:生产网、办公网与互联网物理隔离,只能用内网地址访问。
二、四种部署形态
同一个二进制支持多种落法,选哪种取决于你的网络环境。
| 形态 | 适用场景 | 访问方式 |
|---|---|---|
| 单机内网直连 | 内网使用,不需要域名与 HTTPS,最快上线 | http://内网IP:8710 |
| 内网 + 独立域名 | 有内部 DNS,希望用域名访问并上 HTTPS | https://dajian.公司内网域/ |
| 子路径部署 | 已有门户站点,想把搭建客挂在某个路径下 | https://oss.公司域/lowcode/ |
| 双通道灰度 | 需要正式版与灰度版并行,按企业切换的团队 | / 与 /canary/ 两个入口 |
/lowcode/、/canary/ 或根路径都能正常工作,换路径不需要重新打包。 三、资源要求
下面是单机部署的参考基线。实际需求随并发人数、业务数据量和上传文件量增长,正式采购前建议先做一次评估。
| 项目 | 最低配置 | 推荐配置 |
|---|---|---|
| CPU | 2 核 | 4 核及以上 |
| 内存 | 4 GB | 8 GB 及以上 |
| 磁盘 | 40 GB SSD | 100 GB SSD 及以上(含数据库与上传文件) |
| 操作系统 | Linux x86_64(CentOS 7+ / Ubuntu 20.04+ / 麒麟等国产系统) | 同左 |
| 运行时依赖 | Redis 6+(会话与临时态)、数据库网关(随包提供) | Redis 独立部署,避免与业务争内存 |
| 不需要 | 商业数据库授权、Docker、Kubernetes;这些都不是前置条件 | |
端口占用
| 端口 | 用途 | 是否必须 |
|---|---|---|
8710 | 搭建客服务端口(可在配置中修改) | 必须 |
8091 | 数据库网关(XDB2),可与其他服务共用 | 必须 |
6379 | Redis | 必须 |
443 / 80 | nginx 反向代理与 HTTPS | 用域名访问时必须 |
离线或内网环境请提前确认:目标机能否拉取镜像或拷贝离线包、能否访问 Redis、服务器时区与时间是否已同步(时间不准会导致审批、日志与定时任务时间错乱)。
四、部署步骤
核心就四件事:放文件、写配置、起服务、挂 nginx。下面的目录结构和命令是平台发布工具实际使用的布局,可以直接照抄。
1. 目录结构
/www/low-code/ ├── releases/ │ └── 20260917-1730-0139fdd2/ # 一个发布版本一个目录 │ ├── low-code-platform # 后端可执行文件 │ ├── frontend/dist/ # 前端静态资源(embed 模式可省) │ ├── config.yaml # 版本化配置(不含密钥) │ ├── config.local.yaml -> /www/low-code/shared/config.local.yaml │ └── RELEASE # 版本清单 JSON ├── channels/ │ ├── stable -> ../releases/20260917-1730-0139fdd2 # 正式版指针 │ └── stable.env # LC_SERVER_PORT=8710 ├── shared/ │ ├── config.local.yaml # 密钥,绝不随版本包分发 │ ├── data/ # 数据与令牌密钥 │ └── uploads/ # 上传的文件 └── current -> channels/stable
把密钥、数据和上传文件放在 shared/ 并被各版本共用,是刻意的设计:升级时只换版本目录,数据与登录态不受影响。
2. 配置文件
配置分两层:config.yaml 随版本走,写不含密钥的通用配置;config.local.yaml 放在共享目录,只写本机差异与密钥。环境变量 LC_* 优先级最高。
# 未写的键沿用 config.yaml,改了这里不用改版本包 server: port: 8710 # base_path: "/lowcode" # 无法传 X-Forwarded-Prefix 时固定部署前缀 redis: host: "127.0.0.1" port: 6379 password: "你的 Redis 密码" xdb2: url: "http://127.0.0.1:8091" frontend: embed: false # false=读磁盘 dist;true=前端内嵌进二进制 dist_path: "frontend/dist" message: http_whitelist: "192.168.2.0/24" # 允许外呼的内网网段,留空则一律拒绝
3. 注册为系统服务
用 systemd 模板单元管理,一个模板可以带多个实例(正式版 / 灰度版),切换只改软链接。
[Unit] Description=low-code platform (%i) After=network-online.target Wants=network-online.target [Service] Type=simple WorkingDirectory=/www/low-code/channels/%i EnvironmentFile=/www/low-code/channels/%i.env ExecStart=/www/low-code/channels/%i/low-code-platform Restart=always RestartSec=3 StandardOutput=journal StandardError=journal SyslogIdentifier=low-code-%i [Install] WantedBy=multi-user.target
# 启用并启动 systemctl daemon-reload systemctl enable --now low-code@stable systemctl status low-code@stable # 看日志(排查启动失败先看这里) journalctl -u low-code@stable -n 100 --no-pager
4. 反向代理
nginx 配置见下一节。配好之后做一次健康检查。注意:平台没有 /healthz 端点,健康检查请用下面两个公开接口。
# 首选:公开接口,返回 200 即服务正常 curl -s -o /dev/null -w "%{http_code}\n" http://127.0.0.1:8710/api/v1/auth/providers # 备用 curl -s -o /dev/null -w "%{http_code}\n" http://127.0.0.1:8710/api/v1/config/schema # 反例:这个端点不存在,会返回 404,不要用它做探针 # curl http://127.0.0.1:8710/healthz
五、子路径部署
如果你想把它挂在已有门户的某个路径下(例如 https://oss.example.com/lowcode/),关键只有两点,缺一个就会出现「页面能开、接口全 404」。
proxy_pass末尾必须带/,作用是剥掉路径前缀再转发给后端。- 传
X-Forwarded-Prefix头告知后端部署前缀,后端会据此注入<base>与前端基地址。
server {
listen 443 ssl http2;
server_name oss.example.com;
ssl_certificate /etc/nginx/ssl/example.crt;
ssl_certificate_key /etc/nginx/ssl/example.key;
location /lowcode/ {
proxy_pass http://127.0.0.1:8710/; # 尾部 / 必须有
proxy_set_header X-Forwarded-Prefix /lowcode; # 告知部署前缀
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header Host $host;
# 智能体对话使用 SSE,必须关闭缓冲并拉长超时
proxy_buffering off;
proxy_read_timeout 300s;
# 上传文件大小限制(按需调整)
client_max_body_size 50m;
}
# 兼容不带尾斜杠的访问
location = /lowcode {
return 301 /lowcode/;
}
}X-Forwarded-Prefix),就在 config.local.yaml 里固定:server.base_path: "/lowcode"。此时部署前缀以配置为准。 内网独立域名
挂在根路径更简单:proxy_pass http://127.0.0.1:8710;(不带尾部斜杠),不需要传前缀头。
六、升级与回滚
升级的核心思路是「新版本放新目录,切换靠软链接」。这样回滚不需要重新部署,改个链接重启即可。
# 1. 新版本解包到独立目录(不影响正在运行的版本) tar -xzf low-code-20260920.tar.gz -C /www/low-code/releases/20260920-1030-abc1234/ ln -s /www/low-code/shared/config.local.yaml \ /www/low-code/releases/20260920-1030-abc1234/config.local.yaml # 2. 切指针 ln -sfn ../releases/20260920-1030-abc1234 /www/low-code/channels/stable systemctl restart low-code@stable # 3. 健康检查 curl -s -o /dev/null -w "%{http_code}\n" http://127.0.0.1:8710/api/v1/auth/providers # 4. 失败就回滚(切回上一个版本) ln -sfn ../releases/20260917-1730-0139fdd2 /www/low-code/channels/stable systemctl restart low-code@stable
- 升级前先备份:至少备份数据库与
shared/目录,见下一节。 - 保留最近若干个版本:磁盘空间换回滚能力,建议至少保留 3-10 个版本。
- 永不删除正在被引用的版本:清理旧版本前先确认没有通道指向它。
- 大版本升级前在测试环境验证:尤其是涉及数据结构变更的版本。
关于灰度
平台支持正式版与灰度版并行:两个实例跑在不同端口(如 8710 / 8711),nginx 分别挂在 / 和 /canary/,按企业维度路由。两个实例共用同一份数据库、Redis、令牌密钥和上传目录,所以用户在企业被切入灰度后仍然保持登录态,切换对用户无感。
七、备份与恢复
私有化环境里,备份是唯一不能省的事。建议把下面三样一起备份,并定期验证能恢复。
| 备份对象 | 内容 | 建议频率 |
|---|---|---|
| 业务数据库 | 所有业务数据与平台配置(对象、视图、流程、权限、审批记录) | 每日 |
shared/uploads/ | 用户上传的附件与图片 | 每日 |
shared/config.local.yaml | 密钥与部署配置,丢了会导致无法登录或外部系统接不上 | 变更后即时 |
- 数据库备份:数据库经网关访问,推荐用官方工具做一致性快照,避免直接拷贝正在写入的文件。
- 异地保存:至少保留一份在另一台机器上,防单机磁盘故障。
- 验证恢复:定期在测试环境实际恢复一次。没验证过的备份等于没有备份。
- 应用配置另外导出:平台支持把应用配置导出成文件,可作为逻辑备份,也便于在环境之间迁移。
八、安全建议
- 只监听内网或本地回环:服务端口不要直接暴露公网,统一经 nginx 转发。
- 强制 HTTPS:对外访问一律走 TLS,并配置 HTTP 跳转。
- 保护配置文件:
config.local.yaml权限设为600,属主为服务运行用户;不要放进任何代码仓库。 - 专用运行账号:用非 root 账号运行服务,降低越权风险。
- 外呼白名单:平台的
message.http_whitelist用于限制允许访问的内网网段,留空即为全部拒绝。按最小必要原则配置。 - 脚本沙箱:脚本能力默认关闭,需要时再开启,并限制可访问的外部地址与查询条数。
- 数据库与 Redis 加固:设置密码、限制来源 IP、不要使用默认端口对公网开放。
- 审计留痕:平台内置操作审计与回收站,启用后误删可还原、越权可追溯。
九、常见问题
必须用 Docker 吗?
不必。后端是单个可执行文件,直接跑即可。当然你也可以自己包一层容器,平台不依赖任何容器编排。
能用我们现有的 MySQL / Oracle / 达梦吗?
平台默认通过内置数据库网关访问 SQLite / DuckDB,这是它能做到「单机、零授权」的原因。如果你的环境强制要求使用既有数据库,请在评估阶段告知,我们按实际情况判断可行性,不会先答应再想办法。
完全离线的内网能装吗?
可以。部署包是二进制与静态资源,不依赖联网安装。需要注意两点:一是用「前端内嵌」模式打包(在联网的构建机上先把前端产物编译进去),二是离线环境里如果要用 AI 助理,需要自备可访问的大模型服务地址。
升级会不会丢数据?
升级只替换程序目录,数据与上传文件都在共享目录里,不会因为换版本而丢失。但仍强烈建议升级前做一次备份——防的不是正常升级,而是意外。
手机在外网能访问吗?安装师傅在客户家里。
如果服务器只在纯内网,外网手机确实访问不到。常见做法有两种:一是通过 VPN 访问内网;二是把服务发布到 DMZ 或具备公网入口的区域,只暴露 HTTPS 端口。具体怎么放,需要结合你们的网络与安全策略来定。
部署要多久?
环境与依赖都就绪的情况下,按上面的步骤通常一个工作日内可以完成并跑通。如果涉及内网审批、端口开通、离线包传递,时间主要花在流程上,而不是部署本身。
出了问题谁来维护?
系统跑在你的机器上,日常运维(磁盘、备份、系统更新)由你的团队负责。我们会提供部署文档、运维手册与培训;平台自身的问题由我们定位修复。建议在部署时就让你们的运维同学一起参与,而不是交付即撒手。