1Panel icon indicating copy to clipboard operation
1Panel copied to clipboard

[FEATURE] 增加 webhook 功能

Open skywalker512 opened this issue 2 years ago • 16 comments

1Panel 版本

v1.0.3

请描述您的需求或者改进建议

类似 portainer 对 docker 容器增加 webhook 功能,能结合到 devops 中

请描述你建议的实现方案

No response

附加信息

No response

skywalker512 avatar Mar 26 '23 00:03 skywalker512

感谢反馈,后续版本我们会考虑增加容器 webhook 功能。

wanghe-fit2cloud avatar Mar 26 '23 02:03 wanghe-fit2cloud

所以说,增加了webhook了嘛?

jianjianxu avatar Jul 22 '24 08:07 jianjianxu

我有一个例子给大家参考,我直接在openresty 的nginx配置文件中直接增加以下代码可以完成webhook相同的功能。

    location /.githook.sh {
        content_by_lua_block {
            local handle = io.popen("cd /www/sites/example.com/index/ && sh /www/sites/example.com/index/.githook.sh")
            local result = handle:read("*a")
            handle:close()
            ngx.say(result)
        }
    }

然后在 .githook.sh中 放入git pull 命令,请求 example.com/.githook.sh 就会更新最新的代码了。

penndev avatar Jul 29 '24 15:07 penndev

牛逼,感谢了

jianjianxu avatar Jul 29 '24 23:07 jianjianxu

考虑一年多了,没有webhook每次都要到服务器上去pull代码,尤其是在开发服务器上,这个操作会很频繁,希望可以更新

tobycroft avatar Aug 20 '24 13:08 tobycroft

考虑一年多了,没有webhook每次都要到服务器上去pull代码,尤其是在开发服务器上,这个操作会很频繁,希望可以更新

这个通过 webhook 来做的话是怎么个流程呀?webhook 被调用后触发什么操作呢?

wan92hen avatar Aug 21 '24 03:08 wan92hen

考虑一年多了,没有webhook每次都要到服务器上去pull代码,尤其是在开发服务器上,这个操作会很频繁,希望可以更新

这个通过 webhook 来做的话是怎么个流程呀?webhook 被调用后触发什么操作呢?

比如gitlab提交后会通过webhook访问面板某个对外的端口,提供accesskey后服务器执行git pull命令,命令内容固化在本地,安全性高,可以参考宝塔webhook,这样只有在代码更新后才会触发这个操作,是否触发可以在git服务器中配置

如果没有webhook,更新依然可以使用ssh模拟登录服务器完成,这也是我目前更新的方式,但是这样始终不太好

再者没有webhook又要安全性依然可以通过本地脚本轮询的方式完成,但是这样就会有一个脚本一直再pull又或者访问更新接口,这样总之是没有webhook来的干净的

又因为1panel目录结构设计,这就导致如果要更新代码需要进入很深的层级,抛开方便性,如果不写脚本,就需要进入很深的路径,如果写脚本手动执行更新,也不是不行,但是,网站多了管理起来就不是很方便,而我的应用场景又是一个服务器上有众多项目众多网站的,这就会提高人治的下限

对了这一点对PHP网站来说会显得很重要,因为我在做go和java项目的时候都是编译好二进制传服务器的所以反而不会有需要webhook的地方~~,所以我一度认为1panel的官方可能不太能理解到phper的这个诉求,所以搁置了这么久~~

那么如果有webhook的情况下,甚至是golang二进制项目的部署也可以设定成在发布release后触发hook,再让hook下载这个文件替代本地的,这样安全性也一定程度上提高了

tobycroft avatar Aug 21 '24 04:08 tobycroft

这个场景看起来用上面评论里的方案还挺合适的,当然 1Panel 能直接提供类似功能的话肯定更好。

https://github.com/1Panel-dev/1Panel/issues/410#issuecomment-2256258671

我有一个例子给大家参考,我直接在openresty 的nginx配置文件中直接增加以下代码可以完成webhook相同的功能。

    location /.githook.sh {
        content_by_lua_block {
            local handle = io.popen("cd /www/sites/example.com/index/ && sh /www/sites/example.com/index/.githook.sh")
            local result = handle:read("*a")
            handle:close()
            ngx.say(result)
        }
    }

然后在 .githook.sh中 放入git pull 命令,请求 example.com/.githook.sh 就会更新最新的代码了。

wan92hen avatar Aug 21 '24 05:08 wan92hen

这个场景看起来用上面评论里的方案还挺合适的,当然 1Panel 能直接提供类似功能的话肯定更好。

