xCloud 部署 Jupyter Notebook 實戰:整合 Docker、Cloudflare 與 Nginx 反向代理

在先前的文章《Python – 建立 Jupyter Notebook 雲端開發環境》上篇中,我們完成了 DigitalOcean Droplet 的基礎建置。依照傳統的正規路徑,接下來必須透過 SSH 登入主機,手動處理 Python 環境變數、Virtualenv 虛擬環境以及 Jupyter 的繁瑣安裝與防火牆設定。

對於量化交易者或資料科學家來說,擁有一個隨時隨地可存取、且運算資源獨立的 Jupyter Notebook 環境是夢寐以求的配置。特別是當你需要進行長時間的選擇權歷史回測,或者不想讓繁重的運算佔用你筆電的資源時,雲端環境是最佳解法。

這也是為什麼在我們最新升級的《Python 選擇權量化實戰》課程中,特別推薦學員使用此方案來部署策略實驗室

然而,傳統的 SSH 部署方式繁瑣且充滿坑洞。本文將示範如何透過 xCloud 面板結合 Docker 技術,在 20 分鐘內完成 DigitalOcean 主機上的 Jupyter Notebook 雲端環境搭建,並整合 Cloudflare SSL 與 Nginx 反向代理,打造高效安全的量化開發平台。

環境準備與架構說明

在開始之前,請確認你已擁有 xCloud 帳號與 DigitalOcean (或 Vultr、Hetzner) 帳號。

xCloud 免費方案 → 自管一個主機,10 個網站/應用
DigitalOcean 免費額度 → 30 天,美金 $300
Vultr 免費額度 → 兩個月,美金 $200

本次部署採用 Docker 容器化方案,而非直接安裝於 Host OS。原因在於 xCloud 本質上是為 WordPress 與 PHP 應用最佳化調校的管理工具,它接管了主機的 Nginx、PHP-FPM 與資料庫設定。直接在 OS 層級安裝 Python 環境可能會與 xCloud 使用的套件產生衝突,甚至在面板更新時被覆蓋。Docker 將 Jupyter 環境隔離,既能享受 xCloud 的便利,又互不干擾。

架構圖解

外網請求 (HTTPS:443) → Cloudflare (SSL) → xCloud 管理的 Nginx (Reverse Proxy) → Docker Container (Localhost:8888) → Jupyter Notebook

xCloud x Jupyter with Docker and Cloudflare

步驟一:透過 xCloud Commands 安裝 Docker 環境

首先,在 xCloud 後台連接你的 DigitalOcean 帳號,並透過 Create Server 建立一台新的 Droplet。

xCloud 連結目前已有的 Digital Ocean 帳號

建議選擇 Ubuntu 22.04 LTS 或 24.04 LTS 版本,規格至少為 2GB RAM,以確保 Python 運算流暢。

伺服器建立完成後,需要一次安全性更新的主機重啟 (Reboot),接著點選進入該伺服器管理介面。我們不再需要開啟 Putty 或 Terminal,直接點選左側選單的 Management → Commands

xCloud Commands 頁面

執行安裝指令

點擊 + Run Custom Command 會跳出以下視窗,在 Command 內容框中輸入以下指令,系統將自動下載並安裝 Docker:

xCloud 執行 Command 取得 Docker
# 安裝 Docker
curl -fsSL https://get.docker.com | sh

# 啟動並設定開機自啟
systemctl start docker
systemctl enable docker

點擊 Run Command,xCloud 會將指令發送至伺服器執行。當 Status 顯示為 Completed,且 Action 欄位的 View 結果無錯誤訊息,代表 Docker 已準備就緒。

xCloud 執行 Command 取得 Docker

步驟二:部署 Jupyter Notebook 容器

Docker 安裝完畢後,接著設定網路與儲存空間。

設定防火牆規則

從左側選單的 Security → Firewall Management,點選 Add New Rule 新增防火牆規則,將 Port 8888 打開。這是為了確保系統能正確辨識 Docker 容器內的通訊埠。

xCloud 設定 Jupyter 所需的防火牆 Port

設定數據持久化 (Volume)

