name: Diagnose ECS (read-only) # 只读诊断:排查数字我后端 DB 接口卡死(MongoDB 挂/连不上)。不重启任何服务。 on: workflow_dispatch: jobs: diagnose: runs-on: ubuntu-latest steps: - name: SSH read-only diagnostics uses: appleboy/ssh-action@v1 with: host: ${{ secrets.ECS_HOST }} username: ${{ secrets.ECS_USER }} password: ${{ secrets.ECS_PASSWORD }} command_timeout: 8m script: | echo "===== 时间 ====="; date echo "===== 磁盘 df -h(磁盘满会让 mongo 卡/只读)====="; df -h | grep -vE "tmpfs|udev|overlay" | head -20 echo "===== 内存 free -h ====="; free -h echo "===== pm2 list ====="; pm2 list 2>/dev/null | grep -iE "name|digitalme|online|errored|stopped" || pm2 list 2>/dev/null | head -20 echo "===== pm2 describe digitalme-api ====="; pm2 describe digitalme-api 2>/dev/null | grep -iE "status|restart|uptime|memory|cpu|pid|script path|unstable" | head -20 echo "===== 本地 /health(不读库)====="; curl -s -m 8 http://localhost:3603/health; echo echo "===== 本地 /api/plaza(读库,8s 看是否卡)====="; curl -s -m 8 -o /dev/null -w "plaza -> code=%{http_code} time=%{time_total}s\n" http://localhost:3603/api/plaza 2>&1 echo "===== MongoDB systemd 服务 =====" systemctl is-active mongod 2>/dev/null && systemctl status mongod --no-pager 2>/dev/null | head -14 || echo "(mongod systemd 非 active 或不存在)" echo "===== MongoDB docker 容器 =====" (command -v docker >/dev/null && docker ps -a --format '{{.Names}} | {{.Status}} | {{.Image}}' 2>/dev/null | grep -i mongo) || echo "(无 docker mongo 或无 docker)" echo "===== 27017 端口监听 ====="; ss -tlnp 2>/dev/null | grep 27017 || echo "⚠ 27017 未监听" echo "===== .env 里 Mongo 主机(已脱敏密码) ====="; grep -iE "MONGO|MONGODB" /var/www/digitalme-api.invoratec.cn/.env 2>/dev/null | sed -E 's#://[^@ ]*@#://***:***@#g' | head -5 || echo "(未读到)" echo "===== mongo ping(8s) =====" if command -v mongosh >/dev/null; then timeout 8 mongosh --quiet --eval "db.adminCommand('ping')" 2>&1 | head -6; \ elif command -v mongo >/dev/null; then timeout 8 mongo --quiet --eval "db.adminCommand('ping')" 2>&1 | head -6; \ else echo "(无 mongosh/mongo 客户端)"; fi echo "===== API 近 45 行日志(找 Mongo 报错/超时) ====="; pm2 logs digitalme-api --lines 45 --nostream 2>/dev/null | tail -50 echo "===== mongod 日志尾部(如有) ====="; tail -25 /var/log/mongodb/mongod.log 2>/dev/null || echo "(无 /var/log/mongodb/mongod.log)" echo "===== 系统负载/OOM 迹象 ====="; uptime; dmesg 2>/dev/null | grep -iE "out of memory|killed process|oom" | tail -5 || echo "(dmesg 无 OOM 或无权限)" echo "===== 诊断完成 ====="