【AI自托管 01】2026 隐私优先 AI 栈:数据不出 VPS 的完整自托管方案(Ollama+Open WebUI+Whisper+Tailscale)

一套零数据外传的自托管 AI 技术栈教程:Ollama 推理、Open WebUI 对话、Whisper 转写、ChromaDB 向量库、Tailscale 远程,含 GDPR 合规与最低配置。隐私优先视角,部署细节互链系列第 2 篇。

延伸阅读

更多相关攻略推荐:【知识库自托管 02】2026 实测:VPS 自托管 Anythin如何给 VPS 厂商做"信用评估":跑路、超售与售后风险排查手册【知识库自托管 01】2026 企业/个人私有文档 RAG 问答选型【知识库自托管 03】2026 实测:搬瓦工/RackNerd 上自2026 VPS 选购决策树与白皮书:一张图看懂怎么买

为什么 2026 年要把 AI 搬回自己的 VPS

这两年大家用 AI 产品,最怕一件事:你发给云端模型的内容,到底去了哪里。尤其是处理客户合同、病历、财务报表这类敏感数据时,把文本丢给第三方 API,本质上就是把数据主权交了出去。2026 年有几个变化把这件事推到了台前:EU AI Act 在 8 月 2 日正式全面生效,GDPR 对跨境传输的审查更严,Schrems II 裁决让美国云上的欧盟数据始终存在法律风险。对于重视数据主权、有合规要求的团队来说,数据不出服务器已经从极客玩具变成了刚需。

好消息是,开源模型在 2026 年已经足够好用。Qwen2.5、Llama 3.3、Mistral Small 3.1 这类开放权重模型,在 7B 到 70B 的体量上,日常问答、文档摘要、代码辅助完全能打。配合下面这套技术栈,你能在自己的 VPS 上搭出一个完全私有的 AI 助手,对话、向量检索、语音转写全在本地完成,对外零暴露。本文从「隐私优先」的角度讲清整套思路与最小可用的落地命令;而 OpenWebUI 的完整部署、反向代理 HTTPS 与多用户配置,本系列第 2 篇有逐行可抄的实操,详见本系列第 2 篇:/self-host-openwebui-vps-2026。

隐私优先架构的四条铁律

自托管 AI 的方案很多,但「隐私优先」必须守住四条底线,少一条都不算真正私有:

  • 推理不出机:模型在本地 GPU 或 CPU 上跑,prompt 和回答都不经过任何第三方 API。一旦把 Ollama 的接口接到云端转发,隐私承诺就作废了。
  • 存储不出机:向量库、会话历史、上传文档都留在本地磁盘,不上传到对象存储或任何云端知识库。ChromaDB 我们跑在本地容器里,而不是托管版。
  • 传输不外泄:远程访问走 Tailscale 这类零信任组网,不把 Ollama、Open WebUI 直接暴露到公网。端口不开放,攻击面就小一个数量级。
  • 日志不对外:关掉官方遥测与匿名统计(SCARF_NO_ANALYTICS、DO_NOT_TRACK、ANONYMIZED_TELEMETRY),所有运行日志留在本地,绝不回传厂商。

这四条里最常被忽视的是第三条。很多人图省事,直接把 3000 端口用 Caddy 反代到公网,等于把一家人的聊天记录挂在互联网上。隐私优先的正确姿势是用 Tailscale 把服务收进私有网络,详见本文第五步。

技术栈总览:五件武器

这套方案我用一句话概括:Ollama 负责推理、Open WebUI 负责对话界面、Whisper 负责语音转写、ChromaDB 负责向量记忆、Tailscale 负责安全远程。每一层都是开源、可私有部署、不需要调用任何外部 API。

  • Ollama:本地模型运行时,自动识别 GPU,提供 OpenAI 兼容接口。
  • Open WebUI:ChatGPT 风格的 Web 界面,多用户、会话历史、文档 RAG、语音输入。
  • Whisper:本地语音转文字,音频从不上传,适合会议纪要、访谈整理。
  • ChromaDB:轻量向量数据库,把你的私有文档变成可语义检索的知识库。
  • Tailscale:基于 WireGuard 的零配置组网,让你在手机和笔记本上安全访问 VPS,不用开公网端口。

这五层里,Ollama 与 Open WebUI 是「对话」的核心,Whisper 与 ChromaDB 是「多模态与记忆」的扩展,Tailscale 则是「安全远程」的护城河。下面按隐私优先级依次落地。

最低配置怎么选:实测经验

