项目地址:https://github.com/LovelyCatEx/SakuraChat
部署 SakuraChat
前置条件
请确保部署设备至少有 2 GB 的可用运行内存与 4 GB 的可用储存空间。
宝塔部署
首先打开宝塔面板,在左侧找到 Docker,然后点击容器编排,再点添加容器编排:

将下面的 docker-compose.yml 和 .env 的内容复制到对应的输入框中:
docker-compose.yml
name: SakuraChat
services:
mysql:
container_name: sakurachat-mysql
image: lovelycatv/sakurachat-mysql:v1.0.0
environment:
- MYSQL_ROOT_PASSWORD=${MYSQL_PASSWORD}
healthcheck:
test: "/usr/bin/mysql --user=root --password=123456 --execute \"SHOW DATABASES;\""
interval: 3s
timeout: 1s
retries: 5
restart: unless-stopped
ports:
- ${MYSQL_PORT}:3306
networks:
- sakurachat-network
phpmyadmin:
image: phpmyadmin
container_name: sakurachat-phpmyadmin
depends_on:
- mysql
ports:
- 8088:80
environment:
- PMA_ARBITRARY=1
networks:
- sakurachat-network
backend:
container_name: sakurachat-server
image: lovelycatv/sakurachat-server:v1.0.0
build:
context: .
dockerfile: Dockerfile
depends_on:
- mysql
ports:
- "${BACKEND_PORT}:8080"
environment:
- MYSQL_HOST=${MYSQL_HOST}
- MYSQL_PORT=${MYSQL_PORT}
- MYSQL_USERNAME=${MYSQL_USERNAME}
- MYSQL_PASSWORD=${MYSQL_PASSWORD}
- MYSQL_DATABASE=${MYSQL_DATABASE}
- MYSQL_TIMEZONE=${MYSQL_TIMEZONE}
restart: unless-stopped
networks:
- sakurachat-network
frontend:
container_name: sakurachat-web
image: lovelycatv/sakurachat-web:v1.0.0
build:
context: ./web-dashboard
dockerfile: Dockerfile
ports:
- "${FRONTEND_PORT}:80"
restart: unless-stopped
depends_on:
- backend
networks:
- sakurachat-network
napcat:
image: mlikiowa/napcat-docker:latest
container_name: sakurachat-napcat
environment:
- NAPCAT_UID=1
- NAPCAT_GID=1
ports:
- "3000:3000"
- "3001:3001"
- "6099:6099"
restart: always
network_mode: bridge
networks:
sakurachat-network:
driver: bridge
.env
MYSQL_HOST=mysql
MYSQL_PORT=3306
MYSQL_USERNAME=root
MYSQL_PASSWORD=sakurachat
MYSQL_DATABASE=sakurachat
MYSQL_TIMEZONE=Asia/Shanghai
FRONTEND_PORT=5174
BACKEND_PORT=8080

然后点击确定,等待一段时间直到容器全部正常启动:

