docs: README 补全 Docker 部署章节(拓扑图 / 镜像要点 / 持久化 / 反代)

上条 commit (846b1a7) 把 deploy/ 目录实际文件都铺好了,但 README 的
"🐳 部署"还停留在"待完成"占位,新成员(以及未来的自己)看到 README
会以为 Docker 还没做。这条 commit 把 README 与实际状态对齐。

新增 / 改动 README.md:
- 仓库结构树:deploy/ 从"(待) docker-compose + nginx"改成
  "Docker 部署文件",列出 4 个子文件
- 替换 "🐳 部署(待完成)" 占位为完整章节:
  * 快速部署:一条 docker compose up -d
  * 部署拓扑:ASCII 图展示 web 容器 (nginx) 反代 /api 到 api 容器
    (GORM + SQLite),数据卷持久化
  * 镜像要点:表格列出 api / web 两个镜像的 base image + 关键配置
    (CGO=0 / tini / 非 root / corepack pnpm / gzip + 30 天 immutable cache)
  * 数据持久化:DB_PATH 路径 / volume 名 / 备份命令(docker run --rm 模板)
  * 反代建议:不要直接 8080 暴露公网,前面挡 NPM / Traefik,符合
    plan §17 "容器内 API 默认只监听内网"
  * 健康检查:API + web 都用 wget,compose 用 condition: service_healthy
  * 开发模式:不想装 Go 也能跑,流程:pnpm build -> docker compose up
  * 链回 deploy/README.md
- 路线图:Phase 5 标 done,Phase 6/7/8 标 pending(对应 Import/Export /
  Auth / 扩展)

未做(留待后续):
- README 截图(Docker 跑起来后再补)
- Traefik / NPM 自动 HTTPS 的具体配置(留给 plan §17 后续)
- 数据备份 cron / 灾备演练

风格保持与之前一致:中文为主,技术名词留英文,emoji 章节标题。
This commit is contained in:
2026-09-13 17:20:50 +08:00
parent 846b1a7b06
commit a2fc215ef9
+78 -9
View File
@@ -136,7 +136,11 @@ FuelLog/
│ ├── public/ # favicon / manifest / PWA icons │ ├── public/ # favicon / manifest / PWA icons
│ └── package.json │ └── package.json
│ │
├── deploy/ # (待) docker-compose + nginx ├── deploy/ # Docker 部署文件
│ ├── docker-compose.yml # 生产:api + web(nginx),宿主机 :8080
│ ├── docker-compose.dev.yml # 开发:api 容器 + bind mount 本地 dist
│ ├── nginx/web.conf # web 容器用 nginx 配置(/api 反代 + SPA fallback)
│ └── README.md # 部署说明
├── docs/ ├── docs/
│ └── api.md # 完整 API 文档 │ └── api.md # 完整 API 文档
├── data/ # SQLite 文件(默认 .gitignore,挂载 volume) ├── data/ # SQLite 文件(默认 .gitignore,挂载 volume)
@@ -168,15 +172,80 @@ FuelLog/
--- ---
## 🐳 部署(待完成) ## 🐳 部署
生产一条命令起 api + web,数据持久化到 named volume,前置 Nginx Proxy Manager
或 Traefik 接 SSL 即可对外。
### 快速部署
```bash ```bash
cd deploy # 在仓库根跑(任选一种)
docker compose up -d docker compose -f deploy/docker-compose.yml up -d
# 浏览器访问 http://your-host # 浏览器访问 http://your-host:8080
``` ```
详见 `deploy/` 目录(待补充)。 ### 部署拓扑
```
┌─────────────────┐ ┌─────────────────┐
│ Nginx Proxy Mgr │────▶│ fuellog-web:80 │
│ (TLS / 反代) │ │ (nginx:alpine) │
└─────────────────┘ │ ├ 静态 SPA │
│ └ /api/* → api │
└────────┬────────┘
│ fuellog-net
┌────────▼────────┐
│ fuellog-api:8080│
│ (golang alpine)│
│ ├ GORM + SQLite │
│ └ /data 卷 │
└─────────────────┘
```
### 镜像要点
| 镜像 | 基础 | 关键配置 |
|---|---|---|
| `fuellog/api` | 多阶段 `golang:1.22-alpine` → `alpine:3.20` | CGO=0 出纯静态二进制 / tini 收僵尸 / 非 root / 时区 Asia/Shanghai / HEALTHCHECK |
| `fuellog/web` | 多阶段 `node:20-alpine` → `nginx:1.27-alpine` | corepack 启 pnpm / `pnpm build` → nginx 静态 / gzip + 30 天 immutable cache |
### 数据持久化
- 容器内 `DB_PATH=/data/fuellog.db`
- 宿主机 docker volume 名:`fuellog-data`
- 容器删了重建,数据还在;真正要备份:`docker run --rm -v fuellog-data:/data -v $(pwd):/backup alpine cp /data/fuellog.db /backup/`
### 反代建议(不要直接把 8080 暴露公网)
```
Internet ──TLS──▶ Nginx Proxy Manager ──127.0.0.1:8080──▶ fuellog-web (容器)
```
容器只 listen 8080,不直接对外,符合 plan §17 "容器内 API 默认只监听内网"。
### 健康检查
- api:`wget http://127.0.0.1:8080/health`,30s 间隔,启动 10s 后开始
- web:`wget http://127.0.0.1/`,30s 间隔
- docker-compose 用 `depends_on: condition: service_healthy` 保证 web 等 api 健康后才起
### 开发模式(不想本地装 Go 时用)
```bash
# 1. 本地 build 前端
cd fuellog-web && pnpm install && pnpm build
# 2. 启容器(nginx bind mount 上面 build 出的 dist)
cd .. && docker compose -f deploy/docker-compose.dev.yml up
# 3. 改前端 -> pnpm build -> docker compose restart web
```
日常前端调试还是推荐直接 `pnpm dev`(Vite :5173 自带 /api 代理),上面这套
是为了"不想在 Windows 装 Go 也能跑后端"准备的。
详细配置在 [`deploy/README.md`](./deploy/README.md)。
--- ---
@@ -185,9 +254,9 @@ docker compose up -d
- [x] Phase 0~1:初始化 + 后端骨架 + 数据层 + API + 单测 + 冒烟 - [x] Phase 0~1:初始化 + 后端骨架 + 数据层 + API + 单测 + 冒烟
- [x] Phase 2~3:前端骨架 + 4 个业务页 - [x] Phase 2~3:前端骨架 + 4 个业务页
- [x] Phase 4:PWA(manifest / SW / 添加到主屏) - [x] Phase 4:PWA(manifest / SW / 添加到主屏)
- [ ] Phase 5:数据导入导出(JSON / CSV) - [x] Phase 5:Docker 部署 + 反代(API / web 多阶段镜像 + nginx + volume)
- [ ] Phase 6:多用户 / 鉴权(目前是个人单机) - [ ] Phase 6:数据导入导出(JSON / CSV)
- [ ] Phase 7:Docker 部署 + 反代 - [ ] Phase 7:多用户 / 鉴权(目前是个人单机)
- [ ] Phase 8:充电 / 保养 / 停车等扩展 - [ ] Phase 8:充电 / 保养 / 停车等扩展
--- ---