【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(公司内网)
- WSL2
版本
我这里使用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.4container_name: cwsrestart: alwaysports:- 8092:80 #端口可调整volumes:- ./data:/app/backend/dataenvironment:- TZ=Asia/Shanghai- CWS_CONFIG_DIR=/app/backend/data/config- CHATGPT_BASE_URL=http://go-chatgpt-api:8080/chatgpt/depends_on:- mongo- go-chatgpt-apimongo:image: mongo:6.0restart: alwaysvolumes:- ./mongo_data:/data/dbenvironment:MONGO_INITDB_DATABASE: cwsMONGO_INITDB_ROOT_USERNAME: cwsMONGO_INITDB_ROOT_PASSWORD: passwordgo-chatgpt-api:container_name: go-chatgpt-apiimage: linweiyuan/go-chatgpt-api:latestenvironment:- GIN_MODE=release- PROXY=http://10.30.48.245:7890 #宿主机IP端口restart: unless-stopped
# config.yaml
openai_web:is_plus_account: truechatgpt_base_url: http://go-chatgpt-api:8080/chatgpt/backend-api/proxy:common_timeout: 10ask_timeout: 600
openai_api:openai_base_url: https://api.openai.com/v1/proxy:connect_timeout: 10read_timeout: 20
common:print_sql: falsecreate_initial_admin_user: trueinitial_admin_user_username: admininitial_admin_user_password: passwordsync_conversations_on_startup: truesync_conversations_regularly: false
http:host: 127.0.0.1port: 8000cors_allow_origins:- http://localhost- http://127.0.0.1- http://0.0.0.0
data:data_dir: ./datadatabase_url: sqlite+aiosqlite:///data/database.dbmongodb_url: mongodb://cws:password@mongo:27017run_migration: false
auth:jwt_secret: MODIFY_THIS_TO_RANDOM_SECRETjwt_lifetime_seconds: 86400cookie_max_age: 86400cookie_name: user_authuser_secret: MODIFY_THIS_TO_RANDOM_SECRET
stats:ask_stats_ttl: 7776000request_stats_ttl: 2592000request_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-apiimage: linweiyuan/go-chatgpt-api:latestenvironment:- 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后。
未完待续…
相关文章:

【ChatGPT】基于WSL+Docker的ChatGPT PLUS共享服务部署
最近买了ChatGPT PLUS服务,想通过web服务将它共享给其他人使用,搜了一下目前GitHub上比较热门的服务有 ChatGPT-Next-Webchatgpt-web-share 其中chatgpt-web-share支持API和PLUS账号分享两种方式,且架构为PythonJSDocker,相对比…...

【论文阅读24】Better Few-Shot Text Classification with Pre-trained Language Model
论文相关 论文标题:Label prompt for multi-label text classification(基于预训练模型对少样本进行文本分类) 发表时间:2021 领域:多标签文本分类 发表期刊:ICANN(顶级会议) 相关代…...
119、Spring容器启动流程是怎样的(配有Spring启动完整流程图)
Spring容器启动流程是怎样的 在创建Spring容器,也就是启动Spring时:首先会进行扫描,扫描得到所有的BeanDefinition对象,并存在一个Map中然后筛选出非懒加载的单例BeanDefinition进行创建Bean,对于多例Bean不需要在启动…...

微信公众号开发学习
申请测试号 地址 通过F12抓取体验接口权限表的HTML 解析HTML 引入pom <dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><optional>true</optional></dependency><dependency><…...

