不使用静态部署状态或人工填报结果。
BNT PLATFORM OPERATIONS
系统总览
真实接口 · 固定目录 · 最近快照
NEEDS ATTENTION
需要关注
只列真实上报的异常与采集问题
BUSINESS WORKFLOWS
业务运行摘要
未接入下次执行接口的链路不会推测时间
SERVICE HEALTH
服务健康
详细依赖与观测信息见服务目录
单个依赖失败隔离,不阻塞其他服务。
不保存全量时序指标,不替代日志平台。
SERVICE CATALOG
服务目录
运行状态、版本、依赖与最近观测
CONTROLLED CONFIGURATION
配置中心
先定位并查看真实文件;修改仍在服务器上完成
READ-ONLY FILE INVENTORY
生产配置文件
固定清单 · 实时读取 · 敏感值遮蔽
这里展示服务器当前文件的脱敏预览,不是运行中服务的生效值。ENV 只显示键名与经审核的用途说明;说明来自随代码发布的目录,不读取文件注释,未收录的键显示“暂无说明”。YAML 中未经允许的值和所有注释均被遮蔽。修改请按路径在服务器上备份、校验并按需重启。
选择文件查看当前服务器上的脱敏预览。
TYPED DYNAMIC CONFIG
AI Outcome 运行配置
固定 4 项 · 完整快照 · 原子生效
VERSIONED STARTUP CONFIG
AI Outcome 启动配置包
固定 6 项 · Jenkins 显式选择 · 重启后生效
PRODUCTION OPERATIONS HANDBOOK
运维手册
基于生产盘点的服务台账、标准操作与故障处置
RUNTIME TOPOLOGY
服务拓扑与台账
端口均以服务器实际监听和服务目录为准;loopback 服务不应直接开放公网。
| 服务 | Unit / Runtime | 监听 | 健康接口 | 运行用户 |
|---|---|---|---|---|
| Nginx公网入口 | nginx.service | 443 public | HTTPS 主站 | 系统服务 |
| Backtest主站 API | bnt-backtest.service | 127.0.0.1:18080 | /actuator/health | bnt:bnt |
| AI AnalysisAI API / Gateway | bnt-ai-analysis.service | 127.0.0.1:18091 | /actuator/health | bnt:bnt |
| Market Data MCPJava MCP | market-data-mcp.service | 127.0.0.1:9070 | /health/ready | bnt:bnt |
| QMT Trace实盘高风险服务 | bnt-qmt-trace-service.service | 9998 当前 all-address | /actuator/health | bnt:bnt |
| Live Fact Bridge独立事实桥 | bnt-ai-live-fact-bridge.service | 127.0.0.1:18092 | /actuator/health | bnt:bnt |
| 运维中心独立控制面 | bnt-platform-control-center.service | 127.0.0.1:18095 | /actuator/health | bnt:bnt |
| HermesGateway / Dashboard | hermes-gateway.service hermes-dashboard.service | 127.0.0.1:8642 / 9119 | Dashboard / | hermes:hermes |
| MySQL / RedisDocker | bt_mysql / bt_redis | 127.0.0.1:3306 / 6379 | Docker health | 容器用户 |
生产盘点发现 QMT 9998 监听所有地址,MySQL/Redis 另有 33309/36379 宿主映射。它们必须由云安全组与主机防火墙限制,不能仅凭应用配置判断为安全。
Python MCP Unit
fundamentals-mcp · hot-money-mcp · lockup-mcp · news-mcp · options-history-mcp · options-realtime-mcp
已登记 systemd Unit 和固定端口,但没有统一 health URL;日常以 Unit 状态和 Hermes/MCP 汇总为准。
真实健康接口
curl -fsS http://127.0.0.1:18080/actuator/health
curl -fsS http://127.0.0.1:18091/actuator/health
curl -fsS http://127.0.0.1:9070/health/ready
curl -fsS http://127.0.0.1:9998/actuator/health
curl -fsS http://127.0.0.1:18092/actuator/health
curl -fsS http://127.0.0.1:18095/actuator/healthDAILY CHECK
日常巡检
先建立基线,再做变更;只读巡检不应改变任何服务状态。
一键受控巡检
/opt/bnt-ops/bin/verify-services.sh
失败 Unit 与核心状态
systemctl --failed --no-pager
systemctl is-active bnt-backtest bnt-ai-analysis market-data-mcp \
bnt-qmt-trace-service bnt-ai-live-fact-bridge \
hermes-gateway hermes-dashboard nginx
容器健康
docker ps --format 'table {{.Names}}\t{{.Status}}\t{{.Ports}}'
docker inspect --format '{{.Name}} {{.State.Health.Status}}' bt_mysql bt_redis
资源基线
uptime
free -h
df -h / /data /opt
systemd-cgtop --depth=2
异常日志窗口
journalctl -p warning --since '30 min ago' --no-pager
journalctl --disk-usage
- 磁盘空间足够容纳新 release 与数据库备份
- 可用内存满足构建或研究任务预算
- 变更前现网没有未解释的 DOWN/DEGRADED
- 交易时段不操作 QMT Trace 等高风险服务
LOG DIAGNOSIS
日志与进程排查
journalctl 是 systemd 服务的事实源;运维中心不替代日志平台。
实时日志
journalctl -u bnt-ai-analysis -f
journalctl -u bnt-backtest -f
journalctl -u market-data-mcp -f
journalctl -u hermes-gateway -f
journalctl -u bnt-qmt-trace-service -f
journalctl -u bnt-ai-live-fact-bridge -f
journalctl -u bnt-platform-control-center -f
最近记录与启动周期
journalctl -u bnt-ai-analysis -n 200 --no-pager
journalctl -u bnt-ai-analysis --since '1 hour ago' --no-pager
journalctl -u bnt-ai-analysis -b --no-pager
systemctl status bnt-ai-analysis --no-pager --full
优先记录首次异常时间、Unit、release ID、错误类型和依赖状态。不要只截取最后一行异常。
SERVICE LIFECYCLE
启动、停止与受控重启
重启只管理当前制品;发布才会构建并替换版本。
推荐入口
Jenkins: BNT-Service-Operations
ACTION: status | logs | restart
LOG_LINES: 1–1000
服务器受控脚本
/opt/bnt-ops/bin/service-action.sh bnt-ai-analysis status
/opt/bnt-ops/bin/service-action.sh bnt-ai-analysis logs 200
/opt/bnt-ops/bin/service-action.sh bnt-ai-analysis restart
终端应急命令
systemctl status bnt-backtest bnt-ai-analysis market-data-mcp --no-pager
systemctl is-active bnt-backtest bnt-ai-analysis market-data-mcp
systemctl restart bnt-backtest
systemctl restart bnt-ai-analysis
systemctl restart market-data-mcp
应急重启前先记录状态与日志;完成后运行全局健康检查。不要用 restart 代替发布。
RELEASE & ROLLBACK
Jenkins、发布与回滚
所有发布使用 Gitee 可定位 commit、不可变 release、SHA-256 和健康检查。
推荐入口
https://jenkins.bntinvestment.com
公网只开放 Nginx 443;Jenkins 宿主端口 127.0.0.1:18088 继续保持 loopback,不加入云安全组公网规则。
应急 SSH 隧道
ssh -L 18088:127.0.0.1:18088 root@47.106.221.211
http://127.0.0.1:18088
凭据位于服务器 /etc/bnt-ops/jenkins/*.password 的 root-only 文件中。本页面不提供内容查看、下载或复制命令。
发布前后
- 运行 BNT-Health-Check 并记录现网基线
- 确认仓库、分支和 40 位 commit
- 核对测试开关、交易窗口与配置版本
- 在 Confirm 页面核对 release 与摘要
- 发布后检查 Unit、健康接口、Nginx 和核心业务
- 记录 commit、release、迁移、操作人和验收结果
Jenkins 授权策略
| 角色 | 账号 | 允许 | 禁止 |
|---|---|---|---|
| 管理员 | admin | 完整 Jenkins 管理 | 凭据仍不得输出到页面或构建日志 |
| 普通登录用户 | maintainer1 / maintainer2 / liu / chen | 与 admin 相同的完整 Jenkins 管理权限 | 凭据仍不得输出到页面或构建日志 |
| 匿名 | 未登录 | 登录页面 | Jenkins API、Job 和管理页面 |
当前策略为“登录用户完整控制”。任一普通账号泄露都等同管理员账号泄露;账号只发给完全受信人员,人员离开或设备失陷时必须立即停用账号并轮换相关凭据。
| Jenkins Job | 用途 | 主要影响 |
|---|---|---|
| BNT-Health-Check | 全局只读健康检查 | 不改变状态 |
| BNT-Service-Operations | 登记服务 status / logs / restart | restart 只重启当前版本 |
| BNT-Deploy-Platform | Backtest、AI Analysis、Web、migration | 备份 bt_ai,切换主平台 release |
| MCP-Deploy-Market-Data | 构建发布 Java MCP | 替换 MCP JAR并刷新 AI 工具目录 |
| BNT-Deploy-QMT-Trace | 发布实盘 QMT Trace | 高风险,禁止交易时段执行 |
| BNT-Deploy-Live-Fact-Bridge | 独立发布事实 Bridge | 不重启 QMT/AI/Hermes |
| BNT-Deploy-Control-Center | 独立发布运维中心 | 只重启运维中心 |
| BNT-LightGBM-Research | 研究训练、预测与导入 | 不触发交易;受资源门槛控制 |
/opt/bnt-platform/releases/<release-id>/opt/bnt-platform/current/opt/bnt-platform-control-center/releases/<release-id>/opt/bnt-platform-control-center/current/opt/bnt-ai-live-fact-bridge/releases/<release-id>/opt/bnt-ai-live-fact-bridge/current/data/javaMcp/releases/<release-id>/data/javaMcp/backups/before-<release-id>/data/bnt-qmt-trace-service/releases/<release-id>/data/bnt-qmt-trace-service/backups/before-<release-id>查看当前主平台版本
/opt/bnt-ops/bin/show-platform-version.sh
readlink -f /opt/bnt-platform/current
ls -l /opt/bnt-platform/current
cat /opt/bnt-platform/current/RELEASE
流水线切换后健康检查失败会自动恢复上一 release。需要人工恢复时先停止继续发布并保存失败日志,由发布负责人按已有不可变 release 执行,不在手册中提供裸软链接替换命令。
CONFIGURATION CONTRACT
配置文件与变更规则
外置配置不随代码发布覆盖;修改后必须按生效方式重启或发布验证。
| 服务 | 生产路径 | 实测权限 | 规则 |
|---|---|---|---|
| Backtest | /etc/bnt-platform/backtest.env | EnvironmentFile | 秘密 ENV,禁止页面展示值 |
| AI Analysis | /etc/bnt-platform/ai-analysis.env /etc/bnt-platform/ai-analysis/application.yml | 640 root:bnt 600 bnt:bnt | ENV/YAML 均需重启;发布不覆盖 |
| AI 启动配置包 | /etc/bnt-platform/managed/ai-analysis-outcome.env | 640 root:bnt | 由 Jenkins 生成,不手工编辑 |
| Market Data MCP | /etc/market-data-mcp/env | 600 bnt:bnt | 修改后重启 MCP,再刷新 AI |
| QMT Trace | /etc/bnt-qmt-trace-service/ai-live-tracking.env | 640 root:bnt | 实盘配置,交易窗口外变更 |
| Live Fact Bridge | /etc/bnt-ai-live-fact-bridge/bridge.env | 640 root:bnt | 只重启独立 Bridge |
| 运维中心 | /etc/bnt-platform-control-center/control-center.env | 640 root:bnt | 含数据库与服务令牌;绝不展示值 |
安全盘点
stat -c '%a %U:%G %s %n' /etc/bnt-platform/ai-analysis.env
sha256sum /etc/bnt-platform/ai-analysis.env
cut -d= -f1 /etc/market-data-mcp/env用权限、大小、键名和 SHA 判断漂移;不要把秘密值复制到终端回显、浏览器或聊天。
主平台外置 YAML
ls -lh /etc/bnt-platform/ai-analysis/application.yml
sed -n '1,240p' /etc/bnt-platform/ai-analysis/application.yml
sudoedit /etc/bnt-platform/ai-analysis/application.ymlAI ENV
ls -lh /etc/bnt-platform/ai-analysis.env
sudoedit /etc/bnt-platform/ai-analysis.envBACKUP & RECOVERY
备份、校验与恢复
主平台发布前自动备份 bt_ai;恢复是高风险写操作,必须在维护窗口执行。
创建与核对数据库备份
/opt/bnt-ops/bin/backup-bt-ai.sh
find /data/backup/bnt/releases -maxdepth 1 -name 'bt_ai_*.sql.gz' \
-printf '%TY-%Tm-%Td %TH:%TM %s %f\n' | sort -r | head
gzip -t /data/backup/bnt/releases/bt_ai_YYYYMMDDHHMMSS.sql.gz备份使用 single-transaction,落盘为 0600;小于 1 KiB 或 gzip 校验失败会拒绝成功。
恢复前检查单
- 确认恢复目标、备份时间、文件大小和 gzip 完整性
- 记录当前 release、migration 版本与所有依赖状态
- 停止会继续写入目标 Schema 的业务流量
- 先在隔离 Schema 验证备份可导入和关键表完整
- 明确回退方案和维护窗口后再执行生产恢复
- 恢复后运行 migration、健康检查和核心业务验收
本页面不提供数据库导入命令,避免把破坏性恢复误当作日常操作。
EDGE & TLS
Nginx、域名与证书
公网只由 Nginx 443 提供;应用端口原则上保持 loopback。
生效配置
/etc/nginx/sites-enabled/bnt-backend
/etc/nginx/snippets/bnt-control-center.conf
/etc/nginx/sites-enabled/ops.bntinvestment.com
/etc/nginx/sites-enabled/jenkins.bntinvestment.com
/etc/nginx/conf.d/jenkins-upstream.conf
/etc/nginx/snippets/jenkins-proxy.conf
验证与重载
nginx -t
systemctl status nginx --no-pager
journalctl -u nginx -n 200 --no-pager
systemctl reload nginx
tail -n 200 /var/log/nginx/jenkins.error.log固定入口
- bntinvestment.com → 主站 Web/API
- ops.bntinvestment.com → 独立运维中心
- jenkins.bntinvestment.com → Jenkins HTTPS 入口
- www.bntinvestment.com/ops/ → 兼容入口
- /internal 与 /actuator 在运维域名公网返回 404
- Jenkins 18088 仅 loopback,经 Nginx 443 反向代理
TLS 自动续期
systemctl status certbot.timer --no-pager
certbot renew --dry-runINCIDENT RUNBOOKS
常见故障处置
先定位故障层级,再选择最小影响动作;不要通过连续重启掩盖根因。
- curl 对应 loopback 健康接口
- 检查 Unit active 与最近启动日志
- 执行 nginx -t 并查看 Nginx 日志
- 核对 current release 和端口监听
- 确认依赖后再决定重启或回滚
- systemctl status 获取退出码
- journalctl -b 找首次异常
- 检查端口占用、磁盘与内存
- 只核对配置权限/键名/SHA,不输出秘密
- 新 release 失败优先使用自动回滚
- 验证 9070 readiness
- 检查 MCP 日志与工具 Schema
- 确认 AI Analysis 健康
- 按依赖顺序重启 AI Analysis
- 检查 Hermes 并做真实工具调用
- docker ps 与 health 状态
- 确认磁盘、内存和连接压力
- 识别所有依赖服务影响
- 保存容器日志再决定操作
- 禁止未备份直接重建容器或数据卷
- df -h 确认受影响文件系统
- du -xhd1 /data 与 /opt 定位目录
- 检查 journalctl --disk-usage
- 按保留策略归档旧制品与备份
- 禁止临时 rm -rf 不明目录
- 记录文件权限、大小和 SHA
- 对照最近发布与运维中心 revision
- 确认生效方式为动态或需重启
- 恢复到已知版本而非现场猜测
- 复核实际摘要和应用回执
SECURITY & ACCEPTANCE
安全边界与验收清单
秘密只留在服务器受限文件;任何生产变更都必须留下可定位的版本和结果。
禁止事项
- 禁止在浏览器、聊天或构建日志中显示 ENV、Token 和密码
- 禁止把 Jenkins 密码文件内容复制出服务器
- 禁止用 root 运行新的业务进程
- 禁止绕过 Jenkins 直接覆盖不可变 release 制品
- 禁止在交易窗口发布或重启实盘高风险服务
- 禁止对不明目录、数据卷执行递归删除
变更验收
- 目标 commit / release / 配置 revision 已记录
- 所有受影响 Unit 为 active
- 健康接口和 BNT-Health-Check 通过
- Nginx 配置与公网核心路径通过
- 秘密 ENV 的权限和 SHA 未被意外改变
- 数据库 migration 与备份可定位
- 关键业务流程完成真实验收
- 操作人、时间、结果和异常已记录
/etc/bnt-ops/jenkins/admin.password、maintainer1.password、maintainer2.password 仅用于受控服务器端登录。页面只记录路径,不提供读取命令或秘密值。
ops-admin、maintainer1、maintainer2 均拥有 OPS_VIEWER、OPS_OPERATOR、OPS_ADMIN。两个维护账号的独立密码仅保存于服务器 /etc/bnt-platform-control-center/maintainer1.password 与 maintainer2.password;页面不读取、不显示秘密值。