很多人卡在第一步就是被显存吓住。其实纯靠 CPU 也能跑小模型,只是慢一些。下面是实测的分档建议:

  • 轻量档(入门验证):2 核 4G 内存,跑 qwen2.5:3b 或 llama3.2:3b,CPU 推理,响应几秒到十几秒。适合先跑通流程。
  • 进阶档(日常可用):4 核 8G 以上内存,跑 7B 量化模型,配合一块入门 GPU 体验会好很多。
  • 生产档(小团队):8 核 16G 内存 + 中高端 GPU,可同时跑对话模型、嵌入模型和 Whisper。

省钱提示:如果你只是想低成本验证,RackNerdCloudcone年付小机很适合做轻量档实验;Bandwagon搬瓦工)的 CN2 线路对国内访问友好;Colocrossing 机房资源充足,适合需要大内存的进阶档;HostDareLisaHost亚洲优化线路对中文用户延迟更低。如果后期要上 GPU,VultrContabo 提供带显卡的实例;Gigsgigscloud 在亚太也有可玩的配置。先用便宜机器跑通整套流程,再按需升级,是避坑的关键。

第一步:装 Ollama 跑本地推理

在干净的 Ubuntu 22.04/24.04 上,安装只要一行。装完先拉一个 3B 模型验证:

curl -fsSL https://ollama.com/install.sh | sh
ollama pull qwen2.5:3b
ollama run qwen2.5:3b "你好,介绍一下你自己"

本机验证通过后,确认 Ollama 只监听本机回环地址,不要让 11434 端口直接暴露公网。Ollama 本身没有鉴权,一旦裸奔到公网,别人就能枚举你的模型、白嫖你的算力。这是最常见的翻车点,也是隐私优先最不能犯的错误。

如果想进一步收紧,可以在启动参数里加 OLLAMA_HOST=127.0.0.1,并配合防火墙只允许 Tailscale 网段访问。记住:Ollama 是整套栈里最该藏起来的组件,它既不鉴权,也不该被外部触碰。

第二步:Open WebUI 只做界面,部署细节交给系列第 2 篇

Open WebUI 负责对话界面、多用户与会话历史,是普通用户唯一会接触到的入口。它的完整容器部署、Caddy 反向代理 HTTPS、多用户权限配置,本系列第 2 篇《自建 OpenWebUI 对话栈》有逐行可抄的命令与踩坑清单。本文只给出最小可用的一行拉起,并把重点放在隐私约束上:

docker run -d -p 3000:8080   --add-host=host.docker.internal:host-gateway   -e OLLAMA_BASE_URL=http://host.docker.internal:11434   -e WEBUI_SECRET_KEY=换成你自己的随机字符串   -e SCARF_NO_ANALYTICS=true   -e DO_NOT_TRACK=true   -e ANONYMIZED_TELEMETRY=false   -v open-webui:/app/backend/data   --name open-webui   ghcr.io/open-webui/open-webui:main

关键约束:Open WebUI 自带的账号体系只防外人,不要直接把它对公网开放。远程访问请交给下面的 Tailscale,而非反向代理到公网。完整配置、vLLM 后端切换、RAG 文档问答调参请见本系列第 2 篇:/self-host-openwebui-vps-2026。从隐私优先的角度,我强烈建议即便上了 HTTPS,也只在 Tailscale 网段内暴露 3000 端口,把公网入口关掉。

第三步:Whisper 本地转写(音频从不上传)

想做会议纪要或访谈整理,千万别用 Otter.ai、Zoom 云这类把音频传上去的服务,敏感内容会外泄。本地用 faster-whisper 或 whisper.cpp 转写,音频从头到尾不离开服务器:

pip install faster-whisper
python -c "from faster_whisper import WhisperModel; m=WhisperModel('small'); segs,_=m.transcribe('meeting.mp3'); [print(s.text) for s in segs]"

实测下来,whisper-small 在中文会议场景已经相当可用;如果追求准确率上 large-v3,需要更多内存和算力。配合 FFmpeg 先做降噪预处理,能把背景噪音滤掉一大半,错词率明显下降。这一步常被「上云更准」的错觉误导,但只要数据敏感,本地转写就是唯一合规选项。

第四步:ChromaDB 向量库做私有 RAG

把合同、手册、研究资料变成可检索知识库,靠的是嵌入模型加向量库。嵌入用本地 nomic-embed-text,向量库用 ChromaDB,全程不出本机:

docker run -d -p 8000:8000 -v ~/chromadb:/data chromadb/chroma

