From 2422ae452b03ca28135622ede63c6690060d7db9 Mon Sep 17 00:00:00 2001 From: cheney Date: Mon, 31 Aug 2026 15:05:44 +0800 Subject: [PATCH] =?UTF-8?q?refactor:=20=E6=94=B9=E7=94=A8=20start.sh=20?= =?UTF-8?q?=E7=9B=B4=E6=8E=A5=E9=83=A8=E7=BD=B2=EF=BC=8C=E5=8E=BB=E6=8E=89?= =?UTF-8?q?=20docker=20compose?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitea/workflows/deploy.yml | 44 +++++--------------------- deploy.sh | 62 +++++-------------------------------- start.sh | 21 ++++++++----- 3 files changed, 28 insertions(+), 99 deletions(-) diff --git a/.gitea/workflows/deploy.yml b/.gitea/workflows/deploy.yml index 6312cc6..d49f646 100644 --- a/.gitea/workflows/deploy.yml +++ b/.gitea/workflows/deploy.yml @@ -7,48 +7,23 @@ on: branches: [main] jobs: - build: - runs-on: ubuntu-latest - steps: - - name: Checkout - uses: actions/checkout@v4 - - - name: Set up Docker Buildx - uses: docker/setup-buildx-action@v3 - - - name: Build Docker image - run: | - docker build -t awesome-index:${{ github.sha }} . - docker tag awesome-index:${{ github.sha }} awesome-index:latest - deploy: - needs: build if: github.ref == 'refs/heads/main' runs-on: ubuntu-latest steps: - name: Checkout uses: actions/checkout@v4 - - name: Deploy to server - uses: appleboy/ssh-action@master - with: - host: 114.134.187.170 - username: root - password: ${{ secrets.SERVER_PASSWORD }} - script: | - # 创建部署目录 - mkdir -p /app/awesome/data /app/awesome/logs - - name: Copy files to server uses: appleboy/scp-action@master with: host: 114.134.187.170 username: root password: ${{ secrets.SERVER_PASSWORD }} - source: "docker-compose.yml,start.sh" + source: "package.json,package-lock.json,src,public,.env.example,start.sh" target: "/app/awesome/" - - name: Load and start container + - name: Deploy and start service uses: appleboy/ssh-action@master with: host: 114.134.187.170 @@ -57,14 +32,9 @@ jobs: script: | cd /app/awesome - # 停止旧容器 - docker compose down --remove-orphans 2>/dev/null || true + # 如不存在 .env 则从 example 复制 + [ ! -f .env ] && cp .env.example .env - # 启动新容器 - docker compose up -d - - # 等待启动 - sleep 10 - - # 健康检查 - curl -sf http://localhost:3000/healthz && echo " - 服务已启动" || echo " - 启动失败" + # 执行启动脚本 + chmod +x start.sh + bash start.sh diff --git a/deploy.sh b/deploy.sh index 72ee78b..b3ba0a2 100644 --- a/deploy.sh +++ b/deploy.sh @@ -1,5 +1,5 @@ #!/bin/bash -# Awesome Index 部署脚本 +# Awesome Index 部署脚本(直接部署,不使用 Docker) # 服务器: 114.134.187.170 set -e @@ -23,64 +23,18 @@ echo "1. 创建部署目录..." sshpass -p "$REMOTE_PASS" ssh -o StrictHostKeyChecking=no "$REMOTE_USER@$REMOTE_HOST" \ "mkdir -p $DEPLOY_PATH/data $DEPLOY_PATH/logs" -echo "2. 上传文件..." -sshpass -p "$REMOTE_PASS" scp -o StrictHostKeyChecking=no \ - docker-compose.yml start.sh .env.example \ +echo "2. 上传源码..." +sshpass -p "$REMOTE_PASS" scp -o StrictHostKeyChecking=no -r \ + package.json package-lock.json src public .env.example start.sh \ "$REMOTE_USER@$REMOTE_HOST:$DEPLOY_PATH/" -echo "3. 重命名 .env.example 为 .env..." +echo "3. 重命名 .env.example 为 .env(如不存在)..." sshpass -p "$REMOTE_PASS" ssh -o StrictHostKeyChecking=no "$REMOTE_USER@$REMOTE_HOST" \ "cd $DEPLOY_PATH && [ ! -f .env ] && cp .env.example .env" -echo "4. 在服务器上构建并启动..." -sshpass -p "$REMOTE_PASS" ssh -o StrictHostKeyChecking=no "$REMOTE_USER@$REMOTE_HOST" << 'EOF' - cd /app/awesome - - # 创建 Dockerfile 用于服务器构建 - cat > Dockerfile << 'DOCKERFILE' -FROM node:22-bookworm-slim AS deps -WORKDIR /app -COPY package.json package-lock.json ./ -RUN npm ci --omit=dev --no-audit --no-fund - -FROM node:22-bookworm-slim -WORKDIR /app -ENV NODE_ENV=production -COPY --from=deps /app/node_modules ./node_modules -COPY package.json ./ -COPY src ./src -COPY public ./public -VOLUME ["/app/data"] -EXPOSE 3000 -USER node -HEALTHCHECK --interval=30s --timeout=5s --start-period=15s \ - CMD node -e "fetch('http://localhost:3000/healthz').then(r=>process.exit(r.ok?0:1)).catch(()=>process.exit(1))" -CMD ["node", "src/index.js"] -DOCKERFILE - - # 构建镜像 - docker build -t awesome-index:latest . - - # 停止旧容器 - docker compose down --remove-orphans 2>/dev/null || true - - # 启动新容器 - docker compose up -d - - echo "等待服务启动..." - sleep 10 - - # 健康检查 - if curl -sf http://localhost:3000/healthz > /dev/null 2>&1; then - echo "✓ 服务启动成功!" - echo " 访问: http://$REMOTE_HOST:3000" - echo " 管理: http://$REMOTE_HOST:3000/admin" - else - echo "✗ 服务启动失败,查看日志:" - docker compose logs - exit 1 - fi -EOF +echo "4. 在服务器上执行启动脚本..." +sshpass -p "$REMOTE_PASS" ssh -o StrictHostKeyChecking=no "$REMOTE_USER@$REMOTE_HOST" \ + "cd $DEPLOY_PATH && chmod +x start.sh && bash start.sh" echo "" echo "=== 部署完成 ===" diff --git a/start.sh b/start.sh index 1aad47c..ae15473 100644 --- a/start.sh +++ b/start.sh @@ -1,7 +1,7 @@ #!/bin/bash set -e -# Awesome Index 启动脚本 +# Awesome Index 启动脚本(直接部署,不使用 Docker) DEPLOY_PATH="$(cd "$(dirname "$0")" && pwd)" cd "$DEPLOY_PATH" @@ -11,17 +11,22 @@ if [ ! -f .env ]; then exit 1 fi -# 停止旧容器 -echo "停止旧容器..." -docker compose down --remove-orphans 2>/dev/null || true +# 安装依赖 +echo "安装依赖..." +npm ci --omit=dev --no-audit --no-fund -# 启动新容器 +# 停止旧进程 +echo "停止旧进程..." +pkill -f "node src/index.js" 2>/dev/null || true +sleep 1 + +# 启动服务 echo "启动 Awesome Index..." -docker compose up -d +nohup node src/index.js > logs/app.log 2>&1 & # 健康检查 echo "等待服务就绪..." -sleep 5 +sleep 2 MAX_RETRIES=10 RETRY_COUNT=0 @@ -37,5 +42,5 @@ while [ $RETRY_COUNT -lt $MAX_RETRIES ]; do sleep 2 done -echo "✗ 服务启动失败,请检查日志: docker compose logs" +echo "✗ 服务启动失败,请检查日志: tail -50 logs/app.log" exit 1