在开始之前
最近这些日子里,在 AI 模型领域出现了一个新颖的潮流,DeepSeek,革命性地改变了我们对大语言模型的看法,所有人都在尝试它,很多人在下载并且本地部署它。
然而本地自己部署 AI 模型存在一个缺陷,我们只能在运行模型的电脑上使用它,最多在同一个局域网内进行共享,通常在一个 NAT 后面。然而如果我们想要真正利用它,我们需要把它弄成可以在互联网上访问。
通常地,要将一个在 NAT 后面的服务变得可以在互联网上访问需要一些反向代理的手段,通常需要借助一个 ECS 服务器,这是需要付费的。然而我们希望自己部署 AI 模型的目的就是它是免费的,并且我们拥有完全的隐私控制,否则,我们就会选择从线上的 AI 提供商那里进行订阅了。
解决方法
因此,我开发了一个基于 Web 的反向代理程序 webrp,它可以被部署在 Deno Deploy 上,它是完全免费的。我们可以用它连接一个部署在本地使用 Ollama 运行的 AI 模型。我已经使用了一周多了。我在家中的笔记本上使用它,在办公室的工作站上使用它,同时在我的手机上使用它。
今天我将会分享给所有人并阐述如何通过它来绕过 NAT 及反向代理部署在家中的 AI 模型,使我们可以在任何地点使用它,并且不需要花一分钱。
文章中接下来的内容需要一点 Node.js 和 Deno 的知识,因为代理程序是使用 TypeScript 编写的,并且服务端将会被部署在 Deno Deploy 上。
准备
首先,我们当然是要安装 Ollama 并拉取和运行一个 AI 模型:
# for macOS
brew install ollama
# for Linux
curl -fsSL https://ollama.com/install.sh | sh # for Linux
# For Windows, goto https://ollama.com/download/windows and follow the instructions.
# Then pull and run a model, say
ollama run deepseek-r1
Bash等待这些命令执行完成,我们就会有一个运行在本地的 AI 模型。
然后,前往 GitHub 并 Fork webrp,这会为你创建一个该程序的拷贝。
部署代理服务器
现在,前往 Deno Deploy,使用 GitHub 账号进行登录,接着创建一个新项目,使用这个刚 forked 的仓库,并将项目的入口程序设置为 server/main.ts
,就像这样:


就是这么简单,服务器将会在几分钟内启动。
遇到问题?
如果你此前从未使用过 GitHub Actions,很大概率上这次部署将会失败或者一直卡着不动,因为 Deno Deploy 无法自动地为你在 GitHub 上初始化部署流程。要解决这个问题,前往你的 GitHub 仓库,然后切换到 Actions 页面,GitHub 会询问你是否要启用 GitHub Actions,如果你此前还未启用过。
然后,在 Deno Deploy 上重新创建项目,现在,自动部署流程应该能够正确工作了。
接着我们可以在浏览器上打开新项目的 URL,它将会返回 No proxy client
,这是因为我们还没有启动代理客户端。我们将会在接下来的步骤中启动它。
启动代理客户端
在我们运行 Ollama 的电脑上,克隆上面的 GitHub 仓库,然后添加一个 .env
文件来配置客户端程序,像这样:
git clone https://github.com/ayonli/webrp # You can replace with your own repo URL.
cd webrp
vim .env
Bash然后在打开的 Vim 编辑器中,添加这些配置:
CLIENT_ID=mac@home # A unique id of your computer
REMOTE_URL=https://ayonli-webrp.deno.dev # Replace with your own URL
LOCAL_URL=http://localhost:11434 # This is the default Ollama API URL
INI然后使用下面这些其中一个命令来启动客户端程序:
deno task client # make sure Deno is installed
# or
npm install # makre sure Node.js installed
npm run client
Bash当连接建立后,一条消息 Connected to the server
将会被打印出来。
现在刷新网页,我们将能够看到 Ollama is running
,表示代理程序已经正确地设置好了。
在任何地方使用 AI
电脑上
在电脑上,我建议在 Google Chrome 中使用 Page Assist 插件,因为 Chrome 可以跨设备同步插件和它们的配置,这样我们就可以随时随地使用我们的 AI 模型,而不需要每一次更换设备时都重新设置。更重要的是,Page Assit 允许我们自定义 Ollama 设置,设置额外的请求头,这很重要,这使我们可以在代理 Ollama API 时提供一层授权认证机制。
在初次使用 Page Assist 时,我们很有可能会遇到 403 Forbidden 错误。因为 Page Assist 是一个运行在 localhost 上的浏览器插件,当调用远程的 Ollama API 时,CORS 策略将会被触发,而 Ollama 默认不允许跨域访问其 API。要解决这个问题,打开 Page Assist 的设置(Settings),切换到 Ollama Settings,然后展开 Advance Ollama URL Configuration,启用 Custom Origin URL 并将源地址设置为 http://localhost:11434
。

这将会修复 CORS 问题,现在我们的 AI 模型已经准备好可以聊天了。
手机上
实际上我只有一个 iPhone,我建议使用 Enchanted App,它也允许我们在调用 Ollama API 时设置额外的授权信息。安卓手机可能有相似的应用,你可以自行探索并分享在评论区。
为服务增加安全性
服务端
如上面提到的,如果我们的 Ollama 客户端支持额外的授权设置,我们应该使用它们并配置代理服务器来防止除我们之外的其他人进行 API 调用。因为运行 AI 模型会消耗电脑上的大量系统资源,我们不会想让任何其他人调用我们的 Ollama 服务,无论是有意还是无意的。
要配置服务器,回到 Deno Deploy 并打开代理服务器项目,切换到设置(Settings)页面,在环境变量(Environment Variables)中,添加这些变量:
CONN_TOKEN=your_private_token # For client connection, will talk about it later.
AUTH_TOKEN=your_private_token # For API calls
AUTH_RULE=^\/api\/ # Configure that only /api/ endpoints will require
# authentication. This is important, don't require
# authentication for other routes, otherwise the helth
# checker of Ollama clients will stop working.
INI保存后,Deno Deploy 会帮我们自动重启服务器。
Ollama 客户端
现在服务器需要通过授权才能工作,我们需要正确地配置 Ollama 客户端才行。
在 Page Assit 中,打开设置(Settings),切换到 Ollama Settings,展开 Advance Ollama URL Configuration,增加一个 Authorization
请求头并设置为你的私有密钥。
在 Enchanted 中,打开设置(Settings),在 Bearer Token 中填入你的私有密钥。
代理客户端
除了调用 Ollama API 的授权认证设置外,我们还在服务器上设置了一个 CONN_TOKEN
,这个设置用来限制什么样的代理客户端才能连接到这个代理服务器上并成为它的上游服务。我们绝对不会想要其他人连接到我们的代理服务器并弄乱我们的服务。
我们需要更新客户端的 .env
文件来满足这个新设置,增加一个 CONN_TOKEN
并设置为与服务器上相同的值,然后重启客户端。
现在我们的代理服务器已经足够安全并能真正使用了。
需要更多信息?
webrp 仓库中提到了其他在这篇文章中未涉及的信息,如果你在配置代理服务时遇到问题,不要忘了去阅读它的 README 文档或者提交 Issue。