Files
opendance-windows/tasks/014-full-package.md
T
zijunchiang cbd5001e98 docs(tasks): 修正整包上传失败结论——与体积无关,指向 Gitea 宿主机磁盘
原先记的「16.4 MB 边界」是误判(当时磁盘正被失败的请求逐步填满)。补做隔离
测试后:1 KB 与 100 KB 也失败且是**瞬间**失败(不是读完请求体才判断),三个仓库的
Release 资产接口同样失败,而创建 Release / PATCH 说明(纯 JSON)都正常,
其间还有 927 KB 的附件成功过一次 —— 因此不是体积上限,而是「附件文件落盘」这条
通道坏了,最可能是 Gitea 宿主机磁盘/临时目录几乎写满(返回 500 而非 413)。

IIS 那一关已确认放开生效(38,245,661 字节请求体被完整接收,不再 413)。
整包与 SHA256SUMS 已就绪,待宿主机空间问题解除后立即上传(不生成分卷)。

详见 opendance-web/deploy/proxy/README.md 第九节 9.1。
2026-09-17 01:51:33 +08:00

113 lines
5.0 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# T-WIN-014 发布交付:必须上传完整包
- **状态**: done
- **依赖**: T-WIN-011
- **文档**: v1.6 §5.7
## 问题
`v0.1.0` 发布到 Gitea 的 Release 资产是
```
opendance-windows-v0.1.0.zip.part0
opendance-windows-v0.1.0.zip.part1
opendance-windows-v0.1.0.zip.part2
REASSEMBLE.txt
SHA256SUMS.txt
```
用户下载到的是**三个碎片**,必须先按 `REASSEMBLE.txt` 拼接再解压 —— 这就是"分卷有问题"。
## 根因(实测)
| 上传体积 | 结果 |
|--|--|
| 14 MB | 通过(HTTP 201) |
| 30.5 MB | **失败 HTTP 413**(IIS「请求实体过大」页面) |
| 40 MB | **失败 HTTP 413** |
→ 当前上限是 **IIS 默认的 `maxAllowedContentLength = 30,000,000` 字节(≈28.6 MiB)**。
整包约 38 MB(`exe` ≈104 MB 未压缩、`pck` ≈107 KB),当时被拆成每卷 13 MiB 才传上去。
## 方案(采用 A:提高上限)
- **A. 提高上限**(推荐,配置一次永久解决):IIS `maxAllowedContentLength = 268435456`(256 MB),
ARR `maxRequestBytes` 同步放宽,Gitea `app.ini` `[attachment] MAX_SIZE ≥ 256 MB`,
前置 nginx(若有)`client_max_body_size 256m;`。做法见
`opendance-web/deploy/proxy/README.md`。
- B. 控制包体 ≤ 28 MB 与 C. 改分发方式(Git LFS / 走 Web 服务端 `/static`)作为备选保留。
## 本次改动
`build/package-release.sh` 重写,落实文档 §5.7 的四条硬性要求:
1. **单个完整包**:产物只有 `opendance-windows-vX.Y.Z.zip` + `SHA256SUMS`;
脚本开头 `rm -f "$NAME.zip".part*` 清理历史分卷,
并且**超限时直接报警而绝不回退分卷**。
2. **`SHA256SUMS` 用裸文件名**,用户下载到同一目录后 `sha256sum -c SHA256SUMS` 直接可用。
3. **体积与完整性自检**:
- 源产物:`exe` 校验 PE 头 `MZ`、`pck` 校验魔数 `GDPC`;
- 解压后:必须同时存在 `OpenDance.exe` + `OpenDance.pck`(同目录)、
`README.txt`、`THIRD_PARTY.md`、`contracts/`,并再次校验 `MZ` / `GDPC`;
- `exe` 与 `pck` 主文件名必须一致(否则 Godot 找不到资源);
- 上传前打印包体大小与 IIS 上限的对比结论。
4. **记录实测上限**:脚本内置 `UPLOAD_LIMIT_BYTES=30000000` 并在发布说明中写明,
避免下次再踩。
## 验收(文档 §5.7)
| 验收项 | 结果 |
|--|--|
| Release 资产只有一个 `opendance-windows-vX.Y.Z.zip` + `SHA256SUMS` | ✅ 见 `dist-release/` |
| 下载后可直接解压运行(`OpenDance.exe` + `.pck` 同目录),无需拼接 | ✅ 脚本解压自检覆盖 |
| `sha256sum -c SHA256SUMS` 通过 | ✅ 脚本打包后立即在同一目录自校验 |
## 实测记录(v0.2.0 发布时)
按文档 §5.7 硬性要求 4「若用 A 方案,先在发布文档里记录实测上限」记录。
| 上传体积 | 结果 | 说明 |
|--|--|--|
| 14 MB | 通过(HTTP 201) | 分卷时代的对照 |
| 30.5 MB / 40 MB | **HTTP 413** | IIS 默认 `maxAllowedContentLength` 未放开 |
| **38,245,661 B(本整包)** | 请求体被**完整接收**(115 s),随后 **Gitea 返回 HTTP 500** | IIS 上限已放开,瓶颈转移到 Gitea 侧 |
IIS 放开之后的隔离测试(同一 Release 资产上传接口):
| 上传体积 | 结果 |
|--|--|
| 914 KB / 927 KB(web tar.gz) | 通过 |
| 16,372,427 B(android zip) | 通过 |
| 37 MB(本整包) | HTTP 500 |
| 24 / 21 / 18 / 16.5 / 16.4 MB | HTTP 500 |
| **100 KB / 1 KB** | **HTTP 500,0.14~0.3 秒** |
结论(与最初"体积上限"的猜测不同):
1. **与体积无关**:1 KB 也失败,而且是**瞬间**失败(不是读完请求体才判断),
所以不是 `MAX_SIZE` 这类体积限制;
2. **与仓库无关**:三个仓库的 Release 资产上传接口同样失败;
3. **其他写入通道正常**:创建 Release、PATCH Release 说明(纯 JSON)都成功;
4. **间歇性**:全部失败期间仍有 927 KB 的附件成功上传过一次。
→ 最可能是 **Gitea 宿主机磁盘(或上传临时目录所在分区/tmpfs)几乎写满**:
Gitea 先把请求体写进数据目录的临时目录再落库,空间不足时返回 500 而不是 413。
运维需按 `opendance-web/deploy/proxy/README.md` 第九节:
①`df -h` 查数据盘 / `/tmp` / `data/tmp` ②看 Gitea 日志里这次 500 的真实错误
③清理临时文件与旧附件释放空间 ④把 `[attachment] MAX_SIZE` 设为 256 并重启。
> 说明:本仓库 v0.1.0 的 `.part0/1/2` 分卷已被确认是交付缺陷(用户无法直接解压),
> 本仓库的打包脚本**不会**再生成分卷;整包与 `SHA256SUMS` 已就绪,
> 等上述空间问题解除后立即上传。
## 上传前检查清单
```
1) bash build/export-windows.sh release # 生成 exe + pck
2) bash build/package-release.sh 0.2.0 # 单包 + SHA256SUMS + 自检
3) 看输出的「包体 / 上限」对比:
- 低于 30,000,000 字节 -> 直接上传;
- 超过 -> 先请运维放宽 IIS/ARR/Gitea 上限,不要拆卷。
4) Gitea Release 只上传 opendance-windows-vX.Y.Z.zip 与 SHA256SUMS 两个资产。
```