--- kind: build_system name: Docker Compose 多阶段构建与脚本化部署 category: build_system scope: - '**' source_files: - docker-compose.yml - backend/Dockerfile - frontend/Dockerfile - scripts/upload.sh - frontend/vite.config.js - frontend/nginx.conf - DEPLOY.md --- ## 构建系统概览 项目采用 pnpm + Vite + Docker Compose 的现代化 Node.js/Vue 3 单体仓库构建方案,通过多阶段 Docker 镜像实现前后端分离部署。 ### 核心构建工具链 - 包管理: pnpm@11.5.2(通过 packageManager 字段锁定版本) - 前端构建: Vite 6.x + Vue 3,支持手动分包(manualChunks)优化 - 后端运行: Node.js 22 Alpine,Express + Sequelize - 容器编排: Docker Compose,双服务架构(frontend: nginx, backend: node) ### 构建流程 前端构建 (frontend/): ```bash cd frontend && pnpm install && pnpm build # 产物输出至 frontend/dist/ ``` Vite 配置关键特性: - 开发服务器端口 3000,自动代理 /api 到 localhost:8083 - 生产环境启用 Gzip、静态资源长期缓存(1年 immutable) - 手动分包策略:vendor-vue、vendor-element-plus、vendor-lucide 后端构建 (backend/): ```bash cd backend && pnpm install --prod && node src/app.js ``` ### Docker 多阶段镜像 后端镜像 (backend/Dockerfile): - 基础镜像:node:22-alpine - 仅安装生产依赖(--frozen-lockfile --prod) - 暴露端口 8000,启动命令 node src/app.js 前端镜像 (frontend/Dockerfile): - 构建阶段:node:18-alpine + pnpm 全局安装 - 运行阶段:nginx:alpine,仅包含静态文件 - 通过 COPY --from=builder 复制构建产物 ### 服务编排 docker-compose.yml 定义两个服务: - backend: 端口映射 8083->8000,挂载 OTA 存储卷 /data/projects/source - frontend: 端口映射 8082->80,挂载 dist 和 nginx.conf - 自定义网络 audio-network 实现服务间通信 - 统一日志轮转配置(单文件 10MB,保留 5 个文件) Nginx 反向代理将 /api 请求转发至 http://backend:8000,支持 Vue Router history 模式和 8MB 文件上传。 ### 部署脚本 scripts/upload.sh 提供一键同步能力: - 预设目标:frontend、backend、compose、all - 基于 rsync + SSH 密钥认证 - 支持 dry-run 模式预览同步内容 - 默认上传路径:ubuntu@ec2:/data/project/dashboard/ ### 环境变量管理 - 开发环境:根目录 .env,通过 dotenv 加载 - 生产环境:Compose env_file 指定 .env,覆盖容器内 PORT=8000 - 敏感信息(JWT_SECRET、数据库密码等)不提交 Git ### 本地开发工作流 ```bash # 后端开发 cd backend && pnpm dev # nodemon 热重载,端口 8083 # 前端开发 cd frontend && pnpm dev # Vite 开发服务器,端口 3000 ``` ### 版本策略 - 前后端均使用 1.0.0 版本号(语义化版本占位) - 无自动化发布流水线,通过脚本手动触发部署 - 依赖锁定文件(pnpm-lock.yaml)确保构建可重现性 ### 注意事项 - 前端 Dockerfile 使用 Node 18,但 packageManager 指定 pnpm@11.5.2,需确保兼容性 - 后端 Dockerfile 使用 Node 22,与 packageManager 版本一致 - OTA 升级包通过宿主机卷持久化,避免容器重启丢失 - 生产环境建议通过 EC2 IAM 角色访问 S3,无需硬编码 AWS 凭证