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

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

  • ChatGPT-Next-Web
  • chatgpt-web-share

其中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,绿框中的是自动生成的目录及文件。
在这里插入图片描述

# 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
# 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
# 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服务使用宿主机的代理

...
  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

部署

docker compose up -d

部署成功后可以看到日志如下:
在这里插入图片描述
浏览器打开127.0.0.1:8092、0.0.0.0:8092、172.23.192.1:8092就能看到登录页面,账号密码为配置文件中的admin和password

外部访问

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

不建议使用如下方式

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
之后一路下一页就行了。
再用管理员权限打开powershell

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端口无法访问,需要通过如下命令删除映射

>>> netsh interface portproxy delete v4tov4 listenport=8092 listenaddress=0.0.0.0

更建议使用wsl2-auto-portproxy
在/mnt/c/Users/microfat 目录下创建.wslpp目录,在.wslpp目录下创建config.json

{
  "onlyPredefined": true,
  "predefined": {
    "tcp": [
      "8092:8092"
    ]
  },
  "ignore": {
    "tcp": [
      445
    ]
  }
}

在这里插入图片描述

注意:如果ladder怎么也进不去wsl2,则可以试试打开小猫咪的TUN Mode
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
如果出现上面的错误,尝试重启一下服务

>>> 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地址

>>> 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命令修改上述文件

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

未完待续…

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/54124.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

java判断字符串是否和空字符串(““)相等、是否和空引用(null)相等,比较顺序不同导致出现死代码(Dead code)

我在用Java实现需求的时候,用到了字符串跟空字符串(“”)比较,跟空引用null比较,两个比较语句的顺序不同,一个顺序出现了死代码(Dead code)。 下面这个代码片段,字符串li…

配置VS Code 使其支持vue项目断点调试

起因 每个应用,不论大小,都需要理解程序是如何运行失败的。当我们写的程序没有按照自己写的逻辑走的时候,我们就会逐步一一排查问题。在平常开发过程中我们可能会借助 console.log 来排查,但是现在我们可以借助 VS Code 断点来调试项目。 前…

机器学习01 -Hello World(对鸢尾花(Iris Flower)进行训练及测试)

什么是机器学习? 机器学习是一种人工智能(AI)的子领域,它探索和开发计算机系统,使其能够从数据中学习和改进,并在没有明确编程指令的情况下做出决策或完成任务。 传统的程序需要程序员明确编写指令来告诉…

初步了解c#编程语言--(1)

初识c#编程语言 一、见识c#语言编写的各类应用程序 关于用c#语言编写的各类应用程序有以下几种: 1.Console 在编写Console程序时,要注意创建项目时,是选择控制台应用程序(Console Application),在这里…

Docker的安装和部署

目录 一、Docker的安装部署 (1)关闭防火墙 (2)关闭selinux (3)安装docker引擎 (4)启动docker (5)设置docker自启动 (6)测试doc…

策略新高,牛回速归?

量化策略开发,高质量社群,交易思路分享等相关内容 大家好,今天我们来聊一下,股票社群策略绩效实盘总结。 众所周知,2023年我们开设了新的社群——股票社群。该社群宗旨是在尽可能简单有效逻辑下,降低因子复…

Python初刷题笔记

目录 保留小数的方法:​编辑 进制问题如何转换: 大小写如何转换: 删除空格问题: 循环输入的简便方法: 截取某一部分所需要的函数: 字符串处理常用函数小汇总: sort和sorted函数的区别&am…

SpringBoot使用MyBatis Plus + 自动更新数据表

1、Mybatis Plus介绍 Mybatis,用过的都知道,这里不介绍,mybatis plus只是在mybatis原来的基础上做了些改进,增强了些功能,增强的功能主要为增加更多常用接口方法调用,减少xml内sql语句编写,也可…

Day03-作业(AxiosElementUI)

作业1&#xff1a; 根据需求完成如下页面数据列表展示 需求&#xff1a;Vue挂载完成后,通过axios发送异步请求到服务端,获取学生列表数据,并通过Vue展示在页面上 获取数据url&#xff1a;http://yapi.smart-xwork.cn/mock/169327/student 素材&#xff1a; <!DOCTYPE html…

赛车游戏——【极品飞车】(内含源码inscode在线运行)

