2025年11月17日 星期一

Windows Ollama 多使用者共享與 WSL Docker 服務器化配置筆記


看來給 AI 整理的筆記還是不太行,後面有力氣再來補漏吧!


本指南記錄了如何在 Windows 環境下,建立一個系統級別的 Ollama 服務(實現多帳號共享模型),並將 Open WebUI 服務遷移到 WSL 2 的原生 Docker Engine 中,以確保服務獨立、穩定地運行。


🎯 階段一:Windows Ollama 獨立服務版安裝與設定

目標: 安裝獨立版 Ollama,設定共享模型路徑,並將其設定為開機自啟動的系統服務。


1. 下載與安裝獨立執行檔 (Standalone)

使用 GitHub 上的獨立版本,避免桌面版帶來的用戶綁定問題。


下載獨立執行檔 (Standalone ZIP):


請開啟 Ollama 的官方 GitHub 發布頁面:https://github.com/ollama/ollama/releases


在最新的版本中,找到並下載 ollama-windows-amd64.zip 這個檔案。


注意: 不要下載 OllamaSetup.exe。


建立程式資料夾:


開啟檔案總管,到 C:\Program Files\。


建立一個新資料夾,命名為 Ollama。 (最終路徑為 C:\Program Files\Ollama)


解壓縮:


將您下載的 ollama-windows-amd64.zip 中的 ollama.exe 檔案,解壓縮到 C:\Program Files\Ollama 資料夾中。


將 Ollama 加入系統 Path: (讓所有帳號都能找到命令)


回到「編輯系統環境變數」>「環境變數...」。


在**下半部「系統變數」**中,找到 Path 變數,點選「編輯(E)...」。


點選「新增(N)」,並輸入 C:\Program Files\Ollama。


一路按「確定」儲存。


2. 模型共享配置 (環境變數)

將模型的預設儲存路徑從用戶目錄移到系統共享目錄。


操作: 在 Windows 系統環境變數中,新增以下變數:


變數名稱: OLLAMA_MODELS


變數值: C:\ProgramData\Ollama\models


3. 驗證服務與共享設定

在設定自動啟動前,先手動測試服務是否正常運作。


重新啟動電腦 (必要步驟):


請務必重新啟動電腦。這能確保新的 Path 變數和 OLLAMA_MODELS 變數被系統完全載入。


手動啟動服務 (測試):


電腦重啟後,登入您的本機管理員帳號。


開啟 CMD (以系統管理員身分執行)。


輸入命令:ollama serve


(請不要關閉這個視窗,它現在正在運行服務)


驗證 (使用兩個帳號):


(本機帳號) 另外開啟一個新 CMD,輸入 ollama list。確認能看到共享目錄內的模型。


(網域帳號) 登出並切換到網域帳號,開啟 CMD,輸入 ollama list。確認能看到相同的模型清單。


4. Ollama 服務自動啟動 (Task Scheduler)

確認驗證無誤後,設定 Ollama 隨開機自動啟動。


操作:


開啟 工作排程器 (Task Scheduler)。


建立新的工作 (Ollama Shared Server)。


一般標籤:勾選 以最高權限執行,設定執行帳戶為系統管理員帳號。


觸發程序標籤:新增 啟動時 (At startup)。


動作標籤:


程式或指令碼: C:\Program Files\Ollama\ollama.exe


新增引數: serve


結果: Ollama 服務器在 Windows 開機後自動運行在 http://127.0.0.1:11434。


🌐 階段二:Docker 環境遷移至 WSL 原生 Engine

目標: 移除 Docker Desktop 依賴,安裝 WSL 原生 Docker Engine。


1. 準備 WSL 2 環境與 Systemd 設定

操作: 移除 Docker Desktop,並啟用 WSL Systemd 支援。


編輯 /etc/wsl.conf,新增或確認以下內容:


Ini, TOML


[boot]

systemd=true

