From cf49bcf013d465d0227d0ab4e0ba675d1a82dabf Mon Sep 17 00:00:00 2001 From: "mula.liu" Date: Wed, 5 Nov 2025 15:18:52 +0800 Subject: [PATCH] v 0.1.1 --- .dockerignore | 46 +++++ DEPLOYMENT.md | 470 ++++++++++++++++++++++++++++++++++++++++++++ Dockerfile | 38 ++++ docker-compose.yml | 27 +++ ecosystem.config.js | 25 +++ 5 files changed, 606 insertions(+) create mode 100644 .dockerignore create mode 100644 DEPLOYMENT.md create mode 100644 Dockerfile create mode 100644 docker-compose.yml create mode 100644 ecosystem.config.js diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000..a43f429 --- /dev/null +++ b/.dockerignore @@ -0,0 +1,46 @@ +# 依赖目录 +node_modules +npm-debug.log* +yarn-debug.log* +yarn-error.log* +package-lock.json + +# 开发文件 +.git +.gitignore +.eslintrc.cjs +.DS_Store + +# 构建产物(在多阶段构建中已处理) +dist + +# 文档 +README.md +docs + +# IDE 配置 +.vscode +.idea +*.swp +*.swo +.claude + +# 测试文件 +coverage +.nyc_output + +# 环境变量 +.env +.env.local +.env.development +.env.test +.env.production + +# 临时文件 +*.log +logs +*.tmp +*.temp + +# PM2 +.pm2 diff --git a/DEPLOYMENT.md b/DEPLOYMENT.md new file mode 100644 index 0000000..42c42d2 --- /dev/null +++ b/DEPLOYMENT.md @@ -0,0 +1,470 @@ +# Nex Design 部署文档 + +## 概述 + +本文档介绍如何使用 Docker + PM2 在服务器上部署 Nex Design 项目。 + +## 技术栈 + +- Docker: 容器化部署 +- PM2: Node.js 进程管理 +- Nginx serve: 静态文件服务器 +- Node.js 18: 运行环境 + +## 文件说明 + +### 1. ecosystem.config.js + +PM2 进程管理配置文件,定义了应用的运行参数: + +- **name**: 应用名称 `nex-design` +- **script**: 使用 `npx serve` 提供静态文件服务 +- **args**: 指定服务 `dist` 目录,端口 3000 +- **instances**: 单实例运行 +- **max_memory_restart**: 内存超过 500MB 自动重启 +- **日志配置**: 输出到 `logs` 目录 + +### 2. Dockerfile + +多阶段构建的 Docker 镜像配置: + +**构建阶段 (builder)**: +- 基于 `node:18-alpine` +- 安装依赖并构建项目 + +**生产阶段**: +- 轻量级 Alpine 镜像 +- 全局安装 PM2 和 serve +- 复制构建产物和配置 +- 暴露 3000 端口 +- 使用 `pm2-runtime` 启动 + +### 3. docker-compose.yml + +Docker Compose 编排配置: + +- 服务名称: `nex-design` +- 端口映射: `3000:3000` +- 自动重启策略 +- 日志卷挂载 +- 健康检查配置 + +### 4. .dockerignore + +定义 Docker 构建时忽略的文件,减小镜像体积。 + +## 部署步骤 + +### 前置要求 + +确保服务器已安装: +- Docker (>= 20.10) +- Docker Compose (>= 2.0) + +```bash +# 检查 Docker 版本 +docker --version +docker-compose --version +``` + +### 1. 上传代码到服务器 + +```bash +# 方式一:使用 git +git clone +cd nex-design + +# 方式二:使用 scp +scp -r ./nex-design user@server:/path/to/deploy/ +``` + +### 2. 构建 Docker 镜像 + +```bash +# 构建镜像 +docker-compose build + +# 或使用 Docker 直接构建 +docker build -t nex-design:latest . +``` + +### 3. 启动服务 + +```bash +# 启动服务(后台运行) +docker-compose up -d + +# 查看日志 +docker-compose logs -f + +# 查看服务状态 +docker-compose ps +``` + +### 4. 验证部署 + +```bash +# 检查容器状态 +docker ps + +# 检查健康状态 +docker inspect --format='{{.State.Health.Status}}' nex-design-app + +# 访问应用 +curl http://localhost:3000 +``` + +浏览器访问: `http://your-server-ip:3000` + +## 常用命令 + +### Docker Compose 命令 + +```bash +# 启动服务 +docker-compose up -d + +# 停止服务 +docker-compose stop + +# 重启服务 +docker-compose restart + +# 停止并删除容器 +docker-compose down + +# 查看日志 +docker-compose logs -f nex-design + +# 重新构建并启动 +docker-compose up -d --build +``` + +### Docker 命令 + +```bash +# 查看运行中的容器 +docker ps + +# 查看所有容器 +docker ps -a + +# 进入容器 +docker exec -it nex-design-app sh + +# 查看容器日志 +docker logs -f nex-design-app + +# 删除容器 +docker rm -f nex-design-app + +# 删除镜像 +docker rmi nex-design:latest +``` + +### PM2 命令(容器内) + +```bash +# 进入容器 +docker exec -it nex-design-app sh + +# 查看 PM2 进程列表 +pm2 list + +# 查看日志 +pm2 logs + +# 查看监控信息 +pm2 monit + +# 重启应用 +pm2 restart nex-design + +# 查看详细信息 +pm2 show nex-design +``` + +## 生产环境优化 + +### 1. 使用 Nginx 反向代理 + +创建 `nginx.conf`: + +```nginx +upstream nex_design { + server localhost:3000; +} + +server { + listen 80; + server_name your-domain.com; + + location / { + proxy_pass http://nex_design; + proxy_http_version 1.1; + proxy_set_header Upgrade $http_upgrade; + proxy_set_header Connection 'upgrade'; + proxy_set_header Host $host; + proxy_cache_bypass $http_upgrade; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + } + + # 静态资源缓存 + location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg|woff|woff2|ttf|eot)$ { + proxy_pass http://nex_design; + expires 1y; + add_header Cache-Control "public, immutable"; + } +} +``` + +### 2. 添加 SSL 证书 + +```bash +# 使用 Let's Encrypt +sudo certbot --nginx -d your-domain.com +``` + +### 3. 修改 docker-compose.yml 添加 Nginx + +```yaml +version: '3.8' + +services: + nex-design: + build: + context: . + dockerfile: Dockerfile + container_name: nex-design-app + restart: unless-stopped + expose: + - "3000" + environment: + - NODE_ENV=production + volumes: + - ./logs:/app/logs + networks: + - nex-network + + nginx: + image: nginx:alpine + container_name: nex-design-nginx + restart: unless-stopped + ports: + - "80:80" + - "443:443" + volumes: + - ./nginx.conf:/etc/nginx/conf.d/default.conf + - ./ssl:/etc/nginx/ssl + depends_on: + - nex-design + networks: + - nex-network + +networks: + nex-network: + driver: bridge +``` + +### 4. 环境变量配置 + +创建 `.env` 文件: + +```env +NODE_ENV=production +PORT=3000 +``` + +修改 `docker-compose.yml`: + +```yaml +services: + nex-design: + env_file: + - .env +``` + +## 日志管理 + +### 查看日志 + +```bash +# Docker 日志 +docker-compose logs -f --tail=100 nex-design + +# PM2 日志(在容器内) +docker exec nex-design-app pm2 logs --lines 100 + +# 宿主机日志文件 +tail -f ./logs/pm2-out.log +tail -f ./logs/pm2-error.log +``` + +### 日志轮转 + +安装 `pm2-logrotate`: + +```bash +docker exec nex-design-app pm2 install pm2-logrotate +docker exec nex-design-app pm2 set pm2-logrotate:max_size 10M +docker exec nex-design-app pm2 set pm2-logrotate:retain 7 +``` + +## 监控和维护 + +### 1. 资源监控 + +```bash +# 查看容器资源使用 +docker stats nex-design-app + +# 查看 PM2 监控 +docker exec nex-design-app pm2 monit +``` + +### 2. 健康检查 + +```bash +# 检查健康状态 +docker inspect --format='{{json .State.Health}}' nex-design-app | jq +``` + +### 3. 自动更新部署 + +创建 `deploy.sh`: + +```bash +#!/bin/bash + +echo "开始部署 Nex Design..." + +# 拉取最新代码 +git pull origin main + +# 重新构建镜像 +docker-compose build + +# 重启服务 +docker-compose up -d + +# 清理旧镜像 +docker image prune -f + +echo "部署完成!" +echo "查看日志: docker-compose logs -f" +``` + +赋予执行权限: + +```bash +chmod +x deploy.sh +``` + +## 故障排查 + +### 容器无法启动 + +```bash +# 查看详细错误 +docker-compose logs nex-design + +# 检查镜像是否构建成功 +docker images | grep nex-design + +# 检查端口占用 +netstat -tlnp | grep 3000 +``` + +### PM2 进程异常 + +```bash +# 进入容器 +docker exec -it nex-design-app sh + +# 查看 PM2 状态 +pm2 status + +# 重启进程 +pm2 restart nex-design + +# 查看错误日志 +pm2 logs --err +``` + +### 内存占用过高 + +```bash +# 查看内存使用 +docker stats nex-design-app + +# 调整 PM2 内存限制 +# 修改 ecosystem.config.js 中的 max_memory_restart +``` + +## 备份与恢复 + +### 备份 + +```bash +# 备份日志 +tar -czf logs-backup-$(date +%Y%m%d).tar.gz logs/ + +# 备份配置 +tar -czf config-backup-$(date +%Y%m%d).tar.gz \ + ecosystem.config.js \ + Dockerfile \ + docker-compose.yml \ + .dockerignore +``` + +### 恢复 + +```bash +# 恢复配置 +tar -xzf config-backup-20250101.tar.gz + +# 重新部署 +docker-compose up -d --build +``` + +## 安全建议 + +1. **最小权限原则**: 使用非 root 用户运行容器 +2. **定期更新**: 及时更新基础镜像和依赖包 +3. **网络隔离**: 使用 Docker 网络隔离服务 +4. **日志审计**: 定期检查日志文件 +5. **资源限制**: 在 docker-compose.yml 中添加资源限制 + +```yaml +services: + nex-design: + deploy: + resources: + limits: + cpus: '1' + memory: 512M + reservations: + memory: 256M +``` + +## 性能优化 + +1. **启用 Gzip 压缩**: 在 Nginx 中配置 +2. **静态资源缓存**: 设置合理的缓存策略 +3. **CDN 加速**: 将静态资源托管到 CDN +4. **镜像优化**: 使用 Alpine 基础镜像,减小体积 +5. **构建缓存**: 利用 Docker 层缓存加速构建 + +## 技术支持 + +如遇问题,请检查: + +1. Docker 和 Docker Compose 版本 +2. 服务器资源(CPU、内存、磁盘) +3. 防火墙和端口配置 +4. 日志文件中的错误信息 + +## 更新日志 + +- **v1.0.0** (2025-11-05): 初始版本,支持 Docker + PM2 部署 diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..1904afd --- /dev/null +++ b/Dockerfile @@ -0,0 +1,38 @@ +# 构建阶段 +FROM node:18-alpine AS builder + +WORKDIR /app + +# 复制 package 文件 +COPY package*.json ./ +COPY yarn.lock ./ + +# 安装依赖 +RUN yarn install --frozen-lockfile + +# 复制源代码 +COPY . . + +# 构建项目 +RUN yarn build + +# 生产阶段 +FROM node:18-alpine + +WORKDIR /app + +# 安装 PM2 和 serve +RUN npm install -g pm2 serve + +# 从构建阶段复制构建产物 +COPY --from=builder /app/dist ./dist +COPY --from=builder /app/ecosystem.config.js ./ecosystem.config.js + +# 创建日志目录 +RUN mkdir -p logs + +# 暴露端口 +EXPOSE 3000 + +# 使用 PM2 启动应用 +CMD ["pm2-runtime", "start", "ecosystem.config.js"] diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000..303aaee --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,27 @@ +version: '3.8' + +services: + nex-design: + build: + context: . + dockerfile: Dockerfile + container_name: nex-design-app + restart: unless-stopped + ports: + - "3000:3000" + environment: + - NODE_ENV=production + volumes: + - ./logs:/app/logs + networks: + - nex-network + healthcheck: + test: ["CMD", "wget", "--quiet", "--tries=1", "--spider", "http://localhost:3000"] + interval: 30s + timeout: 10s + retries: 3 + start_period: 40s + +networks: + nex-network: + driver: bridge diff --git a/ecosystem.config.js b/ecosystem.config.js new file mode 100644 index 0000000..6859cab --- /dev/null +++ b/ecosystem.config.js @@ -0,0 +1,25 @@ +module.exports = { + apps: [ + { + name: 'nex-design', + script: 'npx', + args: 'serve -s dist -l 3000', + instances: 1, + exec_mode: 'fork', + autorestart: true, + watch: false, + max_memory_restart: '500M', + env: { + NODE_ENV: 'production', + PORT: 3000 + }, + error_file: './logs/pm2-error.log', + out_file: './logs/pm2-out.log', + log_date_format: 'YYYY-MM-DD HH:mm:ss Z', + merge_logs: true, + min_uptime: '10s', + max_restarts: 10, + restart_delay: 4000 + } + ] +}