Docker下Gogs设置Webhook推送Spug,踩坑记录与解决方案
记录在Docker部署下的Gogs,成功配置通过内网 Webhook 推送到 Spug 实现自动化部署。
一、背景
项目需求是:
-
使用 Gogs 管理 Git 仓库;
-
使用 Spug 进行持续部署;
-
利用 Gogs 的 Webhook,在代码 push 后自动触发 Spug 接口部署。
二、环境说明
-
系统:CentOS 7
-
Gogs 版本:
0.14.0+dev
-
运行方式:Docker
-
Gogs 映射端口:
-
0.0.0.0:444 --> 3000/tcp
(Gogs Web) -
0.0.0.0:445 --> 22/tcp
(SSH)
-
三、遇到的问题及解决过程
1、端口冲突或权限不足(bind: permission denied)
Gogs 启动时报错:
[FATAL] Failed to start server: listen tcp 0.0.0.0:444: bind: permission denied
解决方法:
使用 Docker 启动时已经映射了 0.0.0.0:444 --> 3000
,不需要再在容器中监听该端口。
-
确保 Gogs 的
app.ini
中监听的是容器内部端口:
[server] HTTP_PORT = 3000 # 容器内监听3000,Docker映射为444
-
重启容器后解决:
docker restart gogs
2、Webhook 提交失败,本地网络被禁止访问
使用 Webhook 向 Spug 发送部署请求:
http://xx.com/api/apis/deploy/3/branch/?name=master
Gogs 报错:
webhook 被解析到默认禁用的本地网络地址
问题原因:
Gogs 为了安全,默认禁止 Webhook 请求内网地址(如
192.168.*
或*.local
等),以防 SSRF。
解决方法:
配置白名单 LOCAL_NETWORK_ALLOWLIST
,编辑容器内配置文件 /data/gogs/conf/app.ini
:
# 替换为你实际运行 Spug 服务的 IP 或域名
# 192.168.20.111 是我部署 Spug 的服务器内网 IP;
[security] LOCAL_NETWORK_ALLOWLIST = 192.168.20.111
✅ 注意:配置后必须重启容器才能生效。
docker restart gogs
四、总结
这个过程踩了不少坑,关键点如下:
问题 | 解决方案 |
---|---|
bind: permission denied | 改回容器内监听3000端口,使用 Docker 映射 |
Webhook 不能访问内网地址 | 配置 [security] LOCAL_NETWORK_ALLOWLIST |