101 行
2.7 KiB
Bash
101 行
2.7 KiB
Bash
#!/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
|