目的

在本筆記中,將介紹如何在 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 配置

  1. 創建一個新的 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
  2. 啟動 Docker Compose:
    docker-compose up -d

Tailscale Serve 配置

Tailscale 有兩種本地服務暴露方式,分別是 ServeFunnel,兩者都會提供 HTTPS 加密,但 Serve 是將服務暴露在 Tailscale 網路中,而 Funnel 則是將服務暴露在公網上。
由於 Ollama 服務本身沒有任何安全機制,所以我們選擇使用 Serve 來將服務僅暴露在 Tailscale 網路中,這樣就算有人知道了服務的 IP 地址,也無法直接訪問服務,必須先加入 Tailscale 網路才能訪問。

  1. 在終端機中執行以下命令來啟用 Tailscale Serve:
    sudo tailscale serve --bg --https=443 http://127.0.0.1:11434
    這條命令會將本地的 11434 端口(Ollama 服務)暴露在 Tailscale 網路中,並且使用 HTTPS 加密。
  2. 確認服務是否成功啟用:
    sudo tailscale serve status
    如果看到類似以下的輸出,表示服務已成功啟用:
    https://<your-tailscale-address> (tailnet only)
    |-- / proxy http:///<your-tailscale-ip>:11434
    
  3. 在其他設備上安裝 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