超详细喂饭版!linux/openeuler部署Qwen3-32B等大模型华为昇腾Arm架构服务器anaconda+modelscope+mindie+docker等+openwebui可视化前端界面

1. 基础环境配置

1.1 anaconda安装

系统:openeuler22.03(CentOs)

架构:arrch64

anaconda对应安装资源包下载地址:

Index of /archivehttps://repo.anaconda.com/archive/

下载好后cd到安装包路径,使用安装指令如下:

bash Anaconda3-2025.06-1-Linux-aarch64.sh

按照提示接受协议,并选择安装目录。安装完成后,更新环境变量:

source ~/.bashrc

1.2 anconda中创建虚拟环境

这部分同windows下的anconda env设置相同。

对于Qwen3模型的下载,配置modelscope环境,代码如下:

#创建新环境,环境名为modelscope conda create -n modelscope python=3.9#这里必须使用python3.9及以上版本,否则在后续下载编译modelscope或者qwen3模型时,会提示no moudle named zoneinfo,因为只有3.9以上的该模型才被假如系统模型库 #激活环境 conda activate modelscope 

安装modelscope

pip install modelscope -i https://mirrors.aliyun.com/pypi/simple/ #使用阿里镜像源,下载更快 

2. 下载模型库和模型权重

2.1 下载模型权重