容器重啟後資料會重置,因此必須將程式碼檔案儲存在主機實體目錄中。同樣使用 Commands 來建立目錄:

mkdir -p /home/master/jupyter_data
chmod 777 /home/master/jupyter_data

(注意:為了避免權限問題,此處暫時給予寬鬆權限,實務上可根據使用者 ID 進行設定。)

執行 Docker Run 指令

接著,建立新的 Command 來啟動 Jupyter。我們使用官方的 jupyter/scipy-notebook (包含更多科學計算套件)。

docker run -d -p 8888:8888 --name my-jupyter -v /home/master/jupyter_data:/home/jovyan/work --restart unless-stopped -e JUPYTER_ENABLE_LAB=yes quay.io/jupyter/scipy-notebook

指令參數解析:

  1. docker run
    基本的指令,意思是「從映像檔 (Image) 建立並啟動一個新的容器 (Container)」。
  2. -d
    • 意義:在背景執行 (Detached Mode)。
    • 作用:如果不使用這個參數,終端機畫面會被 Jupyter 的 Log 訊息佔據,一關閉視窗 Jupyter 就會停止。加上這個參數,它就會在背景默默運作,讓我們可以繼續輸入其他指令。
  3. -p 8888:8888
    • 格式<主機 Port>:<容器內部 Port>
    • 意義:將伺服器外部的 Port 對應到容器內部的 Port (Port Mapping)。
    • 作用
      • 左邊的 8888:是 xCloud 主機對外開放的 Port (Nginx 就是把流量轉到這裡)。
      • 右邊的 8888:是 Jupyter 程式在容器裡面預設監聽的 Port。
      • 應用:如果想在同一台機器跑兩個 Jupyter,第二個可以改成 -p 8889:8888
  4. --name my-jupyter
    • 意義:命名容器,方便後續管理。
    • 作用:如果不命名,Docker 會給它一個隨機的代號。命名後,管理時只需打 docker stop my-jupyterdocker logs my-jupyter,相當方便。
  5. -v /home/master/jupyter_data:/home/jovyan/work
    • 格式<主機真實路徑>:<容器內部路徑>
    • 意義:將伺服器的硬碟資料夾,直接「掛載 (映射)」到容器裡面。
    • 作用:設定數據持久化,容器重啟後資料會重置,這是資料保存的關鍵!
      • 左邊 /home/master/jupyter_data:xCloud 主機上的實際資料夾。所有 .ipynb 程式碼都會實際存在這裡。
      • 右邊 /home/jovyan/work:Jupyter 容器裡面看到的預設工作目錄 (jovyan 是 Jupyter Docker 映像檔預設的使用者名稱)。
      • 結果:即使把這個 Docker 容器刪除重做,只要主機上的 /home/master/jupyter_data 還在,之前儲存的程式碼就不會消失。
  6. --restart unless-stopped
    • 意義:確保伺服器重啟或 Docker 崩潰後,Jupyter 會自動重新啟動。
    • 作用:告訴 Docker daemon,除非是手動執行了 docker stop 把它關掉,否則無論是伺服器重開機、還是程式錯誤,都會嘗試自動重新啟動這個容器。
  7. -e JUPYTER_ENABLE_LAB=yes
    • 作用:容器啟動時,預設使用新版的 JupyterLab 介面 (比較像 IDE,有左側檔案總管、分頁功能),而不是舊版的 Jupyter Notebook 介面。
  8. quay.io/jupyter/scipy-notebook
    • 意義:指定映像檔來源 (Image Source)。
    • 細節
      • quay.io:映像檔倉庫 (Registry),類似 GitHub。
      • jupyter/scipy-notebook:官方維護的映像檔版本,除了 Python 基礎環境外,也會預先安裝 Pandas、NumPy、SciPy、Matplotlib 等常用科學運算套件,省去額外 pip install 的時間。

執行後,確認 Status 顯示 Completed 即可。

xCloud 執行 Command 部署 Jupyter Notebook 容器

步驟三:建立 Blank Site 與 Cloudflare SSL 設定

