Skip to content

Commit 095a541

Browse files
committed
chore: update readme
1 parent e7a7a25 commit 095a541

File tree

3 files changed

+54
-6
lines changed

3 files changed

+54
-6
lines changed

README.md

+35-5
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@ _🚀 **Next Generation AI One-Stop Solution**_
5555
![仪表盘](/screenshot/admin.png)
5656
2. **支持 All in one**, *SMTP 发件*, *用户注册*, *用户登录*, *忘记密码* 等功能
5757
3. **支持用户管理**, *用户列表*, *用户详情*, *管理操作* (*修改密码*, *修改邮箱*, *封禁 / 解封用户*, *设为管理员*, *点数变更*, *点数设置*, *订阅管理*, *订阅等级设置*, *释放订阅用量* 等操作)
58-
4. **支持邀请码和兑换码管理** 支持管理操作, 支持批量生成和保存为文件 _(邀请码一种类型只能一个用户只能绑定一次, 发福利等方式可使用邀请码;兑换码一种类型可以多个用户绑定, 可作为正常购买和发卡使用)_
58+
4. **支持邀请码和兑换码管理** 支持管理操作, 支持批量生成和保存为文件
5959
5. **价格设定**, 支持模型价格设定 (_**次数计费**_, **_Token 弹性计费_**, _**不计费**_ 等类型), 支持同步上游 Chat Nio 站点的价格设定 (可选是否覆盖本站已有模型价格规则), 未设定价格模型检测 (如果非管理员将自动检测并停止使用模型进而防止金额损失)
6060
![购买点数](/screenshot/shop.png)
6161
![价格设定](/screenshot/charge.png)
@@ -67,7 +67,7 @@ _🚀 **Next Generation AI One-Stop Solution**_
6767
8. **系统设置**, 自定义网站名称, 网站 Logo, 文档链接, 是否暂停注册, 用户初始点数等设置, 自定义购买链接 (卡密发卡地址), 联系信息, 页脚信息等
6868
![系统设置](/screenshot/system.png)
6969
9. **支持 SMTP 发件**, 支持是否启用邮件后缀白名单, 支持自定义邮件后缀白名单
70-
10. **支持模型缓存**, **即同一个入参下, 如果之前已请求过, 将直接返回缓存结果 (击中缓存将不计费), 减少请求次数。可自定义一种情况的最大缓存结果数 (默认为 1), 自定义可缓存的模型 (默认为空), 自定义缓存时间 (默认为 1 小时), 支持一键设置 *全部模型不缓存*, *免费模型缓存*, *所有模型缓存* 等操作**
70+
10. **支持模型缓存**, *即同一个入参下, 如果之前已请求过, 将直接返回缓存结果 (击中缓存将不计费), 减少请求次数。可自定义一种情况的最大缓存结果数 (默认为 1), 自定义可缓存的模型 (默认为空), 自定义缓存时间 (默认为 1 小时), 支持一键设置 *全部模型不缓存*, *免费模型缓存*, *所有模型缓存* 等操作*
7171
11. **支持可请求最小点数检测**, 防止滥用, 当请求点数低于最小请求点数时将返回点数不足的错误信息 _(不计费模型无限制, 次数计费模型最小点数为该模型的 1 次请求点数, Token 弹性计费模型为 1K 输入 Tokens 价格 + 1K 输出 Tokens 价格)_
7272
- ⚡ 渠道管理体系
7373
1. Chat Nio **自写渠道分配算法** (不依赖 http 上下文), 抽象 Adapter 兼容层架构, 低耦合, 高可扩展性
@@ -163,9 +163,9 @@ _🚀 **Next Generation AI One-Stop Solution**_
163163
> - *--network host* 指使用宿主机网络,使 Docker 容器使用宿主机的网络,可自行修改
164164
> - *-p 8000:8094* 指映射宿主机端口为 8000, 可自行修改冒号前的端口号
165165
> - SECRET: JWT 密钥, 自行生成随机字符串修改
166-
> - SERVE_STATIC: 是否启用静态文件服务 (仅在前后端分离部署时, 如 https://chatnio.net 后端部署为 https://api.chatnio.net 的情况才需关闭静态文件服务, 默认情况下api地址为 **/api**, 如需修改, 请自行修改)
166+
> - SERVE_STATIC: 是否启用静态文件服务 (正常情况下不需要更改此项, 详见下方常见问题解答)
167167
> - *-v ~/config:/config**-v ~/logs:/logs* 指挂载配置文件和日志文件的宿主机目录, 可自行修改
168-
> - 需配置 MySQL 和 Redis 服务, 请自行修改环境变量
168+
> - 需配置 MySQL 和 Redis 服务, 请自行参考上方信息修改环境变量
169169

170170
版本更新 (_开启 Watchtower 后无需手动更新,执行后按照上述步骤重新运行即可_):
171171
```shell
@@ -193,10 +193,40 @@ _🚀 **Next Generation AI One-Stop Solution**_
193193
nohup ./chatnio > output.log & # using nohup to run in background
194194
```
195195

196+
## ❓ 常见问题 Q&A
197+
1. **为什么我部署后的站点可以访问页面,可以登录注册,但是无法使用聊天 (一直在转圈)?**
198+
- 聊天等此类功能通过 websocket 进行通信, 请确保你的服务支持 websocket。
199+
- 如果你使用了 Nginx, Apache 等反向代理, 请确保已配置 websocket 支持。
200+
- 如果使用了端口映射, 端口转发, CDN, API Gateway 等服务, 请确保你的服务支持并开启 websocket。
201+
2. **此项目有什么外部依赖?**
202+
- MySQL: 存储用户信息, 对话记录, 管理员信息等持久化数据。
203+
- Redis: 存储用户快速鉴权信息, IP 速率限制, 订阅配额, 邮箱验证码等数据。
204+
- 环境未配置好的情况下, 会导致服务无法正常运行, 请确保你的 MySQL 和 Redis 服务已正常运行 (Docker 部署, 编译部署需自行搭建外部服务)。
205+
3. **我的机器为 ARM 架构, 该项目支持 ARM 架构吗?**
206+
- 支持。Chat Nio 项目使用 BuildX 构建多架构镜像, 你可以直接使用 docker-compose 或 docker 运行, 无需额外配置。
207+
- 如果你使用编译安装, 直接在 ARM 机器上编译即可,无需欸外配置。如果你使用 x86 机器编译, 请使用 `GOARCH=arm64 go build -o chatnio` 进行交叉编译并上传至 ARM 机器上运行。
208+
4. **如何修改 Root 默认密码?**
209+
- 请点击右上角头像或侧边栏底部用户框进入 `后台管理`, 点击 `系统设置` 下常规设置操作栏的 `修改 Root 密码` 进行修改。或者选择在 `用户管理` 中选定 `root` 用户进行修改密码操作。
210+
5. **系统设置中的后端域名是什么?**
211+
- 后端域名是指后端 API 服务的地址, 默认为你访问站点后加 `/api` 的地址, 如 `https://example.com/api` 。(如果设置为非 *SERVE_STATIC* 模式, 开启前后端分离部署, 请将后端域名设置为你的后端 API 服务地址, 如 `https://api.example.com`)后端域名用于 Midjourney Proxy 服务的后端回调地址,如无需使用 Midjourney Proxy 服务, 请忽略此设置。
212+
6. **如何配置支付方式?**
213+
- Chat Nio 开源版支持发卡模式,设置系统设置中的购买链接为你的发卡地址即可。卡密可通过用户管理中兑换码管理中批量生成。
214+
7. **邀请码和兑换码有什么区别?**
215+
- 邀请码一种类型只能一个用户只能绑定一次, 发福利等方式可使用邀请码,可在头像下拉菜单中的邀请码中兑换。
216+
- 兑换码一种类型可以多个用户绑定, 可作为正常购买和发卡使用,可在用户管理中的兑换码管理中批量生成,在头像下拉菜单的点数(菜单第一个)内输入兑换码进行兑换。
217+
8. **该项目支持 Vercel 部署吗?**
218+
- Chat Nio 本身并不支持 Vercel 部署, 但是你可以使用前后端分离模式, Vercel 部署前端部分, 后端部分使用 Docker 部署或编译部署。
219+
9. **前后端分离部署模式是什么?**
220+
- 正常情况下,前后端在同一服务内,后端地址为 `/api`。前后端分离部署指前端和后端分别部署在不同的服务上,前端服务为静态文件服务,后端服务为 API 服务。
221+
- 举个例子,前端使用 Nginx (或 Vercel 等) 部署,部署的域名为 `https://www.chatnio.net`
222+
- 后端使用 Docker 部署,部署的域名为 `https://api.chatnio.net`
223+
- 此种部署方式需自行打包前端,配置环境变量 `VITE_BACKEND_ENDPOINT` 为你的后端地址,如 `https://api.chatnio.net`
224+
- 配置后端环境变量的 `SERVE_STATIC``false`,并配置 `ALLOW_ORIGINS` 为你的前端地址,如 `chatnio.net` (不需要加协议前缀,www 解析无需手动添加,后端将自动识别并允许跨域)。
225+
196226
## 📦 技术栈
197227
- 前端: React + Radix UI + Tailwind CSS + Redux
198228
- 后端: Golang + Gin + Redis + MySQL + Tiktoken (OpenAI)
199-
- 应用技术: PWA + HTTP2 + WebSocket + Stream Buffer
229+
- 应用技术: PWA + HTTP2 + websocket + Stream Buffer
200230

201231

202232
## 🎃 贡献者

globals/variables.go

-1
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,6 @@ const AnonymousMaxThread = 1
1111

1212
var AllowedOrigins = []string{
1313
"chatnio.net",
14-
"nextweb.chatnio.net",
1514
"fystart.cn",
1615
"fystart.com",
1716
}

main.go

+19
Original file line numberDiff line numberDiff line change
@@ -7,15 +7,33 @@ import (
77
"chat/auth"
88
"chat/channel"
99
"chat/cli"
10+
"chat/globals"
1011
"chat/manager"
1112
"chat/manager/conversation"
1213
"chat/middleware"
1314
"chat/utils"
1415
"fmt"
1516
"github.com/gin-gonic/gin"
1617
"github.com/spf13/viper"
18+
"net/url"
1719
)
1820

21+
func readCorsOrigins() {
22+
origins := viper.GetStringSlice("allow_origins")
23+
if len(origins) > 0 {
24+
globals.AllowedOrigins = utils.Each(origins, func(origin string) string {
25+
// remove protocol and trailing slash
26+
// e.g. https://chatnio.net/ -> chatnio.net
27+
28+
if host, err := url.Parse(origin); err == nil {
29+
return host.Host
30+
}
31+
32+
return origin
33+
})
34+
}
35+
}
36+
1937
func registerApiRouter(engine *gin.Engine) {
2038
var app *gin.RouterGroup
2139
if !viper.GetBool("serve_static") {
@@ -49,6 +67,7 @@ func main() {
4967

5068
utils.RegisterStaticRoute(app)
5169
registerApiRouter(app)
70+
readCorsOrigins()
5271

5372
if err := app.Run(fmt.Sprintf(":%s", viper.GetString("server.port"))); err != nil {
5473
panic(err)

0 commit comments

Comments
 (0)