使用 Frp 在内网部署 GPT 并公网访问
引言
或许你看过我之前的文章中有讲过怎么注册 GPT、接入 GPT,甚至我有尝试在公网部署 GPT 项目,但是很无奈很快就被警告了(不要在公网部署 gpt 服务,容易被扫描到),只能自己在内网部署使用了;
内网在公司还很好用,但是一旦脱离了这个局域网,可能你还需要搭建 vp 服务才能实现访问(例如可以搭建:Tailscale,支持全平台),这需要在各个设备下载客户端用起来很不方便,特别是想让朋友使用的时候;
那么其实还有一种方案:穿透 ,可以方便的将公网地址反向代理到内网服务中。
注意: 作者之前是在阿里云部署 ShellClash 服务来实现调用 open-ai 接口,但请千万不要这么做,容易被阿里云扫描到并 fengjin 服务器。
需要什么
-
一台公网服务器(可以是各种云端服务器,作者是阿里云轻量服务器),并安装 Docker -
一台内网机器,并安装 Docker、ShellClash -
一个 🪜 订阅链接 -
一个 OpenAi Key
解释:
-
既然都有了公网服务器就不能直接部署?答: 不能,因为想要请求 open-ai 接口就不能使用国内服务器,但是在云端搭建 🪜 风险很大;除非你有香港云,并保证 ip 不会被 qiang; -
公网和内网机器分别是什么身份?答: 公网机器作为 frp-server,内网机器作为 frp-client,你可以认为像 Nginx 一样做了一层反向代理,将公网某个端口代理到了内网某个端口上; -
ShellClash 是什么?答: 如果你在 win 或 mac 平台用过 clash 就应该知道他是什么了;
Frp
Frp 是什么?
Frp(Fast Reverse Proxy)是一个高性能的反向代理服务器,它可以将内网中的服务暴露给公网,并提供了一系列安全和访问控制功能。Frp 采用 Golang 编写,支持跨平台运行,包括 Windows、Linux 和 Mac OS 等主流操作系统。
Frp 最常见的使用场景是在私有网络中使用,例如公司或家庭网络,以方便对外提供服务。通过配置 Frp 服务器,在公网上设置域名或 IP 地址即可访问内网中的应用程序或服务,例如 Web 应用程序、文件服务器、数据库等。
Frp 的核心特性包括以下几个方面:
-
高性能:Frp 采用高效的反向代理算法,具有低延迟和高吞吐量的优点,可以支持大规模并发连接。 -
安全性:Frp 支持多种认证方式,例如 Token、HTTP Basic Auth 等,可以保护内部服务免受未经授权的访问。 -
访问控制:Frp 支持通过 IP 地址、域名、TCP 端口等多种方式进行精细的访问控制,可以根据不同的需求设置不同的访问策略。 -
多种协议支持:Frp 支持 TCP、UDP、HTTP、HTTPS 等多种协议,可以满足不同类型服务的需求。 -
配置简单:Frp 的配置文件简单易懂,可以通过命令行工具或 Web 管理界面进行配置。
总之,Frp 是一个功能强大、高性能、安全可靠的反向代理服务器,可以在私有网络中提供对外服务,并支持多种协议和访问控制策略。
安装
注意:这里我只说如何在 Docker 下部署 frp 客户端和服务端,作者默认你已经有了 Docker 环境
公网 frp-server
在公网机器上,任意位置创建一个配置文件:vi /var/dev/frp/frps.ini
(文件地址可以任意)
[common]
# 监听端口
bind_port = 7000
# 面板端口
dashboard_port = 7001
# 登录面板账号设置
dashboard_user = username
dashboard_pwd = password
# 设置http及https协议下代理端口(非重要)
vhost_http_port = 7100
vhost_https_port = 7102
# 身份验证
token = tokenxxx
# 内网映射
[http]
type = http
# 内网机器的ip地址
local_ip = 192.168.1.1
# 要映射的端口,实际访问地址:公网ip:8190
local_port = 7002
下载并启动容器:
docker run --restart=always --network host -d -v /var/dev/frp/frps.ini:/etc/frp/frps.ini --name frps snowdreamtech/frps
执行后会下载snowdreamtech/frps
镜像,并启动frps
容器,查看docker ps
:

服务启动成功了,然后在阿里云控制台开放端口:7000、7001、7002

之后可以访问:公网IP:7001
访问 frps 的 UI 面板

如上就是启动成功了
内网 frp-client
重复上面的步骤,在内网机器部署 frp 客户端,编辑配置文件:vi /opt/dev/frp/frpc.ini
(文件路径可以任意)
[common]
# server_addr为FRPS服务器IP地址,公网IP地址
server_addr = 39.1.1.1
# server_port为服务端监听端口,bind_port,与frps.ini中保存一致
server_port = 7000
# 身份验证,与frps.ini中保存一致
token = tokenxxx
# 端口映射
[ssh]
type = tcp
# 本机地址,默认就127.0.0.1
local_ip = 127.0.0.1
# 本机要映射的服务端口
local_port = 8090
# 远程公网机器暴露的端口
remote_port = 7002
启动客户端:
docker run --restart=always --network host -d -v /opt/dev/frp/frpc.ini:/etc/frp/frpc.ini --name frpc snowdreamtech/frpc
如上会在内网机器上启动一个名为frpc
容器,镜像来自snowdreamtech/frpc
:

