如何在服务器上部署自己的AI


使用项目

感谢以下两个项目:
FastGPT

one-api

以及我个人使用下来是需要一台2048MB左右内存的机器会体验舒服不少。

前期准备(可选)

Azure

我现在主力使用的还是Azure的免费Deepseek-R1,需要进入到对应项目的概述栏,获取对应的密钥和Endpoint即可。

需要参数

火山引擎

字节的api可以联网确实不戳,所以也用。需要三个参数,model,api-key以及endpointmodelendpoint是进入到你新建的联网应用中,点击API调用指南,第一个红框即为endpoint,第二个为你的model

需要参数

构建FastGPT

我个人为了方便备份,使用的是dockerdocker-compose.yml如下:

# 数据库的默认账号和密码仅首次运行时设置有效
# 如果修改了账号密码,记得改数据库和项目连接参数,别只改一处~
# 该配置文件只是给快速启动,测试使用。正式使用,记得务必修改账号密码,以及调整合适的知识库参数,共享内存等。
# 如何无法访问 dockerhub 和 git,可以用阿里云(阿里云没有arm包)

version: '3.3'
services:
  # db
  pg:
    image: pgvector/pgvector:0.7.0-pg15 # docker hub
    # image: registry.cn-hangzhou.aliyuncs.com/fastgpt/pgvector:v0.7.0 # 阿里云
    container_name: pg
    restart: always
    ports: # 生产环境建议不要暴露
      - 5432:5432
    networks:
      - fastgpt
    environment:
      # 这里的配置只有首次运行生效。修改后,重启镜像是不会生效的。需要把持久化数据删除再重启,才有效果
      - POSTGRES_USER=username
      - POSTGRES_PASSWORD=password
      - POSTGRES_DB=postgres
    volumes:
      - ./pg/data:/var/lib/postgresql/data
  mongo:
    image: mongo:5.0.18 # dockerhub
    # image: registry.cn-hangzhou.aliyuncs.com/fastgpt/mongo:5.0.18 # 阿里云
    # image: mongo:4.4.29 # cpu不支持AVX时候使用
    container_name: mongo
    restart: always
    ports:
      - 27017:27017
    networks:
      - fastgpt
    command: mongod --keyFile /data/mongodb.key --replSet rs0
    environment:
      - MONGO_INITDB_ROOT_USERNAME=myusername
      - MONGO_INITDB_ROOT_PASSWORD=mypassword
    volumes:
      - ./mongo/data:/data/db
    entrypoint:
      - bash
      - -c
      - |
        openssl rand -base64 128 > /data/mongodb.key
        chmod 400 /data/mongodb.key
        chown 999:999 /data/mongodb.key
        echo 'const isInited = rs.status().ok === 1
        if(!isInited){
          rs.initiate({
              _id: "rs0",
              members: [
                  { _id: 0, host: "mongo:27017" }
              ]
          })
        }' > /data/initReplicaSet.js
        # 启动MongoDB服务
        exec docker-entrypoint.sh "$$@" &

        # 等待MongoDB服务启动
        until mongo -u myusername -p mypassword --authenticationDatabase admin --eval "print('waited for connection')" > /dev/null 2>&1; do
          echo "Waiting for MongoDB to start..."
          sleep 2
        done

        # 执行初始化副本集的脚本
        mongo -u myusername -p mypassword --authenticationDatabase admin /data/initReplicaSet.js

        # 等待docker-entrypoint.sh脚本执行的MongoDB服务进程
        wait $$!

  # fastgpt
  sandbox:
    container_name: sandbox
    image: ghcr.io/labring/fastgpt-sandbox:v4.8.21-fix # git
    # image: registry.cn-hangzhou.aliyuncs.com/fastgpt/fastgpt-sandbox:v4.8.21-fix # 阿里云
    networks:
      - fastgpt
    restart: always
  fastgpt:
    container_name: fastgpt
    image: ghcr.io/labring/fastgpt:v4.8.21-fix # git
    # image: registry.cn-hangzhou.aliyuncs.com/fastgpt/fastgpt:v4.8.21-fix # 阿里云
    ports:
      # 对外暴露端口为3001,自行修改
      - 3001:3000
    networks:
      - fastgpt
    depends_on:
      - mongo
      - pg
      - sandbox
    restart: always
    environment:
      # 前端访问地址: http://localhost:3000
      - FE_DOMAIN=
      # root 密码,用户名为: root。如果需要修改 root 密码,直接修改这个环境变量,并重启即可。
      - DEFAULT_ROOT_PSW=password
      # AI模型的API地址哦。务必加 /v1。这里默认填写了OneApi的访问地址。
      - OPENAI_BASE_URL=https://localhost:1111
      # AI模型的API Key。(这里默认填写了OneAPI的快速默认key,测试通后,务必及时修改)
      - CHAT_API_KEY=apikey
      # 数据库最大连接数
      - DB_MAX_LINK=30
      # 登录凭证密钥
      - TOKEN_KEY=any
      # root的密钥,常用于升级时候的初始化请求
      - ROOT_KEY=root_key
      # 文件阅读加密
      - FILE_TOKEN_KEY=filetoken
      # MongoDB 连接参数. 用户名myusername,密码mypassword。
      - MONGODB_URI=mongodb://myusername:mypassword@mongo:27017/fastgpt?authSource=admin
      # pg 连接参数
      - PG_URL=postgresql://username:password@pg:5432/postgres
      # sandbox 地址
      - SANDBOX_URL=http://sandbox:3000
      # 日志等级: debug, info, warn, error
      - LOG_LEVEL=info
      - STORE_LOG_LEVEL=warn
      # 工作流最大运行次数
      - WORKFLOW_MAX_RUN_TIMES=1000
      # 批量执行节点,最大输入长度
      - WORKFLOW_MAX_LOOP_TIMES=100
      # 自定义跨域,不配置时,默认都允许跨域(多个域名通过逗号分割)
      - ALLOWED_ORIGINS=
      # 是否开启IP限制,默认不开启
      - USE_IP_LIMIT=false
    volumes:
      - ./config.json:/app/data/config.json

