143 lines
5.3 KiB
YAML
143 lines
5.3 KiB
YAML
# 光湖 · 安全关机检测
|
|
name: 🔒 安全关机检测
|
|
|
|
on:
|
|
workflow_dispatch:
|
|
|
|
jobs:
|
|
shutdown-check:
|
|
runs-on: ubuntu
|
|
steps:
|
|
- name: 同步代码
|
|
run: |
|
|
cd /data/guanghulab/repo
|
|
git fetch origin
|
|
git reset --hard origin/main
|
|
|
|
- name: 全面安全检查
|
|
env:
|
|
DEEPSEEK_API_KEY: ${{ secrets.DEEPSEEK_API_KEY }}
|
|
QIANWEN_API_KEY: ${{ secrets.QIANWEN_API_KEY }}
|
|
ZY_REPO_TOKEN: ${{ secrets.ZY_REPO_TOKEN }}
|
|
run: |
|
|
echo "═══════════════════════════════════════"
|
|
echo " 🔍 安全关机检测"
|
|
echo " $(date '+%Y-%m-%d %H:%M:%S %Z')"
|
|
echo "═══════════════════════════════════════"
|
|
echo ""
|
|
|
|
CAN_SHUTDOWN=true
|
|
WARNINGS=""
|
|
ERRORS=""
|
|
|
|
# 1. 检查是否有正在运行的workflow
|
|
echo "── 1. Workflow状态 ──"
|
|
RUNNING=$(curl -s -H "Authorization: token $ZY_REPO_TOKEN" \
|
|
"http://127.0.0.1:3001/api/v1/repos/bingshuo/guanghulab/actions/tasks" \
|
|
| python3 -c "
|
|
import json,sys
|
|
d=json.load(sys.stdin)
|
|
running=[r for r in d.get('workflow_runs',[]) if r.get('status') not in ('success','failure')]
|
|
print(len(running))
|
|
" 2>/dev/null || echo "0")
|
|
if [[ "$RUNNING" -gt 0 ]]; then
|
|
echo " ❌ 有 ${RUNNING} 个workflow正在运行"
|
|
CAN_SHUTDOWN=false
|
|
ERRORS="$ERRORS workflow运行中"
|
|
else
|
|
echo " ✅ 无正在运行的workflow"
|
|
fi
|
|
|
|
# 2. 检查Git是否有未提交的变更
|
|
echo "── 2. Git状态 ──"
|
|
cd /data/guanghulab/repo
|
|
DIRTY=$(git status --porcelain 2>/dev/null | wc -l)
|
|
if [[ "$DIRTY" -gt 0 ]]; then
|
|
echo " ⚠️ 有 ${DIRTY} 个未提交的文件变更"
|
|
WARNINGS="$WARNINGS git有未提交变更"
|
|
else
|
|
echo " ✅ Git工作区干净"
|
|
fi
|
|
|
|
# 3. 检查关键服务状态
|
|
echo "── 3. 服务状态 ──"
|
|
for svc in forgejo gitea-runner nginx; do
|
|
if systemctl is-active --quiet $svc 2>/dev/null; then
|
|
echo " ✅ $svc: 运行中"
|
|
else
|
|
echo " ⚠️ $svc: 未运行"
|
|
WARNINGS="$WARNINGS $svc未运行"
|
|
fi
|
|
done
|
|
|
|
# 4. 检查PM2进程
|
|
echo "── 4. PM2进程 ──"
|
|
if command -v pm2 &>/dev/null; then
|
|
PM2_STATUS=$(pm2 jlist 2>/dev/null | python3 -c "
|
|
import json,sys
|
|
procs=json.load(sys.stdin)
|
|
for p in procs:
|
|
status=p.get('pm2_env',{}).get('status','?')
|
|
name=p.get('name','?')
|
|
icon='✅' if status=='online' else '⚠️'
|
|
print(f' {icon} {name}: {status}')
|
|
" 2>/dev/null || echo " (PM2无进程)")
|
|
echo "$PM2_STATUS"
|
|
fi
|
|
|
|
# 5. 检查内存和磁盘
|
|
echo "── 5. 资源状态 ──"
|
|
MEM_AVAIL=$(free -m | awk '/Mem:/ {print $7}')
|
|
DISK_AVAIL=$(df -h /data | awk 'NR==2 {print $4}')
|
|
echo " 内存可用: ${MEM_AVAIL}MB"
|
|
echo " 磁盘可用: ${DISK_AVAIL}"
|
|
|
|
# 6. 检查是否有未处理的工单
|
|
echo "── 6. 待处理工单 ──"
|
|
TICKET_DIR="/data/guanghulab/.runtime/tickets"
|
|
if [[ -d "$TICKET_DIR" ]]; then
|
|
OPEN=$(ls "$TICKET_DIR"/ticket-*.json 2>/dev/null | wc -l)
|
|
if [[ "$OPEN" -gt 0 ]]; then
|
|
echo " ⚠️ 有 ${OPEN} 个未处理工单"
|
|
WARNINGS="$WARNINGS ${OPEN}个未处理工单"
|
|
else
|
|
echo " ✅ 无待处理工单"
|
|
fi
|
|
else
|
|
echo " ✅ 无工单目录"
|
|
fi
|
|
|
|
# 7. 检查Vault
|
|
echo "── 7. Vault状态 ──"
|
|
if curl -sf http://127.0.0.1:8080/admin/__healthz > /dev/null 2>&1; then
|
|
echo " ✅ Vault: 运行中"
|
|
else
|
|
echo " ⚠️ Vault: 未运行(关机无影响)"
|
|
fi
|
|
|
|
# ─── 结论 ───
|
|
echo ""
|
|
echo "═══════════════════════════════════════"
|
|
if $CAN_SHUTDOWN; then
|
|
if [[ -n "$WARNINGS" ]]; then
|
|
echo " 🟡 可以关机(有警告)"
|
|
echo " 警告:$WARNINGS"
|
|
echo ""
|
|
echo " 建议:检查警告项后再关机"
|
|
else
|
|
echo " 🟢 可以安全关机 ✅"
|
|
echo " 所有检查通过,关机不会丢失数据"
|
|
fi
|
|
else
|
|
echo " 🔴 不建议关机 ❌"
|
|
echo " 问题:$ERRORS"
|
|
echo ""
|
|
echo " 请等workflow完成后再关机"
|
|
fi
|
|
echo ""
|
|
echo " 关机后:"
|
|
echo " · 计算费用停止(只收云盘费)"
|
|
echo " · 数据盘100GB数据完整保留"
|
|
echo " · 下次开机所有服务自动启动"
|
|
echo "═══════════════════════════════════════"
|