mnixry / nonebot-plugin-gocqhttp

一款在NoneBot2中直接运行go-cqhttp的插件, 无需额外下载安装 / A plugin to run go-cqhttp directly in NoneBot2, without additional download and installation.
https://pypi.org/project/nonebot-plugin-gocqhttp/
GNU Affero General Public License v3.0
320 stars 25 forks source link

如何配置监听IP使插件对外可以访问 #42

Open shoucandanghehe opened 2 years ago

shoucandanghehe commented 2 years ago

在服务器上部署时较难访问到127.0.0.1 可以添加一个可选配置 让用户能自定义后端监听IP

mnixry commented 2 years ago

监听IP选项是由NoneBot所控制的, 请参考文档进行修改

shoucandanghehe commented 2 years ago

明白了 还有两个问题

本项目是直接用nonebot2的ReversedDriver实现web服务的吗 如果公网直接暴露端口会不会有安全性问题,毕竟没有ssl加密之类

mnixry commented 2 years ago

本项目是直接用nonebot2的ReversedDriver实现web服务的吗

是, 具体来讲是基于NoneBot默认使用的FastAPI, 理论上有可能兼容其他ReverseDriver, 但是我不会

如果公网直接暴露端口会不会有安全性问题,毕竟没有ssl加密之类

有, 我的建议是为uvicorn配置HTTPS或者使用其他Web服务器(比如Caddy或者Nginx)进行反向代理

而且安全性问题不止SSL加密, 因为你在事实上也同时暴露了OneBot反向ws监听的接口, 所以你最好配置access_token, 或者只对外开放plugin-gocqhttp提供的接口(即/go-cqhttp路径下暴露的内容), 并配置WEBUI_PASSWORD等项目

P.S. 根据 #124 ,似乎uvicorn的HTTP/1.1在长时间连接的情况下性能会比较差,所以这也是推荐使用反代的一个理由

yhzcake commented 1 year ago

为了让本地其他设备可以访问127.0.0.1:8080/go-cqhttp用了nginx反代,连接状态显示断开,无法自动接收消息,需要手动点击刷新,请问有什么解决办法吗

mnixry commented 1 year ago

为了让本地其他设备可以访问127.0.0.1:8080/go-cqhttp用了nginx反代,连接状态显示断开,无法自动接收消息,需要手动点击刷新,请问有什么解决办法吗

传输实时日志使用的是WebSocket, Nginx需要额外的配置项来进行支持

Well2333 commented 1 year ago

为了让本地其他设备可以访问127.0.0.1:8080/go-cqhttp用了nginx反代,连接状态显示断开,无法自动接收消息,需要手动点击刷新,请问有什么解决办法吗

可以参考我的配置方法

location /<path_to_your_bot>/ {
        proxy_pass http://127.0.0.1:<port>/go-cqhttp/;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
}
yhzcake commented 1 year ago

为了让本地其他设备可以访问127.0.0.1:8080/go-cqhttp用了nginx反代,连接状态显示断开,无法自动接收消息,需要手动点击刷新,请问有什么解决办法吗

可以参考我的配置方法

location /<path_to_your_bot>/ {
        proxy_pass http://127.0.0.1:<port>/go-cqhttp/;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
}

请问location后面填的是本地路径还是网络路径?

Well2333 commented 1 year ago

是网络路径。

例如,你的bot绑定的端口是 11451, 然后希望用 https:///1919810/bot/ 这个地址访问bot的webui, 那么你可以这样填写

location /1919810/bot/ {
        proxy_pass http://127.0.0.1:11451/go-cqhttp/;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
}

这个配置本质上只是对请求进行了转发,并不会涉及到任何本地路径,就算你的bot不在这台服务器上,只要网络地址通畅依旧是可以访问的。

yhzcake commented 1 year ago

也就是说如果我想使用0.0.0.0:8000/go-cqhttp/访问这个网址只要填location /go-cqhttp/{...}就可以对吧

symbolworld commented 1 year ago

为了让本地其他设备可以访问127.0.0.1:8080/go-cqhttp用了nginx反代,连接状态显示断开,无法自动接收消息,需要手动点击刷新,请问有什么解决办法吗

我用的XShell这款软件的隧道功能,也能访问服务器上的本地。设置本地的侦听端口和目标主机的IP和端口,通过XShell连接上服务器后,就可以在本地访问目标主机的本地了。假设本地的侦听端口和服务器的端口都是12345,在本地输入:127.0.0.1:12345/go-cqhttp/就可以访问了。

Well2333 commented 1 year ago

为了让本地其他设备可以访问127.0.0.1:8080/go-cqhttp用了nginx反代,连接状态显示断开,无法自动接收消息,需要手动点击刷新,请问有什么解决办法吗

我用的XShell这款软件的隧道功能,也能访问服务器上的本地。设置本地的侦听端口和目标主机的IP和端口,通过XShell连接上服务器后,就可以在本地访问目标主机的本地了。假设本地的侦听端口和服务器的端口都是12345,在本地输入:127.0.0.1:12345/go-cqhttp/就可以访问了。

这并不是什么 xshell 的隧道功能,是 ssh 的隧道功能,你在任何有完整功能的 ssh 客户端和服务端间理论上都能完成此操作,只不过你需要首先创建隧道才能访问,某种程度上也是挺麻烦的