方块糖的工坊
方块糖的工坊

搭建墙内ChatGPT

本文的目标是搭建一个可墙内访问的ChatGPT,使用的Github上开源的chatgpt-web

该项目支持双模型,提供了两种非官方 ChatGPT API 方法

方式免费?可靠性质量
ChatGPTAPI(gpt-3.5-turbo-0301)可靠相对较笨
ChatGPTUnofficialProxyAPI(网页 accessToken)相对不可靠聪明

本文介绍第二种,即accessToken的方式。

首先,访问这里获取你的AccessToken(得先web登录chatgpt)

image-20240104202136930

在服务器任意目录创建docker-compose.yml

ninja版本(推荐)

version: '3'

services:
  app:
    image: chenzhaoyu94/chatgpt-web # 总是使用 latest ,更新时重新 pull 该 tag 镜像即可
    container_name: chatWeb
    #network_mode: "host"
    ports:
      - 23002:3002
    environment:
      #OPENAI_API_KEY: ""
      # 二选一
      OPENAI_ACCESS_TOKEN: "eyJhbGciOiJSUzI1NiIsIn***"
      # API接口地址,可选,设置 OPENAI_API_KEY 时可用
      #OPENAI_API_BASE_URL: xxxx
      # 反向代理,
      API_REVERSE_PROXY: http://本机IP:8080/backend-api/conversation
      # 超时,单位毫秒,可选
      #OPENAI_API_MODEL: gpt-3.5-turbo
      TIMEOUT_MS: 60000
      # 每小时最大请求次数,可选,默认无限
      MAX_REQUEST_PER_HOUR: 500
      # Socks代理,可选,和 SOCKS_PROXY_PORT 一起时生效
      SOCKS_PROXY_HOST: 172.17.0.1
      # Socks代理端口,可选,和 SOCKS_PROXY_HOST 一起时生效
      SOCKS_PROXY_PORT: 7890
    networks:
      - blog_default
  ninja:
    image: gngpp/ninja:latest
    container_name: ninja
    restart: unless-stopped
    environment:
      - TZ=Asia/Shanghai
      - PROXIES=http://本机IP:7890
      #socks5://host:port
    command: run
    ports:
      - 8080:7999
    networks:
      - blog_default
  watchtower:
    container_name: watchtower
    image: containrrr/watchtower
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
    command: --interval 3600 --cleanup
    restart: unless-stopped
networks:
  blog_default:
    external: true

go-chatgpt-api版本(该项目作者以弃坑,github上显示2023.10.24已经archived)

version: '3'

services:
  app:
    image: chenzhaoyu94/chatgpt-web
    container_name: chatWeb
    #network_mode: "host"
    ports:
      - 23002:3002
    environment:
      # 二选一
      #OPENAI_API_KEY: "sk-VChNlxZJQVl6mfA3xeqm*****"
      # 二选一
      # 将上面得到的accessToken填入
      OPENAI_ACCESS_TOKEN: "eyJhbGciOiJSUzI1N*****"
      # API接口地址,可选,设置 OPENAI_API_KEY 时可用
      #OPENAI_API_BASE_URL: xxxx
      # 反向代理
      API_REVERSE_PROXY: http://172.21.0.3:8080/chatgpt/backend-api/conversation
      # 超时,单位毫秒,可选
      OPENAI_API_MODEL: gpt-3.5-turbo
      TIMEOUT_MS: 60000
      # 每小时最大请求次数,可选,默认无限
      MAX_REQUEST_PER_HOUR: 500
      # Socks代理,可选,和 SOCKS_PROXY_PORT 一起时生效
      SOCKS_PROXY_HOST: 172.17.0.1
      # Socks代理端口,可选,和 SOCKS_PROXY_HOST 一起时生效
      SOCKS_PROXY_PORT: 7890
    networks:
      - blog_default
  go-chatgpt-api:
    container_name: go-chatgpt-api
    image: linweiyuan/go-chatgpt-api
    ports:
      - 8080:8080         # 容器端口映射到宿主机8080端口;宿主机监听端口可按需改为其它端口
    #network_mode: host   # 可选,将容器加入主机网络模式,即与主机共享网络命名空间;上面的端口映射将失效
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock:ro
    environment:
      - TZ=Asia/Shanghai
      - PROXY=http://172.17.0.1:7890
    restart: unless-stopped
networks:
  blog_default:
    external: true

PROXY是你的fan墙代理,如果你是墙外的主机就不需要配置。

API_REVERSE_PROXY是ChatGPT反代服务,参考的另一个开源项目ChatGPT-Proxy

OpenAI提供了两种访问方式,一种是直接在ChatGPT网页端使用的Access Token方式,这种方式可以免费使用GPT-3.5模型,只需要登录即可使用。但缺点是不稳定,且无法扩展。另一种是使用API,注册用户可以获得5美元的赠送额度,但使用完之后就需要付费。这种方式相对更稳定,但缺点是赠送额度较少且存在限流,目前是3条/分钟。

因此,对于那些希望免费使用OpenAI GPT-3.5模型的用户来说,选择Access Token方式是比较好的选择。但是需要解决的问题是不稳定以及可能IP被封禁的问题。为了解决这些问题,我们可以自建反向代理服务来提高稳定性,并保护我们的IP地址不被OpenAI封禁。也有一些公共的反向代理服务可以选择使用,但是很不稳定,因为它们是免费共享的。所以自建反向代理服务是一个不错的选择

nginx配置

server {

        listen 443 ssl http2;
        listen [::]:443 ssl http2;

        server_name chat.guitang.fun;

        # 防止爬虫抓取
        if ($http_user_agent ~* "360Spider|JikeSpider|Spider|spider|bot|Bot|2345Explorer|curl|wget|webZIP|qihoobot|Baiduspider|Googlebot|Googlebot-Mobile|Googlebot-Image|Mediapartners-Google|Adsbot-Google|Feedfetcher-Google|Yahoo! Slurp|Yahoo! Slurp China|YoudaoBot|Sosospider|Sogou spider|Sogou web spider|MSNBot|ia_archiver|Tomato Bot|NSPlayer|bingbot")
        {
                return 403;
        }

        proxy_set_header   Host             $host;
        proxy_set_header   X-Real-IP        $remote_addr;
        proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;
        proxy_cache off;
        proxy_cache_bypass $http_pragma;
        proxy_cache_revalidate on;
        proxy_http_version 1.1;
        proxy_buffering off;

        # 前提是加入nginx的网络
        # docker network connect blog_default chatWeb
        location / {
                proxy_pass http://chatWeb:3002/;
        }

        # certs sent to the client in SERVER HELLO are concatenated in ssl_certificate
        ssl_certificate /etc/nginx/conf.d/10276600_chat.guitang.fun_nginx/chat.guitang.fun.pem;
        ssl_certificate_key /etc/nginx/conf.d/10276600_chat.guitang.fun_nginx/chat.guitang.fun.key; ssl_session_timeout 1d;
        ssl_session_cache shared:MozSSL:10m; # about 40000 sessions
        ssl_session_tickets off;
}

接下来就大功告成啦,看看效果吧

PixPin_2024-01-04_20-12-48

发表回复

textsms
account_circle
email

方块糖的工坊

搭建墙内ChatGPT
本文的目标是搭建一个可墙内访问的ChatGPT,使用的Github上开源的chatgpt-web 该项目支持双模型,提供了两种非官方 ChatGPT API 方法 方式免费?可靠性质量ChatGPTAPI(gpt-3.5-turb…
扫描二维码继续阅读
2024-01-04