前言 「作者主页」&#xff1a;雪碧有白泡泡 「个人网站」&#xff1a;雪碧的个人网站 「推荐专栏」&#xff1a; ★java一站式服务 ★ ★前端炫酷代码分享 ★ ★ uniapp-从构建到提升★ ★ 从0到英雄&#xff0c;vue成神之路★ ★ 解决算法&#xff0c;一个专栏就够了★ ★ 架…

Windows7+内网, 安装高版本nodejs,使用vite+vue3+typescript开发项目

前言&#xff1a;vite只支持高版本的nodejs&#xff0c;而高版本的nodejs只支持windows8及以上&#xff0c;且vite还对浏览器版本有兼容问题。以下均为vite官网截图 1、安装好低版本的nodejs win7系统建议安装13.及以下&#xff0c;我的是12.12.0这个版本。nodejs低版本官网下载…

Node.js之express框架学习心得

Node.js:颠覆传统的服务器端开发 Node.js是基于Chrome V8引擎构建的JavaScript运行时,它采用了完全不同的开发模型。Node.js使用事件驱动和非阻塞I/O的方式处理请求,通过单线程和异步机制,实现高效的并发处理。这意味着在Node.js中,一个线程可以处理数千个并发连接,大大提…

Bootstrap框架(JavaScript组件)

目录 前言一&#xff0c;JavaScript插件简介二&#xff0c;插件的引入方式三&#xff0c;data属性四&#xff0c;关闭data属性五&#xff0c;过渡插件六&#xff0c;模态框6.1&#xff0c;JavaScript操作模态框6.2&#xff0c;模态框属性6.3&#xff0c;模态框方法6.4&#xff…

机器学习(一)---概述

文章目录 1.人工智能、机器学习、深度学习2.机器学习的工作流程2.1 获取数据集2.2 数据基本处理2.3 特征工程2.3.1 特征提取2.3.2 特征预处理2.3.3 特征降维 2.4 机器学习2.5 模型评估 3.机器学习的算法分类3.1 监督学习3.1.1 回归问题3.1.2 分类问题 3.2 无监督学习 1.人工智能…

小程序动态隐藏分享按钮

// 禁用分享 wx.hideShareMenu({menus: [shareAppMessage, shareTimeline] })// 显示分享 wx.showShareMenu({withShareTicket: true,menus: [shareAppMessage, shareTimeline] })//私密消息 wx.updateShareMenu({isPrivateMessage: true, })

【VTK】基于读取出来的 STL 模型,当用户点击鼠标左键时,程序将获取点击位置的点,显示其坐标,并设置它为模型的旋转原点

知识不是单独的&#xff0c;一定是成体系的。更多我的个人总结和相关经验可查阅这个专栏&#xff1a;Visual Studio。 文章目录 class PointPickedSignal : public QObjectclass MouseInteractorCommand : public vtkCommandvoid A::on_pushButtonSelected_clicked()void A::on…

想了解好用的翻译pdf的软件吗?

在全球化的时代背景下&#xff0c;跨国贸易越来越普遍&#xff0c;跨语言沟通也越来越频繁。小黄是一家跨国公司的员工&#xff0c;他梦想能在全球各地拓展自己的业务&#xff0c;奈何遇到了一个巨大的挑战&#xff1a;跨语言沟通。在这其中&#xff0c;pdf文件是他经常接收到的…

【LeetCode】【数据结构】单链表OJ常见题型(一)

&#x1f440;樊梓慕&#xff1a;个人主页 &#x1f3a5;个人专栏&#xff1a;《C语言》《数据结构》《蓝桥杯试题》《LeetCode刷题笔记》 &#x1f31d;每一个不曾起舞的日子&#xff0c;都是对生命的辜负。 目录 前言&#xff1a; 【LeetCode】203.移除链表元素 【LeetCo…

SI24R2H 2.4G+125K中长跑应用原理

一、中长跑计时系统应用背景 采用125KHZ低频唤醒高频射频识别系统和先进的技术、计算机信息处理等高新技术与体育竞赛相结合&#xff0c;便于运动员携带而不影响其跑步状态&#xff0c;当运 动员带着射频识别卡经过计时线圈时&#xff0c;读卡天线能够立即检测到通过的卡片信息…

VR全景旅游,智慧文旅发展新趋势!

引言&#xff1a; VR全景旅游正在带领我们踏上一场全新的旅行体验。这种沉浸式的旅行方式&#xff0c;让我们可以足不出户&#xff0c;却又身临其境地感受世界各地的美景。 一&#xff0e;VR全景旅游是什么&#xff1f; VR全景旅游是一种借助虚拟现实技术&#xff0c;让用户…