name: Repair Disk (safe cleanup) # 根分区 100% 满导致 MongoDB 写卡死。只清「可再生垃圾」:失控日志/pm2日志/journal/npm缓存/旧nginx日志。 # 绝不触碰:数据库文件、用户媒体、/var/www 站点、/var/lib/docker、/data。清完测 DB 恢复,必要时只重启本产品 API。 on: workflow_dispatch: jobs: repair: runs-on: ubuntu-latest steps: - name: SSH safe disk cleanup + verify recovery uses: appleboy/ssh-action@v1 with: host: ${{ secrets.ECS_HOST }} username: ${{ secrets.ECS_USER }} password: ${{ secrets.ECS_PASSWORD }} command_timeout: 10m script: | echo "========== 清理前 df =========="; df -h / | tail -1 echo "========== 1) 截断失控的超大 pm2 stdout 日志(>500M,只清空不删文件) ==========" for f in ~/.pm2/logs/*.log; do [ -f "$f" ] || continue sz=$(stat -c%s "$f" 2>/dev/null || echo 0) if [ "$sz" -gt 524288000 ]; then echo " 清空 $(du -h "$f" | cut -f1) $f"; : > "$f"; fi done echo "========== 2) pm2 flush(清其余各产品日志) ==========" pm2 flush 2>/dev/null && echo " pm2 flush done" || echo " (pm2 flush 跳过)" echo "========== 3) journal 收缩到 100M ==========" journalctl --vacuum-size=100M 2>&1 | tail -2 || echo " (无 journalctl)" echo "========== 4) npm 缓存清理(可再生) ==========" npm cache clean --force 2>/dev/null && echo " npm cache cleaned" || echo " (npm cache 跳过)" echo "========== 5) 旧的 rotated nginx 日志(*.gz / *.N) ==========" find /var/log/nginx -type f \( -name "*.gz" -o -regex ".*\.[0-9]+" \) -delete 2>/dev/null && echo " 旧 nginx 日志已清" || echo " (无)" echo "========== 清理后 df =========="; df -h / | tail -1 echo "========== 6) MongoDB ping ==========" if command -v mongosh >/dev/null; then timeout 10 mongosh --quiet --eval "db.adminCommand('ping')" 2>&1 | head -4; \ elif command -v mongo >/dev/null; then timeout 10 mongo --quiet --eval "db.adminCommand('ping')" 2>&1 | head -4; \ else echo " (无 mongo 客户端,跳过 ping)"; fi echo "========== 7) 本地读库接口测试(10s) ==========" curl -s -m 10 -o /dev/null -w " plaza -> code=%{http_code} time=%{time_total}s\n" http://localhost:3603/api/plaza 2>&1 CODE=$(curl -s -m 10 -o /dev/null -w "%{http_code}" http://localhost:3603/api/plaza 2>/dev/null) if [ "$CODE" != "200" ]; then echo "========== 8) plaza 仍非200,重启本产品 API 清连接池 ==========" pm2 restart digitalme-api --update-env 2>/dev/null | tail -3; sleep 7 curl -s -m 15 -o /dev/null -w " plaza(重启后) -> code=%{http_code} time=%{time_total}s\n" http://localhost:3603/api/plaza 2>&1 else echo " ✓ 读库接口已恢复 200,无需重启" fi echo "========== 完成 =========="