文档中心

部署上线全流程

用官方安装包一条命令装好企业端 Supabase 与服务端函数,再登记企业、审批并绑定设备上线;升级可交给自动更新脚本。

本文介绍企业端从零到上线的完整流程。

1. 准备服务器

服务器上已经有 Docker、运维不给 root 的,安装命令加 --docker-only 即可:不装系统包、不动 systemd,默认目录变成 ~/ditops。

2. 一键安装

一条命令即可:脚本取下载站上的最新版、按 latest.json 核对 sha256、解包,然后把参数原样交给安装脚本。安装包里是 compose、Kong 配置、邮件模板、数据库迁移与全部服务端函数,不需要另找仓库。

curl -fsSL https://downloads.ditops.cn/linux/enterprise/install-enterprise-web.sh \
  | sudo bash -s -- --docker-only \
      --org-name '某某科技有限公司' --admin-email admin@corp.example.com \
      --host ditops.corp.example.com --scheme https

先看它要做什么,加 --dry-run 再跑一次即可(不装 docker、不起容器、不改数据库)。--version <x.y.z> 可以钉版本,这时要同时给 --sha256;内网取不到下载站时用 --base-url 指到自建镜像。

分步安装(想自己控制每一步时)

curl -fLO https://downloads.ditops.cn/linux/enterprise/ditops-installer-latest.tar.gz
tar xzf ditops-installer-latest.tar.gz -C /root

# 先空跑一遍,看它要写哪些文件(不装 docker、不起容器、不改数据库)
sudo /root/ditops-installer/scripts/install-enterprise.sh \
    --org-name '某某科技有限公司' --host 10.0.0.10 --dry-run

# 确认无误后去掉 --dry-run
sudo /root/ditops-installer/scripts/install-enterprise.sh \
    --org-name '某某科技有限公司' --host 10.0.0.10

--host 是对外地址(默认探测本机第一个非回环 IPv4)。--org-name 必填且不能是占位符:管理端首次登录会把企业名上报官方目录,登记后不可修改。

需要中继(RustDesk 会合 + 直连中继 + 检索)并且和数据库同机时,加 --only all(只装中继用 --only relay)。中继镜像由官方单独交付,要先 docker load 进来:

sudo /root/ditops-installer/scripts/install-enterprise.sh --only all \
    --org-name '某某科技有限公司' --host ditops.corp.example.com --scheme https

装完屏幕上会打印四项,只出现这一次(同时写进 /opt/ditops/install-summary.txt,权限 0600):

  1. 企业服务器地址
  2. Anon Key
  3. 管理员账号与初始密码
  4. 设备绑定码

内网机器(拉不到 Docker Hub / npm / esm.sh)

在一台能出网的机器上先装一遍,把镜像与打好的函数带走:

mkdir -p ~/bundle/images
cd ~/ditops/enterprise
docker compose config --images | xargs docker save -o ~/bundle/images/enterprise.tar
tar czf ~/bundle/ditops-functions.tgz -C volumes functions

内网机器上解包,安装时带上两个参数:

cp -r ~/bundle/images ./images
tar xzf ~/bundle/ditops-functions.tgz      # 得到 functions/
sudo ./scripts/install-enterprise.sh --docker-only \
    --org-name '某某科技有限公司' --host 10.0.0.10 \
    --images ./images --functions ./functions

用这种方式装的机器不要开自动更新(更新要在容器里重新打包函数,与离线前提冲突),升级按第 8 节手工做。

已有 Supabase 实例

已经有一套 Supabase、只想换 DitOps 需要的文件时,不用安装脚本:把包里的 supabase-enterprise/docker-compose.yml、supabase-enterprise/kong.yml 覆盖到位, supabase-enterprise/mail-templates/ 挂给 GoTrue,再在 SQL Editor 里整文件执行 supabase-enterprise/supabase/migrations/00001_init.sql(幂等),最后用 supabase-enterprise/supabase/functions/ 部署服务端函数。这几样都不是可选项:

云托管(supabase.com)同理:在 Dashboard 的 SQL Editor 跑 00001_init.sql,再用 Supabase CLI 部署函数;数据库连接串请用 Dashboard 的 pooler 地址(直连地址是 IPv6-only)。云上没有 .env,验证码登录与告警邮件分别在哪配,见第 3 节第 2 条。

3. 装完还要人做的

  1. 改管理员密码:初始密码只在安装输出和 install-summary.txt 里出现过。

  2. 配 SMTP(安装时没给 --smtp-* 的话):验证码登录、邀请成员、改登录邮箱与告警邮件通知共用同一套发信账号,但两种库的配置位置不同:

    • 自部署(第 1–2 节的 Docker 企业库):改 /opt/ditops/enterprise/.env 的 SMTP_*(文件里带示例:465 是隐式 TLS,其它端口走 STARTTLS;QQ/163 填授权码),再 docker compose up -d auth functions。只重启 auth 的话验证码能发,告警邮件仍按「未配置」失败。
    • 云托管(Supabase 官方库):Dashboard → Authentication → Emails → SMTP 只服务于验证码与邀请;告警邮件读的是 Edge Functions → Secrets 里同名的那六个 SMTP_* 键,两处互不相通。用 provision-cloud.sh 装的话,把六个键写进项目目录的 .env 重跑一次即可(SMTP_HOST 与 SMTP_ADMIN_EMAIL 都给才会写)。
  3. 反代与证书:脚本不碰证书。在前面放 NPM / Caddy,转发到 127.0.0.1:8000(企业库)或 127.0.0.1:8080(中继),打开 WebSocket;中继必须用独立域名,不能挂子路径。配好后把 .env 里的 SITE_URL、API_EXTERNAL_URL、SUPABASE_PUBLIC_URL 改成 https 地址,再 docker compose up -d。

  4. 备份:安装时默认已经配好每天 03:17 的 pg_dump -Fc 到 <安装根>/backups/(最近 7 份,--no-auto-backup 可关)。但那份与主数据同盘,只防误操作与升级,不防盘坏:enterprise/volumes/db/data 才是数据库本体,relay/data/rustdesk 是 RustDesk 身份(丢了所有客户端拒连),这两样都要自己再往机外备一份。

