auto-deploy-demo/TROUBLESHOOTING.md

9.2 KiB
Raw Blame History

部署问题排查指南

问题描述

访问项目时出现 404 或 500 错误Nginx 配置未正确生成或生效。


排查步骤

1. 检查容器是否正常运行

# 查看容器状态
docker ps | grep auto-deploy-demo

# 查看容器日志
docker logs auto-deploy-demo

# 查看最近日志
docker logs --tail 50 auto-deploy-demo

预期输出

  • 容器状态为 Up
  • 日志显示 Server running on port 8888
  • 日志显示 Running mode: Nginx dynamic routing

2. 检查项目状态

# 查看项目数据
docker exec auto-deploy-demo cat /app/data/projects.json

# 查看项目目录
docker exec auto-deploy-demo ls -la /app/projects/

# 查看具体项目文件
docker exec auto-deploy-demo ls -la /app/projects/{项目ID}/

检查要点

  • 项目状态是否为 running
  • 项目是否有 port 字段
  • 项目目录是否存在且包含文件

3. 检查项目服务是否运行

# 查看所有进程
docker exec auto-deploy-demo ps aux

# 查看 Node.js 进程
docker exec auto-deploy-demo ps aux | grep node

# 测试项目端口(假设项目端口是 9000
docker exec auto-deploy-demo wget -qO- http://127.0.0.1:9000/

预期输出

  • 应该有多个 node 进程(主服务 + 项目服务)
  • 项目端口能返回 HTML 内容

4. 检查 Nginx 配置

# 查看 Nginx 配置文件
docker exec auto-deploy-demo cat /app/nginx/sites-enabled/auto-deploy.conf

# 检查 Nginx 配置语法
docker exec auto-deploy-demo nginx -t

# 查看 Nginx 错误日志
docker exec auto-deploy-demo cat /var/log/nginx/error.log

# 查看 Nginx 访问日志
docker exec auto-deploy-demo tail -20 /var/log/nginx/access.log

检查要点

  • 配置文件中是否包含项目路由
  • 配置语法是否正确
  • 错误日志是否有循环重定向等问题

5. 测试内部访问

# 测试主页面
docker exec auto-deploy-demo wget -qO- http://127.0.0.1:80/ | head -20

# 测试 API
docker exec auto-deploy-demo wget -qO- http://127.0.0.1:8888/api/projects

# 测试项目访问假设项目ID是 1772016995850端口是 9000
docker exec auto-deploy-demo wget -qO- http://127.0.0.1:80/project/1772016995850/

# 直接测试项目服务
docker exec auto-deploy-demo wget -qO- http://127.0.0.1:9000/

6. 常见问题及修复

问题 1Nginx 配置中没有项目路由

症状:配置文件中 # 项目路由 - 由系统动态生成 下面为空

原因

  • 项目启动时未正确更新 Nginx 配置
  • 项目对象没有传递 port 字段

修复

# 进入容器
docker exec -it auto-deploy-demo sh

# 手动重新生成配置
cd /app
node -e "
const nginxManager = require('./server/services/nginxManager');
const projectService = require('./server/services/projectService');
const fs = require('fs');

const projects = projectService.getAllProjects();
const running = projects.filter(p => p.status === 'running');

running.forEach(p => {
  const projectWithPort = { ...p, port: p.port };
  nginxManager.addProjectLocation(projectWithPort);
});

console.log(nginxManager.safeReload());
"

exit

问题 2循环重定向 (500 错误)

症状:错误日志显示 rewrite or internal redirection cycle

原因Nginx 配置中的 try_files 导致循环

修复

# 进入容器
docker exec -it auto-deploy-demo sh

# 删除 try_files 行
sed -i '/try_files/d' /app/nginx/sites-enabled/auto-deploy.conf

# 重载 Nginx
nginx -s reload

exit

问题 3项目服务未启动

症状:项目端口连接被拒绝 Connection refused

原因

  • 容器重启后项目进程丢失
  • 项目启动失败

修复

# 在管理界面手动停止再启动项目
# 或者重启容器
docker restart auto-deploy-demo

问题 4404 Not Found

症状:访问项目返回 404Nginx 版本号显示在页面底部

原因

  • Nginx 配置中没有对应项目的路由
  • 项目 ID 不匹配

修复

  1. 确认项目状态为 running
  2. 确认 Nginx 配置中包含该项目路由
  3. 手动重新生成配置(见问题 1 的修复方法)

问题 5静态资源加载失败 (MIME type 错误)

症状:控制台报错 Expected a JavaScript-or-Wasm module script but the server responded with a MIME type of "text/html"

原因:前端项目的静态资源路径是绝对路径 /assets/...,被 Nginx 的 / location 捕获,代理到了管理后台

修复

# 进入容器
docker exec -it auto-deploy-demo sh