Jupyter 預設使用 HTTP 且跑在 8888 埠,直接暴露 IP 與埠號既不安全也不專業。我們將利用 xCloud 的 Blank Site 來處理網域解析與 SSL。

在 xCloud 建立空白網站

  1. 切換到 Site List 頁籤,點擊 + New Site
  2. 選擇 Custom PHP → Blank Site (不要安裝有包含應用的網站)。
xCloud + Jupyter 新增空白網站
  1. 選擇 Setup into a New Domain
    • New Site Title:輸入網站名稱 (如 jupyter-app)。
    • Domain Name:輸入你想要使用的子網域,例如 jupyter.domain.com
    • Add DNS and SSL Certificate on Cloudflare:啟用此選項,xCloud 將透過 API 直接在 Cloudflare 完成 DNS 與 SSL 設定。
xCloud 空白網站設定 DNS 與 SSL
  1. Database 選擇 No Database。PHP 版本與 Web Root 保持預設即可,後續將由 Nginx 轉發流量,不會讀取此目錄。
xCloud + Jupyter 空白網站設定與 DB 連線
  1. 確認無誤後開始建立,約兩分鐘即可部署完成。
xCloud + Jupyter 空白網站部署完成

Cloudflare 整合與 HTTPS 自動簽發

這是 xCloud 帶來的最大便利之一。

在 Site Dashboard 左側選單選擇 Domain → SSL/HTTPS。若已設定 Cloudflare API 整合,系統會自動簽發 Origin Certificate 並強制開啟 HTTPS 重定向。

xCloud 由 Cloudflare 整合管理 DNS SSL HTTPS

此時訪問 https://jupyter.domain.com 會看到 403 Forbidden,代表 SSL 與 Nginx 基礎連線已通,僅需設定反向代理即可。

步驟四:設定 Nginx 反向代理 (Reverse Proxy)

我們要修改空白網站的 Nginx 設定,將所有流量轉到 localhost:8888

  1. 在 Site Dashboard 選擇 Tools → Nginx Customization
  2. 點擊 Add a New Config,選擇 Config Type 位置為 Inside Server Block
  3. 因為 xCloud 目前不提供空白的 Nginx 設定檔,輸入以下 Nginx 規則,利用 Regex (~) 覆蓋預設路徑:
xCloud 自訂 Nginx 規則反向 Proxy
location ~ ^/ {
    proxy_pass http://127.0.0.1:8888;

    # WebSocket 支援 (Jupyter 核心功能必須)
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";

    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto $scheme;

    # 避免上傳大檔案 (csv/dataset) 失敗
    client_max_body_size 100M;
    # 防止 TimeOut
    proxy_read_timeout 86400;
}

關鍵設定說明:

  • WebSocket 支援:Jupyter Notebook 的運作仰賴 WebSocket 維持 Kernel 連線,必須加入 UpgradeConnection header,否則 Notebook 雖然可以開啟但無法執行程式碼 (Kernel Disconnected)。
  • Proxy Pass:指向 Docker 映射出來的本機埠 8888。

點擊 Run & Debug 測試語法,無誤後點擊 Save Config,系統會自動重啟 Nginx 服務。

步驟五:取得登入 Token 與開發測試

打開瀏覽器訪問 https://jupyter.domain.com,應該就會看到 Jupyter 的登入畫面,要求輸入 Password 或 Token。

xCloud + Jupyter 登入畫面

由於是首次啟動,需要從 Docker Log 取得預設 Token。

透過日誌檢索 Access Token

回到伺服器管理介面的 Management → Commands,建立查詢指令:

docker logs my-jupyter 2>&1 | grep "token="
xCloud 執行 Command 取得 Docker Logs 找到 Token 資訊

在執行結果中,複製 token= 後方的長代碼。

xCloud Docker Logs Token 資訊

設定密碼與開始使用

回到瀏覽器,將 Token 貼入登入框。為了之後方便登入,建議在下方的「Setup a Password」欄位設定固定密碼。

xCloud JupyterLab 設定密碼

登入成功後,可以看到 /work 目錄。試著建立一個新的 Python 3 Notebook,輸入 print("Hello Quants Note") 並執行。如果順利輸出結果,代表 WebSocket 連線正常,環境部署大功告成。

