搭建环境:
操作系统 RHEL 8.8

CPU 32
内存 96G
存储 1T
GPU V100DX-32Q

已完成GPU驱动

最终规划,本地Nginx作为枢纽进行权限控制,对外暴露端口采用80xx段,需要对外暴露端口的服务,仅对本地暴露90xx段,由Nginx将外部请求转发至本地90xx端口。

本文需要提前准备的介质包括:

  1. 配置好的红帽yum源
  2. docker的安装介质,rpm包
  3. NVIDIA Container Toolkit安装介质,rpm包
  4. Nginx源码、VTS模块源码
  5. Mrdoc源码、docker镜像
  6. 导出ollama模型

创建文件系统

为/var/lib/docker和/data创建200G的文件系统,/dev/datavg/lvcontainerd创建10G文件系统,剩余磁盘留作后续扩容使用。

pvcreate /dev/sdb
vgcreate datavg /dev/sdb
lvcreate -n lvcontainerd -L 10G datavg
lvcreate -n lvdocker -L 200G datavg
lvcreate -n lvdata -L 200G datavg
mkfs.xfs /dev/datavg/lvcontainerd
mkfs.xfs /dev/datavg/lvdocker 
echo -e "/dev/datavg/lvcontainerd\t/var/lib/containerd\txfs\tdefaults\t0\t0">>/etc/fstab
echo -e "/dev/datavg/lvdocker\t/var/lib/docker\txfs\tdefaults\t0\t0">>/etc/fstab
echo -e "/dev/datavg/lvdata\t/data\txfs\tdefaults\t0\t0">>/etc/fstab
mkdir /var/lib/containerd
mkdir /var/lib/docker
mount -a

安装docker

卸载旧版

dnf remove docker \
    docker-client \
    docker-client-latest \
    docker-common \
    docker-latest \
    docker-latest-logrotate \
    docker-logrotate \
    docker-engine \
    podman \
    runc

安装指定版本

安装准备好docker介质,包含下方rpm包
(下方文件名不完成,按照介质补全)

dnf install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

会从yum源额外安装comtainer-selinux

配置自启动

完成后执行systemctl enable --now docker完成docker和docker compose的安装,可执行docker versiondocker compose version进行检查

安装配置N卡runtime支持

安装NVIDIA Container Toolkit

安装准备好的nvidia-container-toolkit介质,包含下方rpm包,根据自己的版本号补充完整

dnf install -y nvidia-container-toolkit nvidia-container-toolkit-base libnvidia-container1 libnvdia-container-tools   

配置runtime

nvidia-ctk runtime configure --runtime=docker

完成后重启dockersystemctl restart docker

安装Nginx

安装nginx便于对本机的各类服务进行权限控制,不对外暴露

可参考Nginx编译安装过程记录安装。

配置完成后在Nginx.conf中配置client_max_body_size=200M使得支持大文件上传

安装MrDoc

配置MrDoc

一个支持markdown的开源站,用于展示图片。
首先导入镜像docker load -i zmister_mrdoc_v9.3.tar

创建运行目录,解压MrDoc介质并进入该目录

修改docker-compose.yml文件,增加name: mrdoc将监听端口修改为127.0.0.1:9086:10086,重启策略修改为unless-stopped

dns修改为宿主机的DNS,并追加时区配置

environment:
      - TZ=Asia/Shanghai

配置Nginx

Nginx配置文件新增http.d/mrdoc.conf

server{
    listen 8086;
    server_name _;
    
    location / {
    
        access_log logs/mrdoc_access.log main ;
        error_log logs/mrdoc_error.log ;
    
        proxy_pass http://mrdoc;
        proxy_http_version 1.1;
        proxy_set_header Connection "";
        
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header REMOTE-HOST $remote_addr;
        proxy_set_header X-Forwarded-Proto  $scheme;
        #Set Nginx Cache
        add_header Cache-Control no-cache;
        add_header X-Cache $upstream_cache_status;
        proxy_ignore_headers Set-Cookie Cache-Control expires;
        proxy_read_timeout 300;
        # 流式视频处理
        proxy_set_header Range $http_range;
        proxy_set_header If-Range $http_if_range;
        add_header X-Accel-Buffering no;

    }
    
    #Nginx托管静态资源
    location ^~ /static/ {
        alias /data/DCE/MrDoc/static/;
        expires 4h; # 设置浏览器和代理缓存过期时间
        access_log off; # 禁用静态资源的访问日志
        log_not_found off; # 禁用静态资源的文件未找到日志
        add_header Cache-Control "public, max-age=14400, must-revalidate"; # 明确缓存控制,并加入 revalidate
    
        # 优先服务预压缩的 .gz 文件,如果不存在则动态压缩
        gzip_static on; # 启用预压缩文件服务
        gzip on; # 如果没有预压缩文件,则启用动态压缩
        gzip_vary on;
        gzip_proxied any;
        gzip_comp_level 6;
        gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript image/svg+xml;

        # 启用文件句柄和元数据缓存
        open_file_cache max=1000 inactive=20s;
        open_file_cache_valid 30s;
        open_file_cache_min_uses 2;
        open_file_cache_errors on;
    }
}

