在昨天的文章中,我們使用 SQLite 與 SQLAlchemy 為美食 Agent 構建了長期記憶資料庫,實現了不重複推薦與個人喜好追蹤的功能。
然而,目前整套系統仍然跑在我們的筆電或桌機上。這意味著:
為了讓身邊的朋友或真實用戶能夠 24 小時隨時使用,今天 Day 14 我們要把 FastAPI 核心微服務 容器化,並部署到支援免費託管的雲端平台——Render,讓微服務擁有永久固定的 HTTPS 公網網址!
今天我們要將本地的 Python 專案打包上雲端:
[本地程式碼 (agent-backend)]
│
▼ (Git Push)
[GitHub 專案儲存庫 (Repository)]
│
▼ (自動觸發 CI/CD 建置)
[Render 雲端平台]
│ 1. 讀取 Dockerfile 自動建置 Image
│ 2. 注入環境變數 (GOOGLE_MAPS_API_KEY)
│ 3. 啟動 Uvicorn 伺服器
▼
[生成永久固定公網網址:[https://food-agent-xxxx.onrender.com](https://food-agent-xxxx.onrender.com)]
為了讓程式在雲端伺服器上能有一致的執行環境,我們使用 Docker 進行打包。
請確保虛擬環境已啟用,將目前安裝的所有套件完整導出:
pip freeze > requirements.txt
在 agent-backend/ 根目錄下建立一個名為 Dockerfile 的檔案(無副檔名):
# 1. 採用輕量版 Python 3.11 基礎映像檔
FROM python:3.11-slim
# 2. 設定容器內的工作目錄
WORKDIR /app
# 3. 避免 Python 生成 .pyc 檔案並啟用即時輸出緩衝
ENV PYTHONDONTWRITEBYTECODE=1
ENV PYTHONUNBUFFERED=1
# 4. 複製相依清單並安裝
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
# 5. 複製專案原始碼到容器內
COPY . .
# 6. 開放 Render 預設連接埠 (8000)
EXPOSE 8000
# 7. 啟動 FastAPI 服務 (使用環境變數中的 PORT,預設為 8000)
CMD ["sh", "-c", "uvicorn app.main:app --host 0.0.0.0 --port ${PORT:-8000}"]
在根目錄建立 .dockerignore 與 .gitignore,避免本地的暫存檔、虛擬環境或機密金鑰被上傳到雲端:
.dockerignore 與 .gitignore 內容皆填入:
.venv/
__pycache__/
*.pyc
.env
food_agent_memory.db
.git
Render 支援透過 GitHub 自動觸發部署。請在 PowerShell 執行以下步驟:
# 初始化 git
git init
# 將所有變更加入追蹤
git add .
# 建立初次提交
git commit -m "feat: setup Dockerfile and backend core for Render deployment"
1.前往 GitHub 登入並點擊 New repository。
2.命名為 food-agent-backend,設定為 Public 或 Private 皆可。
3.建立完成後,複製遠端倉庫網址,在終端機執行關聯與推送:
git branch -M main
git remote add origin [https://github.com/](https://github.com/)<你的GitHub帳號>/food-agent-backend.git
git push -u origin main
1.打開瀏覽器前往 Render 官方網站。
2.點擊右上角 Sign up,建議直接使用 GitHub 帳號登入授權。
1.登入後進入 Dashboard,點擊右上角 New + ➜ Web Service。
2.選擇 Build and deploy from a Git repository,點擊 Next。
3.找到剛剛推送的 food-agent-backend 儲存庫,點擊右側的 Connect。
在設定頁面中依序設定以下欄位:
Name:輸入服務名稱,例如 food-agent-api。
Region:選擇距離最近的區域(例如 Singapore)。
Runtime:選擇 Docker(Render 會自動偵測我們寫好的 Dockerfile)。
Instance Type:選擇 Free(免費方案)。
往下滑動展開 Environment Variables(環境變數),點擊 Add Environment Variable:
Key:GOOGLE_MAPS_API_KEY
Value:貼上你的 Google Maps API 金鑰。
點擊底部的 Create Web Service!
點擊建立後,Render 會自動拉取 GitHub 代碼並開始執行 Docker 建置:
==> Building image from Dockerfile...
==> Running uvicorn app.main:app...
==> Application startup complete.
==> Your service is live 🎉
當狀態變成綠色的 Live 時,代表後端已經在雲端順利運轉!
在 Render 儀表板上方會看到一組專屬的永久 HTTPS 網址,格式如下:
[https://food-agent-api-xxxx.onrender.com](https://food-agent-api-xxxx.onrender.com)
在瀏覽器打開:
[https://food-agent-api-xxxx.onrender.com/docs](https://food-agent-api-xxxx.onrender.com/docs)
確認能夠順利看見 Swagger UI 文件,並測試 GET /api/v1/health 成功回傳 200 OK!
現在微服務已經有固定的公網網址了,回到本地或雲端的 n8n 工作流中:
1.打開呼叫微服務的 HTTP Request (Call FastAPI Backend) 節點。
2.將原本的本機網址:
[http://host.docker.internal:8000/api/v1/recommend/](http://host.docker.internal:8000/api/v1/recommend/)
3.直接換成 Render 提供的永久雲端網址:
[https://food-agent-api-xxxx.onrender.com/api/v1/recommend/](https://food-agent-api-xxxx.onrender.com/api/v1/recommend/)
4.儲存工作流。