(可选)启用企业统一登录(SSO / OIDC)

已经用 Keycloak / Entra ID / Okta / Authentik 等标准 IdP 管账号时,可以让成员用同一套账号登录 IT 管理端。在安装根目录执行一次:

sudo ./scripts/enable-enterprise-sso.sh --dir /opt/ditops \
    --issuer https://sso.example.com/realms/corp --client-id ditops

脚本会补回调白名单、重启 auth、在企业库里登记 provider,登录页随即出现入口;client_secret 只存进 auth,不写进企业库。IdP 侧的回调地址填 https://<企业地址>/auth/v1/callback,断言里必须带 email_verified=true。成员要先由管理员邀请预置,没预置的邮箱登录会被拒。IdP 的域名必须能解析到公网地址(GoTrue 的 SSRF 校验会挡掉纯内网地址)。

4. 在 IT 管理端登记企业

企业管理员可下载 IT 管理端,或直接访问网页端(it.ditops.cn),在登录页选择「手动填写」,填入:

点击「测试并申请」,系统先测试连接,再自动完成登记,返回 6 位企业码。同一地址重复登记会返回已登记的编码与名称。

5. 注册管理员账号

企业管理员在 IT 管理端登录页注册第一个账号,自动成为该企业的管理员;之后管理员可在管理端按邮箱邀请成员加入。成员角色分管理员、技术员与只读——只读账号能看设备、告警、变更与补丁,但改不了任何东西,也拿不到凭据。

6. 等待审批

企业服务器能从公网以 https 访问时,登记后管理端会自动核验一次地址控制权,通过即「已通过」,通常不用等;内网地址或 http 地址无法自动核验,企业保持「待审批」,由官方人工审批后即可绑定设备。审批状态可在 IT 管理端登录页的「企业码获取」里实时查看。

7. 绑定设备上线

  1. 企业管理员在 IT 管理端设置绑定码。
  2. 桌面端 Agent 首次启动时,输入企业码与绑定码完成绑定,设备即上线并开始上报数据。

8. 升级与自动更新

官方发布新版后,企业端不必等人来装——安装脚本已经配好了:<安装根>/scripts/enterprise-auto-update.sh 每天 04:17 被 /etc/cron.d/ditops-auto-update-<项目名> 拉起,向官方目录要版本、验签、核对 SHA256,有已发布的新版就自动升级(先备份并迁移数据库,再换 compose 与函数)。装的时候加了 --no-auto-update 的机器不配(这个选择记在 <安装根>/.auto-update-disabled,以后重跑也不会自己打开;要重开加 --auto-update 或删掉那个文件);用 --images / --functions 离线装的机器本来就不配。

想先看看会装什么,手工跑一次:

sudo /opt/ditops/scripts/enterprise-auto-update.sh --dir /opt/ditops          # 只检查
sudo /opt/ditops/scripts/enterprise-auto-update.sh --dir /opt/ditops --apply  # 真装

不想让它自动装,用 --no-auto-update 重跑一次安装(会删掉那条 cron 并留下标记);只删 /etc/cron.d/ditops-auto-update-<项目名> 只能停到下次升级,升级时会被重建。也可以把条目里的 --apply 去掉,改成只报告。

脚本只认官方目录返回的、带数字签名的版本清单,下载后还会核对 SHA256;签名或校验和对不上就拒绝安装。安装顺序是「先备份并迁移数据库,再覆盖 compose 与服务端函数」,enterprise/.env 与数据目录始终不动。企业名由脚本从库里读出,cron 里不用写。本机版本记在 /opt/ditops/VERSION,与目录发布的版本一致时什么也不做。

默认不加 --apply 只报告,什么都不改——想先人工确认再装,就去掉 cron 里的 --apply,看日志里给出的版本号。离线安装的机器不要用它,按下面的手工方式升级。

安装/升级会把这一版企业端记录的版本号(bundle)与它还接受的最低客户端版本写进库里,客户端登录前就会读到:

所以企业端升级后,若管理端提示版本过低,更新 IT 管理端与 Agent 即可;升级客户端本身不影响企业库。

手工升级:

# 1. 库:默认只读,--apply 会先 pg_dump 备份到 <dir>/backups/ 再应用
sudo /root/ditops-installer/scripts/migrate-enterprise.sh --dir /opt/ditops --apply

# 2. compose 与函数:解新的安装包,用原来的安装命令重跑(覆盖文件、保留 .env 与数据)
sudo /root/ditops-installer/scripts/install-enterprise.sh \
    --org-name '某某科技有限公司' --host 10.0.0.10

上线验证清单