lawless-client/scripts/webhook-deploy.sh

101 行
2.7 KiB
Bash

2026-07-09 11:54:43 +08:00
#!/bin/bash
# Gitea Webhook 接收器 - 自动部署文档站
# 使用方法: 在服务器上运行此脚本作为服务
set -euo pipefail
WEBHOOK_SECRET="${WEBHOOK_SECRET:-lawless-docs-deploy}"
DEPLOY_DIR="/var/www/docs.xuqinmin.com/site"
REPO_URL="https://xuqinmin.com/xuqinmin12/lawless.git"
BRANCH="main"
PORT="${WEBHOOK_PORT:-9000}"
# 日志函数
log() {
echo "[$(date '+%Y-%m-%d %H:%M:%S')] $*"
}
# 验证 webhook 签名
verify_signature() {
local payload="$1"
local signature="$2"
local expected=$(echo -n "$payload" | openssl dgst -sha256 -hmac "$WEBHOOK_SECRET" | awk '{print $2}')
[ "$signature" = "$expected" ]
}
# 部署函数
deploy() {
log "Starting deployment..."
# 创建临时目录
TMP_DIR=$(mktemp -d)
cd "$TMP_DIR"
# 克隆仓库
log "Cloning repository..."
git clone --depth 1 --branch "$BRANCH" "$REPO_URL" repo
cd repo
# 安装依赖并构建
log "Building docs..."
pip3 install mkdocs-material --quiet || true
mkdocs build --clean --site-dir site
# 部署到目标目录
log "Deploying to $DEPLOY_DIR..."
sudo mkdir -p "$DEPLOY_DIR"
sudo rsync -avz --delete site/ "$DEPLOY_DIR/"
# 清理
cd /
rm -rf "$TMP_DIR"
log "Deployment completed successfully!"
}
# HTTP 服务器
while true; do
{
# 读取请求
read -r method url version
headers=""
content_length=0
while read -r line; do
line=$(echo "$line" | tr -d '\r')
[ -z "$line" ] && break
headers="$headers$line\n"
if echo "$line" | grep -qi "Content-Length:"; then
content_length=$(echo "$line" | awk '{print $2}')
fi
done
# 读取请求体
if [ "$content_length" -gt 0 ]; then
body=$(head -c "$content_length")
else
body=""
fi
# 处理请求
if echo "$url" | grep -q "/deploy"; then
# 验证签名
signature=$(echo "$headers" | grep -i "X-Gitea-Signature:" | awk '{print $2}')
if [ -z "$signature" ] || verify_signature "$body" "$signature"; then
# 执行部署
deploy &
response="HTTP/1.1 200 OK\r\nContent-Type: text/plain\r\n\r\nDeployment triggered"
else
response="HTTP/1.1 403 Forbidden\r\nContent-Type: text/plain\r\n\r\nInvalid signature"
fi
elif echo "$url" | grep -q "/health"; then
response="HTTP/1.1 200 OK\r\nContent-Type: text/plain\r\n\r\nOK"
else
response="HTTP/1.1 404 Not Found\r\nContent-Type: text/plain\r\n\r\nNot Found"
fi
# 发送响应
echo -e "$response"
} | nc -l -p "$PORT" -q 1
done