重啟 WSL: 在 Windows CMD/PowerShell 中執行 wsl --shutdown,然後重新開啟 WSL 終端機。


2. 安裝原生 Docker Engine (完整步驟)

在 WSL 終端機 (Ubuntu-22.04) 中,使用 Docker 官方儲存庫進行安裝。


步驟 A: 移除舊版本與安裝依賴:


Bash


sudo apt-get remove docker docker-engine docker.io containerd runc

sudo apt-get update

sudo apt-get install ca-certificates curl gnupg

步驟 B: 設定 GPG Key 和 Repository:


Bash


# 新增 Docker 的 GPG 金鑰

sudo install -m 0755 -d /etc/apt/keyrings

curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg


# 設定儲存庫位址

echo \

  "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \

  $(. /etc/os-release && echo "$VERSION_CODENAME") stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

步驟 C: 安裝核心套件與啟動服務:


Bash


sudo apt-get update

sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin


# 啟動 Docker 服務

sudo service docker start

步驟 D: 配置使用者權限:


Bash


sudo usermod -aG docker $USER

# 退出 WSL 並重新進入以生效

🔗 階段三:Open WebUI 部署與連線

目標: 在 WSL Docker 中部署 WebUI,並正確連線到 Windows 主機上的 Ollama 服務。


1. 取得 Windows 主機 IP (連線關鍵)

WebUI 容器需要明確知道 Windows 主機(Ollama 服務)的 IP 地址。


操作: 在 WSL 終端機中執行此命令:


Bash


# 獲取 Windows 主機 IP 並存入變數 WIN_IP

WIN_IP=$(cat /etc/resolv.conf | grep nameserver | cut -d ' ' -f 2)

echo $WIN_IP

(請記住這個 IP 地址)


2. 部署 Open WebUI 服務

使用 WIN_IP 設定 OLLAMA_API_BASE_URL 環境變數,並映射到 4000 埠。


操作: 在 WSL 終端機中執行:


Bash


docker run -d -p 4000:8080 -e OLLAMA_API_BASE_URL="http://$WIN_IP:11434" -v open-webui:/app/backend/data --name open-webui --restart always ghcr.io/open-webui/open-webui:main

存取: http://localhost:4000

接下來安裝 gitlab

這是一個非常有野心的決定!GitLab 是一個功能非常強大(但也非常「重」)的 DevOps 平台。

與輕量級的 Gitea 不同,GitLab 對硬體資源的要求相當高。在開始之前,請務必確認您的電腦狀況:

⚠️ 資源警告:

  • 記憶體 (RAM): GitLab 至少需要 4GB 的專用記憶體才能勉強運行,建議 8GB 以上 才能順暢使用。如果您的筆電總記憶體只有 16GB 且同時跑 Ollama + WebUI + Windows,GitLab 可能會讓系統變得很慢。

  • 啟動時間: GitLab 容器啟動通常需要 2~5 分鐘 才能看到登入畫面,請耐心等待。

如果您確認硬體足夠,我們將繼續使用您現有的 WSL Native Docker 環境來部署 GitLab CE (Community Edition)


🚀 階段一:準備工作

為了確保資料(程式碼、使用者、設定)不會因為容器刪除而消失,我們需要建立專用的儲存卷 (Volume) 或目錄。在 WSL 中,我們直接使用 Docker Volume 比較簡單管理。

我們還需要規劃 連接埠 (Ports),避免與現有服務衝突:

  • HTTP (Web): 預設是 80,我們將映射到 8929 (避免與 WebUI 的 4000 或 Windows 預設服務衝突)。

  • SSH (Git): 預設是 22,我們將映射到 2224 (避免與 Windows 或 WSL 的 SSH 衝突)。

🛠️ 階段二:部署 GitLab 容器

請在您的 WSL 終端機 中執行以下命令。

這個命令比較長,因為我們需要透過環境變數 GITLAB_OMNIBUS_CONFIG 直接設定 GitLab 的內部參數,讓它知道我們改了 Port,這樣它產生的 git clone 網址才會是正確的。

