Files
2026-07-09 11:16:59 +08:00

52 lines
3.3 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.
---
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` 容器即可,无需重建镜像。