NAS自托管部署AI知识库
#software
我想把现在的相关知识都塞到知识库中,然后用DeepSeek来查询,并且解析到固定的格式里。看了一下现在腾讯、阿里、字节做到大模型平台都有知识库的功能。
但是,因为知识库往往涉及了私密文件,最好还是进行自托管。
🤪一个纠结的点是,虽然我可以把文件本地保存,但我的硬件没有可能部署满血的DeepSeek,最终仍然会与第三方服务器进行数据交换🤪。
那么,就先不管这个事了,毕竟使用线上平台,还是有不少限制的(自我安慰)。
平台选择
优先选择开源的可以自托管部署的平台。最终入围的是Dify、n8n、FastGPT。这三者都是使用云端版收费(有免费限额方案),然后使用社区版免费的模式。
我都尝试使用docker compose部署。
Dify
Dify应该是最多人用的(?),但是,官方提供的docker-compose文件又臭又长,内置了比较多的,我又用不上的功能(比方说nginx,用NAS的一般都有,会通过自部署的方案统一管理),但是我不太会改。
然后最终我没有部署成功。
n8n
镜像体积比较小,docker-compose清新很多。下面是我部署的文件。我是为了不拉取镜像因此用了postgres 15,官方是16。
n8n没有中文,界面很简单,可以复制其他人的json工作流,直接粘贴到自己的工作流画布中。但是,根据找到信息,说n8n需要搭配魔法环境,才会更好用。
version: '3.8'
services:
postgres:
image: postgres:15
container_name: n8n_postgres
environment:
POSTGRES_DB: postgres
POSTGRES_USER:
POSTGRES_PASSWORD:
TZ: Asiz/Shanghai
volumes:
- ./postgres_data:/var/lib/postgresql/data
networks:
- n8n_network
n8n:
image: n8nio/n8n:1.80.0
container_name: n8n
environment:
- DB_TYPE=postgresdb
- DB_POSTGRESDB_DATABASE=postgres
- DB_POSTGRESDB_HOST=postgres # 使用服务名作为主机名
- DB_POSTGRESDB_PORT=5432
- DB_POSTGRESDB_SCHEMA=public
- DB_POSTGRESDB_USER=
- DB_POSTGRESDB_PASSWORD=
- GENERIC_TIMEZONE=Asia/Shanghai
- N8N_ENCRYPTION_KEY=
- N8N_ENFORCE_SETTINGS_FILE_PERMISSIONS=true
- N8N_SECURE_COOKIE=false # 允许非https
ports:
- "5678:5678"
volumes:
- ./n8n_data:/home/node/.n8n
depends_on:
- postgres
networks:
- n8n_network
volumes:
postgres_data:
n8n_data:
networks:
n8n_network:
FastGPT
我部署的是pgvector的版本。老实说,官方提供的docker-compose,我没有跑通。
我修改了一下yaml,又把环境变量挪到.env,总算跑通了。可以修改fastgpt和openapi暴露在外部的端口。
中文界面,服务提供商的配置也比较清晰。但是缺少文生图的预设配置格式。
总体来说也够用,我预估会用这个。
version: '3.3'
services:
# PostgreSQL 数据库
pg:
image: pgvector/pgvector:0.7.0-pg15
container_name: pg
restart: always
networks:
- fastgpt
environment:
POSTGRES_USER: ${POSTGRES_USER}
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
POSTGRES_DB: ${POSTGRES_DB}
volumes:
- ./pg/data:/var/lib/postgresql/data
# MongoDB 数据库
mongo:
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: ${MONGO_USER}
MONGO_INITDB_ROOT_PASSWORD: ${MONGO_PASSWORD}
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
exec docker-entrypoint.sh "$$@" &
until mongo -u ${MONGO_USER} -p ${MONGO_PASSWORD} --authenticationDatabase admin --eval "print('waited for connection')" > /dev/null 2>&1; do
echo "Waiting for MongoDB to start..."
sleep 2
done
mongo -u ${MONGO_USER} -p ${MONGO_PASSWORD} --authenticationDatabase admin /data/initReplicaSet.js
wait $$!
# FastGPT Sandbox
sandbox:
container_name: sandbox
image: ghcr.io/labring/fastgpt-sandbox:v4.8.22
networks:
- fastgpt
restart: always
# FastGPT 主服务
fastgpt:
container_name: fastgpt
image: ghcr.io/labring/fastgpt:v4.8.22
ports:
- 3000:3000
networks:
- fastgpt
depends_on:
- mongo
- pg
- sandbox
restart: always
environment:
FE_DOMAIN: ${FE_DOMAIN}
DEFAULT_ROOT_PSW: ${DEFAULT_ROOT_PSW}
OPENAI_BASE_URL: http://oneapi:3000/v1
CHAT_API_KEY: ${CHAT_API_KEY}
DB_MAX_LINK: ${DB_MAX_LINK}
TOKEN_KEY: ${TOKEN_KEY}
ROOT_KEY: ${ROOT_KEY}
FILE_TOKEN_KEY: ${FILE_TOKEN_KEY}
MONGODB_URI: mongodb://${MONGO_USER}:${MONGO_PASSWORD}@mongo:27017/fastgpt?authSource=admin
PG_URL: postgresql://${POSTGRES_USER}:${POSTGRES_PASSWORD}@pg:5432/${POSTGRES_DB}
SANDBOX_URL: http://sandbox:3000
LOG_LEVEL: info
STORE_LOG_LEVEL: warn
WORKFLOW_MAX_RUN_TIMES: ${WORKFLOW_MAX_RUN_TIMES}
WORKFLOW_MAX_LOOP_TIMES: ${WORKFLOW_MAX_LOOP_TIMES}
ALLOWED_ORIGINS: ${ALLOWED_ORIGINS}
USE_IP_LIMIT: ${USE_IP_LIMIT}
# volumes:
# - ./config.json:/app/data/config.json
# MySQL 数据库(用于 OneAPI)
mysql:
image: mysql:8.0.36
container_name: mysql
restart: always
networks:
- fastgpt
command: --default-authentication-plugin=caching_sha2_password
environment:
MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}
MYSQL_DATABASE: oneapi
volumes:
- ./mysql:/var/lib/mysql
# OneAPI 服务
oneapi:
container_name: oneapi
image: ghcr.io/songquanpeng/one-api:v0.6.7
ports:
- 3001:3000
depends_on:
- mysql
networks:
- fastgpt
restart: always
environment:
SQL_DSN: root:${MYSQL_ROOT_PASSWORD}@tcp(mysql:3306)/oneapi
SESSION_SECRET: ${SESSION_SECRET}
MEMORY_CACHE_ENABLED: true
BATCH_UPDATE_ENABLED: true
BATCH_UPDATE_INTERVAL: 10
INITIAL_ROOT_TOKEN: ${INITIAL_ROOT_TOKEN}
volumes:
- ./oneapi:/data
networks:
fastgpt:
下面是我的.env文件
# PostgreSQL 配置
POSTGRES_USER=
POSTGRES_PASSWORD=
POSTGRES_DB=postgres
# MongoDB 配置
MONGO_USER=
MONGO_PASSWORD=
# FastGPT 配置
FE_DOMAIN=
DEFAULT_ROOT_PSW=
CHAT_API_KEY=sk-fastgpt
DB_MAX_LINK=30
TOKEN_KEY=any
ROOT_KEY=root_key
FILE_TOKEN_KEY=
WORKFLOW_MAX_RUN_TIMES=1000
WORKFLOW_MAX_LOOP_TIMES=100
ALLOWED_ORIGINS=
USE_IP_LIMIT=false
# MySQL 配置
MYSQL_ROOT_PASSWORD=
# OneAPI 配置
SESSION_SECRET=
INITIAL_ROOT_TOKEN=