networks:
  fastgpt:

构建完毕之后进入web页面进行配置即可。

添加用户

官方为了推商业版,没有修改用户功能,只能自己手动了(悲)

首先是进入mongodb的镜像,先使用docker ps -a获取mongo的容器ID,然后使用docker exec -it 容器ID bash进入mongodb容器内。

进入之后运行如下命令,连接上数据库。

mongo --host localhost --port 27017 -u 你的mongodb用户名 -p 你的mongodb密码

然后运行show dbs,进入你的目标数据库use 你的目标数据库名。新建用户的代码如下

db.getCollection("users").insert({
    username: "username",
    password: "756bc47cb5215dc3329ca7e1f7be33a2dad68990bb94b76d90aa07f4e44a233a",  // 使用你的明文密码经过hash256加密两次之后的值,比如此处的示例就是1234经过两次hash256加密之后的值
    status: "active",
    promotionRate: NumberInt("15"),
    timezone: "Asia/Shanghai",
    createTime: new ISODate()
});

使用db.user.find()查询到你的新用户的ID,将值更新到下面新建团队的代码中

db.getCollection("teams").insert({
    name: "New Team",
    ownerId: ObjectId("151242132121412"), // 新用户的 _id
    avatar: "/icon/logo.svg", // 团队头像,根据需要调整
    createTime: new ISODate(),
    balance: NumberInt("100000"), // 初始团队余额,根据需要调整
    maxSize: NumberInt("10"), // 团队最大成员数,根据需要调整
    __v: NumberInt("0") // 版本号,根据实际情况调整
});

使用db.teams.find()查询到你的新团队的ID,将值更新到下面插入团队成员的代码中

db.getCollection("team_members").insert({
 
    teamId: ObjectId("67bdb4e14eb90198b9b7d6f4"), // 新团队的ID
    userId: ObjectId("67bdb4aa4eb90198b9b7d6f3"), // 新用户的 _id
    name: "Owner",
    role: "owner",
    status: "active",
    createTime: new ISODate(),
    defaultTeam: true
});

构建one-api

也是为了方便备份,使用docker+sqlite的组合,docker-compose.yml如下

version: '3.8'

services:
  one-api:
    image: justsong/one-api
    container_name: one-api
    restart: always
    ports:
      - "43155:3000"
    environment:
      TZ: Asia/Shanghai
    volumes:
      - /root/one-api:/data
    networks:
      # 如果fastgpt和one-api在同台服务器上走内网,则将下面的网络修改成和fastgpt一样的
      - fastgpt_fastgpt

networks:
  fastgpt_fastgpt:
    external: true

如果和我一样是想走内网,运行docker network inspect 你的网桥名称查看对应镜像的内网IP,然后调用的时候使用右边的3000端口而不是左边的43155端口即可。

oneapi的界面

添加Azure

类型选Azureendpoint格式为https://XXX.services.ai.azure.com/models/chat/completions#,一定要在后面带**#**;密钥填入对应的api-key即可。

oneapi的azure

配合FastGPT

FastGPT中填写的模型IDOne-API中的模型相等即可,重定向为:

{
	"你自己随便想的模型名": "endpoint识别的模型名"
}

然后去One-API的页面新建一个令牌,该令牌即可作为填入FastGPT的请求Key。请求地址则为http://你之前获取的oneapi的内网地址:3000/v1/chat/completions

备份与恢复备份

