简介《DeepSeek多平台部署指南Ollama本地、移动端及Open WebUI环境配置》面向希望落地跨平台模型部署的技术开发者、研究人员与AI爱好者聚焦桌面端、iOS/Android及云端WebUI等多环境下的配置思路与工具协同问题。资源包共1个docx文件约15KB内容按本地、移动端与WebUI三类环境组织包含平台差异说明、命令示例、组件依赖关系与配置注意事项便于快速查阅和对照实践。已有4127人学习下载说明其在同类部署主题中具备较高参考热度。文档围绕Ollama本地运行、iPhone快捷指令与Android Termux环境搭建、Docker Desktop配合Open WebUI等路径展开并提示API Key配置、服务初始化检查等易错环节对于初次接触多端部署的读者可减少环境选择与组件衔接上的盲目尝试并借助文中链接和脚本降低上手成本形成可复用的排错与验证思路。适合需要系统了解多平台部署差异与配置细节的读者参考。1. DeepSeek 多平台部署的三条路先看显存再看终端最后看协作很多人第一个念头是“装个 Python 环境把权重下下来”结果卡在 CUDA 版本、torch 编译、显存不够上两天过去连一句话都没问出来。DeepSeek 的部署其实可以拆成三条互不冲突的路线一条是 Ollama 本地跑模型一条是 Open WebUI 加 Docker 容器把终端对话变成网页一条是移动端在 Android 的 Termux 里编译 Ollama、在 iPhone 上用快捷指令走 HTTP 接口。这三条路共用的核心只有一个——11434 这个端口上的 OpenAI 兼容 API。搞清这一点跨平台支持就不再是三个孤立的教程而是一套可以互相复用的部署链路。下面按“本地跑通 → 界面化 → 移动端 → 踩坑 → 收敛成清单”的顺序拆每一步都给可抄的命令和参数。2. Ollama 本地部署从 ollama run 到 11434 端口的三层配置2.1 装之前先算显存别让模型偷偷跑在 CPU 上Ollama 最容易被误解的一点是“装上就能跑”。它确实能跑但跑在 GPU 还是 CPU 上体验差十倍。常见做法是先按量化后的模型体积估一遍显存Ollama 模型库里 DeepSeek 系列默认走 4bit 量化参数量和体积大致对得上下表留 12GB 给系统和上下文缓存。tag蒸馏底座量化后体积约建议显存/内存deepseek-r1:1.5bQwen 1.5B1.1 GB4 GB 可跑deepseek-r1:7bQwen 7B4.7 GB8 GB 舒适deepseek-r1:8bLlama 8B4.9 GB8 GB 舒适deepseek-r1:14bQwen 14B9 GB1216 GBdeepseek-r1:32bQwen 32B20 GB24 GB 起表里的数字是经验值实际以拉取时显示的下载量为准。选型逻辑很简单显存够就往上顶一档不够就老实降级别指望“7B 跑不动换 8B 会更快”——7b 和 8b 不是同一套蒸馏权重底座分别是 Qwen 和 Llama风格、中文手感、代码能力都有差异这属于选型而不是升级。2.2 拉取与首次对话pull 和 run 的区别要分清Linux 和 macOS 一行脚本就能装完Windows 直接下安装包双击装完在 PowerShell 里验证版本。这里有个习惯我一般会坚持先用pull把模型备好再run避免交互界面卡在下载进度条上以为程序挂了。# Linux 一行安装macOS 用 brew install ollamaWindows 下安装包 curl -fsSL https://ollama.com/install.sh | sh # 确认版本顺便看服务有没有起来 ollama --version # 只下载不进交互适合先把模型备好 ollama pull deepseek-r1:7b # 下载 进入终端对话 ollama run deepseek-r1:7b # 看本地已有哪些 tag避免重复下载 ollama list # 看当前加载的模型跑在 GPU 还是 CPU这一列最值钱 ollama psollama ps的输出里有一列是处理器占用比例写着 100% GPU 才算真的用上显卡如果显示 100% CPU 或者混跑说明显存不够、被切分了这时候要么换小模型要么调小上下文。命令本身没有魔法参数含义就这三个模型名、tag、以及运行时的环境变量。首次run结束想退出输入/bye不是 CtrlC——CtrlC 在部分终端里会把整个前台进程打断下次还得重启。2.3 把本地服务变成可编程接口11434 上的两种协议Ollama 装完默认就以系统服务的形式常驻监听127.0.0.1:11434。这个端口同时提供两套接口原生的/api/chat、/api/generate以及 OpenAI 兼容的/v1/chat/completions。后者是跨平台支持的关键——任何认 OpenAI 协议的上层应用改个 base_url 就能接上本地模型不用改一行业务代码。# 原生接口流式返回适合自己写脚本 curl http://127.0.0.1:11434/api/chat -d { model: deepseek-r1:7b, messages: [{role: user, content: 用三句话说明什么是量化}], stream: false } # OpenAI 兼容接口上层应用直接改 base_url curl http://127.0.0.1:11434/v1/chat/completions \ -H Content-Type: application/json \ -H Authorization: Bearer ollama \ -d {model:deepseek-r1:7b,messages:[{role:user,content:你好}]}注意第二段里的Authorization头值随便写Ollama 本地不校验但很多客户端库强制要求非空不写会直接抛参数错误——这是新手最常报的“key 无效”其实根本没 key 这回事。Python 侧我一般这么接from openai import OpenAI # api_key 随便填Ollama 本地不做鉴权base_url 必须带 /v1 client OpenAI(base_urlhttp://127.0.0.1:11434/v1, api_keyollama) resp client.chat.completions.create( modeldeepseek-r1:7b, messages[{role: user, content: 写一个快速排序}], temperature0.6, # R1 蒸馏版建议 0.5~0.7太低容易复读 max_tokens1024, ) print(resp.choices[0].message.content)参数上只有两个值得调temperature和max_tokens。R1 系列带思维链输出里会有一段推理内容max_tokens给小了会出现“想到一半被截断”的空回答1024 是安全下限。2.4 模型目录、常驻时长与并发三个环境变量的实际作用默认模型存在用户主目录下的隐藏目录里几十 GB 下去很快把系统盘吃满。装完第一件事就是把模型目录挪到大盘同时把服务监听地址放开为后面容器和手机访问做准备。# 模型存放路径改完记得把旧模型 mv 过去否则要重下 export OLLAMA_MODELS/data/ollama/models # 监听地址只写 127.0.0.1 的话容器和手机都连不进来 export OLLAMA_HOST0.0.0.0:11434 # 模型在内存里保留多久默认 5 分钟太短会频繁冷启动 export OLLAMA_KEEP_ALIVE30m # 同时处理几个请求显存不够别调大 export OLLAMA_NUM_PARALLEL2 ollama serve这四个变量里OLLAMA_HOST是最容易翻车的一个。很多人本地网页能开、容器里就是连不上原因就是服务只绑了回环地址。改成0.0.0.0之后记得配防火墙规则只在可信网段开放别直接扔公网。想让配置开机生效Linux 下走 systemd 的 overridemacOS 走 launchctl 的 plistWindows 走系统环境变量面板。我一般会先在前台ollama serve跑一遍确认参数没问题再落到服务里不然改错一个变量就要翻日志找半天。3. Open WebUI 加 Docker把终端对话换成一整套 Web 界面3.1 为什么用容器而不是 pip 直装Open WebUI 本身是个前后端一体的应用直接 pip 装也能跑但依赖树很深Python 版本、Node 构建产物、数据库迁移任何一环对不上就是一堆红色报错。容器的价值在于把这些不确定性封死在一个镜像里升级就是换个 tag 重启回滚就是把旧容器再拉起来。前提是两个东西先就位Ollama 已经在本机跑通并且监听在0.0.0.0:11434Docker DesktopWindows/macOS或 Docker EngineLinux已经装好并且docker ps能正常返回。这两条不满足后面所有命令都是白跑。3.2 一条 docker run 的每个参数都得知道在干什么网上抄来的命令往往是一长串抄完能跑出问题就抓瞎。把参数拆开看其实只有五件事端口映射、宿主机别名、数据卷、容器名、重启策略。docker run -d \ -p 3000:8080 \ --add-hosthost.docker.internal:host-gateway \ -v open-webui:/app/backend/data \ --name open-webui \ --restart always \ ghcr.io/open-webui/open-webui:main-p 3000:8080容器内的 8080 映射到宿主机的 3000浏览器访问http://localhost:3000。端口冲突就换前面的数字冒号后面别动。--add-hosthost.docker.internal:host-gatewayLinux 上必须加作用是让容器里能用host.docker.internal这个名字指回宿主机。Windows 和 macOS 的 Docker Desktop 自带这个解析加了也无害。-v open-webui:/app/backend/data把对话记录、账号、配置全放进命名卷。不加这一条容器一删数据全没这是血泪经验里最贵的一条。--restart always开机自启省得每次手动拉。镜像 tag 用main跟最新要稳定就锁具体版本号。另有一个:ollama后缀的镜像把 Ollama 一起打包进容器适合不想在宿主机装 Ollama 的场景但模型也跟着进容器卷迁移时体积会很难看我一般不用。3.3 首次进入后台管理员、模型连接、下载容器起来后浏览器打开 3000 端口第一个注册的账号自动成为管理员这一点必须知道——服务一旦暴露在可访问的网段谁先注册谁就是管理员。所以我的习惯是起容器后立刻在本机注册完再考虑对外。进去之后到设置里的模型/连接页新增一个 Ollama 连接地址填http://host.docker.internal:11434。填完点刷新如果下拉里出现了本地已有的模型 tag说明链路通了如果报连接失败八成是宿主机 Ollama 还绑在 127.0.0.1回到 2.4 节改OLLAMA_HOST。模型可以在 WebUI 里直接拉输入deepseek-r1:7b这样的 tag 点下载进度会显示在界面上。也可以先在宿主机ollama pull好WebUI 刷新就能看到。后者更快因为走的是本地已有的模型目录不用在容器里再下一遍。3.4 内网共享、反向代理与数据备份要让同网段的同事或手机访问把地址从localhost:3000换成宿主机的内网 IP 就行前提是防火墙放行了 3000。再往外走就得挂反向代理Nginx 配的时候有两个点容易漏一是要转发 WebSocket 的 upgrade 头否则对话流式输出会卡住不动二是要把请求体大小放开长上下文提交时默认的 1MB 限制会直接返回 413。数据备份我一般用命名卷打包比进容器里拷文件稳# 停容器后把卷打成 tar 包恢复时反向操作 docker stop open-webui docker run --rm \ -v open-webui:/data \ -v $(pwd):/backup \ alpine tar czf /backup/openwebui-$(date %F).tar.gz -C /data . docker start open-webui升级就更简单docker pull新镜像、删旧容器、用同样的docker run重来一遍因为数据在卷里配置不会丢。这也是我坚持用命名卷而不是-v $(pwd)/data:/app/backend/data绑定挂载的原因——绑定挂载在 SELinux 环境下经常遇到权限问题报错信息还特别不直观。4. 移动端落地Termux 编译 Ollama 的真实代价与轻客户端替代4.1 iPhone 快捷指令的本质是调接口不是跑模型很多人以为 iPhone 上装个快捷指令就是在手机上跑 DeepSeek其实不是。快捷指令做的是一个 HTTP 请求把问题发到某个 OpenAI 兼容的端点再把返回的文本念出来或显示出来。所以真正要配的只有两个东西base_url和api_key。如果你已经在电脑上跑通了 Ollama 加 Open WebUI最稳的做法是把端点指向内网的自建服务手机和电脑连同一个 Wi-Fi快捷指令里填http://内网IP:3000/api/...或直接对 Ollama 的 11434 发请求。这样模型算力在电脑上手机只当遥控器响应速度和电脑上完全一致。至于网上流传的“去某个站点买一个 API Key 填进去”我的建议是谨慎来源不明的 key 服务意味着你的提问内容会经过第三方且随时可能失效踩坑成本比省下来的时间高。要用托管服务就走正规渠道自己申请别图省事。4.2 Android 端 Termux命令抄错一步就前功尽弃Android 这条路的真实情况是可行但代价不小。Termux 提供的是一个接近 Linux 的用户态环境能在里面编译 Ollama 的 Go 源码然后在本机跑小参数模型。原文里的流程方向是对的但几处命令有明显笔误照着敲必报错我把正确写法列在下面。# 1. 存储权限正确命令是带连字符的 termux-setup-storage termux-setup-storage # 2. 更新软件源 pkg update pkg upgrade -y # 3. 依赖go 工具链、cmake、图像库包名是 libjpeg-turbo pkg install -y git golang cmake libjpeg-turbo # 4. 浅克隆--depth 1 是参数不是两个词 git clone --depth 1 https://github.com/ollama/ollama.git cd ollama # 5. 生成与编译generate 后面要有空格 go generate ./... go build . # 6. 后台起服务先加唤醒锁否则息屏就被系统杀 termux-wake-lock ./ollama serve # 7. 验证返回 Ollama is running 才算成功 curl http://localhost:11434 # 8. 拉小模型手机上别碰 7b 以上 ./ollama pull deepseek-r1:1.5b ./ollama run deepseek-r1:1.5b几处关键差异值得记下来termuxsetupstorage少了两条连字符git clone depth 1少了--go generate./...少了空格libjpegturbo的正确包名是libjpeg-turbodeepseekr1:8b的正确 tag 是deepseek-r1:8b。这些不是小毛病每一条都会让流程原地卡住而且报错信息完全不指向真正的原因。4.3 手机跑 8B 模型的现实预期编译通过只是第一关。8B 量化模型要占 5GB 左右内存中端机根本放不下系统会直接 OOM 杀进程即便勉强加载纯 CPU 推理的速度大概是每秒两三个 token一句话要等十几秒。我的判断标准很直接手机端就跑到 1.5B 为止拿它做离线问答、字段抽取、简单改写够用真要 7B 以上的质量把手机当客户端算力留给电脑或一台常开的小主机。还有个隐藏问题Android 的后台管理会杀掉 Termux 进程息屏几分钟服务就没了。termux-wake-lock能缓解但更省心的做法是用 Termux 的定时任务在开机后自动拉起或者干脆放弃本机推理用浏览器访问内网的 Open WebUI——同一个界面手机上体验几乎无损还省了编译这一大坨事。5. 避坑与排查五条踩过的坑每条都带现象和修法5.1 环境与依赖类命令看着对跑起来全错现象Termux 里执行termuxsetupstorage提示 command not found后面的pkg install也装不上libjpegturbo整条链路断在第一步。原因教程在转述时丢了连字符、空格和包名里的短横线命令本身是错的不是环境问题。解决逐条对照官方包名termux-setup-storage、libjpeg-turbo、go generate ./...实在拿不准就pkg search 关键词先查再装。现象go build .跑到一半报编译错误指向某个语法或标准库符号。原因Termux 源里的 Go 版本偏旧Ollama 主干的代码要求较新的工具链。解决先pkg upgrade把 Go 升到源里最新版仍旧不过就git checkout一个较早的 release tag 再编译别硬刚主干。5.2 网络与端口类本地通、容器不通现象宿主机 curl 11434 正常Open WebUI 容器里填http://host.docker.internal:11434一直连接超时。原因Ollama 默认只监听127.0.0.1容器从网桥过来访问的是宿主机网关 IP回环地址不接受外部连接。解决设OLLAMA_HOST0.0.0.0:11434重启服务Linux 上还要确认docker run带了--add-hosthost.docker.internal:host-gateway否则容器里这个名字根本解析不了。现象浏览器打开 3000 端口白屏或者对话发出去只显示“正在思考”不动。原因反向代理没转发 WebSocket 的 upgrade 头流式响应被拦在中间。解决代理配置里补proxy_set_header Upgrade $http_upgrade;和Connection upgrade然后重载配置。5.3 模型与资源类拉错标签、跑错设备现象以为拉了 7B 就有 8B 的效果结果中文问答质量明显不对代码还经常跑偏。原因deepseek-r1:7b和deepseek-r1:8b是两套不同底座的蒸馏权重前者基于 Qwen后者基于 Llama不是同一个模型的大小版本。解决按任务选中文创作和长文理解偏 7b英文与代码可以试 8b两个都拉下来各跑十个问题对比比看任何评测都准。现象模型能加载但回答一句话要等半分钟风扇狂转。原因显存不够Ollama 把部分层丢到 CPU 上混跑ollama ps里能看到 GPU 占比不是 100%。解决降一档参数量或者调小上下文长度确认没有别的程序占着显存必要时设OLLAMA_MAX_LOADED_MODELS1避免多个模型抢显存。5.4 数据与权限类最容易在事后才发现现象换机器迁移容器重建后所有对话记录、账号、配置全没了。原因docker run时没挂/app/backend/data数据写在容器可写层容器一删就归零。解决固定用命名卷-v open-webui:/app/backend/data并养成升级前先打包卷的习惯恢复时反向解压即可。现象服务放在内网某台机器上某天发现多了一个不认识的管理员账号。原因Open WebUI 首个注册用户即管理员服务在无人值守状态下暴露了一段时间被先注册了。解决部署完立刻在本机完成首次注册对外只走反向代理并加一层基础认证别把 3000 端口直接开到可访问网段。6. 进阶把三端收敛成一套可复现的自检清单三端跑通之后真正省时间的是把“能不能用”变成一条命令能回答的问题。我现在接手一台新机器不会挨个打开浏览器点而是先跑一段自检服务在不在、模型有没有、接口通不通。#!/usr/bin/env bash # 三个检查点端口存活 / 模型清单 / 一次真实推理 set -e curl -fsS http://127.0.0.1:11434 /dev/null echo [ok] 11434 alive ollama list | grep -q deepseek-r1 echo [ok] model present curl -fsS http://127.0.0.1:11434/v1/chat/completions \ -H Content-Type: application/json \ -H Authorization: Bearer ollama \ -d {model:deepseek-r1:7b,messages:[{role:user,content:ping}],max_tokens:8} \ | grep -q choices echo [ok] inference works三个检查点对应三类故障第一行挂说明服务没起或端口被占第二行挂说明模型 tag 记错了或者模型目录被改过第三行挂但前两行都过基本就是显存不足导致的推理超时。验收标准也顺手定下来场景关键命令通过标准本地对话ollama run deepseek-r1:7b能连续两轮问答不中断网页界面docker run ... open-webui模型下拉里能看到本地 tag手机轻客户端浏览器访问内网 3000流式输出逐字出现不卡在“思考中”编程调用OpenAI SDK 指向/v1返回choices[0].message.content非空有一件事我踩过之后就一直坚持任何环境变量改动都先在前台ollama serve里试一遍确认ollama ps显示 100% GPU、接口返回正常再写成系统服务。因为一旦落成后台服务日志入口和前台完全是两套改错一个字符就要多花二十分钟翻日志。从那以后我每换一台机器都是先跑这段自检脚本绿了再谈业务。希望帮到你。本文还有配套的精品资源点击获取
阅读完成 · 觉得有帮助?