#410 (comment)

我有一个例子给大家参考,我直接在openresty 的nginx配置文件中直接增加以下代码可以完成webhook相同的功能。

    location /.githook.sh {
        content_by_lua_block {
            local handle = io.popen("cd /www/sites/example.com/index/ && sh /www/sites/example.com/index/.githook.sh")
            local result = handle:read("*a")
            handle:close()
            ngx.say(result)
        }
    }

然后在 .githook.sh中 放入git pull 命令,请求 example.com/.githook.sh 就会更新最新的代码了。

这我看见了,是一个临时的解决方案,但是真的网站数量多起来有些狼狈

我现在的临时解决方案是写了一个类似aapanel的webhook功能,用supervisor跑起来挂后台,代码很简单,就是在当前执行的文件夹中找到access_key在exec文件夹下对应的.sh文件,如果有就执行,如果没有就返回错误。能用,也解决了我随时添加sh随时删除sh的期待,而且不会影响到nginx,但这样我觉的还是不如坐在1panel里面来的优雅,但是也解决了,多网站多目录单独配置的问题以及集中鉴权的问题

主要还是降低了脑子迷糊的时候犯大错的可能

package app

import (
	"errors"
	"fmt"
	"github.com/gin-gonic/gin"
	"main.go/tuuz/Input"
	"main.go/tuuz/RET"
	"net/url"
	"os"
	"os/exec"
	"strings"
)

func WebhookController(c *gin.Context) {
	//http://127.0.0.1:888/hook?access_key=123&param=aaa
	access_key, ok := Input.Get("access_key", c, false)
	if !ok {
		return
	}
	re, err := ExecFile(access_key)
	if err != nil {
		RET.Fail(c, 500, re, err.Error())
	} else {
		RET.Success(c, 0, re, re)
	}
}

func ExecFile(filename string) (string, error) {
	filename = url.QueryEscape(filename)
	filename = strings.ReplaceAll(filename, ".", "")
	filename = strings.ReplaceAll(filename, "%", "")
	filename = strings.ReplaceAll(filename, "&", "")
	fmt.Println("./exec/" + filename + ".sh")
	if _, err := os.Stat("./exec/" + filename + ".sh"); os.IsNotExist(err) {
		return "未找到文件", errors.New("未找到文件")
	}
	// 文件存在,执行.sh脚本
	out, err := exec.Command("/bin/bash", "./exec/"+filename+".sh").Output()
	if err != nil {
		return "", err
	}

	// 返回执行结果
	return string(out), nil
}

主要作者这块是怎么考虑的,会不会觉得合进面板不合适,还是单纯没有人提PR所以一直没加

tobycroft avatar Aug 21 '24 06:08 tobycroft

希望增加 webhook,方便自动 git pull

cuteys avatar Aug 27 '24 14:08 cuteys

https://github.com/1Panel-dev/1Panel/issues/410#issuecomment-2301196351

和这个有些类似,感觉还不错 https://github.com/ncarlier/webhookd/

AeroWang avatar Oct 10 '24 07:10 AeroWang

请问这个问题有进展吗?

maninhill avatar Dec 19 '24 13:12 maninhill

有下文了吗?需要部署的还是很频繁的,希望尽快能加上

orangelckc avatar Dec 29 '24 17:12 orangelckc

我有一个例子给大家参考,我直接在openresty 的nginx配置文件中直接增加以下代码可以完成webhook相同的功能。

location /.githook.sh {
    content_by_lua_block {
        local handle = io.popen("cd /www/sites/example.com/index/ && sh /www/sites/example.com/index/.githook.sh")
        local result = handle:read("*a")
        handle:close()
        ngx.say(result)
    }
}

然后在 .githook.sh中 放入git pull 命令,请求 example.com/.githook.sh 就会更新最新的代码了。

这个只能更新openresty底下的网站,无法跳出docker的虚拟路径,是否有其他方法

chenjinjun avatar Apr 22 '25 06:04 chenjinjun

我有一个例子给大家参考,我直接在openresty 的nginx配置文件中直接增加以下代码可以完成webhook相同的功能。

location /.githook.sh {
    content_by_lua_block {
        local handle = io.popen("cd /www/sites/example.com/index/ && sh /www/sites/example.com/index/.githook.sh")
        local result = handle:read("*a")
        handle:close()
        ngx.say(result)
    }
}

然后在 .githook.sh中 放入git pull 命令,请求 example.com/.githook.sh 就会更新最新的代码了。

要是有人对着这网址狂按F5......

miniwater avatar May 13 '25 12:05 miniwater