因为自己的配置比较多,怕服务器突然炸了就没了,所以糊了一个备份脚本。

首先在本地新建一个backup.conf,内容模板如下

# 基本配置
SOURCE_DIR="/root/fastgpt"        # 需要备份的目录
BACKUP_DIR="/root/tmp"            # 本地备份存储位置
RESTORE_DIR="/root/fastgpt"          # 默认恢复位置
RCLONE_REMOTE="rclone1"          # rclone 配置名称
CLOUD_DIR="backup"              # 云端存储路径

# 保留策略
LOCAL_RETENTION=3                # 本地保留天数
CLOUD_RETENTION=3                # 云端保留天数

# 日志配置
LOG_FILE="/var/log/backup_system.log"
MAX_LOG_SIZE=10485760            # 10MB 自动轮转

备份脚本backup.sh

#!/bin/bash
# 配置文件路径
CONFIG_FILE="/etc/backup.conf"

# 加载配置
source $CONFIG_FILE || { echo "配置文件错误"; exit 1; }

# 生成带校验码的文件名
generate_filename() {
    local checksum=$(find $SOURCE_DIR -type f -exec md5sum {} + | md5sum | cut -d' ' -f1)
    echo "backup_$(date +"%Y%m%d")_${checksum:0:8}.zip"
}

# 执行备份
do_backup() {
    echo "=== 开始备份 [$(date +'%Y-%m-%d %H:%M:%S')] ==="
    
    # 创建临时工作区
    local temp_dir=$(mktemp -d)
    
    # 生成文件名
    local backup_file=$(generate_filename)
    
    # 压缩文件(带进度显示)
    echo "压缩文件中..."
    cd "$SOURCE_DIR" && zip -rq $temp_dir/$backup_file . || {
        echo "压缩失败"; rm -rf $temp_dir; exit 2;
    }

    # 上传到云端
    echo "正在上传到 $RCLONE_REMOTE..."
    rclone copy $temp_dir/$backup_file $RCLONE_REMOTE:$CLOUD_DIR/ --progress && \
    mv $temp_dir/$backup_file $BACKUP_DIR/ || {
        echo "上传失败"; rm -rf $temp_dir; exit 3;
    }

    # 清理旧文件
    echo "清理本地旧备份..."
    find $BACKUP_DIR -name "*.zip" -mtime +$LOCAL_RETENTION -delete
    
    echo "清理云端旧备份..."
    rclone delete $RCLONE_REMOTE:$CLOUD_DIR/ --min-age $(($CLOUD_RETENTION * 1440))m -v --include "*.zip"

    # 清理临时文件
    rm -rf $temp_dir
    echo "=== 备份完成 [$(date +'%Y-%m-%d %H:%M:%S')] ==="
}

do_backup >> $LOG_FILE 2>&1

恢复脚本为

#!/bin/bash
# 配置文件路径
CONFIG_FILE="/root/backup.conf"
source $CONFIG_FILE

# 交互式选择恢复文件
select_file() {
    echo "正在获取云端备份列表..."
    mapfile -t cloud_files < <(rclone lsf $RCLONE_REMOTE:$CLOUD_DIR/ | grep ".zip$" | sort -r)
    
    [ ${#cloud_files[@]} -eq 0 ] && { echo "没有找到备份文件"; exit 1; }
    
    PS3="请选择要恢复的文件编号: "
    select file in "${cloud_files[@]}" "退出"; do
        case $REPLY in
            $(( ${#cloud_files[@]}+1 )) ) echo "退出"; exit 0 ;;
            *) [ -n "$file" ] && { selected_file=$file; break; } ;;
        esac
    done
}

# 执行恢复
do_restore() {
    echo "=== 开始恢复 ==="
    select_file
    
    read -p "输入本地恢复路径 [默认: $RESTORE_DIR]: " restore_path
    restore_path=${restore_path:-$RESTORE_DIR}
    mkdir -p "$restore_path"
    
    # 下载文件
    echo "正在下载 $selected_file ..."
    rclone copy "$RCLONE_REMOTE:$CLOUD_DIR/$selected_file" "$restore_path/"
    
    # 解压选项
    read -p "是否解压文件? [y/N]: " unzip_choice
    if [[ $unzip_choice =~ ^[Yy] ]]; then
        echo "正在解压到 $restore_path ..."
        unzip -o "$restore_path/$selected_file" -d "$restore_path" && \
        echo "解压完成" || echo "解压过程中出现错误"
    fi
    
    echo "恢复文件路径: $restore_path/$selected_file"
}

do_restore

成果展示

fastgpt1

fastgpt2

fastgpt3


文章作者: xieshang
版权声明: 本博客所有文章除特別声明外,均采用 CC BY-NC 4.0 许可协议。转载请注明来源 xieshang !
评论
  目录