🌅 #91 PhotoPoet Pro 點亮詩意:跟 #14 同源雙部署第 5 案例 + Cloudflare Turnstile + SSRF 防護 + Gemini 2.0 Flash 繁中詩生成
#91 PhotoPoet **Pro** 是 [#14 poet.smes Firebase Hosting 版](/blog/poet-14-elder-greeting-image) 的進階姊妹版!cagoooo/PhotoPoet repo + photopoet-ha364.web.app 線上版。Next.js 15 (static export) + Firebase Hosting + Cloud Functions gen2 + Genkit + **Cloudflare Turnstile** + **SSRF 防護**(私有 IP 黑名單 / redirect 重檢 / Content-Type 白名單 / 10MB / 8s 上限)+ Gemini 2.0 Flash 繁中詩生成。**阿凱同源雙部署策略第 5 案例**。
#91 跟 #14 是同源雙部署第 5 案例
阿凱「同源雙部署策略」累積 5 個案例:
| 工具家族 | Firebase Hosting 學校域名 | GitHub Pages / 個人作品集 |
|---|---|---|
| PIRLS | #4 pirlss.smes | #87 cagoooo/pirls-questioncraft |
| Aura 5W1H | #13 5w1h.smes | #92 cagoooo/Aura |
| 領域共備 GO | #15 report.smes | #84 cagoooo/domain-meeting-go |
| 詩意長輩圖 | #14 poet.smes | #91 PhotoPoet Pro(本篇) |
| 領域共備 GO (上面 #15/84) | - | - |
完整 4 工具家族 = 8 個工具掛雙網域。
#91 真實怎麼做?
真實標題:「PhotoPoet Pro · 點亮詩意(早安長輩圖產生器)」
核心流程:
上傳照片 → Gemini 2.0 Flash 生成繁體中文詩 → 一鍵下載長輩圖。
線上版:photopoet-ha364.web.app(Firebase Hosting 預設域名,不是 GitHub Pages 也不是 poet.smes — 第三個部署位置!)
真實技術棧(極完整)
- 前端:Next.js 15 (static export)
- 部署:Firebase Hosting
- 後端:Cloud Functions (gen2, asia-east1)
- AI 編排:Genkit
- 人機驗證:Cloudflare Turnstile
🔒 安全設計(三層防護,工程紮實度爆表)
1️⃣ Gemini API Key 嚴格限制
- API key 受限只能呼叫
generativelanguage.googleapis.com - 存於 Firebase Secret Manager
- 即使洩漏也只能呼叫 Gemini,無法挪用其他 Google API
2️⃣ SSRF 防護(神細節!)
proxyImage Cloud Function 配完整 SSRF 防護:
- 🚫 私有 IP 黑名單(防止打內網)
- 🔁 redirect 重檢(防止 301 跳到內網)
- ✅ Content-Type 白名單(只接圖片 MIME)
- 📦 10MB 上限(防 DoS)
- ⏱️ 8 秒 timeout(防 hang)
SSRF(Server-Side Request Forgery)是後端打外部 URL 最大的資安風險 — 阿凱寫了完整的防護程式碼,這是企業級工程紀律。
3️⃣ Cloudflare Turnstile 人機驗證
generatePoemCloud Function 受 Cloudflare Turnstile 保護- 無 token 直接 403
- 擋掉 bot 大量呼叫消耗 quota
CI/CD 完整流程
- push 到
main→ GitHub Actions 自動 deploy 到 Firebase - 5 個 docs 文件支持:
docs/USAGE.md詳細使用說明docs/OPERATIONS.md運維手冊docs/ROADMAP.md未來開發路線圖docs/MIGRATION_AND_OPTIMIZATION.md移植歷史記錄docs/blueprint.md原始產品需求
跟 #14 的差別(Pro 進化)
| 維度 | #14 poet.smes | #91 PhotoPoet Pro(本篇) |
|---|---|---|
| 部署 | poet.smes Firebase Hosting | photopoet-ha364.web.app + Firebase Hosting |
| LLM | 推測 Gemini 圖文 | Gemini 2.0 Flash 明確 |
| 後端 | 推測 | Cloud Functions gen2 + Genkit |
| 人機驗證 | 無 | Cloudflare Turnstile |
| SSRF 防護 | 無 | 完整防護(私 IP / redirect / MIME / size / timeout) |
| docs | 簡單 | 5 個 markdown 完整工程文件 |
#91 Pro 是「企業級工程紀律的 #14」 — 同款 use case 但安全防護升 5 個檔次。
為什麼這值得寫獨立文章?
「個人作品也要做企業級安全」 —— 阿凱在 #91 展示的工程紀律:
對工程師:
- ✅ SSRF 防護完整程式碼可學
- ✅ API Key 限制範圍最佳實踐
- ✅ Cloudflare Turnstile 整合案例
- ✅ Cloud Functions gen2 + Genkit 架構
對教育圈:
- ✅ 「老師做的工具也可以這麼專業」
- ✅ 個資隱私意識 — 學生長輩照片不會被亂打 API
- ✅ 永久維護 — Firebase 安全規則
- ✅ 不會被當免費 API 消耗點 — Turnstile 擋 bot
教學情境(同 #14 但補充工程紀律)
#14 已寫教學情境 — #91 補充:
「為什麼用 Pro 版而不是 #14」:
- ✅ 大量學生上傳照片 → Cloudflare Turnstile 擋 bot 不會把 quota 耗光
- ✅ 私照片不會洩漏 → SSRF 防護 + 限定範圍 API Key
- ✅ 學校 IT 組長放心 → 「這工具有完整安全防護可推給家長」
配對工具推薦
- #14 poet.smes 早期版 — 同源雙部署
- #86 TieTu 3D Q版貼圖 — 同款 AI 圖像 + LINE 整合
- #94 封面接故事 — 同款 Gemini multimodal
適用對象
- 國中小綜合活動 / 道德教育老師(孝親月)
- 想看「SSRF 防護完整程式碼」的後端工程師
- 想看「Cloudflare Turnstile + Cloud Functions gen2」案例的開發者
- 重視「個人作品工程紀律」的學習者
想試試?
下次傳長輩圖 — #91 Pro 版 → 配 Cloudflare Turnstile + SSRF 防護 → 比 #14 安全 5 倍。