【ChatGPT】基于WSL+Docker的ChatGPT PLUS共享服务部署

最近买了ChatGPT PLUS服务,想通过web服务将它共享给其他人使用,搜了一下目前GitHub上比较热门的服务有

其中chatgpt-web-share支持API和PLUS账号分享两种方式,且架构为Python+JS+Docker,相对比较熟悉一些。而ChatGPT-Next-Web使用纯JS开发,且使用方式更为"傻瓜",导致灵活性不足。所以我选择chatgpt-web-share。

准备

运行环境

  • Windows11
    • WSL2
      • Docker
    • 小猫咪
    • 无线网卡DHCP(互联网)
    • 有线网卡10.8.15.50(公司内网)

版本

我这里使用chatgpt-web-share的最新版本0.4.0-alpha4.4

配置文件

最终的目录结构如下,需要先创建docker-compose.yml、data目录、config目录、config目录下的config.yaml、credentials.yaml,绿框中的是自动生成的目录及文件。

yaml 复制代码
# docker-compose.yml
services:
  chatgpt-web-share:
    image: ghcr.io/moeakwak/chatgpt-web-share:0.4.0-alpha4.4
    container_name: cws
    restart: always
    ports:
      - 8092:80  #端口可调整
    volumes:
      - ./data:/app/backend/data
    environment:
      - TZ=Asia/Shanghai
      - CWS_CONFIG_DIR=/app/backend/data/config
      - CHATGPT_BASE_URL=http://go-chatgpt-api:8080/chatgpt/
    depends_on:
      - mongo
      - go-chatgpt-api

  mongo:
    image: mongo:6.0
    restart: always
    volumes:
      - ./mongo_data:/data/db
    environment:
      MONGO_INITDB_DATABASE: cws
      MONGO_INITDB_ROOT_USERNAME: cws
      MONGO_INITDB_ROOT_PASSWORD: password

  go-chatgpt-api:
    container_name: go-chatgpt-api
    image: linweiyuan/go-chatgpt-api:latest
    environment:
      - GIN_MODE=release
      - PROXY=http://10.30.48.245:7890 #宿主机IP端口
    restart: unless-stopped
yaml 复制代码
# config.yaml
openai_web:
  is_plus_account: true
  chatgpt_base_url: http://go-chatgpt-api:8080/chatgpt/backend-api/
  proxy:
  common_timeout: 10
  ask_timeout: 600
openai_api:
  openai_base_url: https://api.openai.com/v1/
  proxy:
  connect_timeout: 10
  read_timeout: 20
common:
  print_sql: false
  create_initial_admin_user: true
  initial_admin_user_username: admin
  initial_admin_user_password: password
  sync_conversations_on_startup: true
  sync_conversations_regularly: false
http:
  host: 127.0.0.1
  port: 8000
  cors_allow_origins:
    - http://localhost
    - http://127.0.0.1
    - http://0.0.0.0
data:
  data_dir: ./data
  database_url: sqlite+aiosqlite:///data/database.db
  mongodb_url: mongodb://cws:password@mongo:27017
  run_migration: false
auth:
  jwt_secret: MODIFY_THIS_TO_RANDOM_SECRET
  jwt_lifetime_seconds: 86400
  cookie_max_age: 86400
  cookie_name: user_auth
  user_secret: MODIFY_THIS_TO_RANDOM_SECRET
stats:
  ask_stats_ttl: 7776000
  request_stats_ttl: 2592000
  request_stats_filter_keywords:
    - /status
log:
  console_log_level: INFO
yaml 复制代码
# credentials.yaml
openai_web_access_token: "eyJhbGcxxxxxxxxxxx"
openai_api_key: "sk-POxxxxxxxx"

access_token获取链接:https://chat.openai.com/api/auth/session

api_key生成链接:https://platform.openai.com/account/api-keys

ladder

众所周知的原因docker pull官方镜像源非常慢,需要加速,方式见我另一篇

除此之外,容器内也需要ladder,可以通过修改docker-compose.yml文件,使go-chatgpt-api服务使用宿主机的代理

