私有化部署

数据留在自己机房,一台机器就能跑起来

先说清楚:这是我们默认的免费 SAAS 之外的一种可选方式。如果你只是想让业务系统跑起来,用免费 SAAS 就够了,不需要看这一页。下面是给「数据有硬性规定必须留在自己机房」的团队准备的——搭建客刻意做得很轻:后端是一个 Go 编译出的单个可执行文件,前端是静态资源,数据库走内嵌方案。没有商业数据库授权,也没有必须上 Docker 或 Kubernetes 的前置条件。

费用:一次性 50000 元,不限人数、不限数据量,含 5 年专属售后服务。与免费版、收费版的逐项对比见价格与版本。

一、什么时候该私有化

私有化不是「更高级的版本」,而是一种取舍:你换来了数据控制权,同时也要承担运维责任。下面这些情况,值得选私有化。

  • 数据不能出内网:涉及客户隐私、生产数据、财务数据,或行业监管明确要求数据本地留存。
  • 要过等保或内审:需要能说清楚数据存在哪台机器、哪个目录、谁能访问。
  • 要和内网系统打通:ERP、MES、财务系统只在内网可达,SaaS 方案接不进去。
  • 不希望按年付订阅:一次性部署后长期自持,成本结构更可预期。
  • 内网或专网环境:生产网、办公网与互联网物理隔离,只能用内网地址访问。
也说实话:私有化意味着系统跑在你的机器上,你要负责服务器的可用性、磁盘空间和备份。如果团队没有运维能力,又对数据归属没有硬要求,在线方式会更省心。这两种选择没有对错。

二、四种部署形态

同一个二进制支持多种落法,选哪种取决于你的网络环境。

形态适用场景访问方式
单机内网直连内网使用,不需要域名与 HTTPS,最快上线http://内网IP:8710
内网 + 独立域名有内部 DNS,希望用域名访问并上 HTTPShttps://dajian.公司内网域/
子路径部署已有门户站点,想把搭建客挂在某个路径下https://oss.公司域/lowcode/
双通道灰度需要正式版与灰度版并行,按企业切换的团队/ 与 /canary/ 两个入口
子路径部署不用重新构建。前端产物全部是相对引用,后端会按请求注入部署前缀。同一份产物挂到 /lowcode/、/canary/ 或根路径都能正常工作,换路径不需要重新打包。

三、资源要求

下面是单机部署的参考基线。实际需求随并发人数、业务数据量和上传文件量增长,正式采购前建议先做一次评估。

项目最低配置推荐配置
CPU2 核4 核及以上
内存4 GB8 GB 及以上
磁盘40 GB SSD100 GB SSD 及以上(含数据库与上传文件)
操作系统Linux x86_64(CentOS 7+ / Ubuntu 20.04+ / 麒麟等国产系统)同左
运行时依赖Redis 6+(会话与临时态)、数据库网关(随包提供)Redis 独立部署,避免与业务争内存
不需要商业数据库授权、Docker、Kubernetes;这些都不是前置条件

端口占用

端口用途是否必须
8710搭建客服务端口(可在配置中修改)必须
8091数据库网关(XDB2),可与其他服务共用必须
6379Redis必须
443 / 80nginx 反向代理与 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.local.yaml(只写要覆盖的键)
# 未写的键沿用 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 模板单元管理,一个模板可以带多个实例(正式版 / 灰度版),切换只改软链接。

/etc/systemd/system/low-code@.service
[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> 与前端基地址。
nginx.conf(子路径部署)
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 端口。具体怎么放,需要结合你们的网络与安全策略来定。

部署要多久?

环境与依赖都就绪的情况下,按上面的步骤通常一个工作日内可以完成并跑通。如果涉及内网审批、端口开通、离线包传递,时间主要花在流程上,而不是部署本身。

出了问题谁来维护?

系统跑在你的机器上,日常运维(磁盘、备份、系统更新)由你的团队负责。我们会提供部署文档、运维手册与培训;平台自身的问题由我们定位修复。建议在部署时就让你们的运维同学一起参与,而不是交付即撒手。

需要一份针对你环境的部署方案?

把服务器情况、网络限制和数据量告诉我们,我们会给出具体的资源清单、端口清单与部署步骤,而不是一份通用模板。