docs(project): 同步维护冻结与运行文档
bat-rust / Build and test Rust (push) Canceled after 0s

补齐解析模块维护冻结规则,并同步 CURRENT_STATUS、CURRENT_GAPS、PROJECT_PLAN、RPC 参考、部署指南、用户指南和官方资源运行说明。

文档同时反映 bat-api 资源 bootstrap/分发边界、官方同步解析缓存、TextUnit 队列、双目录发布和 patch 入口的当前状态。

验证:未运行新命令;本轮已按要求停止重复构建/测试。
This commit is contained in:
2026-07-31 00:45:46 +08:00
parent 3f78f8f880
commit 03021ad649
16 changed files with 946 additions and 225 deletions
+152 -7
View File
@@ -5,8 +5,9 @@
BlueArchive Toolkit 的部署文档分为当前可用模式和目标模式:
1. **本地开发模式**:代码在本地,连接本地或远程数据库。
2. **官方资源同步生产任务**:当前可用,运行 Rust `bat --watch`
3. **完整单机/分布式部署**:尚未提供。API Server、数据库迁移和 Web 未实现前,不把它作为可执行部署方案
2. **官方资源同步生产任务**:当前可用,运行 Rust `bat --watch` 或 RPC/daemon 模式
3. **bat-api 资源 bootstrap / 分发服务**:当前可用,和 Rust `bat` 在同一服务器/容器环境运行,经 `bat.sock` RPC 获取当前 `resource_root`
4. **完整单机/分布式部署**:尚未提供。完整游戏业务 API、数据库迁移和 Web 未实现前,不把它作为可执行部署方案。
---
@@ -100,7 +101,7 @@ REDIS_PORT=6379
## 模式 3:官方资源同步生产任务
当前可部署的生产任务是 Rust 官方资源同步 binary。API Server 和 Web 尚未实现,不能按完整服务端产品部署。
当前可部署的生产同步任务是 Rust 官方资源同步 binary。`bat-api` 资源 bootstrap / 分发服务见模式 4;完整游戏业务 API 和 Web 尚未实现,不能按完整服务端产品部署。
### 构建 release binary
@@ -198,14 +199,14 @@ sudo -u bat /opt/bluearchive-toolkit/bin/bat \
--no-progress
```
### 推荐模式:systemd 托管 `--watch`
### 推荐模式:纯同步时 systemd 托管 `--watch`
生产推荐让 systemd 直接托管前台 `--watch` 进程,而不是在 systemd 里再启动 `--daemon`。原因:
只需要远程长期同步资源、暂不部署 `bat-api` 时,推荐让 systemd 直接托管前台 `--watch` 进程,而不是在 systemd 里再启动 `--daemon`。原因:
- systemd 能直接追踪主进程、退出码、重启次数和 stop 信号。
- 日志进入 journald,用 `journalctl` 管理,不依赖 `bat-daemon.log`
- Rust 内部已经负责 1 小时间隔、北京时间固定强制刷新和失败快速重试,systemd 不需要 timer。
- `bat --daemon` 的 Unix socket RPC 适合没有进程管理器的 shell/container 场景systemd 场景下用 `systemctl``journalctl``bat verify/doctor` 运维即可。
- `bat --daemon` 的 Unix socket RPC 适合 shell/container 场景,也适合给同环境运行的 `bat-api` 提供 release 发现;纯同步 systemd 场景下用 `systemctl``journalctl``bat verify/doctor` 运维即可。
安装 unit 和可选环境文件:
@@ -256,6 +257,8 @@ sudo -u bat /opt/bluearchive-toolkit/bin/bat stop --state-dir /var/lib/bluearchi
不要同时运行 systemd `--watch` 和 standalone `--daemon` 指向同一个 `--output`。二者都会被资源锁和 live daemon 互斥保护,但生产运维上应保持单一 owner。
如果同一台服务器还要运行 `bat-api`,必须让 Rust `bat` 以能提供 `bat.sock` 的 RPC 形态运行,并让 `bat-api` 通过该 socket 获取当前 `resource_root`。这种部署见模式 4;不要把 `BAT_API_RESOURCE_ROOT` 当作生产主配置。
### 日志和状态路径
systemd 模式:
@@ -351,7 +354,149 @@ sudo -u bat tar -C /var/lib/bluearchive-toolkit/official \
---
## 模式 4完整生产环境部署
## 模式 4bat-api 资源 bootstrap / 分发服务
适用场景:真实 Rust `bat` 长期运行在远程服务器,并且同一服务器/容器环境内运行 Go `bat-api`,给客户端、补丁器或上层工具提供启动前资源入口和 CDN path 只读分发。
核心约束:
1. `bat-api` 与 Rust `bat` 同环境部署,至少要能访问同一个 Unix socket 和同一个已发布资源文件系统。
2. 当前资源目录由 `bat.sock` RPC 返回的 `resource_root` 决定;生产不要在 `bat-api` 配置里写死 `BAT_API_RESOURCE_ROOT`
3. `BAT_API_RESOURCE_ROOT` 只用于本地 fixture、临时只读诊断或 RPC 不可用时的应急验证。
4. `bat.sock` 只在服务器本机使用,不通过公网暴露;对外只发布 HTTP `bat-api`,生产建议放在反向代理和 TLS 后面。
5. 本地开发环境不需要、也不应全量运行 `bat`;使用 Go 单测、fixture release 或远程服务器联调。
### 构建和安装 bat-api
```bash
make build-go-api
VERSION="$(git rev-parse --short HEAD)"
sudo install -d -o root -g root -m 0755 \
/opt/bluearchive-toolkit/releases/"${VERSION}" \
/opt/bluearchive-toolkit/bin
sudo install -o root -g root -m 0755 \
bin/bat-api \
/opt/bluearchive-toolkit/releases/"${VERSION}"/bat-api
sudo ln -sfn \
/opt/bluearchive-toolkit/releases/"${VERSION}"/bat-api \
/opt/bluearchive-toolkit/bin/bat-api
/opt/bluearchive-toolkit/bin/bat-api --help
```
如果 Rust `bat` 和 Go `bat-api` 使用同一个 release 目录发布,也可以把二者放在同一个 `<version-or-git-sha>` 目录下,分别通过 `/opt/bluearchive-toolkit/bin/bat``/opt/bluearchive-toolkit/bin/bat-api` 暴露稳定 symlink。
### bat 侧前置条件
`bat-api` 依赖 live RPC,而不是直接读取 daemon 状态文件。部署 `bat-api` 前,远程服务器上应已有 socket 形态的 Rust `bat`
```bash
sudo -u bat /opt/bluearchive-toolkit/bin/bat \
--auto-discover \
--output /var/lib/bluearchive-toolkit/official \
--localized-output /var/lib/bluearchive-toolkit/localized \
--state-dir /var/lib/bluearchive-toolkit/daemon-state \
--daemon
sudo -u bat /opt/bluearchive-toolkit/bin/bat status \
--state-dir /var/lib/bluearchive-toolkit/daemon-state
```
确认 socket 存在:
```bash
sudo -u bat test -S /var/lib/bluearchive-toolkit/daemon-state/bat.sock
```
不要同时再运行一个 `--watch` service 指向 `/var/lib/bluearchive-toolkit/official`。如果当前服务器已经部署了 `bluearchive-toolkit-official-sync.service` 的纯同步 `--watch` 模式,需要先切换为 socket/RPC 形态,再启用 `bat-api`
### 安装 bat-api systemd unit
```bash
sudo install -o root -g root -m 0644 \
deployments/systemd/bluearchive-toolkit-bat-api.service \
/etc/systemd/system/bluearchive-toolkit-bat-api.service
sudo install -o root -g root -m 0644 \
deployments/systemd/bat-api.env.example \
/etc/bluearchive-toolkit/bat-api.env
sudo systemctl daemon-reload
sudo systemctl enable --now bluearchive-toolkit-bat-api.service
```
默认配置只监听本机:
```env
BAT_API_LISTEN=127.0.0.1:18080
BAT_API_PUBLIC_BASE_URL=http://127.0.0.1:18080
BAT_API_SOCKET=/var/lib/bluearchive-toolkit/daemon-state/bat.sock
BAT_API_REFRESH_INTERVAL=1m
BAT_API_ACCESS_LOG=true
BAT_API_RATE_LIMIT_RPS=30
BAT_API_RATE_LIMIT_BURST=120
```
生产反向代理公开后,把 `BAT_API_PUBLIC_BASE_URL` 改成客户端实际访问的 HTTPS 根,例如:
```env
BAT_API_PUBLIC_BASE_URL=https://assets.example.com
```
面对玩家分发时还应通过 secret manager 或 systemd credential 注入:
```env
BAT_API_AUTH_TOKEN=<secret>
BAT_API_AUTH_QUERY_PARAM=bat_token
BAT_API_AUTH_EXEMPT_PATHS=/healthz,/readyz
BAT_API_MAX_RESOURCE_LIMIT=1000
```
反代必须强制 HTTPS,并在转发到 `bat-api` 前清洗客户端提交的 `X-Forwarded-For` / `X-Real-IP`。只有确认反代会覆盖这些 header 时,才设置:
```env
BAT_API_TRUST_PROXY_HEADERS=true
```
否则保持默认 `false``bat-api` 会按 TCP peer IP 做限流和日志归因。应用层访问日志只记录 path,不记录 query string,避免 query token 进入日志。动态 JSON 响应使用 `Cache-Control: no-store`;CDN 字节路径仍使用长期 immutable 缓存。
不要在生产 env 里设置 `BAT_API_RESOURCE_ROOT``bat-api` 会按 `BAT_API_REFRESH_INTERVAL` 周期通过 RPC 重新读取 `catalog.status` / `resource.manifest`,从而跟随 Rust `bat` 切换 `current -> versions/<id>`
### 健康检查
```bash
systemctl status bluearchive-toolkit-bat-api.service
journalctl -u bluearchive-toolkit-bat-api.service -f
curl -fsS http://127.0.0.1:18080/healthz
curl -fsS http://127.0.0.1:18080/readyz
curl -fsS http://127.0.0.1:18080/v1/bootstrap
curl -fsS http://127.0.0.1:18080/v1/launcher/bootstrap
curl -fsS http://127.0.0.1:18080/api-launcher-jp.yo-star.com/api/launcher/game/config
curl -fsS http://127.0.0.1:18080/openapi.yaml
curl -fsS http://127.0.0.1:18080/admin/
```
`/healthz` 是 liveness,固定返回服务存活状态,并包含最近一次 RPC refresh 的开始时间、成功时间、耗时、warning 和错误摘要。`/readyz` 是 readiness,当前没有可分发 release 时返回 `503``rpc_available=true``ready=true` 表示 `bat-api` 已经通过 RPC 发现可分发 release`ready=false` 时,先检查 `bat.sock`、Rust `bat status``resource_root` 是否存在,以及 `official-download-manifest.json` 中的文件是否仍在磁盘上。
`/v1/launcher/bootstrap``/api-launcher-jp.yo-star.com/api/launcher/...` 只用于 launcher 资源 metadata / GameMainConfig 引导兼容。它们从 Rust `bat` 的已发布 snapshot/RPC 派生响应,显式标记不是完整 package update manifest;生产排障时应确认这些响应中的 `scope=resource_bootstrap_only``resource_bootstrap_url`、server-info URL 和 client-patch base 是否指向当前 `BAT_API_PUBLIC_BASE_URL`
### 本地开发限制
开发机不能本地全量运行 `bat` 时,不需要伪造生产资源目录。Go 侧改动用单测和 fixture 验证:
```bash
make test-go-api
make build-go-api
BAT_API_SKIP_ENV_FILE=1 go run ./cmd/bat-api \
--listen 127.0.0.1:18080 \
--public-base-url http://127.0.0.1:18080 \
--resource-root internal/api/testdata/release \
--refresh-interval 0
```
这条本地命令只验证 HTTP 形态、server-info 改写、CDN path、Range/缓存语义和管理接口;真实全量 release 联调应在远程长期运行的 `bat` 环境里执行。
---
## 模式 5:完整生产环境部署
当前不可用。API Server、数据库迁移、Web 管理后台和发布编排尚未实现;不要按完整服务端产品部署本仓库。