跳轉至

Ollama

Overview

Ollama 係一個開放原始碼嘅大型語言模型(LLM)執行工具,專為喺本地或自架伺服器上運行開放權重模型而設計。Oracle Cloud Free Tier 嘅 Ampere A1(ARM64)執行個體常見配置提供 4 OCPU 同 24GB RAM,足以運行 7B 至 13B 級別嘅模型。透過呢個 wiki 記載嘅 Docker Compose 架設,Ollama 會以容器形式運行,並由 Open WebUI 提供網頁介面。

呢個部署方案嘅重點係「自架、隱私保障、低成本」。因為 Ollama 完全喺自己控制嘅 Oracle Cloud 伺服器內執行,對話數據唔會離開自家網絡。配合 Cloudflare Tunnel,主機更可以完全唔開放任何對外 Port,大幅降低被掃描同攻擊嘅風險。

Architecture

整套服務由兩個容器組成:

  • Ollama:負責模型推理,容器內部開放 11434 Port,但冇映射去 Host。模型資料存放喺 Volume ollama_data,即使容器更新後,模型仍然保留。
  • Open WebUI:提供視覺化對話介面,原身支援 ARM64。容器內部使用 8080 Port,經 OLLAMA_BASE_URL=http://ollama:11434 連去 Ollama 容器。用戶資料存放喺 Volume open-webui_data

兩個容器都連接喺自訂網絡 cf_network,並分配固定 IP:Ollama 係 172.21.0.29,Open WebUI 係 172.21.0.9。 Cloudflare Tunnel 可以直接經 Docker 網絡轉發流量到 Open WebUI 嘅 8080 Port,唔需要靠 Host Port Mapping。

Internet → Cloudflare Tunnel → http://172.21.0.9:8080 (Open WebUI) → http://ollama:11434 (Ollama)

Deployment

首先要有 Oracle Cloud Linux 執行個體,並安裝好 Docker Engine 同 Docker Compose Plugin。亦要預先建立 Cloudflare Tunnel,或者用同一網絡內另一個容器執行。

因為 compose 檔使用固定 IP,需要手動建立帶有 Subnet 嘅 Docker 網絡:

docker network create --driver bridge --subnet 172.21.0.0/24 cf_network

然後建立 docker-compose.yml。以下係本部署採用嘅重點設定:

version: '3.8'

services:
  # Ollama 推理引擎 (原生支援 ARM64)
  ollama:
    image: ollama/ollama:latest
    container_name: ollama
    restart: unless-stopped
    volumes:
      # 持久化模型資料,避免 Watchtower 更新時遺失
      - ollama_data:/root/.ollama
    networks:
      cf_network:
        ipv4_address: 172.21.0.29
    # 安全守則:不映射 Host Port
    # ports:
    #   - "11434:11434"
    environment:
      - OLLAMA_NUM_PARALLEL=1        # 限制並發處理請求數為 1
      - OLLAMA_MAX_LOADED_MODELS=1   # 限制最多同時載入 1 個模型
    deploy:
      resources:
        limits:
          memory: 12G

  # Open WebUI 視覺化對話介面 (原生支援 ARM64)
  open-webui:
    image: ghcr.io/open-webui/open-webui:main
    container_name: open-webui
    restart: unless-stopped
    environment:
      # 指向同一網域內的 Ollama 容器
      - OLLAMA_BASE_URL=http://ollama:11434
      # 關閉註冊功能,提升安全性
      - ENABLE_SIGNUP=False
    volumes:
      - open-webui_data:/app/backend/data
    networks:
      cf_network:
        ipv4_address: 172.21.0.9
    # 安全守則:不映射 Host Port,由 Cloudflare Tunnel 反代至容器內部 8080
    # ports:
    #   - "8080:8080"

volumes:
  ollama_data:
  open-webui_data:

networks:
  # 連接現有的 Cloudflare Tunnel 網路
  cf_network:
    external: true

啟動服務:

docker compose up -d

之後喺 Cloudflare Tunnel 後端加入:

http://172.21.0.9:8080

就可以透過網域訪問 Open WebUI。

Configuration

OLLAMA_NUM_PARALLEL=1OLLAMA_MAX_LOADED_MODELS=1 係兩個重要環境變數。 Oracle Cloud 免費方案雖然有 24GB RAM,但唔係無限資源。限制並發請求數量同模型載入數量,可以避免 Ollama 因為記憶體耗盡而被 OOM Killer 終止。

deploy.resources.limits.memory: 12G 係另外一層保護。即使模型突然佔用大量記憶體,Docker 都會強制限制喺 12GB 以內,留低資源俾 Open WebUI 同系統運作。

ENABLE_SIGNUP=False 確保 Open WebUI 唔會開放公開註冊。只有管理員帳號或者經 Cloudflare Access 控制嘅用戶先可以使用。若果需要高安全性,可以將 Cloudflare Access 做埋 SSO 認證。

Volume 設定同樣重要。 ollama_data 保存模型檔案;open-webui_data 保存聊天記錄、用戶設定同管道資料。就算容器被 Watchtower 更新,資料都唔會遺失。

Operations

日常操作可以用以下指令:

# 查看日誌
docker compose logs -f ollama
docker compose logs -f open-webui

# 進入 Ollama 容器
docker exec -it ollama bash

# 下載模型
docker exec -it ollama ollama pull llama3.1

# 列出已下載模型
docker exec -it ollama ollama list

# 刪除模型
docker exec -it ollama ollama rm llama3.1

如果使用 Watchtower 自動更新,建議同時監察 docker stats 同日誌。更新後若發現記憶體使用異常,可以手動 docker compose restart ollama

備份方面,可以備份整個 Volume:

docker run --rm -v ollama_data:/data -v $(pwd):/backup alpine tar czf /backup/ollama_data.tar.gz -C /data .

同樣方式可以備份 open-webui_data。還原時只要解壓返去 Volume 目錄再重啟容器即可。

FAQ

點解唔映射 Host Port?
呢個係安全設計。既然 Cloudflare Tunnel 可以直接連到容器內部 808011434,Host 就無需要開放任何 Port,減少被網絡掃描工具發現嘅機會。

Open WebUI 連唔到 Ollama?
檢查兩個容器係咪喺同一 Docker Network,以及 OLLAMA_BASE_URL 是否正確。可以試下 docker exec -it open-webui curl http://ollama:11434。另外要確認 Ollama 容器已經成功啟動。

Oracle Cloud 免費機夠唔夠力?
夠用,但要揀啱模型。7B 至 13B 模型配合 OLLAMA_NUM_PARALLEL=1 同 12G 記憶體限制,喺 Ampere ARM64 上可以流暢運行。較大規模模型例如 34B 或以上,可能需要更高配置。

點解要用兩個容器?
Ollama 本質上係 API 引擎,直接操作冇網頁介面。Open WebUI 負責提供使用者友善介面,同時可以集中管理聊天歷史。兩者分離,日後亦可以將 Ollama API 接去其他工具,例如 LiteLLM。

Source

Coverage auto (container scan)