yaml 复制代码
...
  go-chatgpt-api:
    container_name: go-chatgpt-api
    image: linweiyuan/go-chatgpt-api:latest
    environment:
      - GIN_MODE=release
      - PROXY=http://10.30.48.245:7890 #宿主机IP端口
    restart: unless-stopped

部署

bash 复制代码
docker compose up -d

部署成功后可以看到日志如下:

浏览器打开127.0.0.1:80920.0.0.0:8092172.23.192.1:8092就能看到登录页面,账号密码为配置文件中的admin和password

外部访问

上面正常就说明基本完成部署了,但如果想让其他用户从外部访问就需要进行端口映射,因为你通过本机ip:8092会发现无法打开,需要进行端口映射。

不建议使用如下方式



之后一路下一页就行了。

再用管理员权限打开powershell

bash 复制代码
netsh interface portproxy add v4tov4 listenport=8092 listenaddress=0.0.0.0 connectport=8092 connectaddress=localhost 

通过以上命令,就将0.0.0.0:8092映射给了localhost:8092,所以如果电脑有多块网卡,则通过任一网卡ip:8092就能访问到localhost:8092了,所以就实现外部访问了。具体可以参考:https://zhuanlan.zhihu.com/p/425312804

20230801更新

通过上述方式出现:重启后,8092端口无法访问,需要通过如下命令删除映射

bash 复制代码
>>> netsh interface portproxy delete v4tov4 listenport=8092 listenaddress=0.0.0.0

更建议使用wsl2-auto-portproxy

在/mnt/c/Users/microfat 目录下创建.wslpp目录,在.wslpp目录下创建config.json

json 复制代码
{
  "onlyPredefined": true,
  "predefined": {
    "tcp": [
      "8092:8092"
    ]
  },
  "ignore": {
    "tcp": [
      445
    ]
  }
}

注意:如果ladder怎么也进不去wsl2,则可以试试打开小猫咪的TUN Mode


如果出现上面的错误,尝试重启一下服务

bash 复制代码
>>> docker compose down --rmi local
>>> docker compose up -d

优化

现在能够做到重启机器后,服务自动启动。但前提是无线网卡的IP地址不发生变化,因为代理地址被写死到/etc/systemd/system/docker.service.d/proxy.conf、/etc/default/docker和docker-compose.yml中,如果IP地址发生变化就需要更新文件并重启docker以及重新构建镜像。为了减少这部分工作,可以考虑在wsl启动时自动更新那两个文件。

首先要解决的问题是wsl中获取宿主电脑的ip地址

bash 复制代码
>>> NEW_IP=$(powershell.exe -Command 'Get-NetIPAddress -InterfaceAlias WLAN | Where-Object { $_.AddressFamily -match "IPv4" } | Select-Object -ExpandProperty IPAddress' | tr -d '\r')
>>> echo $NEW_IP
10.30.48.222

随后可以通过sed命令修改上述文件

bash 复制代码
sudo sed -i -E "s/[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+/${NEW_IP}/g" /etc/default/docker

将修改命令添加到/etc/wsl.conf中,就可以以实现在启动docker前配置文件修改完成,注意:不要放在.bashrc中,因为bashrc的执行在/etc/wsl.conf后。

未完待续...

相关推荐
_MyFavorite_16 小时前
JAVA重点基础、进阶知识及易错点总结(28)接口默认方法与静态方法
java·开发语言·windows
wwj888wwj17 小时前
Docker基础(复习)
java·linux·运维·docker
chushiyunen17 小时前
audacity软件实现音频处理
windows
cuckooman17 小时前
如何升级wsl1到wsl2
wsl·wsl2
FL162386312917 小时前
如何在windows上的卸载Photoshop的Imagecreator插件
windows
DONG99918 小时前
配置docker代理
docker·容器
怎么就重名了18 小时前
docker可以动态修改端口映射吗
运维·docker·容器
JEECG低代码平台19 小时前
敲敲云零代码平台一键部署实战:命令安装 vs Docker 安装
运维·docker·容器
p***769821 小时前
NAS飞牛Docker 部署OmniBox影视资源聚合平台:网盘秒播、影视聚合、自定义直播,超神的一条龙服务
运维·docker·容器
_MyFavorite_21 小时前
JAVA重点基础、进阶知识及易错点总结(30)JDK9-11 常用新特性
java·windows·python