# deploy 目录（与 api 相同：仅替换构建产物；`web` 容器除 `web/public` 外不挂源码目录）

- **deploy/web/dist**：前台构建产物，由 `pull-and-restart.sh` 生成；替换此目录内容即可更新前台。
- **deploy/admin/dist**：后台构建产物，同上。后台 Vite 通过 `@yh-web` 引用 `../web/src`（如积木 `BlockRenderer`），用 Docker 单目录挂载 `admin` 时会构建失败，须挂载**项目根**再在 `admin` 下执行 `npm run build`（见 `pull-and-restart.sh`）。
- **deploy/api/server**：API 二进制，同上；替换后重启 api 容器生效。
- **deploy/web/default.conf**、**deploy/admin/default.conf**：Nginx 配置，已纳入版本库。

日常更新：在服务器执行 `./pull-and-restart.sh` 会拉代码、重新构建到上述目录并重启容器。若只改静态资源，也可在服务器上手动构建后只重启对应容器。

## 后台白屏 / 控制台 “MIME type text/html” 针对 `index-*.js`

表示浏览器拿到的不是 JS，而是 HTML（常见：`/assets/*.js` 被 SPA 回退成 `index.html`，或 404 返回了 HTML 错误页）。

1. **确认 Nginx 配置已更新**：`deploy/admin/default.conf` 须含 `location ^~ /assets/` 且 `try_files $uri =404`（与仓库内 `admin/nginx.conf` 一致），挂载后重启 `admin` 容器。
2. **确认 dist 完整**：`deploy/admin/dist/assets/` 下须有与 `index.html` 中 `<script type="module">` 引用**同名**的哈希文件；发版后应**整目录**替换 `dist`（勿只拷 `index.html`）。
3. **本地重建**：在项目根按 `pull-and-restart.sh` 方式在 `admin/` 执行 `npm run build`，`vite.config` 中 `base` 须为 `'/admin/'`。
4. **勿用旧版 `nginx/admin.conf`**：若曾把仅含 `location /` 的旧配置拷到服务器，会导致 `/assets/*.js` 全部变成 `index.html`（约 640B、MIME 错）。请以 **`deploy/admin/default.conf`** 或 **`admin/nginx.conf`** 为准，并 **`docker compose restart admin nginx`**。
5. **外层 `/admin/` 反代**：`yuheng.docker.conf.tpl` 使用 **`upstream yh_admin_upstream { server admin:80; }`** + **`location /admin/ { proxy_pass http://yh_admin_upstream/; }`**（尾斜杠），由 Nginx **标准规则**去掉 `/admin` 前缀；勿对 admin 使用 **变量** `proxy_pass`（会把完整 `/admin/...` 传到上游 → 内层无法匹配 `/assets/` → 白屏）。另含 **`location = /admin { return 301 /admin/; }`**，避免无尾斜杠误走前台。
6. **`restart.sh` 构建 admin** 已与 **`pull-and-restart.sh` 一致**（挂载**项目根**到容器，否则 `@yh-web` 无法解析）。发版后脚本会执行 **`scripts/verify-admin-dist.sh`**：若 `index.html` 引用的 chunk 在 `dist/assets/` 中缺失或过小（几百字节），会直接报错退出，避免白屏上线。
