深色模式
博衍通 — 发布流程
面向: 发版人员。覆盖服务器准备、发版流程(含界面发布工具)、客户安装、数据包、回滚。 配套: 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):
- 输入新版本号(x.y.z)+ 更新说明
- 选择选项(运行测试/打包便携PG/收集采集exe)
- SSH 免密配置(一次性):
- 勾选「发布后上传到宝塔服务器」→ 展开配置区
- 填服务器主机 / SSH 用户(默认 root)
- 点「生成密钥」→ 本机生成
~/.ssh/id_rsa(已存在则跳过),私钥自动填入「SSH 私钥」框 - 点「推送公钥到服务器」→ 弹出 cmd 窗口 → 输入一次服务器密码 → 完成后关窗,此后免密
- 发布:
- 填写:远程目录(如
/www/wwwroot/update.example.com/futures)、下载基址(如https://update.example.com/futures) - 点「🚀 开始发布」→ 自动完成:改版本 → 构建 → 测试 → 自包含发布 → 打包 → 生成合规 zip(排除 config/pgdata/log)→ 免密 scp 上传 zip + version.json 到服务器
- 填写:远程目录(如
- 完成后客户端配置
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」,或:bashdotnet run --project tools/LicenseGenerator
- 「生成密钥」(首次)→ 密钥对写入
license_keys/。工具会自动检测新公钥是否与主程序内置公钥一致:- 一致 → 绿色提示,可直接签发;
- 不一致 → 醒目警告:已发出的激活码将全部失效,必须同步更新主程序公钥并重新发版。
- 「刷新本机机器码」 → 读取当前电脑机器码(厂商机)。
- 在「客户机器码」填客户电脑的机器码 → 选择永久/订阅 → 「签发激活码」 → 复制发给客户。
- 私钥位置:
tools/LicenseGenerator/bin/Debug/net9.0-windows/license_keys/private_key.xml - ⚠️ 私钥已加入 .gitignore,绝不入库/分发。丢失则所有已发激活码失效(需重新签发)。
- 公钥单一来源:
src/Futures.License/LicenseCrypto.EmbeddedPublicKeyXml(签发工具与主程序LicenseManager共用,防算法漂移)。
五、客户安装(首次)
- 解压软件包(含
pgsql/)到任意目录 - 双击
Futures.Desktop.exe - 首启向导:
- 「一键使用便携数据库」→ 自动 initdb + 启动 + 建核心表
- 填天勤账号(客户自备)
- 可选导入初始数据包(.backup)
- 完成 → 进入软件;未激活时按提示输入激活码
首次安装冒烟验证:发版前务必在全新目录(或删掉
pgdata后)做一次首启验证—— 主窗口显示后不应出现Failed to connect to 127.0.0.1:5432报错刷屏。 若新增了依赖数据库的功能,先对照 06-开发指南「十二、新增数据库功能规范(首启时序)」 检查时序。
六、数据包制作(给客户预置历史数据)
- 打开「系统 → 数据备份与维护」→「📦 制作数据包」
- 勾选表(默认静态表全量 + 日线近730天),生成
.backup - U盘/网盘分发给客户 → 客户首启向导「导入数据包」或维护页「📥 导入」
七、合规提醒
- 天勤 SDK 商业授权:打包分发 tqsdk 前,务必与天勤(信易科技)确认商业授权条款。
- 交易所行情版权:商业产品使用交易所行情需授权。
八、回滚
- 客户机:保留上一版 zip,手动覆盖回滚。
- 更新包发布错误:删除服务器
version.json(或改回旧版本号)→ 客户端不再提示更新。