Files
zijunchiang 76244d2d0d docs(tasks): 更正「Gitea 附件通道坏了/磁盘写满」的误判,并记录正确的上传写法
排查 Windows 整包上传时的 HTTP 500 曾被判成"Gitea 宿主机磁盘写满",**这个结论是错的**:
Gitea 的 Release 附件接口 multipart 字段名是 **`attachment`**,用 `file=` 会得到

  HTTP 500 {"message":"","url":"https://gitea.kasugano.cn/api/swagger"}

空消息,极易误判成服务器故障。同一 1 KB 文件、同一 Release 的实测对照:
  -F "attachment=@probe.bin"                → 201
  --data-binary @probe.bin(带 ?name=)      → 201
  -F "file=@probe.bin"                      → 500(空消息)

**真实且仍然存在的唯一限制**:IIS `maxAllowedContentLength`(默认 30,000,000 字节)——
927 KB / 14 MB / 16,372,427 B 通过;30.5 MB / 38,245,602 B / 40 MB 一律 **HTTP 413**
(本轮用正确字段名复测整包:413,仅发出 917 KB 即被拒)。

tasks/014-full-package.md 的「实测记录」改写为两段:真实限制 + 误判更正,
并附两种可直接照抄的上传命令(multipart `attachment` / 裸 body + `?name=`)。
2026-09-17 03:40:27 +08:00

115 lines
4.9 KiB
Markdown
Raw Permalink 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 发布时)
**真实且仍然存在的限制:IIS 的 `maxAllowedContentLength`(默认 30,000,000 字节 ≈ 28.6 MiB)**
| 上传体积 | 结果 |
|--|--|
| 927 KB / 14 MB / 16,372,427 B | 通过(HTTP 201) |
| 30.5 MB | **HTTP 413**(IIS「请求实体过大」页面) |
| **38,245,602 B(本整包)** | **HTTP 413** |
| 40 MB | **HTTP 413** |
→ 这就是 Windows 整包(约 37 MB)无法上传的**唯一真实原因**;放开办法见
`opendance-web/deploy/proxy/README.md` 9.2(IIS `requestLimits` + `uploadReadAheadSize`、
ARR `maxRequestBytes`、Gitea `app.ini` 的 `[attachment] MAX_SIZE`、前置 nginx)。
**【更正】排查中曾把 500 误判为"Gitea 宿主机磁盘写满"** —— 那个结论是错的,原因是
**上传写法错误**:Gitea 的 Release 附件接口 multipart 字段名是 **`attachment`**,
用 `file=` 会得到 `HTTP 500 {"message":"","url":"…/api/swagger"}`(**空消息**,
极易误判为服务器故障)。实测对照(同一 1 KB 文件、同一 Release):
| 写法 | 结果 |
|--|--|
| `-F "attachment=@probe.bin"` | **201** |
| `--data-binary @probe.bin`(`Content-Type: application/octet-stream`,URL 带 `?name=`) | **201** |
| `-F "file=@probe.bin"` | **500**(空消息) |
**正确的上传写法**(本仓库发布时照抄):
```bash
# 整包(multipart,字段名 attachment)
curl -f -X POST -H "Authorization: token <token>" \
-F "attachment=@opendance-windows-vX.Y.Z.zip" \
"https://gitea.kasugano.cn/api/v1/repos/zijunchiang/opendance-windows/releases/<id>/assets?name=opendance-windows-vX.Y.Z.zip"
# SHA256SUMS(裸 body + ?name=)
curl -f -X POST -H "Authorization: token <token>" \
-H "Content-Type: application/octet-stream" --data-binary @SHA256SUMS \
"https://gitea.kasugano.cn/api/v1/repos/zijunchiang/opendance-windows/releases/<id>/assets?name=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 两个资产。
```