使用项目
感谢以下两个项目:
FastGPT
以及我个人使用下来是需要一台2048MB
左右内存的机器会体验舒服不少。
前期准备(可选)
Azure
我现在主力使用的还是Azure
的免费Deepseek-R1
,需要进入到对应项目的概述栏,获取对应的密钥和Endpoint
即可。
火山引擎
字节的api
可以联网确实不戳,所以也用。需要三个参数,model
,api-key
以及endpoint
。model
和endpoint
是进入到你新建的联网应用中,点击API调用指南,第一个红框即为endpoint
,第二个为你的model
。
构建FastGPT
我个人为了方便备份,使用的是docker
,docker-compose.yml
如下:
# 数据库的默认账号和密码仅首次运行时设置有效
# 如果修改了账号密码,记得改数据库和项目连接参数,别只改一处~
# 该配置文件只是给快速启动,测试使用。正式使用,记得务必修改账号密码,以及调整合适的知识库参数,共享内存等。
# 如何无法访问 dockerhub 和 git,可以用阿里云(阿里云没有arm包)
version: '3.3'
services:
# db
pg:
image: pgvector/pgvector:0.7.0-pg15 # docker hub
# image: registry.cn-hangzhou.aliyuncs.com/fastgpt/pgvector:v0.7.0 # 阿里云
container_name: pg
restart: always
ports: # 生产环境建议不要暴露
- 5432:5432
networks:
- fastgpt
environment:
# 这里的配置只有首次运行生效。修改后,重启镜像是不会生效的。需要把持久化数据删除再重启,才有效果
- POSTGRES_USER=username
- POSTGRES_PASSWORD=password
- POSTGRES_DB=postgres
volumes:
- ./pg/data:/var/lib/postgresql/data
mongo:
image: mongo:5.0.18 # dockerhub
# image: registry.cn-hangzhou.aliyuncs.com/fastgpt/mongo:5.0.18 # 阿里云
# image: mongo:4.4.29 # cpu不支持AVX时候使用
container_name: mongo
restart: always
ports:
- 27017:27017
networks:
- fastgpt
command: mongod --keyFile /data/mongodb.key --replSet rs0
environment:
- MONGO_INITDB_ROOT_USERNAME=myusername
- MONGO_INITDB_ROOT_PASSWORD=mypassword
volumes:
- ./mongo/data:/data/db
entrypoint:
- bash
- -c
- |
openssl rand -base64 128 > /data/mongodb.key
chmod 400 /data/mongodb.key
chown 999:999 /data/mongodb.key
echo 'const isInited = rs.status().ok === 1
if(!isInited){
rs.initiate({
_id: "rs0",
members: [
{ _id: 0, host: "mongo:27017" }
]
})
}' > /data/initReplicaSet.js
# 启动MongoDB服务
exec docker-entrypoint.sh "$$@" &
# 等待MongoDB服务启动
until mongo -u myusername -p mypassword --authenticationDatabase admin --eval "print('waited for connection')" > /dev/null 2>&1; do
echo "Waiting for MongoDB to start..."
sleep 2
done
# 执行初始化副本集的脚本
mongo -u myusername -p mypassword --authenticationDatabase admin /data/initReplicaSet.js
# 等待docker-entrypoint.sh脚本执行的MongoDB服务进程
wait $$!
# fastgpt
sandbox:
container_name: sandbox
image: ghcr.io/labring/fastgpt-sandbox:v4.8.21-fix # git
# image: registry.cn-hangzhou.aliyuncs.com/fastgpt/fastgpt-sandbox:v4.8.21-fix # 阿里云
networks:
- fastgpt
restart: always
fastgpt:
container_name: fastgpt
image: ghcr.io/labring/fastgpt:v4.8.21-fix # git
# image: registry.cn-hangzhou.aliyuncs.com/fastgpt/fastgpt:v4.8.21-fix # 阿里云
ports:
# 对外暴露端口为3001,自行修改
- 3001:3000
networks:
- fastgpt
depends_on:
- mongo
- pg
- sandbox
restart: always
environment:
# 前端访问地址: http://localhost:3000
- FE_DOMAIN=
# root 密码,用户名为: root。如果需要修改 root 密码,直接修改这个环境变量,并重启即可。
- DEFAULT_ROOT_PSW=password
# AI模型的API地址哦。务必加 /v1。这里默认填写了OneApi的访问地址。
- OPENAI_BASE_URL=https://localhost:1111
# AI模型的API Key。(这里默认填写了OneAPI的快速默认key,测试通后,务必及时修改)
- CHAT_API_KEY=apikey
# 数据库最大连接数
- DB_MAX_LINK=30
# 登录凭证密钥
- TOKEN_KEY=any
# root的密钥,常用于升级时候的初始化请求
- ROOT_KEY=root_key
# 文件阅读加密
- FILE_TOKEN_KEY=filetoken
# MongoDB 连接参数. 用户名myusername,密码mypassword。
- MONGODB_URI=mongodb://myusername:mypassword@mongo:27017/fastgpt?authSource=admin
# pg 连接参数
- PG_URL=postgresql://username:password@pg:5432/postgres
# sandbox 地址
- SANDBOX_URL=http://sandbox:3000
# 日志等级: debug, info, warn, error
- LOG_LEVEL=info
- STORE_LOG_LEVEL=warn
# 工作流最大运行次数
- WORKFLOW_MAX_RUN_TIMES=1000
# 批量执行节点,最大输入长度
- WORKFLOW_MAX_LOOP_TIMES=100
# 自定义跨域,不配置时,默认都允许跨域(多个域名通过逗号分割)
- ALLOWED_ORIGINS=
# 是否开启IP限制,默认不开启
- USE_IP_LIMIT=false
volumes:
- ./config.json:/app/data/config.json
networks:
fastgpt:
构建完毕之后进入web
页面进行配置即可。
添加用户
官方为了推商业版,没有修改用户功能,只能自己手动了(悲)
首先是进入mongodb
的镜像,先使用docker ps -a
获取mongo
的容器ID,然后使用docker exec -it 容器ID bash
进入mongodb
容器内。
进入之后运行如下命令,连接上数据库。
mongo --host localhost --port 27017 -u 你的mongodb用户名 -p 你的mongodb密码
然后运行show dbs
,进入你的目标数据库use 你的目标数据库名
。新建用户的代码如下
db.getCollection("users").insert({
username: "username",
password: "756bc47cb5215dc3329ca7e1f7be33a2dad68990bb94b76d90aa07f4e44a233a", // 使用你的明文密码经过hash256加密两次之后的值,比如此处的示例就是1234经过两次hash256加密之后的值
status: "active",
promotionRate: NumberInt("15"),
timezone: "Asia/Shanghai",
createTime: new ISODate()
});
使用db.user.find()
查询到你的新用户的ID,将值更新到下面新建团队的代码中
db.getCollection("teams").insert({
name: "New Team",
ownerId: ObjectId("151242132121412"), // 新用户的 _id
avatar: "/icon/logo.svg", // 团队头像,根据需要调整
createTime: new ISODate(),
balance: NumberInt("100000"), // 初始团队余额,根据需要调整
maxSize: NumberInt("10"), // 团队最大成员数,根据需要调整
__v: NumberInt("0") // 版本号,根据实际情况调整
});
使用db.teams.find()
查询到你的新团队的ID,将值更新到下面插入团队成员的代码中
db.getCollection("team_members").insert({
teamId: ObjectId("67bdb4e14eb90198b9b7d6f4"), // 新团队的ID
userId: ObjectId("67bdb4aa4eb90198b9b7d6f3"), // 新用户的 _id
name: "Owner",
role: "owner",
status: "active",
createTime: new ISODate(),
defaultTeam: true
});
构建one-api
也是为了方便备份,使用docker
+sqlite
的组合,docker-compose.yml
如下
version: '3.8'
services:
one-api:
image: justsong/one-api
container_name: one-api
restart: always
ports:
- "43155:3000"
environment:
TZ: Asia/Shanghai
volumes:
- /root/one-api:/data
networks:
# 如果fastgpt和one-api在同台服务器上走内网,则将下面的网络修改成和fastgpt一样的
- fastgpt_fastgpt
networks:
fastgpt_fastgpt:
external: true
如果和我一样是想走内网,运行docker network inspect 你的网桥名称
查看对应镜像的内网IP
,然后调用的时候使用右边的3000
端口而不是左边的43155
端口即可。
添加Azure
类型选Azure
,endpoint
格式为https://XXX.services.ai.azure.com/models/chat/completions#
,一定要在后面带**#**;密钥填入对应的api-key
即可。
配合FastGPT
FastGPT
中填写的模型ID与One-API
中的模型相等即可,重定向为:
{
"你自己随便想的模型名": "endpoint识别的模型名"
}
然后去One-API
的页面新建一个令牌,该令牌即可作为填入FastGPT
的请求Key
。请求地址则为http://你之前获取的oneapi的内网地址:3000/v1/chat/completions
。
备份与恢复备份
因为自己的配置比较多,怕服务器突然炸了就没了,所以糊了一个备份脚本。
首先在本地新建一个backup.conf
,内容模板如下
# 基本配置
SOURCE_DIR="/root/fastgpt" # 需要备份的目录
BACKUP_DIR="/root/tmp" # 本地备份存储位置
RESTORE_DIR="/root/fastgpt" # 默认恢复位置
RCLONE_REMOTE="rclone1" # rclone 配置名称
CLOUD_DIR="backup" # 云端存储路径
# 保留策略
LOCAL_RETENTION=3 # 本地保留天数
CLOUD_RETENTION=3 # 云端保留天数
# 日志配置
LOG_FILE="/var/log/backup_system.log"
MAX_LOG_SIZE=10485760 # 10MB 自动轮转
备份脚本backup.sh
为
#!/bin/bash
# 配置文件路径
CONFIG_FILE="/etc/backup.conf"
# 加载配置
source $CONFIG_FILE || { echo "配置文件错误"; exit 1; }
# 生成带校验码的文件名
generate_filename() {
local checksum=$(find $SOURCE_DIR -type f -exec md5sum {} + | md5sum | cut -d' ' -f1)
echo "backup_$(date +"%Y%m%d")_${checksum:0:8}.zip"
}
# 执行备份
do_backup() {
echo "=== 开始备份 [$(date +'%Y-%m-%d %H:%M:%S')] ==="
# 创建临时工作区
local temp_dir=$(mktemp -d)
# 生成文件名
local backup_file=$(generate_filename)
# 压缩文件(带进度显示)
echo "压缩文件中..."
cd "$SOURCE_DIR" && zip -rq $temp_dir/$backup_file . || {
echo "压缩失败"; rm -rf $temp_dir; exit 2;
}
# 上传到云端
echo "正在上传到 $RCLONE_REMOTE..."
rclone copy $temp_dir/$backup_file $RCLONE_REMOTE:$CLOUD_DIR/ --progress && \
mv $temp_dir/$backup_file $BACKUP_DIR/ || {
echo "上传失败"; rm -rf $temp_dir; exit 3;
}
# 清理旧文件
echo "清理本地旧备份..."
find $BACKUP_DIR -name "*.zip" -mtime +$LOCAL_RETENTION -delete
echo "清理云端旧备份..."
rclone delete $RCLONE_REMOTE:$CLOUD_DIR/ --min-age $(($CLOUD_RETENTION * 1440))m -v --include "*.zip"
# 清理临时文件
rm -rf $temp_dir
echo "=== 备份完成 [$(date +'%Y-%m-%d %H:%M:%S')] ==="
}
do_backup >> $LOG_FILE 2>&1
恢复脚本为
#!/bin/bash
# 配置文件路径
CONFIG_FILE="/root/backup.conf"
source $CONFIG_FILE
# 交互式选择恢复文件
select_file() {
echo "正在获取云端备份列表..."
mapfile -t cloud_files < <(rclone lsf $RCLONE_REMOTE:$CLOUD_DIR/ | grep ".zip$" | sort -r)
[ ${#cloud_files[@]} -eq 0 ] && { echo "没有找到备份文件"; exit 1; }
PS3="请选择要恢复的文件编号: "
select file in "${cloud_files[@]}" "退出"; do
case $REPLY in
$(( ${#cloud_files[@]}+1 )) ) echo "退出"; exit 0 ;;
*) [ -n "$file" ] && { selected_file=$file; break; } ;;
esac
done
}
# 执行恢复
do_restore() {
echo "=== 开始恢复 ==="
select_file
read -p "输入本地恢复路径 [默认: $RESTORE_DIR]: " restore_path
restore_path=${restore_path:-$RESTORE_DIR}
mkdir -p "$restore_path"
# 下载文件
echo "正在下载 $selected_file ..."
rclone copy "$RCLONE_REMOTE:$CLOUD_DIR/$selected_file" "$restore_path/"
# 解压选项
read -p "是否解压文件? [y/N]: " unzip_choice
if [[ $unzip_choice =~ ^[Yy] ]]; then
echo "正在解压到 $restore_path ..."
unzip -o "$restore_path/$selected_file" -d "$restore_path" && \
echo "解压完成" || echo "解压过程中出现错误"
fi
echo "恢复文件路径: $restore_path/$selected_file"
}
do_restore