# 修改项目 HTML 文件,将绝对路径改为相对路径
sed -i 's|src="/|src="./|g' /app/projects/{项目ID}/index.html
sed -i 's|href="/|href="./|g' /app/projects/{项目ID}/index.html

# 查看修改结果
cat /app/projects/{项目ID}/index.html

exit

注意:新版本已自动修复此问题,上传新项目时会自动转换路径


手动配置 Nginx

手动添加项目路由

如果自动生成失败,可以手动添加项目路由配置:

# 进入容器编辑配置
docker exec -it auto-deploy-demo vi /app/nginx/sites-enabled/auto-deploy.conf

# 项目路由 - 由系统动态生成 下面添加:

    # Project: 项目名称 (项目ID)
    location /project/项目ID/ {
        proxy_pass http://127.0.0.1:项目端口/;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        
        # WebSocket支持
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
    }

示例项目ID: 1772019512922端口: 9000

    # Project: lot (1772019512922)
    location /project/1772019512922/ {
        proxy_pass http://127.0.0.1:9000/;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        
        # WebSocket支持
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
    }

在容器外操作 Nginx

# 测试 Nginx 配置语法
docker exec auto-deploy-demo nginx -t

# 重新加载 Nginx 配置(在容器外执行)
docker exec auto-deploy-demo nginx -s reload

# 查看 Nginx 配置
docker exec auto-deploy-demo cat /app/nginx/sites-enabled/auto-deploy.conf

# 查看 Nginx 错误日志
docker exec auto-deploy-demo cat /var/log/nginx/error.log

# 查看 Nginx 访问日志
docker exec auto-deploy-demo tail -50 /var/log/nginx/access.log

7. 一键诊断脚本

docker exec auto-deploy-demo sh -c '
echo "=== 容器进程 ==="
ps aux | grep -E "node|nginx"
echo ""
echo "=== 项目数据 ==="
cat /app/data/projects.json 2>/dev/null | head -50
echo ""
echo "=== Nginx 配置 ==="
cat /app/nginx/sites-enabled/auto-deploy.conf 2>/dev/null
echo ""
echo "=== Nginx 错误日志 ==="
tail -20 /var/log/nginx/error.log 2>/dev/null
echo ""
echo "=== 测试主页面 ==="
wget -qO- http://127.0.0.1:80/ 2>/dev/null | head -5
echo ""
echo "=== 测试 API ==="
wget -qO- http://127.0.0.1:8888/api/projects 2>/dev/null | head -50
'

8. 重新部署步骤

如果以上方法都无法解决问题,请重新部署:

# 1. 停止并删除旧容器
docker rm -f auto-deploy-demo

# 2. 清理数据(谨慎操作!)
# rm -rf /opt/auto-deploy/data/*
# rm -rf /opt/auto-deploy/projects/*

# 3. 上传新的部署包并解压
cd /opt/auto-deploy
unzip -o auto-deploy-dist.zip

# 4. 创建 Nginx 配置目录
mkdir -p nginx/sites-enabled

# 5. 构建镜像
docker build -t auto-deploy-demo:latest .

# 6. 启动容器(带 Nginx 配置映射)
docker run -d \
  --name auto-deploy-demo \
  --restart unless-stopped \
  -p 8181:80 \
  -v $(pwd)/data:/app/data \
  -v $(pwd)/projects:/app/projects \
  -v $(pwd)/nginx/sites-enabled:/app/nginx/sites-enabled \
  -e PORT=8888 \
  -e BASE_DOMAIN=ashai.com.cn:8181 \
  -e USE_NGINX=true \
  -e PROJECT_BIND_ADDRESS=127.0.0.1 \
  auto-deploy-demo:latest

# 7. 查看日志
docker logs -f auto-deploy-demo

架构说明

用户请求
    ↓
宿主机:8181
    ↓
容器 Nginx:80
    ↓
    ├─ /api/* → Node.js:8888
    ├─ /project/{id}/* → 项目服务:900x
    └─ / → 管理后台静态文件

相关文件位置

文件 容器内路径 宿主机路径(如果映射)
Nginx 配置 /app/nginx/sites-enabled/auto-deploy.conf ./nginx/sites-enabled/auto-deploy.conf
项目数据 /app/data/projects.json ./data/projects.json
项目文件 /app/projects/{项目ID}/ ./projects/{项目ID}/
Nginx 错误日志 /var/log/nginx/error.log -
Nginx 访问日志 /var/log/nginx/access.log -

联系方式

如有问题,请提供以下信息:

  1. docker logs auto-deploy-demo 的输出
  2. docker exec auto-deploy-demo cat /app/nginx/sites-enabled/auto-deploy.conf
  3. docker exec auto-deploy-demo cat /app/data/projects.json
  4. docker exec auto-deploy-demo cat /var/log/nginx/error.log