【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后。

未完待续...

相关推荐
VinciYan2 小时前
基于Jenkins+Docker的自动化部署实践——整合Git与Python脚本实现远程部署
python·ubuntu·docker·自动化·jenkins·.net·运维开发
ue星空3 小时前
Windbg常用命令
windows
tntlbb3 小时前
Ubuntu20.4 VPN+Docker代理配置
运维·ubuntu·docker·容器
Gabriel_liao4 小时前
Docker安装Neo4j
docker·容器·neo4j
智慧化智能化数字化方案6 小时前
120页PPT讲解ChatGPT如何与财务数字化转型的业财融合
人工智能·chatgpt
豆豆豆豆变7 小时前
Docker轻量级可视化工具Portainer
docker·容器·自动化运维
花晓木7 小时前
k8s etcd 数据损坏处理方式
容器·kubernetes·etcd
运维&陈同学7 小时前
【模块一】kubernetes容器编排进阶实战之基于velero及minio实现etcd数据备份与恢复
数据库·后端·云原生·容器·kubernetes·etcd·minio·velero
花晓木7 小时前
k8s备份 ETCD , 使用velero工具进行备份
容器·kubernetes·etcd
大熊程序猿7 小时前
xxl-job docker 安装
运维·docker·容器