diff --git a/deploy/README.md b/deploy/README.md new file mode 100644 index 000000000..8618bf8d3 --- /dev/null +++ b/deploy/README.md @@ -0,0 +1,66 @@ +## 更新 docker compose 脚本 + +### 正常更新(不动服务,只改版本) +1. 更新 `args.json` 中的版本号 +2. 在 `FastGPT` 目录执行 `pnpm run gen:deploy` 即可 + +### 加服务 +比如要添加 `example` 服务: +1. init.mjs 的 Services Enum 中添加 example +2. 更新 templates/docker-compose.[dev|prod].yml 文件,把服务的相关配置加进去,并且:服务的 image 改为 ${{example.image}}:${{example.tag}} +3. 在 `args.json` 中添加 image 和 tag, 注意名字要和 `Service Enum` 中声明的一样才能被正确替换 + +### 加向量库 +比如添加 `exampleDB` 向量库: +1. 添加 vector service 配置在 `templates/vector` 下面,例如 `templates/vector/exampleDB.txt` 内容可以参考其他 txt,注意缩进,image 名字也要替换成 ${{exampleDB.image}}:${{exampleDB:tag}} +2. 在 `args.json` 中添加 `exampleDB` 的配置 +3. init.mjs vector enum 中添加 `vector` +4. init.mjs 中添加 vector 的相关配置: +```ts +const vector = { + // pg, milvus, ob ... + vector: { + db: '', // 空即可 + config: `/ + VECTOR_URL:vectordb://xxxxx + `, //注意 第一行反引号后面的 / 不能少(去除首个换行符); 左边的两个空格的缩进不能变,否则会语法错误 + extra: `` // 额外的配置,可以看 ob 的那个,需要一个 config 字段引入 init.sql + } +} +``` +5. init.mjs 读入 vector 配置 +```json +{ // 这是个块作用域, 直接搜 read in Vectors +// read in Vectors +// pg, ob .... +const vectordb = fs.readFileSync(path.join(process.cwd(), 'templates', 'vector', 'vector.txt')); +vector.vector.db = String(vectordb); +} +``` +6. init.mjs 最后生成的时候,需要添加 +```ts + fs.promises.writeFile( + path.join(process.cwd(), 'docker', 'cn', 'docker-compose.vector.yml'), + replace(template, 'cn', VectorEnum.vector) + ), + fs.promises.writeFile( + path.join(process.cwd(), 'docker', 'global', 'docker-compose.ziliiz.yml'), + replace(template, 'global', VectorEnum.vector) + ), +``` + +## yaml 的锚点和引用 + +`&` 标志一个锚点 + +```yaml +x-share-config: &x-share-config 'I am the config content' +x-share-config-list: &x-share-config-list + key1: value + key2: value +``` + +`*` 引用一个锚点 +```yaml +some_other_example: *x-share-config-list +``` diff --git a/deploy/args.json b/deploy/args.json new file mode 100644 index 000000000..51a8b93be --- /dev/null +++ b/deploy/args.json @@ -0,0 +1,52 @@ +{ + "tags": { + "fastgpt": "v4.13.0", + "fastgpt-sandbox": "v4.13.0", + "fastgpt-mcp_server": "v4.13.0", + "fastgpt-plugin": "v0.2.0", + "aiproxy": "v0.3.2", + "aiproxy-pg": "0.8.0-pg15", + "mongo": "5.0.18", + "redis": "7.2-alpine", + "minio": "RELEASE.2025-09-07T16-13-09Z", + "pg": "0.8.0-pg15", + "milvus-minio": "RELEASE.2023-03-20T20-16-18Z", + "milvus-etcd": "v3.5.5", + "milvus-standalone": "v2.4.3", + "oceanbase": "4.3.5-lts" + }, + "images": { + "cn": { + "fastgpt": "registry.cn-hangzhou.aliyuncs.com/fastgpt/fastgpt", + "fastgpt-plugin": "registry.cn-hangzhou.aliyuncs.com/fastgpt/fastgpt-plugin", + "fastgpt-sandbox": "registry.cn-hangzhou.aliyuncs.com/fastgpt/fastgpt-sandbox", + "fastgpt-mcp_server": "registry.cn-hangzhou.aliyuncs.com/fastgpt/fastgpt-mcp_server", + "aiproxy": "registry.cn-hangzhou.aliyuncs.com/labring/aiproxy", + "aiproxy-pg": "registry.cn-hangzhou.aliyuncs.com/fastgpt/pgvector", + "mongo": "registry.cn-hangzhou.aliyuncs.com/fastgpt/mongo", + "redis": "redis", + "minio": "minio/minio", + "pg": "registry.cn-hangzhou.aliyuncs.com/fastgpt/pgvector", + "milvus-minio": "minio/minio", + "milvus-etcd": "quay.io/coreos/etcd", + "milvus-standalone": "milvusdb/milvus", + "oceanbase": "oceanbase/oceanbase-ce" + }, + "global": { + "fastgpt": "ghcr.io/labring/fastgpt", + "fastgpt-plugin": "ghcr.io/labring/fastgpt-plugin", + "fastgpt-sandbox": "ghcr.io/labring/fastgpt-sandbox", + "fastgpt-mcp_server": "ghcr.io/labring/fastgpt-mcp_server", + "aiproxy": "ghcr.io/labring/aiproxy", + "aiproxy-pg": "pgvector/pgvector", + "mongo": "mongo", + "redis": "redis", + "minio": "minio/minio", + "pg": "pgvector/pgvector", + "milvus-minio": "minio/minio", + "milvus-etcd": "quay.io/coreos/etcd", + "milvus-standalone": "milvusdb/milvus", + "oceanbase": "oceanbase/oceanbase-ce" + } + } +} diff --git a/deploy/dev/.gitignore b/deploy/dev/.gitignore new file mode 100644 index 000000000..f3dec5a57 --- /dev/null +++ b/deploy/dev/.gitignore @@ -0,0 +1,4 @@ +* +!.gitignore +!docker-compose.yml +!docker-compose.cn.yml diff --git a/deploy/dev/docker-compose.cn.yml b/deploy/dev/docker-compose.cn.yml new file mode 100644 index 000000000..68e1d18e5 --- /dev/null +++ b/deploy/dev/docker-compose.cn.yml @@ -0,0 +1,212 @@ +# 用于开发的 docker-compose 文件: +# - 只包含 FastGPT 的最小化运行条件 +# - 没有 FastGPT 本体 +# - 所有端口都映射到外层 +# - pg: 5432 +# - mongo: 27017 +# - redis: 6379 +# - fastgpt-sandbox: 3002 +# - fastgpt-plugin: 3003 +# - aiproxy: 3010 +# - 使用 pgvector 作为默认的向量库 + +services: + # Vector DB + pg: + image: registry.cn-hangzhou.aliyuncs.com/fastgpt/pgvector:0.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: registry.cn-hangzhou.aliyuncs.com/fastgpt/mongo:5.0.18 # cpu 不支持 AVX 时候使用 4.4.29 + 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')"; 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 + 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 + 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:RELEASE.2025-09-07T16-13-09Z + container_name: fastgpt-minio + restart: always + networks: + - fastgpt + ports: + - '9000:9000' + - '9001: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 + sandbox: + container_name: sandbox + image: registry.cn-hangzhou.aliyuncs.com/fastgpt/fastgpt-sandbox:v4.13.0 + ports: + - 3002:3000 + networks: + - fastgpt + restart: always + fastgpt-mcp-server: + container_name: fastgpt-mcp-server + image: registry.cn-hangzhou.aliyuncs.com/fastgpt/fastgpt-mcp_server:v4.13.0 + ports: + - 3005:3000 + networks: + - fastgpt + restart: always + environment: + - FASTGPT_ENDPOINT=http://fastgpt:3000 + fastgpt-plugin: + image: registry.cn-hangzhou.aliyuncs.com/fastgpt/fastgpt-plugin:v0.2.0 + container_name: fastgpt-plugin + restart: always + ports: + - 3003:3000 + networks: + - fastgpt + environment: + - AUTH_TOKEN=token + - S3_ENDPOINT=fastgpt-minio + - S3_PORT=9000 + - S3_USE_SSL=false + - S3_ACCESS_KEY=minioadmin + - S3_SECRET_KEY=minioadmin + - S3_BUCKET=fastgpt-plugins + - S3_TOOL_BUCKET=fastgpt-tool # 系统工具,创建的临时文件,存储的桶,要求公开读私有写。 + - S3_PLUGIN_BUCKET=fastgpt-plugin # 系统插件热安装文件的桶,私有读写。 + - RETENTION_DAYS=15 # 系统工具临时文件保存天数 + - MONGODB_URI=mongodb://myusername:mypassword@mongo:27017/fastgpt?authSource=admin&directConnection=true + - REDIS_URL=redis://default:mypassword@redis:6379 + depends_on: + fastgpt-minio: + condition: service_healthy + # AI Proxy + aiproxy: + image: registry.cn-hangzhou.aliyuncs.com/labring/aiproxy:v0.3.2 + container_name: aiproxy + restart: unless-stopped + ports: + - 3010:3000 + depends_on: + aiproxy_pg: + condition: service_healthy + networks: + - fastgpt + - aiproxy + 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: registry.cn-hangzhou.aliyuncs.com/fastgpt/pgvector:0.8.0-pg15 # docker hub + restart: unless-stopped + container_name: aiproxy_pg + volumes: + - ./aiproxy_pg:/var/lib/postgresql/data + networks: + - aiproxy + 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: + aiproxy: diff --git a/deploy/dev/docker-compose.yml b/deploy/dev/docker-compose.yml new file mode 100644 index 000000000..fe5888aed --- /dev/null +++ b/deploy/dev/docker-compose.yml @@ -0,0 +1,212 @@ +# 用于开发的 docker-compose 文件: +# - 只包含 FastGPT 的最小化运行条件 +# - 没有 FastGPT 本体 +# - 所有端口都映射到外层 +# - pg: 5432 +# - mongo: 27017 +# - redis: 6379 +# - fastgpt-sandbox: 3002 +# - fastgpt-plugin: 3003 +# - aiproxy: 3010 +# - 使用 pgvector 作为默认的向量库 + +services: + # Vector DB + pg: + image: pgvector/pgvector:0.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 # cpu 不支持 AVX 时候使用 4.4.29 + 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')"; 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 + 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 + 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:RELEASE.2025-09-07T16-13-09Z + container_name: fastgpt-minio + restart: always + networks: + - fastgpt + ports: + - '9000:9000' + - '9001: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 + sandbox: + container_name: sandbox + image: ghcr.io/labring/fastgpt-sandbox:v4.13.0 + ports: + - 3002:3000 + networks: + - fastgpt + restart: always + fastgpt-mcp-server: + container_name: fastgpt-mcp-server + image: ghcr.io/labring/fastgpt-mcp_server:v4.13.0 + ports: + - 3005:3000 + networks: + - fastgpt + restart: always + environment: + - FASTGPT_ENDPOINT=http://fastgpt:3000 + fastgpt-plugin: + image: ghcr.io/labring/fastgpt-plugin:v0.2.0 + container_name: fastgpt-plugin + restart: always + ports: + - 3003:3000 + networks: + - fastgpt + environment: + - AUTH_TOKEN=token + - S3_ENDPOINT=fastgpt-minio + - S3_PORT=9000 + - S3_USE_SSL=false + - S3_ACCESS_KEY=minioadmin + - S3_SECRET_KEY=minioadmin + - S3_BUCKET=fastgpt-plugins + - S3_TOOL_BUCKET=fastgpt-tool # 系统工具,创建的临时文件,存储的桶,要求公开读私有写。 + - S3_PLUGIN_BUCKET=fastgpt-plugin # 系统插件热安装文件的桶,私有读写。 + - RETENTION_DAYS=15 # 系统工具临时文件保存天数 + - MONGODB_URI=mongodb://myusername:mypassword@mongo:27017/fastgpt?authSource=admin&directConnection=true + - REDIS_URL=redis://default:mypassword@redis:6379 + depends_on: + fastgpt-minio: + condition: service_healthy + # AI Proxy + aiproxy: + image: ghcr.io/labring/aiproxy:v0.3.2 + container_name: aiproxy + restart: unless-stopped + ports: + - 3010:3000 + depends_on: + aiproxy_pg: + condition: service_healthy + networks: + - fastgpt + - aiproxy + 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 + restart: unless-stopped + container_name: aiproxy_pg + volumes: + - ./aiproxy_pg:/var/lib/postgresql/data + networks: + - aiproxy + 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: + aiproxy: diff --git a/deploy/docker/cn/docker-compose.milvus.yml b/deploy/docker/cn/docker-compose.milvus.yml new file mode 100644 index 000000000..de3234d3c --- /dev/null +++ b/deploy/docker/cn/docker-compose.milvus.yml @@ -0,0 +1,300 @@ +# 用于部署的 docker-compose 文件: +# - 向量库为 Pgvector +# - FastGPT 端口映射为 3000:3000 +# - FastGPT-mcp-server 端口映射 3005:3000 +# - 建议修改账密后再运行 + +# plugin auth token +x-plugin-auth-token: &x-plugin-auth-token token +# aiproxy token +x-aiproxy-token: &x-aiproxy-token token +# 数据库连接相关配置 +x-share-db-config: &x-share-db-config + MONGODB_URI: mongodb://username:password@mongo:27017/fastgpt?authSource=admin + DB_MAX_LINK: 30 + REDIS_URL: redis://default:mypassword@redis:6379 + S3_ENDPOINT: fastgpt-minio + S3_PORT: 9000 + S3_USE_SSL: false + S3_ACCESS_KEY: minioadmin + S3_SECRET_KEY: minioadmin + +# 向量库相关配置 +x-vec-config: &x-vec-config + MILVUS_ADDRESS: http://milvusStandalone:19530 + MILVUS_TOKEN: none + + +version: '3.3' +services: + # Vector DB + milvus-minio: + container_name: milvus-minio + image: minio/minio:RELEASE.2023-03-20T20-16-18Z + environment: + MINIO_ACCESS_KEY: minioadmin + MINIO_SECRET_KEY: minioadmin + networks: + - vector + volumes: + - ./milvus-minio:/minio_data + command: minio server /minio_data --console-address ":9001" + healthcheck: + test: ['CMD', 'curl', '-f', 'http://localhost:9000/minio/health/live'] + interval: 30s + timeout: 20s + retries: 3 + # milvus + milvus-etcd: + container_name: milvus-etcd + image: + image: quay.io/coreos/etcd:v3.5.5 + environment: + - ETCD_AUTO_COMPACTION_MODE=revision + - ETCD_AUTO_COMPACTION_RETENTION=1000 + - ETCD_QUOTA_BACKEND_BYTES=4294967296 + - ETCD_SNAPSHOT_COUNT=50000 + networks: + - vector + volumes: + - ./milvus/etcd:/etcd + command: etcd -advertise-client-urls=http://127.0.0.1:2379 -listen-client-urls http://0.0.0.0:2379 --data-dir /etcd + healthcheck: + test: ['CMD', 'etcdctl', 'endpoint', 'health'] + interval: 30s + timeout: 20s + retries: 3 + milvusStandalone: + container_name: milvusStandalone + image: milvusdb/milvus:v2.4.3 + command: ['milvus', 'run', 'standalone'] + security_opt: + - seccomp:unconfined + environment: + ETCD_ENDPOINTS: milvus-etcd:2379 + MINIO_ADDRESS: milvus-minio:9000 + networks: + - fastgpt + - vector + volumes: + - ./milvus/data:/var/lib/milvus + healthcheck: + test: ['CMD', 'curl', '-f', 'http://localhost:9091/healthz'] + interval: 30s + start_period: 90s + timeout: 20s + retries: 3 + depends_on: + - 'milvus-etcd' + - 'milvus-minio' + + + mongo: + image: registry.cn-hangzhou.aliyuncs.com/fastgpt/mongo:5.0.18 # cpu 不支持 AVX 时候使用 4.4.29 + 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: + container_name: fastgpt + image: registry.cn-hangzhou.aliyuncs.com/fastgpt/fastgpt:v4.13.0 # git + ports: + - 3000:3000 + networks: + - fastgpt + depends_on: + - mongo + - sandbox + - pg + restart: always + environment: + <<: [*x-share-db-config, *x-vec-config] + # 前端外部可访问的地址,用于自动补全文件资源路径。例如 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: *x-plugin-auth-token + # 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: *x-aiproxy-token + + # 数据库最大连接数 + 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 + + fastgpt-minio: + image: minio/minio:RELEASE.2025-09-07T16-13-09Z + container_name: fastgpt-minio + restart: always + networks: + - fastgpt + 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 + sandbox: + container_name: sandbox + image: registry.cn-hangzhou.aliyuncs.com/fastgpt/fastgpt-sandbox:v4.13.0 + networks: + - fastgpt + restart: always + fastgpt-mcp-server: + container_name: fastgpt-mcp-server + image: registry.cn-hangzhou.aliyuncs.com/fastgpt/fastgpt-mcp_server:v4.13.0 + networks: + - fastgpt + ports: + - 3005:3000 + restart: always + environment: + - FASTGPT_ENDPOINT=http://fastgpt:3000 + fastgpt-plugin: + image: registry.cn-hangzhou.aliyuncs.com/fastgpt/fastgpt-plugin:v0.2.0 + container_name: fastgpt-plugin + restart: always + networks: + - fastgpt + environment: + <<: *x-share-db-config + AUTH_TOKEN: *x-plugin-auth-token + S3_BUCKET: fastgpt-plugins + depends_on: + fastgpt-minio: + condition: service_healthy + # AI Proxy + aiproxy: + image: registry.cn-hangzhou.aliyuncs.com/labring/aiproxy:v0.3.2 + container_name: aiproxy + restart: unless-stopped + depends_on: + aiproxy_pg: + condition: service_healthy + networks: + - fastgpt + - aiproxy + environment: + # 对应 fastgpt 里的AIPROXY_API_TOKEN + ADMIN_KEY: *x-aiproxy-token + # 错误日志详情保存时间(小时) + 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: registry.cn-hangzhou.aliyuncs.com/fastgpt/pgvector:0.8.0-pg15 # docker hub + restart: unless-stopped + container_name: aiproxy_pg + volumes: + - ./aiproxy_pg:/var/lib/postgresql/data + networks: + - aiproxy + 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: + aiproxy: + vector: + diff --git a/deploy/docker/cn/docker-compose.oceanbase.yml b/deploy/docker/cn/docker-compose.oceanbase.yml new file mode 100644 index 000000000..3c0b89e89 --- /dev/null +++ b/deploy/docker/cn/docker-compose.oceanbase.yml @@ -0,0 +1,280 @@ +# 用于部署的 docker-compose 文件: +# - 向量库为 Pgvector +# - FastGPT 端口映射为 3000:3000 +# - FastGPT-mcp-server 端口映射 3005:3000 +# - 建议修改账密后再运行 + +# plugin auth token +x-plugin-auth-token: &x-plugin-auth-token token +# aiproxy token +x-aiproxy-token: &x-aiproxy-token token +# 数据库连接相关配置 +x-share-db-config: &x-share-db-config + MONGODB_URI: mongodb://username:password@mongo:27017/fastgpt?authSource=admin + DB_MAX_LINK: 30 + REDIS_URL: redis://default:mypassword@redis:6379 + S3_ENDPOINT: fastgpt-minio + S3_PORT: 9000 + S3_USE_SSL: false + S3_ACCESS_KEY: minioadmin + S3_SECRET_KEY: minioadmin + +# 向量库相关配置 +x-vec-config: &x-vec-config +undefined + +version: '3.3' +services: + # Vector DB + ob: + image: oceanbase/oceanbase-ce:4.3.5-lts + container_name: ob + restart: always + # ports: # 生产环境建议不要暴露 + # - 2881:2881 + networks: + - fastgpt + environment: + # 这里的配置只有首次运行生效。修改后,重启镜像是不会生效的。需要把持久化数据删除再重启,才有效果 + - OB_SYS_PASSWORD=obsyspassword + # 不同于传统数据库,OceanBase 数据库的账号包含更多字段,包括用户名、租户名和集群名。经典格式为"用户名@租户名#集群名" + # 比如用mysql客户端连接时,根据本文件的默认配置,应该指定 "-uroot@tenantname" + - OB_TENANT_NAME=tenantname + - OB_TENANT_PASSWORD=tenantpassword + # MODE分为MINI和NORMAL, 后者会最大程度使用主机资源 + - MODE=MINI + - OB_SERVER_IP=127.0.0.1 + # 更多环境变量配置见oceanbase官方文档: https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000002013494 + volumes: + - ../ob/data:/root/ob + - ../ob/config:/root/.obd/cluster + configs: + - source: init_sql + target: /root/boot/init.d/init.sql + healthcheck: + # obclient -h127.0.0.1 -P2881 -uroot@tenantname -ptenantpassword -e "SELECT 1;" + test: + [ + "CMD-SHELL", + 'obclient -h$${OB_SERVER_IP} -P2881 -uroot@$${OB_TENANT_NAME} -p$${OB_TENANT_PASSWORD} -e "SELECT 1;"', + ] + interval: 30s + timeout: 10s + retries: 1000 + start_period: 10s + + + mongo: + image: registry.cn-hangzhou.aliyuncs.com/fastgpt/mongo:5.0.18 # cpu 不支持 AVX 时候使用 4.4.29 + 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: + container_name: fastgpt + image: registry.cn-hangzhou.aliyuncs.com/fastgpt/fastgpt:v4.13.0 # git + ports: + - 3000:3000 + networks: + - fastgpt + depends_on: + - mongo + - sandbox + - pg + restart: always + environment: + <<: [*x-share-db-config, *x-vec-config] + # 前端外部可访问的地址,用于自动补全文件资源路径。例如 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: *x-plugin-auth-token + # 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: *x-aiproxy-token + + # 数据库最大连接数 + 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 + + fastgpt-minio: + image: minio/minio:RELEASE.2025-09-07T16-13-09Z + container_name: fastgpt-minio + restart: always + networks: + - fastgpt + 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 + sandbox: + container_name: sandbox + image: registry.cn-hangzhou.aliyuncs.com/fastgpt/fastgpt-sandbox:v4.13.0 + networks: + - fastgpt + restart: always + fastgpt-mcp-server: + container_name: fastgpt-mcp-server + image: registry.cn-hangzhou.aliyuncs.com/fastgpt/fastgpt-mcp_server:v4.13.0 + networks: + - fastgpt + ports: + - 3005:3000 + restart: always + environment: + - FASTGPT_ENDPOINT=http://fastgpt:3000 + fastgpt-plugin: + image: registry.cn-hangzhou.aliyuncs.com/fastgpt/fastgpt-plugin:v0.2.0 + container_name: fastgpt-plugin + restart: always + networks: + - fastgpt + environment: + <<: *x-share-db-config + AUTH_TOKEN: *x-plugin-auth-token + S3_BUCKET: fastgpt-plugins + depends_on: + fastgpt-minio: + condition: service_healthy + # AI Proxy + aiproxy: + image: registry.cn-hangzhou.aliyuncs.com/labring/aiproxy:v0.3.2 + container_name: aiproxy + restart: unless-stopped + depends_on: + aiproxy_pg: + condition: service_healthy + networks: + - fastgpt + - aiproxy + environment: + # 对应 fastgpt 里的AIPROXY_API_TOKEN + ADMIN_KEY: *x-aiproxy-token + # 错误日志详情保存时间(小时) + 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: registry.cn-hangzhou.aliyuncs.com/fastgpt/pgvector:0.8.0-pg15 # docker hub + restart: unless-stopped + container_name: aiproxy_pg + volumes: + - ./aiproxy_pg:/var/lib/postgresql/data + networks: + - aiproxy + 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: + aiproxy: + vector: +configs: + init_sql: + name: init_sql + content: | + ALTER SYSTEM SET ob_vector_memory_limit_percentage = 30; + diff --git a/deploy/docker/cn/docker-compose.pg.yml b/deploy/docker/cn/docker-compose.pg.yml new file mode 100644 index 000000000..62fe58e75 --- /dev/null +++ b/deploy/docker/cn/docker-compose.pg.yml @@ -0,0 +1,257 @@ +# 用于部署的 docker-compose 文件: +# - 向量库为 Pgvector +# - FastGPT 端口映射为 3000:3000 +# - FastGPT-mcp-server 端口映射 3005:3000 +# - 建议修改账密后再运行 + +# plugin auth token +x-plugin-auth-token: &x-plugin-auth-token token +# aiproxy token +x-aiproxy-token: &x-aiproxy-token token +# 数据库连接相关配置 +x-share-db-config: &x-share-db-config + MONGODB_URI: mongodb://username:password@mongo:27017/fastgpt?authSource=admin + DB_MAX_LINK: 30 + REDIS_URL: redis://default:mypassword@redis:6379 + S3_ENDPOINT: fastgpt-minio + S3_PORT: 9000 + S3_USE_SSL: false + S3_ACCESS_KEY: minioadmin + S3_SECRET_KEY: minioadmin + +# 向量库相关配置 +x-vec-config: &x-vec-config + PG_URL: postgresql://username:password@pg:5432/postgres + +version: '3.3' +services: + # Vector DB + pg: + image: registry.cn-hangzhou.aliyuncs.com/fastgpt/pgvector:0.8.0-pg15 + container_name: pg + restart: always + 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 + + + mongo: + image: registry.cn-hangzhou.aliyuncs.com/fastgpt/mongo:5.0.18 # cpu 不支持 AVX 时候使用 4.4.29 + 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: + container_name: fastgpt + image: registry.cn-hangzhou.aliyuncs.com/fastgpt/fastgpt:v4.13.0 # git + ports: + - 3000:3000 + networks: + - fastgpt + depends_on: + - mongo + - sandbox + - pg + restart: always + environment: + <<: [*x-share-db-config, *x-vec-config] + # 前端外部可访问的地址,用于自动补全文件资源路径。例如 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: *x-plugin-auth-token + # 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: *x-aiproxy-token + + # 数据库最大连接数 + 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 + + fastgpt-minio: + image: minio/minio:RELEASE.2025-09-07T16-13-09Z + container_name: fastgpt-minio + restart: always + networks: + - fastgpt + 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 + sandbox: + container_name: sandbox + image: registry.cn-hangzhou.aliyuncs.com/fastgpt/fastgpt-sandbox:v4.13.0 + networks: + - fastgpt + restart: always + fastgpt-mcp-server: + container_name: fastgpt-mcp-server + image: registry.cn-hangzhou.aliyuncs.com/fastgpt/fastgpt-mcp_server:v4.13.0 + networks: + - fastgpt + ports: + - 3005:3000 + restart: always + environment: + - FASTGPT_ENDPOINT=http://fastgpt:3000 + fastgpt-plugin: + image: registry.cn-hangzhou.aliyuncs.com/fastgpt/fastgpt-plugin:v0.2.0 + container_name: fastgpt-plugin + restart: always + networks: + - fastgpt + environment: + <<: *x-share-db-config + AUTH_TOKEN: *x-plugin-auth-token + S3_BUCKET: fastgpt-plugins + depends_on: + fastgpt-minio: + condition: service_healthy + # AI Proxy + aiproxy: + image: registry.cn-hangzhou.aliyuncs.com/labring/aiproxy:v0.3.2 + container_name: aiproxy + restart: unless-stopped + depends_on: + aiproxy_pg: + condition: service_healthy + networks: + - fastgpt + - aiproxy + environment: + # 对应 fastgpt 里的AIPROXY_API_TOKEN + ADMIN_KEY: *x-aiproxy-token + # 错误日志详情保存时间(小时) + 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: registry.cn-hangzhou.aliyuncs.com/fastgpt/pgvector:0.8.0-pg15 # docker hub + restart: unless-stopped + container_name: aiproxy_pg + volumes: + - ./aiproxy_pg:/var/lib/postgresql/data + networks: + - aiproxy + 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: + aiproxy: + vector: + diff --git a/deploy/docker/cn/docker-compose.zilliz.yml b/deploy/docker/cn/docker-compose.zilliz.yml new file mode 100644 index 000000000..c9798ed9f --- /dev/null +++ b/deploy/docker/cn/docker-compose.zilliz.yml @@ -0,0 +1,240 @@ +# 用于部署的 docker-compose 文件: +# - 向量库为 Pgvector +# - FastGPT 端口映射为 3000:3000 +# - FastGPT-mcp-server 端口映射 3005:3000 +# - 建议修改账密后再运行 + +# plugin auth token +x-plugin-auth-token: &x-plugin-auth-token token +# aiproxy token +x-aiproxy-token: &x-aiproxy-token token +# 数据库连接相关配置 +x-share-db-config: &x-share-db-config + MONGODB_URI: mongodb://username:password@mongo:27017/fastgpt?authSource=admin + DB_MAX_LINK: 30 + REDIS_URL: redis://default:mypassword@redis:6379 + S3_ENDPOINT: fastgpt-minio + S3_PORT: 9000 + S3_USE_SSL: false + S3_ACCESS_KEY: minioadmin + S3_SECRET_KEY: minioadmin + +# 向量库相关配置 +x-vec-config: &x-vec-config + MILVUS_ADDRESS: zilliz_cloud_address + MILVUS_TOKEN: zilliz_cloud_token + +version: '3.3' +services: + # Vector DB + + + mongo: + image: registry.cn-hangzhou.aliyuncs.com/fastgpt/mongo:5.0.18 # cpu 不支持 AVX 时候使用 4.4.29 + 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: + container_name: fastgpt + image: registry.cn-hangzhou.aliyuncs.com/fastgpt/fastgpt:v4.13.0 # git + ports: + - 3000:3000 + networks: + - fastgpt + depends_on: + - mongo + - sandbox + - pg + restart: always + environment: + <<: [*x-share-db-config, *x-vec-config] + # 前端外部可访问的地址,用于自动补全文件资源路径。例如 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: *x-plugin-auth-token + # 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: *x-aiproxy-token + + # 数据库最大连接数 + 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 + + fastgpt-minio: + image: minio/minio:RELEASE.2025-09-07T16-13-09Z + container_name: fastgpt-minio + restart: always + networks: + - fastgpt + 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 + sandbox: + container_name: sandbox + image: registry.cn-hangzhou.aliyuncs.com/fastgpt/fastgpt-sandbox:v4.13.0 + networks: + - fastgpt + restart: always + fastgpt-mcp-server: + container_name: fastgpt-mcp-server + image: registry.cn-hangzhou.aliyuncs.com/fastgpt/fastgpt-mcp_server:v4.13.0 + networks: + - fastgpt + ports: + - 3005:3000 + restart: always + environment: + - FASTGPT_ENDPOINT=http://fastgpt:3000 + fastgpt-plugin: + image: registry.cn-hangzhou.aliyuncs.com/fastgpt/fastgpt-plugin:v0.2.0 + container_name: fastgpt-plugin + restart: always + networks: + - fastgpt + environment: + <<: *x-share-db-config + AUTH_TOKEN: *x-plugin-auth-token + S3_BUCKET: fastgpt-plugins + depends_on: + fastgpt-minio: + condition: service_healthy + # AI Proxy + aiproxy: + image: registry.cn-hangzhou.aliyuncs.com/labring/aiproxy:v0.3.2 + container_name: aiproxy + restart: unless-stopped + depends_on: + aiproxy_pg: + condition: service_healthy + networks: + - fastgpt + - aiproxy + environment: + # 对应 fastgpt 里的AIPROXY_API_TOKEN + ADMIN_KEY: *x-aiproxy-token + # 错误日志详情保存时间(小时) + 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: registry.cn-hangzhou.aliyuncs.com/fastgpt/pgvector:0.8.0-pg15 # docker hub + restart: unless-stopped + container_name: aiproxy_pg + volumes: + - ./aiproxy_pg:/var/lib/postgresql/data + networks: + - aiproxy + 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: + aiproxy: + vector: + diff --git a/deploy/docker/docker-compose-oceanbase/init.sql b/deploy/docker/docker-compose-oceanbase/init.sql deleted file mode 100644 index 9bea8486d..000000000 --- a/deploy/docker/docker-compose-oceanbase/init.sql +++ /dev/null @@ -1,2 +0,0 @@ -ALTER SYSTEM SET ob_vector_memory_limit_percentage = 30; - diff --git a/deploy/docker/docker-compose-milvus.yml b/deploy/docker/global/docker-compose.milvus.yml similarity index 65% rename from deploy/docker/docker-compose-milvus.yml rename to deploy/docker/global/docker-compose.milvus.yml index b01c372bd..de06bce03 100644 --- a/deploy/docker/docker-compose-milvus.yml +++ b/deploy/docker/global/docker-compose.milvus.yml @@ -1,7 +1,29 @@ -# 数据库的默认账号和密码仅首次运行时设置有效 -# 如果修改了账号密码,记得改数据库和项目连接参数,别只改一处~ -# 该配置文件只是给快速启动,测试使用。正式使用,记得务必修改账号密码,以及调整合适的知识库参数,共享内存等。 -# 如何无法访问 dockerhub 和 git,可以用阿里云(阿里云没有arm包) +# 用于部署的 docker-compose 文件: +# - 向量库为 Pgvector +# - FastGPT 端口映射为 3000:3000 +# - FastGPT-mcp-server 端口映射 3005:3000 +# - 建议修改账密后再运行 + +# plugin auth token +x-plugin-auth-token: &x-plugin-auth-token token +# aiproxy token +x-aiproxy-token: &x-aiproxy-token token +# 数据库连接相关配置 +x-share-db-config: &x-share-db-config + MONGODB_URI: mongodb://username:password@mongo:27017/fastgpt?authSource=admin + DB_MAX_LINK: 30 + REDIS_URL: redis://default:mypassword@redis:6379 + S3_ENDPOINT: fastgpt-minio + S3_PORT: 9000 + S3_USE_SSL: false + S3_ACCESS_KEY: minioadmin + S3_SECRET_KEY: minioadmin + +# 向量库相关配置 +x-vec-config: &x-vec-config + MILVUS_ADDRESS: http://milvusStandalone:19530 + MILVUS_TOKEN: none + version: '3.3' services: @@ -12,11 +34,8 @@ services: environment: MINIO_ACCESS_KEY: minioadmin MINIO_SECRET_KEY: minioadmin - # ports: - # - '9001:9001' - # - '9000:9000' networks: - - fastgpt + - vector volumes: - ./milvus-minio:/minio_data command: minio server /minio_data --console-address ":9001" @@ -26,8 +45,9 @@ services: timeout: 20s retries: 3 # milvus - milvusEtcd: - container_name: milvusEtcd + milvus-etcd: + container_name: milvus-etcd + image: image: quay.io/coreos/etcd:v3.5.5 environment: - ETCD_AUTO_COMPACTION_MODE=revision @@ -35,7 +55,7 @@ services: - ETCD_QUOTA_BACKEND_BYTES=4294967296 - ETCD_SNAPSHOT_COUNT=50000 networks: - - fastgpt + - vector volumes: - ./milvus/etcd:/etcd command: etcd -advertise-client-urls=http://127.0.0.1:2379 -listen-client-urls http://0.0.0.0:2379 --data-dir /etcd @@ -51,10 +71,11 @@ services: security_opt: - seccomp:unconfined environment: - ETCD_ENDPOINTS: milvusEtcd:2379 + ETCD_ENDPOINTS: milvus-etcd:2379 MINIO_ADDRESS: milvus-minio:9000 networks: - fastgpt + - vector volumes: - ./milvus/data:/var/lib/milvus healthcheck: @@ -64,14 +85,12 @@ services: timeout: 20s retries: 3 depends_on: - - 'milvusEtcd' + - 'milvus-etcd' - 'milvus-minio' - # 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时候使用 + image: mongo:5.0.18 # cpu 不支持 AVX 时候使用 4.4.29 container_name: mongo restart: always networks: @@ -128,15 +147,65 @@ services: start_period: 30s volumes: - ./redis/data:/data + + fastgpt: + container_name: fastgpt + image: ghcr.io/labring/fastgpt:v4.13.0 # git + ports: + - 3000:3000 + networks: + - fastgpt + depends_on: + - mongo + - sandbox + - pg + restart: always + environment: + <<: [*x-share-db-config, *x-vec-config] + # 前端外部可访问的地址,用于自动补全文件资源路径。例如 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: *x-plugin-auth-token + # 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: *x-aiproxy-token + + # 数据库最大连接数 + 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 + fastgpt-minio: - image: minio/minio:latest + image: minio/minio:RELEASE.2025-09-07T16-13-09Z 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) - - '9000:9000' - - '9001:9001' environment: - MINIO_ROOT_USER=minioadmin - MINIO_ROOT_PASSWORD=minioadmin @@ -148,112 +217,38 @@ services: interval: 30s timeout: 20s retries: 3 - - fastgpt: - container_name: fastgpt - image: ghcr.io/labring/fastgpt:v4.12.4 # git - # image: registry.cn-hangzhou.aliyuncs.com/fastgpt/fastgpt:v4.12.4 # 阿里云 - ports: - - 3000:3000 - networks: - - fastgpt - depends_on: - - mongo - - sandbox - - milvusStandalone - 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 - # 向量库 连接参数 - - MILVUS_ADDRESS=http://milvusStandalone:19530 - - MILVUS_TOKEN=none - - # 日志等级: 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.4 # git - # image: registry.cn-hangzhou.aliyuncs.com/fastgpt/fastgpt-sandbox:v4.12.4 # 阿里云 + image: ghcr.io/labring/fastgpt-sandbox:v4.13.0 networks: - fastgpt restart: always fastgpt-mcp-server: container_name: fastgpt-mcp-server - image: ghcr.io/labring/fastgpt-mcp_server:v4.12.4 # git - # image: registry.cn-hangzhou.aliyuncs.com/fastgpt/fastgpt-mcp_server:v4.12.4 # 阿里云 - ports: - - 3005:3000 + image: ghcr.io/labring/fastgpt-mcp_server:v4.13.0 networks: - fastgpt + ports: + - 3005:3000 restart: always environment: - FASTGPT_ENDPOINT=http://fastgpt:3000 fastgpt-plugin: - image: ghcr.io/labring/fastgpt-plugin:v0.1.13 # git - # image: registry.cn-hangzhou.aliyuncs.com/fastgpt/fastgpt-plugin:v0.1.13 # 阿里云 + image: ghcr.io/labring/fastgpt-plugin:v0.2.0 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 + <<: *x-share-db-config + AUTH_TOKEN: *x-plugin-auth-token + S3_BUCKET: fastgpt-plugins depends_on: fastgpt-minio: condition: service_healthy - # AI Proxy aiproxy: image: ghcr.io/labring/aiproxy:v0.3.2 - # image: registry.cn-hangzhou.aliyuncs.com/labring/aiproxy:v0.3.2 # 阿里云 container_name: aiproxy restart: unless-stopped depends_on: @@ -261,19 +256,20 @@ services: condition: service_healthy networks: - fastgpt + - aiproxy environment: # 对应 fastgpt 里的AIPROXY_API_TOKEN - - ADMIN_KEY=aiproxy + ADMIN_KEY: *x-aiproxy-token # 错误日志详情保存时间(小时) - - LOG_DETAIL_STORAGE_HOURS=1 + LOG_DETAIL_STORAGE_HOURS: 1 # 数据库连接地址 - - SQL_DSN=postgres://postgres:aiproxy@aiproxy_pg:5432/aiproxy + SQL_DSN: postgres://postgres:aiproxy@aiproxy_pg:5432/aiproxy # 最大重试次数 - - RETRY_TIMES=3 + RETRY_TIMES: 3 # 不需要计费 - - BILLING_ENABLED=false + BILLING_ENABLED: false # 不需要严格检测模型 - - DISABLE_MODEL_CONFIG=true + DISABLE_MODEL_CONFIG: true healthcheck: test: ['CMD', 'curl', '-f', 'http://localhost:3000/api/status'] interval: 5s @@ -281,13 +277,12 @@ services: 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 + - aiproxy environment: TZ: Asia/Shanghai POSTGRES_USER: postgres @@ -300,3 +295,6 @@ services: retries: 10 networks: fastgpt: + aiproxy: + vector: + diff --git a/deploy/docker/docker-compose-oceanbase/docker-compose.yml b/deploy/docker/global/docker-compose.oceanbase.yml similarity index 63% rename from deploy/docker/docker-compose-oceanbase/docker-compose.yml rename to deploy/docker/global/docker-compose.oceanbase.yml index ab319d0ca..d9da84d9f 100644 --- a/deploy/docker/docker-compose-oceanbase/docker-compose.yml +++ b/deploy/docker/global/docker-compose.oceanbase.yml @@ -1,14 +1,33 @@ -# 数据库的默认账号和密码仅首次运行时设置有效 -# 如果修改了账号密码,记得改数据库和项目连接参数,别只改一处~ -# 该配置文件只是给快速启动,测试使用。正式使用,记得务必修改账号密码,以及调整合适的知识库参数,共享内存等。 -# 如何无法访问 dockerhub 和 git,可以用阿里云(阿里云没有arm包) +# 用于部署的 docker-compose 文件: +# - 向量库为 Pgvector +# - FastGPT 端口映射为 3000:3000 +# - FastGPT-mcp-server 端口映射 3005:3000 +# - 建议修改账密后再运行 + +# plugin auth token +x-plugin-auth-token: &x-plugin-auth-token token +# aiproxy token +x-aiproxy-token: &x-aiproxy-token token +# 数据库连接相关配置 +x-share-db-config: &x-share-db-config + MONGODB_URI: mongodb://username:password@mongo:27017/fastgpt?authSource=admin + DB_MAX_LINK: 30 + REDIS_URL: redis://default:mypassword@redis:6379 + S3_ENDPOINT: fastgpt-minio + S3_PORT: 9000 + S3_USE_SSL: false + S3_ACCESS_KEY: minioadmin + S3_SECRET_KEY: minioadmin + +# 向量库相关配置 +x-vec-config: &x-vec-config +undefined version: '3.3' services: # Vector DB ob: - image: oceanbase/oceanbase-ce:4.3.5-lts # docker hub - # image: quay.io/oceanbase/oceanbase-ce:4.3.5-lts # 镜像 + image: oceanbase/oceanbase-ce:4.3.5-lts container_name: ob restart: always # ports: # 生产环境建议不要暴露 @@ -27,26 +46,26 @@ services: - OB_SERVER_IP=127.0.0.1 # 更多环境变量配置见oceanbase官方文档: https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000002013494 volumes: - - ./ob/data:/root/ob - - ./ob/config:/root/.obd/cluster - - ./init.sql:/root/boot/init.d/init.sql + - ../ob/data:/root/ob + - ../ob/config:/root/.obd/cluster + configs: + - source: init_sql + target: /root/boot/init.d/init.sql healthcheck: # obclient -h127.0.0.1 -P2881 -uroot@tenantname -ptenantpassword -e "SELECT 1;" test: [ - 'CMD-SHELL', - 'obclient -h$${OB_SERVER_IP} -P2881 -uroot@$${OB_TENANT_NAME} -p$${OB_TENANT_PASSWORD} -e "SELECT 1;"' + "CMD-SHELL", + 'obclient -h$${OB_SERVER_IP} -P2881 -uroot@$${OB_TENANT_NAME} -p$${OB_TENANT_PASSWORD} -e "SELECT 1;"', ] interval: 30s timeout: 10s retries: 1000 start_period: 10s - # 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时候使用 + image: mongo:5.0.18 # cpu 不支持 AVX 时候使用 4.4.29 container_name: mongo restart: always networks: @@ -103,15 +122,65 @@ services: start_period: 30s volumes: - ./redis/data:/data + + fastgpt: + container_name: fastgpt + image: ghcr.io/labring/fastgpt:v4.13.0 # git + ports: + - 3000:3000 + networks: + - fastgpt + depends_on: + - mongo + - sandbox + - pg + restart: always + environment: + <<: [*x-share-db-config, *x-vec-config] + # 前端外部可访问的地址,用于自动补全文件资源路径。例如 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: *x-plugin-auth-token + # 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: *x-aiproxy-token + + # 数据库最大连接数 + 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 + fastgpt-minio: - image: minio/minio:latest + image: minio/minio:RELEASE.2025-09-07T16-13-09Z 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) - - '9000:9000' - - '9001:9001' environment: - MINIO_ROOT_USER=minioadmin - MINIO_ROOT_PASSWORD=minioadmin @@ -123,111 +192,38 @@ services: interval: 30s timeout: 20s retries: 3 - - fastgpt: - container_name: fastgpt - image: ghcr.io/labring/fastgpt:v4.12.4 # git - # image: registry.cn-hangzhou.aliyuncs.com/fastgpt/fastgpt:v4.12.4 # 阿里云 - ports: - - 3000:3000 - networks: - - fastgpt - depends_on: - - mongo - - sandbox - - ob - 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 - # 向量库 连接参数 - - OCEANBASE_URL=mysql://root%40tenantname:tenantpassword@ob:2881/test - - # 日志等级: 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.4 # git - # image: registry.cn-hangzhou.aliyuncs.com/fastgpt/fastgpt-sandbox:v4.12.4 # 阿里云 + image: ghcr.io/labring/fastgpt-sandbox:v4.13.0 networks: - fastgpt restart: always fastgpt-mcp-server: container_name: fastgpt-mcp-server - image: ghcr.io/labring/fastgpt-mcp_server:v4.12.4 # git - # image: registry.cn-hangzhou.aliyuncs.com/fastgpt/fastgpt-mcp_server:v4.12.4 # 阿里云 - ports: - - 3005:3000 + image: ghcr.io/labring/fastgpt-mcp_server:v4.13.0 networks: - fastgpt + ports: + - 3005:3000 restart: always environment: - FASTGPT_ENDPOINT=http://fastgpt:3000 fastgpt-plugin: - image: ghcr.io/labring/fastgpt-plugin:v0.1.13 # git - # image: registry.cn-hangzhou.aliyuncs.com/fastgpt/fastgpt-plugin:v0.1.13 # 阿里云 + image: ghcr.io/labring/fastgpt-plugin:v0.2.0 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 + <<: *x-share-db-config + AUTH_TOKEN: *x-plugin-auth-token + S3_BUCKET: fastgpt-plugins depends_on: fastgpt-minio: condition: service_healthy - # AI Proxy aiproxy: image: ghcr.io/labring/aiproxy:v0.3.2 - # image: registry.cn-hangzhou.aliyuncs.com/labring/aiproxy:v0.3.2 # 阿里云 container_name: aiproxy restart: unless-stopped depends_on: @@ -235,19 +231,20 @@ services: condition: service_healthy networks: - fastgpt + - aiproxy environment: # 对应 fastgpt 里的AIPROXY_API_TOKEN - - ADMIN_KEY=aiproxy + ADMIN_KEY: *x-aiproxy-token # 错误日志详情保存时间(小时) - - LOG_DETAIL_STORAGE_HOURS=1 + LOG_DETAIL_STORAGE_HOURS: 1 # 数据库连接地址 - - SQL_DSN=postgres://postgres:aiproxy@aiproxy_pg:5432/aiproxy + SQL_DSN: postgres://postgres:aiproxy@aiproxy_pg:5432/aiproxy # 最大重试次数 - - RETRY_TIMES=3 + RETRY_TIMES: 3 # 不需要计费 - - BILLING_ENABLED=false + BILLING_ENABLED: false # 不需要严格检测模型 - - DISABLE_MODEL_CONFIG=true + DISABLE_MODEL_CONFIG: true healthcheck: test: ['CMD', 'curl', '-f', 'http://localhost:3000/api/status'] interval: 5s @@ -255,13 +252,12 @@ services: 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 + - aiproxy environment: TZ: Asia/Shanghai POSTGRES_USER: postgres @@ -274,3 +270,11 @@ services: retries: 10 networks: fastgpt: + aiproxy: + vector: +configs: + init_sql: + name: init_sql + content: | + ALTER SYSTEM SET ob_vector_memory_limit_percentage = 30; + diff --git a/deploy/docker/docker-compose-pgvector.yml b/deploy/docker/global/docker-compose.pg.yml similarity index 61% rename from deploy/docker/docker-compose-pgvector.yml rename to deploy/docker/global/docker-compose.pg.yml index c9ce35067..f82d675fb 100644 --- a/deploy/docker/docker-compose-pgvector.yml +++ b/deploy/docker/global/docker-compose.pg.yml @@ -1,18 +1,35 @@ -# 数据库的默认账号和密码仅首次运行时设置有效 -# 如果修改了账号密码,记得改数据库和项目连接参数,别只改一处~ -# 该配置文件只是给快速启动,测试使用。正式使用,记得务必修改账号密码,以及调整合适的知识库参数,共享内存等。 -# 如何无法访问 dockerhub 和 git,可以用阿里云(阿里云没有arm包) +# 用于部署的 docker-compose 文件: +# - 向量库为 Pgvector +# - FastGPT 端口映射为 3000:3000 +# - FastGPT-mcp-server 端口映射 3005:3000 +# - 建议修改账密后再运行 + +# plugin auth token +x-plugin-auth-token: &x-plugin-auth-token token +# aiproxy token +x-aiproxy-token: &x-aiproxy-token token +# 数据库连接相关配置 +x-share-db-config: &x-share-db-config + MONGODB_URI: mongodb://username:password@mongo:27017/fastgpt?authSource=admin + DB_MAX_LINK: 30 + REDIS_URL: redis://default:mypassword@redis:6379 + S3_ENDPOINT: fastgpt-minio + S3_PORT: 9000 + S3_USE_SSL: false + S3_ACCESS_KEY: minioadmin + S3_SECRET_KEY: minioadmin + +# 向量库相关配置 +x-vec-config: &x-vec-config + PG_URL: postgresql://username:password@pg:5432/postgres 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 # 阿里云 + image: pgvector/pgvector:0.8.0-pg15 container_name: pg restart: always - # ports: # 生产环境建议不要暴露 - # - 5432:5432 networks: - fastgpt environment: @@ -28,11 +45,9 @@ services: 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时候使用 + image: mongo:5.0.18 # cpu 不支持 AVX 时候使用 4.4.29 container_name: mongo restart: always networks: @@ -89,15 +104,65 @@ services: start_period: 30s volumes: - ./redis/data:/data + + fastgpt: + container_name: fastgpt + image: ghcr.io/labring/fastgpt:v4.13.0 # git + ports: + - 3000:3000 + networks: + - fastgpt + depends_on: + - mongo + - sandbox + - pg + restart: always + environment: + <<: [*x-share-db-config, *x-vec-config] + # 前端外部可访问的地址,用于自动补全文件资源路径。例如 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: *x-plugin-auth-token + # 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: *x-aiproxy-token + + # 数据库最大连接数 + 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 + fastgpt-minio: - image: minio/minio:latest + image: minio/minio:RELEASE.2025-09-07T16-13-09Z 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) - - '9000:9000' - - '9001:9001' environment: - MINIO_ROOT_USER=minioadmin - MINIO_ROOT_PASSWORD=minioadmin @@ -109,111 +174,38 @@ services: interval: 30s timeout: 20s retries: 3 - - fastgpt: - container_name: fastgpt - image: ghcr.io/labring/fastgpt:v4.12.4 # git - # image: registry.cn-hangzhou.aliyuncs.com/fastgpt/fastgpt:v4.12.4 # 阿里云 - 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.4 # git - # image: registry.cn-hangzhou.aliyuncs.com/fastgpt/fastgpt-sandbox:v4.12.4 # 阿里云 + image: ghcr.io/labring/fastgpt-sandbox:v4.13.0 networks: - fastgpt restart: always fastgpt-mcp-server: container_name: fastgpt-mcp-server - image: ghcr.io/labring/fastgpt-mcp_server:v4.12.4 # git - # image: registry.cn-hangzhou.aliyuncs.com/fastgpt/fastgpt-mcp_server:v4.12.4 # 阿里云 - ports: - - 3005:3000 + image: ghcr.io/labring/fastgpt-mcp_server:v4.13.0 networks: - fastgpt + ports: + - 3005:3000 restart: always environment: - FASTGPT_ENDPOINT=http://fastgpt:3000 fastgpt-plugin: - image: ghcr.io/labring/fastgpt-plugin:v0.1.13 # git - # image: registry.cn-hangzhou.aliyuncs.com/fastgpt/fastgpt-plugin:v0.1.13 # 阿里云 + image: ghcr.io/labring/fastgpt-plugin:v0.2.0 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 + <<: *x-share-db-config + AUTH_TOKEN: *x-plugin-auth-token + S3_BUCKET: fastgpt-plugins depends_on: fastgpt-minio: condition: service_healthy - # AI Proxy aiproxy: image: ghcr.io/labring/aiproxy:v0.3.2 - # image: registry.cn-hangzhou.aliyuncs.com/labring/aiproxy:v0.3.2 # 阿里云 container_name: aiproxy restart: unless-stopped depends_on: @@ -221,19 +213,20 @@ services: condition: service_healthy networks: - fastgpt + - aiproxy environment: # 对应 fastgpt 里的AIPROXY_API_TOKEN - - ADMIN_KEY=aiproxy + ADMIN_KEY: *x-aiproxy-token # 错误日志详情保存时间(小时) - - LOG_DETAIL_STORAGE_HOURS=1 + LOG_DETAIL_STORAGE_HOURS: 1 # 数据库连接地址 - - SQL_DSN=postgres://postgres:aiproxy@aiproxy_pg:5432/aiproxy + SQL_DSN: postgres://postgres:aiproxy@aiproxy_pg:5432/aiproxy # 最大重试次数 - - RETRY_TIMES=3 + RETRY_TIMES: 3 # 不需要计费 - - BILLING_ENABLED=false + BILLING_ENABLED: false # 不需要严格检测模型 - - DISABLE_MODEL_CONFIG=true + DISABLE_MODEL_CONFIG: true healthcheck: test: ['CMD', 'curl', '-f', 'http://localhost:3000/api/status'] interval: 5s @@ -241,13 +234,12 @@ services: 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 + - aiproxy environment: TZ: Asia/Shanghai POSTGRES_USER: postgres @@ -260,3 +252,6 @@ services: retries: 10 networks: fastgpt: + aiproxy: + vector: + diff --git a/deploy/docker/global/docker-compose.ziliiz.yml b/deploy/docker/global/docker-compose.ziliiz.yml new file mode 100644 index 000000000..f6717a9cf --- /dev/null +++ b/deploy/docker/global/docker-compose.ziliiz.yml @@ -0,0 +1,240 @@ +# 用于部署的 docker-compose 文件: +# - 向量库为 Pgvector +# - FastGPT 端口映射为 3000:3000 +# - FastGPT-mcp-server 端口映射 3005:3000 +# - 建议修改账密后再运行 + +# plugin auth token +x-plugin-auth-token: &x-plugin-auth-token token +# aiproxy token +x-aiproxy-token: &x-aiproxy-token token +# 数据库连接相关配置 +x-share-db-config: &x-share-db-config + MONGODB_URI: mongodb://username:password@mongo:27017/fastgpt?authSource=admin + DB_MAX_LINK: 30 + REDIS_URL: redis://default:mypassword@redis:6379 + S3_ENDPOINT: fastgpt-minio + S3_PORT: 9000 + S3_USE_SSL: false + S3_ACCESS_KEY: minioadmin + S3_SECRET_KEY: minioadmin + +# 向量库相关配置 +x-vec-config: &x-vec-config + MILVUS_ADDRESS: zilliz_cloud_address + MILVUS_TOKEN: zilliz_cloud_token + +version: '3.3' +services: + # Vector DB + + + mongo: + image: mongo:5.0.18 # cpu 不支持 AVX 时候使用 4.4.29 + 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: + container_name: fastgpt + image: ghcr.io/labring/fastgpt:v4.13.0 # git + ports: + - 3000:3000 + networks: + - fastgpt + depends_on: + - mongo + - sandbox + - pg + restart: always + environment: + <<: [*x-share-db-config, *x-vec-config] + # 前端外部可访问的地址,用于自动补全文件资源路径。例如 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: *x-plugin-auth-token + # 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: *x-aiproxy-token + + # 数据库最大连接数 + 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 + + fastgpt-minio: + image: minio/minio:RELEASE.2025-09-07T16-13-09Z + container_name: fastgpt-minio + restart: always + networks: + - fastgpt + 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 + sandbox: + container_name: sandbox + image: ghcr.io/labring/fastgpt-sandbox:v4.13.0 + networks: + - fastgpt + restart: always + fastgpt-mcp-server: + container_name: fastgpt-mcp-server + image: ghcr.io/labring/fastgpt-mcp_server:v4.13.0 + networks: + - fastgpt + ports: + - 3005:3000 + restart: always + environment: + - FASTGPT_ENDPOINT=http://fastgpt:3000 + fastgpt-plugin: + image: ghcr.io/labring/fastgpt-plugin:v0.2.0 + container_name: fastgpt-plugin + restart: always + networks: + - fastgpt + environment: + <<: *x-share-db-config + AUTH_TOKEN: *x-plugin-auth-token + S3_BUCKET: fastgpt-plugins + depends_on: + fastgpt-minio: + condition: service_healthy + # AI Proxy + aiproxy: + image: ghcr.io/labring/aiproxy:v0.3.2 + container_name: aiproxy + restart: unless-stopped + depends_on: + aiproxy_pg: + condition: service_healthy + networks: + - fastgpt + - aiproxy + environment: + # 对应 fastgpt 里的AIPROXY_API_TOKEN + ADMIN_KEY: *x-aiproxy-token + # 错误日志详情保存时间(小时) + 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 + restart: unless-stopped + container_name: aiproxy_pg + volumes: + - ./aiproxy_pg:/var/lib/postgresql/data + networks: + - aiproxy + 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: + aiproxy: + vector: + diff --git a/deploy/docker/run.sh b/deploy/docker/run.sh deleted file mode 100644 index 8deb87046..000000000 --- a/deploy/docker/run.sh +++ /dev/null @@ -1,19 +0,0 @@ -#!/bin/bash -docker-compose pull -docker-compose up -d - -echo "Docker Compose 重新拉取镜像完成!" - -# 删除本地旧镜像 -images=$(docker images --format "{{.ID}} {{.Repository}}" | grep fastgpt) - -# 将镜像 ID 和名称放入数组中 -IFS=$'\n' read -rd '' -a image_array <<<"$images" - -# 遍历数组并删除所有旧的镜像 -for ((i=1; i<${#image_array[@]}; i++)) -do - image=${image_array[$i]} - image_id=${image%% *} - docker rmi $image_id -done \ No newline at end of file diff --git a/deploy/docker/yml.js b/deploy/docker/yml.js deleted file mode 100644 index bf784512f..000000000 --- a/deploy/docker/yml.js +++ /dev/null @@ -1,398 +0,0 @@ -const fs = require('fs'); -const path = require('path'); - -const template = `# 数据库的默认账号和密码仅首次运行时设置有效 -# 如果修改了账号密码,记得改数据库和项目连接参数,别只改一处~ -# 该配置文件只是给快速启动,测试使用。正式使用,记得务必修改账号密码,以及调整合适的知识库参数,共享内存等。 -# 如何无法访问 dockerhub 和 git,可以用阿里云(阿里云没有arm包) - -version: '3.3' -services: - # Vector DB - {{Vector_DB_Service}} - - # 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) - - '9000:9000' - - '9001: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.12.4 # git - # image: registry.cn-hangzhou.aliyuncs.com/fastgpt/fastgpt:v4.12.4 # 阿里云 - ports: - - 3000:3000 - networks: - - fastgpt - depends_on: - - mongo - - sandbox - {{Vector_DB_Depends}} - 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 - # 向量库 连接参数 - {{Vector_DB_ENV}} - - # 日志等级: 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.4 # git - # image: registry.cn-hangzhou.aliyuncs.com/fastgpt/fastgpt-sandbox:v4.12.4 # 阿里云 - networks: - - fastgpt - restart: always - fastgpt-mcp-server: - container_name: fastgpt-mcp-server - image: ghcr.io/labring/fastgpt-mcp_server:v4.12.4 # git - # image: registry.cn-hangzhou.aliyuncs.com/fastgpt/fastgpt-mcp_server:v4.12.4 # 阿里云 - ports: - - 3005:3000 - networks: - - fastgpt - restart: always - environment: - - FASTGPT_ENDPOINT=http://fastgpt:3000 - fastgpt-plugin: - image: ghcr.io/labring/fastgpt-plugin:v0.1.13 # git - # image: registry.cn-hangzhou.aliyuncs.com/fastgpt/fastgpt-plugin:v0.1.13 # 阿里云 - 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.3.2 - # image: registry.cn-hangzhou.aliyuncs.com/labring/aiproxy:v0.3.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: -`; - -const list = [ - { - filename: './docker-compose-pgvector.yml', - depends: `- pg`, - service: `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`, - env: `- PG_URL=postgresql://username:password@pg:5432/postgres` - }, - { - filename: './docker-compose-zilliz.yml', - depends: ``, - service: ``, - env: `# zilliz 连接参数 - - MILVUS_ADDRESS=zilliz_cloud_address - - MILVUS_TOKEN=zilliz_cloud_token` - }, - { - filename: './docker-compose-milvus.yml', - depends: `- milvusStandalone`, - service: `milvus-minio: - container_name: milvus-minio - image: minio/minio:RELEASE.2023-03-20T20-16-18Z - environment: - MINIO_ACCESS_KEY: minioadmin - MINIO_SECRET_KEY: minioadmin - # ports: - # - '9001:9001' - # - '9000:9000' - networks: - - fastgpt - volumes: - - ./milvus-minio:/minio_data - command: minio server /minio_data --console-address ":9001" - healthcheck: - test: ['CMD', 'curl', '-f', 'http://localhost:9000/minio/health/live'] - interval: 30s - timeout: 20s - retries: 3 - # milvus - milvusEtcd: - container_name: milvusEtcd - image: quay.io/coreos/etcd:v3.5.5 - environment: - - ETCD_AUTO_COMPACTION_MODE=revision - - ETCD_AUTO_COMPACTION_RETENTION=1000 - - ETCD_QUOTA_BACKEND_BYTES=4294967296 - - ETCD_SNAPSHOT_COUNT=50000 - networks: - - fastgpt - volumes: - - ./milvus/etcd:/etcd - command: etcd -advertise-client-urls=http://127.0.0.1:2379 -listen-client-urls http://0.0.0.0:2379 --data-dir /etcd - healthcheck: - test: ['CMD', 'etcdctl', 'endpoint', 'health'] - interval: 30s - timeout: 20s - retries: 3 - milvusStandalone: - container_name: milvusStandalone - image: milvusdb/milvus:v2.4.3 - command: ['milvus', 'run', 'standalone'] - security_opt: - - seccomp:unconfined - environment: - ETCD_ENDPOINTS: milvusEtcd:2379 - MINIO_ADDRESS: milvus-minio:9000 - networks: - - fastgpt - volumes: - - ./milvus/data:/var/lib/milvus - healthcheck: - test: ['CMD', 'curl', '-f', 'http://localhost:9091/healthz'] - interval: 30s - start_period: 90s - timeout: 20s - retries: 3 - depends_on: - - 'milvusEtcd' - - 'milvus-minio'`, - env: `- MILVUS_ADDRESS=http://milvusStandalone:19530 - - MILVUS_TOKEN=none` - }, - { - filename: './docker-compose-oceanbase/docker-compose.yml', - depends: `- ob`, - service: `ob: - image: oceanbase/oceanbase-ce:4.3.5-lts # docker hub - # image: quay.io/oceanbase/oceanbase-ce:4.3.5-lts # 镜像 - container_name: ob - restart: always - # ports: # 生产环境建议不要暴露 - # - 2881:2881 - networks: - - fastgpt - environment: - # 这里的配置只有首次运行生效。修改后,重启镜像是不会生效的。需要把持久化数据删除再重启,才有效果 - - OB_SYS_PASSWORD=obsyspassword - # 不同于传统数据库,OceanBase 数据库的账号包含更多字段,包括用户名、租户名和集群名。经典格式为"用户名@租户名#集群名" - # 比如用mysql客户端连接时,根据本文件的默认配置,应该指定 "-uroot@tenantname" - - OB_TENANT_NAME=tenantname - - OB_TENANT_PASSWORD=tenantpassword - # MODE分为MINI和NORMAL, 后者会最大程度使用主机资源 - - MODE=MINI - - OB_SERVER_IP=127.0.0.1 - # 更多环境变量配置见oceanbase官方文档: https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000002013494 - volumes: - - ./ob/data:/root/ob - - ./ob/config:/root/.obd/cluster - - ./init.sql:/root/boot/init.d/init.sql - healthcheck: - # obclient -h127.0.0.1 -P2881 -uroot@tenantname -ptenantpassword -e "SELECT 1;" - test: - [ - 'CMD-SHELL', - 'obclient -h\$\$\$\${OB_SERVER_IP} -P2881 -uroot@\$\$\$\${OB_TENANT_NAME} -p\$\$\$\${OB_TENANT_PASSWORD} -e "SELECT 1;"' - ] - interval: 30s - timeout: 10s - retries: 1000 - start_period: 10s`, - env: `- OCEANBASE_URL=mysql://root%40tenantname:tenantpassword@ob:2881/test` - } -]; - -list.forEach((item) => { - const { filename, service, env, depends } = item; - const content = template - .replace('{{Vector_DB_Service}}', service) - .replace('{{Vector_DB_ENV}}', env) - .replace('{{Vector_DB_Depends}}', depends); - fs.writeFileSync(path.join(__dirname, filename), content, 'utf-8'); -}); diff --git a/deploy/init.mjs b/deploy/init.mjs new file mode 100644 index 000000000..d8d32ae3e --- /dev/null +++ b/deploy/init.mjs @@ -0,0 +1,228 @@ +#!/usr/bin/env node +import fs from 'fs'; +import path from 'path'; + +/** + * @enum {String} RegionEnum + */ +const RegionEnum = { + cn: 'cn', + global: 'global' +}; + +/** + * @enum {String} VectorEnum + */ +const VectorEnum = { + pg: 'pg', + milvus: 'milvus', + zilliz: 'zilliz', + ob: 'ob' +}; + +/** + * @enum {string} Services + */ +const Services = { + fastgpt: 'fastgpt', + fastgptPlugin: 'fastgpt-plugin', + fastgptSandbox: 'fastgpt-sandbox', + fastgptMcpServer: 'fastgpt-mcp_server', + minio: 'minio', + mongo: 'mongo', + redis: 'redis', + aiproxy: 'aiproxy', + aiproxyPg: 'aiproxy-pg', + // vectors + pg: 'pg', + milvusMinio: 'milvus-minio', + milvusEtcd: 'milvus-etcd', + milvusStandalone: 'milvus-standalone', + oceanbase: 'oceanbase' +}; + +// make sure the cwd +const basePath = process.cwd(); +if (!basePath.endsWith('deploy')) { + process.chdir('deploy'); +} + +/** + * @typedef {{ tag: String, image: {cn: String, global: String} }} ArgItemType + */ +/** format the args + * @type {Record} + */ +const args = (() => { + /** + * @type {{tags: Record, images: Record>}} + */ + const obj = JSON.parse(fs.readFileSync(path.join(process.cwd(), 'args.json'))); + const args = {}; + for (const key of Object.keys(obj.tags)) { + args[key] = { + tag: obj.tags[key], + image: { + cn: obj.images.cn[key], + global: obj.images.global[key] + } + }; + } + return args; +})(); + +const vector = { + pg: { + db: '', + config: `\ + PG_URL: postgresql://username:password@pg:5432/postgres`, + extra: '' + }, + milvus: { + db: '', + config: `\ + MILVUS_ADDRESS: http://milvusStandalone:19530 + MILVUS_TOKEN: none + `, + extra: '' + }, + zilliz: { + db: '', + config: `\ + MILVUS_ADDRESS: zilliz_cloud_address + MILVUS_TOKEN: zilliz_cloud_token`, + extra: '' + }, + ob: { + db: '', + cofig: `\ + OCEANBASE_URL: mysql://root%40tenantname:tenantpassword@ob:2881/test +`, + extra: `\ +configs: + init_sql: + name: init_sql + content: | + ALTER SYSTEM SET ob_vector_memory_limit_percentage = 30; + ` + } +}; + +/** + * replace all ${{}} + * @param {string} source + * @param {RegionEnum} region + * @param {VectorEnum} vec + * @returns {string} + */ +const replace = (source, region, vec) => { + // Match ${{expr}}, capture "expr" inside {{}} + return source.replace(/\$\{\{([^}]*)\}\}/g, (_, expr) => { + // expr: a.b + /** + * @type {String} + */ + const [a, b] = expr.split('.'); + if (a === 'vec') { + if (b === 'db') { + return replace(vector[vec].db, region, vec); + } else { + return vector[vec][b]; + } + } + + if (b === 'tag') { + return args[a].tag; + } else if (b === 'image') { + return args[a].image[region]; + } + }); +}; +{ + // read in Vectors + const pg = fs.readFileSync(path.join(process.cwd(), 'templates', 'vector', 'pg.txt')); + vector.pg.db = String(pg); + + const milvus = fs.readFileSync(path.join(process.cwd(), 'templates', 'vector', 'milvus.txt')); + vector.milvus.db = String(milvus); + + const ob = fs.readFileSync(path.join(process.cwd(), 'templates', 'vector', 'ob.txt')); + vector.ob.db = String(ob); +} + +const generateDevFile = async () => { + console.log('generating dev/docker-compose.yml'); + // 1. read template + const template = await fs.promises.readFile( + path.join(process.cwd(), 'templates', 'docker-compose.dev.yml'), + 'utf8' + ); + + await Promise.all([ + fs.promises.writeFile( + path.join(process.cwd(), 'dev', 'docker-compose.cn.yml'), + replace(template, 'cn') + ), + fs.promises.writeFile( + path.join(process.cwd(), 'dev', 'docker-compose.yml'), + replace(template, 'global') + ) + ]); + + console.log('success geenrate dev files'); +}; + +const generateProdFile = async () => { + console.log('generating prod/docker-compose.yml'); + const template = await fs.promises.readFile( + path.join(process.cwd(), 'templates', 'docker-compose.prod.yml'), + 'utf8' + ); + + await Promise.all([ + fs.promises.writeFile( + path.join(process.cwd(), 'docker', 'cn', 'docker-compose.pg.yml'), + replace(template, 'cn', VectorEnum.pg) + ), + fs.promises.writeFile( + path.join(process.cwd(), 'docker', 'global', 'docker-compose.pg.yml'), + replace(template, 'global', VectorEnum.pg) + ), + fs.promises.writeFile( + path.join(process.cwd(), 'docker', 'cn', 'docker-compose.milvus.yml'), + replace(template, 'cn', VectorEnum.milvus) + ), + fs.promises.writeFile( + path.join(process.cwd(), 'docker', 'global', 'docker-compose.milvus.yml'), + replace(template, 'global', VectorEnum.milvus) + ), + fs.promises.writeFile( + path.join(process.cwd(), 'docker', 'cn', 'docker-compose.zilliz.yml'), + replace(template, 'cn', VectorEnum.zilliz) + ), + fs.promises.writeFile( + path.join(process.cwd(), 'docker', 'global', 'docker-compose.ziliiz.yml'), + replace(template, 'global', VectorEnum.zilliz) + ), + fs.promises.writeFile( + path.join(process.cwd(), 'docker', 'cn', 'docker-compose.oceanbase.yml'), + replace(template, 'cn', VectorEnum.ob) + ), + fs.promises.writeFile( + path.join(process.cwd(), 'docker', 'global', 'docker-compose.oceanbase.yml'), + replace(template, 'global', VectorEnum.ob) + ) + ]); + + console.log('success geenrate prod files'); +}; + +await Promise.all([generateDevFile(), generateProdFile()]); + +console.log('copy the docker dir to ../document/public'); + +await fs.promises.cp( + path.join(process.cwd(), 'docker'), + path.join(process.cwd(), '..', 'document', 'public', 'deploy', 'docker'), + { recursive: true } +); diff --git a/deploy/templates/docker-compose.dev.yml b/deploy/templates/docker-compose.dev.yml new file mode 100644 index 000000000..c231a6b67 --- /dev/null +++ b/deploy/templates/docker-compose.dev.yml @@ -0,0 +1,212 @@ +# 用于开发的 docker-compose 文件: +# - 只包含 FastGPT 的最小化运行条件 +# - 没有 FastGPT 本体 +# - 所有端口都映射到外层 +# - pg: 5432 +# - mongo: 27017 +# - redis: 6379 +# - fastgpt-sandbox: 3002 +# - fastgpt-plugin: 3003 +# - aiproxy: 3010 +# - 使用 pgvector 作为默认的向量库 + +services: + # Vector DB + pg: + image: ${{pg.image}}:${{pg.tag}} + 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.image}}:${{mongo.tag}} # cpu 不支持 AVX 时候使用 4.4.29 + 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')"; 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.image}}:${{redis.tag}} + 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 + 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.image}}:${{minio.tag}} + container_name: fastgpt-minio + restart: always + networks: + - fastgpt + ports: + - '9000:9000' + - '9001: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 + sandbox: + container_name: sandbox + image: ${{fastgpt-sandbox.image}}:${{fastgpt-sandbox.tag}} + ports: + - 3002:3000 + networks: + - fastgpt + restart: always + fastgpt-mcp-server: + container_name: fastgpt-mcp-server + image: ${{fastgpt-mcp_server.image}}:${{fastgpt-mcp_server.tag}} + ports: + - 3005:3000 + networks: + - fastgpt + restart: always + environment: + - FASTGPT_ENDPOINT=http://fastgpt:3000 + fastgpt-plugin: + image: ${{fastgpt-plugin.image}}:${{fastgpt-plugin.tag}} + container_name: fastgpt-plugin + restart: always + ports: + - 3003:3000 + networks: + - fastgpt + environment: + - AUTH_TOKEN=token + - S3_ENDPOINT=fastgpt-minio + - S3_PORT=9000 + - S3_USE_SSL=false + - S3_ACCESS_KEY=minioadmin + - S3_SECRET_KEY=minioadmin + - S3_BUCKET=fastgpt-plugins + - S3_TOOL_BUCKET=fastgpt-tool # 系统工具,创建的临时文件,存储的桶,要求公开读私有写。 + - S3_PLUGIN_BUCKET=fastgpt-plugin # 系统插件热安装文件的桶,私有读写。 + - RETENTION_DAYS=15 # 系统工具临时文件保存天数 + - MONGODB_URI=mongodb://myusername:mypassword@mongo:27017/fastgpt?authSource=admin&directConnection=true + - REDIS_URL=redis://default:mypassword@redis:6379 + depends_on: + fastgpt-minio: + condition: service_healthy + # AI Proxy + aiproxy: + image: ${{aiproxy.image}}:${{aiproxy.tag}} + container_name: aiproxy + restart: unless-stopped + ports: + - 3010:3000 + depends_on: + aiproxy_pg: + condition: service_healthy + networks: + - fastgpt + - aiproxy + 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: ${{aiproxy-pg.image}}:${{aiproxy-pg.tag}} # docker hub + restart: unless-stopped + container_name: aiproxy_pg + volumes: + - ./aiproxy_pg:/var/lib/postgresql/data + networks: + - aiproxy + 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: + aiproxy: diff --git a/deploy/templates/docker-compose.prod.yml b/deploy/templates/docker-compose.prod.yml new file mode 100644 index 000000000..534db773a --- /dev/null +++ b/deploy/templates/docker-compose.prod.yml @@ -0,0 +1,239 @@ +# 用于部署的 docker-compose 文件: +# - 向量库为 Pgvector +# - FastGPT 端口映射为 3000:3000 +# - FastGPT-mcp-server 端口映射 3005:3000 +# - 建议修改账密后再运行 + +# plugin auth token +x-plugin-auth-token: &x-plugin-auth-token token +# aiproxy token +x-aiproxy-token: &x-aiproxy-token token +# 数据库连接相关配置 +x-share-db-config: &x-share-db-config + MONGODB_URI: mongodb://username:password@mongo:27017/fastgpt?authSource=admin + DB_MAX_LINK: 30 + REDIS_URL: redis://default:mypassword@redis:6379 + S3_ENDPOINT: fastgpt-minio + S3_PORT: 9000 + S3_USE_SSL: false + S3_ACCESS_KEY: minioadmin + S3_SECRET_KEY: minioadmin + +# 向量库相关配置 +x-vec-config: &x-vec-config +${{vec.config}} + +version: '3.3' +services: + # Vector DB +${{vec.db}} + + mongo: + image: ${{mongo.image}}:${{mongo.tag}} # cpu 不支持 AVX 时候使用 4.4.29 + 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.image}}:${{redis.tag}} + 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: + container_name: fastgpt + image: ${{fastgpt.image}}:${{fastgpt.tag}} # git + ports: + - 3000:3000 + networks: + - fastgpt + depends_on: + - mongo + - sandbox + - pg + restart: always + environment: + <<: [*x-share-db-config, *x-vec-config] + # 前端外部可访问的地址,用于自动补全文件资源路径。例如 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: *x-plugin-auth-token + # 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: *x-aiproxy-token + + # 数据库最大连接数 + 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 + + fastgpt-minio: + image: ${{minio.image}}:${{minio.tag}} + container_name: fastgpt-minio + restart: always + networks: + - fastgpt + 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 + sandbox: + container_name: sandbox + image: ${{fastgpt-sandbox.image}}:${{fastgpt-sandbox.tag}} + networks: + - fastgpt + restart: always + fastgpt-mcp-server: + container_name: fastgpt-mcp-server + image: ${{fastgpt-mcp_server.image}}:${{fastgpt-mcp_server.tag}} + networks: + - fastgpt + ports: + - 3005:3000 + restart: always + environment: + - FASTGPT_ENDPOINT=http://fastgpt:3000 + fastgpt-plugin: + image: ${{fastgpt-plugin.image}}:${{fastgpt-plugin.tag}} + container_name: fastgpt-plugin + restart: always + networks: + - fastgpt + environment: + <<: *x-share-db-config + AUTH_TOKEN: *x-plugin-auth-token + S3_BUCKET: fastgpt-plugins + depends_on: + fastgpt-minio: + condition: service_healthy + # AI Proxy + aiproxy: + image: ${{aiproxy.image}}:${{aiproxy.tag}} + container_name: aiproxy + restart: unless-stopped + depends_on: + aiproxy_pg: + condition: service_healthy + networks: + - fastgpt + - aiproxy + environment: + # 对应 fastgpt 里的AIPROXY_API_TOKEN + ADMIN_KEY: *x-aiproxy-token + # 错误日志详情保存时间(小时) + 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: ${{aiproxy-pg.image}}:${{aiproxy-pg.tag}} # docker hub + restart: unless-stopped + container_name: aiproxy_pg + volumes: + - ./aiproxy_pg:/var/lib/postgresql/data + networks: + - aiproxy + 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: + aiproxy: + vector: +${{vec.extra}} diff --git a/deploy/templates/vector/milvus.txt b/deploy/templates/vector/milvus.txt new file mode 100644 index 000000000..377773941 --- /dev/null +++ b/deploy/templates/vector/milvus.txt @@ -0,0 +1,59 @@ + milvus-minio: + container_name: milvus-minio + image: ${{milvus-minio.image}}:${{milvus-minio.tag}} + environment: + MINIO_ACCESS_KEY: minioadmin + MINIO_SECRET_KEY: minioadmin + networks: + - vector + volumes: + - ./milvus-minio:/minio_data + command: minio server /minio_data --console-address ":9001" + healthcheck: + test: ['CMD', 'curl', '-f', 'http://localhost:9000/minio/health/live'] + interval: 30s + timeout: 20s + retries: 3 + # milvus + milvus-etcd: + container_name: milvus-etcd + image: + image: ${{milvus-etcd.image}}:${{milvus-etcd.tag}} + environment: + - ETCD_AUTO_COMPACTION_MODE=revision + - ETCD_AUTO_COMPACTION_RETENTION=1000 + - ETCD_QUOTA_BACKEND_BYTES=4294967296 + - ETCD_SNAPSHOT_COUNT=50000 + networks: + - vector + volumes: + - ./milvus/etcd:/etcd + command: etcd -advertise-client-urls=http://127.0.0.1:2379 -listen-client-urls http://0.0.0.0:2379 --data-dir /etcd + healthcheck: + test: ['CMD', 'etcdctl', 'endpoint', 'health'] + interval: 30s + timeout: 20s + retries: 3 + milvusStandalone: + container_name: milvusStandalone + image: ${{milvus-standalone.image}}:${{milvus-standalone.tag}} + command: ['milvus', 'run', 'standalone'] + security_opt: + - seccomp:unconfined + environment: + ETCD_ENDPOINTS: milvus-etcd:2379 + MINIO_ADDRESS: milvus-minio:9000 + networks: + - fastgpt + - vector + volumes: + - ./milvus/data:/var/lib/milvus + healthcheck: + test: ['CMD', 'curl', '-f', 'http://localhost:9091/healthz'] + interval: 30s + start_period: 90s + timeout: 20s + retries: 3 + depends_on: + - 'milvus-etcd' + - 'milvus-minio' diff --git a/deploy/templates/vector/ob.txt b/deploy/templates/vector/ob.txt new file mode 100644 index 000000000..7b03a13e9 --- /dev/null +++ b/deploy/templates/vector/ob.txt @@ -0,0 +1,36 @@ + ob: + image: ${{oceanbase.image}}:${{oceanbase.tag}} + container_name: ob + restart: always + # ports: # 生产环境建议不要暴露 + # - 2881:2881 + networks: + - fastgpt + environment: + # 这里的配置只有首次运行生效。修改后,重启镜像是不会生效的。需要把持久化数据删除再重启,才有效果 + - OB_SYS_PASSWORD=obsyspassword + # 不同于传统数据库,OceanBase 数据库的账号包含更多字段,包括用户名、租户名和集群名。经典格式为"用户名@租户名#集群名" + # 比如用mysql客户端连接时,根据本文件的默认配置,应该指定 "-uroot@tenantname" + - OB_TENANT_NAME=tenantname + - OB_TENANT_PASSWORD=tenantpassword + # MODE分为MINI和NORMAL, 后者会最大程度使用主机资源 + - MODE=MINI + - OB_SERVER_IP=127.0.0.1 + # 更多环境变量配置见oceanbase官方文档: https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000002013494 + volumes: + - ../ob/data:/root/ob + - ../ob/config:/root/.obd/cluster + configs: + - source: init_sql + target: /root/boot/init.d/init.sql + healthcheck: + # obclient -h127.0.0.1 -P2881 -uroot@tenantname -ptenantpassword -e "SELECT 1;" + test: + [ + "CMD-SHELL", + 'obclient -h$${OB_SERVER_IP} -P2881 -uroot@$${OB_TENANT_NAME} -p$${OB_TENANT_PASSWORD} -e "SELECT 1;"', + ] + interval: 30s + timeout: 10s + retries: 1000 + start_period: 10s diff --git a/deploy/templates/vector/pg.txt b/deploy/templates/vector/pg.txt new file mode 100644 index 000000000..f712f2b0e --- /dev/null +++ b/deploy/templates/vector/pg.txt @@ -0,0 +1,18 @@ + pg: + image: ${{pg.image}}:${{pg.tag}} + container_name: pg + restart: always + 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 diff --git a/document/content/docs/introduction/development/community.mdx b/document/content/docs/introduction/development/community.mdx deleted file mode 100644 index b27d1f194..000000000 --- a/document/content/docs/introduction/development/community.mdx +++ /dev/null @@ -1,16 +0,0 @@ ---- -title: 加入社区 -description: ' 加入 FastGPT 开发者社区和我们一起成长' ---- - -FastGPT 是一个由用户和贡献者参与推动的开源项目,如果您对产品使用存在疑问和建议,可尝试以下方式寻求支持。我们的团队与社区会竭尽所能为您提供帮助。 - -- 📱 扫码加入飞书交流群👇 - - - -- 🐞 请将任何 FastGPT 的 Bug、问题和需求提交到 [GitHub Issue](https://github.com/labring/fastgpt/issues/new/choose)。 diff --git a/document/content/docs/introduction/development/docker.mdx b/document/content/docs/introduction/development/docker.mdx index 5f55b46a8..d4f91e155 100644 --- a/document/content/docs/introduction/development/docker.mdx +++ b/document/content/docs/introduction/development/docker.mdx @@ -19,8 +19,8 @@ import { Alert } from '@/components/docs/Alert'; - MongoDB:用于存储除了向量外的各类数据 -- PostgreSQL/Milvus:存储向量数据 -- OneAPI: 聚合各类 AI API,支持多模型调用 (任何模型问题,先自行通过 OneAPI 测试校验) +- PostgreSQL/Milvus/Oceanbase:存储向量数据 +- AIProxy: 聚合各类 AI API,支持多模型调用 (任何模型问题,先自行通过 OneAPI 测试校验) @@ -99,12 +99,91 @@ brew install orbstack ## 开始部署 -### 1. 下载 docker-compose.yml +### 1. 获取 `docker-compose.yml` 和 `config.json` 配置文件 -非 Linux 环境或无法访问外网环境,可手动创建一个目录,并下载配置文件和对应版本的`docker-compose.yml`,在这个文件夹中依据下载的配置文件运行docker,若作为本地开发使用推荐`docker-compose-pgvector`版本,并且自行拉取并运行`sandbox`和`fastgpt`,并在docker配置文件中注释掉`sandbox`和`fastgpt`的部分 +#### 方法一:使用脚本部署 -- [config.json](https://raw.githubusercontent.com/labring/FastGPT/refs/heads/main/projects/app/data/config.json) -- [docker-compose.yml](https://github.com/labring/FastGPT/blob/main/deploy/docker) (注意,不同向量库版本的文件不一样) + + +国内镜像(阿里云) + +```bash +bash <(curl -fsSL https://doc.fastgpt.cn/deploy/install.sh) --region=cn --vector=pg +``` + +非国内镜像(dockhub, ghcr) + +```bash +bash <(curl -fsSL https://doc.fastgpt.cn/deploy/install.sh) --region=global --vector=pg +``` +需要在 Linux/MacOS/Windows WSL 环境下执行 + + + + 国内镜像(阿里云) + + ```bash + bash <(curl -fsSL https://doc.fastgpt.cn/deploy/install.sh) --region=cn --vector=oceanbase + ``` + + 非国内镜像(dockhub, ghcr) + + ```bash + bash <(curl -fsSL https://doc.fastgpt.cn/deploy/install.sh) --region=global --vector=oceanbase + ``` + 需要在 Linux/MacOS/Windows WSL 环境下执行 + + + 国内镜像(阿里云) + + ```bash + bash <(curl -fsSL https://doc.fastgpt.cn/deploy/install.sh) --region=cn --vector=milvus + ``` + + 非国内镜像(dockhub, ghcr) + + ```bash + bash <(curl -fsSL https://doc.fastgpt.cn/deploy/install.sh) --region=global --vector=milvus + ``` + 需要在 Linux/MacOS/Windows WSL 环境下执行 + + + 国内镜像(阿里云) + + ```bash + bash <(curl -fsSL https://doc.fastgpt.cn/deploy/install.sh) --region=cn --vector=zilliz + ``` + + 非国内镜像(dockhub, ghcr) + + ```bash + bash <(curl -fsSL https://doc.fastgpt.cn/deploy/install.sh) --region=global --vector=zilliz + ``` + 需要在 Linux/MacOS/Windows WSL 环境下执行 + + zilliz 还需要获取密钥,参考 [部署 Zilliz 版本获取账号和密钥](#部署-zilliz-版本获取账号和密钥) + + + +#### 方法二:手动下载部署 +如果部署环境为非 *nix 环境或无法访问外网,需要手动下载 `docker-compose.yml` 进行部署 + +选择并下载您的 `docker-compose.yml` 文件 +- Pgvector + - 中国大陆地区镜像源(阿里云):[docker-compose.pg.yml](https://doc.fastgpt.cn/deploy/docker/cn/docker-compose.pg.yml) + - 全球镜像源(dockerhub, ghcr):[docker-compose.pg.yml](https://doc.fastgpt.cn/deploy/docker/global/docker-compose.pg.yml) +- Oceanbase + - 中国大陆地区镜像源(阿里云):[docker-compose.ob.yml](https://doc.fastgpt.cn/deploy/docker/cn/docker-compose.ob.yml) + - 全球镜像源(dockerhub, ghcr):[docker-compose.ob.yml](https://doc.fastgpt.cn/deploy/docker/global/docker-compose.ob.yml) +- Milvus + - 中国大陆地区镜像源(阿里云):[docker-compose.milvus.yml](https://doc.fastgpt.cn/deploy/docker/cn/docker-compose.milvus.yml) + - 全球镜像源(dockerhub, ghcr):[docker-compose.milvus.yml](https://doc.fastgpt.cn/deploy/docker/global/docker-compose.milvus.yml) +- Zilliz + - 中国大陆地区镜像源(阿里云):[docker-compose.zilliz.yml](https://doc.fastgpt.cn/deploy/docker/cn/docker-compose.zilliz.yml) + - 全球镜像源(dockerhub, ghcr):[docker-compose.zilliz.yml](https://doc.fastgpt.cn/deploy/docker/global/docker-compose.zilliz.yml) + +下载 config.json 文件 +- [config.json](https://doc.fastgpt.cn/deploy/config/config.json) @@ -112,50 +191,9 @@ brew install orbstack -**Linux 快速脚本** - -```bash -mkdir fastgpt -cd fastgpt -curl -O https://raw.githubusercontent.com/labring/FastGPT/main/projects/app/data/config.json - -# pgvector 版本(测试推荐,简单快捷) -curl -o docker-compose.yml https://raw.githubusercontent.com/labring/FastGPT/main/deploy/docker/docker-compose-pgvector.yml -# oceanbase 版本(需要将init.sql和docker-compose.yml放在同一个文件夹,方便挂载) -# curl -o docker-compose.yml https://raw.githubusercontent.com/labring/FastGPT/main/deploy/docker/docker-compose-oceanbase/docker-compose.yml -# curl -o init.sql https://raw.githubusercontent.com/labring/FastGPT/main/deploy/docker/docker-compose-oceanbase/init.sql -# milvus 版本 -# curl -o docker-compose.yml https://raw.githubusercontent.com/labring/FastGPT/main/deploy/docker/docker-compose-milvus.yml -# zilliz 版本 -# curl -o docker-compose.yml https://raw.githubusercontent.com/labring/FastGPT/main/deploy/docker/docker-compose-zilliz.yml -``` - ### 2. 修改环境变量 - -找到 yml 文件中,fastgpt 容器的环境变量进行下面操作: - - - -无需操作 - - -无需操作 - - -无需操作 - - -打开 [Zilliz Cloud](https://zilliz.com.cn/), 创建实例并获取相关秘钥。 - -![zilliz_key](/imgs/zilliz_key.png) - - - -1. 修改`MILVUS_ADDRESS`和`MILVUS_TOKEN`链接参数,分别对应 `zilliz` 的 `Public Endpoint` 和 `Api key`,记得把自己ip加入白名单。 - - - - +按照您的需求自行修改环境变量,建议在生产环境修改账号密码等。 +对于 Zilliz 版本 还需要获取密钥,参考 [部署 Zilliz 版本获取账号和密钥](#部署-zilliz-版本获取账号和密钥) ### 3. 修改 config.json 配置文件 @@ -360,3 +398,14 @@ mongo连接失败,查看mongo的运行状态**对应日志**。 ### 如何修改密码 修改`docker-compose.yml`文件中`DEFAULT_ROOT_PSW`并重启即可,密码会自动更新。 + +### 部署 Zilliz 版本,获取账号和密钥 +打开 [Zilliz Cloud](https://zilliz.com.cn/), 创建实例并获取相关秘钥。 + +![zilliz_key](/imgs/zilliz_key.png) + + + +1. 修改`MILVUS_ADDRESS`和`MILVUS_TOKEN`链接参数,分别对应 `zilliz` 的 `Public Endpoint` 和 `Api key`,记得把自己ip加入白名单。 + + diff --git a/document/content/docs/introduction/development/intro.mdx b/document/content/docs/introduction/development/intro.mdx index 6b680bbf8..3ae471230 100644 --- a/document/content/docs/introduction/development/intro.mdx +++ b/document/content/docs/introduction/development/intro.mdx @@ -8,49 +8,46 @@ import FastGPTLink from '@/components/docs/linkFastGPT'; 本文档介绍了如何设置开发环境以构建和测试 FastGPT。 -## 前置依赖项 +## 前置开发环境 您需要在计算机上安装和配置以下依赖项才能构建 FastGPT: -- [Git](http://git-scm.com/) -- [Docker](https://www.docker.com/)(构建镜像) -- [Node.js v20.14.0](http://nodejs.org)(版本尽量一样,可以使用nvm管理node版本) +- [Git](https://git-scm.com/) +- [Docker](https://www.docker.com/) +- [Node.js v20.14.0](https://nodejs.org)(版本尽量一样,可以使用 [nvm](https://github.com/nvm-sh/nvm) 管理 node 版本) - [pnpm](https://pnpm.io/) 推荐版本 9.4.0 (目前官方的开发环境) -- make命令: 根据不同平台,百度安装 (官方是GNU Make 4.3) + +建议在 *nix 环境进行开发 (Linux, MacOS, Windows WSL) ## 开始本地开发 - +### 1. Fork FastGPT 存储库 -1. 用户默认的时区为 `Asia/Shanghai`,非 linux 环境时候,获取系统时间会异常,本地开发时候,可以将用户的时区调整成 UTC(+0)。 -2. 建议先服务器装好**数据库**,再进行本地开发。 - - - -### 1. Fork 存储库 - -您需要 Fork [存储库](https://github.com/labring/FastGPT)。 +您需要 Fork [FastGPT 存储库](https://github.com/labring/FastGPT)。 ### 2. 克隆存储库 克隆您在 GitHub 上 Fork 的存储库: ``` -git clone git@github.com:/FastGPT.git +git clone git@github.com:/FastGPT.git ``` -**目录简要说明** -1. `projects` 目录下为 FastGPT 应用代码。其中 `app` 为 FastGPT 核心应用。(后续可能会引入其他应用) -2. NextJS 框架前后端放在一起,API 服务位于 `src/pages/api` 目录内。 -3. `packages` 目录为共用代码,通过 workspace 被注入到 `projects` 中,已配置 monorepo 自动注入,无需额外打包。 +### 3. 通过 docker 启动开发环境 -### 3. 安装数据库 +若您本地已经通过 docker 启动了 FastGPT,则需要先关闭,否则会有端口冲突。 -第一次开发,需要先部署数据库,建议本地开发可以随便找一台 2C2G 的轻量小数据库实践,或者新建文件夹并配置相关文件用以运行docker。数据库部署教程:[Docker 快速部署](/docs/introduction/development/docker/)。部署完了,可以本地访问其数据库。 +切换到 `FastGPT/deploy/dev` 目录,执行 `docker compose up -d` 运行 FastGPT 的各种依赖。 + +```bash +cd FastGPT/deploy/dev +docker compose up -d +``` - Mongo 数据库需要注意,需要注意在连接地址中增加 `directConnection=true` + 1. 如果无法获取镜像,可以选择国内镜像版本的 docker-compose.yml 文件:`docker compose -f docker-compose.cn.yml up -d` + 2. Mongo 数据库需要注意,需要注意在连接地址中增加 `directConnection=true` 参数,才能连接上副本集的数据库。 @@ -58,15 +55,29 @@ git clone git@github.com:/FastGPT.git 以下文件均在 `projects/app` 路径下。 +```bash +# 确保你现在在 projects/app 下 +pwd +# 应当输出 /xxxx/xxxx/xxx/FastGPT/projects/app +``` + **1. 环境变量** -复制`.env.template`文件,在同级目录下生成一个`.env.local` 文件,修改`.env.local` 里内容才是有效的变量。变量说明见 .env.template,主要需要修改`API_KEY`和数据库的地址与端口以及数据库账号的用户名和密码,具体配置需要和docker配置文件相同,其中用户名和密码如需修改需要修改docker配置文件、数据库和`.env.local`文件,不能只改一处。 +复制 `.env.template` 文件,在同级目录下生成一个`.env.local` 文件,修改`.env.local` 里内容才是有效的变量。 +变量说明见 `.env.template` +如果没有修改 docker-compose.yaml 中的变量,`.env.template` 中的默认值就可以,不需要进行修改,否则需要和 `yml` 中的变量一致。 -**2. config 配置文件** +```bash +cp .env.template .env.local +``` + +**2. config.json 配置文件** 复制 `data/config.json` 文件,生成一个 `data/config.local.json` 配置文件,具体配置参数说明,可参考 [config 配置说明](/docs/introduction/development/configuration) -**注意:json 配置文件不能包含注释,介绍中为了方便看才加入的注释** +```bash +cp data/config.json data/config.local.json +``` 这个文件大部分时候不需要修改。只需要关注 `systemEnv` 里的参数: @@ -82,28 +93,22 @@ git clone git@github.com:/FastGPT.git ```bash # 代码根目录下执行,会安装根 package、projects 和 packages 内所有依赖 # 如果提示 isolate-vm 安装失败,可以参考:https://github.com/laverdet/isolated-vm?tab=readme-ov-file#requirements +pwd # 应该在代码的根目录 pnpm i - -# 非 Make 运行 cd projects/app pnpm dev - -# Make 运行 -make dev name=app ``` -### 6. 部署打包 +默认 next 将运行在 3000 端口,访问 http://localhost:3000 +### 6. 打包 + +建议直接使用 Docker 进行打包。 ```bash -# Docker cmd: Build image, not proxy -docker build -f ./projects/app/Dockerfile -t registry.cn-hangzhou.aliyuncs.com/fastgpt/fastgpt:v4.8.1 . --build-arg name=app -# Make cmd: Build image, not proxy -make build name=app image=registry.cn-hangzhou.aliyuncs.com/fastgpt/fastgpt:v4.8.1 - -# Docker cmd: Build image with proxy -docker build -f ./projects/app/Dockerfile -t registry.cn-hangzhou.aliyuncs.com/fastgpt/fastgpt:v4.8.1 . --build-arg name=app --build-arg proxy=taobao -# Make cmd: Build image with proxy -make build name=app image=registry.cn-hangzhou.aliyuncs.com/fastgpt/fastgpt:v4.8.1 proxy=taobao +# 没有 Proxy +docker build -f ./projects/app/Dockerfile -t fastgpt . --build-arg name=app +# Taobao Proxy +docker build -f ./projects/app/Dockerfile -t fastgpt. --build-arg name=app --build-arg proxy=taobao ``` 如果不使用 `docker` 打包,需要手动把 `Dockerfile` 里 run 阶段的内容全部手动执行一遍(非常不推荐)。 @@ -118,6 +123,10 @@ make build name=app image=registry.cn-hangzhou.aliyuncs.com/fastgpt/fastgpt:v4.8 ## QA +### 获取系统时间异常 + +如果用户默认的时区为 `Asia/Shanghai`, 非 linux 环境时,获取系统时间会异常,本地开发时,可以将用户的时区调整成 UTC(+0)。 + ### 本地数据库无法连接 1. 如果你是连接远程的数据库,先检查对应的端口是否开放。 @@ -178,9 +187,9 @@ FastGPT 采用 pnpm workspace 方式构建 monorepo 项目,主要分为两个 FastGPT 在代码模块划分时,按DDD的思想进行划分,主要分为以下几个领域: -core - 核心功能(知识库,工作流,应用,对话) -support - 支撑功能(用户体系,计费,鉴权等) -common - 基础功能(日志管理,文件读写等) +- core - 核心功能(知识库,工作流,应用,对话) +- support - 支撑功能(用户体系,计费,鉴权等) +- common - 基础功能(日志管理,文件读写等)
代码结构说明 diff --git a/document/content/docs/introduction/development/meta.json b/document/content/docs/introduction/development/meta.json index 74f8a47c0..80d919814 100644 --- a/document/content/docs/introduction/development/meta.json +++ b/document/content/docs/introduction/development/meta.json @@ -3,11 +3,11 @@ "description": "FastGPT 社区版", "icon": "🔧", "pages": [ - "community", - "intro", + "quick-start", "sealos", - "configuration", + "intro", "docker", + "configuration", "faq", "signoz", "modelConfig", diff --git a/document/content/docs/introduction/development/openapi/chat.mdx b/document/content/docs/introduction/development/openapi/chat.mdx index d5077bcf7..866151de6 100644 --- a/document/content/docs/introduction/development/openapi/chat.mdx +++ b/document/content/docs/introduction/development/openapi/chat.mdx @@ -382,7 +382,7 @@ event取值: 对于用户选择,你只需要直接传递一个选择的结果给 messages 即可。 ```bash -curl --location --request POST 'https://localhost:3000/api/v1/chat/completions' \ +curl --location --request POST 'http://localhost:3000/api/v1/chat/completions' \ --header 'Authorization: Bearer fastgpt-xxx' \ --header 'Content-Type: application/json' \ --data-raw '{ @@ -404,7 +404,7 @@ curl --location --request POST 'https://localhost:3000/api/v1/chat/completions' 表单输入稍微麻烦一点,需要将输入的内容,以对象形式并序列化成字符串,作为`messages`的值。对象的 key 对应表单的 key,value 为用户输入的值。务必确保`chatId`是一致的。 ```bash -curl --location --request POST 'https://localhost:3000/api/v1/chat/completions' \ +curl --location --request POST 'http://localhost:3000/api/v1/chat/completions' \ --header 'Authorization: Bearer fastgpt-xxxx' \ --header 'Content-Type: application/json' \ --data-raw '{ @@ -847,7 +847,7 @@ curl --location --request DELETE 'http://localhost:3000/api/core/chat/clearHisto
-- appId - 应用 Id +- appId - 应用 Id - chatId - 历史记录 Id
diff --git a/document/content/docs/introduction/development/openapi/dataset.mdx b/document/content/docs/introduction/development/openapi/dataset.mdx index 9dd99acac..40a109dd5 100644 --- a/document/content/docs/introduction/development/openapi/dataset.mdx +++ b/document/content/docs/introduction/development/openapi/dataset.mdx @@ -939,7 +939,7 @@ curl --location --request POST 'http://localhost:3000/api/core/dataset/collectio ```bash -curl --location --request POST 'https://localhost:3000/api/core/dataset/data/pushData' \ +curl --location --request POST 'http://localhost:3000/api/core/dataset/data/pushData' \ --header 'Authorization: Bearer apikey' \ --header 'Content-Type: application/json' \ --data-raw '{ @@ -1242,7 +1242,7 @@ curl --location --request DELETE 'http://localhost:3000/api/core/dataset/data/de ```bash -curl --location --request POST 'https://localhost:3000/api/core/dataset/searchTest' \ +curl --location --request POST 'http://localhost:3000/api/core/dataset/searchTest' \ --header 'Authorization: Bearer fastgpt-xxxxx' \ --header 'Content-Type: application/json' \ --data-raw '{ diff --git a/document/content/docs/introduction/development/openapi/intro.mdx b/document/content/docs/introduction/development/openapi/intro.mdx index bdf1cd89b..86e4fc344 100644 --- a/document/content/docs/introduction/development/openapi/intro.mdx +++ b/document/content/docs/introduction/development/openapi/intro.mdx @@ -29,7 +29,7 @@ FastGPT 的 API Key **有 2 类**,一类是全局通用的 key (无法直接 OpenAPI 中,所有的接口都通过 Header.Authorization 进行鉴权。 ``` -baseUrl: "https://localhost:3000/api" +baseUrl: "http://localhost:3000/api" headers: { Authorization: "Bearer {{apikey}}" } @@ -38,7 +38,7 @@ headers: { **发起应用对话示例** ```sh -curl --location --request POST 'https://localhost:3000/api/v1/chat/completions' \ +curl --location --request POST 'http://localhost:3000/api/v1/chat/completions' \ --header 'Authorization: Bearer fastgpt-xxxxxx' \ --header 'Content-Type: application/json' \ --data-raw '{ @@ -59,7 +59,7 @@ curl --location --request POST 'https://localhost:3000/api/v1/chat/completions' `v4.8.13`后支持传入自定义的用户 ID, 并且存入历史记录中。 ```sh -curl --location --request POST 'https://localhost:3000/api/v1/chat/completions' \ +curl --location --request POST 'http://localhost:3000/api/v1/chat/completions' \ --header 'Authorization: Bearer fastgpt-xxxxxx' \ --header 'Content-Type: application/json' \ --data-raw '{ diff --git a/document/content/docs/introduction/development/quick-start.mdx b/document/content/docs/introduction/development/quick-start.mdx new file mode 100644 index 000000000..d90e3556c --- /dev/null +++ b/document/content/docs/introduction/development/quick-start.mdx @@ -0,0 +1,100 @@ +--- +title: 快速开始 +description: 一键启动 FastGPT,进行本地体验 +--- + +import { Alert } from '@/components/docs/Alert'; +import FastGPTLink from '@/components/docs/linkFastGPT'; + +## 本地 Docker 快速体验 + +快速体验将默认使用 PostgreSQL Vector 向量库。 + +### 1. 准备 Docker 环境 + + + + 参考:https://www.docker.com +```bash +# 安装 Docker +curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun +systemctl enable --now docker +# 安装 docker-compose +curl -L https://github.com/docker/compose/releases/download/v2.20.3/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose +chmod +x /usr/local/bin/docker-compose +# 验证安装 +docker -v +docker-compose -v +# 如失效,自行百度~ +``` + + +推荐直接使用 [Orbstack](https://orbstack.dev/)。可直接通过 Homebrew 来安装: + +```bash +brew install orbstack +``` + +或者直接[下载安装包](https://orbstack.dev/download)进行安装。 + + + +我们建议将源代码和其他数据绑定到 Linux 容器中时,将其存储在 Linux 文件系统中,而不是 Windows 文件系统中。 + +可以选择直接[使用 WSL 2 后端在 Windows 中安装 Docker Desktop](https://docs.docker.com/desktop/wsl/)。 + +也可以直接[在 WSL 2 中安装命令行版本的 Docker](https://nickjanetakis.com/blog/install-docker-in-wsl-2-without-docker-desktop)。 + + + + +### 2. 获取部署文件 + + + +根据您的网络环境选择: + +国内镜像(阿里云) +```bash +bash <(curl -fsSL https://doc.fastgpt.cn/deploy/install.sh) --region=cn --vector=pg +``` +非国内镜像(dockhub, ghcr) +```bash +bash <(curl -fsSL https://doc.fastgpt.cn/deploy/install.sh) --region=global --vector=pg +``` +上述脚本需要在 bash 环境下使用(Windows 用户请使用 Windows WSL,或者使用手动安装) + + +在你有权限的目录下创建一个目录,在目录内下载如下两个文件: + +根据您的网络环境选择下载: +- [国内镜像版本的 docker-compose.yml](https://doc.fastgpt.cn/deploy/docker/cn/docker-compose.pg.yml) +- [非国内镜像版本的 docker-compose.yml](https://doc.fastgpt.cn/deploy/docker/global/docker-compose.pg.yml) + +下载 config.json +- [config.json](https://doc.fastgpt.cn/deploy/config.json) + + + + +### 3. 启动 + +```bash +docker compose -f docker-compose.pg.yml up -d +``` + +等待服务启动,通过 http://localhost:3000 进行访问 +默认用户为 `root`,密码为 `1234` + +### Sealos 一键部署 +本地部署起不来?试试 [Sealos 一键部署](sealos)。 + +## 进阶使用 + +### 进行本地开发 + +如果要改代码或者给 FastGPT 贡献代码,请参考:[进行本地开发](intro) + +### 生产环境部署 + +如果要在生产环境进行部署,使用其他的向量库,配置相关的环境变量,请参考:[生产环境部署](docker) diff --git a/document/content/docs/introduction/index.mdx b/document/content/docs/introduction/index.mdx index 28e116ced..20b1a58b8 100644 --- a/document/content/docs/introduction/index.mdx +++ b/document/content/docs/introduction/index.mdx @@ -66,3 +66,17 @@ FastGPT 完全对齐 OpenAI 官方接口,支持一键接入企业微信、公 # 知识库核心流程图 ![](/imgs/intro/image8.png) + +--- + +FastGPT 是一个由用户和贡献者参与推动的开源项目,如果您对产品使用存在疑问和建议,可尝试以下方式寻求支持。我们的团队与社区会竭尽所能为您提供帮助。 + +- 📱 扫码加入飞书交流群👇 + + + +- 🐞 请将任何 FastGPT 的 Bug、问题和需求提交到 [GitHub Issue](https://github.com/labring/fastgpt/issues/new/choose)。 diff --git a/document/content/docs/toc.mdx b/document/content/docs/toc.mdx index a2c6e44f5..0aa88a977 100644 --- a/document/content/docs/toc.mdx +++ b/document/content/docs/toc.mdx @@ -12,7 +12,6 @@ description: FastGPT 文档目录 - [/docs/faq/points_consumption](/docs/faq/points_consumption) - [/docs/introduction/cloud](/docs/introduction/cloud) - [/docs/introduction/commercial](/docs/introduction/commercial) -- [/docs/introduction/development/community](/docs/introduction/development/community) - [/docs/introduction/development/configuration](/docs/introduction/development/configuration) - [/docs/introduction/development/custom-models/bge-rerank](/docs/introduction/development/custom-models/bge-rerank) - [/docs/introduction/development/custom-models/chatglm2](/docs/introduction/development/custom-models/chatglm2) @@ -42,6 +41,7 @@ description: FastGPT 文档目录 - [/docs/introduction/development/proxy/cloudflare](/docs/introduction/development/proxy/cloudflare) - [/docs/introduction/development/proxy/http_proxy](/docs/introduction/development/proxy/http_proxy) - [/docs/introduction/development/proxy/nginx](/docs/introduction/development/proxy/nginx) +- [/docs/introduction/development/quick-start](/docs/introduction/development/quick-start) - [/docs/introduction/development/sealos](/docs/introduction/development/sealos) - [/docs/introduction/development/signoz](/docs/introduction/development/signoz) - [/docs/introduction/guide/DialogBoxes/htmlRendering](/docs/introduction/guide/DialogBoxes/htmlRendering) diff --git a/document/content/docs/use-cases/external-integration/openapi.mdx b/document/content/docs/use-cases/external-integration/openapi.mdx index 9d210390b..c16535c83 100644 --- a/document/content/docs/use-cases/external-integration/openapi.mdx +++ b/document/content/docs/use-cases/external-integration/openapi.mdx @@ -24,7 +24,7 @@ import { Alert } from '@/components/docs/Alert'; ## 替换三方应用的变量 ```bash -OPENAI_API_BASE_URL: https://localhost:3000/api (改成自己部署的域名) +OPENAI_API_BASE_URL: http://localhost:3000/api (改成自己部署的域名) OPENAI_API_KEY = 上一步获取到的密钥 ``` diff --git a/document/data/doc-last-modified.json b/document/data/doc-last-modified.json index fd283f16b..05c0c8060 100644 --- a/document/data/doc-last-modified.json +++ b/document/data/doc-last-modified.json @@ -9,7 +9,6 @@ "document/content/docs/faq/points_consumption.mdx": "2025-08-02T19:38:37+08:00", "document/content/docs/introduction/cloud.mdx": "2025-08-02T19:38:37+08:00", "document/content/docs/introduction/commercial.mdx": "2025-09-21T23:09:46+08:00", - "document/content/docs/introduction/development/community.mdx": "2025-08-02T19:38:37+08:00", "document/content/docs/introduction/development/configuration.mdx": "2025-08-05T23:20:39+08:00", "document/content/docs/introduction/development/custom-models/bge-rerank.mdx": "2025-07-23T21:35:03+08:00", "document/content/docs/introduction/development/custom-models/chatglm2-m3e.mdx": "2025-08-05T23:20:39+08:00", @@ -21,9 +20,9 @@ "document/content/docs/introduction/development/custom-models/xinference.mdx": "2025-08-05T23:20:39+08:00", "document/content/docs/introduction/development/design/dataset.mdx": "2025-07-23T21:35:03+08:00", "document/content/docs/introduction/development/design/design_plugin.mdx": "2025-08-20T19:00:48+08:00", - "document/content/docs/introduction/development/docker.mdx": "2025-08-05T23:20:39+08:00", + "document/content/docs/introduction/development/docker.mdx": "2025-09-28T17:34:59+08:00", "document/content/docs/introduction/development/faq.mdx": "2025-08-12T22:22:18+08:00", - "document/content/docs/introduction/development/intro.mdx": "2025-08-05T23:20:39+08:00", + "document/content/docs/introduction/development/intro.mdx": "2025-09-28T17:34:59+08:00", "document/content/docs/introduction/development/migration/docker_db.mdx": "2025-07-23T21:35:03+08:00", "document/content/docs/introduction/development/migration/docker_mongo.mdx": "2025-07-23T21:35:03+08:00", "document/content/docs/introduction/development/modelConfig/ai-proxy.mdx": "2025-08-05T23:20:39+08:00", @@ -32,9 +31,9 @@ "document/content/docs/introduction/development/modelConfig/ppio.mdx": "2025-08-05T23:20:39+08:00", "document/content/docs/introduction/development/modelConfig/siliconCloud.mdx": "2025-08-05T23:20:39+08:00", "document/content/docs/introduction/development/openapi/app.mdx": "2025-09-26T13:18:51+08:00", - "document/content/docs/introduction/development/openapi/chat.mdx": "2025-08-14T18:54:47+08:00", - "document/content/docs/introduction/development/openapi/dataset.mdx": "2025-09-15T20:02:54+08:00", - "document/content/docs/introduction/development/openapi/intro.mdx": "2025-08-14T18:54:47+08:00", + "document/content/docs/introduction/development/openapi/chat.mdx": "2025-09-26T14:18:50+08:00", + "document/content/docs/introduction/development/openapi/dataset.mdx": "2025-09-26T14:18:50+08:00", + "document/content/docs/introduction/development/openapi/intro.mdx": "2025-09-26T14:18:50+08:00", "document/content/docs/introduction/development/openapi/share.mdx": "2025-08-05T23:20:39+08:00", "document/content/docs/introduction/development/proxy/cloudflare.mdx": "2025-07-23T21:35:03+08:00", "document/content/docs/introduction/development/proxy/http_proxy.mdx": "2025-07-23T21:35:03+08:00", @@ -112,7 +111,6 @@ "document/content/docs/upgrading/4-12/4123.mdx": "2025-09-07T20:55:14+08:00", "document/content/docs/upgrading/4-12/4124.mdx": "2025-09-17T22:29:56+08:00", "document/content/docs/upgrading/4-13/4130.mdx": "2025-09-26T13:32:15+08:00", - "document/content/docs/upgrading/4-13/4131.mdx": "2025-09-26T16:01:20+08:00", "document/content/docs/upgrading/4-8/40.mdx": "2025-08-02T19:38:37+08:00", "document/content/docs/upgrading/4-8/41.mdx": "2025-08-02T19:38:37+08:00", "document/content/docs/upgrading/4-8/42.mdx": "2025-08-02T19:38:37+08:00", @@ -191,7 +189,7 @@ "document/content/docs/use-cases/external-integration/dingtalk.mdx": "2025-07-23T21:35:03+08:00", "document/content/docs/use-cases/external-integration/feishu.mdx": "2025-07-24T14:23:04+08:00", "document/content/docs/use-cases/external-integration/official_account.mdx": "2025-08-05T23:20:39+08:00", - "document/content/docs/use-cases/external-integration/openapi.mdx": "2025-08-14T18:54:47+08:00", + "document/content/docs/use-cases/external-integration/openapi.mdx": "2025-09-26T14:18:50+08:00", "document/content/docs/use-cases/external-integration/wecom.mdx": "2025-09-16T14:22:28+08:00", "document/content/docs/use-cases/index.mdx": "2025-07-24T14:23:04+08:00" -} \ No newline at end of file +} diff --git a/document/public/deploy/config/config.json b/document/public/deploy/config/config.json new file mode 100644 index 000000000..5bfd98710 --- /dev/null +++ b/document/public/deploy/config/config.json @@ -0,0 +1,22 @@ +// 已使用 json5 进行解析,会自动去掉注释,无需手动去除 +{ + "feConfigs": { + "lafEnv": "https://laf.dev", // laf环境。 https://laf.run (杭州阿里云) ,或者私有化的laf环境。如果使用 Laf openapi 功能,需要最新版的 laf 。 + "mcpServerProxyEndpoint": "" // mcp server 代理地址,例如: http://localhost:3005 + }, + "systemEnv": { + "datasetParseMaxProcess": 10, // 知识库文件解析最大线程数量 + "vectorMaxProcess": 10, // 向量处理线程数量 + "qaMaxProcess": 10, // 问答拆分线程数量 + "vlmMaxProcess": 10, // 图片理解模型最大处理进程 + "tokenWorkers": 30, // Token 计算线程保持数,会持续占用内存,不能设置太大。 + "hnswEfSearch": 100, // 向量搜索参数,仅对 PG 和 OB 生效。越大,搜索越精确,但是速度越慢。设置为100,有99%+精度。 + "hnswMaxScanTuples": 100000, // 向量搜索最大扫描数据量,仅对 PG生效。 + "customPdfParse": { + "url": "", // 自定义 PDF 解析服务地址 + "key": "", // 自定义 PDF 解析服务密钥 + "doc2xKey": "", // doc2x 服务密钥 + "price": 0 // PDF 解析服务价格 + } + } +} diff --git a/document/public/deploy/docker/cn/docker-compose.milvus.yml b/document/public/deploy/docker/cn/docker-compose.milvus.yml new file mode 100644 index 000000000..de3234d3c --- /dev/null +++ b/document/public/deploy/docker/cn/docker-compose.milvus.yml @@ -0,0 +1,300 @@ +# 用于部署的 docker-compose 文件: +# - 向量库为 Pgvector +# - FastGPT 端口映射为 3000:3000 +# - FastGPT-mcp-server 端口映射 3005:3000 +# - 建议修改账密后再运行 + +# plugin auth token +x-plugin-auth-token: &x-plugin-auth-token token +# aiproxy token +x-aiproxy-token: &x-aiproxy-token token +# 数据库连接相关配置 +x-share-db-config: &x-share-db-config + MONGODB_URI: mongodb://username:password@mongo:27017/fastgpt?authSource=admin + DB_MAX_LINK: 30 + REDIS_URL: redis://default:mypassword@redis:6379 + S3_ENDPOINT: fastgpt-minio + S3_PORT: 9000 + S3_USE_SSL: false + S3_ACCESS_KEY: minioadmin + S3_SECRET_KEY: minioadmin + +# 向量库相关配置 +x-vec-config: &x-vec-config + MILVUS_ADDRESS: http://milvusStandalone:19530 + MILVUS_TOKEN: none + + +version: '3.3' +services: + # Vector DB + milvus-minio: + container_name: milvus-minio + image: minio/minio:RELEASE.2023-03-20T20-16-18Z + environment: + MINIO_ACCESS_KEY: minioadmin + MINIO_SECRET_KEY: minioadmin + networks: + - vector + volumes: + - ./milvus-minio:/minio_data + command: minio server /minio_data --console-address ":9001" + healthcheck: + test: ['CMD', 'curl', '-f', 'http://localhost:9000/minio/health/live'] + interval: 30s + timeout: 20s + retries: 3 + # milvus + milvus-etcd: + container_name: milvus-etcd + image: + image: quay.io/coreos/etcd:v3.5.5 + environment: + - ETCD_AUTO_COMPACTION_MODE=revision + - ETCD_AUTO_COMPACTION_RETENTION=1000 + - ETCD_QUOTA_BACKEND_BYTES=4294967296 + - ETCD_SNAPSHOT_COUNT=50000 + networks: + - vector + volumes: + - ./milvus/etcd:/etcd + command: etcd -advertise-client-urls=http://127.0.0.1:2379 -listen-client-urls http://0.0.0.0:2379 --data-dir /etcd + healthcheck: + test: ['CMD', 'etcdctl', 'endpoint', 'health'] + interval: 30s + timeout: 20s + retries: 3 + milvusStandalone: + container_name: milvusStandalone + image: milvusdb/milvus:v2.4.3 + command: ['milvus', 'run', 'standalone'] + security_opt: + - seccomp:unconfined + environment: + ETCD_ENDPOINTS: milvus-etcd:2379 + MINIO_ADDRESS: milvus-minio:9000 + networks: + - fastgpt + - vector + volumes: + - ./milvus/data:/var/lib/milvus + healthcheck: + test: ['CMD', 'curl', '-f', 'http://localhost:9091/healthz'] + interval: 30s + start_period: 90s + timeout: 20s + retries: 3 + depends_on: + - 'milvus-etcd' + - 'milvus-minio' + + + mongo: + image: registry.cn-hangzhou.aliyuncs.com/fastgpt/mongo:5.0.18 # cpu 不支持 AVX 时候使用 4.4.29 + 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: + container_name: fastgpt + image: registry.cn-hangzhou.aliyuncs.com/fastgpt/fastgpt:v4.13.0 # git + ports: + - 3000:3000 + networks: + - fastgpt + depends_on: + - mongo + - sandbox + - pg + restart: always + environment: + <<: [*x-share-db-config, *x-vec-config] + # 前端外部可访问的地址,用于自动补全文件资源路径。例如 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: *x-plugin-auth-token + # 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: *x-aiproxy-token + + # 数据库最大连接数 + 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 + + fastgpt-minio: + image: minio/minio:RELEASE.2025-09-07T16-13-09Z + container_name: fastgpt-minio + restart: always + networks: + - fastgpt + 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 + sandbox: + container_name: sandbox + image: registry.cn-hangzhou.aliyuncs.com/fastgpt/fastgpt-sandbox:v4.13.0 + networks: + - fastgpt + restart: always + fastgpt-mcp-server: + container_name: fastgpt-mcp-server + image: registry.cn-hangzhou.aliyuncs.com/fastgpt/fastgpt-mcp_server:v4.13.0 + networks: + - fastgpt + ports: + - 3005:3000 + restart: always + environment: + - FASTGPT_ENDPOINT=http://fastgpt:3000 + fastgpt-plugin: + image: registry.cn-hangzhou.aliyuncs.com/fastgpt/fastgpt-plugin:v0.2.0 + container_name: fastgpt-plugin + restart: always + networks: + - fastgpt + environment: + <<: *x-share-db-config + AUTH_TOKEN: *x-plugin-auth-token + S3_BUCKET: fastgpt-plugins + depends_on: + fastgpt-minio: + condition: service_healthy + # AI Proxy + aiproxy: + image: registry.cn-hangzhou.aliyuncs.com/labring/aiproxy:v0.3.2 + container_name: aiproxy + restart: unless-stopped + depends_on: + aiproxy_pg: + condition: service_healthy + networks: + - fastgpt + - aiproxy + environment: + # 对应 fastgpt 里的AIPROXY_API_TOKEN + ADMIN_KEY: *x-aiproxy-token + # 错误日志详情保存时间(小时) + 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: registry.cn-hangzhou.aliyuncs.com/fastgpt/pgvector:0.8.0-pg15 # docker hub + restart: unless-stopped + container_name: aiproxy_pg + volumes: + - ./aiproxy_pg:/var/lib/postgresql/data + networks: + - aiproxy + 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: + aiproxy: + vector: + diff --git a/document/public/deploy/docker/cn/docker-compose.oceanbase.yml b/document/public/deploy/docker/cn/docker-compose.oceanbase.yml new file mode 100644 index 000000000..3c0b89e89 --- /dev/null +++ b/document/public/deploy/docker/cn/docker-compose.oceanbase.yml @@ -0,0 +1,280 @@ +# 用于部署的 docker-compose 文件: +# - 向量库为 Pgvector +# - FastGPT 端口映射为 3000:3000 +# - FastGPT-mcp-server 端口映射 3005:3000 +# - 建议修改账密后再运行 + +# plugin auth token +x-plugin-auth-token: &x-plugin-auth-token token +# aiproxy token +x-aiproxy-token: &x-aiproxy-token token +# 数据库连接相关配置 +x-share-db-config: &x-share-db-config + MONGODB_URI: mongodb://username:password@mongo:27017/fastgpt?authSource=admin + DB_MAX_LINK: 30 + REDIS_URL: redis://default:mypassword@redis:6379 + S3_ENDPOINT: fastgpt-minio + S3_PORT: 9000 + S3_USE_SSL: false + S3_ACCESS_KEY: minioadmin + S3_SECRET_KEY: minioadmin + +# 向量库相关配置 +x-vec-config: &x-vec-config +undefined + +version: '3.3' +services: + # Vector DB + ob: + image: oceanbase/oceanbase-ce:4.3.5-lts + container_name: ob + restart: always + # ports: # 生产环境建议不要暴露 + # - 2881:2881 + networks: + - fastgpt + environment: + # 这里的配置只有首次运行生效。修改后,重启镜像是不会生效的。需要把持久化数据删除再重启,才有效果 + - OB_SYS_PASSWORD=obsyspassword + # 不同于传统数据库,OceanBase 数据库的账号包含更多字段,包括用户名、租户名和集群名。经典格式为"用户名@租户名#集群名" + # 比如用mysql客户端连接时,根据本文件的默认配置,应该指定 "-uroot@tenantname" + - OB_TENANT_NAME=tenantname + - OB_TENANT_PASSWORD=tenantpassword + # MODE分为MINI和NORMAL, 后者会最大程度使用主机资源 + - MODE=MINI + - OB_SERVER_IP=127.0.0.1 + # 更多环境变量配置见oceanbase官方文档: https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000002013494 + volumes: + - ../ob/data:/root/ob + - ../ob/config:/root/.obd/cluster + configs: + - source: init_sql + target: /root/boot/init.d/init.sql + healthcheck: + # obclient -h127.0.0.1 -P2881 -uroot@tenantname -ptenantpassword -e "SELECT 1;" + test: + [ + "CMD-SHELL", + 'obclient -h$${OB_SERVER_IP} -P2881 -uroot@$${OB_TENANT_NAME} -p$${OB_TENANT_PASSWORD} -e "SELECT 1;"', + ] + interval: 30s + timeout: 10s + retries: 1000 + start_period: 10s + + + mongo: + image: registry.cn-hangzhou.aliyuncs.com/fastgpt/mongo:5.0.18 # cpu 不支持 AVX 时候使用 4.4.29 + 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: + container_name: fastgpt + image: registry.cn-hangzhou.aliyuncs.com/fastgpt/fastgpt:v4.13.0 # git + ports: + - 3000:3000 + networks: + - fastgpt + depends_on: + - mongo + - sandbox + - pg + restart: always + environment: + <<: [*x-share-db-config, *x-vec-config] + # 前端外部可访问的地址,用于自动补全文件资源路径。例如 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: *x-plugin-auth-token + # 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: *x-aiproxy-token + + # 数据库最大连接数 + 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 + + fastgpt-minio: + image: minio/minio:RELEASE.2025-09-07T16-13-09Z + container_name: fastgpt-minio + restart: always + networks: + - fastgpt + 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 + sandbox: + container_name: sandbox + image: registry.cn-hangzhou.aliyuncs.com/fastgpt/fastgpt-sandbox:v4.13.0 + networks: + - fastgpt + restart: always + fastgpt-mcp-server: + container_name: fastgpt-mcp-server + image: registry.cn-hangzhou.aliyuncs.com/fastgpt/fastgpt-mcp_server:v4.13.0 + networks: + - fastgpt + ports: + - 3005:3000 + restart: always + environment: + - FASTGPT_ENDPOINT=http://fastgpt:3000 + fastgpt-plugin: + image: registry.cn-hangzhou.aliyuncs.com/fastgpt/fastgpt-plugin:v0.2.0 + container_name: fastgpt-plugin + restart: always + networks: + - fastgpt + environment: + <<: *x-share-db-config + AUTH_TOKEN: *x-plugin-auth-token + S3_BUCKET: fastgpt-plugins + depends_on: + fastgpt-minio: + condition: service_healthy + # AI Proxy + aiproxy: + image: registry.cn-hangzhou.aliyuncs.com/labring/aiproxy:v0.3.2 + container_name: aiproxy + restart: unless-stopped + depends_on: + aiproxy_pg: + condition: service_healthy + networks: + - fastgpt + - aiproxy + environment: + # 对应 fastgpt 里的AIPROXY_API_TOKEN + ADMIN_KEY: *x-aiproxy-token + # 错误日志详情保存时间(小时) + 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: registry.cn-hangzhou.aliyuncs.com/fastgpt/pgvector:0.8.0-pg15 # docker hub + restart: unless-stopped + container_name: aiproxy_pg + volumes: + - ./aiproxy_pg:/var/lib/postgresql/data + networks: + - aiproxy + 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: + aiproxy: + vector: +configs: + init_sql: + name: init_sql + content: | + ALTER SYSTEM SET ob_vector_memory_limit_percentage = 30; + diff --git a/document/public/deploy/docker/cn/docker-compose.pg.yml b/document/public/deploy/docker/cn/docker-compose.pg.yml new file mode 100644 index 000000000..62fe58e75 --- /dev/null +++ b/document/public/deploy/docker/cn/docker-compose.pg.yml @@ -0,0 +1,257 @@ +# 用于部署的 docker-compose 文件: +# - 向量库为 Pgvector +# - FastGPT 端口映射为 3000:3000 +# - FastGPT-mcp-server 端口映射 3005:3000 +# - 建议修改账密后再运行 + +# plugin auth token +x-plugin-auth-token: &x-plugin-auth-token token +# aiproxy token +x-aiproxy-token: &x-aiproxy-token token +# 数据库连接相关配置 +x-share-db-config: &x-share-db-config + MONGODB_URI: mongodb://username:password@mongo:27017/fastgpt?authSource=admin + DB_MAX_LINK: 30 + REDIS_URL: redis://default:mypassword@redis:6379 + S3_ENDPOINT: fastgpt-minio + S3_PORT: 9000 + S3_USE_SSL: false + S3_ACCESS_KEY: minioadmin + S3_SECRET_KEY: minioadmin + +# 向量库相关配置 +x-vec-config: &x-vec-config + PG_URL: postgresql://username:password@pg:5432/postgres + +version: '3.3' +services: + # Vector DB + pg: + image: registry.cn-hangzhou.aliyuncs.com/fastgpt/pgvector:0.8.0-pg15 + container_name: pg + restart: always + 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 + + + mongo: + image: registry.cn-hangzhou.aliyuncs.com/fastgpt/mongo:5.0.18 # cpu 不支持 AVX 时候使用 4.4.29 + 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: + container_name: fastgpt + image: registry.cn-hangzhou.aliyuncs.com/fastgpt/fastgpt:v4.13.0 # git + ports: + - 3000:3000 + networks: + - fastgpt + depends_on: + - mongo + - sandbox + - pg + restart: always + environment: + <<: [*x-share-db-config, *x-vec-config] + # 前端外部可访问的地址,用于自动补全文件资源路径。例如 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: *x-plugin-auth-token + # 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: *x-aiproxy-token + + # 数据库最大连接数 + 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 + + fastgpt-minio: + image: minio/minio:RELEASE.2025-09-07T16-13-09Z + container_name: fastgpt-minio + restart: always + networks: + - fastgpt + 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 + sandbox: + container_name: sandbox + image: registry.cn-hangzhou.aliyuncs.com/fastgpt/fastgpt-sandbox:v4.13.0 + networks: + - fastgpt + restart: always + fastgpt-mcp-server: + container_name: fastgpt-mcp-server + image: registry.cn-hangzhou.aliyuncs.com/fastgpt/fastgpt-mcp_server:v4.13.0 + networks: + - fastgpt + ports: + - 3005:3000 + restart: always + environment: + - FASTGPT_ENDPOINT=http://fastgpt:3000 + fastgpt-plugin: + image: registry.cn-hangzhou.aliyuncs.com/fastgpt/fastgpt-plugin:v0.2.0 + container_name: fastgpt-plugin + restart: always + networks: + - fastgpt + environment: + <<: *x-share-db-config + AUTH_TOKEN: *x-plugin-auth-token + S3_BUCKET: fastgpt-plugins + depends_on: + fastgpt-minio: + condition: service_healthy + # AI Proxy + aiproxy: + image: registry.cn-hangzhou.aliyuncs.com/labring/aiproxy:v0.3.2 + container_name: aiproxy + restart: unless-stopped + depends_on: + aiproxy_pg: + condition: service_healthy + networks: + - fastgpt + - aiproxy + environment: + # 对应 fastgpt 里的AIPROXY_API_TOKEN + ADMIN_KEY: *x-aiproxy-token + # 错误日志详情保存时间(小时) + 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: registry.cn-hangzhou.aliyuncs.com/fastgpt/pgvector:0.8.0-pg15 # docker hub + restart: unless-stopped + container_name: aiproxy_pg + volumes: + - ./aiproxy_pg:/var/lib/postgresql/data + networks: + - aiproxy + 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: + aiproxy: + vector: + diff --git a/document/public/deploy/docker/cn/docker-compose.zilliz.yml b/document/public/deploy/docker/cn/docker-compose.zilliz.yml new file mode 100644 index 000000000..c9798ed9f --- /dev/null +++ b/document/public/deploy/docker/cn/docker-compose.zilliz.yml @@ -0,0 +1,240 @@ +# 用于部署的 docker-compose 文件: +# - 向量库为 Pgvector +# - FastGPT 端口映射为 3000:3000 +# - FastGPT-mcp-server 端口映射 3005:3000 +# - 建议修改账密后再运行 + +# plugin auth token +x-plugin-auth-token: &x-plugin-auth-token token +# aiproxy token +x-aiproxy-token: &x-aiproxy-token token +# 数据库连接相关配置 +x-share-db-config: &x-share-db-config + MONGODB_URI: mongodb://username:password@mongo:27017/fastgpt?authSource=admin + DB_MAX_LINK: 30 + REDIS_URL: redis://default:mypassword@redis:6379 + S3_ENDPOINT: fastgpt-minio + S3_PORT: 9000 + S3_USE_SSL: false + S3_ACCESS_KEY: minioadmin + S3_SECRET_KEY: minioadmin + +# 向量库相关配置 +x-vec-config: &x-vec-config + MILVUS_ADDRESS: zilliz_cloud_address + MILVUS_TOKEN: zilliz_cloud_token + +version: '3.3' +services: + # Vector DB + + + mongo: + image: registry.cn-hangzhou.aliyuncs.com/fastgpt/mongo:5.0.18 # cpu 不支持 AVX 时候使用 4.4.29 + 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: + container_name: fastgpt + image: registry.cn-hangzhou.aliyuncs.com/fastgpt/fastgpt:v4.13.0 # git + ports: + - 3000:3000 + networks: + - fastgpt + depends_on: + - mongo + - sandbox + - pg + restart: always + environment: + <<: [*x-share-db-config, *x-vec-config] + # 前端外部可访问的地址,用于自动补全文件资源路径。例如 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: *x-plugin-auth-token + # 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: *x-aiproxy-token + + # 数据库最大连接数 + 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 + + fastgpt-minio: + image: minio/minio:RELEASE.2025-09-07T16-13-09Z + container_name: fastgpt-minio + restart: always + networks: + - fastgpt + 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 + sandbox: + container_name: sandbox + image: registry.cn-hangzhou.aliyuncs.com/fastgpt/fastgpt-sandbox:v4.13.0 + networks: + - fastgpt + restart: always + fastgpt-mcp-server: + container_name: fastgpt-mcp-server + image: registry.cn-hangzhou.aliyuncs.com/fastgpt/fastgpt-mcp_server:v4.13.0 + networks: + - fastgpt + ports: + - 3005:3000 + restart: always + environment: + - FASTGPT_ENDPOINT=http://fastgpt:3000 + fastgpt-plugin: + image: registry.cn-hangzhou.aliyuncs.com/fastgpt/fastgpt-plugin:v0.2.0 + container_name: fastgpt-plugin + restart: always + networks: + - fastgpt + environment: + <<: *x-share-db-config + AUTH_TOKEN: *x-plugin-auth-token + S3_BUCKET: fastgpt-plugins + depends_on: + fastgpt-minio: + condition: service_healthy + # AI Proxy + aiproxy: + image: registry.cn-hangzhou.aliyuncs.com/labring/aiproxy:v0.3.2 + container_name: aiproxy + restart: unless-stopped + depends_on: + aiproxy_pg: + condition: service_healthy + networks: + - fastgpt + - aiproxy + environment: + # 对应 fastgpt 里的AIPROXY_API_TOKEN + ADMIN_KEY: *x-aiproxy-token + # 错误日志详情保存时间(小时) + 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: registry.cn-hangzhou.aliyuncs.com/fastgpt/pgvector:0.8.0-pg15 # docker hub + restart: unless-stopped + container_name: aiproxy_pg + volumes: + - ./aiproxy_pg:/var/lib/postgresql/data + networks: + - aiproxy + 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: + aiproxy: + vector: + diff --git a/document/public/deploy/docker/global/docker-compose.milvus.yml b/document/public/deploy/docker/global/docker-compose.milvus.yml new file mode 100644 index 000000000..de06bce03 --- /dev/null +++ b/document/public/deploy/docker/global/docker-compose.milvus.yml @@ -0,0 +1,300 @@ +# 用于部署的 docker-compose 文件: +# - 向量库为 Pgvector +# - FastGPT 端口映射为 3000:3000 +# - FastGPT-mcp-server 端口映射 3005:3000 +# - 建议修改账密后再运行 + +# plugin auth token +x-plugin-auth-token: &x-plugin-auth-token token +# aiproxy token +x-aiproxy-token: &x-aiproxy-token token +# 数据库连接相关配置 +x-share-db-config: &x-share-db-config + MONGODB_URI: mongodb://username:password@mongo:27017/fastgpt?authSource=admin + DB_MAX_LINK: 30 + REDIS_URL: redis://default:mypassword@redis:6379 + S3_ENDPOINT: fastgpt-minio + S3_PORT: 9000 + S3_USE_SSL: false + S3_ACCESS_KEY: minioadmin + S3_SECRET_KEY: minioadmin + +# 向量库相关配置 +x-vec-config: &x-vec-config + MILVUS_ADDRESS: http://milvusStandalone:19530 + MILVUS_TOKEN: none + + +version: '3.3' +services: + # Vector DB + milvus-minio: + container_name: milvus-minio + image: minio/minio:RELEASE.2023-03-20T20-16-18Z + environment: + MINIO_ACCESS_KEY: minioadmin + MINIO_SECRET_KEY: minioadmin + networks: + - vector + volumes: + - ./milvus-minio:/minio_data + command: minio server /minio_data --console-address ":9001" + healthcheck: + test: ['CMD', 'curl', '-f', 'http://localhost:9000/minio/health/live'] + interval: 30s + timeout: 20s + retries: 3 + # milvus + milvus-etcd: + container_name: milvus-etcd + image: + image: quay.io/coreos/etcd:v3.5.5 + environment: + - ETCD_AUTO_COMPACTION_MODE=revision + - ETCD_AUTO_COMPACTION_RETENTION=1000 + - ETCD_QUOTA_BACKEND_BYTES=4294967296 + - ETCD_SNAPSHOT_COUNT=50000 + networks: + - vector + volumes: + - ./milvus/etcd:/etcd + command: etcd -advertise-client-urls=http://127.0.0.1:2379 -listen-client-urls http://0.0.0.0:2379 --data-dir /etcd + healthcheck: + test: ['CMD', 'etcdctl', 'endpoint', 'health'] + interval: 30s + timeout: 20s + retries: 3 + milvusStandalone: + container_name: milvusStandalone + image: milvusdb/milvus:v2.4.3 + command: ['milvus', 'run', 'standalone'] + security_opt: + - seccomp:unconfined + environment: + ETCD_ENDPOINTS: milvus-etcd:2379 + MINIO_ADDRESS: milvus-minio:9000 + networks: + - fastgpt + - vector + volumes: + - ./milvus/data:/var/lib/milvus + healthcheck: + test: ['CMD', 'curl', '-f', 'http://localhost:9091/healthz'] + interval: 30s + start_period: 90s + timeout: 20s + retries: 3 + depends_on: + - 'milvus-etcd' + - 'milvus-minio' + + + mongo: + image: mongo:5.0.18 # cpu 不支持 AVX 时候使用 4.4.29 + 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: + container_name: fastgpt + image: ghcr.io/labring/fastgpt:v4.13.0 # git + ports: + - 3000:3000 + networks: + - fastgpt + depends_on: + - mongo + - sandbox + - pg + restart: always + environment: + <<: [*x-share-db-config, *x-vec-config] + # 前端外部可访问的地址,用于自动补全文件资源路径。例如 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: *x-plugin-auth-token + # 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: *x-aiproxy-token + + # 数据库最大连接数 + 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 + + fastgpt-minio: + image: minio/minio:RELEASE.2025-09-07T16-13-09Z + container_name: fastgpt-minio + restart: always + networks: + - fastgpt + 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 + sandbox: + container_name: sandbox + image: ghcr.io/labring/fastgpt-sandbox:v4.13.0 + networks: + - fastgpt + restart: always + fastgpt-mcp-server: + container_name: fastgpt-mcp-server + image: ghcr.io/labring/fastgpt-mcp_server:v4.13.0 + networks: + - fastgpt + ports: + - 3005:3000 + restart: always + environment: + - FASTGPT_ENDPOINT=http://fastgpt:3000 + fastgpt-plugin: + image: ghcr.io/labring/fastgpt-plugin:v0.2.0 + container_name: fastgpt-plugin + restart: always + networks: + - fastgpt + environment: + <<: *x-share-db-config + AUTH_TOKEN: *x-plugin-auth-token + S3_BUCKET: fastgpt-plugins + depends_on: + fastgpt-minio: + condition: service_healthy + # AI Proxy + aiproxy: + image: ghcr.io/labring/aiproxy:v0.3.2 + container_name: aiproxy + restart: unless-stopped + depends_on: + aiproxy_pg: + condition: service_healthy + networks: + - fastgpt + - aiproxy + environment: + # 对应 fastgpt 里的AIPROXY_API_TOKEN + ADMIN_KEY: *x-aiproxy-token + # 错误日志详情保存时间(小时) + 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 + restart: unless-stopped + container_name: aiproxy_pg + volumes: + - ./aiproxy_pg:/var/lib/postgresql/data + networks: + - aiproxy + 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: + aiproxy: + vector: + diff --git a/document/public/deploy/docker/global/docker-compose.oceanbase.yml b/document/public/deploy/docker/global/docker-compose.oceanbase.yml new file mode 100644 index 000000000..d9da84d9f --- /dev/null +++ b/document/public/deploy/docker/global/docker-compose.oceanbase.yml @@ -0,0 +1,280 @@ +# 用于部署的 docker-compose 文件: +# - 向量库为 Pgvector +# - FastGPT 端口映射为 3000:3000 +# - FastGPT-mcp-server 端口映射 3005:3000 +# - 建议修改账密后再运行 + +# plugin auth token +x-plugin-auth-token: &x-plugin-auth-token token +# aiproxy token +x-aiproxy-token: &x-aiproxy-token token +# 数据库连接相关配置 +x-share-db-config: &x-share-db-config + MONGODB_URI: mongodb://username:password@mongo:27017/fastgpt?authSource=admin + DB_MAX_LINK: 30 + REDIS_URL: redis://default:mypassword@redis:6379 + S3_ENDPOINT: fastgpt-minio + S3_PORT: 9000 + S3_USE_SSL: false + S3_ACCESS_KEY: minioadmin + S3_SECRET_KEY: minioadmin + +# 向量库相关配置 +x-vec-config: &x-vec-config +undefined + +version: '3.3' +services: + # Vector DB + ob: + image: oceanbase/oceanbase-ce:4.3.5-lts + container_name: ob + restart: always + # ports: # 生产环境建议不要暴露 + # - 2881:2881 + networks: + - fastgpt + environment: + # 这里的配置只有首次运行生效。修改后,重启镜像是不会生效的。需要把持久化数据删除再重启,才有效果 + - OB_SYS_PASSWORD=obsyspassword + # 不同于传统数据库,OceanBase 数据库的账号包含更多字段,包括用户名、租户名和集群名。经典格式为"用户名@租户名#集群名" + # 比如用mysql客户端连接时,根据本文件的默认配置,应该指定 "-uroot@tenantname" + - OB_TENANT_NAME=tenantname + - OB_TENANT_PASSWORD=tenantpassword + # MODE分为MINI和NORMAL, 后者会最大程度使用主机资源 + - MODE=MINI + - OB_SERVER_IP=127.0.0.1 + # 更多环境变量配置见oceanbase官方文档: https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000002013494 + volumes: + - ../ob/data:/root/ob + - ../ob/config:/root/.obd/cluster + configs: + - source: init_sql + target: /root/boot/init.d/init.sql + healthcheck: + # obclient -h127.0.0.1 -P2881 -uroot@tenantname -ptenantpassword -e "SELECT 1;" + test: + [ + "CMD-SHELL", + 'obclient -h$${OB_SERVER_IP} -P2881 -uroot@$${OB_TENANT_NAME} -p$${OB_TENANT_PASSWORD} -e "SELECT 1;"', + ] + interval: 30s + timeout: 10s + retries: 1000 + start_period: 10s + + + mongo: + image: mongo:5.0.18 # cpu 不支持 AVX 时候使用 4.4.29 + 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: + container_name: fastgpt + image: ghcr.io/labring/fastgpt:v4.13.0 # git + ports: + - 3000:3000 + networks: + - fastgpt + depends_on: + - mongo + - sandbox + - pg + restart: always + environment: + <<: [*x-share-db-config, *x-vec-config] + # 前端外部可访问的地址,用于自动补全文件资源路径。例如 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: *x-plugin-auth-token + # 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: *x-aiproxy-token + + # 数据库最大连接数 + 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 + + fastgpt-minio: + image: minio/minio:RELEASE.2025-09-07T16-13-09Z + container_name: fastgpt-minio + restart: always + networks: + - fastgpt + 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 + sandbox: + container_name: sandbox + image: ghcr.io/labring/fastgpt-sandbox:v4.13.0 + networks: + - fastgpt + restart: always + fastgpt-mcp-server: + container_name: fastgpt-mcp-server + image: ghcr.io/labring/fastgpt-mcp_server:v4.13.0 + networks: + - fastgpt + ports: + - 3005:3000 + restart: always + environment: + - FASTGPT_ENDPOINT=http://fastgpt:3000 + fastgpt-plugin: + image: ghcr.io/labring/fastgpt-plugin:v0.2.0 + container_name: fastgpt-plugin + restart: always + networks: + - fastgpt + environment: + <<: *x-share-db-config + AUTH_TOKEN: *x-plugin-auth-token + S3_BUCKET: fastgpt-plugins + depends_on: + fastgpt-minio: + condition: service_healthy + # AI Proxy + aiproxy: + image: ghcr.io/labring/aiproxy:v0.3.2 + container_name: aiproxy + restart: unless-stopped + depends_on: + aiproxy_pg: + condition: service_healthy + networks: + - fastgpt + - aiproxy + environment: + # 对应 fastgpt 里的AIPROXY_API_TOKEN + ADMIN_KEY: *x-aiproxy-token + # 错误日志详情保存时间(小时) + 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 + restart: unless-stopped + container_name: aiproxy_pg + volumes: + - ./aiproxy_pg:/var/lib/postgresql/data + networks: + - aiproxy + 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: + aiproxy: + vector: +configs: + init_sql: + name: init_sql + content: | + ALTER SYSTEM SET ob_vector_memory_limit_percentage = 30; + diff --git a/deploy/docker/docker-compose-zilliz.yml b/document/public/deploy/docker/global/docker-compose.pg.yml similarity index 60% rename from deploy/docker/docker-compose-zilliz.yml rename to document/public/deploy/docker/global/docker-compose.pg.yml index 2d0c4662d..f82d675fb 100644 --- a/deploy/docker/docker-compose-zilliz.yml +++ b/document/public/deploy/docker/global/docker-compose.pg.yml @@ -1,18 +1,53 @@ -# 数据库的默认账号和密码仅首次运行时设置有效 -# 如果修改了账号密码,记得改数据库和项目连接参数,别只改一处~ -# 该配置文件只是给快速启动,测试使用。正式使用,记得务必修改账号密码,以及调整合适的知识库参数,共享内存等。 -# 如何无法访问 dockerhub 和 git,可以用阿里云(阿里云没有arm包) +# 用于部署的 docker-compose 文件: +# - 向量库为 Pgvector +# - FastGPT 端口映射为 3000:3000 +# - FastGPT-mcp-server 端口映射 3005:3000 +# - 建议修改账密后再运行 + +# plugin auth token +x-plugin-auth-token: &x-plugin-auth-token token +# aiproxy token +x-aiproxy-token: &x-aiproxy-token token +# 数据库连接相关配置 +x-share-db-config: &x-share-db-config + MONGODB_URI: mongodb://username:password@mongo:27017/fastgpt?authSource=admin + DB_MAX_LINK: 30 + REDIS_URL: redis://default:mypassword@redis:6379 + S3_ENDPOINT: fastgpt-minio + S3_PORT: 9000 + S3_USE_SSL: false + S3_ACCESS_KEY: minioadmin + S3_SECRET_KEY: minioadmin + +# 向量库相关配置 +x-vec-config: &x-vec-config + PG_URL: postgresql://username:password@pg:5432/postgres version: '3.3' services: # Vector DB - + pg: + image: pgvector/pgvector:0.8.0-pg15 + container_name: pg + restart: always + 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时候使用 + image: mongo:5.0.18 # cpu 不支持 AVX 时候使用 4.4.29 container_name: mongo restart: always networks: @@ -69,15 +104,65 @@ services: start_period: 30s volumes: - ./redis/data:/data + + fastgpt: + container_name: fastgpt + image: ghcr.io/labring/fastgpt:v4.13.0 # git + ports: + - 3000:3000 + networks: + - fastgpt + depends_on: + - mongo + - sandbox + - pg + restart: always + environment: + <<: [*x-share-db-config, *x-vec-config] + # 前端外部可访问的地址,用于自动补全文件资源路径。例如 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: *x-plugin-auth-token + # 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: *x-aiproxy-token + + # 数据库最大连接数 + 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 + fastgpt-minio: - image: minio/minio:latest + image: minio/minio:RELEASE.2025-09-07T16-13-09Z 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) - - '9000:9000' - - '9001:9001' environment: - MINIO_ROOT_USER=minioadmin - MINIO_ROOT_PASSWORD=minioadmin @@ -89,113 +174,38 @@ services: interval: 30s timeout: 20s retries: 3 - - fastgpt: - container_name: fastgpt - image: ghcr.io/labring/fastgpt:v4.12.4 # git - # image: registry.cn-hangzhou.aliyuncs.com/fastgpt/fastgpt:v4.12.4 # 阿里云 - ports: - - 3000:3000 - networks: - - fastgpt - depends_on: - - mongo - - sandbox - - 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 - # 向量库 连接参数 - # zilliz 连接参数 - - MILVUS_ADDRESS=zilliz_cloud_address - - MILVUS_TOKEN=zilliz_cloud_token - - # 日志等级: 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.4 # git - # image: registry.cn-hangzhou.aliyuncs.com/fastgpt/fastgpt-sandbox:v4.12.4 # 阿里云 + image: ghcr.io/labring/fastgpt-sandbox:v4.13.0 networks: - fastgpt restart: always fastgpt-mcp-server: container_name: fastgpt-mcp-server - image: ghcr.io/labring/fastgpt-mcp_server:v4.12.4 # git - # image: registry.cn-hangzhou.aliyuncs.com/fastgpt/fastgpt-mcp_server:v4.12.4 # 阿里云 - ports: - - 3005:3000 + image: ghcr.io/labring/fastgpt-mcp_server:v4.13.0 networks: - fastgpt + ports: + - 3005:3000 restart: always environment: - FASTGPT_ENDPOINT=http://fastgpt:3000 fastgpt-plugin: - image: ghcr.io/labring/fastgpt-plugin:v0.1.13 # git - # image: registry.cn-hangzhou.aliyuncs.com/fastgpt/fastgpt-plugin:v0.1.13 # 阿里云 + image: ghcr.io/labring/fastgpt-plugin:v0.2.0 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 + <<: *x-share-db-config + AUTH_TOKEN: *x-plugin-auth-token + S3_BUCKET: fastgpt-plugins depends_on: fastgpt-minio: condition: service_healthy - # AI Proxy aiproxy: image: ghcr.io/labring/aiproxy:v0.3.2 - # image: registry.cn-hangzhou.aliyuncs.com/labring/aiproxy:v0.3.2 # 阿里云 container_name: aiproxy restart: unless-stopped depends_on: @@ -203,19 +213,20 @@ services: condition: service_healthy networks: - fastgpt + - aiproxy environment: # 对应 fastgpt 里的AIPROXY_API_TOKEN - - ADMIN_KEY=aiproxy + ADMIN_KEY: *x-aiproxy-token # 错误日志详情保存时间(小时) - - LOG_DETAIL_STORAGE_HOURS=1 + LOG_DETAIL_STORAGE_HOURS: 1 # 数据库连接地址 - - SQL_DSN=postgres://postgres:aiproxy@aiproxy_pg:5432/aiproxy + SQL_DSN: postgres://postgres:aiproxy@aiproxy_pg:5432/aiproxy # 最大重试次数 - - RETRY_TIMES=3 + RETRY_TIMES: 3 # 不需要计费 - - BILLING_ENABLED=false + BILLING_ENABLED: false # 不需要严格检测模型 - - DISABLE_MODEL_CONFIG=true + DISABLE_MODEL_CONFIG: true healthcheck: test: ['CMD', 'curl', '-f', 'http://localhost:3000/api/status'] interval: 5s @@ -223,13 +234,12 @@ services: 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 + - aiproxy environment: TZ: Asia/Shanghai POSTGRES_USER: postgres @@ -242,3 +252,6 @@ services: retries: 10 networks: fastgpt: + aiproxy: + vector: + diff --git a/document/public/deploy/docker/global/docker-compose.ziliiz.yml b/document/public/deploy/docker/global/docker-compose.ziliiz.yml new file mode 100644 index 000000000..f6717a9cf --- /dev/null +++ b/document/public/deploy/docker/global/docker-compose.ziliiz.yml @@ -0,0 +1,240 @@ +# 用于部署的 docker-compose 文件: +# - 向量库为 Pgvector +# - FastGPT 端口映射为 3000:3000 +# - FastGPT-mcp-server 端口映射 3005:3000 +# - 建议修改账密后再运行 + +# plugin auth token +x-plugin-auth-token: &x-plugin-auth-token token +# aiproxy token +x-aiproxy-token: &x-aiproxy-token token +# 数据库连接相关配置 +x-share-db-config: &x-share-db-config + MONGODB_URI: mongodb://username:password@mongo:27017/fastgpt?authSource=admin + DB_MAX_LINK: 30 + REDIS_URL: redis://default:mypassword@redis:6379 + S3_ENDPOINT: fastgpt-minio + S3_PORT: 9000 + S3_USE_SSL: false + S3_ACCESS_KEY: minioadmin + S3_SECRET_KEY: minioadmin + +# 向量库相关配置 +x-vec-config: &x-vec-config + MILVUS_ADDRESS: zilliz_cloud_address + MILVUS_TOKEN: zilliz_cloud_token + +version: '3.3' +services: + # Vector DB + + + mongo: + image: mongo:5.0.18 # cpu 不支持 AVX 时候使用 4.4.29 + 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: + container_name: fastgpt + image: ghcr.io/labring/fastgpt:v4.13.0 # git + ports: + - 3000:3000 + networks: + - fastgpt + depends_on: + - mongo + - sandbox + - pg + restart: always + environment: + <<: [*x-share-db-config, *x-vec-config] + # 前端外部可访问的地址,用于自动补全文件资源路径。例如 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: *x-plugin-auth-token + # 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: *x-aiproxy-token + + # 数据库最大连接数 + 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 + + fastgpt-minio: + image: minio/minio:RELEASE.2025-09-07T16-13-09Z + container_name: fastgpt-minio + restart: always + networks: + - fastgpt + 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 + sandbox: + container_name: sandbox + image: ghcr.io/labring/fastgpt-sandbox:v4.13.0 + networks: + - fastgpt + restart: always + fastgpt-mcp-server: + container_name: fastgpt-mcp-server + image: ghcr.io/labring/fastgpt-mcp_server:v4.13.0 + networks: + - fastgpt + ports: + - 3005:3000 + restart: always + environment: + - FASTGPT_ENDPOINT=http://fastgpt:3000 + fastgpt-plugin: + image: ghcr.io/labring/fastgpt-plugin:v0.2.0 + container_name: fastgpt-plugin + restart: always + networks: + - fastgpt + environment: + <<: *x-share-db-config + AUTH_TOKEN: *x-plugin-auth-token + S3_BUCKET: fastgpt-plugins + depends_on: + fastgpt-minio: + condition: service_healthy + # AI Proxy + aiproxy: + image: ghcr.io/labring/aiproxy:v0.3.2 + container_name: aiproxy + restart: unless-stopped + depends_on: + aiproxy_pg: + condition: service_healthy + networks: + - fastgpt + - aiproxy + environment: + # 对应 fastgpt 里的AIPROXY_API_TOKEN + ADMIN_KEY: *x-aiproxy-token + # 错误日志详情保存时间(小时) + 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 + restart: unless-stopped + container_name: aiproxy_pg + volumes: + - ./aiproxy_pg:/var/lib/postgresql/data + networks: + - aiproxy + 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: + aiproxy: + vector: + diff --git a/document/public/deploy/install.sh b/document/public/deploy/install.sh new file mode 100644 index 000000000..5f2769540 --- /dev/null +++ b/document/public/deploy/install.sh @@ -0,0 +1,107 @@ +#!/usr/bin/env bash +# +# param: +# --region=cn 中国大陆 +# --region=global 全球(默认) +# --vector=pg pg 版本(默认) +# --vector=milvus milvus 版本 +# --vector=zilliz zilliz 版本 +# --vector=oceanbase oceanbase 版本 + +# 默认参数 +REGION="global" +VECTOR="pg" + +# 解析参数 +for arg in "$@"; do + case $arg in + --region=*) + REGION="${arg#*=}" + shift + ;; + --vector=*) + VECTOR="${arg#*=}" + shift + ;; + *) + ;; + esac +done + +# 检查参数合法性 +VALID_VECTOR=("pg" "milvus" "zilliz" "oceanbase") +VECTOR_VALID=false +for v in "${VALID_VECTOR[@]}"; do + if [[ "$VECTOR" == "$v" ]]; then + VECTOR_VALID=true + break + fi +done + +if ! $VECTOR_VALID; then + echo "Error: Invalid --vector parameter: $VECTOR" + echo "Available options: pg, milvus, zilliz, oceanbase" + exit 1 +fi + +if [[ "$REGION" != "global" && "$REGION" != "cn" ]]; then + echo "Error: Invalid --region parameter: $REGION" + echo "Available options: global, cn" + exit 1 +fi + + +echo 'Vector Database:' $VECTOR +echo 'Docker Image Registry: ' $REGION +read -p "Confirm? (y/n)" confirm +if [ "$confirm" != "y" ]; then + echo "Canceled" + exit 1 +fi + +echo 'Downloading Docker Compose YAML file' +# get the yml file, url: +# region=cn https://doc.fastgpt.cn/deploy/docker/cn/docker-compose.[vector].yml +# region=global https://doc.fastgpt.io/deploy/docker/global/docker-compose.[vector].yml + +# 构建下载链接 +if [ "$REGION" == "cn" ]; then + YML_URL="https://doc.fastgpt.cn/deploy/docker/cn/docker-compose.${VECTOR}.yml" +else + YML_URL="https://doc.fastgpt.io/deploy/docker/global/docker-compose.${VECTOR}.yml" +fi + +# 下载 YAML 文件 +curl -O "$YML_URL" + +if [ $? -ne 0 ]; then + echo "Error: Failed to download YAML file from $YML_URL" + exit 1 +fi + +echo "Downloaded docker-compose.${VECTOR}.yml from $YML_URL" + +# download config.json file + +if [ "$REGION" == "cn" ]; then + CONFIG="https://doc.fastgpt.cn/deploy/config/config.json" +else + CONFIG="https://doc.fastgpt.io/deploy/config/config.json" +fi + +# 下载 config.json 文件 +curl -O "$CONFIG" + +if [ $? -ne 0 ]; then + echo "Error: Failed to download config.json file from $CONFIG" + exit 1 +fi + +echo "Downloaded config.json from $CONFIG" + +echo "Installation success! What's next:" +echo "1. Edit the yml file: vim docker-compose.${VECTOR}.yml" +echo "2. start the service: docker compose -f docker-compose.${VECTOR}.yml up -d" +echo "3. stop the service: docker compose -f docker-compose.${VECTOR}.yml down" +echo "4. restart the service: docker compose -f docker-compose.${VECTOR}.yml restart" +echo "For more information, please visit https://doc.fastgpt.cn/deploy" diff --git a/package.json b/package.json index ec178620f..639c8331c 100644 --- a/package.json +++ b/package.json @@ -9,6 +9,7 @@ "initDocTime": "node ./document/script/initDocTime.js", "initDocToc": "node ./document/lib/generateToc.js", "gen:theme-typings": "chakra-cli tokens packages/web/styles/theme.ts --out node_modules/.pnpm/node_modules/@chakra-ui/styled-system/dist/theming.types.d.ts", + "gen:deploy": "node deploy/init.mjs", "postinstall": "pnpm gen:theme-typings", "initIcon": "node ./scripts/icon/init.js && prettier --config \"./.prettierrc.js\" --write \"packages/web/components/common/Icon/constants.ts\"", "previewIcon": "node ./scripts/icon/index.js", diff --git a/packages/global/common/file/tools.ts b/packages/global/common/file/tools.ts index 00dd511e2..262cbe347 100644 --- a/packages/global/common/file/tools.ts +++ b/packages/global/common/file/tools.ts @@ -56,7 +56,7 @@ export const parseUrlToFileType = (url: string): UserChatItemValueItemType['file } try { - const parseUrl = new URL(url, 'https://localhost:3000'); + const parseUrl = new URL(url, 'http://localhost:3000'); // Get filename from URL const filename = parseUrl.searchParams.get('filename') || parseUrl.pathname.split('/').pop(); diff --git a/plugins/webcrawler/.searchxng.env b/plugins/webcrawler/.searchxng.env index dbb62f560..073ddcbb7 100644 --- a/plugins/webcrawler/.searchxng.env +++ b/plugins/webcrawler/.searchxng.env @@ -1,4 +1,4 @@ -# By default listen on https://localhost +# By default listen on http://localhost # To change this: # * uncomment SEARXNG_HOSTNAME, and replace by the SearXNG hostname # * uncomment LETSENCRYPT_EMAIL, and replace by your email (require to create a Let's Encrypt certificate) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index b014590f6..7da780021 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -13,7 +13,7 @@ importers: devDependencies: '@chakra-ui/cli': specifier: ^2.4.1 - version: 2.5.8(encoding@0.1.13)(react@18.3.1) + version: 2.5.8(encoding@0.1.13)(react@19.1.1) '@typescript-eslint/eslint-plugin': specifier: ^6.21.0 version: 6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.8.2))(eslint@8.57.1)(typescript@5.8.2) @@ -22,7 +22,7 @@ importers: version: 6.21.0(eslint@8.57.1)(typescript@5.8.2) '@vitest/coverage-v8': specifier: ^3.0.9 - version: 3.1.1(vitest@3.1.1(@types/debug@4.1.12)(@types/node@20.17.24)(sass@1.85.1)(terser@5.39.0)) + version: 3.1.1(vitest@3.1.1(@types/debug@4.1.12)(@types/node@24.0.13)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.85.1)(terser@5.39.0)(yaml@2.8.1)) eslint: specifier: ^8.57.0 version: 8.57.1 @@ -46,22 +46,22 @@ importers: version: 10.1.4(socks@2.8.4) next-i18next: specifier: 15.4.2 - version: 15.4.2(i18next@23.16.8)(next@14.2.32(@babel/core@7.26.10)(@opentelemetry/api@1.9.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(sass@1.85.1))(react-i18next@14.1.2(i18next@23.16.8)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1) + version: 15.4.2(i18next@23.16.8)(next@15.3.5(@opentelemetry/api@1.9.0)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(sass@1.85.1))(react-i18next@14.1.2(i18next@23.16.8)(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(react@19.1.1) prettier: specifier: 3.2.4 version: 3.2.4 react-i18next: specifier: 14.1.2 - version: 14.1.2(i18next@23.16.8)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + version: 14.1.2(i18next@23.16.8)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) typescript: specifier: ^5.1.3 version: 5.8.2 vitest: specifier: ^3.0.9 - version: 3.1.1(@types/debug@4.1.12)(@types/node@20.17.24)(sass@1.85.1)(terser@5.39.0) + version: 3.1.1(@types/debug@4.1.12)(@types/node@24.0.13)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.85.1)(terser@5.39.0)(yaml@2.8.1) zhlint: specifier: ^0.7.4 - version: 0.7.4(@types/node@20.17.24)(sass@1.85.1)(terser@5.39.0)(typescript@5.8.2) + version: 0.7.4(@types/node@24.0.13)(lightningcss@1.30.1)(sass@1.85.1)(terser@5.39.0)(typescript@5.8.2) packages/global: dependencies: @@ -103,7 +103,7 @@ importers: version: 5.1.3 next: specifier: 14.2.32 - version: 14.2.32(@babel/core@7.26.10)(@opentelemetry/api@1.9.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(sass@1.85.1) + version: 14.2.32(@opentelemetry/api@1.9.0)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(sass@1.85.1) openai: specifier: 4.61.0 version: 4.61.0(encoding@0.1.13)(zod@3.25.51) @@ -242,10 +242,10 @@ importers: version: 3.13.0 next: specifier: 14.2.32 - version: 14.2.32(@babel/core@7.26.10)(@opentelemetry/api@1.9.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(sass@1.85.1) + version: 14.2.32(@opentelemetry/api@1.9.0)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(sass@1.85.1) nextjs-cors: specifier: ^2.2.0 - version: 2.2.0(next@14.2.32(@opentelemetry/api@1.9.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(sass@1.85.1)) + version: 2.2.0(next@14.2.32(@opentelemetry/api@1.9.0)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(sass@1.85.1)) node-cron: specifier: ^3.0.3 version: 3.0.3 @@ -327,7 +327,7 @@ importers: version: 2.1.1(@chakra-ui/system@2.6.1(@emotion/react@11.11.1(@types/react@18.3.1)(react@18.3.1))(@emotion/styled@11.11.0(@emotion/react@11.11.1(@types/react@18.3.1)(react@18.3.1))(@types/react@18.3.1)(react@18.3.1))(react@18.3.1))(react@18.3.1) '@chakra-ui/next-js': specifier: 2.4.2 - version: 2.4.2(@chakra-ui/react@2.10.7(@emotion/react@11.11.1(@types/react@18.3.1)(react@18.3.1))(@emotion/styled@11.11.0(@emotion/react@11.11.1(@types/react@18.3.1)(react@18.3.1))(@types/react@18.3.1)(react@18.3.1))(@types/react@18.3.1)(framer-motion@9.1.7(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@emotion/react@11.11.1(@types/react@18.3.1)(react@18.3.1))(next@14.2.32(@babel/core@7.26.10)(@opentelemetry/api@1.9.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(sass@1.85.1))(react@18.3.1) + version: 2.4.2(@chakra-ui/react@2.10.7(@emotion/react@11.11.1(@types/react@18.3.1)(react@18.3.1))(@emotion/styled@11.11.0(@emotion/react@11.11.1(@types/react@18.3.1)(react@18.3.1))(@types/react@18.3.1)(react@18.3.1))(@types/react@18.3.1)(framer-motion@9.1.7(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@emotion/react@11.11.1(@types/react@18.3.1)(react@18.3.1))(next@14.2.32(@opentelemetry/api@1.9.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(sass@1.85.1))(react@18.3.1) '@chakra-ui/react': specifier: 2.10.7 version: 2.10.7(@emotion/react@11.11.1(@types/react@18.3.1)(react@18.3.1))(@emotion/styled@11.11.0(@emotion/react@11.11.1(@types/react@18.3.1)(react@18.3.1))(@types/react@18.3.1)(react@18.3.1))(@types/react@18.3.1)(framer-motion@9.1.7(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) @@ -405,7 +405,7 @@ importers: version: 14.2.32(@babel/core@7.26.10)(@opentelemetry/api@1.9.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(sass@1.85.1) next-i18next: specifier: 15.4.2 - version: 15.4.2(i18next@23.16.8)(next@14.2.32(@babel/core@7.26.10)(@opentelemetry/api@1.9.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(sass@1.85.1))(react-i18next@14.1.2(i18next@23.16.8)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1) + version: 15.4.2(i18next@23.16.8)(next@14.2.32(@opentelemetry/api@1.9.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(sass@1.85.1))(react-i18next@14.1.2(i18next@23.16.8)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1) papaparse: specifier: ^5.4.1 version: 5.4.1 @@ -435,7 +435,7 @@ importers: version: 2.15.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) use-context-selector: specifier: ^1.4.4 - version: 1.4.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2) + version: 1.4.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.26.0) zustand: specifier: ^4.3.5 version: 4.5.6(@types/react@18.3.1)(immer@9.0.21)(react@18.3.1) @@ -628,7 +628,7 @@ importers: version: 1.85.1 use-context-selector: specifier: ^1.4.4 - version: 1.4.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2) + version: 1.4.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.26.0) zod: specifier: ^3.24.2 version: 3.24.2 @@ -683,7 +683,7 @@ importers: version: 5.8.2 vitest: specifier: ^3.0.2 - version: 3.1.1(@types/debug@4.1.12)(@types/node@20.17.24)(sass@1.85.1)(terser@5.39.0) + version: 3.1.1(@types/debug@4.1.12)(@types/node@20.17.24)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.85.1)(terser@5.39.0)(yaml@2.8.1) projects/mcp_server: dependencies: @@ -1618,6 +1618,9 @@ packages: '@emnapi/runtime@1.3.1': resolution: {integrity: sha512-kEBmG8KyqtxJZv+ygbEim+KCGtIq1fC22Ms3S4ziXmYKm8uyoLX0MHONVKwp+9opg390VaKRNt4a7A9NwmpNhw==} + '@emnapi/runtime@1.5.0': + resolution: {integrity: sha512-97/BJ3iXHww3djw6hYIfErCZFee7qCtrneuLa20UXFCOTCfBM2cvQHjWJ2EG0s0MtdNwInarqCTz35i4wWXHsQ==} + '@emnapi/wasi-threads@1.0.1': resolution: {integrity: sha512-iIBu7mwkq4UQGeMEM8bLwNK962nXdhodeScX4slfQnRhEMMzvYivHhutCIk8uojvmASXXPC2WNEjwxFWk72Oqw==} @@ -2062,6 +2065,132 @@ packages: resolution: {integrity: sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==} deprecated: Use @eslint/object-schema instead + '@img/colour@1.0.0': + resolution: {integrity: sha512-A5P/LfWGFSl6nsckYtjw9da+19jB8hkJ6ACTGcDfEJ0aE+l2n2El7dsVM7UVHZQ9s2lmYMWlrS21YLy2IR1LUw==} + engines: {node: '>=18'} + + '@img/sharp-darwin-arm64@0.34.4': + resolution: {integrity: sha512-sitdlPzDVyvmINUdJle3TNHl+AG9QcwiAMsXmccqsCOMZNIdW2/7S26w0LyU8euiLVzFBL3dXPwVCq/ODnf2vA==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [arm64] + os: [darwin] + + '@img/sharp-darwin-x64@0.34.4': + resolution: {integrity: sha512-rZheupWIoa3+SOdF/IcUe1ah4ZDpKBGWcsPX6MT0lYniH9micvIU7HQkYTfrx5Xi8u+YqwLtxC/3vl8TQN6rMg==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [x64] + os: [darwin] + + '@img/sharp-libvips-darwin-arm64@1.2.3': + resolution: {integrity: sha512-QzWAKo7kpHxbuHqUC28DZ9pIKpSi2ts2OJnoIGI26+HMgq92ZZ4vk8iJd4XsxN+tYfNJxzH6W62X5eTcsBymHw==} + cpu: [arm64] + os: [darwin] + + '@img/sharp-libvips-darwin-x64@1.2.3': + resolution: {integrity: sha512-Ju+g2xn1E2AKO6YBhxjj+ACcsPQRHT0bhpglxcEf+3uyPY+/gL8veniKoo96335ZaPo03bdDXMv0t+BBFAbmRA==} + cpu: [x64] + os: [darwin] + + '@img/sharp-libvips-linux-arm64@1.2.3': + resolution: {integrity: sha512-I4RxkXU90cpufazhGPyVujYwfIm9Nk1QDEmiIsaPwdnm013F7RIceaCc87kAH+oUB1ezqEvC6ga4m7MSlqsJvQ==} + cpu: [arm64] + os: [linux] + + '@img/sharp-libvips-linux-arm@1.2.3': + resolution: {integrity: sha512-x1uE93lyP6wEwGvgAIV0gP6zmaL/a0tGzJs/BIDDG0zeBhMnuUPm7ptxGhUbcGs4okDJrk4nxgrmxpib9g6HpA==} + cpu: [arm] + os: [linux] + + '@img/sharp-libvips-linux-ppc64@1.2.3': + resolution: {integrity: sha512-Y2T7IsQvJLMCBM+pmPbM3bKT/yYJvVtLJGfCs4Sp95SjvnFIjynbjzsa7dY1fRJX45FTSfDksbTp6AGWudiyCg==} + cpu: [ppc64] + os: [linux] + + '@img/sharp-libvips-linux-s390x@1.2.3': + resolution: {integrity: sha512-RgWrs/gVU7f+K7P+KeHFaBAJlNkD1nIZuVXdQv6S+fNA6syCcoboNjsV2Pou7zNlVdNQoQUpQTk8SWDHUA3y/w==} + cpu: [s390x] + os: [linux] + + '@img/sharp-libvips-linux-x64@1.2.3': + resolution: {integrity: sha512-3JU7LmR85K6bBiRzSUc/Ff9JBVIFVvq6bomKE0e63UXGeRw2HPVEjoJke1Yx+iU4rL7/7kUjES4dZ/81Qjhyxg==} + cpu: [x64] + os: [linux] + + '@img/sharp-libvips-linuxmusl-arm64@1.2.3': + resolution: {integrity: sha512-F9q83RZ8yaCwENw1GieztSfj5msz7GGykG/BA+MOUefvER69K/ubgFHNeSyUu64amHIYKGDs4sRCMzXVj8sEyw==} + cpu: [arm64] + os: [linux] + + '@img/sharp-libvips-linuxmusl-x64@1.2.3': + resolution: {integrity: sha512-U5PUY5jbc45ANM6tSJpsgqmBF/VsL6LnxJmIf11kB7J5DctHgqm0SkuXzVWtIY90GnJxKnC/JT251TDnk1fu/g==} + cpu: [x64] + os: [linux] + + '@img/sharp-linux-arm64@0.34.4': + resolution: {integrity: sha512-YXU1F/mN/Wu786tl72CyJjP/Ngl8mGHN1hST4BGl+hiW5jhCnV2uRVTNOcaYPs73NeT/H8Upm3y9582JVuZHrQ==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [arm64] + os: [linux] + + '@img/sharp-linux-arm@0.34.4': + resolution: {integrity: sha512-Xyam4mlqM0KkTHYVSuc6wXRmM7LGN0P12li03jAnZ3EJWZqj83+hi8Y9UxZUbxsgsK1qOEwg7O0Bc0LjqQVtxA==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [arm] + os: [linux] + + '@img/sharp-linux-ppc64@0.34.4': + resolution: {integrity: sha512-F4PDtF4Cy8L8hXA2p3TO6s4aDt93v+LKmpcYFLAVdkkD3hSxZzee0rh6/+94FpAynsuMpLX5h+LRsSG3rIciUQ==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [ppc64] + os: [linux] + + '@img/sharp-linux-s390x@0.34.4': + resolution: {integrity: sha512-qVrZKE9Bsnzy+myf7lFKvng6bQzhNUAYcVORq2P7bDlvmF6u2sCmK2KyEQEBdYk+u3T01pVsPrkj943T1aJAsw==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [s390x] + os: [linux] + + '@img/sharp-linux-x64@0.34.4': + resolution: {integrity: sha512-ZfGtcp2xS51iG79c6Vhw9CWqQC8l2Ot8dygxoDoIQPTat/Ov3qAa8qpxSrtAEAJW+UjTXc4yxCjNfxm4h6Xm2A==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [x64] + os: [linux] + + '@img/sharp-linuxmusl-arm64@0.34.4': + resolution: {integrity: sha512-8hDVvW9eu4yHWnjaOOR8kHVrew1iIX+MUgwxSuH2XyYeNRtLUe4VNioSqbNkB7ZYQJj9rUTT4PyRscyk2PXFKA==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [arm64] + os: [linux] + + '@img/sharp-linuxmusl-x64@0.34.4': + resolution: {integrity: sha512-lU0aA5L8QTlfKjpDCEFOZsTYGn3AEiO6db8W5aQDxj0nQkVrZWmN3ZP9sYKWJdtq3PWPhUNlqehWyXpYDcI9Sg==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [x64] + os: [linux] + + '@img/sharp-wasm32@0.34.4': + resolution: {integrity: sha512-33QL6ZO/qpRyG7woB/HUALz28WnTMI2W1jgX3Nu2bypqLIKx/QKMILLJzJjI+SIbvXdG9fUnmrxR7vbi1sTBeA==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [wasm32] + + '@img/sharp-win32-arm64@0.34.4': + resolution: {integrity: sha512-2Q250do/5WXTwxW3zjsEuMSv5sUU4Tq9VThWKlU2EYLm4MB7ZeMwF+SFJutldYODXF6jzc6YEOC+VfX0SZQPqA==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [arm64] + os: [win32] + + '@img/sharp-win32-ia32@0.34.4': + resolution: {integrity: sha512-3ZeLue5V82dT92CNL6rsal6I2weKw1cYu+rGKm8fOCCtJTR2gYeUfY3FqUnIJsMUPIH68oS5jmZ0NiJ508YpEw==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [ia32] + os: [win32] + + '@img/sharp-win32-x64@0.34.4': + resolution: {integrity: sha512-xIyj4wpYs8J18sVN3mSQjwrw7fKUqRw+Z5rnHNCy5fYTxigBz81u5mOMPmFumwjcn8+ld1ppptMBCLic1nz6ig==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [x64] + os: [win32] + '@ioredis/commands@1.2.0': resolution: {integrity: sha512-Sx1pU8EM64o2BrqNpEO1CNLtKQwyhuXuqyfH7oGKCk+1a33d2r5saW8zNwm3j6BTExtjrv2BxTgzzkMwts6vGg==} @@ -2539,6 +2668,9 @@ packages: '@next/env@14.2.32': resolution: {integrity: sha512-n9mQdigI6iZ/DF6pCTwMKeWgF2e8lg7qgt5M7HXMLtyhZYMnf/u905M18sSpPmHL9MKp9JHo56C6jrD2EvWxng==} + '@next/env@15.3.5': + resolution: {integrity: sha512-7g06v8BUVtN2njAX/r8gheoVffhiKFVt4nx74Tt6G4Hqw9HCLYQVx/GkH2qHvPtAHZaUNZ0VXAa0pQP6v1wk7g==} + '@next/eslint-plugin-next@14.2.26': resolution: {integrity: sha512-SPEj1O5DAVTPaWD9XPupelfT2APNIgcDYD2OzEm328BEmHaglhmYNUvxhzfJYDr12AgAfW4V3UHSV93qaeELJA==} @@ -2548,42 +2680,84 @@ packages: cpu: [arm64] os: [darwin] + '@next/swc-darwin-arm64@15.3.5': + resolution: {integrity: sha512-lM/8tilIsqBq+2nq9kbTW19vfwFve0NR7MxfkuSUbRSgXlMQoJYg+31+++XwKVSXk4uT23G2eF/7BRIKdn8t8w==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [darwin] + '@next/swc-darwin-x64@14.2.32': resolution: {integrity: sha512-P9NpCAJuOiaHHpqtrCNncjqtSBi1f6QUdHK/+dNabBIXB2RUFWL19TY1Hkhu74OvyNQEYEzzMJCMQk5agjw1Qg==} engines: {node: '>= 10'} cpu: [x64] os: [darwin] + '@next/swc-darwin-x64@15.3.5': + resolution: {integrity: sha512-WhwegPQJ5IfoUNZUVsI9TRAlKpjGVK0tpJTL6KeiC4cux9774NYE9Wu/iCfIkL/5J8rPAkqZpG7n+EfiAfidXA==} + engines: {node: '>= 10'} + cpu: [x64] + os: [darwin] + '@next/swc-linux-arm64-gnu@14.2.32': resolution: {integrity: sha512-v7JaO0oXXt6d+cFjrrKqYnR2ubrD+JYP7nQVRZgeo5uNE5hkCpWnHmXm9vy3g6foMO8SPwL0P3MPw1c+BjbAzA==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] + '@next/swc-linux-arm64-gnu@15.3.5': + resolution: {integrity: sha512-LVD6uMOZ7XePg3KWYdGuzuvVboxujGjbcuP2jsPAN3MnLdLoZUXKRc6ixxfs03RH7qBdEHCZjyLP/jBdCJVRJQ==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + '@next/swc-linux-arm64-musl@14.2.32': resolution: {integrity: sha512-tA6sIKShXtSJBTH88i0DRd6I9n3ZTirmwpwAqH5zdJoQF7/wlJXR8DkPmKwYl5mFWhEKr5IIa3LfpMW9RRwKmQ==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] + '@next/swc-linux-arm64-musl@15.3.5': + resolution: {integrity: sha512-k8aVScYZ++BnS2P69ClK7v4nOu702jcF9AIHKu6llhHEtBSmM2zkPGl9yoqbSU/657IIIb0QHpdxEr0iW9z53A==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + '@next/swc-linux-x64-gnu@14.2.32': resolution: {integrity: sha512-7S1GY4TdnlGVIdeXXKQdDkfDysoIVFMD0lJuVVMeb3eoVjrknQ0JNN7wFlhCvea0hEk0Sd4D1hedVChDKfV2jw==} engines: {node: '>= 10'} cpu: [x64] os: [linux] + '@next/swc-linux-x64-gnu@15.3.5': + resolution: {integrity: sha512-2xYU0DI9DGN/bAHzVwADid22ba5d/xrbrQlr2U+/Q5WkFUzeL0TDR963BdrtLS/4bMmKZGptLeg6282H/S2i8A==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + '@next/swc-linux-x64-musl@14.2.32': resolution: {integrity: sha512-OHHC81P4tirVa6Awk6eCQ6RBfWl8HpFsZtfEkMpJ5GjPsJ3nhPe6wKAJUZ/piC8sszUkAgv3fLflgzPStIwfWg==} engines: {node: '>= 10'} cpu: [x64] os: [linux] + '@next/swc-linux-x64-musl@15.3.5': + resolution: {integrity: sha512-TRYIqAGf1KCbuAB0gjhdn5Ytd8fV+wJSM2Nh2is/xEqR8PZHxfQuaiNhoF50XfY90sNpaRMaGhF6E+qjV1b9Tg==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + '@next/swc-win32-arm64-msvc@14.2.32': resolution: {integrity: sha512-rORQjXsAFeX6TLYJrCG5yoIDj+NKq31Rqwn8Wpn/bkPNy5rTHvOXkW8mLFonItS7QC6M+1JIIcLe+vOCTOYpvg==} engines: {node: '>= 10'} cpu: [arm64] os: [win32] + '@next/swc-win32-arm64-msvc@15.3.5': + resolution: {integrity: sha512-h04/7iMEUSMY6fDGCvdanKqlO1qYvzNxntZlCzfE8i5P0uqzVQWQquU1TIhlz0VqGQGXLrFDuTJVONpqGqjGKQ==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [win32] + '@next/swc-win32-ia32-msvc@14.2.32': resolution: {integrity: sha512-jHUeDPVHrgFltqoAqDB6g6OStNnFxnc7Aks3p0KE0FbwAvRg6qWKYF5mSTdCTxA3axoSAUwxYdILzXJfUwlHhA==} engines: {node: '>= 10'} @@ -2596,6 +2770,12 @@ packages: cpu: [x64] os: [win32] + '@next/swc-win32-x64-msvc@15.3.5': + resolution: {integrity: sha512-5fhH6fccXxnX2KhllnGhkYMndhOiLOLEiVGYjP2nizqeGWkN10sA9taATlXwake2E2XMvYZjjz0Uj7T0y+z1yw==} + engines: {node: '>= 10'} + cpu: [x64] + os: [win32] + '@node-rs/jieba-android-arm-eabi@2.0.1': resolution: {integrity: sha512-tavsIaxybnlA9tRbJ+oc3NW3zhx0d5rNiCGdpIdGWjflwS7HyeUTVAZmAFDlg58Mc6EjTdVKZH+RolBbAJtgcQ==} engines: {node: '>= 10'} @@ -3255,6 +3435,9 @@ packages: '@swc/counter@0.1.3': resolution: {integrity: sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==} + '@swc/helpers@0.5.15': + resolution: {integrity: sha512-JQ5TuMi45Owi4/BIMAJBoSQoOJu12oOk/gADqlcUL9JEdHB8vyjUSsxqeNXnmXHjYKMi2WcYtezGEEhqUI/E2g==} + '@swc/helpers@0.5.5': resolution: {integrity: sha512-KGYxvIOXcceOAbEk4bi/dVLEK9z8sZ0uBB3Il5b1rhfClSpcX0yfRO0KmTkqR2cnQDymwLB+25ZyMzICg/cm/A==} @@ -3547,6 +3730,9 @@ packages: '@types/node@20.17.24': resolution: {integrity: sha512-d7fGCyB96w9BnWQrOsJtpyiSaBcAYYr75bnK6ZRjDbql2cGLj/3GsL5OYmLPNq76l7Gf2q4Rv9J2o6h5CrD9sA==} + '@types/node@24.0.13': + resolution: {integrity: sha512-Qm9OYVOFHFYg3wJoTSrz80hoec5Lia/dPp84do3X7dZvLikQvM1YpmvTBEdIr/e+U8HTkFjLHLnl78K/qjf+jQ==} + '@types/nprogress@0.2.3': resolution: {integrity: sha512-k7kRA033QNtC+gLc4VPlfnue58CM1iQLgn1IMAU8VPHGOj7oIHPp9UlhedEnD/Gl8evoCjwkZjlBORtZ3JByUA==} @@ -5057,6 +5243,10 @@ packages: resolution: {integrity: sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==} engines: {node: '>=8'} + detect-libc@2.1.1: + resolution: {integrity: sha512-ecqj/sy1jcK1uWrwpR67UhYrIFQ+5WlGxth34WquCbamhFA6hkkwiu37o6J5xCHdo1oixJRfVRw+ywV+Hq/0Aw==} + engines: {node: '>=8'} + detect-newline@3.1.0: resolution: {integrity: sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==} engines: {node: '>=8'} @@ -6592,6 +6782,10 @@ packages: node-notifier: optional: true + jiti@2.6.0: + resolution: {integrity: sha512-VXe6RjJkBPj0ohtqaO8vSWP3ZhAKo66fKrFNCll4BTcwljPLz03pCbaNKfzGP5MbrCYcbJ7v0nOYYwUzTEIdXQ==} + hasBin: true + joplin-turndown-plugin-gfm@1.0.12: resolution: {integrity: sha512-qL4+1iycQjZ1fs8zk3jSRk7cg3ROBUHk7GKtiLAQLFzLPKErnILUvz5DLszSQvz3s1sTjPbywLDISVUtBY6HaA==} @@ -6777,6 +6971,70 @@ packages: light-my-request@6.3.0: resolution: {integrity: sha512-bWTAPJmeWQH5suJNYwG0f5cs0p6ho9e6f1Ppoxv5qMosY+s9Ir2+ZLvvHcgA7VTDop4zl/NCHhOVVqU+kd++Ow==} + lightningcss-darwin-arm64@1.30.1: + resolution: {integrity: sha512-c8JK7hyE65X1MHMN+Viq9n11RRC7hgin3HhYKhrMyaXflk5GVplZ60IxyoVtzILeKr+xAJwg6zK6sjTBJ0FKYQ==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [darwin] + + lightningcss-darwin-x64@1.30.1: + resolution: {integrity: sha512-k1EvjakfumAQoTfcXUcHQZhSpLlkAuEkdMBsI/ivWw9hL+7FtilQc0Cy3hrx0AAQrVtQAbMI7YjCgYgvn37PzA==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [darwin] + + lightningcss-freebsd-x64@1.30.1: + resolution: {integrity: sha512-kmW6UGCGg2PcyUE59K5r0kWfKPAVy4SltVeut+umLCFoJ53RdCUWxcRDzO1eTaxf/7Q2H7LTquFHPL5R+Gjyig==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [freebsd] + + lightningcss-linux-arm-gnueabihf@1.30.1: + resolution: {integrity: sha512-MjxUShl1v8pit+6D/zSPq9S9dQ2NPFSQwGvxBCYaBYLPlCWuPh9/t1MRS8iUaR8i+a6w7aps+B4N0S1TYP/R+Q==} + engines: {node: '>= 12.0.0'} + cpu: [arm] + os: [linux] + + lightningcss-linux-arm64-gnu@1.30.1: + resolution: {integrity: sha512-gB72maP8rmrKsnKYy8XUuXi/4OctJiuQjcuqWNlJQ6jZiWqtPvqFziskH3hnajfvKB27ynbVCucKSm2rkQp4Bw==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [linux] + + lightningcss-linux-arm64-musl@1.30.1: + resolution: {integrity: sha512-jmUQVx4331m6LIX+0wUhBbmMX7TCfjF5FoOH6SD1CttzuYlGNVpA7QnrmLxrsub43ClTINfGSYyHe2HWeLl5CQ==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [linux] + + lightningcss-linux-x64-gnu@1.30.1: + resolution: {integrity: sha512-piWx3z4wN8J8z3+O5kO74+yr6ze/dKmPnI7vLqfSqI8bccaTGY5xiSGVIJBDd5K5BHlvVLpUB3S2YCfelyJ1bw==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [linux] + + lightningcss-linux-x64-musl@1.30.1: + resolution: {integrity: sha512-rRomAK7eIkL+tHY0YPxbc5Dra2gXlI63HL+v1Pdi1a3sC+tJTcFrHX+E86sulgAXeI7rSzDYhPSeHHjqFhqfeQ==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [linux] + + lightningcss-win32-arm64-msvc@1.30.1: + resolution: {integrity: sha512-mSL4rqPi4iXq5YVqzSsJgMVFENoa4nGTT/GjO2c0Yl9OuQfPsIfncvLrEW6RbbB24WtZ3xP/2CCmI3tNkNV4oA==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [win32] + + lightningcss-win32-x64-msvc@1.30.1: + resolution: {integrity: sha512-PVqXh48wh4T53F/1CCu8PIPCxLzWyCnn/9T5W1Jpmdy5h9Cwd+0YQS6/LwhHXSafuc61/xg9Lv5OrCby6a++jg==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [win32] + + lightningcss@1.30.1: + resolution: {integrity: sha512-xi6IyHML+c9+Q3W0S4fCQJOym42pyurFiJUHEcEyHS0CeKzia4yZDEsLlqOFykxOdHpNy0NmvVO31vcSqAxJCg==} + engines: {node: '>= 12.0.0'} + lilconfig@2.1.0: resolution: {integrity: sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==} engines: {node: '>=10'} @@ -7510,6 +7768,27 @@ packages: sass: optional: true + next@15.3.5: + resolution: {integrity: sha512-RkazLBMMDJSJ4XZQ81kolSpwiCt907l0xcgcpF4xC2Vml6QVcPNXW0NQRwQ80FFtSn7UM52XN0anaw8TEJXaiw==} + engines: {node: ^18.18.0 || ^19.8.0 || >= 20.0.0} + hasBin: true + peerDependencies: + '@opentelemetry/api': ^1.1.0 + '@playwright/test': ^1.41.2 + babel-plugin-react-compiler: '*' + react: ^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0 + react-dom: ^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0 + sass: ^1.3.0 + peerDependenciesMeta: + '@opentelemetry/api': + optional: true + '@playwright/test': + optional: true + babel-plugin-react-compiler: + optional: true + sass: + optional: true + nextjs-cors@2.2.0: resolution: {integrity: sha512-FZu/A+L59J4POJNqwXYyCPDvsLDeu5HjSBvytzS6lsrJeDz5cmnH45zV+VoNic0hjaeER9xGaiIjZIWzEHnxQg==} peerDependencies: @@ -8171,6 +8450,11 @@ packages: peerDependencies: react: ^18.3.1 + react-dom@19.1.1: + resolution: {integrity: sha512-Dlq/5LAZgF0Gaz6yiqZCf6VCcZs1ghAJyrsu84Q/GT0gV+mCxbfmKNoGRKBYMJ8IEdGPqu49YWXD02GCknEDkw==} + peerDependencies: + react: ^19.1.1 + react-error-boundary@3.1.4: resolution: {integrity: sha512-uM9uPzZJTF6wRQORmSrvOIgt4lJ9MC1sNgEOj2XGsDTRE4kmpWxg7ENK9EWNKJRMAOY9z0MuF4yIfl6gp4sotA==} engines: {node: '>=10', npm: '>=6'} @@ -8298,6 +8582,10 @@ packages: resolution: {integrity: sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==} engines: {node: '>=0.10.0'} + react@19.1.1: + resolution: {integrity: sha512-w8nqGImo45dmMIfljjMwOGtbmC/mk4CMYhWIicdSflH91J9TyCyczcPFXJzrZ/ZXcgGRFeP6BU0BEJTw6tZdfQ==} + engines: {node: '>=0.10.0'} + reactflow@11.11.4: resolution: {integrity: sha512-70FOtJkUWH3BAOsN+LU9lCrKoKbtOPnz2uq0CV2PLdNSwxTXOhCbsZr50GmZ+Rtw3jx8Uv7/vBFtCGixLfd4Og==} peerDependencies: @@ -8583,6 +8871,9 @@ packages: scheduler@0.23.2: resolution: {integrity: sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==} + scheduler@0.26.0: + resolution: {integrity: sha512-NlHwttCI/l5gCPR3D1nNXtWABUmBwvZpEQiD4IXSbIDq8BzLIK/7Ir5gTFSGZDUu37K5cMNp0hFtzO38sC7gWA==} + schema-utils@3.3.0: resolution: {integrity: sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==} engines: {node: '>= 10.13.0'} @@ -8666,6 +8957,10 @@ packages: setprototypeof@1.2.0: resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} + sharp@0.34.4: + resolution: {integrity: sha512-FUH39xp3SBPnxWvd5iib1X8XY7J0K0X7d93sie9CJg2PO8/7gmg89Nve6OjItK53/MlAushNNxteBYfM6DEuoA==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + shebang-command@2.0.0: resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} engines: {node: '>=8'} @@ -8964,6 +9259,19 @@ packages: babel-plugin-macros: optional: true + styled-jsx@5.1.6: + resolution: {integrity: sha512-qSVyDTeMotdvQYoHWLNGwRFJHC+i+ZvdBRYosOFgC+Wg1vx4frN2/RG/NA7SYqqvKNLf39P2LSRA2pu6n0XYZA==} + engines: {node: '>= 12.0.0'} + peerDependencies: + '@babel/core': '*' + babel-plugin-macros: '*' + react: '>= 16.8.0 || 17.x.x || ^18.0.0-0 || ^19.0.0-0' + peerDependenciesMeta: + '@babel/core': + optional: true + babel-plugin-macros: + optional: true + stylis@4.2.0: resolution: {integrity: sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw==} @@ -9359,6 +9667,9 @@ packages: undici-types@6.19.8: resolution: {integrity: sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==} + undici-types@7.8.0: + resolution: {integrity: sha512-9UJ2xGDvQ43tYyVMpuHlsgApydB8ZKfVYTsLDhXkFL/6gfkp+U8xTGdh8pMJv1SpZna0zxG1DwsKZsreLbXBxw==} + unherit@1.1.3: resolution: {integrity: sha512-Ft16BJcnapDKp0+J/rqFC3Rrk6Y/Ng4nzsC028k2jdDII/rdZ7Wd3pPT/6+vIIxRagwRc9K0IUX0Ra4fKvw+WQ==} @@ -9901,6 +10212,11 @@ packages: resolution: {integrity: sha512-2eHWfjaoXgTBC2jNM1LRef62VQa0umtvRiDSk6HSzW7RvS5YtkabJrwYLLEKWBc8a5U2PTSCs+dJjUTJdlHsWQ==} engines: {node: '>= 14'} + yaml@2.8.1: + resolution: {integrity: sha512-lcYcMxX2PO9XMGvAJkJ3OsNMw+/7FKes7/hgerGUYWIoWu5j/+YQqcZr5JnPZWzOsEBgMbSbiSTn/dv/69Mkpw==} + engines: {node: '>= 14.6'} + hasBin: true + yargs-parser@18.1.3: resolution: {integrity: sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==} engines: {node: '>=6'} @@ -10846,11 +11162,11 @@ snapshots: '@chakra-ui/anatomy@2.3.6': {} - '@chakra-ui/cli@2.5.8(encoding@0.1.13)(react@18.3.1)': + '@chakra-ui/cli@2.5.8(encoding@0.1.13)(react@19.1.1)': dependencies: bundle-n-require: 1.1.2 chokidar: 3.6.0 - cli-welcome: 2.2.3(encoding@0.1.13)(react@18.3.1) + cli-welcome: 2.2.3(encoding@0.1.13)(react@19.1.1) commander: 11.1.0 ora: 7.0.1 prettier: 3.2.4 @@ -10893,6 +11209,14 @@ snapshots: next: 14.2.32(@babel/core@7.26.10)(@opentelemetry/api@1.9.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(sass@1.85.1) react: 18.3.1 + '@chakra-ui/next-js@2.4.2(@chakra-ui/react@2.10.7(@emotion/react@11.11.1(@types/react@18.3.1)(react@18.3.1))(@emotion/styled@11.11.0(@emotion/react@11.11.1(@types/react@18.3.1)(react@18.3.1))(@types/react@18.3.1)(react@18.3.1))(@types/react@18.3.1)(framer-motion@9.1.7(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@emotion/react@11.11.1(@types/react@18.3.1)(react@18.3.1))(next@14.2.32(@opentelemetry/api@1.9.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(sass@1.85.1))(react@18.3.1)': + dependencies: + '@chakra-ui/react': 2.10.7(@emotion/react@11.11.1(@types/react@18.3.1)(react@18.3.1))(@emotion/styled@11.11.0(@emotion/react@11.11.1(@types/react@18.3.1)(react@18.3.1))(@types/react@18.3.1)(react@18.3.1))(@types/react@18.3.1)(framer-motion@9.1.7(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@emotion/cache': 11.14.0 + '@emotion/react': 11.11.1(@types/react@18.3.1)(react@18.3.1) + next: 14.2.32(@opentelemetry/api@1.9.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(sass@1.85.1) + react: 18.3.1 + '@chakra-ui/object-utils@2.1.0': {} '@chakra-ui/react-use-safe-layout-effect@2.1.0(react@18.3.1)': @@ -11038,6 +11362,11 @@ snapshots: tslib: 2.8.1 optional: true + '@emnapi/runtime@1.5.0': + dependencies: + tslib: 2.8.1 + optional: true + '@emnapi/wasi-threads@1.0.1': dependencies: tslib: 2.8.1 @@ -11408,6 +11737,95 @@ snapshots: '@humanwhocodes/object-schema@2.0.3': {} + '@img/colour@1.0.0': + optional: true + + '@img/sharp-darwin-arm64@0.34.4': + optionalDependencies: + '@img/sharp-libvips-darwin-arm64': 1.2.3 + optional: true + + '@img/sharp-darwin-x64@0.34.4': + optionalDependencies: + '@img/sharp-libvips-darwin-x64': 1.2.3 + optional: true + + '@img/sharp-libvips-darwin-arm64@1.2.3': + optional: true + + '@img/sharp-libvips-darwin-x64@1.2.3': + optional: true + + '@img/sharp-libvips-linux-arm64@1.2.3': + optional: true + + '@img/sharp-libvips-linux-arm@1.2.3': + optional: true + + '@img/sharp-libvips-linux-ppc64@1.2.3': + optional: true + + '@img/sharp-libvips-linux-s390x@1.2.3': + optional: true + + '@img/sharp-libvips-linux-x64@1.2.3': + optional: true + + '@img/sharp-libvips-linuxmusl-arm64@1.2.3': + optional: true + + '@img/sharp-libvips-linuxmusl-x64@1.2.3': + optional: true + + '@img/sharp-linux-arm64@0.34.4': + optionalDependencies: + '@img/sharp-libvips-linux-arm64': 1.2.3 + optional: true + + '@img/sharp-linux-arm@0.34.4': + optionalDependencies: + '@img/sharp-libvips-linux-arm': 1.2.3 + optional: true + + '@img/sharp-linux-ppc64@0.34.4': + optionalDependencies: + '@img/sharp-libvips-linux-ppc64': 1.2.3 + optional: true + + '@img/sharp-linux-s390x@0.34.4': + optionalDependencies: + '@img/sharp-libvips-linux-s390x': 1.2.3 + optional: true + + '@img/sharp-linux-x64@0.34.4': + optionalDependencies: + '@img/sharp-libvips-linux-x64': 1.2.3 + optional: true + + '@img/sharp-linuxmusl-arm64@0.34.4': + optionalDependencies: + '@img/sharp-libvips-linuxmusl-arm64': 1.2.3 + optional: true + + '@img/sharp-linuxmusl-x64@0.34.4': + optionalDependencies: + '@img/sharp-libvips-linuxmusl-x64': 1.2.3 + optional: true + + '@img/sharp-wasm32@0.34.4': + dependencies: + '@emnapi/runtime': 1.5.0 + optional: true + + '@img/sharp-win32-arm64@0.34.4': + optional: true + + '@img/sharp-win32-ia32@0.34.4': + optional: true + + '@img/sharp-win32-x64@0.34.4': + optional: true + '@ioredis/commands@1.2.0': {} '@isaacs/cliui@8.0.2': @@ -12013,6 +12431,8 @@ snapshots: '@next/env@14.2.32': {} + '@next/env@15.3.5': {} + '@next/eslint-plugin-next@14.2.26': dependencies: glob: 10.3.10 @@ -12020,30 +12440,54 @@ snapshots: '@next/swc-darwin-arm64@14.2.32': optional: true + '@next/swc-darwin-arm64@15.3.5': + optional: true + '@next/swc-darwin-x64@14.2.32': optional: true + '@next/swc-darwin-x64@15.3.5': + optional: true + '@next/swc-linux-arm64-gnu@14.2.32': optional: true + '@next/swc-linux-arm64-gnu@15.3.5': + optional: true + '@next/swc-linux-arm64-musl@14.2.32': optional: true + '@next/swc-linux-arm64-musl@15.3.5': + optional: true + '@next/swc-linux-x64-gnu@14.2.32': optional: true + '@next/swc-linux-x64-gnu@15.3.5': + optional: true + '@next/swc-linux-x64-musl@14.2.32': optional: true + '@next/swc-linux-x64-musl@15.3.5': + optional: true + '@next/swc-win32-arm64-msvc@14.2.32': optional: true + '@next/swc-win32-arm64-msvc@15.3.5': + optional: true + '@next/swc-win32-ia32-msvc@14.2.32': optional: true '@next/swc-win32-x64-msvc@14.2.32': optional: true + '@next/swc-win32-x64-msvc@15.3.5': + optional: true + '@node-rs/jieba-android-arm-eabi@2.0.1': optional: true @@ -12675,6 +13119,10 @@ snapshots: '@swc/counter@0.1.3': {} + '@swc/helpers@0.5.15': + dependencies: + tslib: 2.8.1 + '@swc/helpers@0.5.5': dependencies: '@swc/counter': 0.1.3 @@ -13011,6 +13459,11 @@ snapshots: dependencies: undici-types: 6.19.8 + '@types/node@24.0.13': + dependencies: + undici-types: 7.8.0 + optional: true + '@types/nprogress@0.2.3': {} '@types/papaparse@5.3.7': @@ -13273,7 +13726,7 @@ snapshots: '@opentelemetry/sdk-metrics': 2.0.1(@opentelemetry/api@1.9.0) '@opentelemetry/sdk-trace-base': 2.0.1(@opentelemetry/api@1.9.0) - '@vitest/coverage-v8@3.1.1(vitest@3.1.1(@types/debug@4.1.12)(@types/node@20.17.24)(sass@1.85.1)(terser@5.39.0))': + '@vitest/coverage-v8@3.1.1(vitest@3.1.1(@types/debug@4.1.12)(@types/node@24.0.13)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.85.1)(terser@5.39.0)(yaml@2.8.1))': dependencies: '@ampproject/remapping': 2.3.0 '@bcoe/v8-coverage': 1.0.2 @@ -13287,7 +13740,7 @@ snapshots: std-env: 3.8.1 test-exclude: 7.0.1 tinyrainbow: 2.0.0 - vitest: 3.1.1(@types/debug@4.1.12)(@types/node@20.17.24)(sass@1.85.1)(terser@5.39.0) + vitest: 3.1.1(@types/debug@4.1.12)(@types/node@24.0.13)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.85.1)(terser@5.39.0)(yaml@2.8.1) transitivePeerDependencies: - supports-color @@ -13304,13 +13757,21 @@ snapshots: chai: 5.2.0 tinyrainbow: 2.0.0 - '@vitest/mocker@3.1.1(vite@6.2.2(@types/node@20.17.24)(sass@1.85.1)(terser@5.39.0))': + '@vitest/mocker@3.1.1(vite@6.2.2(@types/node@20.17.24)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.85.1)(terser@5.39.0)(yaml@2.8.1))': dependencies: '@vitest/spy': 3.1.1 estree-walker: 3.0.3 magic-string: 0.30.17 optionalDependencies: - vite: 6.2.2(@types/node@20.17.24)(sass@1.85.1)(terser@5.39.0) + vite: 6.2.2(@types/node@20.17.24)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.85.1)(terser@5.39.0)(yaml@2.8.1) + + '@vitest/mocker@3.1.1(vite@6.2.2(@types/node@24.0.13)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.85.1)(terser@5.39.0)(yaml@2.8.1))': + dependencies: + '@vitest/spy': 3.1.1 + estree-walker: 3.0.3 + magic-string: 0.30.17 + optionalDependencies: + vite: 6.2.2(@types/node@24.0.13)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.85.1)(terser@5.39.0)(yaml@2.8.1) '@vitest/pretty-format@3.1.1': dependencies: @@ -14218,9 +14679,9 @@ snapshots: clean-stack@2.2.0: {} - clear-any-console@1.16.3(encoding@0.1.13)(react@18.3.1): + clear-any-console@1.16.3(encoding@0.1.13)(react@19.1.1): dependencies: - langbase: 1.1.44(encoding@0.1.13)(react@18.3.1) + langbase: 1.1.44(encoding@0.1.13)(react@19.1.1) transitivePeerDependencies: - encoding - react @@ -14249,10 +14710,10 @@ snapshots: slice-ansi: 5.0.0 string-width: 5.1.2 - cli-welcome@2.2.3(encoding@0.1.13)(react@18.3.1): + cli-welcome@2.2.3(encoding@0.1.13)(react@19.1.1): dependencies: chalk: 2.4.2 - clear-any-console: 1.16.3(encoding@0.1.13)(react@18.3.1) + clear-any-console: 1.16.3(encoding@0.1.13)(react@19.1.1) transitivePeerDependencies: - encoding - react @@ -14835,6 +15296,9 @@ snapshots: detect-libc@2.0.3: {} + detect-libc@2.1.1: + optional: true + detect-newline@3.1.0: {} detect-node-es@1.1.0: {} @@ -17073,6 +17537,9 @@ snapshots: - supports-color - ts-node + jiti@2.6.0: + optional: true + joplin-turndown-plugin-gfm@1.0.12: {} js-cookie@3.0.5: {} @@ -17200,14 +17667,14 @@ snapshots: kuler@2.0.0: {} - langbase@1.1.44(encoding@0.1.13)(react@18.3.1): + langbase@1.1.44(encoding@0.1.13)(react@19.1.1): dependencies: dotenv: 16.4.7 openai: 4.87.3(encoding@0.1.13)(zod@3.25.51) zod: 3.25.51 zod-validation-error: 3.4.0(zod@3.25.51) optionalDependencies: - react: 18.3.1 + react: 19.1.1 transitivePeerDependencies: - encoding - ws @@ -17255,6 +17722,52 @@ snapshots: process-warning: 4.0.1 set-cookie-parser: 2.7.1 + lightningcss-darwin-arm64@1.30.1: + optional: true + + lightningcss-darwin-x64@1.30.1: + optional: true + + lightningcss-freebsd-x64@1.30.1: + optional: true + + lightningcss-linux-arm-gnueabihf@1.30.1: + optional: true + + lightningcss-linux-arm64-gnu@1.30.1: + optional: true + + lightningcss-linux-arm64-musl@1.30.1: + optional: true + + lightningcss-linux-x64-gnu@1.30.1: + optional: true + + lightningcss-linux-x64-musl@1.30.1: + optional: true + + lightningcss-win32-arm64-msvc@1.30.1: + optional: true + + lightningcss-win32-x64-msvc@1.30.1: + optional: true + + lightningcss@1.30.1: + dependencies: + detect-libc: 2.1.1 + optionalDependencies: + lightningcss-darwin-arm64: 1.30.1 + lightningcss-darwin-x64: 1.30.1 + lightningcss-freebsd-x64: 1.30.1 + lightningcss-linux-arm-gnueabihf: 1.30.1 + lightningcss-linux-arm64-gnu: 1.30.1 + lightningcss-linux-arm64-musl: 1.30.1 + lightningcss-linux-x64-gnu: 1.30.1 + lightningcss-linux-x64-musl: 1.30.1 + lightningcss-win32-arm64-msvc: 1.30.1 + lightningcss-win32-x64-msvc: 1.30.1 + optional: true + lilconfig@2.1.0: {} lines-and-columns@1.2.4: {} @@ -18338,6 +18851,30 @@ snapshots: react: 18.3.1 react-i18next: 14.1.2(i18next@23.16.8)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + next-i18next@15.4.2(i18next@23.16.8)(next@14.2.32(@opentelemetry/api@1.9.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(sass@1.85.1))(react-i18next@14.1.2(i18next@23.16.8)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1): + dependencies: + '@babel/runtime': 7.26.10 + '@types/hoist-non-react-statics': 3.3.6 + core-js: 3.41.0 + hoist-non-react-statics: 3.3.2 + i18next: 23.16.8 + i18next-fs-backend: 2.6.0 + next: 14.2.32(@opentelemetry/api@1.9.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(sass@1.85.1) + react: 18.3.1 + react-i18next: 14.1.2(i18next@23.16.8)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + + next-i18next@15.4.2(i18next@23.16.8)(next@15.3.5(@opentelemetry/api@1.9.0)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(sass@1.85.1))(react-i18next@14.1.2(i18next@23.16.8)(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(react@19.1.1): + dependencies: + '@babel/runtime': 7.26.10 + '@types/hoist-non-react-statics': 3.3.6 + core-js: 3.41.0 + hoist-non-react-statics: 3.3.2 + i18next: 23.16.8 + i18next-fs-backend: 2.6.0 + next: 15.3.5(@opentelemetry/api@1.9.0)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(sass@1.85.1) + react: 19.1.1 + react-i18next: 14.1.2(i18next@23.16.8)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + next@14.2.32(@babel/core@7.26.10)(@opentelemetry/api@1.9.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(sass@1.85.1): dependencies: '@next/env': 14.2.32 @@ -18365,10 +18902,91 @@ snapshots: - '@babel/core' - babel-plugin-macros - nextjs-cors@2.2.0(next@14.2.32(@opentelemetry/api@1.9.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(sass@1.85.1)): + next@14.2.32(@opentelemetry/api@1.9.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(sass@1.85.1): + dependencies: + '@next/env': 14.2.32 + '@swc/helpers': 0.5.5 + busboy: 1.6.0 + caniuse-lite: 1.0.30001704 + graceful-fs: 4.2.11 + postcss: 8.4.31 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + styled-jsx: 5.1.1(@babel/core@7.26.10)(react@18.3.1) + optionalDependencies: + '@next/swc-darwin-arm64': 14.2.32 + '@next/swc-darwin-x64': 14.2.32 + '@next/swc-linux-arm64-gnu': 14.2.32 + '@next/swc-linux-arm64-musl': 14.2.32 + '@next/swc-linux-x64-gnu': 14.2.32 + '@next/swc-linux-x64-musl': 14.2.32 + '@next/swc-win32-arm64-msvc': 14.2.32 + '@next/swc-win32-ia32-msvc': 14.2.32 + '@next/swc-win32-x64-msvc': 14.2.32 + '@opentelemetry/api': 1.9.0 + sass: 1.85.1 + transitivePeerDependencies: + - '@babel/core' + - babel-plugin-macros + + next@14.2.32(@opentelemetry/api@1.9.0)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(sass@1.85.1): + dependencies: + '@next/env': 14.2.32 + '@swc/helpers': 0.5.5 + busboy: 1.6.0 + caniuse-lite: 1.0.30001704 + graceful-fs: 4.2.11 + postcss: 8.4.31 + react: 19.1.1 + react-dom: 19.1.1(react@19.1.1) + styled-jsx: 5.1.1(react@19.1.1) + optionalDependencies: + '@next/swc-darwin-arm64': 14.2.32 + '@next/swc-darwin-x64': 14.2.32 + '@next/swc-linux-arm64-gnu': 14.2.32 + '@next/swc-linux-arm64-musl': 14.2.32 + '@next/swc-linux-x64-gnu': 14.2.32 + '@next/swc-linux-x64-musl': 14.2.32 + '@next/swc-win32-arm64-msvc': 14.2.32 + '@next/swc-win32-ia32-msvc': 14.2.32 + '@next/swc-win32-x64-msvc': 14.2.32 + '@opentelemetry/api': 1.9.0 + sass: 1.85.1 + transitivePeerDependencies: + - '@babel/core' + - babel-plugin-macros + + next@15.3.5(@opentelemetry/api@1.9.0)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(sass@1.85.1): + dependencies: + '@next/env': 15.3.5 + '@swc/counter': 0.1.3 + '@swc/helpers': 0.5.15 + busboy: 1.6.0 + caniuse-lite: 1.0.30001704 + postcss: 8.4.31 + react: 19.1.1 + react-dom: 19.1.1(react@19.1.1) + styled-jsx: 5.1.6(react@19.1.1) + optionalDependencies: + '@next/swc-darwin-arm64': 15.3.5 + '@next/swc-darwin-x64': 15.3.5 + '@next/swc-linux-arm64-gnu': 15.3.5 + '@next/swc-linux-arm64-musl': 15.3.5 + '@next/swc-linux-x64-gnu': 15.3.5 + '@next/swc-linux-x64-musl': 15.3.5 + '@next/swc-win32-arm64-msvc': 15.3.5 + '@next/swc-win32-x64-msvc': 15.3.5 + '@opentelemetry/api': 1.9.0 + sass: 1.85.1 + sharp: 0.34.4 + transitivePeerDependencies: + - '@babel/core' + - babel-plugin-macros + + nextjs-cors@2.2.0(next@14.2.32(@opentelemetry/api@1.9.0)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(sass@1.85.1)): dependencies: cors: 2.8.5 - next: 14.2.32(@babel/core@7.26.10)(@opentelemetry/api@1.9.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(sass@1.85.1) + next: 14.2.32(@opentelemetry/api@1.9.0)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(sass@1.85.1) node-abi@3.74.0: dependencies: @@ -19084,6 +19702,11 @@ snapshots: react: 18.3.1 scheduler: 0.23.2 + react-dom@19.1.1(react@19.1.1): + dependencies: + react: 19.1.1 + scheduler: 0.26.0 + react-error-boundary@3.1.4(react@18.3.1): dependencies: '@babel/runtime': 7.26.10 @@ -19116,6 +19739,15 @@ snapshots: optionalDependencies: react-dom: 18.3.1(react@18.3.1) + react-i18next@14.1.2(i18next@23.16.8)(react-dom@19.1.1(react@19.1.1))(react@19.1.1): + dependencies: + '@babel/runtime': 7.26.10 + html-parse-stringify: 3.0.1 + i18next: 23.16.8 + react: 19.1.1 + optionalDependencies: + react-dom: 19.1.1(react@19.1.1) + react-is@16.13.1: {} react-is@17.0.2: {} @@ -19224,6 +19856,8 @@ snapshots: dependencies: loose-envify: 1.4.0 + react@19.1.1: {} + reactflow@11.11.4(@types/react@18.3.1)(immer@9.0.21)(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: '@reactflow/background': 11.3.14(@types/react@18.3.1)(immer@9.0.21)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) @@ -19619,6 +20253,8 @@ snapshots: dependencies: loose-envify: 1.4.0 + scheduler@0.26.0: {} + schema-utils@3.3.0: dependencies: '@types/json-schema': 7.0.15 @@ -19738,6 +20374,36 @@ snapshots: setprototypeof@1.2.0: {} + sharp@0.34.4: + dependencies: + '@img/colour': 1.0.0 + detect-libc: 2.1.1 + semver: 7.7.2 + optionalDependencies: + '@img/sharp-darwin-arm64': 0.34.4 + '@img/sharp-darwin-x64': 0.34.4 + '@img/sharp-libvips-darwin-arm64': 1.2.3 + '@img/sharp-libvips-darwin-x64': 1.2.3 + '@img/sharp-libvips-linux-arm': 1.2.3 + '@img/sharp-libvips-linux-arm64': 1.2.3 + '@img/sharp-libvips-linux-ppc64': 1.2.3 + '@img/sharp-libvips-linux-s390x': 1.2.3 + '@img/sharp-libvips-linux-x64': 1.2.3 + '@img/sharp-libvips-linuxmusl-arm64': 1.2.3 + '@img/sharp-libvips-linuxmusl-x64': 1.2.3 + '@img/sharp-linux-arm': 0.34.4 + '@img/sharp-linux-arm64': 0.34.4 + '@img/sharp-linux-ppc64': 0.34.4 + '@img/sharp-linux-s390x': 0.34.4 + '@img/sharp-linux-x64': 0.34.4 + '@img/sharp-linuxmusl-arm64': 0.34.4 + '@img/sharp-linuxmusl-x64': 0.34.4 + '@img/sharp-wasm32': 0.34.4 + '@img/sharp-win32-arm64': 0.34.4 + '@img/sharp-win32-ia32': 0.34.4 + '@img/sharp-win32-x64': 0.34.4 + optional: true + shebang-command@2.0.0: dependencies: shebang-regex: 3.0.0 @@ -20043,6 +20709,16 @@ snapshots: optionalDependencies: '@babel/core': 7.26.10 + styled-jsx@5.1.1(react@19.1.1): + dependencies: + client-only: 0.0.1 + react: 19.1.1 + + styled-jsx@5.1.6(react@19.1.1): + dependencies: + client-only: 0.0.1 + react: 19.1.1 + stylis@4.2.0: {} stylis@4.3.6: {} @@ -20440,6 +21116,9 @@ snapshots: undici-types@6.19.8: {} + undici-types@7.8.0: + optional: true + unherit@1.1.3: dependencies: inherits: 2.0.4 @@ -20586,10 +21265,10 @@ snapshots: optionalDependencies: '@types/react': 18.3.1 - use-context-selector@1.4.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2): + use-context-selector@1.4.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.26.0): dependencies: react: 18.3.1 - scheduler: 0.23.2 + scheduler: 0.26.0 optionalDependencies: react-dom: 18.3.1(react@18.3.1) @@ -20701,13 +21380,13 @@ snapshots: d3-time: 3.1.0 d3-timer: 3.0.1 - vite-node@1.6.1(@types/node@20.17.24)(sass@1.85.1)(terser@5.39.0): + vite-node@1.6.1(@types/node@24.0.13)(lightningcss@1.30.1)(sass@1.85.1)(terser@5.39.0): dependencies: cac: 6.7.14 debug: 4.4.1 pathe: 1.1.2 picocolors: 1.1.1 - vite: 5.4.14(@types/node@20.17.24)(sass@1.85.1)(terser@5.39.0) + vite: 5.4.14(@types/node@24.0.13)(lightningcss@1.30.1)(sass@1.85.1)(terser@5.39.0) transitivePeerDependencies: - '@types/node' - less @@ -20719,13 +21398,13 @@ snapshots: - supports-color - terser - vite-node@3.1.1(@types/node@20.17.24)(sass@1.85.1)(terser@5.39.0): + vite-node@3.1.1(@types/node@20.17.24)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.85.1)(terser@5.39.0)(yaml@2.8.1): dependencies: cac: 6.7.14 debug: 4.4.0 es-module-lexer: 1.6.0 pathe: 2.0.3 - vite: 6.2.2(@types/node@20.17.24)(sass@1.85.1)(terser@5.39.0) + vite: 6.2.2(@types/node@20.17.24)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.85.1)(terser@5.39.0)(yaml@2.8.1) transitivePeerDependencies: - '@types/node' - jiti @@ -20740,18 +21419,40 @@ snapshots: - tsx - yaml - vite@5.4.14(@types/node@20.17.24)(sass@1.85.1)(terser@5.39.0): + vite-node@3.1.1(@types/node@24.0.13)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.85.1)(terser@5.39.0)(yaml@2.8.1): + dependencies: + cac: 6.7.14 + debug: 4.4.0 + es-module-lexer: 1.6.0 + pathe: 2.0.3 + vite: 6.2.2(@types/node@24.0.13)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.85.1)(terser@5.39.0)(yaml@2.8.1) + transitivePeerDependencies: + - '@types/node' + - jiti + - less + - lightningcss + - sass + - sass-embedded + - stylus + - sugarss + - supports-color + - terser + - tsx + - yaml + + vite@5.4.14(@types/node@24.0.13)(lightningcss@1.30.1)(sass@1.85.1)(terser@5.39.0): dependencies: esbuild: 0.21.5 postcss: 8.5.3 rollup: 4.35.0 optionalDependencies: - '@types/node': 20.17.24 + '@types/node': 24.0.13 fsevents: 2.3.3 + lightningcss: 1.30.1 sass: 1.85.1 terser: 5.39.0 - vite@6.2.2(@types/node@20.17.24)(sass@1.85.1)(terser@5.39.0): + vite@6.2.2(@types/node@20.17.24)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.85.1)(terser@5.39.0)(yaml@2.8.1): dependencies: esbuild: 0.25.1 postcss: 8.5.3 @@ -20759,10 +21460,27 @@ snapshots: optionalDependencies: '@types/node': 20.17.24 fsevents: 2.3.3 + jiti: 2.6.0 + lightningcss: 1.30.1 sass: 1.85.1 terser: 5.39.0 + yaml: 2.8.1 - vitest@1.6.1(@types/node@20.17.24)(sass@1.85.1)(terser@5.39.0): + vite@6.2.2(@types/node@24.0.13)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.85.1)(terser@5.39.0)(yaml@2.8.1): + dependencies: + esbuild: 0.25.1 + postcss: 8.5.3 + rollup: 4.35.0 + optionalDependencies: + '@types/node': 24.0.13 + fsevents: 2.3.3 + jiti: 2.6.0 + lightningcss: 1.30.1 + sass: 1.85.1 + terser: 5.39.0 + yaml: 2.8.1 + + vitest@1.6.1(@types/node@24.0.13)(lightningcss@1.30.1)(sass@1.85.1)(terser@5.39.0): dependencies: '@vitest/expect': 1.6.1 '@vitest/runner': 1.6.1 @@ -20781,11 +21499,11 @@ snapshots: strip-literal: 2.1.1 tinybench: 2.9.0 tinypool: 0.8.4 - vite: 5.4.14(@types/node@20.17.24)(sass@1.85.1)(terser@5.39.0) - vite-node: 1.6.1(@types/node@20.17.24)(sass@1.85.1)(terser@5.39.0) + vite: 5.4.14(@types/node@24.0.13)(lightningcss@1.30.1)(sass@1.85.1)(terser@5.39.0) + vite-node: 1.6.1(@types/node@24.0.13)(lightningcss@1.30.1)(sass@1.85.1)(terser@5.39.0) why-is-node-running: 2.3.0 optionalDependencies: - '@types/node': 20.17.24 + '@types/node': 24.0.13 transitivePeerDependencies: - less - lightningcss @@ -20796,10 +21514,10 @@ snapshots: - supports-color - terser - vitest@3.1.1(@types/debug@4.1.12)(@types/node@20.17.24)(sass@1.85.1)(terser@5.39.0): + vitest@3.1.1(@types/debug@4.1.12)(@types/node@20.17.24)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.85.1)(terser@5.39.0)(yaml@2.8.1): dependencies: '@vitest/expect': 3.1.1 - '@vitest/mocker': 3.1.1(vite@6.2.2(@types/node@20.17.24)(sass@1.85.1)(terser@5.39.0)) + '@vitest/mocker': 3.1.1(vite@6.2.2(@types/node@20.17.24)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.85.1)(terser@5.39.0)(yaml@2.8.1)) '@vitest/pretty-format': 3.1.1 '@vitest/runner': 3.1.1 '@vitest/snapshot': 3.1.1 @@ -20815,8 +21533,8 @@ snapshots: tinyexec: 0.3.2 tinypool: 1.0.2 tinyrainbow: 2.0.0 - vite: 6.2.2(@types/node@20.17.24)(sass@1.85.1)(terser@5.39.0) - vite-node: 3.1.1(@types/node@20.17.24)(sass@1.85.1)(terser@5.39.0) + vite: 6.2.2(@types/node@20.17.24)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.85.1)(terser@5.39.0)(yaml@2.8.1) + vite-node: 3.1.1(@types/node@20.17.24)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.85.1)(terser@5.39.0)(yaml@2.8.1) why-is-node-running: 2.3.0 optionalDependencies: '@types/debug': 4.1.12 @@ -20835,6 +21553,45 @@ snapshots: - tsx - yaml + vitest@3.1.1(@types/debug@4.1.12)(@types/node@24.0.13)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.85.1)(terser@5.39.0)(yaml@2.8.1): + dependencies: + '@vitest/expect': 3.1.1 + '@vitest/mocker': 3.1.1(vite@6.2.2(@types/node@24.0.13)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.85.1)(terser@5.39.0)(yaml@2.8.1)) + '@vitest/pretty-format': 3.1.1 + '@vitest/runner': 3.1.1 + '@vitest/snapshot': 3.1.1 + '@vitest/spy': 3.1.1 + '@vitest/utils': 3.1.1 + chai: 5.2.0 + debug: 4.4.0 + expect-type: 1.2.0 + magic-string: 0.30.17 + pathe: 2.0.3 + std-env: 3.8.1 + tinybench: 2.9.0 + tinyexec: 0.3.2 + tinypool: 1.0.2 + tinyrainbow: 2.0.0 + vite: 6.2.2(@types/node@24.0.13)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.85.1)(terser@5.39.0)(yaml@2.8.1) + vite-node: 3.1.1(@types/node@24.0.13)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.85.1)(terser@5.39.0)(yaml@2.8.1) + why-is-node-running: 2.3.0 + optionalDependencies: + '@types/debug': 4.1.12 + '@types/node': 24.0.13 + transitivePeerDependencies: + - jiti + - less + - lightningcss + - msw + - sass + - sass-embedded + - stylus + - sugarss + - supports-color + - terser + - tsx + - yaml + void-elements@3.1.0: {} vue@3.5.13(typescript@5.8.2): @@ -21061,6 +21818,9 @@ snapshots: yaml@2.3.1: {} + yaml@2.8.1: + optional: true + yargs-parser@18.1.3: dependencies: camelcase: 5.3.1 @@ -21112,7 +21872,7 @@ snapshots: yocto-queue@1.2.0: {} - zhlint@0.7.4(@types/node@20.17.24)(sass@1.85.1)(terser@5.39.0)(typescript@5.8.2): + zhlint@0.7.4(@types/node@24.0.13)(lightningcss@1.30.1)(sass@1.85.1)(terser@5.39.0)(typescript@5.8.2): dependencies: chalk: 4.1.2 glob: 10.4.5 @@ -21121,7 +21881,7 @@ snapshots: remark-frontmatter: 1.3.3 remark-parse: 7.0.2 unified: 8.4.2 - vitest: 1.6.1(@types/node@20.17.24)(sass@1.85.1)(terser@5.39.0) + vitest: 1.6.1(@types/node@24.0.13)(lightningcss@1.30.1)(sass@1.85.1)(terser@5.39.0) vue: 3.5.13(typescript@5.8.2) transitivePeerDependencies: - '@edge-runtime/vm' diff --git a/projects/app/.env.template b/projects/app/.env.template index 2098eda47..308209973 100644 --- a/projects/app/.env.template +++ b/projects/app/.env.template @@ -21,18 +21,18 @@ HIDE_CHAT_COPYRIGHT_SETTING= # Service url # 商业版地址 -PRO_URL= +# PRO_URL= # Plugin -PLUGIN_BASE_URL= -PLUGIN_TOKEN= +PLUGIN_BASE_URL=http://localhost:3003 +PLUGIN_TOKEN=token # code sandbox url -SANDBOX_URL=http://localhost:3001 +SANDBOX_URL=http://localhost:3002 # ai proxy api -AIPROXY_API_ENDPOINT=https://xxx.come -AIPROXY_API_TOKEN=xxxxx +AIPROXY_API_ENDPOINT=https://localhost:3010 +AIPROXY_API_TOKEN=aiproxy # OpenAI Base URL -OPENAI_BASE_URL=https://api.openai.com/v1 -CHAT_API_KEY=sk-xxxx +# OPENAI_BASE_URL=https://api.openai.com/v1 +# CHAT_API_KEY=sk-xxxx # S3 Config S3_EXTERNAL_BASE_URL= @@ -43,19 +43,19 @@ S3_ACCESS_KEY=minioadmin S3_SECRET_KEY=minioadmin S3_PLUGIN_BUCKET=fastgpt-plugin # 插件文件存储bucket # Redis URL -REDIS_URL=redis://default:password@127.0.0.1:6379 +REDIS_URL=redis://default:mypassword@127.0.0.1:6379 # mongo 数据库连接参数,本地开发连接远程数据库时,可能需要增加 directConnection=true 参数,才能连接上。 -MONGODB_URI=mongodb://username:password@0.0.0.0:27017/fastgpt?authSource=admin +MONGODB_URI="mongodb://myusername:mypassword@localhost:27017/fastgpt?authSource=admin&directConnection=true" # 日志库 -MONGODB_LOG_URI=mongodb://username:password@0.0.0.0:27017/fastgpt?authSource=admin +MONGODB_LOG_URI="mongodb://myusername:mypassword@localhost:27017/fastgpt?authSource=admin&directConnection=true" # 向量库优先级: pg > oceanbase > milvus # PG 向量库连接参数 -PG_URL=postgresql://username:password@host:port/postgres +PG_URL=postgresql://username:password@localhost:5432/postgres # OceanBase 向量库连接参数 -OCEANBASE_URL= -# milvus 向量库连接参数 -MILVUS_ADDRESS= -MILVUS_TOKEN= +# OCEANBASE_URL= +# # milvus 向量库连接参数 +# MILVUS_ADDRESS= +# MILVUS_TOKEN= # 页面的地址,用于自动补全相对路径资源的 domain,注意后面不要跟 / @@ -106,4 +106,4 @@ CONFIG_JSON_PATH= # # 日志推送间隔 # CHAT_LOG_INTERVAL=10000 # # 日志来源ID前缀 -# CHAT_LOG_SOURCE_ID_PREFIX=fastgpt- \ No newline at end of file +# CHAT_LOG_SOURCE_ID_PREFIX=fastgpt-