docs(deploy): 部署方案——开发机构建 + 服务器轻构建(Caddy)

按熟悉的工作流调整:构建在开发机完成(四绿验证后的 dist 才是部署物),SFTP 上传 dist/Caddyfile/compose.yaml/Dockerfile 四件到服务器,服务器上 docker build 仅做 COPY(无构建工具链需求,秒级)。单阶段 Dockerfile;.dockerignore 不再排除 dist(部署必需品)且继续排除 .env*;README 部署章节重写为三步流程(本机构建/SFTP/服务器 compose)。compose 文件采用 Compose 规范标准名 compose.yaml(docker-compose.yml 仅为向后兼容保留)。
This commit is contained in:
2026-09-08 21:00:19 +08:00
parent d1ddead178
commit 19b69e2d5a
5 changed files with 89 additions and 1 deletions
+11
View File
@@ -0,0 +1,11 @@
# 服务器轻构建的上下文:只需 dist + Caddyfile(新部署模式,产物在开发机构建)
# 注意:dist 是部署必需品,不再排除
node_modules
.git
.eslintcache
*.tsbuildinfo
# 环境变量文件绝不能进镜像层(真实网关地址在 .env.local 里)
.env
.env.local
.env.*.local
+24
View File
@@ -0,0 +1,24 @@
# bench 的 Caddy 配置:静态托管 + 网关反向代理
#
# :80 表示监听 80 端口、禁用自动 HTTPS(容器场景由外层决定 TLS;
# 若将来直接暴露公网域名,把 :80 换成域名,Caddy 会自动签发证书)
#
# GATEWAY 由 docker run -e / compose environment 注入(Caddyfile 支持 {$GATEWAY} 环境变量占位)
# 未注入时 Caddy 启动会因空地址报错——与 vite dev 行为一致:不写死默认值
:80 {
# 静态站点:根目录 + SPA fallback(不存在的路径回退 index.html)
root * /usr/share/caddy
encode gzip
# 接口代理:与 vite.config.ts 的 dev 代理语义一致,转发到网关
@api path /api/* /v1/*
handle @api {
reverse_proxy {$GATEWAY}
}
handle {
try_files {path} /index.html
file_server
}
}
+6
View File
@@ -0,0 +1,6 @@
# bench 运行镜像:仅把本机构建好的 dist 打进 Caddy(构建在开发机完成,见 README 部署章节)
# 服务器上 docker build 只做 COPY,秒级完成,不需要任何构建工具链
FROM caddy:2-alpine
COPY Caddyfile /etc/caddy/Caddyfile
COPY dist /usr/share/caddy
+27 -1
View File
@@ -50,10 +50,36 @@ bun run build # type-check + vite build(dist/)
## 已知边界
- 生产部署(`bun run build`)无 Vite 代理,需为网关路径配置反向代理
- `useClipboard` 在非 https 环境(如 http://localhost)自动降级 `execCommand`
- `/v1/models/:model` 单模型详情接口未纳入(数据源是硬编码静态表,与 `/v1/models` 不一致,无调试价值)
## 部署(开发机构建 + 服务器轻构建运行)
构建在开发机完成(四绿验证后的 dist 才是部署物),服务器只做镜像 COPY + 起容器,
不需要任何构建工具链。
```bash
# —— 开发机 ——
bun run build # 得到 dist/(此时已过 test/type-check/lint)
# SFTP 上传四个部署物到服务器同一目录:
# dist/ Caddyfile compose.yaml Dockerfile
# (.env 不上传,GATEWAY 在服务器上以 .env 或环境变量提供)
# —— 服务器(目录内需有 .env,内容为 GATEWAY=https://…)——
docker compose up -d --build # 首次:拉 caddy 镜像 + COPY 产物起容器,秒级
# 浏览器打开 http://<服务器IP>:8080
# —— 常规更新(开发机)——
bun run build # 重新构建
# SFTP 覆盖 dist/
docker compose up -d --build # 服务器上重新 COPY + 替换容器
```
- Caddy 承担与 dev 代理相同的职责:静态文件 + `/api`、`/v1` 转发到 `$GATEWAY` + SPA fallback
- 换网关:改服务器上的 `.env` 后 `docker compose up -d --force-recreate`(无需重新 build)
- 暴露公网时把 `Caddyfile` 的 `:80` 改为域名,Caddy 自动签发 HTTPS 证书
- `compose.yaml`(Compose 规范标准文件名)里 `GATEWAY` 为必填(未设置时启动即报错,不会带错误配置运行)
## 文档
- 交互与技术决策:`docs/bench交互设计文档.md`
+21
View File
@@ -0,0 +1,21 @@
# bench 部署编排:服务器上 docker compose up -d 即起
# 前置:开发机已 bun run build 得到 dist/,并把 dist/ Caddyfile/ compose.yaml/ Dockerfile/
# 四项经 SFTP 上传到服务器同一目录(见 README 部署章节)
#
# 常规更新流程(开发机):
# 1. bun run build
# 2. SFTP 覆盖上传 dist/ 目录
# 3. 服务器上 docker compose up -d --build # 重新 COPY 产物进镜像并滚动替换容器
services:
bench:
build:
context: .
image: new-api-key-bench
container_name: bench
ports:
- "8080:80"
environment:
# 必填:NewAPI 网关地址(Caddyfile 的 {$GATEWAY} 占位由此注入)
GATEWAY: ${GATEWAY:?请在 .env 或环境中设置 GATEWAY,例如 GATEWAY=https://your-gateway.example.com}
restart: unless-stopped