
ncarlier/webhookd一个非常简单的webhook服务器,用于启动shell脚本。
!Logo
webhookd是一个轻量级的webhook服务器,允许通过HTTP请求触发shell脚本执行。它设计简洁,配置灵活,支持多种参数传递方式、实时日志流、通知机制、认证与签名验证等功能,适用于自动化部署、CI/CD流程触发、简单任务调度等场景。
bash$ docker run -d --name=webhookd \ -v ${PWD}/scripts:/scripts \ -p 8080:8080 \ ncarlier/webhookd
官方镜像轻量适用于简单脚本,如需高级功能(如Docker CLI或Docker Compose交互),可使用ncarlier/webhookd:edge-distrib镜像:
bash$ docker run -d --name=webhookd \ -v ${PWD}/scripts:/scripts \ -v /var/run/docker.sock:/var/run/docker.sock \ -p 8080:8080 \ ncarlier/webhookd:edge-distrib
webhookd可通过命令行参数或环境变量配置,执行webhookd -h查看所有参数及对应环境变量。所有配置变量详见etc/default/webhookd.env文件。
核心配置项:
WHD_SCRIPTS/-script:脚本目录路径(默认./scripts)WHD_HOOK_TIMEOUT:全局webhook超时时间(秒,默认10)WHD_HOOK_LOG_DIR:日志存储目录WHD_NOTIFICATION_URI:通知目标URI(HTTP或Email)WHD_PASSWD_FILE:htpasswd认证文件路径WHD_TRUST_STORE_FILE:签名验证公钥文件(PEM格式)WHD_TLS:启用TLS(true/false)WHD_TLS_DOMAIN:ACME域名(启用ACME时)webhook通过脚本目录结构定义,默认位于./scripts(可通过WHD_SCRIPTS修改)。目录结构示例:
/scripts ├── /github │ ├── build.sh │ └── deploy.sh ├── push.js └── echo.sh
注:支持任何可执行文件(需添加shebang头),如
.sh、.js等。
URL路径对应脚本路径,可省略脚本扩展名(默认查找.sh文件)。示例:
/scripts/github/build.sh对应URL:http://localhost:8080/github/build/scripts/echo.sh对应URL:http://localhost:8080/echoGET方法且Accept: text/event-stream头POST方法或默认GET)脚本参数来源及转换规则:
?foo=bar → foo=bar)Content-Type → content_type)application/x-www-form-urlencoded:键值对转换为变量text/*或application/json:作为脚本第一个参数传递额外内置变量:
hook_id:自动递增的hook IDhook_name:hook名称hook_method:HTTP请求方法x_forwarded_for:客户端IPx_webauth_user:认证用户名(若启用认证)WHD_HOOK_TIMEOUT环境变量设置(秒)X-Hook-Timeout HTTP头覆盖(秒)示例:
bashcurl -H "X-Hook-Timeout: 5" http://localhost:8080/echo?foo=bar
X-Hook-ID头获取的ID访问http://localhost:8080/<NAME>/<ID>查看历史日志脚本执行后可发送通知,仅输出中以特定前缀(默认notify:)开头的行将被发送。通过WHD_NOTIFICATION_URI配置通知目标。
配置URI:[***](prefix可选,默认notify:)
POST payload格式:
json{ "id": "42", "name": "echo", "text": "notify: Hello World\n", "error": "错误信息(如有)" }
支持Mattermost、Slack、***等webhook端点。
配置URI:mailto:***?smtp=smtp.example.com:587&username=user&password=pass&from=***
支持参数:smtp(SMTP服务器)、username/password(认证信息)、conn(连接类型:tls/tls-insecure/plain)、from(发件人)、subject(主题)。
通过htpasswd文件启用HTTP基本认证:
bashhtpasswd -B -c .htpasswd api
bashexport WHD_PASSWD_FILE=/path/to/.htpasswd
bashcurl -u api:password -XPOST "http://localhost:8080/echo?msg=hello"
支持HTTP Signatures和Ed25519签名验证,需配置公钥文件(PEM格式):
bashexport WHD_TRUST_STORE_FILE=/path/to/pubkey.pem
bashcurl -X POST \ -H 'Date: Wed, 21 Oct 2015 07:28:00 GMT' \ -H 'Signature: keyId="my-key",algorithm="rsa-sha256",headers="(request-target) date",signature="base64-signature"' \ "http://localhost:8080/echo?msg=hello"
bashcurl -X POST \ -H 'X-Signature-Timestamp: ***' \ -H 'X-Signature-Ed25519: base64-signature' \ "http://localhost:8080/echo?msg=hello"
启用TLS加密:
bashdocker run -d --name=webhookd \ -v ${PWD}/scripts:/scripts \ -v ${PWD}/certs:/certs \ -p 443:443 \ -e WHD_TLS=true \ -e WHD_TLS_CERT_FILE=/certs/server.pem \ -e WHD_TLS_KEY_FILE=/certs/server.key \ ncarlier/webhookd
bashdocker run -d --name=webhookd \ -v ${PWD}/scripts:/scripts \ -v ${PWD}/acme:/acme \ -p 80:80 -p 443:443 \ -e WHD_TLS=true \ -e WHD_TLS_DOMAIN=hook.example.com \ ncarlier/webhookd
MIT许可证,详见LICENSE。
manifest unknown 错误
TLS 证书验证失败
DNS 解析超时
410 错误:版本过低
402 错误:流量耗尽
身份认证失败错误
429 限流错误
凭证保存错误
来自真实用户的反馈,见证轩辕镜像的优质服务