目的
在本筆記中,將介紹如何在 Docker 中部屬 Ollama 服務,並且使用 Tailscale 來實現遠程訪問。這樣可以在任何地方,只要於電腦上安裝 Tailscale,就能夠安全的訪問我們的 Ollama 服務。
緣起
主要由於 Ollama 僅提供模型的本地部署能力,並無提供任何安全防護機制,如果使用者不小心將服務暴露在公網上,可能會導致安全風險。
而過去我將本地服務暴露於公網往往都是使用 Cloudflare Tunnel,讓我可以透過 Cloudflare 的驗證機制來保護服務的安全性。然而,這在 Ollama 這樣 API 服務的場景下並不適用,因為 Cloudflare Tunnel 的驗證機制會導致 API 請求失敗。總不能讓 API 請求都要帶上 Cloudflare 的驗證資訊吧?
另外,因為我的電腦都有安裝 Tailscale 用於遠程管理,所以我想說還沒用過 Tailscale Serve 這個功能,可以將服務僅暴露在 Tailscale 網路中又有 https 加密,可以大幅減少安全風險。
環境準備
- 本人電腦使用 Ubuntu 24.04.3 LTS。
- 跟我一樣有 NVIDIA 顯卡的話,記得安裝驅動程式。
- 安裝 Docker 和 Docker Compose(參考 Docker 官方文檔)。
- 跟我一樣有 NVIDIA 顯卡的話,可另外安裝 NVIDIA Container Toolkit(參考 NVIDIA 官方文檔)。
- 安裝 Tailscale 並於目標電腦設置好帳戶(參考 Tailscale 官方文檔)。
- 確保伺服器端與客戶端皆已安裝 Tailscale 並登入同一帳號。
部屬
Docker Compose 配置
- 創建一個新的 Docker Compose 文件
docker-compose.yml,內容如下:services: ollama: volumes: - ./ollama/ollama:/root/.ollama container_name: ollama pull_policy: always tty: true restart: unless-stopped image: ollama/ollama:latest ports: - 127.0.0.1:11434:11434 # 僅將 Ollama 服務綁定在本地地址,防止直接暴露在公網上。 environment: - OLLAMA_KEEP_ALIVE=24h - OLLAMA_ORIGINS="*" networks: - ollama-docker deploy: # 如果有 NVIDIA 顯卡,則加上這段配置來啟用 GPU 支援。 resources: reservations: devices: - driver: nvidia count: all capabilities: [gpu] networks: ollama-docker: driver: bridge - 啟動 Docker Compose:
docker-compose up -d
Tailscale Serve 配置
Tailscale 有兩種本地服務暴露方式,分別是 Serve 和 Funnel,兩者都會提供 HTTPS 加密,但 Serve 是將服務暴露在 Tailscale 網路中,而 Funnel 則是將服務暴露在公網上。
由於 Ollama 服務本身沒有任何安全機制,所以我們選擇使用 Serve 來將服務僅暴露在 Tailscale 網路中,這樣就算有人知道了服務的 IP 地址,也無法直接訪問服務,必須先加入 Tailscale 網路才能訪問。
- 在終端機中執行以下命令來啟用 Tailscale Serve:
這條命令會將本地的 11434 端口(Ollama 服務)暴露在 Tailscale 網路中,並且使用 HTTPS 加密。sudo tailscale serve --bg --https=443 http://127.0.0.1:11434 - 確認服務是否成功啟用:
如果看到類似以下的輸出,表示服務已成功啟用:sudo tailscale serve statushttps://<your-tailscale-address> (tailnet only) |-- / proxy http:///<your-tailscale-ip>:11434 - 在其他設備上安裝 Tailscale 並登入同一帳號,然後訪問
https://<your-tailscale-address>就可以安全地訪問 Ollama 服務了。
補充
如果有要在同一個 Tailscale 網路中部屬多個服務,可以使用不同的本地端口來區分,然後在 Tailscale Serve 中配置不同的路徑來對應不同的服務。例如:
sudo tailscale serve --bg --https=443 http://127.0.0.1:11434
sudo tailscale serve --bg --https=444 http://127.0.0.1:11435這樣就可以將 Ollama 服務暴露在 https://<your-tailscale-address>:443,而另一個服務則暴露在 https://<your-tailscale-address>:444。