简介:这是一份面向技术爱好者与开发者的 DeepSeek 多平台部署指南文档,聚焦本地电脑、iPhone、Android 及图形化环境下的模型运行需求,帮助读者结合硬件条件与使用偏好选择合适路径。压缩包内为 1 个 docx 文件,大小约 15KB,内容围绕 Ollama 本地部署、手机端快捷指令与 Termux 环境、Open WebUI 结合 Docker Desktop 三类方案展开,兼顾新手入门与开发者的实际操作参考。目前已有 768 人学习,说明该主题在 AI 模型部署领域具有一定关注度。文档以较清晰的步骤说明覆盖安装配置、模型拉取、启动交互与环境准备等环节,可作为快速搭建 DeepSeek 运行环境的参考资料;同时便于读者横向比较不同平台的部署成本与性能表现,减少反复试错和自行摸索的时间,适合希望按自身设备条件落地模型运行的技术人群。
1. 别急着敲 ollama run:三个在装之前就该确认的数字
上周又有人问我,DeepSeek 部署是不是真的就一条命令的事。他的原话是照着某篇帖子敲了ollama run deepseek-r1:7b,下载进度条爬到 60% 停了,重来一次又从零开始,第三次直接把系统盘塞满,机器卡到鼠标都拖不动。这套基于 Ollama 的本地部署流程本身不复杂,装 Ollama、拉模型、进交互模式,三步;翻车的地方几乎全在装之前没算清楚的三件事上:磁盘还剩多少、内存够不够跑你要的那个参数量、端口有没有被别的服务占着。同一套 DeepSeek,在 macOS 上一条命令能跑,在 Linux 服务器上要改监听地址才连得通,在安卓手机上还得先装 Termux 再自己编译 Ollama,路径差得很远。这篇写给准备真装一遍的人——不管你是想在自己笔记本上跑个 7b 试水,还是要在手机端用快捷指令接一下,或者拿 Docker 起个 Open WebUI 给同组人共用,下面每条命令我都是照着敲过、踩过再写的。
2. 装前清单:三条部署路线与 7b、8b 的取舍
DeepSeek 的部署在这份资料里被拆成了三条互不冲突的路线:桌面端用 Ollama 本地跑、手机端(iPhone 走快捷指令、Android 走 Termux 编译)、以及用 Docker Desktop 加 Open WebUI 做成图形界面。三条路线共用同一批模型权重,但对机器的要求完全不同,先做减法比先动手更省时间。
2.1 三条路线的硬件与系统对照
把这张表当成装之前的第一道筛子。别跳过它直接去官网下载,很多人装到一半发现跑不动,问题就出在这一步没对齐。
| 路线 | 大致硬件门槛 | 系统要求 | 依赖 | 适合谁 |
|---|---|---|---|---|
| Ollama 本地部署 | 内存 16G 起较稳,7b 量化权重磁盘占 4~5G 量级 | macOS / Linux / Windows | 无额外依赖,装完即用 | 想在自己电脑上离线跑、数据不出本机 |
| Open WebUI + Docker | 在上一条基础上内存再加 2G 左右 | 能装 Docker Desktop 的桌面系统 | Ollama + Docker Desktop | 想要网页界面、多人共用、不想天天开终端 |
| iPhone 快捷指令 | 几乎不占本地算力 | iOS,Safari | 快捷指令 App + 一个 API Key | 只想在手机上问几句、不折腾本地推理 |
| Android Termux | 内存 8G 以上,存储留 10G 起 | Android 7.0 以上 | Termux、git、cmake、golang | 愿意花时间编译、想手机本地跑 |
表格里最容易被低估的是最后一行。Termux 那条路要在手机上从源码编译 Ollama,go generate 加 go build 一套走完,中途对内存和存储的压力比跑模型本身还大。我一般会建议先用前两条把流程跑通,再去折腾手机。
2.2 模型规格怎么挑:7b、8b 和更大的那些
Ollama 模型库里同一个 DeepSeek 有多个规格可拉,常见的是 1.5b、7b、8b、14b、32b 这几档。这份资料里桌面端用的是deepseek-r1:7b,安卓端用的是deepseek-r1:8b,两个数只差一点,实际占用和速度差异不算大,真正的分水岭在 14b 及以上。
判断方法很土但有效:看内存。16G 内存的机器跑 7b、8b 属于舒适区,同时开个浏览器和 IDE 也不会太难受;8G 内存建议直接退到 1.5b,别硬撑;想上 14b,内存最好 32G 起,否则模型加载完系统就开始频繁换页,风扇声音比回复先到。磁盘同理,模型权重是实打实的文件,ollama list里看到的 SIZE 列就是它占的空间,拉之前先df -h看一眼剩余。
提示:终端里 pull 的时候显示的进度和最终
ollama list里的体积对不上是正常的,前者是下载量,后者是落盘后的实际大小,以落盘为准。
2.3 装之前先留好的三样东西
第一样是磁盘。模型默认落在用户目录下的.ollama/models,这个路径和系统盘通常是同一个分区。系统盘紧张的话,提前把模型目录挪走,别等装完再迁:
# 把模型仓库指到数据盘,路径换成你自己的 export OLLAMA_MODELS=/data/ollama/models mkdir -p "$OLLAMA_MODELS"OLLAMA_MODELS是 Ollama 认的模型存放目录,改完之后新拉的模型才会落进去,已经拉过的不会自动搬,要么重拉要么手动 mv。想让它长期生效,Linux 上写进 systemd 的 environment,macOS 上写进 shell 的 profile 文件。
第二样是端口。Ollama 默认监听11434,Open WebUI 的容器内部走8080,映射到宿主机常用3000。装之前先确认这几个端口没被占:
# Linux / macOS 查端口占用,有输出说明被占了 ss -ltnp | grep -E '11434|3000|8080' # macOS 没有 ss 的话用这条 lsof -i :11434第三样是 Docker。只有走 Open WebUI 那条路才需要,但它的安装包不小,还要开虚拟化支持,建议和 Ollama 分开装、分开验证,别一次装两个然后出问题不知道是谁的锅。
3. Ollama 本地部署:从拉模型到接上 Open WebUI 图形界面
这条是主线,也是后面两条路线的基础。桌面端把它跑通,手机端和 WebUI 才有参照物。整个流程分四步:装 Ollama、拉模型、进交互、再决定要不要套一层网页界面。
3.1 安装 Ollama:三个系统的差异在哪
官网 ollama.com 提供 macOS、Linux、Windows 三个版本的安装包,macOS 和 Windows 是图形安装器,下载完双击、下一步、装完会在后台起一个常驻服务。Linux 用安装脚本更省事,这条是社区里的常见做法:
# Linux 一键安装,脚本会装二进制并注册 systemd 服务 curl -fsSL https://ollama.com/install.sh | sh # 装完确认版本和服务状态 ollama --version systemctl status ollamacurl -fsSL里-f是遇到 4xx/5xx 直接失败而不是把错误页当脚本执行,-s静默、-L跟随跳转,这三个参数少一个都可能出现「脚本跑完了但什么都没装上」的玄学现场。装完之后systemctl status ollama显示 active (running) 才算真的起来了,光看ollama --version有输出不够,那个只证明二进制在。
macOS 和 Windows 用户不用敲这些,装完在菜单栏或托盘能看到 Ollama 图标就行。Windows 上要额外注意的是终端选择:官方给的是 PowerShell,用 CMD 跑同样的命令有时会因为引号和路径分隔符出问题,新手直接开 PowerShell 能少一半麻烦。
3.2 拉取 deepseek-r1:7b 并进入交互模式
模型不会随安装包一起下来,要单独拉。这里的第一个坑是命令写法:模型名里的横杠和冒号都不能省,deepseek-r1:7b少写一个-变成deepseekr1:7b就会提示找不到模型。
# 先把模型拉下来,单独一步,失败可以直接重跑 ollama pull deepseek-r1:7b # 确认本地有哪些模型、各自多大 ollama list # 进入交互式对话,回车后直接在终端里提问 ollama run deepseek-r1:7bollama pull和ollama run的区别值得说清楚:run在模型不存在时会自动触发一次 pull,拉完直接进对话;pull只下载不启动。看起来run更方便,但实际部署时我建议先pull——下载几个 G 的过程中如果网络抖一下中断了,单独一条 pull 命令重跑能接着下,而run中断之后重来,交互状态和下载状态混在一起,排查起来很烦。
拉完之后ollama list会列出 NAME、ID、SIZE、MODIFIED 四列,SIZE 那列就是你磁盘上真实占用的空间。接着ollama run进去,终端提示符会变成>>>,直接输入中文问题回车就行,DeepSeek 的回复是流式吐出来的。退出用/bye,或者 Ctrl+D。
如果只是想验证服务活着、不想进交互,用接口更直接:
# 问一句,非流式返回,方便看完整结果 curl http://127.0.0.1:11434/api/generate -d '{ "model": "deepseek-r1:7b", "prompt": "用一句话解释什么是机器学习", "stream": false }'model必须和ollama list里的名字完全一致,stream设为 false 是为了让返回体一次给全,方便脚本处理;设成 true 会一行一行往外吐 JSON,人眼看可以,程序解析要额外处理。
3.3 用 Docker 起 Open WebUI 并接上本地 Ollama
终端对话用几天还行,时间长了还是想要个网页界面——能存历史、能切换模型、能给不熟命令行的同事用。这就是 Open WebUI 的定位,它本身不跑模型,只是套在 Ollama 前面的一层壳。
前置条件是 Ollama 已经在跑、Docker Desktop 已经装好。装 Docker Desktop 的过程这里不展开,官网 docs.docker.com/desktop 按系统选包,Windows 上要开 WSL2 后端,装完打开终端敲docker version能看到 Client 和 Server 两段才算完整。
# 拉起 Open WebUI,映射到宿主机 3000 端口 docker run -d \ -p 3000:8080 \ --add-host=host.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-host=host.docker.internal:host-gateway是给容器加一条 hosts 记录,让它能用host.docker.internal这个名字找到宿主机,Linux 上不加这条,容器里根本解析不到这个域名;-v open-webui:/app/backend/data挂一个命名卷,聊天记录和配置都在里面,容器删了数据还在,这是后悔药;--restart always让 Docker 起来时自动拉起它。
容器跑起来之后打开浏览器,第一次进会要求注册一个管理员账号,这个账号只存在本地,随便填。进去之后点左下角设置 → 模型,如果 Ollama 地址填对了,这里能直接看到本地已拉的 DeepSeek 模型;也可以在这一页直接选模型下载,效果和命令行 pull 一样。下载完点新建对话,随便问一句能出字,这条链路就通了。
3.4 让 Ollama 被容器访问到:监听地址这一关
上面那步十有八九会卡在「网页打开了,但模型列表是空的」。原因不在 Open WebUI,在 Ollama 的默认监听地址——它默认只监听127.0.0.1:11434,容器有自己独立的网络栈,它眼里的 127.0.0.1 是容器自己,不是你的宿主机。
解决办法是让 Ollama 监听所有网卡:
# Linux 上通过 systemd 覆盖配置改监听地址 sudo systemctl edit ollama.service在打开的编辑器里补上这一段:
[Service] Environment="OLLAMA_HOST=0.0.0.0:11434"保存退出后重载并重启:
sudo systemctl daemon-reload sudo systemctl restart ollama # 确认监听在 0.0.0.0 而不是 127.0.0.1 ss -ltnp | grep 11434OLLAMA_HOST的值写成0.0.0.0:11434表示监听全部网卡,写成127.0.0.1:11434就是默认的仅本机。macOS 上没 systemd,用launchctl setenv OLLAMA_HOST 0.0.0.0:11434然后重启 Ollama 应用,或者干脆在 Open WebUI 的设置里把 Ollama 地址填成http://host.docker.internal:11434配合--add-host一起用。
注意:监听 0.0.0.0 意味着同网段的其他机器也能访问到你的 11434 端口。个人笔记本在家庭网络里问题不大,公司内网或云主机上建议配合防火墙只放行本机,别图省事把端口整个暴露出去。
改完之后回到 Open WebUI 设置页刷新,模型列表应该就出来了。
4. 手机端部署:iPhone 快捷指令与 Android Termux 编译两条路
手机端这两条路的差别大到不该放在一起讲,但它们的共同点是:都不是「把模型塞进手机」这么简单。iPhone 那条本质是调远端接口,Android 那条才是真的在本地跑,只是跑得慢。
4.1 iPhone:快捷指令方式,核心是那个 API Key
iPhone 上没法直接跑 Ollama,这份资料给的方案是用「快捷指令」做一个入口:在 Safari 里打开分享链接,把快捷指令添加到系统,然后在快捷指令的编辑界面里填入一个 API Key,之后在快捷指令里输入问题,请求发到模型服务方,结果返回来显示。
整个流程三步:装快捷指令、配 API Key、首次运行授权。
装的时候用 Safari 打开分享链接,页面会提示「添加到快捷指令」,点一下会跳到快捷指令 App,确认添加即可。如果提示「无法添加不受信任的快捷指令」,去设置 → 快捷指令 → 打开「允许不受信任的快捷指令」,这个开关要先运行过一次任意快捷指令才会出现。
API Key 是这条路上唯一需要你操心的东西。它由你使用的模型服务方提供,拿到之后打开快捷指令 App,找到刚添加的那条,进入编辑,在文本动作里把占位的 Key 换成你自己的。这里有一个血泪经验:Key 一旦泄露,等于别人可以拿你的额度去跑,所以别截图发群、别贴在公开仓库里。想更稳妥一点,把 Key 存在快捷指令的「文本」动作里而不是直接写死在请求头,改的时候只改一处。
首次运行会弹两个授权框,一个是「允许快捷指令访问网络」,一个是「是否允许…」,都要点允许,点拒绝之后不会再有提示,得去设置里手动开回来。
提示:这条路的本质是远端调用,手机不承担推理,所以它对手机型号没有任何要求,老机器一样能用。反过来说,没网就用不了,也别指望它离线。
4.2 Android:在 Termux 里从源码编译 Ollama
安卓这条路是四条里最硬的一条:装 Termux、装依赖、克隆仓库、编译、启动服务、拉模型,一步不能少。前置是去 Termux 的发布页下载 APK 安装包手动安装,注意别从应用商店装那些同名的旧版本,包名和管理方式都不一样。
装完打开 Termux,先做两件事:给存储权限、更新包索引。
# 授予 Termux 访问共享存储的权限,执行后会弹系统授权框 termux-setup-storage # 更新软件源和已装的包 pkg update && pkg upgrade -ytermux-setup-storage这个命令在很多教程里被写成一串没有横杠的字符,实际执行会提示 command not found,横杠不能漏。它的作用是让 Termux 能读写手机存储,编译产物和模型文件体积都不小,没有这个权限后面会处处受限。
接着装编译依赖:
# git 拉代码,cmake 和 golang 是编译工具链,libjpeg-turbo 是图像处理依赖 pkg install git cmake golang libjpeg-turbo -y四个包各自的作用:git用来克隆仓库,cmake负责构建 llama.cpp 那部分本地库,golang是编译 Ollama 主体的语言工具链,libjpeg-turbo提供 JPEG 编解码能力,缺了它go generate阶段会报 CGO 相关的错。装完可以go version确认一下 golang 真的进去了。
4.3 编译、启动与验证:curl 那一行到底看什么
依赖齐了就可以拉源码编译。这几行命令在原资料里是挤在一起写的,空格容易丢,我按能直接粘的格式重写一遍:
# 只拉最新一次提交,省流量也省时间 git clone --depth 1 https://github.com/ollama/ollama.git cd ollama # 生成 llama.cpp 相关的绑定代码 go generate ./... # 编译出可执行文件,产物就在当前目录 go build .--depth 1是浅克隆,只拿最近一次提交,仓库历史对编译没用,能省下大量下载时间。go generate ./...里的./...表示当前目录及所有子目录,这一步会触发代码生成,跑得比较久,中途手机发烫是正常的,别以为卡死了就 Ctrl+C。go build .的.是当前包路径,编译成功后当前目录会多出一个名为ollama的可执行文件。
编译完成,启动服务并验证:
# 后台启动服务,& 表示放到后台 ./ollama serve & # 探一下服务是否活着 curl http://localhost:11434curl http://localhost:11434返回的是Ollama is running这一行纯文本,不是 JSON,也不是版本号。很多人以为要看到版本信息才算成功,看到这行反而以为哪里错了——它就是这个服务的根路径响应,能返回这行就说明进程在、端口通。
服务确认活着之后拉模型:
# 8b 规格,注意模型名里的横杠 ./ollama pull deepseek-r1:8b # 拉完直接进交互 ./ollama run deepseek-r1:8b这里要提醒一句:安卓上跑 8b 的体验和桌面完全不是一个量级,生成速度慢、发热明显、后台容易被系统杀掉。我一般会先在桌面端把 7b 跑通、确认自己要问的问题类型,再决定要不要在手机上重复一遍。
4.4 手机端的现实取舍
把两条路摆在一起看,选择其实很清楚。iPhone 快捷指令那条,五分钟能搞定,代价是依赖网络和第三方 Key,模型不在你手上;Android Termux 那条,从装 Termux 到编译完成顺利的话半小时起步,换来的是模型真的跑在本地,断网也能用,但速度和续航要打折。
如果目的是「在手机上随时问两句」,选前者;如果目的是「验证 Ollama 在 ARM 环境能不能编出来、能不能跑」,选后者。两者不冲突,我自己的手机上是快捷指令常年留着,Termux 那套装完跑通一次就删了——占的空间比收益大。
5. 排查避坑:五个让部署卡住的现场
下面这五条是我在实际部署里反复遇到的,按「现象 → 原因 → 解决」记,遇到问题可以直接对号入座。
5.1 模型拉到一半停住,重跑又从零开始
现象:ollama run deepseek-r1:7b进度条走到一半不动了,等几分钟没反应,Ctrl+C 之后重新执行,进度回到 0%。
原因:run把下载和启动绑在一起,中断后交互状态和下载状态混在一起,重跑等于重新走一遍完整流程;另外模型权重是几个 G 的连续文件,网络抖动很容易让连接断掉。
解决:先用ollama pull deepseek-r1:7b单独下,这条命令失败后重跑通常能续上已完成的分片,下完再用ollama run进交互。同时确认目标磁盘剩余空间大于模型体积的两倍,Ollama 在落盘过程中会有临时文件。
5.2 宿主机 curl 得通,容器里连不上
现象:宿主机上curl http://127.0.0.1:11434正常返回,进 Open WebUI 容器里执行同样的命令超时,网页上模型列表一直是空的。
原因:Ollama 默认只监听127.0.0.1,容器有独立网络命名空间,它访问自己的 127.0.0.1 永远连不到宿主机上的服务。
解决:给 Ollama 设OLLAMA_HOST=0.0.0.0:11434并重启服务,同时给容器加--add-host=host.docker.internal:host-gateway,在 Open WebUI 里把地址填成http://host.docker.internal:11434。Linux 上漏掉--add-host这条,光改监听地址也不够。
5.3 Open WebUI 能打开,但新建对话报错
现象:网页能进,模型也显示在列表里,一点新建对话就报连接失败或者一直转圈。
原因:多半是地址填成了http://localhost:11434。在容器的视角里,localhost 是容器自己,那里没有 Ollama。
解决:把地址改成http://host.docker.internal:11434,配合上一条的--add-host参数;或者直接填宿主机的局域网 IP,比如http://192.168.1.10:11434,前提是 Ollama 已经监听 0.0.0.0。
5.4 Termux 编译中途失败
现象:go generate ./...报 CGO 相关的错误,或者go build .跑到一半进程被杀。
原因:前者通常是缺libjpeg-turbo或cmake;后者是内存不够,安卓系统在内存紧张时会杀后台进程,编译恰恰是内存大户。
解决:先pkg install libjpeg-turbo cmake -y补齐依赖再重试;内存不够的话执行termux-wake-lock阻止系统休眠回收,关掉其他 App,编译期间别切后台。失败后重跑前先go clean -cache,避免半成品缓存干扰。
5.5./ollama serve &之后 curl 没反应
现象:后台启动看起来成功了,curl http://localhost:11434一直挂着不返回,或者提示连接被拒绝。
原因:三种可能——可执行文件不在当前目录(编译产物在ollama仓库根目录,cd错了地方就会 command not found)、端口被别的进程占了、进程启动后立刻被系统杀掉。
解决:先用./ollama serve前台跑一次,日志直接打在终端上,报什么错一目了然;再ss -ltnp | grep 11434看端口归属。安卓上如果日志显示进程正常但请求超时,检查是不是切后台被系统冻结了,加termux-wake-lock再试。
6. 装完怎么验证:三层自检和一条我每次都走的顺序
装完不等于跑通,我自己定了一套三层验证,从底层往上一层一层过,任何一层不过就停在那儿排查,不往下走。
第一层是进程和端口。服务有没有起来、监听在哪,这层用两条命令就能确认:
# 看进程和监听地址,重点看是 127.0.0.1 还是 0.0.0.0 ss -ltnp | grep 11434 # 看容器状态,STATUS 列要有 Up docker ps --filter name=open-webui第二层是接口。这一层不看网页,直接打 API,排除前端因素:
# 版本接口,确认服务在响应 curl -s http://127.0.0.1:11434/api/version # 本地模型清单,确认模型真的落盘了 curl -s http://127.0.0.1:11434/api/tags # 真跑一次推理,这一步过不了说明模型加载有问题 curl -s http://127.0.0.1:11434/api/generate -d '{ "model": "deepseek-r1:7b", "prompt": "用一句话说明什么是机器学习", "stream": false }' | head -c 500三个接口对应三个不同的故障面:/api/version不通说明服务没起;/api/tags返回空数组说明模型没拉下来或者OLLAMA_MODELS指错了目录;/api/generate报 model not found 说明名字写错,报内存相关错误说明规格选大了。第三个接口能返回一段完整的 JSON 且response字段有内容,本地推理这条链路就算通了。
第三层才是界面。浏览器打开http://localhost:3000,登录进 Open WebUI,设置里的模型列表能看到 DeepSeek,新建对话发一句能流式出字。这一层最容易骗人——页面能打开不代表后端通,所以我一定先过完前两层再看它。
三层都过完之后,还有一个习惯动作:重启一次机器,再重新走一遍第一层。目的是确认--restart always和 systemd 的自启真的生效了,而不是靠你手动起的那个进程撑着。我吃过这个亏,装完当天一切正常,第二天开机发现模型服务没起来,查了半天才发现是手动./ollama serve起的进程随着终端关掉了。
从那以后我每次装完这类带常驻服务的环境,都会强制走一遍「重启 → 三层自检」,宁可多花五分钟,也不想在演示前十分钟发现服务是死的。希望帮到你。
本文还有配套的精品资源,点击获取