【LeetCode】221.最大正方形
题目 在一个由 ‘0 和 ‘1 组成的二维矩阵内,找到只包含 ‘1 的最大正方形,并返回其面积。 示例 1: 输入:matrix [["1","0","1","0","0"],["1","0",&q…...
生成模型相关算法:EM算法步骤和公式推导
EM算法 引言EM算法例子及解法EM算法步骤和说明 引言 EM 算法是一种选代算法,1977 年 Dempster 等人总结提出,用于含有隐变量(hidden variable)的概率模型参数的极大似然估计,或极大后验概率估计EM算法的每次选代由两步组成:E步,求…...
Compose手势
Compose手势 本文链接: 点击 拖动 滑动 锚点 Compose Drag 拖动原理 Compose Drag 拖动原理:等待第一次按下 挂起 // UI展现出来的时候,这个while循环就已经在等待第一次按下了。事件 -> 恢复判断拖动合法性合法onDragStartonDragonDragEndforEa…...

【雕爷学编程】Arduino动手做(177)---ESP-32 掌控板2
37款传感器与执行器的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止这37种的。鉴于本人手头积累了一些传感器和执行器模块,依照实践出真知(一定要动手做)的理念,以学习和交流为目的&am…...

Ubuntu-文件和目录相关命令
🔮linux的文件系统结构 ⛳目录结构及目录路径 🧩文件系统层次结构标准FHS Filesystem Hierarchy Standard(文件系统层次结构标准) Linux是开源的软件,各Linux发行机构都可以按照自己的需求对文件系统进行裁剪,所以众多…...
显式接口实现(C# 编程指南)
接口的实现可以有多种方式,下面是C#接口实现的几种方式欢迎交流 两个接口包含签名相同的成员 如果一个类实现的两个接口包含签名相同的成员,则在该类上实现此成员会导致这两个接口将此成员用作其实现。 如下示例中,所有对 Paint 的调用皆调用同一方法。 第一个示例定义类型…...
element-ui 图片上传 及 quillEditor富文本(图片视频上传)
<template><div class"card" style"overflow: hidden; padding-bottom: 10px"><div style"padding: 20px 20px 0 20px"><span class"title_top"><span class"top_icon"></span>基本信息…...

前端技术Vue学习笔记--002
前端技术Vue学习笔记 文章目录 前端技术Vue学习笔记1、指令修饰符2、v-bind对于样式控制的增强2.1、v-bind对于样式控制的增强--class2.2、v-bind对于样式控制的增强--操作style 3、v-model应用于其他表单元素4、计算属性4.1、**computed计算属性 vs methods方法的区别**4.2、计…...

【RabbitMQ(day4)】SpringBoot整合RabbitMQ与MQ应用场景说明
一、SpringBoot 中使用 RabbitMQ 导入对应的依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-amqp</artifactId></dependency>配置配置文件 spring:application:name: rabbitmq-springbo…...

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

docker安装nginx并配置SSL
1、拉取镜像 docker pull nginx2、启动nginx容器,复制一份默认配置文件出来 // 以nginx镜像为基础镜像创建一个名为nginx01的容器 docker run -d -p 80:80 --name nginx01 nginx创建成功后会看到nginx的欢迎页面 3、挂载nginx目录 拷贝nginx的配置信息到主机目录…...
【LeetCode 算法】Reorder List 重排链表
文章目录 Reorder List 重排链表问题描述:分析代码PointerReverseMerge Tag Reorder List 重排链表 问题描述: 给定一个单链表 L 的头节点 head ,单链表 L 表示为: L0 → L1 → … → Ln - 1 → Ln 请将其重新排列后变为&#…...

MQ面试题3
1、讲一讲Kafka与RocketMQ中存储设计的异同? Kafka 中文件的布局是以 Topic/partition ,每一个分区一个物理文件夹,在分区文件级别实现文件顺序写,如果一个Kafka集群中拥有成百上千个主题,每一个主题拥有上百个分区&am…...

【Linux命令200例】patch 用于将补丁文件应用到源码中
🏆作者简介,黑夜开发者,全栈领域新星创作者✌,阿里云社区专家博主,2023年6月csdn上海赛道top4。 🏆本文已收录于专栏:Linux命令大全。 🏆本专栏我们会通过具体的系统的命令讲解加上鲜…...

一起来学算法(邻接矩阵)
前言: 邻接矩阵是数学和计算机科学中常用的一种表示方式,用来表述有向图或无向图,一张图由一组顶点(或结点)和一组表组成,用邻接矩阵就能表示这些顶点间存在的边的关系 1.图的概念 对于图而言,…...

hadoop与HDFS交互
一、利用Shell命令与HDFS进行交互 在进行HDFS编程实践前,需要首先启动Hadoop。可以执行如下命令启动Hadoop: cd /usr/local/hadoop ./sbin/start-dfs.sh #启动hadoop Hadoop支持很多Shell命令,其中fs是HDFS最常用的命令,利用fs…...

Xshell远程连接Kali(默认 | 私钥)Note版
前言:xshell远程连接,私钥连接和常规默认连接 任务一 开启ssh服务 service ssh status //查看ssh服务状态 service ssh start //开启ssh服务 update-rc.d ssh enable //开启自启动ssh服务 任务二 修改配置文件 vi /etc/ssh/ssh_config //第一…...
.Net Framework 4/C# 关键字(非常用,持续更新...)
一、is 关键字 is 关键字用于检查对象是否于给定类型兼容,如果兼容将返回 true,如果不兼容则返回 false,在进行类型转换前,可以先使用 is 关键字判断对象是否与指定类型兼容,如果兼容才进行转换,这样的转换是安全的。 例如有:首先创建一个字符串对象,然后将字符串对象隐…...

JVM虚拟机:内存结构、垃圾回收、性能优化
1、JVM虚拟机的简介 Java 虚拟机(Java Virtual Machine 简称:JVM)是运行所有 Java 程序的抽象计算机,是 Java 语言的运行环境,实现了 Java 程序的跨平台特性。JVM 屏蔽了与具体操作系统平台相关的信息,使得 Java 程序只需生成在 JVM 上运行的目标代码(字节码),就可以…...

【网络安全】开源系统getshell漏洞挖掘
审计过程: 在入口文件admin/index.php中: 用户可以通过m,c,a等参数控制加载的文件和方法,在app/system/entrance.php中存在重点代码: 当M_TYPE system并且M_MODULE include时,会设置常量PATH_OWN_FILE为PATH_APP.M_T…...

android RelativeLayout布局
<?xml version"1.0" encoding"utf-8"?> <RelativeLayout xmlns:android"http://schemas.android.com/apk/res/android"android:layout_width"match_parent"android:layout_height"match_parent"android:gravity&…...

Ubuntu系统复制(U盘-电脑硬盘)
所需环境 电脑自带硬盘:1块 (1T) U盘1:Ubuntu系统引导盘(用于“U盘2”复制到“电脑自带硬盘”) U盘2:Ubuntu系统盘(1T,用于被复制) !!!建议“电脑…...
深度剖析 DeepSeek 开源模型部署与应用:策略、权衡与未来走向
在人工智能技术呈指数级发展的当下,大模型已然成为推动各行业变革的核心驱动力。DeepSeek 开源模型以其卓越的性能和灵活的开源特性,吸引了众多企业与开发者的目光。如何高效且合理地部署与运用 DeepSeek 模型,成为释放其巨大潜力的关键所在&…...

算法打卡第18天
从中序与后序遍历序列构造二叉树 (力扣106题) 给定两个整数数组 inorder 和 postorder ,其中 inorder 是二叉树的中序遍历, postorder 是同一棵树的后序遍历,请你构造并返回这颗 二叉树 。 示例 1: 输入:inorder [9,3,15,20,7…...

Linux-进程间的通信
1、IPC: Inter Process Communication(进程间通信): 由于每个进程在操作系统中有独立的地址空间,它们不能像线程那样直接访问彼此的内存,所以必须通过某种方式进行通信。 常见的 IPC 方式包括&#…...

数据结构:泰勒展开式:霍纳法则(Horner‘s Rule)
目录 🔍 若用递归计算每一项,会发生什么? Horners Rule(霍纳法则) 第一步:我们从最原始的泰勒公式出发 第二步:从形式上重新观察展开式 🌟 第三步:引出霍纳法则&…...