当容器启动成功之后你会看到:
其他具体步骤请看下面的快速开始。
命令行部署
先准备一个安装了 docker 环境的设备,复制下面的内容保存到 docker-compose.yml:
name: SakuraChat
services:
mysql:
container_name: sakurachat-mysql
image: lovelycatv/sakurachat-mysql:v1.0.0
environment:
- MYSQL_ROOT_PASSWORD=${MYSQL_PASSWORD}
healthcheck:
test: "/usr/bin/mysql --user=root --password=123456 --execute \"SHOW DATABASES;\""
interval: 3s
timeout: 1s
retries: 5
restart: unless-stopped
ports:
- ${MYSQL_PORT}:3306
networks:
- sakurachat-network
phpmyadmin:
image: phpmyadmin
container_name: sakurachat-phpmyadmin
depends_on:
- mysql
ports:
- 8088:80
environment:
- PMA_ARBITRARY=1
networks:
- sakurachat-network
backend:
container_name: sakurachat-server
image: lovelycatv/sakurachat-server:v1.0.0
build:
context: .
dockerfile: Dockerfile
depends_on:
- mysql
ports:
- "${BACKEND_PORT}:8080"
environment:
- MYSQL_HOST=${MYSQL_HOST}
- MYSQL_PORT=${MYSQL_PORT}
- MYSQL_USERNAME=${MYSQL_USERNAME}
- MYSQL_PASSWORD=${MYSQL_PASSWORD}
- MYSQL_DATABASE=${MYSQL_DATABASE}
- MYSQL_TIMEZONE=${MYSQL_TIMEZONE}
restart: unless-stopped
networks:
- sakurachat-network
frontend:
container_name: sakurachat-web
image: lovelycatv/sakurachat-web:v1.0.0
build:
context: ./web-dashboard
dockerfile: Dockerfile
ports:
- "${FRONTEND_PORT}:80"
restart: unless-stopped
depends_on:
- backend
networks:
- sakurachat-network
napcat:
image: mlikiowa/napcat-docker:latest
container_name: sakurachat-napcat
environment:
- NAPCAT_UID=1
- NAPCAT_GID=1
ports:
- "3000:3000"
- "3001:3001"
- "6099:6099"
restart: always
network_mode: bridge
networks:
sakurachat-network:
driver: bridge
然后在同级目录下新建一个 .env 文件:
MYSQL_HOST=mysql
MYSQL_PORT=3306
MYSQL_USERNAME=root
MYSQL_PASSWORD=sakurachat
MYSQL_DATABASE=sakurachat
MYSQL_TIMEZONE=Asia/Shanghai
FRONTEND_PORT=5174
BACKEND_PORT=8080
运行命令:
docker compose up -d
其他具体步骤请看下面的快速开始。
快速开始
初始化
打开 http://localhost:5174/initializer 完成初始化,这里的 ip 地址记得换成实际的 ip,如果是在本地部署保持 localhost 即可。

在表单中填入你想设置的管理员账号和密码,邮箱请务必使用一个有效的电子邮箱地址。

到这里就初始化完成啦,点击完成初始化即可进入登录页面,登录后进入仪表盘页面:

配置 NapCat
接下来需要将 NapCat 接入,首先要进入 NapCat 的容器查看管理页面的地址。
如果你使用的是宝塔,在左侧找到 Docker,在上方点击容器编排,然后在容器列表中找到 napcap,点击查看日志。
如果你使用的是命令行,先执行 docker ps -a 查看容器列表:

然后执行 docker logs sakurachat-napcat 查看日志,往上翻找到下面的字样:

然后打开图中红框内的地址(以你实际的为准)进入 NapCat 的管理页面:
如果是服务器请不要忘记在安全组放行 6099 端口。

点击扫码登录,然后将手机 QQ 的账号切换到你想用作机器人的那个账号,扫描二维码登录。
进去之后在左侧找到网络配置:

点击新建 -> Websocket客户端:

然后按下面的内容填写:

这里的 url 是:ws://host.docker.internal:8080/ws/v1/napcat
如果你在环境变量中修改了 BACKEND_PORT=8080 记得把 8080 改成实际的后端端口。
然后点击保存即可。
你可以执行 docker logs sakurachat-server 检查一下 NapCat 有没有成功连接到 SakuraChat 的后端,如果出现下面的字样说明就成功了。

基本配置
现在你已经成功启动了 SakuraChat 和 NapCat 并完成了连接,接下来需要设置模型提供商、聊天模型、凭证、添加智能体、绑定第三方账号。
添加模型提供商
模型供应商指的是提供模型的第三方平台,例如 DeepSeek、火山方舟、OpenAI 等,进入 SakuraChat 的管理页面,点击左侧的模型供应商,点击右上角的添加:

像这样填好之后点击完成。
添加凭证
接下来需要添加一个凭证,凭证就是 apikey,在模型列表中,你可以为同一个模型指定不同的 apikey,也就是凭证。
目前来说,大多数第三方模型平台都采用 Bearer Auth 作为认证,因此进入凭证管理,点击右上角的新增凭证:

上面我添加的是 deepseek 的模型提供商,因此这里的凭证数据直接填写 deepseek 的 apikey 即可,不需要任何前缀或后缀。
添加聊天模型
接下来就要添加语言模型了,点击右上角的新增模型:

其中的计费倍率的规则如下:
假设 SakuraChat 平台的规则是:1 元 = 100 万积分
而 DeepSeek 官方的模型定价是:
- 输入:2 元 / M Tokens
- 输出:3 元 / M Tokens
- 缓存输入:0.2 元 / M Tokens
因此根据上述规则,每输入每消耗 100 M Tokens 对应要扣除 200 M 积分。
所以该模型每消耗 1 个 Token 就要扣除 2 积分。
根据计费倍率 10000 : 1,这里的输入 Token 费率就应该填写 10000 * 2 = 20000。
添加智能体
同样地来到智能体管理页面,点击右上角的新增智能体:

这里的分隔符用于分割模型输出的消息,这里的 \n 代表换行符。
也就是说,每遇到一个分隔符,就会把分隔符之前的消息发送出去,这样就能模拟发送多条连续的消息了。
你可以将下面的提示词嵌入到你自定义的提示词中,本质上是要让模型按照你预设的分隔符输出文本。
# 回复要求
## 基本规则
你是在通过一款即时聊天 APP 和对方交流,因此你的一句话不宜过长,最好是将完整的一段话拆分成多个子句回答,子句之间必须用换行符分割开,请见回复示例。
+ 禁止使用任何 emoji 或符号表情。
+ 禁止发送重复消息。
+ 单次回复控制在日常对话的长度,**越短越好**。同时请用轻松、口语化的方式回答,就像和朋友聊天一样,不要加任何列表符号、分点符号或特殊格式,直接说人话,读起来要像一条自然的消息。
+ 禁止使用括号旁白,或大量使用`......`等影响阅读体验的方式。
+ 子句禁止以不合适的标点符号结尾,例如逗号。
+ **子句不需要标点符号结尾,即使是问句也不需要出现问号,除非你有非常强烈的表达意图,例如:"你好呀~"需要用'~'来表达温柔的语气,但例如:"今天过的怎么样"这句话就不需要问号,例如:"我有没有说过别这样?"来表达情绪激动时的语句**
## 子句
子句是一段完整表达的一部分,可以以标点符号作为分隔符,在合适的位置切分成一个子句。
例如完整的句子:你好呀~你今天过的怎么样?有没有想我?对了,这周六晚上有空吗,我请你吃饭吧,没别的想法。
拆分成子句是:
+ 你好呀~
+ 你今天过的怎么样?
+ 有没有想我?
+ 对了
+ 这周六晚上有空吗
+ 我请你吃饭吧
+ 没别的想法
## 回复示例
你好呀~
你今天过的怎么样?
有没有想我?
我们好久没见了吧
要不
我们出来一起走走吧
绑定第三方账号
接下来你可以给这个 QQ 发送一条消息,理论上不会有任何反应,因为你还没有将智能体绑定到这个第三方账号。
再次回到智能体管理页面,点击操作中的小人:

然后点击选择账号绑定:


这样就把这个智能体绑定到对应的第三方账号了,当这个账号收到消息时,会交给绑定的智能体来处理。
接下来,再次向这个账号发送一条消息:

得到一条消息,里面包含了一个六位数字的绑定码。
然后来到第三方账号绑定,输入绑定码:

这样给这个智能体发送消息的第三方账号就成功绑定到 SakuraChat 平台了。
接下来,如果你没有积分,可以进入用户管理页面,点击操作中的编辑,给自己添加一些积分。
接下来你就可以开始聊天啦~

