在過去的 27 天裡,我們打造了負責流程編排的 n8n,以及負責資料萃取與 AI 處理的 FastAPI 伺服器。為了讓這套系統能輕易部署到雲端,或完整交接給其他人,我們需要消除「在我的電腦上可以跑」的窘境。
今天我們將引入 Docker 生態系,用一組 docker-compose.yml 將 n8n 與 FastAPI 完美綁定,達成「一鍵啟動、完美隔離、資料持久化」的終極目標。
很多開發者會疑惑,打包成 Docker 後,Python 套件該怎麼隔離?
答案是:Docker 容器本身就是最強大的隔離空間。 我們不需要在「已經隔離的保險箱(Docker)」裡面,再去放一個「小保險箱(Conda)」。我們只要專心寫好 requirements.txt,Docker 就會給我們一個乾淨、專屬、且絕對不會弄髒本機環境的 Python 運行空間。
專案目錄結構準備
ai-automation/
├── .env # 集中存放系統環境變數與 API Key
├── docker-compose.yml # Docker 管弦樂團指揮中心
└── api/
├── Dockerfile # FastAPI 封裝腳本
├── requirements.txt # Python 套件清單
└── main.py # 您的 FastAPI 主程式
實作步驟與設定檔
Step 1:建立 Python 套件清單
在 api/ 目錄下建立 requirements.txt,告訴 Docker 需要安裝哪些武器:
fastapi
uvicorn
trafilatura
requests
pypdf
youtube-transcript-api
google-generativeai
python-dotenv
Step 2:撰寫 FastAPI 封裝腳本 (Dockerfile)
在 api/ 目錄下建立 Dockerfile(不含副檔名)。我們直接使用官方輕量版 Python 作為基底:
# 使用輕量版 Python 映像檔
FROM python:3.10-slim
# 設定工作目錄
WORKDIR /app
# 複製套件清單並透過原生的 pip 安裝
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
# 複製主程式
COPY main.py .
# 啟動 FastAPI 伺服器
CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "8000"]
Step 3:撰寫系統藍圖 (docker-compose.yml)
在專案根目錄建立 docker-compose.yml,將 n8n 與 FastAPI 網路打通,並設定資料持久化(Volume):
version: '3.8'
services:
fastapi:
build: ./api
container_name: ai_fastapi
restart: always
env_file: .env
ports:
- "8000:8000"
n8n:
image: docker.n8n.io/n8nio/n8n
container_name: ai_n8n
restart: always
ports:
- "5678:5678"
environment:
- N8N_HOST=0.0.0.0
- N8N_PORT=5678
- N8N_PROTOCOL=http
- NODE_ENV=production
- GENERIC_TIMEZONE=Asia/Taipei
volumes:
- n8n_data:/home/node/.n8n
depends_on:
- fastapi
volumes:
# 宣告持久化空間:Container 可以消失,但 n8n 流程與資料不能消失!
n8n_data:
一鍵啟動指令
在根目錄打開終端機,確保 .env 已經寫好 GEMINI_API_KEY 等環境變數後,執行:
docker compose up -d
系統會自動在背景構建映像檔、建立虛擬網路,並同時啟動 FastAPI 與 n8n。
關鍵設定更新:內部網路溝通
因為 n8n 和 FastAPI 現在住在同一個 Docker 內部網路裡,n8n 不需要知道外部的真實 IP 就能呼叫 API。
請打開 n8n,進入所有呼叫 FastAPI 的 HTTP Request 節點,將原本的 URL 改為內部服務名稱:
修改前:http://localhost:8000/...
修改後:http://fastapi:8000/...