使用Frp在内网部署GPT并公网访问

使用 Frp 在内网部署 GPT 并公网访问

引言

或许你看过我之前的文章中有讲过怎么注册 GPT、接入 GPT,甚至我有尝试在公网部署 GPT 项目,但是很无奈很快就被警告了(不要在公网部署 gpt 服务,容易被扫描到),只能自己在内网部署使用了;

内网在公司还很好用,但是一旦脱离了这个局域网,可能你还需要搭建 vp 服务才能实现访问(例如可以搭建:Tailscale,支持全平台),这需要在各个设备下载客户端用起来很不方便,特别是想让朋友使用的时候;

那么其实还有一种方案:穿透 ,可以方便的将公网地址反向代理到内网服务中。

注意: 作者之前是在阿里云部署 ShellClash 服务来实现调用 open-ai 接口,但请千万不要这么做,容易被阿里云扫描到并 fengjin 服务器。

需要什么

  1. 一台公网服务器(可以是各种云端服务器,作者是阿里云轻量服务器),并安装 Docker
  2. 一台内网机器,并安装 Docker、ShellClash
  3. 一个 🪜 订阅链接
  4. 一个 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 的核心特性包括以下几个方面:

  1. 高性能:Frp 采用高效的反向代理算法,具有低延迟和高吞吐量的优点,可以支持大规模并发连接。
  2. 安全性:Frp 支持多种认证方式,例如 Token、HTTP Basic Auth 等,可以保护内部服务免受未经授权的访问。
  3. 访问控制:Frp 支持通过 IP 地址、域名、TCP 端口等多种方式进行精细的访问控制,可以根据不同的需求设置不同的访问策略。
  4. 多种协议支持:Frp 支持 TCP、UDP、HTTP、HTTPS 等多种协议,可以满足不同类型服务的需求。
  5. 配置简单: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

使用Frp在内网部署GPT并公网访问
image-20230510170910310

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

使用Frp在内网部署GPT并公网访问
image-20230510173019640

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

使用Frp在内网部署GPT并公网访问
image-20230510171313954

如上就是启动成功了

内网 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在内网部署GPT并公网访问
image-20230510172337649

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

使用Frp在内网部署GPT并公网访问
image-20230510172540502

总结

上面的步骤,已经成功安装了 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

使用Frp在内网部署GPT并公网访问
cover2

作者在文档中已经提供了详细的项目部署方式并提供了 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。

  1. 首先你应该通过ifconfig命令查看目前的内网地址:
使用Frp在内网部署GPT并公网访问
image-20230510175814842

在这里你能看到本机器的内网 IP192.168.5.104是绑定在enp2s0网卡上的,得到这个信息后接下来需要把这个网卡下的 IP 改成一个固定的静态 IP

  1. 编辑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 地址改为你需要的地址

  1. 执行netplan apply使配置生效,然后重新查看本机 IP 或者重启电脑验证 IP 是否改变

联系我

  • 个人博客:http://tycoding.cn
  • GitHub:https://github.com/tycoding
  • 微信公众号:程序员涂陌
  • QQ 交流群:866685601

原文始发于微信公众号(程序员涂陌):使用Frp在内网部署GPT并公网访问

© 版权声明
THE END
喜欢就支持一下吧
点赞9 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容