upstream mrdoc{
    keepalive 32;
    keepalive_requests 1000;
    keepalive_timeout 60s;
    keepalive_time 10m;
    
    server 127.0.0.1:9086;

}

初始化Mrdoc

编辑在Mrdoc目录下的config/config.ini配置CSRF信任站,将自己站点的访问地址写入。

[csrf_origin]
allow = https://doc.mrdoc.pro,http://mrdoc.mrdoc.com,https://112.154.12.12

在Mrdoc目录下执行docker compose up -d启动容器

进入mrdoc容器,执行:

python manage.py makemigrations
python manage.py migrate
python manage.py createsuperuser

设置好超级管理员账号密码,然后访问IP:8086即可登录MrDoc开始使用。

安装Xinference

新建Xinference目录,创建docker-compose.yml

version: '3.8'
name: xinference # 明确指定 Compose 项目的名称

services:
  xinference: # 这里的 'xinference' 是服务名称
    image: xprobe/xinference:v1.6.1-cpu
    ports:
      - "127.0.0.1:9097:9997"
    volumes:
      - .:/data
    environment:
      - XINFERENCE_HOME=/data
    command: xinference-local -H 0.0.0.0
    restart: unless-stopped

配置Nginx代理http.d/xinference.conf

server{
listen 8097;
server_name _;
access_log logs/xinference_access.log main ;
error_log logs/xinference_error.log ;
location / {

    proxy_pass http://xinference;
    proxy_http_version 1.1;
    proxy_set_header Connection "";        
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
}

}

upstream xinference{
keepalive 32;
keepalive_requests 1000;
keepalive_timeout 60s;
keepalive_time 10m;

server 127.0.0.1:9097;

}

注册模型

根据前文映射的目录,将bge-reranker-v2-m3置于xinference容器的/data/Models/rerank目录下
docker exec进入容器
执行下方命令直接注册内建模型

xinference launch --model-type rerank --model_path /data/Models/rerank/bge-reranker-v2-m3 -n bge-reranker-v2-m3

即可使用该模型

安装Dify

调整基础配置

准备好Dify介质,进入dify的docker目录,准备基础环境变量文件mv .env.example .env,然后编辑该文件,修改下述值:

  • EXPOSE_NGINX_PORT从80改为127.0.0.1:9080,仅对本地暴露9080端口
  • UPLOAD_FILE_SIZE从15改为40,允许上传最大40M的文件
  • UPLOAD_FILE_BATCH_LIMIT从5改为10,允许批量上传10个文件
  • NGINX_CLIENT_MAX_BODY_SIZE从15M改为40M,适配上面最大的文件大小(最新版本默认为100M)
  • CODE_MAX_STRING_ARRAY_LENGTH从30改为200
  • CODE_MAX_OBJECT_ARRAY_LENGTH从30改为200
  • CODE_MAX_NUMBER_ARRAY_LENGTH从1000改为2000以增加最大迭代轮数

修改docker/nginx/conf.d/default.conf.template,增加一段,使得用户的图片请求直接转发至Mrdoc

location /media {
  proxy_pass http://IP:9086;
  include proxy.conf;
}

然后编辑docker-compose.yaml,在service前增加name: dify-0.15.3,注释掉ECPOSE_NGINX_SSL_PORT那行

然后可以执行docker compose -f docker-compose.yml config | grep image检查需要哪些镜像,进行导入
完成后执行docker compose up -d启动容器

然后配置nginx,dify.conf:

server{
listen 8080;
server_name _;
access_log logs/dify_access.log main ;
error_log logs/dify_error.log ;
location / {

    proxy_pass http://dify;
    proxy_http_version 1.1;
    proxy_set_header Connection "";        
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
}

}

upstream dify{
keepalive 32;
keepalive_requests 1000;
keepalive_timeout 60s;
keepalive_time 10m;

server 127.0.0.1:9080;

}

完成后即可访问IP:8080开始使用

安装Ollama

Ollama不适合在企业场景下使用,但一些特殊场景需求而临时安装,要做好权限控制

新建ollama目录,创建docker-compose.yml

version: '3.8'
name: ollama # 明确指定 Compose 项目的名称

services:
  ollama: # 这里的 'xinference' 是服务名称
    image: ollama/ollama:v0.9.0
    shm_size: "4g"
    deploy:
      resources:
        reservations:
          devices:
            - driver: nvidia
              count: all
              capabilities: [gpu]
    ports:
      - "127.0.0.1:9097:11434"
    volumes:
      - ${PWD}:/data
    environment:
      - XINFERENCE_HOME=/data
    restart: unless-stopped

然后导入准备好的GGUF文件到/data/GGUF,准备下述下本,拉起ollama,并进入容器的/data目录下执行

执行

cd /data/GGUF
for f in *.gguf; do
  MODULE=$(basename "$f" .gguf)
  echo "正在为 $MODULE 创建 Ollama 模型..."
  ollama create "$MODULE" -f "$MODULE".modelfile
done

安装coze

准备好opencoze介质,进入coze的docker目录,准备基础环境变量文件mv .env.example .env,然后编辑该文件,修改下述值:

作者 Assaultcore

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注