diff --git "a/.github/ISSUE_TEMPLATE/\345\212\237\350\203\275\350\257\267\346\261\202.md" "b/.deploy.github/ISSUE_TEMPLATE/\345\212\237\350\203\275\350\257\267\346\261\202.md" similarity index 100% rename from ".github/ISSUE_TEMPLATE/\345\212\237\350\203\275\350\257\267\346\261\202.md" rename to ".deploy.github/ISSUE_TEMPLATE/\345\212\237\350\203\275\350\257\267\346\261\202.md" diff --git "a/.github/ISSUE_TEMPLATE/\345\257\273\346\261\202\345\270\256\345\212\251.md" "b/.deploy.github/ISSUE_TEMPLATE/\345\257\273\346\261\202\345\270\256\345\212\251.md" similarity index 100% rename from ".github/ISSUE_TEMPLATE/\345\257\273\346\261\202\345\270\256\345\212\251.md" rename to ".deploy.github/ISSUE_TEMPLATE/\345\257\273\346\261\202\345\270\256\345\212\251.md" diff --git "a/.github/ISSUE_TEMPLATE/\351\227\256\351\242\230\346\212\245\345\221\212.md" "b/.deploy.github/ISSUE_TEMPLATE/\351\227\256\351\242\230\346\212\245\345\221\212.md" similarity index 100% rename from ".github/ISSUE_TEMPLATE/\351\227\256\351\242\230\346\212\245\345\221\212.md" rename to ".deploy.github/ISSUE_TEMPLATE/\351\227\256\351\242\230\346\212\245\345\221\212.md" diff --git a/deploy.README.md b/deploy.README.md new file mode 100644 index 0000000..a54dea2 --- /dev/null +++ b/deploy.README.md @@ -0,0 +1,272 @@ +# PandoraNext + +> [!IMPORTANT] +> ✨ 一个新的 [文档站](https://docs.pandoranext.com),从部署到常见问题,甚至接口调用都有详细说明。 +> +> ✨ 现在我们可以使用PandoraNext [注册ChatGPT账号](https://zhile.io/2023/12/09/pandoranext-introduction.html)了,无墙,全代理! +> +> ✨ [PandoraNext助手GPTs](https://chat.oaifree.com/g/g-CFsXuTRfy-pandoranextzhu-shou),如你有Plus账号,可向它求助项目问题(不要试图套源码) + +## 简单介绍 + +* Pandora Cloud + Pandora Server + Shared Chat + BackendAPI Proxy + Chat2API = `PandoraNext`([演示站](https://chat.oaifree.com)) +* 更强大,但还是那个让你呼吸顺畅的ChatGPT。支持GPTs,最新UI。 +* 支持多种登录方式:(相当于Pandora Cloud) + * 账号/密码 + * Access Token + * Session Token + * Refresh Token + * Share Token +* 可内置tokens(可使用上述所有Token),支持设置密码。(相当于Pandora Server) +* 可配置共享的tokens,会有一个功能等同[chat-shared3.zhile.io](https://chat-shared3.zhile.io)的共享站(目前1841个普号、6个Plus)。 +* 为全代理模式(能想象到的都代理了),你的用户只需要跟你的部署网络能通即可。 +* 可启动为BackendAPI Proxy模式,直接使用`Access Token`调用`/backend-api/`和chat2api的接口。 +* 还有疑问,那就进Telegram群让大家围观围观:[@ja_netfilter_group](https://t.me/ja_netfilter_group) + +
+ + + 旧的、简易的文档。更新、更详细的访问文档站。 + + +## 手动部署 + +* 在[Releases](https://github.com/pandora-next/deploy/releases)中下载对应操作系统和架构的包。 +* 解压后修改同目录中的`config.json`至你需要的参数。 +* [获取license_id](#%E5%85%B3%E4%BA%8E-license_id)填写在`config.json`中,这是必须的前置步骤! +* 各种Linux/Unix系统使用`./PandoraNext`启动即可。 +* Windows系统双击`PandoraNext.exe`即可,当然最好在cmd中启动。 + +## Docker Compose 部署 + +* 仓库内已包含相关文件和目录,拉到本地,[获取license_id](#%E5%85%B3%E4%BA%8E-license_id)填写在`data/config.json`中。 +* `data`目录中包含`config.json`、`tokens.json`示例文件可自行修改。 +* `docker compose up -d` **原神启动!** + +## Docker 部署 + +```bash +$ docker pull pengzhile/pandora-next +$ docker run -d --restart always --name PandoraNext --net=bridge \ + -p 8181:8181 \ + -v ./data:/data \ + -v ./sessions:/root/.cache/PandoraNext \ + pengzhile/pandora-next +``` + +* 容器内默认监听`8181`端口,映射宿主机的`8181`端口,可自行修改。 +* 你可以映射目录到容器内的`/data`目录,`config.json`、`tokens.json`和[获取license_id](#%E5%85%B3%E4%BA%8E-license_id)填写在`config.json`中。 +* 你可以映射目录到容器内的`/root/.cache/PandoraNext`目录,保留登录的`session`,避免重启容器登录状态丢失。 + +## Nginx 配置 + +``` +server { + listen 443 ssl http2; + server_name chat.zhile.io; + + charset utf-8; + + ssl_certificate certs/chat.zhile.io.crt; + ssl_certificate_key certs/chat.zhile.io.key; + + ...省略若干其他配置... + + location / { + proxy_http_version 1.1; + proxy_pass http://127.0.0.1:8181/; + proxy_set_header Connection ""; + proxy_set_header Host $http_host; + proxy_set_header X-Forwarded-Proto $scheme; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + + proxy_buffering off; + proxy_cache off; + + send_timeout 600; + proxy_connect_timeout 600; + proxy_send_timeout 600; + proxy_read_timeout 600; + } + + ...省略若干其他配置... +} +``` + +* Nginx建议开启`http2`。 +* 以上仅为推荐配置,可根据具体情况进行改动。 +* 建议开启`ssl`也即`https`,否则浏览器限制将无法复制网页内容。 + +## config 配置 + +* 以下是一个示例`config.json`文件 + +```json +{ + "bind": "127.0.0.1:8181", + "tls": { + "enabled": false, + "cert_file": "", + "key_file": "" + }, + "timeout": 600, + "proxy_url": "", + "license_id": "", + "public_share": false, + "site_password": "", + "setup_password": "", + "server_tokens": true, + "proxy_api_prefix": "", + "isolated_conv_title": "*", + "disable_signup": false, + "auto_conv_arkose": false, + "proxy_file_service": false, + "custom_doh_host": "", + "captcha": { + "provider": "", + "site_key": "", + "site_secret": "", + "site_login": false, + "setup_login": false, + "oai_username": false, + "oai_password": false, + "oai_signup": false + }, + "whitelist": null +} +``` + +* `bind`指定绑定IP和端口,在docker内,IP只能用`0.0.0.0`,否则映射不出来。 +* **如果你不打算套nginx等反代,`bind`参数的IP请使用`0.0.0.0`!!!** +* `tls`配置PandoraNext直接以`https`启动。 + * `enabled` 是否启用,`true`或`false`。启用时必须配置证书和密钥文件路径。 + * `cert_file` 证书文件路径。 + * `key_file` 密钥文件路径。 +* `timeout`是请求的超时时间,单位为`秒`。 +* `proxy_url`指定部署服务流量走代理,如:`http://127.0.0.1:8888`、`socks5://127.0.0.1:7980` +* `license_id`指定你的License Id,可以在[这里获取](#%E5%85%B3%E4%BA%8E-license_id)。 +* `public_share`对于GPT中创建的对话分享,是否需要登录才能查看。为`true`则无需登录即可查看。 +* `site_password`设置整站密码,需要先输入这个密码,正确才能进行后续步骤。充分保障私密性。不少于`8`位,且同时包含`数字`和`字母`! +* `setup_password`定义一个设置密码,用于调用`/setup/`开头的设置接口,为空则不可调用。不少于`8`位,且同时包含`数字`和`字母`! +* `server_tokens`设置是否在响应头中显示版本号,`true`显示,`false`则不显示。 +* `proxy_api_prefix`可以给你的`proxy`模式接口地址添加前缀,让人意想不到。注意设置的字符应该是url中允许的字符。包括:`a-z` `A-Z` `0-9` `-` `_` `.` `~` +* `proxy_api_prefix` 你必须设置一个不少于`8`位,且同时包含`数字`和`字母`的前缀才能开启`proxy`模式! + * `/backend-api/conversation` proxy模式比例 `1:4` + * `/v1/chat/completions` 3.5模型比例 `1:4` + * `/v1/chat/completions` 4模型比例 `1:10`, 无需打码 + * `/api/auth/login` 登录接口比例 `1:100`,无需打码 + * `/api/auth/login2` 获取`refresh_token`接口比例 `1:1000`,无需打码 + * `/api/arkose/token` 获取`arkose_token`,比例 `1:10` + * `/api/auth/platform/login` 登录platform接口比例 `1:100`,无需打码 +* `isolated_conv_title`现在隔离会话可以设置标题了,而不再是千篇一律的`*`号。 +* `disable_signup` 禁用注册账号功能,`true`或`false`。 +* `auto_conv_arkose` 在`proxy`模式使用`gpt-4`模型调用`/backend-api/conversation`接口是否自动打码,使用消耗为`4+10`。 +* `proxy_file_service` 在`proxy`模式是否使用PandoraNext的文件代理服务,避免官方文件服务的墙。 +* `custom_doh_host` 配置自定义的`DoH`主机名,建议使用IP形式。默认启动时在公共`DoH`中挑选你所在地区最快的那个。 +* `captcha`配置一些关键页面的验证码。 + * `provider`验证码提供商,支持:`recaptcha_v2`、`recaptcha_enterprise`、`hcaptcha`、`turnstile`、`friendly_captcha`。 + * `site_key`验证码供应商后台获取的网站参数,是可以公布的信息。 + * `site_secret`验证码供应商后台获取的秘密参数,不要公布出来。有些供应商也称作`API Key`。 + * `site_login`是否在全站密码登录界面显示验证码,`true`或`false`。 + * `setup_login`是否在设置入口登录界面显示验证码,`true`或`false`。 + * `oai_username`是否输入用户名界面显示验证码,`true`或`false`。 + * `oai_password`是否在输入登录密码界面显示验证码,`true`或`false`。 +* `whitelist`邮箱数组指定哪些用户可以登录使用,用户名/密码登录受限制,各种Token登录受限。内置tokens不受限。 +* `whitelist`为`null`则不限制,为空数组`[]`则限制所有账号,内置tokens不受限。 +* 一个`whitelist`的例子:```"whitelist": ["mail2@test.com", "mail2@test.com"]``` + +## tokens 配置 + +* 以下是一个示例`tokens.json`文件 + +```json +{ + "test-1": { + "token": "access token / session token / refresh token", + "shared": true, + "show_user_info": false + }, + "test-2": { + "token": "access token / session token / refresh token", + "shared": true, + "show_user_info": true, + "plus": true + }, + "test2": { + "token": "access token / session token / refresh token / share token / username & password", + "password": "12345" + } +} +``` + +* `token`支持示例文件中所写的所有类型。`session token`和`refresh token`可自动刷新。 +* 每个key被称为`token key`,可在登录框作用户名输入。如上:`test-1`、`test-2`等,随意更改。 +* 如果设置了`password`则输入完`token key`进入输入密码页面输入匹配。 +* 如果设置`shared`为`true`,则这个账号会出现在`/shared.html`中,登录页面会出现它的链接。 +* 如果设置`shared`为`true`,则这个账号不能再在用户名登录框进行登录。 +* `/shared.html`中的账号和共享站功能相同,可以自行设置隔离密码进行会话隔离。 +* `plus`用来标识`/shared.html`上账号是否有金光,没有其他作用。 +* `show_user_info`表示`/shared.html`共享时是否显示账号邮箱信息,GPTs建议开启。 +* 现在可以直接内置用户名密码登录,此种方法必须设置`password`且`shared`不可为`true`。 +* 内置账号密码的格式为:`邮箱,密码`,此种是`0`额度消耗的。 + +## proxy模式接口 +* 页面 /auth 使用账号密码,手动获取`access token`和`session token`。只是给UI方便获取,`1:100`的消耗依然存在。 +* 页面 /fk 使用`access token`或`session token`,手动获取`share token`, +* 页面 /pk 使用`share token`,手动组`pool token`。 +* /backend-api/* `ChatGPT`网页版接口,具体F12去页面上看。 +* /public-api/* `ChatGPT`网页版接口,具体F12去页面上看。 +* /v1/* 所有`https://api.openai.com/v1/*`开头的接口,每次调用`1:1`。 +* /dashboard/* 所有`https://api.openai.com/dashboard/*`开头的接口,每次调用`1:1`。 +* **GET** /api/token/info/fk-xxx 获取share token信息,使用生成人的access token做为Authorization头,可查看各模型用量。 +* **POST** /api/auth/session 通过session token获取access token,使用urlencode form传递session_token参数。 +* **POST** /api/auth/refresh 通过refresh token获取access token,使用urlencode form传递refresh_token参数。 +* **POST** /api/auth/login 登录获取access token,使用urlencode form传递username 和 password 参数。 +* **POST** /api/auth/login2 登录获取refresh token,使用urlencode form传递username、password 和 mfa_code 参数。 +* **POST** /api/token/register 生成share token +* **POST** /api/pool/update 生成更新pool token +* **POST** /v1/chat/completions 使用`ChatGPT`模拟`API`的请求接口,支持share token和pool token。 +* **POST** /api/arkose/token 获取arkose_token,目前只支持`gpt-4`类型。使用urlencode form传递type=gpt-4参数。获取后可API方式调用`GPTs` +* **POST** /api/setup/reload 重载当前服务的`config.json`、`tokens.json`等配置。 +* **POST** /api/auth/platform/refresh 通过`platform`的refresh token获取access token,使用urlencode form传递refresh_token参数。 +* **POST** /api/auth/platform/login 登录`platform`获取access token,使用urlencode form传递username 和 password 参数。如果要获取`sess key`,增加参数`prompt=login`。 +* 以上地址均需在最前面增加 `/`,也就是你设置的前缀。 + + +## 设置界面 + +* 必须先在`config.json`中设置`setup_password`为非空! +* 浏览器打开:`/setup`,其中``是你部署服务的地址。 + +## 关于 license_id + +* 在这里获取:[https://dash.pandoranext.com](https://dash.pandoranext.com) +* 复制`License Id:`后的内容,填写在`config.json`的`license_id`字段。 +* 注意检查不要复制到多余的空格等不可见字符。 +* 如果`config.json`中没有填写`license_id`字段,启动会报错`License ID is required`。 +* **没有固定IP的情况**,IP变动后会自动尝试重新拉取。 +* 更换`License Id`之后,通常需要手动删除`license.jwt`再启动。 + +
+ +## 其他说明 + +> [!CAUTION] +> * 如果你发现网页上不能复制,开启`https`或者使用`127.0.0.1`。 +> * 如果你正在自定义页面元素,请保留: +> * `Powered by PandoraNext`文字和链接。 +> * `About PandoraNext`文字和链接。 +> * 如果要抹,请在**一百多个js**文件中去除若干`dom检测`代码。 +> * 抹了后果如何我不说。 +> * `PHP`是世界上最好的编程语言。 + +## 贡献者们 + +> 感谢所有让这个项目变得更好的贡献者们! + +[![Contributors](https://contrib.rocks/image?repo=pandora-next/deploy)](https://github.com/pandora-next/deploy/graphs/contributors) + +## Star历史 + +![Star History Chart](https://api.star-history.com/svg?repos=pandora-next/deploy&type=Date)