xCloud JupyterLab

步驟六:效能調校、日常維護

停用不需要的服務,節省記憶體耗用

如果你使用的是規格較小的主機,別忘了把這個技術架構下不會用到的服務都停用。從左側選單的 Management Settings,在服務清單中從不需要的服務的 Action 下,點擊 Disable 按鈕停用這個服務。

xCloud 停用不需要的服務節省主機資源

按照我們的步驟,可以停用的服務包含:

  • MariaDB (資料庫):相當大的記憶體占用者之一,通常空轉也會用掉 100MB 以上的記憶體。
  • Redis (快取):Redis 是用來將資料暫存在記憶體中以加速網站讀取 (Object Cache)。對於 Jupyter 這種即時運算環境,或者單純的反向代理來說,只會額外佔用 RAM。
  • Supervisor:通常用於管理 PHP 的背景佇列 (Queue Workers),例如發送 Email 或處理大量圖片。如果只跑 Jupyter,這個服務是多餘的。

整體可以釋放約 130MB 記憶體與少量 CPU 資源。

設定 Cronjob 管理 Docker

從左側選單的 Management Cron Jobs,點擊 + Add Cron Job 按鈕新增兩項自動化排程任務。

  • 每周一凌晨 4:00 自動重啟 Jupyter 容器 (釋放記憶體,解決主機效能問題)
    0 4 * * 1 docker restart my-jupyter
  • 每周一凌晨 4:00 自動清理沒用的 Docker 垃圾 (避免儲存空間逐漸變小)
    5 4 * * 1 docker system prune -f
xCloud 新增 cronjobs 重啟 Jupyter 容易、清理沒用的 Docker 垃圾

部署效率與時間成本分析

相較於傳統手動 SSH 配置 (安裝 Python、Virtualenv、Nginx Config、Certbot SSL),使用 xCloud 結合 Docker 的方案在效率上有顯著提升。以下是本次實戰的時間成本拆解:

部署階段預估耗時說明
主機與 Docker 初始化10 分鐘包含 Droplet 建立、系統更新與 Docker 自動安裝
容器部署5 分鐘下載 Image 並啟動 Jupyter,無需編譯或處理相依性
網站與 SSL 配置3 分鐘xCloud 自動化處理 DNS 解析與 Cloudflare 憑證
Nginx 反向代理設定2 分鐘套用預設好的 Config 樣板
總計時間約 20 分鐘比傳統手動部署節省約 60% 時間

這套流程將繁瑣的系統管理標準化,讓量化交易者能將核心精力保留在策略開發,而非環境維運上。

💡 架好環境了,下一步呢?

擁有了強大的雲端運算環境,你已經完成了量化交易的第一塊拼圖。接下來,你需要的是經過驗證的策略邏輯與回測工具。

如果你不想從零開始手刻程式碼,歡迎加入我們的《Python 選擇權量化實戰:從策略原理到視覺化回測》課程。

在這堂課的新增章節中,我們直接提供:

  • 完整的 BacktestEngine 原始碼:包含資料快取與每日損益結算功能。
  • 3D 風險視覺化儀表板:讓您在 Jupyter Notebook 中透過滑桿即時分析策略。

你可以直接將課程提供的 Python 策略實驗室檔案,上傳到剛架設好的 xCloud Jupyter Notebook 中,立刻開始回測 SPY、NVDA 等標的,驗證你的交易想法!

👉 點此了解課程詳情與限時優惠

結語

透過本文的實戰演練,我們成功將複雜的伺服器運維工作簡化為標準化的 Docker 部署流程。這套架構不僅適用於 Jupyter Notebook,未來你也可以用同樣的邏輯部署量化交易機器人或看盤儀表板。

希望這篇文章能幫助你掃除環境建置的障礙,即刻開啟你的量化開發之旅。

xCloud 雲端主機控制面板

☆黑五LTD方案再現☆

LTD用戶享主機九折優惠

DigitalOcean 雲端主機

免費額度美金$200,無負擔試用60天!

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *