From ac2068755b762de85b13d22359caa2ba1d6f018d Mon Sep 17 00:00:00 2001 From: RUI <298977887@qq.com> Date: Fri, 6 Jun 2025 01:34:58 +0800 Subject: [PATCH] 0606.4 --- .dockerignore | 35 +++---- .github/workflows/nextjs.yml | 195 ++++++++++++----------------------- Dockerfile | 8 +- 3 files changed, 85 insertions(+), 153 deletions(-) diff --git a/.dockerignore b/.dockerignore index 3edb7dc..5818754 100644 --- a/.dockerignore +++ b/.dockerignore @@ -2,19 +2,25 @@ node_modules .next .pnpm-store - -# 开发文件 -.git -.github -.vscode -.cursor - -# 日志文件 npm-debug.log* yarn-debug.log* yarn-error.log* pnpm-debug.log* +# 版本控制 +.git +.gitignore + +# CI/CD(新的部署方式不需要这些) +.github + +# 开发工具 +.vscode +.cursor +.idea +*.swp +*.swo + # 环境变量文件 .env .env.* @@ -25,22 +31,15 @@ coverage .nyc_output test-results -# 临时文件 +# 临时文件和系统文件 .DS_Store *.tmp *.temp Thumbs.db -# IDE 配置 -.idea -*.swp -*.swo - -# 部署相关 -README.md +# 文档(保留README.md,可能包含重要信息) LICENSE -.gitignore -# Docker 相关 +# Docker 相关文件(避免递归复制) Dockerfile* docker-compose*.yml \ No newline at end of file diff --git a/.github/workflows/nextjs.yml b/.github/workflows/nextjs.yml index 6ed1241..62fa2b7 100644 --- a/.github/workflows/nextjs.yml +++ b/.github/workflows/nextjs.yml @@ -8,67 +8,28 @@ on: jobs: # 构建并部署作业 - build-and-deploy: + deploy: runs-on: ubuntu-latest steps: # 检出代码 - - name: 检出代码 + - name: 📦 检出代码 uses: actions/checkout@v4 - # 配置 Node.js - - name: 配置 Node.js - uses: actions/setup-node@v4 - with: - node-version: '22' - - # 安装 pnpm - - name: 安装 pnpm - uses: pnpm/action-setup@v4 - with: - version: 'latest' - - # 安装依赖(跳过缓存以加速) - - name: 安装依赖 - run: pnpm install --frozen-lockfile - - # 构建应用 - - name: 构建应用 - run: pnpm run build - - # 创建部署包 - - name: 创建部署包 - run: | - # 创建部署目录 - mkdir -p deploy-package - - # 复制必要文件 - cp -r .next deploy-package/ - cp -r public deploy-package/ - cp -r src deploy-package/ - cp package.json deploy-package/ - cp pnpm-lock.yaml deploy-package/ - cp next.config.ts deploy-package/ - cp Dockerfile deploy-package/ - cp .dockerignore deploy-package/ - - # 创建压缩包 - tar -czf deploy-package.tar.gz -C deploy-package . - - # 拷贝部署包到服务器 (仅在 main 分支推送时执行) - - name: 拷贝部署包到服务器 + # 🚚 将项目文件复制到目标服务器 (仅在 main 分支推送时执行) + - name: 🚚 将项目文件复制到目标服务器 if: github.ref == 'refs/heads/main' && github.event_name == 'push' uses: appleboy/scp-action@v0.1.4 with: host: ${{ secrets.SERVER_HOST }} username: ${{ secrets.SERVER_USERNAME }} key: ${{ secrets.SERVER_SSH_KEY }} - source: "deploy-package.tar.gz" - target: "/vol1/1000/Docker/" + source: "." + target: "/vol1/1000/Docker/saas2/" overwrite: true - # 在服务器上构建和部署 (仅在 main 分支推送时执行) - - name: 在服务器上构建和部署应用 + # 🛠️ 在服务器上构建并运行Docker镜像 (仅在 main 分支推送时执行) + - name: 🛠️ 在服务器上构建并运行Docker镜像 if: github.ref == 'refs/heads/main' && github.event_name == 'push' uses: appleboy/ssh-action@v1.0.0 with: @@ -80,97 +41,69 @@ jobs: echo "🚀 开始部署 saas2 应用..." - # 进入 Docker 目录 - cd /vol1/1000/Docker/ + # 进入项目目录 + cd /vol1/1000/Docker/saas2 - # 创建项目目录 - mkdir -p saas2 - cd saas2 - - # 备份当前版本(如果存在) - if [ -d "backup" ]; then - rm -rf backup - fi - if [ -f "package.json" ]; then - mkdir -p backup - cp -r ./* backup/ 2>/dev/null || true - echo "📦 已备份当前版本" - fi - - # 解压新版本 - tar -xzf ../deploy-package.tar.gz - echo "📂 已解压新版本" - - # 停止并删除旧容器(如果存在) - if [ "$(docker ps -q -f name=saas2-app)" ]; then - echo "⏹️ 停止运行中的容器..." - docker stop saas2-app - fi - - if [ "$(docker ps -aq -f name=saas2-app)" ]; then - echo "🗑️ 删除旧容器..." - docker rm saas2-app - fi - - # 删除旧镜像(如果存在) - if [ "$(docker images -q saas2-app:latest)" ]; then - echo "🗑️ 删除旧镜像..." - docker rmi saas2-app:latest - fi - - # 构建新的Docker镜像 - echo "🔨 构建新的 Docker 镜像..." - docker build -t saas2-app:latest . - - # 运行新容器 - echo "▶️ 启动新容器..." - docker run -d \ - --name saas2-app \ - --restart unless-stopped \ - -p 3000:3000 \ - --health-cmd="wget --no-verbose --tries=1 --spider http://localhost:3000/api/health || exit 1" \ - --health-interval=30s \ - --health-timeout=10s \ - --health-retries=3 \ - saas2-app:latest - - # 等待容器启动 - echo "⏳ 等待容器启动..." - sleep 15 - - # 检查容器状态 - if [ "$(docker ps -q -f name=saas2-app)" ]; then - echo "✅ 部署成功!容器状态:" - docker ps | grep saas2-app - echo "" - echo "🌐 应用访问地址: http://$(hostname -I | awk '{print $1}'):3000" + echo "🔧 正在构建临时镜像..." + if docker build -t saas2-temp .; then + echo "✅ 镜像构建成功,开始更新容器..." - # 测试健康检查 - echo "🔍 测试健康检查..." - if wget --timeout=10 -qO- http://localhost:3000/api/health > /dev/null 2>&1; then - echo "✅ 健康检查通过" + # 停止并删除旧容器 + echo "⏹️ 正在停止旧容器..." + docker stop saas2-app || true + echo "🗑️ 正在删除旧容器..." + docker rm saas2-app || true + echo "🗑️ 正在删除旧镜像..." + docker rmi saas2-app || true + + # 重命名新镜像 + echo "🔧 重命名新镜像..." + docker tag saas2-temp saas2-app + docker rmi saas2-temp + + # 启动新容器 + echo "🚀 正在运行新容器..." + docker run -d \ + --name saas2-app \ + --restart unless-stopped \ + -p 3000:3000 \ + --health-cmd="wget --no-verbose --tries=1 --spider http://localhost:3000/api/health || exit 1" \ + --health-interval=30s \ + --health-timeout=10s \ + --health-retries=3 \ + saas2-app + + # 等待容器启动 + echo "⏳ 等待容器启动..." + sleep 15 + + # 检查容器状态 + if [ "$(docker ps -q -f name=saas2-app)" ]; then + echo "✅ 部署成功!容器状态:" + docker ps | grep saas2-app + echo "" + echo "🌐 应用访问地址: http://$(hostname -I | awk '{print $1}'):3000" + + # 测试健康检查 + echo "🔍 测试健康检查..." + if wget --timeout=10 -qO- http://localhost:3000/api/health > /dev/null 2>&1; then + echo "✅ 健康检查通过" + else + echo "⚠️ 健康检查失败,但容器正在运行" + fi else - echo "⚠️ 健康检查失败,但容器正在运行" + echo "❌ 部署失败!容器未能正常启动" + echo "📋 容器日志:" + docker logs saas2-app || true + exit 1 fi + + echo "🎉 部署完成!" else - echo "❌ 部署失败!容器未能正常启动" - echo "📋 容器日志:" - docker logs saas2-app || true + echo "❌ 镜像构建失败!保留旧容器运行。" exit 1 fi # 清理无用的Docker资源 echo "🧹 清理无用的 Docker 资源..." - docker system prune -f - - # 删除部署包 - rm -f ../deploy-package.tar.gz - - echo "🎉 部署完成!" - - # 清理临时文件 - - name: 清理临时文件 - if: always() - run: | - rm -rf deploy-package - rm -f deploy-package.tar.gz \ No newline at end of file + docker system prune -f \ No newline at end of file diff --git a/Dockerfile b/Dockerfile index 29bfc7b..b4579fb 100644 --- a/Dockerfile +++ b/Dockerfile @@ -8,13 +8,13 @@ WORKDIR /app # 安装 pnpm RUN npm install -g pnpm -# 复制包配置文件 +# 复制包管理器配置文件 COPY package.json pnpm-lock.yaml ./ # 安装依赖 RUN pnpm install --frozen-lockfile -# 复制源代码 +# 复制源代码和配置文件 COPY . . # 构建应用 @@ -30,8 +30,8 @@ WORKDIR /app RUN addgroup --system --gid 1001 nodejs RUN adduser --system --uid 1001 nextjs -# 安装 pnpm -RUN npm install -g pnpm +# 安装 pnpm 和 wget(用于健康检查) +RUN npm install -g pnpm && apk add --no-cache wget # 复制包配置文件 COPY package.json pnpm-lock.yaml ./