完善網站與部署上線

補齊網站頁面和正式環境設定,部署 PDF Worker 與主站,並完成上線驗證。

前面已完成核心功能、額度限制和付款串接。這篇會補齊頁面與正式環境設定、部署服務,並在正式網域驗證主要流程。

完善頁面與元件

目前網站基本功能已完成,接著要調整頁面與元件,讓網站更美觀、專業。

這部分取決於個人審美和需求。Saavo 已提供大部分頁面與元件,依需要調整即可。多數時候,可以請 AI 改善外觀,再由人工審查確認。

以下是需要調整的頁面與內容:

  • 首頁
  • Pricing 頁面
  • 關於頁面
  • Terms、Privacy、Cookie 頁面
  • Affiliate 頁面
  • 部落格內容
  • 文件內容
  • 使用者後台的產品頁面
  • public 目錄中的圖示、OG 圖片、favicon 等資源
  • llms.txt 檔案內容

完善頁面後,如果新增或修改了元件,最好再使用 saavo-localize-components 處理國際化,確保元件支援多語言。

除了頁面內容,也要補齊每個頁面的 SEO 資訊。可以請 AI 依頁面內容,使用 useSeoMeta 和 useSchemaOrg 等 hook 函式,產生對應的 SEO 內容。

發布前準備

前面只是完成了功能,正式上線前還差最後一步:將開發階段的測試設定換成正式環境設定。這裡最容易出問題的通常不是程式碼,而是網域、回呼網址或金鑰填錯。

上一篇已設定 Stripe,剩下的服務建議依以下順序處理。詳細操作位於選用服務章節,這裡只說明 WebpageToPDF 上線前的工作。

決定正式網域

先決定網站正式使用的網域。Worker 部署後,再依網域設定處理解析與綁定。workers.dev 網址適合暫時測試,正式上線仍應使用自己的網域。

最好先確定網域,因為後面的 Turnstile 和 OAuth 都會用到。WebpageToPDF 使用 webpagetopdf.dev,以下回呼網址也以它為例。如果你的專案使用其他網域,請全部替換成自己的。

設定 Resend

註冊驗證、密碼重設和安全通知都需要透過電子郵件寄送。依設定 Resend完成寄件網域驗證、建立 API Key,並將 RESEND_API_KEY、寄件者地址和客服信箱寫入正式環境設定。

部署後,最好使用實際信箱完整測試一次註冊和密碼重設。能寄出郵件只是第一步,還需檢查寄件者名稱、內文連結,以及是否被當成垃圾郵件攔截。

設定 Turnstile

Turnstile 用來攔截大量註冊和自動化請求。依設定 Turnstile為正式網域建立網站設定,並在正式環境填入 CLOUDFLARE_TURNSTILE_SITE_KEY 和 CLOUDFLARE_TURNSTILE_SECRET_KEY。

本機開發的測試金鑰只適合驗證流程,無法提供實際防護,上線前務必換成正式金鑰。

設定 GitHub OAuth

如需支援 GitHub 登入,依設定 GitHub OAuth建立 OAuth App,將正式回呼網址設為 https://webpagetopdf.dev/api/auth/oauth2/github。再將取得的 GITHUB_CLIENT_ID 和 GITHUB_CLIENT_SECRET 寫入正式環境設定。

部署後,分別使用新帳號和已註冊帳號登入一次,確認不會重複建立使用者,也不會因電子郵件地址相同而登入失敗。

設定 Google OAuth

如需支援 Google 登入,依設定 Google OAuth建立 Web 應用程式用戶端。授權來源填入 https://webpagetopdf.dev,回呼網址填入 https://webpagetopdf.dev/api/auth/oauth2/google,再將 GOOGLE_CLIENT_ID 和 GOOGLE_CLIENT_SECRET 寫入正式環境設定。

如果也啟用了 Google One Tap,部署後需在正式網域另外測試。瀏覽器隱私權設定、第三方 Cookie 和 HTTPS 都可能影響顯示,不能只檢查一般 Google 登入是否正常。

整理業務資源與正式環境設定

以上金鑰和網址都應寫入 .env.production,不要提交到 Git,也不要只在 Cloudflare 管理介面手動修改。先準備齊全,部署時再統一同步到 Cloudflare。

WebpageToPDF 另有一個獨立的 PDF Worker。部署前,需整理好它的部署指令、Service Binding 名稱和環境變數。通用的 Saavo 部署流程無法自動判斷這部分業務相依服務,後續部署時需要另外處理。