启动成功,到此为止 frp 服务已经搭建完成,可以在 frps 面板查看服务状态:

总结
上面的步骤,已经成功安装了 frps 和 frpc 服务,这时候我们可以通过访问:公网IP:7002
,frp 会将此请求反向代理到内网IP:8090
服务上。
可以看到,其实整个过程是利用 frp 的 server 和 client 端建立通道,将公网端口反向代理到了内网端口;我们仅仅是在公网机器 server 端建立了端口映射,并没有在公网机器上实际部署什么服务。
而在 Client 内网机器端,我们拿到这个端口映射隧道,就可以映射内网服务了,实际服务是部署在内网机器上。
GPT
这个部分的文章我在之前已经写过很多了(可以查看我的公众号历史文章),这里不再阐述;结合上面 frp 服务搭建,我们现在拿到了一个端口映射:外网7002 -> 内网8090
,接下来就需要在内网机器的 8090 端口上部署 GPT 服务;
如此便实现通过公网地址访问内网服务,并且无需在公网机器上部署项目。
如何部署 GPT 项目,这里我只推荐我个人认为比较好的开源项目:
https://github.com/Chanzhaoyu/chatgpt-web

作者在文档中已经提供了详细的项目部署方式并提供了 docker-compose 部署脚本,我们可以拿到一个 Key 快速搭建 GPT 服务,这里我就不再阐述具体过程了。
Clash
想要请求 open-ai 接口,必须有 🪜,这并不是部署了chatgpt-web
服务就能做到的,因此你还需要一个订阅地址;然后在 Linux 服务器上(也就是这里说的内网机器,也可以是 Windows)启动 Clash 并配置此订阅信息,这样才能顺利的使用chatgpt-web
项目。
具体的使用教程查看官方文档:https://github.com/juewuy/ShellClash/blob/master/README_CN.md
Nginx 配置
如上的chatgpt-web
项目也是分为 node 服务端和 vue 客户端,因此需要启动一个后端服务接口,并通过 nginx 映射前端静态页面访问地址;这里我粘贴下自己的 Nginx 配置:
server {
listen 8090;
server_name 192.168.1.1;
root /opt/dev/chat;
location ^~/api {
proxy_buffering off;
chunked_transfer_encoding on;
tcp_nopush on;
tcp_nodelay on;
proxy_pass http://127.0.0.1:3002;
proxy_connect_timeout 15s;
proxy_send_timeout 15s;
proxy_read_timeout 15s;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
add_header 'Access-Control-Allow-Origin' '*';
}
}
其中有很多人不知道如何实现 GPT 官网那种打字机模式的文本输出,其实是需要在 Nginx 上配置支持流文本输出功能,也就是如上配置:
proxy_buffering off;
chunked_transfer_encoding on;
tcp_nopush on;
tcp_nodelay on;
到此为止,当启动好 GPT 服务,并在内网可以通过192.168.1.1:8090
访问到 gpt-web 页面后,就可以使用公网IP:7002
访问本项目了。
静态 IP
如果你想要内网机器的某个服务,必须配置成固定 IP,不能再是由系统分配的随机 IP 了,如上面的192.168.1.1
就可以认为是一个我自己配置的静态 IP。
因为作者使用的 Ubuntu20.4 作为内网机器,因此修改静态 IP 也很方便,作者通过修改 netplan 实现固定 IP。
-
首先你应该通过 ifconfig
命令查看目前的内网地址:

在这里你能看到本机器的内网 IP192.168.5.104
是绑定在enp2s0
网卡上的,得到这个信息后接下来需要把这个网卡下的 IP 改成一个固定的静态 IP
-
编辑 vi /etc/netplan/01-network-manager-all.yaml
,填写如下内容
network:
version: 2
renderer: NetworkManager
ethernets:
enp2s0: # 网卡名称
dhcp4: no # 关闭dhcp
dhcp6: no
addresses: [192.168.5.104/24] # 静态ip
gateway4: 192.168.5.253 # 网关
nameservers:
addresses: [8.8.8.8, 114.114.114.114] #dns
这里特别要注意网卡名称和上面ifconfig
查询到的网卡统一,然后下面 IP 地址改为你需要的地址
-
执行 netplan apply
使配置生效,然后重新查看本机 IP 或者重启电脑验证 IP 是否改变
联系我
-
个人博客:http://tycoding.cn -
GitHub:https://github.com/tycoding -
微信公众号:程序员涂陌 -
QQ 交流群:866685601
原文始发于微信公众号(程序员涂陌):使用Frp在内网部署GPT并公网访问
暂无评论内容