Bash
docker run -d \
  --hostname localhost \
  --publish 8929:8929 \
  --publish 2224:22 \
  --name gitlab \
  --restart always \
  --volume gitlab_config:/etc/gitlab \
  --volume gitlab_logs:/var/log/gitlab \
  --volume gitlab_data:/var/opt/gitlab \
  --shm-size 256m \
  --env GITLAB_OMNIBUS_CONFIG="external_url 'http://localhost:8929'; gitlab_rails['gitlab_shell_ssh_port'] = 2224;" \
  gitlab/gitlab-ce:latest

指令解析:

  • --publish 8929:8929: 將 Web 介面開在 8929。

  • --publish 2224:22: 將 SSH 介面開在 2224。

  • --volume ...: 建立三個 Volume 來保存設定、日誌和數據。

  • --shm-size 256m: 解決 GitLab 在 Docker 中常見的記憶體共享錯誤。

  • GITLAB_OMNIBUS_CONFIG: 這是最關鍵的!

    • external_url: 告訴 GitLab 首頁網址是 http://localhost:8929

    • gitlab_shell_ssh_port: 告訴 GitLab SSH 走的是 2224 port,這樣複製按鈕給出的 SSH 連結才會正確。

⏳ 階段三:等待啟動與獲取密碼

這是最考驗耐心的一步。

  1. 等待啟動: 執行 docker logs -f gitlab 查看日誌。您會看到大量的設定訊息在跑。

    • 直到您看到類似 Run: gitlab-ctl reconfigure 完成,或者日誌變慢並顯示系統監控訊息時,才算啟動完成。

    • 初次啟動可能需要 3-5 分鐘。

  2. 獲取初始 root 密碼: GitLab 啟動後,會自動生成一個隨機的 root 密碼。請開啟新的 WSL 視窗執行以下命令來查看:

    Bash
    docker exec -it gitlab grep 'Password:' /etc/gitlab/initial_root_password
    
    • 請複製這串密碼。 (注意:這個檔案會在 24 小時後自動刪除,請盡快登入並修改密碼)。

🌐 階段四:登入與基本設定

  1. 存取網頁: 開啟 Windows 瀏覽器,輸入:

    http://localhost:8929
    
  2. 登入:

    • Username: root

    • Password: (貼上剛剛獲取的密碼)

  3. 修改密碼 (強烈建議): 登入後,點擊右上角頭像 -> Preferences -> Password,將密碼修改為您容易記住的密碼。

  4. 關閉註冊 (選用,建議私人使用): 為了安全,建議關閉公開註冊功能:

    • 進入 Menu (左上角漢堡選單) -> Admin (管理員區域)。

    • Settings -> General -> Sign-up restrictions

    • 取消勾選 Sign-up enabled

    • 滑到最下方點擊 Save changes


📝 如何使用 (Clone/Push)

現在您的 GitLab 已經架設好了,兩個帳號(本機/網域)的使用方式如下:

使用 HTTP (最簡單)

Bash
# Clone 專案
git clone http://localhost:8929/root/my-project.git
  • 系統會提示輸入帳號密碼。

使用 SSH (推薦,需設定 Key)

因為我們改了 SSH Port,所以指令會稍微不同:

Bash
# Clone 專案 (注意 ssh:// 前綴和 :2224 埠號)
git clone ssh://git@localhost:2224/root/my-project.git

🚨 常見問題排查

Q: 瀏覽器顯示 502 Bad Gateway?

  • A: GitLab 還沒完全啟動。請再等 1-2 分鐘重新整理網頁。如果持續很久,可能是記憶體不足,GitLab 的部分服務崩潰了。

