ChatGPTNextWeb / ChatGPT-Next-Web

A cross-platform ChatGPT/Gemini UI (Web / PWA / Linux / Win / MacOS). 一键拥有你自己的跨平台 ChatGPT/Gemini 应用。
https://app.nextchat.dev/
MIT License
74.96k stars 58.98k forks source link

socks5/http/https proxy #120

Closed MrThanlon closed 1 year ago

MrThanlon commented 1 year ago

WIP

wk-mike commented 1 year ago

是由于nodejs不支持http_proxy导致的,https://github.com/Yidadaa/ChatGPT-Next-Web/issues/166

Yidadaa commented 1 year ago

已被 BASE_URL 替代。 #172

MrThanlon commented 1 year ago

已被 BASE_URL 替代。 #172

不冲突,两者都可以有,BASE_URL仍然需要配置反向代理

MrThanlon commented 1 year ago

@Yidadaa 请求重新打开

jeanlyn commented 1 year ago

是的, 代理跟BASE_URL不冲突, 可以参考另一项目的做法: https://github.com/ddiu8081/chatgpt-demo

Yidadaa commented 1 year ago

考虑使用 undici 的 fetch api:

https://github.com/nodejs/undici#undicifetchinput-init-promise

Yidadaa commented 1 year ago

需要考虑的因素:

wenerme commented 1 year ago

@Yidadaa 可以 Docker 镜像使用 node-fetch,加代理检测,用 node 16

gaogao1030 commented 1 year ago

这个有个本地开发的方案可以参考下。 本地的科学上网客户端一般都会有本地http代理端口和地址, 那么node-fetch的参数 agent 就可以设置代理服务器。 Openai那的接口我科学服务器上做了反代处理所以我只需要处理抓取提示词这边就行(不代理有时候会报请求被重置的错误)。具体代码可以参考https://github.com/gaogao1030/ChatGPT-Next-Web/commit/bdfddb85617ba33d84d723a184f7ef5d7a585029

GrayXu commented 1 year ago

希望这个能加入到Roadmap里

gdmec07150942 commented 1 year ago

这个有个本地开发的方案可以参考下。 本地的科学上网客户端一般都会有本地http代理端口和地址, 那么node-fetch的参数 agent 就可以设置代理服务器。 Openai那的接口我科学服务器上做了反代处理所以我只需要处理抓取提示词这边就行(不代理有时候会报请求被重置的错误)。具体代码可以参考gaogao1030@bdfddb8

我试过了,但是会报错 [Fetch] failed to fetch cn prompts FetchError: request to https://cdn.jsdelivr.net/gh/PlexPt/awesome-chatgpt-prompts-zh@main/prompts-zh.json failed, reason: Client network socket disconnected before secure TLS connection was established

Yidadaa commented 1 year ago

目前问题比较复杂,貌似 nextjs 无法通过环境变量来指定 runtime,导致无法同时兼容 edge function 部署与本地部署。

quark-zju commented 1 year ago

如果你有 Linux 可以试试看 proxychains,理论上可以让动态链接到 libc 的程序(包括 node)强行使用代理。

etodong commented 1 year ago

作者是 部署到国内还是国外了, 你的demo 国内访问很快,需要在服务器端配置代理吗,我新手,代码看的比较慢哦~

nenryo commented 1 year ago

如果你有 Linux 可以试试看 proxychains,理论上可以让动态链接到 libc 的程序(包括 node)强行使用代理。

有类似的需求,用作者的 docker image 重新 build 试了下是可以的

FROM yidadaa/chatgpt-next-web:latest
WORKDIR /app

RUN apk add --no-cache proxychains-ng

ENV OPENAI_API_KEY=""
ENV CODE=""

EXPOSE 3000

CMD ["proxychains", "node","server.js"]
wenerme commented 1 year ago

pr #295 镜像 wener/chatgpt-next-web:latest

打算维护一个 standalone 的 fork

yoko-murasame commented 1 year ago

我这里维护了一份基于 proxychains 重新打包 作者的 docker image的分支,只需要自己build后启动,可以在启动时指定代理参数了(我自己已经在使用中,暂时没发现啥问题),具体看文档:https://github.com/yoko-murasame/ChatGPT-Next-Web/blob/main/DockerfileForProxy/readme.md

gaogao1030 commented 1 year ago

这个有个本地开发的方案可以参考下。 本地的科学上网客户端一般都会有本地http代理端口和地址, 那么node-fetch的参数 agent 就可以设置代理服务器。 Openai那的接口我科学服务器上做了反代处理所以我只需要处理抓取提示词这边就行(不代理有时候会报请求被重置的错误)。具体代码可以参考gaogao1030@bdfddb8

我试过了,但是会报错 [Fetch] failed to fetch cn prompts FetchError: request to https://cdn.jsdelivr.net/gh/PlexPt/awesome-chatgpt-prompts-zh@main/prompts-zh.json failed, reason: Client network socket disconnected before secure TLS connection was established

检查一下是不是用错端口了,注意要用科学上网工具上的本机 http 监听端口不是sock端口。因为node-fetch的请求走的是http(注意agent模块是https-proxy-agent不是http-proxy-agent,因为目标地址是https)。还有就是确保下科学上网工具是通的。(建议在全局模式下测试)。 补充一下我的信息:我这里使用的是v2ray,本机监听http端口是1087,所以这里我配置的就是1087端口。(截止回复这条消息前跑了下没有问题)(我之前一直用proxychinas也算是个解决方案,只不过跑npm run dev的时候有点问题。得改下package.json 把 npm run fetch 和 next dev 拆开来跑,前者加前缀后者不加。) 对了,你可以尝试问下chat-gpt:nodejs fetch 如何使用本地代理。你可以看下gpt的回答作为参考。

Yidadaa commented 1 year ago

@yoko-murasame 这个方案看起来是唯一可行的方案,稍后我会更新到主线

ghost commented 1 year ago

@Yidadaa @yoko-murasame

654 这个PR很棒,启动容器的时候多加一个环境变量PROXY_URL,容器内的node调用chatgpt api时就会走PROXY_URL指定的代理了。

我的容器已经用上了最新的代码,效果很好。我用到的环境变量是这样的:

OPENAI_API_KEY: "xxx"
CODE: "user1,user2"
PROXY_URL: "socks5://172.33.33.33:9088"

如果要用http/https代理,改成这样就可以了

PROXY_URL: "http://172.33.33.33:9088"
PROXY_URL: "https://172.33.33.33:9088"
Yidadaa commented 1 year ago

已经合入主线。