如需下载完整模型库: modelscope download --model Qwen/Qwen3-32B (只需要下载部分文件:modelscope download --model Qwen/Qwen3-32B README.md --local_dir ./dir #例如下载readme到本地dir文件夹) 

*这种方法会把权重默认下载在路径~/.cache/modelscope/下,但是很有可能占用系统盘,影响系统使用,因此把权重下载到指定硬盘,步骤如下。

(1)搜索系统所有硬盘

lsblk -o NAME,SIZE,MOUNTPOINT 

输出如下,分别代表了硬盘名字,内存和地址:

NAME SIZE MOUNTPOINT sda 200G ├─sda1 50G / ├─sda2 150G /data sdb 500G /mnt/disk1 sdc 1T /mnt/disk2 

(2)把模型权重下载到指定的sdc盘中的models文件夹中(自己新建一个文件夹命名models,需要定位到指定文件夹路径,不要直接下到盘的路径,否则可能还是无法下载到指定盘中!),--local_dir后接本地需要下载到的文件夹路径位置;或者直接cd到需要下载位置的路径下在进行下载也可以!

modelscope download --model Qwen/Qwen3-32B --local_dir /mnt/disk2/models 

下载完成后,模型权重会放在/mnt/disk2/models/Qwen/Qwen3-32B/路径下

*删除之前默认下载地址的模型权重,以防占用系统内存:

全盘搜索Qwen3-32B的储存路径:

# 搜索包含 Qwen3-32B 的目录 sudo find / -type d -name "Qwen3-32B" 2>/dev/null

会输出包含该模型名字的目录路径,假如为/root/dir

删除该路径的模型权重

# 确认路径后再删除 rm -rf /root/dir

2.2 下载华为适配的加速推理引擎MindIE

下载模型适配的推理引擎MindIE,在terminal中输入以下命令行(魔乐社区镜像下载),即开始下载适配本模型Qwen3-32B的镜像包mindie:2.0.T17.B010-800I-A2-py3.11-openeuler24.03-lts-aarch64.tar.gz(也可以进入华为社区下载,MindIE 系列 昇腾计算 2.0.T17 软件补丁下载

wget https://modelers.cn/coderepo/web/v1/file/xieyuxiang/mindie_2.0.RC1_image/main/media/2.0.RC1-800I-A2-py311-openeuler24.03-lts.tar.gz

*!!注意:后续部署大模型时发现上述版本的mindie太老了!!服务挂不起来!!会一直报如下问题!!二更:一般提示如下问题且不报其他错误,log日志中也不提示其他问题报错记录的话,一般都是mindle镜像的原因!!报错后重新在docker中pull下镜像地址即可!

LLMInferEngine failed to init LLMInferModels Killed

因此需要下载新版本的mindie安装包后,后续即可正常使用!!

mindie镜像下载最新地址:

https://www.hiascend.com/developer/ascendhub/detail/af85b724a7e5469ebd7ea13c3439d48f 

选择所需镜像,点击“立即下载”(1.0.0及以后版本支持DeepSeekR1蒸馏模型):

立即下载后,会弹出:

我们使用的华为服务器是基于arm架构,因此用以下命令下载即可

docker pull --platform=arm64 swr.cn-south-1.myhuaweicloud.com/ascendhub/mindie:2.1.RC2-800I-A2-py311-openeuler24.03-lts

3. docker镜像加载

3.1 配置docker环境

环境:华为arm架构服务器

版本:openeuler22.03

先禁用/移除导致失败的第三方 repo(之前添加过 docker-ce 的镜像仓库),避免影响其他相关下载和更新,如果之前没有配置好DNS直接用repo不禁用的话,后续重新配置docker也可能会有各种报错!!因此优先推荐先禁用!

# 禁用 docker-ce 的 repo(通常是 docker-ce-stable) sudo dnf config-manager --set-disabled docker-ce-stable || true # 或者直接删除 repo 文件(如果你知道文件在哪里,例如 /etc/yum.repos.d/docker-ce.repo) sudo rm -f /etc/yum.repos.d/docker-ce* || true

(1) 更新下相关的dnf 下载包

sudo dnf update -y # 更新系统的软件包
*搜索是否dnf中有所需要的安装包/命令 dnf search yum-utils #yum-utils是包的名字,可替换为其他 

(2)确认目前系统版本

cat /etc/openEuler-release

若输出类似openEuler release 22.03 LTS的信息,则符合安装条件。

(3)卸载旧版本docker,避免版本冲突

yum remove -y docker docker-client docker-client-latest docker-common docker-latest docker-latest-logrotate docker-logrotate docker-engine

(4)配置DNS,保证网络和下载

编辑DNS配置文件:

vi /etc/resolv.conf

按i进入编辑模式,添加以下DNS服务器地址:

nameserver 114.114.114.114 # 国内通用DNS nameserver 8.8.8.8 # 谷歌公共DNS

    按Esc退出编辑,输入:wq保存并退出

    测试网络连接:

    ping www.baidu.com # 出现回显信息说明网络正常
    *注意:/etc/resolv.conf可能被 NetworkManager 自动覆盖,若后续网络异常,可通过网卡配置文件永久设置 DNS,步骤如下:

    *编辑网卡文件(如/etc/sysconfig/network-scripts/ifcfg-eth0),添加:

    DNS1=114.114.114.114 DNS2=8.8.8.8 保存后重启网络:systemctl restart network

    (5)配置docker仓库repo

    新建并编辑docker仓库repo配置文件

    vi /etc/yum.repos.d/docker-ce.repo

    添加以下内容,这里使用华为云镜像源加速:

    [docker-ce-stable] name=Docker CE Stable - $basearch baseurl=https://repo.huaweicloud.com/docker-ce/linux/centos/7/$basearch/stable enabled=1 gpgcheck=1 gpgkey=https://repo.huaweicloud.com/docker-ce/linux/centos/gpg

    输入:wq保存退出

    (6)安装docker组件

    更新yum缓存

    yum makecache # 生成元数据缓存,加快后续安装速度

    安装docker核心组件

    yum install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
    ❗ 常见问题:若安装时提示container-selinux依赖缺失,先执行以下命令安装依赖:
    yum install -y container-selinux

    (7)启动docker并验证状态

     系统中设置开机自启:

    systemctl enable docker # 避免系统重启后Docker需要手动启动

    系统中启动 Docker

    systemctl start docker

    验证安装版本:

    docker --version # 输出类似Docker version 24.0.7, build xxx的信息即正常

    查看运行状态:

    systemctl status docker # 显示active (running)说明服务正常运行

    *注意:systemctl设置好docker之后千万千万不要再随意动systemctl命令了!!比如systemctl stop docker之类的!!强制stop后可能引发系统问题无法直接通过systemctl restart docker!!设置好之后就基本不要再用systemctl指令操作docker了!血的教训!!

    错误描述:

    本来想停正在运行qwen3的docker的,手贱错误输入了systemctl stop docker,然后悲剧来了,无论是sudo systemctl restart docker/sudo systemctl start docker都不可以,system status docker一直显示failed。。。

    解决方案:临时清空 Docker 配置文件

    有时 Docker 的配置文件 /etc/docker/daemon.json 中的错误配置会导致启动失败。可以将该配置文件恢复到默认值(空配置),然后尝试重新启动 Docker。命令如下:

    sudo echo '{}' > /etc/docker/daemon.json 

    然后重启docker成功:

    sudo systemctl restart docker 
    如果配置文件中有语法错误或不兼容的设置,清空配置文件并重启应该能够解决问题。

     (8) docker镜像加速优化

    创建 Docker 配置文件:

    vi /etc/docker/daemon.json

    添加更多镜像源地址:

    { "registry-mirrors": [ "https://hub-mirror.c.163.com", # 网易镜像 "https://mirror.baidubce.com", # 百度镜像 "https://ccr.ccs.tencentyun.com", # 腾讯云镜像 "https://docker.1panelproxy.com", "https://5e96702d4787418295070cded678a7b6.mirror.swr.myhuaweicloud.com", "https://docker.m.daocloud.io", "https://docker.imgdb.de", "https://docker.wanpeng.life", "https://docker.1panel.live", "https://hk11.606166.xyz", "https://docker.1ms.run", "https://docker.domys.cc", "https://docker-0.unsee.tech", "https://docker.hlmirror.com", "https://cjie.eu.org", "https://hub.rat.dev", "https://docker.rainbond.cc" ] }

    重启docker使配置生效:

    systemctl daemon-reload systemctl restart docker

    (9)docker相关的启动/查询/删除等

    查看所有已经配置好的docker(包括运行和停止状态):

    docker ps -a #一定要加-a,不加-a则只能输出在运行状态的docker,无法输出已停止状态的 

    停止某正在运行的docker:

    docker stop qwen3-32b #qwen3-32b是docker name 

    删除某docker:

    #方法一:先停止运行后删除 docker stop qwen3-32b #先停止该docker docker rm qwen3-32b #删除docker #方法二:强制删除(无论是否运行) docker rm -f qwen3-32b 

    stop docker后,如需运行docker,需要重新启动后才可以继续使用docker exec -it contain_name bash进入容器::

    docker start qwen3-32b

    3.2  启动容器

    首先查询docker中的mindie镜像:

    docker images

    输出如下:


    红框中圈出的是新版本的mindie镜像,在下面的docker启动中需要用到。

    启动docker:

    docker run -it -d --shm-size 200g --net=host --name qwen3-32b \ #--shm-size表示共享内存大小 --name后面填写容器名 --privileged \ --device=/dev/davinci_manager \ #固定参数,用于访问华为固定设备,达芬奇芯片管理器 --device=/dev/hisi_hdc \ #固定参数,用于访问华为固定设备,海思芯片控制器 --device=/dev/devmm_svm \ #固定参数,用于访问固定设备,内存管理和虚拟机 --device=/dev/davinci0 \ #表示访问调用几个npu芯片,davinci0,davinci1....想调用几个npu芯片就可以设置几个,可以在系统中使用npu-smi info查看系统的npu情况 --device=/dev/davinci1 \ --device=/dev/davinci2 \ --device=/dev/davinci3 \ --device=/dev/davinci4 \ --device=/dev/davinci5 \ --device=/dev/davinci6 \ --device=/dev/davinci7 \ -v /usr/local/Ascend/driver:/usr/local/Ascend/driver \#固定参数,与 Ascend 相关的驱动文件夹,:前是主机地址,;后是容器中的地址(可自定义) -v /usr/local/sbin:/usr/local/sbin \#固定参数,系统的管理工具和二进制文件。:前是主机地址,;后是容器中的地址(可自定义) -v /path/to/model:/path/to/model/in/container \ #:前是主机中实际下载放置的模型路径,:后是要映射到容器中的路径(自定义),例如 -v /run/media/root/2c929422-a9a8-4a9f-a594-bbe16904232d/Qwen3:/data/Qwen3将主机中的模型映射到docker中的/data/Qwen3路径下 a4708118cd12 /bin/bash #a4708118cd12:对应mindie版本在docker image中的image id(也可以用TAG,都是同一个定位),最后用/bin/bash进行命令执行 

    修改权限:

    chown -R root:root /path-to-weights #path-to-weights替换为主机的模型权重路径;如果是非root账户安装,则将root:root改为1000:1000 chmod -R 750 /path-to-weights #path-to-weights替换为主机的模型权重路径 
    --user:如果您的环境中 HDK 是通过普通用户安装(如默认的 HwHiAiUser),请设置对应的用户组,例如用户组 ID 为 1001,则使用 --user mindieuser:1001;镜像中默认使用的是用户组 1000。
    设置容器名称 --name 与镜像名称,例如 800I A2 服务器使用 mindie:2.0.T17.B010-800I-A2-py3.11-openeuler24.03-lts-aarch64。

    3.3 进入容器:

    docker exec -it qwen3-32b bash #qwen3-32b是上一步设置的容器名称 

    打开配置文件:

    vim /usr/local/Ascend/mindie/latest/mindie-service/conf/config.json 

    按i进入编辑模式,修改下图红框部分内容。

    需要修改的参数意义:
    ipAddress
        “XX.XX.XX.XX”    主机IP
    port    XXXX    端口号,自定义。不要使用ss -tuln中正在使用监听的端口
    httpsEnabled    false    关闭HTTPS通信
    npuDeviceIds    [[0,1,2,3...]]    NPU编号,与容器设置保持一致,想要调哪几张npu跑就写入其编号worldSize    4    NPU数量,由npuDeviceIds决定
    modelName    “qwen3-32b”    模型名称,自定义。调用模型时即使用此名称
    modelWeightPath    “/path/to/model/in/container”    容器内模型映射路径,与docker run设置保持一致

    maxSeqLen    XXXX    输入和输出的最大总长度,需大于等于maxInputTokenLen和maxIterTimes的和
    maxInputTokenLen    XXXX    输入部分的最大token数量,必须小于maxSeqLen,如果输入被截断,可能需要增加这个参数的值
    maxPrefillBatchSize    XXXX    预填充阶段一个batch中的请求个数上限,范围在[1,maxBatchSize]之间,建议设置为maxBatchSize的一半
    maxPrefillTokens    XXXX    预填充阶段一个batch中包含的Input token总数的上限,设置为与maxInputTokenLen相同
    maxBatchSize    XXXX    解码阶段的最大batch size,影响并发能力,取值范围[1,5000]
    maxIterTimes    XXXX    最大迭代次数,即输出的最大token数,必须小于maxSeqLen

     查看ip地址:

    # 查看所有网卡信息 ip addr show #或者,简略版查询 ip a 

    查看port端口占用情况:

    ss -tuln #或者 ss -tulnp

    下面是一个实际例子:

    { "Version" : "1.0.0", "ServerConfig" : { "ipAddress" : "172.16.23.55", "managementIpAddress" : "127.0.0.2", "port" : 1025, "managementPort" : 1026, "metricsPort" : 1027, "allowAllZeroIpListening" : false, "maxLinkNum" : 1000, "httpsEnabled" : false, "fullTextEnabled" : false, "tlsCaPath" : "security/ca/", "tlsCaFile" : ["ca.pem"], "tlsCert" : "security/certs/server.pem", "tlsPk" : "security/keys/server.key.pem", "tlsPkPwd" : "security/pass/key_pwd.txt", "tlsCrlPath" : "security/certs/", "tlsCrlFiles" : ["server_crl.pem"], "managementTlsCaFile" : ["management_ca.pem"], "managementTlsCert" : "security/certs/management/server.pem", "managementTlsPk" : "security/keys/management/server.key.pem", "managementTlsPkPwd" : "security/pass/management/key_pwd.txt", "managementTlsCrlPath" : "security/management/certs/", "managementTlsCrlFiles" : ["server_crl.pem"], "kmcKsfMaster" : "tools/pmt/master/ksfa", "kmcKsfStandby" : "tools/pmt/standby/ksfb", "inferMode" : "standard", "interCommTLSEnabled" : true, "interCommPort" : 1121, "interCommTlsCaPath" : "security/grpc/ca/", "interCommTlsCaFiles" : ["ca.pem"], "interCommTlsCert" : "security/grpc/certs/server.pem", "interCommPk" : "security/grpc/keys/server.key.pem", "interCommPkPwd" : "security/grpc/pass/key_pwd.txt", "interCommTlsCrlPath" : "security/grpc/certs/", "interCommTlsCrlFiles" : ["server_crl.pem"], "openAiSupport" : "vllm", "tokenTimeout" : 600, "e2eTimeout" : 600, "distDPServerEnabled":false }, "BackendConfig" : { "backendName" : "mindieservice_llm_engine", "modelInstanceNumber" : 1, "npuDeviceIds" : [[0,1,2,3]], "tokenizerProcessNumber" : 8, "multiNodesInferEnabled" : false, "multiNodesInferPort" : 1120, "interNodeTLSEnabled" : true, "interNodeTlsCaPath" : "security/grpc/ca/", "interNodeTlsCaFiles" : ["ca.pem"], "interNodeTlsCert" : "security/grpc/certs/server.pem", "interNodeTlsPk" : "security/grpc/keys/server.key.pem", "interNodeTlsPkPwd" : "security/grpc/pass/mindie_server_key_pwd.txt", "interNodeTlsCrlPath" : "security/grpc/certs/", "interNodeTlsCrlFiles" : ["server_crl.pem"], "interNodeKmcKsfMaster" : "tools/pmt/master/ksfa", "interNodeKmcKsfStandby" : "tools/pmt/standby/ksfb", "ModelDeployConfig" : { "maxSeqLen" : 25600, "maxInputTokenLen" : 20480, "truncation" : false, "ModelConfig" : [ { "modelInstanceType" : "Standard", "modelName" : "qwen3_32b", "modelWeightPath" : "/data/Qwen3", "worldSize" : 4, "cpuMemSize" : 5, "npuMemSize" : -1, "backendType" : "atb", "trustRemoteCode" : false } ] }, "ScheduleConfig" : { "templateType" : "Standard", "templateName" : "Standard_LLM", "cacheBlockSize" : 128, "maxPrefillBatchSize" : 50, "maxPrefillTokens" : 25600, "prefillTimeMsPerReq" : 150, "prefillPolicyType" : 0, "decodeTimeMsPerReq" : 50, "decodePolicyType" : 0, "maxBatchSize" : 200, "maxIterTimes" : 10240, "maxPreemptCount" : 0, "supportSelectBatch" : false, "maxQueueDelayMicroseconds" : 5000 } } }

    3.4 检查资源可用性(可省略)

    这部分内容参考网址,主要防止一些报错:

    ascend-docker-image: 提供Ascend相关的Dockerfile示例,展示如何创建docker镜像。 - Gitee.com

    (1) 检查HDK

    (2) 检查torch

    (3) 检查mindle组件

    3.5 服务化推理-模型测试

    拉起服务化,启动模型

    cd /usr/local/Ascend/mindie/latest/mindie-service/bin ./mindieservice_daemon

    新建测试窗口(OpenAI接口)

    curl -X POST 172.16.23.55:1060/v1/chat/completions \#POST后接172.16.23.55是ip address,1060是json中设置的port端口号,后面v1...等是相关模型服务 -d '{ "messages": [ {"role": "system", "content": "you are a helpful assistant."}, {"role": "user", "content": "帮我写一个上海富婆爱上我的故事"} ], "max_tokens": 256, "stream": false, "do_sample": true, "temperature": 0.6, "top_p": 0.95, "top_k": 20, "model": "qwen3-32b" }'# -d后'{}'输入测试内容即可,其他的都是模型可调参数

    输出如下,即部署成功:

    3.5 可视化交互前端界面

    (1)使用Dify工具包

    简介:Dify 是一款开源的大语言模型(LLM)应用开发平台,通过 ‌低代码/无代码‌ 的模块化设计降低生成式 AI 应用的开发门槛,支持集成 OpenAI、Claude3 等主流模型及自托管模型(如 Ollama)‌。其核心功能包括 ‌后端即服务(BaaS)‌、‌可视化 Prompt 编排‌ 和 ‌LLMOps 工具链‌,可灵活构建智能客服、文本生成等场景‌。平台内置 ‌RAG 引擎‌ 实现知识库检索增强生成,并通过 ‌Agent 框架‌ 支持复杂任务分解与工具调用(如搜索、绘图),结合 ‌Workflow 工作流‌ 实现多步骤业务逻辑自动化‌。

     (2) Dify安装

    版本要求

    系统查询命令:

    cpu信息查询:

    #查询cpu核心数及其他信息: lscpu #或者可以快速查看cpu核心数量: nproc 

    输出cpu核心数量大于2即可

    ram信息查询:

    #检查内存大小(RAM) free -h 

    RAM输出

     total used free shared buff/cache available Mem: 7.7Gi 1.6Gi 3.3Gi 160Mi 2.8Gi 5.3Gi Swap: 2.0Gi 0B 2.0Gi 

    Mem 行,查看 total 字段的值。确保总内存大于或等于 4 GiB

    拉取Dify镜像:

    git clone https://github.com/langgenius/dify.git --branch 0.15.3

    修改配置:

    #进入docker目录 cd dify/docker #复制环境配置文件 cp .env.example .env #vim打开.env文件更改端口号 vim .env
    将NGINX_PORT与NGINX_PORT_EXPOSE更改为未使用的端口(可自定义)。

    默认使用80端口,若无冲突则无需更改。

    如果不配置docker镜像源,会报错如下:

    Error response from daemon: Get "https://registry-1.docker.io/v2/": net/http: request canceled while waiting for connection (Client.Timeout exceeded while awaiting headers)

    docker镜像配置(国内一般很难直接从docker官方源拉取镜像,因此要配置镜像源如下):

    [root@localhost ~]# vim /etc/docker/daemon.json [root@localhost ~]# more /etc/docker/daemon.json { "default-runtime": "ascend", "registry-mirrors":[ "registry-mirrors": [ "https://2a6bf1988cb6428c877f723ec7530dbc.mirror.swr.myhuaweicloud.com", "https://docker.m.daocloud.io", "https://hub-mirror.c.163.com", "https://mirror.baidubce.com", "https://your_preferred_mirror", "https://dockerhub.icu", "https://docker.registry.cyou", "https://docker-cf.registry.cyou", "https://dockercf.jsdelivr.fyi", "https://docker.jsdelivr.fyi", "https://dockertest.jsdelivr.fyi", "https://mirror.aliyuncs.com", "https://dockerproxy.com", "https://mirror.baidubce.com", "https://docker.m.daocloud.io", "https://docker.nju.edu.cn", "https://docker.mirrors.sjtug.sjtu.edu.cn", "https://docker.mirrors.ustc.edu.cn", "https://mirror.iscas.ac.cn", "https://docker.rainbond.cc" ], "runtimes": { "ascend": { "path": "/usr/local/Ascend/Ascend-Docker-Runtime/ascend-docker-runtime", "runtimeArgs": [] } } }

    添加完成后,需要重新加载docker的配置文件以生效:

    systemctl daemon-reload

    重启docker服务:

    systemctl restart docker.service

    启动容器:

    docker compose up -d

    如果得到以下输出,代表服务拉起成功:

    检查容器是否正常运行:

    docker compose ps

    所有容器的运行状态与占用端口如下。应该看到包含3个业务服务(api / worker / web)以及6个基础组件(weaviate / db / redis / nginx / ssrf_proxy / sandbox)在内的总共9个容器,且STATUS均为Up,服务全部挂起成功。

    (3)可视化web配置

    登录dify网页

    在浏览器内输入“本机ip:端口号”该端口号为在启动dify时更改的NGINX_PORT(见本章节(2)),若无更改,则使用默认的80端口登录。例如:网址:172.16.23.55:80

    *注意:这里又又又有一个坑啦!

    第一次输入网址大概率无法访问网页,会出现如下界面!

    原因:web 服务没有配置端口映射。需要在 web 服务下添加 ports端口配置。在dify文件夹中找到 docker-compose.yml 文件,并作以下修改:

    (1)查看现有docker端口映射情况:

    docker ps

    输出如下:

    CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 123456789abc nginx:latest "/docker-entrypoint...." 2 days ago Up 2 days 0.0.0.0:3000->80/tcp web_container 

    如果PORT一列显示0.0.0.0:3000->80/tcp 则表明主机中的3000端口正常被映射到docker中设置的80端口,此时web服务可以被启用;若映射不完整,只显示主机端口占用情况0.0.0.0:3000或者只有docker中设置的占用端口80/tcp,那么都无法直接在网页中进行启动。此时就需要设置docker-compose中的映射端口。

    (2)切换到相应目录:

    cd D:\Desktop\dify-main\dify-main\docker #切换目录

    (3)编辑配置文件:

    vim docker-compose.yml

    (4)在service中找到 web 服务的配置部分,在原文件中的restart:always和environment中间添加ports 映射:

    # Frontend web application.
      web:
        image: langgenius/dify-web:0.14.1
        restart: always
        # 添加以下 ports 配置
        ports:
          - "3000:80"    # 宿主机端口号:容器端口号,将主机端口映射到之前设置的容器NGINX_PORT=80端口,注意缩进格式
        environment:
          CONSOLE_API_URL: ${CONSOLE_API_URL:-}
          APP_API_URL: ${APP_API_URL:-}
          SENTRY_DSN: ${WEB_SENTRY_DSN:-}
          NEXT_TELEMETRY_DISABLED: ${NEXT_TELEMETRY_DISABLED:-0}
          TEXT_GENERATION_TIMEOUT_MS: ${TEXT_GENERATION_TIMEOUT_MS:-60000}
          CSP_WHITELIST: ${CSP_WHITELIST:-}
    当在宿主机上访问 http://<宿主机IP>:80(例如,http://localhost:80 或者宿主机的 IP 地址),请求将被转发到容器的 80 端口。如果没有设置端口映射,容器的端口只对容器内部可用,外部无法访问。

    :wq保存并退出后,重启docker服务:

    docker compose down docker compose up -d

    输出如下,则代表web端口已映射,可以在网页中打开Dify了:

    docker compose同时管理多个容器,支持web和数据库访问管理

    services 定义了应用的不同服务,如:web 服务使用 Nginx 镜像,并暴露端口 80。db 服务使用 MySQL 镜像,并设置环境变量 MYSQL_ROOT_PASSWORD

    输入网址后界面如下,第一次登陆需要设置邮箱,用户名和密码等。

    模型配置:

    点击右上角用户头像,进入设置。

    (1)大语言模型(LLM)

    选择模型供应商中的OpenAI-API-compatible模块。点击添加模型。

    模型类型选择“LLM”,“模型名称”与Mind IE服务化配置dcoker文件“config.json”中的“modelName”保持一致,例如之前配置的是qwen3-32b模型,“API endpoint URL”填写“http://本机ip:qwen3-32b的port端口/v1”,。“模型上下文长度”与“最大 token 上限”按需填写。例如:http://172.16.23.55:1060

    返回首页,创造一个对话应用窗口

    创建聊天助手,进行测试。

    在右侧的聊天界面中进行Q&A

    参考资料:

    【modelscope安装】

    ModelScope初体验 - Joy-word - 博客园

    【Qwen3-32B模型权重下载】

    通义千问3-32B · 模型库

    Qwen3-32B-模型库-ModelZoo-昇腾社区

    【mindie下载】

    基于Atlas 800I A2的RAG端到端实践

    【docker环境配置】

    华为欧拉系统(openEuler)安装 Docker 容器完整教程_openeuler安装docker-ZEEKLOG博客

    解决docker镜像仓库下载慢或Error response from daemon: Get "https://registry-1.docker.io/v2/": net/http: request canceled while waiting for connection (Client.Timeout exceeded while awaiting headers) - 谢墨尘 - 博客园

    【华为服务器部署大模型+测试】

    (99+ 封私信 / 80 条消息) 华为 Atlas 800I A2 大模型部署实战(三):MindIE 安装与部署 LLM - 知乎

    使用MindIE部署大模型——以Qwen3-32B为例_mindie部署qwen3-ZEEKLOG博客

    鲲鹏+昇腾Atlas800IA2(910B4)部署Qwen3-32B【简单自用版】_910b部署qwen3-ZEEKLOG博客

    Qwen3-32B-模型库-ModelZoo-昇腾社区

    ascend-docker-image: 提供Ascend相关的Dockerfile示例,展示如何创建docker镜像。 - Gitee.com

    https://mp.weixin.qq.com/s/Q4J77DsnKKzlQeBVbNf2qA?scene=1

    【可视化前端交互】

    【昇腾】单张48G Atlas 300I Duo推理卡MindIE+WebUI方式跑14B大语言模型_20250817_atlas300i duo qwen3-ZEEKLOG博客

    https://docs.dify.ai/zh-hans/getting-started/install-self-hosted/docker-compose

    无法打开Dify网页管理界面_dify打不开-ZEEKLOG博客

    Read more

    别再用 Electron 了!教你用 WebView2 实现 3MB 极致轻量化 Web 打包方案(附神器)

    别再用 Electron 了!教你用 WebView2 实现 3MB 极致轻量化 Web 打包方案(附神器)

    文章摘要:         你还在忍受 Electron 打包后动辄 100MB+ 的体积吗?你还在为本地 HTML 跨域(CORS)、源码保护、机器码授权而头秃吗?本文将带你体验微软新一代 WebView2 技术,并分享一款支持实时预览、全全局拖拽交互的打包神器。3MB 体积,1.5GB 大文件秒开,彻底解放前端生产力! 😱 为什么 2026 年了,我们还要逃离 Electron? 做前端桌面化开发,Electron 确实是老大哥,但它的缺点和优点一样明显: * 太胖了: 一个最简单的 Hello World,打包出来都要 150MB 起步。 * 太吃内存: 每个窗口都是一个 Chrome 进程,老爷机直接卡死。 * 开发繁琐: 想要实现“老板键”、“机器码授权”、“关机重启”,需要写大量的

    Web Crawling 网络爬虫全景:技术体系、反爬对抗与全链路成本分析

    Web Crawling 网络爬虫全景:技术体系、反爬对抗与全链路成本分析

    核心结论:爬虫生态数万个工具的繁荣不是技术丰富的标志,而是持续对抗中高损耗率的副产品。爬虫问题的本质不是"能不能爬到",而是全链路成本函数——爬、存、ETL、维护——谁先扛不住。 一、爬虫技术体系全景 1.1 技术类别收敛图 工具数万,但底层技术类别高度收敛。整个爬虫技术栈可以压缩为以下几层: ┌──────────────────────────────────────────────────────┐ │ 应用层(目标适配) │ │ 针对特定网站的解析规则、登录流程、分页逻辑 │ ├──────────────────────────────────────────────────────┤ │ 解析层(数据提取) │ │ HTML解析、JSON提取、正则、XPath、CSS选择器 │ ├──────────────────────────────────────────────────────┤ │ 渲染层(页面执行) │ │ 静态请求(requests/httpx)vs 动态渲染(浏览器引擎) │ ├─────────────────────────────────

    什么是Webhook?工作原理?如何实现?缺点?

    什么是Webhook?工作原理?如何实现? 背景 在使用钉钉机器人配置Stream推送 - 钉钉开放平台,qq机器人(微信没有机器人),企业微信机器人、飞书机器人、GitHub WebHook、腾讯问卷这些应用时, 这些应用都提供了Webhook,它允许系统之间在事件发生时主动传递信息,而无需持续轮询。 有的人一开始可能很困惑,什么是Webhook?如何使用? 什么是 Webhook? 通俗一点就是,你(自己的服务器提供一个webhook)在手机(其它支持webhook的平台注册)上定了一个明天早上6点的闹钟(将自己的webhook注册在其它平台上),当时间来到第二天早上6点时候,手机(其它支持webhook的平台)闹钟响起(触发你注册的webhook),你(自己的服务器提供一个webhook)就会听到铃声响起来(自己的服务器上的webhook触发)。 Webhook 是一种简单的 HTTP 回调机制,它允许一个应用程序在事件发生时自动通过 HTTP 请求通知另一个应用程序。这意味着 Webhook 在某个特定事件发生时,自动向指定的 URL

    Java 测试 12:Selenium Web 自动化(Java 操作 Chrome 浏览器)

    Java 测试 12:Selenium Web 自动化(Java 操作 Chrome 浏览器)

    👋 大家好,欢迎来到我的技术博客! 💻 作为一名热爱 Java 与软件开发的程序员,我始终相信:清晰的逻辑 + 持续的积累 = 稳健的成长。 📚 在这里,我会分享学习笔记、实战经验与技术思考,力求用简单的方式讲清楚复杂的问题。 🎯 本文将围绕一个常见的开发话题展开,希望能为你带来一些启发或实用的参考。 🌱 无论你是刚入门的新手,还是正在进阶的开发者,希望你都能有所收获! Java 测试 12:Selenium Web 自动化(Java 操作 Chrome 浏览器) 🧪 在现代软件开发中,Web 应用程序的稳定性和用户体验至关重要。为了确保这些应用程序在各种浏览器和设备上都能正常运行,自动化测试成为了一项不可或缺的实践。Selenium 作为业界领先的 Web 自动化测试框架,为开发者和测试工程师提供了强大的工具集,使得在真实浏览器环境中执行测试成为可能。 在 Selenium 的众多功能中,Selenium WebDriver 是其核心组件之一。它允许我们通过编程方式控制浏览器,模拟用户行为,如点击按钮、填写表单、导航页面等。