Skip to content

博衍通 — 发布流程

面向: 发版人员。覆盖服务器准备、发版流程(含界面发布工具)、客户安装、数据包、回滚。 配套: 05-运维手册(部署/监控/故障)· 08-商业化与许可(激活/服务器)

一、整体架构

客户电脑                         你的服务器(Web)
┌───────────────────────┐        ┌──────────────────────────┐
│ 期货分析系统(便携安装)│        │  /futures/version.json    │ ← 更新清单
│  ├ 桌面程序(自包含)   │        │  /futures/updates/*.zip  │ ← 更新包
│  ├ pgsql/(便携PG)    │  HTTP  │  /report                 │ ← 错误上报
│  └ py_scripts/(采集exe)│  ───▶  │  (error_report_server)│
└───────────────────────┘        └──────────────────────────┘

二、服务器准备(一次性)

1. 目录结构(放到你的 Web 服务器静态根目录)

futures/
├─ version.json              # 更新清单
└─ updates/
   └─ futures_1.0.2.zip      # 更新包

2. version.json 格式

json
{
  "latestVersion": "1.0.2",
  "minVersion": "1.0.0",
  "downloadUrl": "https://你的域名/futures/updates/futures_1.0.2.zip",
  "sha256": "更新包文件的SHA256",
  "releaseNotes": "1.0.2 更新说明"
}

生成 SHA256:certutil -hashfile futures_1.0.2.zip SHA256

3. 错误上报接收端

bash
# 服务器上运行(可 systemd/supervisord 常驻)
python tools/server/error_report_server.py --port 8080 --dir /data/reports

# Nginx 反代(可选)
location /report { proxy_pass http://127.0.0.1:8080; }

4. 客户配置(appsettings.json)

json
{
  "UpdateServerUrl": "https://你的域名/futures",
  "ReportServerUrl": "https://你的域名/report",
  "EnableErrorReporting": true
}

URL 留空 = 功能禁用。配置经 DPAPI 加密存储,安全。

三、发版流程(每次升级)

方式 A:界面发布工具(推荐,一键全流程)

使用 tools/ReleasePublisher(独立工具,开发机专用,从 Futures.Tools.slnx 运行或直接用发布 exe):

  1. 输入新版本号(x.y.z)+ 更新说明
  2. 选择选项(运行测试/打包便携PG/收集采集exe)
  3. SSH 免密配置(一次性)
    • 勾选「发布后上传到宝塔服务器」→ 展开配置区
    • 填服务器主机 / SSH 用户(默认 root)
    • 点「生成密钥」→ 本机生成 ~/.ssh/id_rsa(已存在则跳过),私钥自动填入「SSH 私钥」框
    • 点「推送公钥到服务器」→ 弹出 cmd 窗口 → 输入一次服务器密码 → 完成后关窗,此后免密
  4. 发布
    • 填写:远程目录(如 /www/wwwroot/update.example.com/futures)、下载基址(如 https://update.example.com/futures
    • 点「🚀 开始发布」→ 自动完成:改版本 → 构建 → 测试 → 自包含发布 → 打包 → 生成合规 zip(排除 config/pgdata/log)→ 免密 scp 上传 zip + version.json 到服务器
  5. 完成后客户端配置 UpdateServerUrl 指向下载基址即可自动更新

RAG API 一键部署(2026-08-21 发布工具新增): 发布工具新增「🧠 RAG API 服务器配置」区 +「🚀 部署 RAG API」按钮——面向有算力服务器(如 10.10.44.38,无 .NET runtime)。 流程:自包含发布(linux-x64)→ 上传 ~/rag-api → 生成 appsettings(保留服务器现有 PG 配置,只更新 Rag 段) → rag_ingest 依赖 → systemd rag-api.service 安装启动(可见窗口输一次 sudo 密码)→ 健康检查。 首次先「推送公钥到 RAG 服务器」(输一次 SSH 密码),之后免密一键部署。

发布工具编译(修改源码后重新出包):

bash
# 自包含发布(生成 tools/ReleasePublisher/publish/BoyanTongReleasePublisher.exe,双击即用)
dotnet publish tools/ReleasePublisher -c Release -r win-x64 --self-contained true -o tools/ReleasePublisher/publish

发布工具配置存于 publish/publisher_settings.json(服务器地址/SSH 密钥/选项,工具界面填写后自动保存)。

方式 B:命令行(可脚本化)

bash
# 1. 改版本号
#    编辑 Directory.Build.props → <Version>1.0.2</Version>

# 2. 一键发布(构建+测试+自包含发布+组装便携依赖)
powershell -ExecutionPolicy Bypass -File script\build_release.ps1

# 3. 冒烟验证
powershell -ExecutionPolicy Bypass -File script\smoke_test.ps1 -PublishDir publish\futures-1.0.2

# 4. 打包更新包 — 推荐用发布工具或 tools/upload_release/upload_release.ps1 的 -GenerateZip
#    (自动排除 config/pgdata/log 且条目用标准正斜杠 /,Linux 服务器可安全解压)
#    手动方式(PowerShell 5.1 的 Compress-Archive 会写入反斜杠路径,勿用于更新包):
#    dotnet 脚本 tools/upload_release/upload_release.ps1 -GenerateZip 可生成合规包

# 5. 计算 SHA256 并更新服务器 version.json
certutil -hashfile publish\futures_1.0.2.zip SHA256

方式 C:日常发版 SOP(已配好工具后的最快路径)⭐

自动更新链路已全通(检查→弹窗→进度窗口下载→自动覆盖重启,配置/激活/数据库保留)。 日常发版只需 4 步(无需手动拷包到客户机):

powershell
# ① 改版本号
#    编辑 Directory.Build.props → <Version>x.y.z</Version>(AssemblyVersion/FileVersion 同步)

# ② 构建 + 发布到本地 publish\futures-x.y.z(增量覆盖,保留 pgsql/py_scripts/干净 config)
powershell -ExecutionPolicy Bypass -File republish.ps1 -TargetVersion x.y.z

# ③ 写 version.json(publish\futures-x.y.z\version.json,sha256 填 REPLACE 即可,上传脚本自动回填)
#    {"latestVersion":"x.y.z","minVersion":"1.0.0",
#     "downloadUrl":"https://u.bywl.top/updates/futures_x.y.z.zip",
#     "sha256":"REPLACE","releaseNotes":"版本说明"}

# ④ 生成合规 zip(排除 config/pgdata/log,正斜杠条目)+ 免密上传服务器(version.json sha256 自动回填)
powershell -ExecutionPolicy Bypass -File tools\upload_release\upload_release.ps1 `
    -Version x.y.z -ServerHost u.bywl.top -ServerUser root `
    -RemoteRoot /www/wwwroot/u.bywl.top -GenerateZip -ForceZip

完成后客户机重启程序(或启动时)→ 15 秒后自动检测新版本 → 弹窗 → 进度窗口下载 → 自动升级。

要点

  • -ForceZip 每次强制重建 zip(否则上传脚本可能复用旧 zip)
  • 上传脚本自动回填 version.json 的 sha256 并上传到服务器
  • 若服务器 version.json 中文乱码:脚本已用无 BOM UTF-8 写入,正常
  • 客户机需配 UpdateServerUrl: https://u.bywl.top(1.0.4+ 默认已带)
  • 界面发布工具(方式 A)为替代方案:勾选上传+填服务器配置即可一条龙

更新包要点必须排除 config(客户配置/激活文件)、pgdata(数据库数据)、log(日志)。 客户端 UpdateService 自更新脚本与发布工具生成的 zip 都已排除这三项——即使上传完整发布目录也安全, 客户更新后配置/激活/数据库全部保留,只更新程序文件。 ⚠️ zip 条目必须用正斜杠 /(.NET ZipArchive 标准):Windows 上 Path.GetRelativePath/Compress-Archive 会产生反斜杠路径,Linux 服务器(宝塔)解压会损坏。上传发布用 tools/upload_release/upload_release.ps1 -GenerateZip 或发布工具。

三·B、发布后上传到服务器(宝塔/任意静态站)

工具:tools/upload_release/upload_release.ps1(SCP 上传,Windows 自带 scp) 模板:tools/upload_release/version.json.template

powershell
powershell -ExecutionPolicy Bypass -File tools\upload_release\upload_release.ps1 `
    -Version 1.0.1 `
    -ServerHost update.你的域名.com `
    -ServerUser root `
    -RemoteRoot /www/wwwroot/update.你的域名.com/futures `
    -GenerateZip        # zip 缺失/含 config/不完整时自动生成合规包
  • 上传前自动校验:downloadUrl 非占位符、zip 的 SHA256 与 version.json 一致(不一致会更新)
  • 服务器目录:{RemoteRoot}/version.json + {RemoteRoot}/updates/futures_1.0.1.zip
  • 客户机配置 "UpdateServerUrl": "https://update.你的域名.com/futures" 后即可自动更新
  • 用 SSH 密钥免输密码:加参数 -Identity "C:\Users\你\.ssh\id_rsa"

三·C、采集器分发与瘦身安装器(官网下载方案)

采集器按需下载(1.0.10+)

  • 服务器u.bywl.top/collectors/{id}.zip + collectors.json 清单
    • 清单字段:id/displayName/version/url/sizeBytes/group/detectMethod
    • 打包脚本:tools/upload_release/build_collector_zips.ps1(输出 publish\collectors\)
    • 上传:tools/upload_release/upload_collectors.ps1
  • 客户端:系统监控页「📥 采集器下载安装」面板按需下载;首启向导步骤5推荐实时采集器
  • 新增采集器:服务器放 zip + collectors.json 加一条 → 客户「刷新清单」即可下载

安装器工具(BoyanTongSetup.exe,客户一键安装)

工具位置tools/Installer/(WinForms,自包含发布产物 tools/Installer/publish/BoyanTongSetup.exe

功能说明
解压安装解压同目录 app.zip → 安装目录(默认 C:\BoyanTong,可 -dir 指定)
注册表HKCU\Software\BoyanTong(安装路径/版本)+ 卸载信息
快捷方式桌面 + 开始菜单「博衍通」
卸载BoyanTongSetup.exe -uninstall(弹确认后清理注册表)

使用方式

bash
# 交互安装(弹目录选择)
BoyanTongSetup.exe
# 静默安装到指定目录
BoyanTongSetup.exe -dir D:\BoyanTong -silent
# 卸载
BoyanTongSetup.exe -uninstall

重新编译安装器

bash
dotnet publish tools/Installer -c Release -r win-x64 --self-contained true -o tools/Installer/publish
# 产物: tools/Installer/publish/BoyanTongSetup.exe(需与 app.zip 同目录使用)

⚠️ 安装器的 app.zip 需由发布流程生成(瘦身版见下节 build_slim_setup.ps1)。安装器本身版本号在 Program.cs 注册表写入处硬编码,改版时同步。

瘦身安装器(setup.exe,官网主下载)

  • 产物publish\slim_setup\(BoyanTongSetup.exe + app.zip)
    • app.zip = 主程序 + pgsql(不含 py_scripts,约 125MB)
    • BoyanTongSetup.exe = 自包含安装器(解压 + 注册表 + 桌面快捷方式 + 卸载)
  • 构建tools/upload_release/build_slim_setup.ps1 -Version x.y.z
  • 使用BoyanTongSetup.exe [-dir D:\BoyanTong] [-silent]-uninstall 清理注册表
  • 客户装完:首启向导/系统监控页下载采集器

四、许可证签发(厂商工具)

工具源码: tools/LicenseGenerator(WPF 界面工具),解决方案: Futures.Tools.slnx。 从 VS 打开 Futures.Tools.slnx 运行「LicenseGenerator」,或:

bash
dotnet run --project tools/LicenseGenerator
  1. 「生成密钥」(首次)→ 密钥对写入 license_keys/。工具会自动检测新公钥是否与主程序内置公钥一致
    • 一致 → 绿色提示,可直接签发;
    • 不一致 → 醒目警告:已发出的激活码将全部失效,必须同步更新主程序公钥并重新发版。
  2. 「刷新本机机器码」 → 读取当前电脑机器码(厂商机)。
  3. 在「客户机器码」填客户电脑的机器码 → 选择永久/订阅 → 「签发激活码」 → 复制发给客户。
  • 私钥位置tools/LicenseGenerator/bin/Debug/net9.0-windows/license_keys/private_key.xml
  • ⚠️ 私钥已加入 .gitignore,绝不入库/分发。丢失则所有已发激活码失效(需重新签发)。
  • 公钥单一来源:src/Futures.License/LicenseCrypto.EmbeddedPublicKeyXml(签发工具与主程序 LicenseManager 共用,防算法漂移)。

五、客户安装(首次)

  1. 解压软件包(含 pgsql/)到任意目录
  2. 双击 Futures.Desktop.exe
  3. 首启向导:
    • 「一键使用便携数据库」→ 自动 initdb + 启动 + 建核心表
    • 填天勤账号(客户自备)
    • 可选导入初始数据包(.backup)
  4. 完成 → 进入软件;未激活时按提示输入激活码

首次安装冒烟验证:发版前务必在全新目录(或删掉 pgdata 后)做一次首启验证—— 主窗口显示后不应出现 Failed to connect to 127.0.0.1:5432 报错刷屏。 若新增了依赖数据库的功能,先对照 06-开发指南「十二、新增数据库功能规范(首启时序)」 检查时序。

六、数据包制作(给客户预置历史数据)

  1. 打开「系统 → 数据备份与维护」→「📦 制作数据包」
  2. 勾选表(默认静态表全量 + 日线近730天),生成 .backup
  3. U盘/网盘分发给客户 → 客户首启向导「导入数据包」或维护页「📥 导入」

七、合规提醒

  • 天勤 SDK 商业授权:打包分发 tqsdk 前,务必与天勤(信易科技)确认商业授权条款。
  • 交易所行情版权:商业产品使用交易所行情需授权。

八、回滚

  • 客户机:保留上一版 zip,手动覆盖回滚。
  • 更新包发布错误:删除服务器 version.json(或改回旧版本号)→ 客户端不再提示更新。

瓯衍期货分析系统 · 温州博益网络科技有限公司