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 Commands 安裝 Docker 環境
首先,在 xCloud 後台連接你的 DigitalOcean 帳號,並透過 Create Server 建立一台新的 Droplet。

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


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

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

# 安裝 Docker
curl -fsSL https://get.docker.com | sh
# 啟動並設定開機自啟
systemctl start docker
systemctl enable docker
點擊 Run Command,xCloud 會將指令發送至伺服器執行。當 Status 顯示為 Completed,且 Action 欄位的 View 結果無錯誤訊息,代表 Docker 已準備就緒。

步驟二:部署 Jupyter Notebook 容器
Docker 安裝完畢後,接著設定網路與儲存空間。
設定防火牆規則
從左側選單的 Security → Firewall Management,點選 Add New Rule 新增防火牆規則,將 Port 8888 打開。這是為了確保系統能正確辨識 Docker 容器內的通訊埠。

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

步驟三:建立 Blank Site 與 Cloudflare SSL 設定
Jupyter 預設使用 HTTP 且跑在 8888 埠,直接暴露 IP 與埠號既不安全也不專業。我們將利用 xCloud 的 Blank Site 來處理網域解析與 SSL。
在 xCloud 建立空白網站
- 切換到 Site List 頁籤,點擊 + New Site。
- 選擇 Custom PHP → Blank Site (不要安裝有包含應用的網站)。

- 選擇 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 設定。
- New Site Title:輸入網站名稱 (如

- Database 選擇 No Database。PHP 版本與 Web Root 保持預設即可,後續將由 Nginx 轉發流量,不會讀取此目錄。

- 確認無誤後開始建立,約兩分鐘即可部署完成。

Cloudflare 整合與 HTTPS 自動簽發
這是 xCloud 帶來的最大便利之一。
在 Site Dashboard 左側選單選擇 Domain → SSL/HTTPS。若已設定 Cloudflare API 整合,系統會自動簽發 Origin Certificate 並強制開啟 HTTPS 重定向。

此時訪問 https://jupyter.domain.com 會看到 403 Forbidden,代表 SSL 與 Nginx 基礎連線已通,僅需設定反向代理即可。
步驟四:設定 Nginx 反向代理 (Reverse Proxy)
我們要修改空白網站的 Nginx 設定,將所有流量轉到 localhost:8888。
- 在 Site Dashboard 選擇 Tools → Nginx Customization。
- 點擊 Add a New Config,選擇 Config Type 位置為 Inside Server Block。
- 因為 xCloud 目前不提供空白的 Nginx 設定檔,輸入以下 Nginx 規則,利用 Regex (
~) 覆蓋預設路徑:

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 連線,必須加入
Upgrade與Connectionheader,否則 Notebook 雖然可以開啟但無法執行程式碼 (Kernel Disconnected)。 - Proxy Pass:指向 Docker 映射出來的本機埠 8888。
點擊 Run & Debug 測試語法,無誤後點擊 Save Config,系統會自動重啟 Nginx 服務。
步驟五:取得登入 Token 與開發測試
打開瀏覽器訪問 https://jupyter.domain.com,應該就會看到 Jupyter 的登入畫面,要求輸入 Password 或 Token。

由於是首次啟動,需要從 Docker Log 取得預設 Token。
透過日誌檢索 Access Token
回到伺服器管理介面的 Management → Commands,建立查詢指令:
docker logs my-jupyter 2>&1 | grep "token="

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

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

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

步驟六:效能調校、日常維護
停用不需要的服務,節省記憶體耗用
如果你使用的是規格較小的主機,別忘了把這個技術架構下不會用到的服務都停用。從左側選單的 Management → Settings,在服務清單中從不需要的服務的 Action 下,點擊 Disable 按鈕停用這個服務。

按照我們的步驟,可以停用的服務包含:
- 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

部署效率與時間成本分析
相較於傳統手動 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,未來你也可以用同樣的邏輯部署量化交易機器人或看盤儀表板。
希望這篇文章能幫助你掃除環境建置的障礙,即刻開啟你的量化開發之旅。