最後,分別以匿名、註冊和 Pro 使用者身分完成主要功能流程,確認三種轉換模式、免費體驗、額度扣除和付費權限,都符合前面的產品設計。轉換失敗時是否扣除額度,也要依既定規則檢查一次。

到這裡,產品功能與上線設定已準備完成,接著開始部署。

部署上線

前面已完成 Stripe、Resend、Turnstile 和第三方登入設定,對應的正式金鑰也已寫入 .env.production。這裡不再重新建立商品、Webhook 或 OAuth 應用程式,只處理尚未完成的 Cloudflare 部署。

部署 PDF Worker

WebpageToPDF 使用獨立的 PDF Worker,Saavo 部署指令碼不會自動建立這項業務服務。如果尚未部署,請先發布到同一個 Cloudflare 帳戶,再確認主專案的 Service Binding 名稱與實際 Worker 一致。如果前面移植功能時已部署,檢查無誤後即可略過。

確認 Cloudflare 帳號

先在專案目錄檢查 Wrangler 目前登入的帳號:

npx wrangler whoami

如果尚未登入,或顯示的不是準備部署 WebpageToPDF 的帳號,再執行:

npx wrangler login

正式網域、R2 和剛才的 PDF Worker,最好都放在這個使用者可存取的同一個帳戶,後續建立資源與繫結服務會方便許多。

完成首次部署

確認帳號後,執行:

npm run deploy:init

專案在本機開發時只執行過 saavo:init,尚未建立遠端資源,因此這裡使用 deploy:init。指令碼會讀取現有 .env.production,補齊缺少的部署設定,再建立並繫結 D1、KV、R2 和 Queue、初始化遠端資料庫、部署 Worker,最後檢查網站是否能存取。

已填入的 Resend、Turnstile 和 Stripe 設定,不需要重新輸入,依終端機提示確認即可。也不要到 Cloudflare 後台手動建立另一組同名資源。完整的終端機操作,可參考首次部署。

首次部署使用 workers.dev 網址。終端機提示成功後,先開啟該網址檢查首頁,確認沒有 500 錯誤,再綁定正式網域。PDF 轉換等完整業務流程,可以等網域切換後再測試。

切換到正式網域

WebpageToPDF 的正式網址是 https://webpagetopdf.dev,執行以下指令切換:

npm run domain:set -- https://webpagetopdf.dev

指令會更新正式環境的網站網址,替 Worker 加入 Custom Domain,並重新驗證與部署。執行前,請確認 webpagetopdf.dev 已加入目前的 Cloudflare 帳戶,詳細步驟可參考網域設定。

核對第三方服務

網域生效後,再次檢查各平台的正式網址:

服務正式網址或主機名稱
Stripe Webhookhttps://webpagetopdf.dev/api/webhooks/stripe
GitHub OAuthhttps://webpagetopdf.dev/api/auth/oauth2/github
Google OAuthhttps://webpagetopdf.dev/api/auth/oauth2/google
Turnstilewebpagetopdf.dev

這些內容前面已設定,這裡只核對,不要重複建立 Stripe Webhook 或 OAuth 應用程式。如果修改了 .env.production 中的金鑰,再執行一次:

npm run deploy:update

如果只修改 GitHub、Google 或 Stripe 後台的回呼網址,沒有更動專案程式碼和環境變數,就不需要為此重新部署。

上線驗證

最後,在正式網域完成主要流程:

  1. 使用新的電子郵件地址,完成註冊、電子郵件驗證、登入和密碼重設。
  2. 分別測試 GitHub 和 Google 登入,如果啟用 Google One Tap,也一併檢查。
  3. 以匿名、註冊和 Pro 使用者測試三種 PDF 轉換模式,確認額度扣除與權限限制符合前面的設計。
  4. 確認已在 Stripe 測試模式完成購買、Webhook 回呼和使用權益授予。若需在正式模式驗證,應使用經允許的小額商品完成交易,再依流程退款。
  5. 登入管理後台,檢查使用者、訂單、工作記錄,以及 Queue 是否異常。

更完整的項目可參考上線驗證。這些流程都正常後,就可以正式開放 WebpageToPDF 給使用者。

日後修改程式碼或正式環境設定,直接使用 npm run deploy:update 更新,不要在同一個專案重複執行 deploy:init。上線後的記錄、排程工作和資料備份,可繼續參考發布後的檢查事項。

本篇檢查

完成上線驗證後,就走完本教學的產品開發流程。後續可以在這個基礎上持續改進功能。

教學總覽 · 上一篇:串接 Stripe 付款