然后用 Python 把文档切块、嵌入、入库:

from langchain_community.embeddings import OllamaEmbeddings
from langchain_community.vectorstores import Chroma

embeddings = OllamaEmbeddings(model="nomic-embed-text", base_url="http://localhost:11434")
vectordb = Chroma.from_documents(documents=splits, embedding=embeddings, persist_directory="./chroma_db")

ChromaDB 用 HNSW 算法,插入新文档只要几毫秒,还支持按元数据过滤(比如只搜 2026 年的合同)。这样你的 AI 助手回答时只基于你自己的资料,不会乱编,也不会把资料发到外面。注意:ChromaDB 同样不要映射公网端口,只在本地或 Tailscale 网段内给 Open WebUI 调用即可。

第五步:Tailscale 安全远程访问(零公网端口)

想在手机、笔记本上随时随地用这个私有 AI?最省心的方式是 Tailscale。装好之后服务器会拿到一个稳定的 100.x.x.x 内网地址,你在任何设备上都能像在同一局域网一样访问,全程 WireGuard 加密,完全不用开公网端口

curl -fsSL https://tailscale.com/install.sh | sh
sudo tailscale up

之后在你的手机和笔记本上也装上 Tailscale,直接访问 http://100.x.x.x:3000 就能用 Open WebUI。免费个人版支持 6 个用户、无限设备,对家庭或小团队足够。记住一个铁律:用 Tailscale Serve 在私有网络内暴露服务是安全的,但永远不要用 Funnel 把 Ollama 公开到公网。在隐私优先的架构里,Tailscale 是远程访问的唯一推荐通道,公网反向代理能省则省。

合规说明:GDPR 与 EU AI Act

自托管最直接的合规收益是:数据不出境,跨境传输义务从根本上就不会触发。GDPR 第五章关于个人数据出境的要求、标准合同条款(SCC)、充分性认定这些麻烦,在你的数据不离开服务器时基本不在讨论范围内。EU AI Act 方面,绝大多数内部本地 LLM 部署(文档检索、会议纪要、邮件起草、内部问答)不属于 Annex III 的高风险系统,不受 2027 年底那些高风险义务的约束;而且运行开放权重本地模型时,通用 AI 模型(GPAI)的披露义务在原始模型开发者身上,不在你这个内部部署者身上。

但自托管不是万能药。GDPR 第 6 条(处理的法律依据)、第 28 条(与主机商签数据处理协议 DPA)、第 35 条(高风险处理要做 DPIA)依然适用。即便数据在本地,你仍需和 VPS 供应商签署 DPA,明确对方是处理者。另外若你的 AI 界面对外服务,按 EU AI Act 第 50 条要在交互开始时标注这是 AI。

数据处理的边界:DPA 与标注义务

隐私优先不等于「什么都不用管」。即便整套栈都在本地,仍有三件合规动作不能省:第一,和 VPS 厂商签 DPA,把对方定位为数据处理者而非控制者;第二,如果对外提供 AI 界面,按 EU AI Act 第 50 条做 AI 标识;第三,对涉及特殊类别个人数据(健康、生物特征)的处理做 DPIA 评估。这三件事和「数据是否出机」是正交的——前者管的是数据内容的性质,后者管的是数据流向,两者都要守住。

另外提醒一点:模型权重本身来自第三方开放权重发布者,下载时要确认许可证(如 Llama 3.3 的社区许可、Qwen 的 Apache 2.0)。合规的「数据不出机」指的是你的提示词与文档不出机,而不是说你凭空拥有了模型。把许可证搞清楚,避免把受限权重用于超规模的商业服务。

避坑清单:踩过的坑都在这

  • 不要把 Ollama 的 11434 暴露公网:它无鉴权,裸奔等于开门揖盗,也直接破坏隐私优先前提。
  • Open WebUI 的账号体系不是公网防火墙:远程用 Tailscale,不要直接反向代理到公网。
  • 内存比算力更早成为瓶颈:模型装不下显存会溢出到内存,建议 32G 起步。
  • 模型磁盘要单独挂盘:一个 30B 模型加文档很容易突破 100G,别把系统盘撑爆。
  • pin 镜像版本::main 是滚动更新,生产环境用带 tag 的版本更稳定。
  • 备份 Open WebUI 数据卷:里面存着用户、会话和设置,丢了很头疼。
  • 关掉所有遥测开关:SCARF_NO_ANALYTICS、DO_NOT_TRACK、ANONYMIZED_TELEMETRY 全部设为 true,别让日志回传。