Commit 9a3eabd4 by 赵月辉

feat: 迁移 lufa 定制 - 根配置与独立功能文件

- 根 package.json:合并 scripts(migration:collaborator/test:workflow)
- 文档:dev.md 等采用官方最新版
- lufa 独立功能文件:scripts/migration、测试脚本、根目录配置等
- .env 文件:lufa 环境配置(需人工检查敏感信息)

迁移方式:以官方 v4.14.30 为基底,三向合并 lufa(基于 v4.12.1)的定制改动
parent eed99aae
...@@ -16,7 +16,8 @@ yarn-error.log* ...@@ -16,7 +16,8 @@ yarn-error.log*
.pnpm-debug.log* .pnpm-debug.log*
# local env files # local env files
.env*.local # 内部库,添加local文件到环境中
# .env*.local
# vercel # vercel
.vercel .vercel
......
public-hoist-pattern[]=*tiktoken* public-hoist-pattern[]=*tiktoken*
public-hoist-pattern[]=*@zilliz/milvus2-sdk-node* public-hoist-pattern[]=*@zilliz/milvus2-sdk-node*
registry=https://registry.npmjs.org/ registry=https://registry.npmmirror.com/
\ No newline at end of file \ No newline at end of file
cd AiAgentGPT
git pull
docker build -t registry.cn-shanghai.aliyuncs.com/aiagentsflow/fastgpt:latest --build-arg name=app .
docker-compose up -d
This diff is collapsed. Click to expand it.
# 数据库的默认账号和密码仅首次运行时设置有效
# 如果修改了账号密码,记得改数据库和项目连接参数,别只改一处~
# 该配置文件只是给快速启动,测试使用。正式使用,记得务必修改账号密码,以及调整合适的知识库参数,共享内存等。
# 如何无法访问 dockerhub 和 git,可以用阿里云(阿里云没有arm包)
version: '3.3'
services:
# Vector DB
pg:
image: pgvector/pgvector:0.8.0-pg15 # docker hub
# image: registry.cn-hangzhou.aliyuncs.com/fastgpt/pgvector:v0.8.0-pg15 # 阿里云
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
healthcheck:
test: ['CMD', 'pg_isready', '-U', 'username', '-d', 'postgres']
interval: 5s
timeout: 5s
retries: 10
# DB
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
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')"; 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 $$!
redis:
image: redis:7.2-alpine
container_name: redis
networks:
- fastgpt
restart: always
command: |
redis-server --requirepass mypassword --loglevel warning --maxclients 10000 --appendonly yes --save 60 10 --maxmemory 4gb --maxmemory-policy noeviction
healthcheck:
test: ['CMD', 'redis-cli', '-a', 'mypassword', 'ping']
interval: 10s
timeout: 3s
retries: 3
start_period: 30s
volumes:
- ./redis/data:/data
fastgpt-minio:
image: minio/minio:latest
container_name: fastgpt-minio
restart: always
networks:
- fastgpt
ports: # comment out if you do not need to expose the port (in production environment, you should not expose the port)
- '9100:9000'
- '9101:9001'
environment:
- MINIO_ROOT_USER=minioadmin
- MINIO_ROOT_PASSWORD=minioadmin
volumes:
- ./fastgpt-minio:/data
command: server /data --console-address ":9101"
healthcheck:
test: ['CMD', 'curl', '-f', 'http://localhost:9100/minio/health/live']
interval: 30s
timeout: 20s
retries: 3
fastgpt:
container_name: fastgpt
image: ghcr.io/labring/fastgpt:v4.12.0 # git
# image: registry.cn-hangzhou.aliyuncs.com/fastgpt/fastgpt:v4.12.0 # 阿里云
ports:
- 3000:3000
networks:
- fastgpt
depends_on:
- mongo
- sandbox
- pg
restart: always
environment:
# 前端外部可访问的地址,用于自动补全文件资源路径。例如 https:fastgpt.cn,不能填 localhost。这个值可以不填,不填则发给模型的图片会是一个相对路径,而不是全路径,模型可能伪造Host。
- FE_DOMAIN=
# root 密码,用户名为: root。如果需要修改 root 密码,直接修改这个环境变量,并重启即可。
- DEFAULT_ROOT_PSW=1234
# 登录凭证密钥
- TOKEN_KEY=any
# root的密钥,常用于升级时候的初始化请求
- ROOT_KEY=root_key
# 文件阅读加密
- FILE_TOKEN_KEY=filetoken
# 密钥加密key
- AES256_SECRET_KEY=fastgptkey
# plugin 地址
- PLUGIN_BASE_URL=http://fastgpt-plugin:3000
- PLUGIN_TOKEN=xxxxxx
# sandbox 地址
- SANDBOX_URL=http://sandbox:3000
# AI Proxy 的地址,如果配了该地址,优先使用
- AIPROXY_API_ENDPOINT=http://aiproxy:3000
# AI Proxy 的 Admin Token,与 AI Proxy 中的环境变量 ADMIN_KEY
- AIPROXY_API_TOKEN=aiproxy
# 数据库最大连接数
- DB_MAX_LINK=30
# MongoDB 连接参数. 用户名myusername,密码mypassword。
- MONGODB_URI=mongodb://myusername:mypassword@mongo:27017/fastgpt?authSource=admin
# Redis 连接参数
- REDIS_URL=redis://default:mypassword@redis:6379
# 向量库 连接参数
- PG_URL=postgresql://username:password@pg:5432/postgres
# 日志等级: debug, info, warn, error
- LOG_LEVEL=info
- STORE_LOG_LEVEL=warn
# 工作流最大运行次数
- WORKFLOW_MAX_RUN_TIMES=1000
# 批量执行节点,最大输入长度
- WORKFLOW_MAX_LOOP_TIMES=100
# 对话文件过期天数
- CHAT_FILE_EXPIRE_TIME=7
volumes:
- ./config.json:/app/data/config.json
sandbox:
container_name: sandbox
image: ghcr.io/labring/fastgpt-sandbox:v4.12.0 # git
# image: registry.cn-hangzhou.aliyuncs.com/fastgpt/fastgpt-sandbox:v4.12.0 # 阿里云
networks:
- fastgpt
restart: always
fastgpt-mcp-server:
container_name: fastgpt-mcp-server
image: ghcr.io/labring/fastgpt-mcp_server:v4.12.0 # git
# image: registry.cn-hangzhou.aliyuncs.com/fastgpt/fastgpt-mcp_server:v4.12.0 # 阿里云
ports:
- 3005:3000
networks:
- fastgpt
restart: always
environment:
- FASTGPT_ENDPOINT=http://fastgpt:3000
fastgpt-plugin:
image: ghcr.io/labring/fastgpt-plugin:v0.1.9 # git
# image: registry.cn-hangzhou.aliyuncs.com/fastgpt/fastgpt-plugin:v0.1.9 # 阿里云
container_name: fastgpt-plugin
restart: always
networks:
- fastgpt
environment:
- AUTH_TOKEN=xxxxxx # 如果不需要鉴权可以直接去掉这个环境变量
# 改成 minio 可访问地址,例如 http://192.168.2.2:9000/fastgpt-plugins
# 必须指向 Minio 的桶的地址
# 如果 Minio 可以直接通过外网访问,可以不设置这个环境变量
# - MINIO_CUSTOM_ENDPOINT=http://192.168.2.2:9000
- MINIO_ENDPOINT=fastgpt-minio
- MINIO_PORT=9000
- MINIO_USE_SSL=false
- MINIO_ACCESS_KEY=minioadmin
- MINIO_SECRET_KEY=minioadmin
- MINIO_BUCKET=fastgpt-plugins
depends_on:
fastgpt-minio:
condition: service_healthy
# AI Proxy
aiproxy:
image: ghcr.io/labring/aiproxy:v0.2.2
# image: registry.cn-hangzhou.aliyuncs.com/labring/aiproxy:v0.2.2 # 阿里云
container_name: aiproxy
restart: unless-stopped
depends_on:
aiproxy_pg:
condition: service_healthy
networks:
- fastgpt
environment:
# 对应 fastgpt 里的AIPROXY_API_TOKEN
- ADMIN_KEY=aiproxy
# 错误日志详情保存时间(小时)
- LOG_DETAIL_STORAGE_HOURS=1
# 数据库连接地址
- SQL_DSN=postgres://postgres:aiproxy@aiproxy_pg:5432/aiproxy
# 最大重试次数
- RETRY_TIMES=3
# 不需要计费
- BILLING_ENABLED=false
# 不需要严格检测模型
- DISABLE_MODEL_CONFIG=true
healthcheck:
test: ['CMD', 'curl', '-f', 'http://localhost:3000/api/status']
interval: 5s
timeout: 5s
retries: 10
aiproxy_pg:
image: pgvector/pgvector:0.8.0-pg15 # docker hub
# image: registry.cn-hangzhou.aliyuncs.com/fastgpt/pgvector:v0.8.0-pg15 # 阿里云
restart: unless-stopped
container_name: aiproxy_pg
volumes:
- ./aiproxy_pg:/var/lib/postgresql/data
networks:
- fastgpt
environment:
TZ: Asia/Shanghai
POSTGRES_USER: postgres
POSTGRES_DB: aiproxy
POSTGRES_PASSWORD: aiproxy
healthcheck:
test: ['CMD', 'pg_isready', '-U', 'postgres', '-d', 'aiproxy']
interval: 5s
timeout: 5s
retries: 10
networks:
fastgpt:
# 数据库的默认账号和密码仅首次运行时设置有效
# 如果修改了账号密码,记得改数据库和项目连接参数,别只改一处~
# 该配置文件只是给快速启动,测试使用。正式使用,记得务必修改账号密码,以及调整合适的知识库参数,共享内存等。
# 如何无法访问 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.8.0-pg15 # 阿里云
container_name: aiagents-pg
restart: always
ports: # 生产环境建议不要暴露
- 5432:5432
networks:
- fastgpt
environment:
# 这里的配置只有首次运行生效。修改后,重启镜像是不会生效的。需要把持久化数据删除再重启,才有效果
- POSTGRES_USER=root
- POSTGRES_PASSWORD=moming1234
- 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: aiagents-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')"; 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
ports:
- 3003:3003
#image: ghcr.io/labring/fastgpt-sandbox:latest # git
image: aiagentsflow/fastgpt-sandbox:latest # 阿里云
networks:
- fastgpt
restart: always
fastgpt-mcp-server:
container_name: fastgpt-mcp-server
image: aiagentsflow/mcp-server:latest
ports:
- 3005:3005
networks:
- fastgpt
restart: always
environment:
- FASTGPT_ENDPOINT=http://127.0.0.1:3006
redis:
image: redis:7.2-alpine
container_name: aiagents-redis
# ports:
# - 6379:6379
networks:
- fastgpt
restart: always
command: |
redis-server --requirepass admin1234 --loglevel warning --maxclients 10000 --appendonly yes --save 60 10 --maxmemory 4gb --maxmemory-policy noeviction
volumes:
- ./redis/data:/data
fastgpt:
container_name: fastgpt
#image: ghcr.io/labring/fastgpt:v4.8.7 # git
image: aiagentsflow/fastgpt:latest # 阿里云
ports:
- 3006:3006
network_mode: host
depends_on:
- mongo
- pg
restart: always
environment:
- FE_DOMAIN=
# root 密码,用户名为: root。如果需要修改 root 密码,直接修改这个环境变量,并重启即可。
- DEFAULT_ROOT_PSW=aiagentsflow4321
# AI Proxy 的地址,如果配了该地址,优先使用
#- AIPROXY_API_ENDPOINT=http://aiproxy:3000
# AI Proxy 的 Admin Token,与 AI Proxy 中的环境变量 ADMIN_KEY
#- AIPROXY_API_TOKEN=aiproxy_aiagentsflow
# AI模型的API地址哦。务必加 /v1。这里默认填写了OneApi的访问地址。
- OPENAI_BASE_URL=http://127.0.0.1:3000/v1
#- OPENAI_BASE_URL=http://129.226.4.132:3000/v1
# AI模型的API Key。(这里默认填写了OneAPI的快速默认key,测试通后,务必及时修改)
- CHAT_API_KEY=sk-aiagentsflow_admin
# 数据库最大连接数
- DB_MAX_LINK=30
# 登录凭证密钥
- TOKEN_KEY=any
# root的密钥,常用于升级时候的初始化请求
- ROOT_KEY=aiagentsflow_root_key
# 文件阅读加密
- FILE_TOKEN_KEY=filetoken
# MongoDB 连接参数. 用户名myusername,密码mypassword。
- MONGODB_URI=mongodb://myusername:mypassword@172.18.0.1:27017/fastgpt?authSource=admin&directConnection=true
# pg 连接参数
- PG_URL=postgresql://root:moming1234@172.18.0.1:5432/postgres
# sandbox 地址
- SANDBOX_URL=http://172.18.0.1:3003
# Redis 连接参数
- REDIS_URL=redis://:admin1234@172.19.0.7:6379/0
# 日志等级: debug, info, warn, error
- LOG_LEVEL=info
- STORE_LOG_LEVEL=warn
# 日志等级: debug, info, warn, error
# 工作流最大运行次数
- WORKFLOW_MAX_RUN_TIMES=1000
# 批量执行节点,最大输入长度
- WORKFLOW_MAX_LOOP_TIMES=100
# 自定义跨域,不配置时,默认都允许跨域(多个域名通过逗号分割)
- ALLOWED_ORIGINS=
# 是否开启IP限制,默认不开启
- USE_IP_LIMIT=false
volumes:
- ./config.json:/app/data/config.json
# oneapi
new-api:
image: calciumion/new-api:latest
container_name: new-api
restart: always
command: --log-dir /app/logs
ports:
- 3000:3000
network_mode: host
volumes:
- ./oneapi:/data
- ./logs:/app/logs
environment:
- SQL_DSN=root:aiagentsflow4321@tcp(127.0.0.1:3306)/new-api # Point to the mysql service
- REDIS_CONN_STRING=redis://:admin1234@172.19.0.7:6379/1
- TZ=Asia/Shanghai
- TIKTOKEN_CACHE_DIR=/data/cache
# - SESSION_SECRET=random_string # 多机部署时设置,必须修改这个随机字符串!!!!!!!
# - NODE_TYPE=slave # Uncomment for slave node in multi-node deployment
# - SYNC_FREQUENCY=60 # Uncomment if regular database syncing is needed
# - FRONTEND_BASE_URL=https://openai.justsong.cn # Uncomment for multi-node deployment with front-end URL
depends_on:
- mysql
healthcheck:
test:
[
'CMD-SHELL',
"wget -q -O - http://localhost:3000/api/status | grep -o '\"success\":\\s*true' | awk -F: '{print $$2}'"
]
interval: 30s
timeout: 10s
retries: 3
mysql:
image: mysql:8.2
container_name: aiagents-mysql
restart: always
environment:
MYSQL_ROOT_PASSWORD: aiagentsflow4321 # Ensure this matches the password in SQL_DSN
MYSQL_DATABASE: new-api
volumes:
- ./mysql_data:/var/lib/mysql
network_mode: host
command: --default-authentication-plugin=mysql_native_password
ports:
- 3306:3306
gpt-admin:
image: aiagentsflow/gptadmin:latest
container_name: gpt-admin
restart: always
networks:
- fastgpt
ports:
- 8020:8020
depends_on:
- mysql
volumes:
- ./uploadPath:/uploadPath
environment:
- SPRING_PROFILES_ACTIVE=druid
- SPRING_REDIS_URL=redis://:admin1234@172.19.0.7:6379/0
- SPRING_DATA_MONGODB_URI=mongodb://myusername:mypassword@aiagents-mongo:27017/fastgpt?authSource=admin
# MySQL数据库用户名
- SPRING_DATASOURCE_USERNAME=root
# MySQL数据库密码
- SPRING_DATASOURCE_PASSWORD=aiagentsflow4321
- SPRING_DATASOURCE_URL=jdbc:mysql://172.18.0.1:3306/aiagentsflow?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
networks:
fastgpt:
# 数据库的默认账号和密码仅首次运行时设置有效
# 如果修改了账号密码,记得改数据库和项目连接参数,别只改一处~
# 该配置文件只是给快速启动,测试使用。正式使用,记得务必修改账号密码,以及调整合适的知识库参数,共享内存等。
# 如何无法访问 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.8.0-pg15 # 阿里云
container_name: pg
restart: always
ports: # 生产环境建议不要暴露
- 5432:5432
networks:
- fastgpt
environment:
# 这里的配置只有首次运行生效。修改后,重启镜像是不会生效的。需要把持久化数据删除再重启,才有效果
- POSTGRES_USER=root
- POSTGRES_PASSWORD=moming1234
- 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=root
- MONGO_INITDB_ROOT_PASSWORD=moming1234
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 root -p moming1234 --authenticationDatabase admin --eval "print('waited for connection')" > /dev/null 2>&1; do
echo "Waiting for MongoDB to start..."
sleep 2
done
# 执行初始化副本集的脚本
mongo -u root -p moming1234 --authenticationDatabase admin /data/initReplicaSet.js
# 等待docker-entrypoint.sh脚本执行的MongoDB服务进程
wait $$!
redis:
image: redis:7.2-alpine
container_name: redis
# ports:
# - 6379:6379
networks:
- fastgpt
restart: always
command: |
redis-server --requirepass mypassword --loglevel warning --maxclients 10000 --appendonly yes --save 60 10 --maxmemory 4gb --maxmemory-policy noeviction
volumes:
- ./redis/data:/data
# fastgpt
sandbox:
container_name: sandbox
#image: ghcr.io/labring/fastgpt-sandbox:latest # git
image: aiagentsflow/fastgpt-sandbox:latest # 阿里云
ports:
- 3003:3003
networks:
- fastgpt
restart: always
fastgpt-mcp-server:
container_name: fastgpt-mcp-server
image: aiagentsflow/mcp-server:latest
ports:
- 3005:3005
networks:
- fastgpt
restart: always
environment:
- FASTGPT_ENDPOINT=http://fastgpt:3000
fastgpt-minio:
image: minio/minio:latest
container_name: fastgpt-minio
restart: always
networks:
- fastgpt
ports: # comment out if you do not need to expose the port (in production environment, you should not expose the port)
- '9100:9000'
- '9101:9001'
environment:
- MINIO_ROOT_USER=minioadmin
- MINIO_ROOT_PASSWORD=minioadmin
volumes:
- ./fastgpt-minio:/data
command: server /data --console-address ":9001"
healthcheck:
test: ['CMD', 'curl', '-f', 'http://localhost:9000/minio/health/live']
interval: 30s
timeout: 20s
retries: 3
fastgpt:
container_name: fastgpt
#image: ghcr.io/labring/fastgpt:v4.8.7 # git
image: registry.cn-shanghai.aliyuncs.com/aiagentsflow/fastgpt:latest # 阿里云
ports:
- 3000:3000
networks:
- fastgpt
depends_on:
- mongo
- pg
- sandbox
restart: always
environment:
- FE_DOMAIN=https://gpt.aiagentsflow.com
# root 密码,用户名为: root。如果需要修改 root 密码,直接修改这个环境变量,并重启即可。
- DEFAULT_ROOT_PSW=aiagentsflow4321
# AI Proxy 的地址,如果配了该地址,优先使用
#- AIPROXY_API_ENDPOINT=http://aiproxy:3000
# AI Proxy 的 Admin Token,与 AI Proxy 中的环境变量 ADMIN_KEY
#- AIPROXY_API_TOKEN=aiproxy_aiagentsflow
# AI模型的API地址哦。务必加 /v1。这里默认填写了OneApi的访问地址。
- OPENAI_BASE_URL=https://api-2.xi-ai.cn/v1
#- OPENAI_BASE_URL=http://129.226.4.132:3000/v1
# AI模型的API Key。(这里默认填写了OneAPI的快速默认key,测试通后,务必及时修改)
- CHAT_API_KEY=sk-5fOz45QfeJ6O8b90Ae653bC5Af5f4a219c99F4E01c390327
# 数据库最大连接数
- DB_MAX_LINK=30
# 登录凭证密钥
- TOKEN_KEY=any
# root的密钥,常用于升级时候的初始化请求
- ROOT_KEY=aiagentsflow_root_key
# 文件阅读加密
- FILE_TOKEN_KEY=filetoken
# MongoDB 连接参数. 用户名myusername,密码mypassword。
- MONGODB_URI=mongodb://root:moming1234@mongo:27017/fastgpt?authSource=admin
# pg 连接参数
- PG_URL=postgresql://root:moming1234@pg:5432/postgres
# plugin 地址
- PLUGIN_BASE_URL=http://fastgpt-plugin:3000
- PLUGIN_TOKEN=xxxxxx
# sandbox 地址
- SANDBOX_URL=http://sandbox:3003
# Redis 连接参数
- REDIS_URL=redis://default:admin1234@47.100.235.116:6379/0
# 日志等级: debug, info, warn, error
- LOG_LEVEL=debug
- STORE_LOG_LEVEL=warn
# 日志等级: debug, info, warn, error
# 工作流最大运行次数
- WORKFLOW_MAX_RUN_TIMES=1000
# 批量执行节点,最大输入长度
- WORKFLOW_MAX_LOOP_TIMES=100
# 自定义跨域,不配置时,默认都允许跨域(多个域名通过逗号分割)
- ALLOWED_ORIGINS=
# 是否开启IP限制,默认不开启
- USE_IP_LIMIT=false
volumes:
- ./config.json:/app/data/config.json
# oneapi
mysql:
image: registry.cn-hangzhou.aliyuncs.com/fastgpt/mysql:8.0.36 # 阿里云
#image: mysql:8.0.36
container_name: aiagentsflow_mysql
restart: always
ports:
- 6033:3306
networks:
- fastgpt
command: --default-authentication-plugin=mysql_native_password
environment:
# 默认root密码,仅首次运行有效
MYSQL_ROOT_PASSWORD: aiagentsflowmysql
MYSQL_DATABASE: oneapi
volumes:
- ./mysql2:/var/lib/mysql
fastgpt-plugin:
image: ghcr.io/labring/fastgpt-plugin:v0.1.9 # git
# image: registry.cn-hangzhou.aliyuncs.com/fastgpt/fastgpt-plugin:v0.1.9 # 阿里云
container_name: fastgpt-plugin
restart: always
networks:
- fastgpt
environment:
#- AUTH_TOKEN=xxxxxx # 如果不需要鉴权可以直接去掉这个环境变量
# 改成 minio 可访问地址,例如 http://192.168.2.2:9000/fastgpt-plugins
# 必须指向 Minio 的桶的地址
# 如果 Minio 可以直接通过外网访问,可以不设置这个环境变量
- MINIO_CUSTOM_ENDPOINT=https://gpt.aiagentsflow.com/fastgpt-plugins
- MINIO_ENDPOINT=fastgpt-minio
- MINIO_PORT=9000
- MINIO_USE_SSL=false
- MINIO_ACCESS_KEY=minioadmin
- MINIO_SECRET_KEY=minioadmin
- MINIO_BUCKET=fastgpt-plugins
depends_on:
fastgpt-minio:
condition: service_healthy
# AI Proxy
aiproxy:
#image: ghcr.io/labring/aiproxy:v0.1.3
image: registry.cn-hangzhou.aliyuncs.com/labring/aiproxy:v0.1.3 # 阿里云
container_name: aiproxy
restart: unless-stopped
depends_on:
aiproxy_pg:
condition: service_healthy
networks:
- fastgpt
environment:
# 对应 fastgpt 里的AIPROXY_API_TOKEN
- ADMIN_KEY=aiproxy_aiagentsflow
# 错误日志详情保存时间(小时)
- LOG_DETAIL_STORAGE_HOURS=1
# 数据库连接地址
- SQL_DSN=postgres://postgres:aiproxy@aiproxy_pg:5432/aiproxy
# 最大重试次数
- RETRY_TIMES=3
# 不需要计费
- BILLING_ENABLED=false
# 不需要严格检测模型
- DISABLE_MODEL_CONFIG=true
healthcheck:
test: ['CMD', 'curl', '-f', 'http://localhost:3000/api/status']
interval: 5s
timeout: 5s
retries: 10
aiproxy_pg:
#image: pgvector/pgvector:0.8.0-pg15 # docker hub
image: registry.cn-hangzhou.aliyuncs.com/fastgpt/pgvector:v0.8.0-pg15 # 阿里云
restart: unless-stopped
container_name: aiproxy_pg
volumes:
- ./aiproxy_pg:/var/lib/postgresql/data
networks:
- fastgpt
environment:
TZ: Asia/Shanghai
POSTGRES_USER: postgres
POSTGRES_DB: aiproxy
POSTGRES_PASSWORD: aiproxy
healthcheck:
test: ['CMD', 'pg_isready', '-U', 'postgres', '-d', 'aiproxy']
interval: 5s
timeout: 5s
retries: 10
networks:
fastgpt:
---
title: 'V4.12.1'
description: 'FastGPT V4.12.1 更新说明'
---
## 更新指南
### 1. 更新镜像:
- 更新 FastGPT 镜像tag: v4.12.1
- 更新 FastGPT 商业版镜像tag: v4.12.1
- 更新 fastgpt-plugin 镜像 tag: v0.1.10
- mcp_server 无需更新
- Sandbox 无需更新
- AIProxy 无需更新
## 🚀 新增内容
1. Prompt 自动生成和优化。
2. 增加`SIGNOZ_STORE_LEVEL`参数,可以控制 Signoz 日志存储级别。
## ⚙️ 优化
1. 工作流响应优化,主动指定响应值进入历史记录,而不是根据 key 决定。
2. 避免工作流中,变量替换导致的死循环或深度递归风险。
3. 对话日志导出,固定导出对话详情。
4. 分页器 UI 优化。
## 🐛 修复
1. 工具密钥输入,boolean 值无法通过 form 校验。
2. 对话页,pane切换可能导致数据异常。
3. 对话日志看板数据表索引不正确。
## 🔨 工具更新
1. 支持对系统工具单独配置 Tool description,更利于模型理解。
{ {
"name": "fastgpt", "name": "AI Agents Flow",
"version": "4.0", "version": "4.0",
"private": true, "private": true,
"scripts": { "scripts": {
...@@ -24,6 +24,8 @@ ...@@ -24,6 +24,8 @@
"test:service": "turbo run test --filter=@fastgpt/service", "test:service": "turbo run test --filter=@fastgpt/service",
"test:service:integration": "turbo run test:integration --filter=@fastgpt/service", "test:service:integration": "turbo run test:integration --filter=@fastgpt/service",
"test:vector": "turbo run test:integration --filter=@fastgpt/service", "test:vector": "turbo run test:integration --filter=@fastgpt/service",
"test:workflow": "vitest run workflow",
"migration:collaborator": "npx ts-node scripts/migration/migrateCollaboratorToResource.ts",
"build:sdks": "pnpm -r --filter @fastgpt-sdk/storage --filter @fastgpt-sdk/otel --filter @fastgpt-sdk/sandbox-adapter build" "build:sdks": "pnpm -r --filter @fastgpt-sdk/storage --filter @fastgpt-sdk/otel --filter @fastgpt-sdk/sandbox-adapter build"
}, },
"devDependencies": { "devDependencies": {
......
# MongoCollaboratorPermission 到 MongoResourcePermission 数据迁移指南
## 概述
将旧的 `collaborator_permissions` 集合数据迁移到新的 `resource_permissions` 集合。
## 字段映射关系
### 旧集合 (collaborator_permissions)
```
{
_id: ObjectId,
collaboratorType: "app" | "dataset",
appId: ObjectId (可选),
datasetId: ObjectId (可选),
tmbId: ObjectId,
permission: Number,
createTime: Date
}
```
### 新集合 (resource_permissions)
```
{
_id: ObjectId,
teamId: ObjectId, // 需要从 team_members 中查询获取
resourceType: "app" | "dataset",
resourceId: ObjectId, // 来自 appId 或 datasetId
tmbId: ObjectId,
permission: Number
}
```
## 自动迁移方法
### 1. 使用迁移脚本(推荐)
```bash
# 在项目根目录运行
pnpm migration:collaborator
```
### 2. 手动运行 TypeScript 文件
```bash
ts-node scripts/migration/migrateCollaboratorToResource.ts
```
## 手动迁移方法
如果自动脚本失败,可以使用以下 MongoDB 脚本手动迁移:
### 1. 连接到 MongoDB
```bash
mongo
use your_database_name
```
### 2. 执行迁移脚本
```javascript
// 获取所有协作者权限数据
const collaboratorDocs = db.collaborator_permissions.find({});
// 创建迁移数组
const resourcePermissions = [];
collaboratorDocs.forEach(function(doc) {
// 获取团队成员的 teamId
const teamMember = db.team_members.findOne({_id: doc.tmbId});
if (!teamMember) {
print("Warning: 找不到 tmbId " + doc.tmbId + " 的团队成员信息");
return;
}
// 确定资源类型和资源ID
let resourceType, resourceId;
if (doc.collaboratorType === 'app' && doc.appId) {
resourceType = 'app';
resourceId = doc.appId;
} else if (doc.collaboratorType === 'dataset' && doc.datasetId) {
resourceType = 'dataset';
resourceId = doc.datasetId;
} else {
print("Warning: 无效的协作者类型或缺少资源ID: " + JSON.stringify(doc));
return;
}
// 检查是否已存在
const existing = db.resource_permissions.findOne({
teamId: teamMember.teamId,
resourceType: resourceType,
resourceId: resourceId,
tmbId: doc.tmbId
});
if (existing) {
print("Skip: 已存在相同记录");
return;
}
// 添加到迁移数组
resourcePermissions.push({
teamId: teamMember.teamId,
resourceType: resourceType,
resourceId: resourceId,
tmbId: doc.tmbId,
permission: doc.permission
});
});
// 批量插入新数据
if (resourcePermissions.length > 0) {
print("迁移 " + resourcePermissions.length + " 条记录...");
db.resource_permissions.insertMany(resourcePermissions);
print("迁移完成!");
} else {
print("没有需要迁移的数据");
}
// 验证迁移结果
print("原始记录数: " + db.collaborator_permissions.count());
print("新增记录数: " + resourcePermissions.length);
print("当前 resource_permissions 总数: " + db.resource_permissions.count());
```
### 3. 验证迁移结果
```javascript
// 检查数据一致性
db.resource_permissions.find().limit(5);
// 检查是否有重复数据
db.resource_permissions.aggregate([
{
$group: {
_id: {
teamId: "$teamId",
resourceType: "$resourceType",
resourceId: "$resourceId",
tmbId: "$tmbId"
},
count: {$sum: 1}
}
},
{
$match: {
count: {$gt: 1}
}
}
]);
```
### 4. 清理旧数据(确认迁移成功后)
```javascript
// ⚠️ 警告:仅在确认迁移成功后执行
// db.collaborator_permissions.drop();
```
## 注意事项
1. **备份数据**:迁移前请备份数据库
2. **测试环境**:先在测试环境验证迁移脚本
3. **停止服务**:迁移期间建议停止相关服务
4. **验证数据**:迁移后验证数据完整性和应用功能
5. **保留旧数据**:建议先不删除旧数据,确认一段时间后再清理
## 常见问题
### Q: 找不到 teamId 怎么办?
A: 检查 `team_members` 集合中是否存在对应的 `tmbId` 记录
### Q: 迁移后应用报错怎么办?
A: 检查代码是否已更新为使用 `MongoResourcePermission`
### Q: 如何回滚迁移?
A: 删除 `resource_permissions` 集合中的迁移数据,恢复代码使用 `MongoCollaboratorPermission`
## 相关文件
- 迁移脚本:`scripts/migration/migrateCollaboratorToResource.ts`
- 新权限模型:`packages/service/support/permission/schema.ts`
- 旧权限模型:`packages/service/core/app/collaborator.ts`
/**
* 数据迁移脚本:将 MongoCollaboratorPermission 数据迁移到 MongoResourcePermission
*
* 使用方法:
* 1. 在项目根目录运行:pnpm migration:collaborator
* 2. 或者直接运行:ts-node scripts/migration/migrateCollaboratorToResource.ts
*/
// 设置数据库连接
process.env.MONGODB_URI =
'mongodb://root:moming1234@8.217.233.154:27017/fastgpt?authSource=admin&directConnection=true';
import { connectMongo } from '@fastgpt/service/common/mongo/init';
import { connectionMongo } from '@fastgpt/service/common/mongo';
import { MongoCollaboratorPermission } from '@fastgpt/service/core/app/collaborator';
import { MongoResourcePermission } from '@fastgpt/service/support/permission/schema';
import { PerResourceTypeEnum } from '@fastgpt/global/support/permission/constant';
import { MongoTeamMember } from '@fastgpt/service/support/user/team/teamMemberSchema';
import type { TeamMemberSchema } from '@fastgpt/global/support/user/team/type.d';
interface CollaboratorPermissionDoc {
_id: string;
collaboratorType: 'app' | 'dataset';
appId?: string;
datasetId?: string;
tmbId: string;
permission: number;
createTime?: Date;
}
interface ResourcePermissionDoc {
teamId: string;
resourceType: 'app' | 'dataset';
resourceId: string;
tmbId: string;
permission: number;
}
async function migrateCollaboratorToResource() {
console.log('🚀 开始迁移 CollaboratorPermission 数据到 ResourcePermission...');
try {
// 连接数据库
console.log('🔗 连接数据库...');
await connectMongo(connectionMongo, process.env.MONGODB_URI!);
console.log('✅ 数据库连接成功');
// 1. 获取所有 collaborator_permissions 数据
const collaboratorDocs = (await MongoCollaboratorPermission.find({}).lean()) as any[];
console.log(`📊 找到 ${collaboratorDocs.length} 条 CollaboratorPermission 记录`);
if (collaboratorDocs.length === 0) {
console.log('ℹ️ 没有需要迁移的数据');
return;
}
// 2. 获取所有团队成员信息,用于获取 teamId
const tmbIds = [...new Set(collaboratorDocs.map((doc) => doc.tmbId))];
const teamMembers = await MongoTeamMember.find({
_id: { $in: tmbIds }
}).lean();
const tmbToTeamIdMap = new Map(
teamMembers.map((tmb: TeamMemberSchema) => [String(tmb._id), String(tmb.teamId)])
);
console.log(`📋 获取到 ${teamMembers.length} 个团队成员信息`);
// 3. 转换数据格式并批量插入
const resourcePermissions: ResourcePermissionDoc[] = [];
const errors: string[] = [];
for (const doc of collaboratorDocs) {
const teamId = tmbToTeamIdMap.get(String(doc.tmbId));
if (!teamId) {
errors.push(`找不到 tmbId ${doc.tmbId} 对应的 teamId`);
continue;
}
// 确定资源类型和资源ID
let resourceType: 'app' | 'dataset';
let resourceId: string;
if (doc.collaboratorType === 'app' && doc.appId) {
resourceType = PerResourceTypeEnum.app;
resourceId = String(doc.appId);
} else if (doc.collaboratorType === 'dataset' && doc.datasetId) {
resourceType = PerResourceTypeEnum.dataset;
resourceId = String(doc.datasetId);
} else {
errors.push(`无效的协作者类型或缺少资源ID: ${JSON.stringify(doc)}`);
continue;
}
// 检查是否已存在相同的记录
const existingRecord = await MongoResourcePermission.findOne({
teamId,
resourceType,
resourceId,
tmbId: doc.tmbId
});
if (existingRecord) {
console.log(
`⚠️ 跳过重复记录: teamId=${teamId}, resourceType=${resourceType}, resourceId=${resourceId}, tmbId=${doc.tmbId}`
);
continue;
}
resourcePermissions.push({
teamId: teamId as string,
resourceType,
resourceId,
tmbId: String(doc.tmbId),
permission: doc.permission
});
}
console.log(`📝 准备迁移 ${resourcePermissions.length} 条记录`);
if (errors.length > 0) {
console.log(`⚠️ ${errors.length} 条记录有错误:`);
errors.forEach((error) => console.log(` - ${error}`));
}
// 4. 批量插入新数据
if (resourcePermissions.length > 0) {
// 分批插入,避免一次插入太多数据
const batchSize = 100;
let inserted = 0;
for (let i = 0; i < resourcePermissions.length; i += batchSize) {
const batch = resourcePermissions.slice(i, i + batchSize);
try {
await MongoResourcePermission.insertMany(batch, { ordered: false });
inserted += batch.length;
console.log(`✅ 已插入 ${inserted}/${resourcePermissions.length} 条记录`);
} catch (error: any) {
console.error(`❌ 批量插入失败:`, error.message);
// 如果批量插入失败,尝试逐条插入
for (const doc of batch) {
try {
await MongoResourcePermission.create(doc);
inserted++;
} catch (singleError: any) {
console.error(`❌ 单条插入失败:`, doc, singleError.message);
}
}
}
}
console.log(`🎉 成功迁移 ${inserted} 条记录到 ResourcePermission`);
}
// 5. 验证迁移结果
const originalCount = collaboratorDocs.length;
const newCount = await MongoResourcePermission.countDocuments({});
console.log(`\n📊 迁移统计:`);
console.log(` 原始 CollaboratorPermission 记录: ${originalCount}`);
console.log(` 新增 ResourcePermission 记录: ${resourcePermissions.length}`);
console.log(` 当前 ResourcePermission 总记录: ${newCount}`);
console.log(` 错误记录: ${errors.length}`);
// 6. 询问是否删除旧数据(可选)
console.log(`\n⚠️ 迁移完成!请验证数据正确性后,手动删除旧的 CollaboratorPermission 数据`);
console.log(` 删除命令: db.collaborator_permissions.drop()`);
} catch (error) {
console.error('❌ 迁移过程中发生错误:', error);
throw error;
}
}
// 运行迁移
if (require.main === module) {
migrateCollaboratorToResource()
.then(() => {
console.log('🎉 迁移完成');
process.exit(0);
})
.catch((error) => {
console.error('❌ 迁移失败:', error);
process.exit(1);
});
}
export { migrateCollaboratorToResource };
\ No newline at end of file
// 测试MongoDB查询修复
// 这个脚本用于验证修复后的查询逻辑
const { MongoClient, ObjectId } = require('mongodb');
// 模拟修复后的查询逻辑
function createValidUserId(userId) {
if (ObjectId.isValid(userId)) {
return new ObjectId(userId);
}
return userId;
}
// 测试用例
const testCases = [
'65bef0b406d4a4abfa0c2f59', // 有效的ObjectId字符串
'invalid-id', // 无效的ID
new ObjectId('65bef0b406d4a4abfa0c2f59'), // ObjectId对象
null, // null值
undefined // undefined值
];
console.log('测试修复后的userId处理逻辑:');
testCases.forEach((testCase, index) => {
try {
const result = createValidUserId(testCase);
console.log(`测试用例 ${index + 1}:`, {
input: testCase,
output: result,
type: typeof result,
isValid: result instanceof ObjectId || ObjectId.isValid(result)
});
} catch (error) {
console.log(`测试用例 ${index + 1} 错误:`, error.message);
}
});
console.log('\n修复说明:');
console.log('1. 问题: 代码中直接使用String(userId)进行MongoDB查询');
console.log('2. 原因: MongoDB中userId字段是ObjectId类型,字符串查询无法匹配');
console.log('3. 解决方案: 使用Types.ObjectId.isValid()检查并转换为ObjectId类型');
console.log('4. 修复位置: getUserDefaultTeam, createDefaultTeam等函数');
console.log(
'5. 修复后的查询: userId: Types.ObjectId.isValid(userId) ? new Types.ObjectId(userId) : userId'
);
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or sign in to comment