183 lines
5.2 KiB
YAML
183 lines
5.2 KiB
YAML
name: 🌸 秋秋服务器 · 部署
|
|
|
|
# ═══════════════════════════════════════════════════════════
|
|
# 秋秋(之之)服务器部署工作流
|
|
# 编号: ZZ-WF-秋秋部署
|
|
# 守护: 铸渊 · ICE-GL-ZY001
|
|
# 版权: 国作登字-2026-A-00037559
|
|
# ═══════════════════════════════════════════════════════════
|
|
#
|
|
# 服务器: ZZ 服务器
|
|
# 密钥: ZZ_SERVER_KEY / ZZ_SERVER_HOST / ZZ_SERVER_USER / ZZ_SERVER_PATH
|
|
# LLM: ZZ_LLM_API_KEY / ZZ_LLM_BASE_URL
|
|
|
|
on:
|
|
workflow_dispatch:
|
|
inputs:
|
|
action:
|
|
description: '部署动作'
|
|
required: true
|
|
default: 'deploy'
|
|
type: choice
|
|
options:
|
|
- deploy
|
|
- health-check
|
|
|
|
concurrency:
|
|
group: qiuqiu-server-deploy
|
|
cancel-in-progress: false
|
|
|
|
permissions:
|
|
contents: read
|
|
|
|
jobs:
|
|
# ═══ §1 部署应用 ═══
|
|
deploy:
|
|
name: 🚀 部署秋秋服务
|
|
if: github.event.inputs.action == 'deploy'
|
|
runs-on: ubuntu-latest
|
|
steps:
|
|
- uses: actions/checkout@v4
|
|
|
|
- name: 🔐 配置SSH密钥
|
|
env:
|
|
SSH_KEY: ${{ secrets.ZZ_SERVER_KEY }}
|
|
run: |
|
|
mkdir -p ~/.ssh
|
|
echo "$SSH_KEY" > ~/.ssh/id_zz
|
|
chmod 600 ~/.ssh/id_zz
|
|
|
|
if ! head -1 ~/.ssh/id_zz | grep -q "BEGIN"; then
|
|
echo "❌ SSH密钥格式异常"
|
|
exit 1
|
|
fi
|
|
echo "✅ SSH密钥格式正确"
|
|
|
|
ssh-keyscan -H ${{ secrets.ZZ_SERVER_HOST }} >> ~/.ssh/known_hosts 2>/dev/null
|
|
|
|
cat > ~/.ssh/config << EOF
|
|
Host zz-server
|
|
HostName ${{ secrets.ZZ_SERVER_HOST }}
|
|
User ${{ secrets.ZZ_SERVER_USER }}
|
|
IdentityFile ~/.ssh/id_zz
|
|
StrictHostKeyChecking accept-new
|
|
BatchMode yes
|
|
ConnectTimeout 30
|
|
EOF
|
|
chmod 600 ~/.ssh/config
|
|
|
|
- name: 🔍 SSH连接测试
|
|
run: |
|
|
ssh zz-server 'echo "✅ SSH连接成功 · $(hostname) · $(date)"'
|
|
|
|
- name: 📦 同步应用代码
|
|
run: |
|
|
ZZ_PATH="${{ secrets.ZZ_SERVER_PATH }}"
|
|
echo "📦 部署目标: ${ZZ_PATH}"
|
|
|
|
ssh zz-server "mkdir -p ${ZZ_PATH}/app"
|
|
|
|
rsync -avz --delete \
|
|
-e "ssh -F ~/.ssh/config" \
|
|
server/app/ \
|
|
zz-server:${ZZ_PATH}/app/
|
|
|
|
- name: ⚙️ 写入 LLM 环境配置
|
|
run: |
|
|
ZZ_PATH="${{ secrets.ZZ_SERVER_PATH }}"
|
|
ssh zz-server "cat > ${ZZ_PATH}/app/.env << 'ENVEOF'
|
|
LLM_API_KEY=${{ secrets.ZZ_LLM_API_KEY }}
|
|
LLM_BASE_URL=${{ secrets.ZZ_LLM_BASE_URL }}
|
|
ENVEOF
|
|
chmod 600 ${ZZ_PATH}/app/.env"
|
|
|
|
- name: 📥 安装依赖 & 重启
|
|
run: |
|
|
ZZ_PATH="${{ secrets.ZZ_SERVER_PATH }}"
|
|
COMMIT_SHA="${{ github.sha }}"
|
|
ssh zz-server << DEPLOY_CMD
|
|
|
|
set -e
|
|
cd ${ZZ_PATH}/app
|
|
|
|
if [ ! -f server.js ]; then
|
|
echo "❌ 错误: server.js 不存在"
|
|
exit 1
|
|
fi
|
|
|
|
npm install --production 2>&1
|
|
|
|
pm2 delete qiuqiu 2>/dev/null || true
|
|
pm2 start server.js --name qiuqiu
|
|
pm2 save
|
|
|
|
sleep 3
|
|
curl -sf http://localhost:3000/api/health && echo "✅ 秋秋服务已上线" || echo "❌ 秋秋服务启动失败"
|
|
|
|
DEPLOY_CMD
|
|
|
|
- name: 🧹 清理SSH密钥
|
|
if: always()
|
|
run: rm -f ~/.ssh/id_zz ~/.ssh/config
|
|
|
|
# ═══ §2 健康检查 ═══
|
|
health-check:
|
|
name: 💚 秋秋服务健康检查
|
|
if: github.event.inputs.action == 'health-check'
|
|
runs-on: ubuntu-latest
|
|
steps:
|
|
- uses: actions/checkout@v4
|
|
|
|
- name: 🔐 配置SSH密钥
|
|
env:
|
|
SSH_KEY: ${{ secrets.ZZ_SERVER_KEY }}
|
|
run: |
|
|
mkdir -p ~/.ssh
|
|
echo "$SSH_KEY" > ~/.ssh/id_zz
|
|
chmod 600 ~/.ssh/id_zz
|
|
|
|
ssh-keyscan -H ${{ secrets.ZZ_SERVER_HOST }} >> ~/.ssh/known_hosts 2>/dev/null
|
|
|
|
cat > ~/.ssh/config << EOF
|
|
Host zz-server
|
|
HostName ${{ secrets.ZZ_SERVER_HOST }}
|
|
User ${{ secrets.ZZ_SERVER_USER }}
|
|
IdentityFile ~/.ssh/id_zz
|
|
StrictHostKeyChecking accept-new
|
|
BatchMode yes
|
|
ConnectTimeout 30
|
|
EOF
|
|
chmod 600 ~/.ssh/config
|
|
|
|
- name: 💚 执行健康检查
|
|
run: |
|
|
ssh zz-server << 'HEALTH_CMD'
|
|
|
|
echo "═══ 秋秋服务器健康报告 ═══"
|
|
echo ""
|
|
|
|
echo "§1 系统状态:"
|
|
uptime
|
|
echo ""
|
|
|
|
echo "§2 磁盘使用:"
|
|
df -h /
|
|
echo ""
|
|
|
|
echo "§3 内存使用:"
|
|
free -m
|
|
echo ""
|
|
|
|
echo "§4 PM2 进程:"
|
|
pm2 list 2>/dev/null || echo "PM2 未运行"
|
|
echo ""
|
|
|
|
echo "§5 应用健康:"
|
|
curl -sf http://localhost:3000/api/health | jq . 2>/dev/null || echo "应用未响应"
|
|
|
|
HEALTH_CMD
|
|
|
|
- name: 🧹 清理SSH密钥
|
|
if: always()
|
|
run: rm -f ~/.ssh/id_zz ~/.ssh/config
|