Q: 電腦變得很慢?

  • A: 如開頭所述,GitLab 吃記憶體怪獸。您可以透過限制它的程序數量來優化,但設定較複雜。如果您覺得太慢,隨時可以使用以下命令刪除它,改用 Gitea:

    Bash
    docker stop gitlab
    docker rm gitlab
    # 刪除資料 (小心!)
    docker volume rm gitlab_config gitlab_logs gitlab_data
    

您想現在就開始部署,還是因為資源考量想回頭考慮 Gitea?

這是一個非常關鍵的問題!答案是:Ollama 會自動啟動,但 Docker (WebUI/GitLab) 目前還不會。

原因在於:

  1. Ollama: 我們已經設定了 Windows 工作排程器,所以它沒問題,開機就會跑。

  2. Docker/WebUI/GitLab: 雖然容器設定了 --restart always,但它們運行在 WSL 2 裡面。WSL 2 本身預設不會隨 Windows 開機自動啟動。如果不啟動 WSL,裡面的 Docker 引擎就不會跑,容器自然也不會動。

我們需要補上最後一塊拼圖:設定 WSL 隨開機自動啟動

請依照以下兩個步驟操作,就能達成全自動化:

步驟一:確保 Docker 在 WSL 內部設定為自動啟動

雖然我們啟用了 Systemd,但要確保 Docker 服務被設定為「啟用 (Enabled)」狀態,這樣 WSL 一開機它就會跑。

  1. 開啟 WSL 終端機

  2. 輸入以下指令:

    Bash
    sudo systemctl enable docker
    
    • (如果它顯示已經啟用或建立了 symlink,那就沒問題。)

步驟二:設定 Windows 自動啟動 WSL (工作排程器)

我們需要再建立一個工作排程,讓電腦一開機就在背景「喚醒」WSL。

  1. 回到 Windows,開啟「工作排程器 (Task Scheduler)」。

  2. 點選「建立工作...」。

  3. 一般 (General) 標籤:

    • 名稱: 輸入 Start WSL Docker

    • 執行帳戶: 使用您的 本機管理員帳號

    • 勾選 「不論使用者是否登入都要執行 (Run whether user is logged on or not)」 (這很重要,這樣它會在背景執行,不會跳出視窗)。

    • 勾選 「以最高權限執行」

  4. 觸發程序 (Triggers) 標籤:

    • 點選「新增」。

    • 開始工作: 選擇 「啟動時 (At startup)」

  5. 動作 (Actions) 標籤:

    • 點選「新增」。

    • 程式或指令碼: 輸入 wsl.exe

    • 新增引數: 輸入 -d Ubuntu-22.04

      • (註:如果您只有一個 Linux 發行版,或者 Ubuntu-22.04 是預設值,這裡也可以只輸入 -d Ubuntu-22.04 確保指定正確。如果不確定名稱,可以在 PowerShell 輸入 wsl -l 查看)

      • 建議: 如果您的發行版名稱確實是 Ubuntu-22.04,就填 -d Ubuntu-22.04。如果只顯示 Ubuntu,就填 -d Ubuntu

  6. 條件 (Conditions) 標籤 (選用但建議):

    • 取消勾選 「只有在電腦使用 AC 電源時才啟動」 (以免筆電用電池開機時服務沒跑)。

  7. 設定 (Settings) 標籤:

    • 取消勾選 「如果執行超過下列時間便停止工作」 (我們要它一直跑)。

  8. 點選「確定」,並輸入您的密碼儲存。


✅ 最終結果

完成上述設定後,您的電腦開機流程會變成:

  1. Windows 開機

  2. Ollama 排程啟動 -> Ollama 服務上線 (Port 11434)。

  3. WSL 排程啟動 -> 喚醒 Ubuntu 環境。

  4. Systemd 啟動 -> 觸發 Docker 服務啟動。

  5. Docker 啟動 -> 偵測到 WebUI 和 GitLab 容器有 --restart always 標籤 -> 自動啟動容器。

這樣您重開機後,等待約 1~3 分鐘(視 GitLab 啟動速度而定),就可以直接用瀏覽器存取所有服務了!