简洁的 Shell 脚本仓库,用于管理本地 webhook(ad-hoc HTTP webhook)配置、自动生成部署脚本并支持邮件通知(通过 curl 发 SMTP)。提供交互式安装/卸载/新建 Hook 功能,并自动注册为 systemd 服务运行。
✨经典应用场景:当github有新的commit后需要触发服务器的部署脚本,我们就可以使用这个脚本来方便创建与管理webhook接收github的请求,在创建一个webhook时需要输入如何运行部署脚本,当接收到请求时就会自动执行。
- Shell 编写的 webhook 管理工具
- 自动安装 webhook 二进制
- 自动生成部署脚本
- 自动生成
/etc/webhook/hooks.json - 自动创建 systemd 服务
- 支持 hot reload
- 支持部署完成邮件通知
webhook-manager/
├── webhook-manager.sh
├── mail.conf
└── hooks_configs/
git clone https://github.com/My-Search/webhook-manager.git
cd webhook-manager
chmod +x webhook-manager.sh
sudo ./webhook-manager.sh编辑 mail.conf:
SMTP_SERVER="smtp.gmail.com"
SMTP_PORT="465"
SMTP_USER="your@gmail.com"
SMTP_PASS="your-app-password"
MAIL_TO="target@qq.com"路径:
hooks_configs/*.conf
示例:
HOOK_ID="ai-rss-hub"
PROJECT_PATH="/opt/ai-rss-hub"
DEPLOY_CMD="git pull && mvn clean package -DskipTests"
AUTO_SECRET="17cb8c8bbb78fb65894bb8c302beb5fa"字段说明:
| 字段 | 说明 |
|---|---|
| HOOK_ID | webhook 唯一标识 |
| PROJECT_PATH | 项目路径 |
| DEPLOY_CMD | 执行命令 |
| AUTO_SECRET | 签名密钥 |
sudo systemctl status webhook
sudo systemctl restart webhook
sudo systemctl stop webhooksudo journalctl -u webhook -f查看最近 200 行:
sudo journalctl -u webhook -n 200 --no-pager部署后会生成日志:
/tmp/webhook_<HOOK_ID>_时间戳.log
例如:
ls -lh /tmp | grep webhook查看:
tail -f /tmp/webhook_ai-rss-hub_*.logss -lntp | grep 9000如果你想在本机手动触发某个 Hook(不依赖 GitHub),可以使用 curl。
假设:
- HOOK_ID = ai-rss-hub
- 监听地址 = http://localhost:9000
- AUTO_SECRET = 17cb8c8bbb78fb65894bb8c302beb5fa
- Payload = {}
curl -X POST http://localhost:9000/hooks/ai-rss-hub \
-H "Content-Type: application/json" \
-H "X-Hub-Signature: sha1=$(echo -n '{}' | openssl dgst -sha1 -hmac '17cb8c8bbb78fb65894bb8c302beb5fa' | awk '{print $2}')" \
-d '{}'| 参数 | 说明 |
|---|---|
| /hooks/ai-rss-hub | 必须与 HOOK_ID 一致 |
| X-Hub-Signature | HMAC-SHA1 签名 |
| AUTO_SECRET | hooks.conf 中配置的密钥 |
| -d '{}' | 发送的 JSON 数据 |
SECRET="17cb8c8bbb78fb65894bb8c302beb5fa"
PAYLOAD='{}'
HOOK="ai-rss-hub"
SIGN=$(echo -n "$PAYLOAD" | openssl dgst -sha1 -hmac "$SECRET" | awk '{print $2}')
curl -X POST http://localhost:9000/hooks/$HOOK \
-H "Content-Type: application/json" \
-H "X-Hub-Signature: sha1=$SIGN" \
-d "$PAYLOAD"- webhook 收到请求
- 校验签名
- 执行
/etc/webhook/${HOOK_ID}_deploy.sh - 生成日志文件
- (可选)发送邮件通知
原因:
- SECRET 不一致
- Payload 与签名不匹配
解决:
- 确保签名计算使用完全相同的 JSON
- 不要多空格或换行
原因:
- HOOK_ID 不存在
- hooks.json 未更新
解决:
sudo systemctl restart webhook- 不要公开 AUTO_SECRET
- 不要允许公网随意访问 webhook
- 建议配合 Nginx + IP 白名单
sudo systemctl stop webhook
sudo systemctl disable webhook
sudo rm -rf /etc/webhook
sudo rm -f /usr/local/bin/webhook
sudo rm -f /etc/systemd/system/webhook.service
sudo systemctl daemon-reload