52 lines
3.3 KiB
Markdown
52 lines
3.3 KiB
Markdown
---
|
||
kind: build_system
|
||
name: Docker Compose 编排与 rsync 增量部署
|
||
category: build_system
|
||
scope:
|
||
- '**'
|
||
source_files:
|
||
- docker-compose.yml
|
||
- backend/Dockerfile
|
||
- frontend/Dockerfile
|
||
- frontend/nginx.conf
|
||
- scripts/upload.sh
|
||
- DEPLOY.md
|
||
- backend/package.json
|
||
- frontend/package.json
|
||
---
|
||
|
||
## 1. 构建系统与工具链
|
||
项目采用 **Docker Compose** 作为核心编排工具,结合 **pnpm** 进行依赖管理。整体架构分为前端(Vue 3 + Vite)和后端(Node.js + Express)两个独立服务。
|
||
|
||
- **包管理器**:前后端均使用 `pnpm`,并在 `package.json` 中通过 `packageManager` 字段锁定版本(`pnpm@11.5.2`),确保环境一致性。
|
||
- **前端构建**:使用 `Vite` 进行编译打包,产物输出至 `frontend/dist`。
|
||
- **后端运行**:基于 `node:22-alpine` 镜像,直接运行 `src/app.js`。
|
||
|
||
## 2. 容器化策略
|
||
### 后端 (backend/Dockerfile)
|
||
- **基础镜像**:`node:22-alpine`。
|
||
- **构建逻辑**:采用单层结构,先安装生产依赖(`pnpm install --prod`),再拷贝源码。
|
||
- **端口**:容器内固定监听 `8000` 端口。
|
||
|
||
### 前端 (frontend/Dockerfile & docker-compose.yml)
|
||
- **混合模式**:虽然提供了多阶段构建的 `Dockerfile`(Builder -> Nginx),但在生产环境的 `docker-compose.yml` 中,前端服务直接使用官方 `nginx:alpine` 镜像。
|
||
- **挂载部署**:通过 Volume 将宿主机的 `frontend/dist` 和 `nginx.conf` 挂载到容器中。这种方式避免了每次前端更新都重新构建 Docker 镜像,提升了部署效率。
|
||
- **反向代理**:Nginx 配置了 `/api` 路径的反向代理,将请求转发至 `http://backend:8000`,解决了跨域问题并统一了入口。
|
||
|
||
## 3. 部署流程与自动化
|
||
项目实现了一套基于 **rsync** 的半自动化部署方案,核心脚本为 `scripts/upload.sh`。
|
||
|
||
### 部署步骤
|
||
1. **本地构建**:在本地执行 `pnpm build` 生成前端静态资源。
|
||
2. **代码同步**:运行 `./scripts/upload.sh all`,通过 SSH/rsync 将前端产物、后端源码及 `docker-compose.yml` 同步至远程服务器(默认路径 `/data/project/dashboard`)。
|
||
3. **远程启动**:在服务器上执行 `docker compose build --no-cache backend` 和 `docker compose up -d` 完成服务重启。
|
||
|
||
### 关键约定
|
||
- **环境变量**:所有配置统一由根目录的 `.env` 文件管理,并通过 `env_file` 注入后端容器。`.env` 文件不随脚本上传,需在服务器手动维护。
|
||
- **日志管理**:Compose 文件中定义了 `json-file` 驱动,限制日志最大大小为 10MB,保留 5 个文件,防止磁盘爆满。
|
||
- **OTA 存储**:通过 Volume 将宿主机的 `/data/projects/source` 映射到后端容器,用于存储大型 OTA 升级包。
|
||
|
||
## 4. 开发者规范
|
||
- **端口映射**:本地开发时后端默认使用 `8083`,而容器内固定为 `8000`。开发者需注意 `PORT` 环境变量在不同环境下的覆盖逻辑。
|
||
- **依赖更新**:若修改了 `package.json`,必须同步更新 `pnpm-lock.yaml` 并重新上传后端相关文件,否则 Docker 构建可能失败或使用旧依赖。
|
||
- **前端更新**:仅更新前端时,只需重新构建并同步 `dist` 目录,然后重启 `frontend` 容器即可,无需重建镜像。 |