Share-plus-chatgpt项目部署

1、创建应用目录并创建配置文件

1
2
3
4
5
6
7
8
9
10
11
12
13
cd ~
mkdir cws && cd cws
mkdir -p data/config

export MONGODB_PASSWORD=your_pass # MongoDB 密码
export INITIAL_ADMIN_PASSWORD=your_pass # 初始管理员密码

# 运行一次 Docker 容器,创建配置文件:
docker run -it --rm \
-v $PWD/data/config:/tmp/config \
ghcr.io/moeakwak/chatgpt-web-share:latest \
python /app/backend/manage.py create_config -O /tmp/config --generate-secrets --mongodb-url "mongodb://cws:${MONGODB_PASSWORD}@mongo:27017" --initial-admin-password "${INITIAL_ADMIN_PASSWORD}" --chatgpt-base-url http://ninja:7999/backend-api/

2、编辑 docker-compose 文件

1
2
3
4
echo "TZ=Asia/Shanghai" > .env
echo "MONGO_INITDB_DATABASE=cws" >> .env
echo "MONGO_INITDB_ROOT_USERNAME=cws" >> .env
echo "MONGO_INITDB_ROOT_PASSWORD=your_pass" >> .env

docker-compose.yml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
version: "3"

services:
chatgpt-web-share:
image: ghcr.io/chatpire/chatgpt-web-share:latest
container_name: cws
restart: unless-stopped
ports:
- 5000:80
volumes:
- ./data:/app/backend/data
environment:
- TZ=${TZ}
- CWS_CONFIG_DIR=/app/backend/data/config
depends_on:
- mongo

mongo:
container_name: mongo
image: mongo:6.0
restart: always
# ports:
# - 27017:27017
volumes:
- ./mongo_data:/data/db
environment:
MONGO_INITDB_DATABASE: ${MONGO_INITDB_DATABASE}
MONGO_INITDB_ROOT_USERNAME: ${MONGO_INITDB_ROOT_USERNAME}
MONGO_INITDB_ROOT_PASSWORD: ${MONGO_INITDB_ROOT_PASSWORD}

ninja:
image: ghcr.io/gngpp/ninja:latest
container_name: ninja
restart: unless-stopped
command: run --disable-webui
ports:
- "7999:7999"
environment:
- TZ=Asia/Shanghai
volumes:
- "./har/gpt3:/root/.gpt3"
- "./har/gpt4:/root/.gpt4"

启动服务

1
docker-compose up -d 

3、配置 ChatGPT 代理

Ninja 文档:https://github.com/gngpp/ninja/blob/main/doc/readme_zh.md


简单来说,你需要:

  1. 在 CWS 的配置中将 ChatGPT 代理地址设置为 http://ninja:7999/backend-api/。(这应当在上一步已经完成了)
  2. 参考 ninja 的文档获取 HAR 文件,将 HAR 文件放在 cws/har/gpt3(假如 GPT 3.5 模型出现验证码) 和 cws/har/gpt4 下。你可以直接上传文件到相应目录,也可以使用 Ninja 提供的网页上传(访问 http://<你的服务器 IP>:7999/har/upload)。
  3. 访问 https://chat.openai.com/api/auth/session 并复制其中的 access token 项内容,在 CWS 的后台设置中的 credentials 中填入。
ArkoseLabs

发送GPT-4/GPT-3.5/创建API-Key对话需要Arkose Token作为参数发送,支持的解决方案暂时只有两种

1、使用HAR
支持HAR特征池化,可同时上传多个HAR,使用轮训策略
ChatGPT 官网发送一次 GPT-4 会话消息,浏览器 F12 下载 https://tcr9i.chat.openai.com/fc/gt2/public_key/35536E1E-65B4-4D96-9D97-6ADB7EFF8147 接口的HAR日志记录文件,使用启动参数 --arkose-gpt4-har-dir 指定HAR目录路径使用(不指定路径则使用默认路径~/.gpt4,可直接上传更新HAR),同理GPT-3.5和其他类型也是一样方法。支持WebUI上传更新HAR,请求路径:/har/upload,可选上传身份验证参数:–arkose-har-upload-key

2、使用YesCaptcha / CapSolver
平台进行验证码解析,启动参数–arkose-solver选择平台(默认使用YesCaptcha),–arkose-solver-key 填写Client Key

两种方案都使用,优先级是:HAR > YesCaptcha / CapSolver
YesCaptcha / CapSolver推荐搭配HAR使用,出验证码则调用解析器处理,验证后HAR使用更持久
目前OpenAI已经更新登录需要验证Arkose Token,解决方式同GPT-4,填写启动参数指定HAR文件–arkose-auth-har-dir。创建API-Key需要上传Platform相关的HAR特征文件,获取方式同上。

OpenAI取消对GPT-3.5进行Arkose验证,可以不上传HAR特征文件使用(已上传的不影响),兼容后续可能会再次开启Arkose验证,需要加上启动参数–arkose-gpt3-experiment进行开启GPT-3.5模型Arkose验证处理,WebUI不受影响。如果遇到418 I’m a teapot,可以开启–arkose-gpt3-experiment,同时需要上传HAR特征,如果没有GPT-3.5的特征,GPT-4的特征也可以使用,如果还不行,则尝试开启–arkose-gpt3-experiment-solver,可能会使用第三方平台解决验证码。

4、接下来要做的事

到这里,CWS 已经部署完成。要继续使用,你可能需要:

5、升级及维护

1
2
docker-compose pull && docker-compose up -d
# 在更新前,建议备份数据,并且确保设置中已经打开 run_migration 选项,以便在更新后自动执行数据库迁移。

6、反向代理

提供三种方式

6.1 设置反向代理和 SSL

为了向外公开站点,你应当使用 https 协议。我们推荐使用 Caddy 作为反向代理,它可以自动申请证书并配置 https。

下面是一个使用 Cloudflare 的 API 自动进行证书验证的 Caddyfile 例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
{
email <YOUR_EMAIL>
storage file_system {
root /root/caddy/certs/
}
log error {
output file /root/caddy/logs/error.log {
roll_size 20MB
roll_keep 5
roll_keep_for 240h
}
level ERROR
}
acme_dns cloudflare API_TOKEN
}

your-cws-site.com {
reverse_proxy :5000
}
6.2 使用 Cloudflare

推荐使用 Cloudflare 加速站点,从而隐藏服务器 IP。如果你将域名 DNS 托管在 Cloudflare,在开启 Proxy 之后,你有如下方式使用 https:

6.3 使用 nginx
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
http {
...
map $http_upgrade $connection_upgrade {
default upgrade;
'' close;
}
...
}

server {
listen 443 ssl;
server_name plus.domain.com;

ssl_certificate /etc/nginx/ssl/plus.doamin.com.pem;
ssl_certificate_key /etc/nginx/ssl/plus.domain.com.key;

location / { # 目前已经实现的子系统
proxy_http_version 1.1; #WebSocket
proxy_set_header Upgrade $http_upgrade; #WebSocket
proxy_set_header Connection $connection_upgrade; #WebSocket

proxy_pass http://127.0.0.1:5000;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_redirect off;

proxy_buffering off;
chunked_transfer_encoding on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 60;

}
}

server {
listen 80;
server_name plus.domain.com;

location = / {
rewrite ^(.+)$ https://plus.domain.com$1 redirect;
}
}