NAS自托管部署AI知识库

#software

我想把现在的相关知识都塞到知识库中,然后用DeepSeek来查询,并且解析到固定的格式里。看了一下现在腾讯、阿里、字节做到大模型平台都有知识库的功能。

但是,因为知识库往往涉及了私密文件,最好还是进行自托管。

🤪一个纠结的点是,虽然我可以把文件本地保存,但我的硬件没有可能部署满血的DeepSeek,最终仍然会与第三方服务器进行数据交换🤪。

那么,就先不管这个事了,毕竟使用线上平台,还是有不少限制的(自我安慰)。

平台选择

优先选择开源的可以自托管部署的平台。最终入围的是Difyn8nFastGPT。这三者都是使用云端版收费(有免费限额方案),然后使用社区版免费的模式。

我都尝试使用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=