環境變數設定指南

Rin 部署需要設定兩類環境變數:Variables(明文變數) 與 Secrets(加密變數)。

快速區分

類型儲存方式用途範例
Variables以明文儲存在 wrangler.toml設定參數、功能開關儲存桶名稱、快取模式
Secrets加密儲存在 Cloudflare敏感憑證、金鑰API 金鑰、密碼、Token

Variables(明文變數)

這些變數以明文儲存在 wrangler.toml 或 GitHub Actions 中,用於設定功能開關與基本參數。

站台設定

變數名稱必填描述預設值
NAME否網站名稱Rin
DESCRIPTION否網站描述A lightweight personal blogging system
AVATAR否網站頭像 URL-
PAGE_SIZE否預設分頁大小5
RSS_ENABLE否啟用 RSS 連結false
FRONTEND_URL否站台根位址(sitemap.xml 與 robots.txt 產生基準,多網域部署時建議設定)請求 origin
Tip

站台設定可在部署後透過設定頁面修改,環境變數僅作為初始值。

儲存設定

變數名稱必填描述預設值範例
S3_FOLDER是圖片儲存路徑images/images/
S3_CACHE_FOLDER否快取檔案路徑cache/cache/
S3_BUCKET是S3 儲存桶名稱-my-bucket
S3_REGION是S3 區域(R2 填 auto)-auto
S3_ENDPOINT是S3 接入點位址-https://xxx.r2.cloudflarestorage.com
S3_ACCESS_HOST否對外存取位址同 S3_ENDPOINThttps://cdn.example.com
S3_FORCE_PATH_STYLE否強制路徑樣式falsefalse

功能開關

變數名稱必填描述預設值建議值
CACHE_STORAGE_MODE否快取模式:s3/databases3database
WEBHOOK_URL否留言通知 Webhook--
RSS_TITLE否RSS 標題Rin Development-
RSS_DESCRIPTION否RSS 描述Development Environment-
MCP_ALLOWED_HOSTS否MCP 服務端允許的額外網域,以英文逗號分隔(預設允許 FRONTEND_URL、本機位址與 *.workers.dev)。支援含協定或連接埠的寫法(https://blog.example.com:443)、萬用網域(*.example.com)與 *(關閉網域白名單,僅限可信環境)-blog.example.com,www.example.com
新使用者建議

建議將 CACHE_STORAGE_MODE 設為 database,無需額外設定 S3 快取即可使用,降低部署複雜度。


Secrets(加密變數)

這些敏感資訊必須設定為 Cloudflare Workers Secrets,部署時透過命令列輸入或事先設定。

驗證相關

變數名稱必填描述取得方式
ADMIN_USERNAME條件帳號密碼登入的使用者名稱自行設定
ADMIN_PASSWORD條件帳號密碼登入的密碼自行設定
RIN_GITHUB_CLIENT_ID條件GitHub OAuth 用戶端 IDGitHub OAuth App 設定
RIN_GITHUB_CLIENT_SECRET條件GitHub OAuth 用戶端金鑰GitHub OAuth App 設定
RIN_GITEE_CLIENT_ID條件Gitee OAuth 用戶端 IDGitee OAuth App 設定
RIN_GITEE_CLIENT_SECRET條件Gitee OAuth 用戶端金鑰Gitee OAuth App 設定
RIN_QQ_TOKEN條件心月互聯 QQ 登入 Token心月互聯 https://qq.wch666.com/ 申請
RIN_WECHAT_APPID條件聚合登入 WeChat 應用程式 ID聚合登入 https://login.mapay.cn/ 申請
RIN_WECHAT_APPKEY條件聚合登入 WeChat 應用程式金鑰聚合登入 https://login.mapay.cn/ 申請
EMAIL_SEND_URLS條件MailPort 寄件位址(JSON 陣列,可填多個;僅一個寄件端點時可省略陣列括號,詳見下方「填寫格式」)部署 MailPort 後於寄件端點頁面取得
EMAIL_SEND_KEYS條件MailPort API 金鑰(JSON 陣列或單一字串,與 EMAIL_SEND_URLS 依序一一對應)MailPort 寄件端點頁面產生
EMAIL_RESEND_FROM條件依序為每個寄件端點指定 from 寄件人,英文逗號分隔,空項表示該端點不傳 from(僅對 MailPort 的「郵件 API 寄件」寄件商生效)自行填寫
EMAIL_RESEND_URL條件舊版郵件轉發服務 URL(部署於 Vercel 的 Rin-Email 專案位址),未設定 EMAIL_SEND_URLS 時回退使用自行部署 Rin-Email 到 Vercel 取得
EMAIL_RESEND_PASS條件舊版郵件轉發服務驗證密碼(與 Vercel 專案中的 EMAIL_PASS 相同)自行設定
JWT_SECRET是JWT 簽章金鑰(任意隨機字串)自行產生
驗證要求

至少設定以下驗證方式中的 一種:

  • GitHub OAuth(RIN_GITHUB_CLIENT_ID + RIN_GITHUB_CLIENT_SECRET)
  • Gitee OAuth(RIN_GITEE_CLIENT_ID + RIN_GITEE_CLIENT_SECRET)
  • QQ 登入(RIN_QQ_TOKEN)
  • 微信登入(RIN_WECHAT_APPID + RIN_WECHAT_APPKEY)
  • 電子郵件驗證碼登入(EMAIL_SEND_URLS + EMAIL_SEND_KEYS,或舊的 EMAIL_RESEND_URL + EMAIL_RESEND_PASS)
  • 帳號密碼登入(ADMIN_USERNAME + ADMIN_PASSWORD)

否則無法登入後台。

電子郵件驗證碼架構

Rin 部落格執行於 Cloudflare Workers 上,不支援原始 TCP SMTP。電子郵件驗證碼功能透過 MailPort 寄件服務實作:

  1. 部署 MailPort 專案,建立寄件端點並設定寄件方式(SMTP / HTTP API / Outlook 或 Gmail OAuth)
  2. Rin 部落格收到傳送驗證碼請求後,呼叫 EMAIL_SEND_URLS 中的寄件介面,以 Authorization: Bearer <EMAIL_SEND_KEYS> 驗證
  3. 允許的收件網域在 MailPort 寄件端點設定中管理

EMAIL_SEND_URLS 與 EMAIL_SEND_KEYS 依序一一對應、輪詢使用:第一個失敗會自動嘗試下一個,全部失敗才回報錯誤。

未設定 EMAIL_SEND_URLS 時,回退到舊的 EMAIL_RESEND_URL / EMAIL_RESEND_PASS(Rin-Email 專案)。

填寫格式

EMAIL_SEND_URLS 是寄件位址的 JSON 陣列,每個元素是 MailPort 寄件端點的完整寄件位址,形如 https://<你的網域>/api/<寄件端點ID>/send;EMAIL_SEND_KEYS 是與之對應的 API 金鑰,同樣可以是 JSON 陣列。

只用一個寄件端點時,EMAIL_SEND_KEYS 可以直接寫成一般字串,無需陣列括號:

EMAIL_SEND_URLS=["https://your-mailport.vercel.app/api/xxxxxx/send"]
EMAIL_SEND_KEYS=your-api-key

使用多個寄件端點,且每個寄件端點的金鑰各不相同時,兩個陣列依索引一一對應:

EMAIL_SEND_URLS=["https://mail-a.vercel.app/api/aaaaaa/send","https://mail-b.vercel.app/api/bbbbbb/send"]
EMAIL_SEND_KEYS=["key-for-a","key-for-b"]

使用多個寄件端點,但共用同一組金鑰時,EMAIL_SEND_KEYS 只寫一個即可,會自動套用到所有位址:

EMAIL_SEND_URLS=["https://mail-a.vercel.app/api/aaaaaa/send","https://mail-b.vercel.app/api/bbbbbb/send"]
EMAIL_SEND_KEYS=shared-api-key

當 EMAIL_SEND_KEYS 提供多個值時,其數量必須與 EMAIL_SEND_URLS 一致(或只提供一個金鑰供所有位址共用),數量不符會在傳送時直接回報錯誤。

EMAIL_RESEND_FROM 為選用的 from 寄件人清單,以英文逗號切分並與 EMAIL_SEND_URLS 一一對應,空項表示該端點不傳 from(開頭、結尾或連續逗號造成的空項同樣視為不傳;項數不足時其餘端點也不傳,多餘項忽略)。例如 aaaa@blog.com,,ddd@you.com 表示第 1、3 個端點各用對應寄件人,第 2 個端點不傳。只有該端點對應的 MailPort 寄件商為「郵件 API 寄件」時 from 才會生效,其餘類型會忽略並回傳 warning。

郵件驗證碼圖片(人機驗證)

郵件自助友連(申請/修改/刪除)在使用者寄出第一封郵件時,會先要求辨識一封含驗證碼圖片的郵件,防止自動化濫用:

  1. 使用者向收件位址寄出「友链申请/友链修改/友链删除」
  2. Rin 產生一張帶干擾線/干擾點的驗證碼圖片(4 位字元),以內嵌圖片形式傳送到使用者信箱
  3. 使用者辨識圖片中的字元,在新郵件本文中只回覆這 4 位字元
  4. 驗證通過後進入一般的 JSON 範本流程

此功能依賴 MailPort 的內嵌圖片能力,無需新增任何環境變數,直接沿用 EMAIL_SEND_URLS + EMAIL_SEND_KEYS。舊版 Rin-Email 中繼不支援內嵌圖片,若仍在使用舊中繼,驗證碼步驟會自動略過。

S3 儲存憑證

變數名稱必填描述取得方式
S3_ACCESS_KEY_ID條件S3 存取金鑰 IDR2 API Token ID
S3_SECRET_ACCESS_KEY條件S3 存取金鑰R2 API Token
Tip

當 CACHE_STORAGE_MODE=database 時,S3 儲存憑證為選用設定,僅圖片上傳功能需要。

Cloudflare 繫結(非環境變數)

以下為 Cloudflare Worker 繫結,透過 wrangler.toml 設定,不屬於環境變數:

繫結名稱類型描述
DBD1 Database資料庫繫結
ASSETSR2 / Static Assets靜態資源繫結(選用)
AIAICloudflare AI 模型繫結

GitHub Actions 變數設定

使用 GitHub Actions 自動部署時,需在 Repository 設定中配置以下變數:

Repository Variables(Settings → Secrets and variables → Variables)

變數名稱必填描述預設值
NAME否網站名稱Rin
DESCRIPTION否網站描述A lightweight personal blogging system
AVATAR否網站頭像 URL-
PAGE_SIZE否分頁大小5
RSS_ENABLE否是否啟用 RSSfalse
CACHE_STORAGE_MODE否快取模式s3
S3_CACHE_FOLDER否快取檔案路徑cache/
S3_FOLDER否圖片儲存路徑images/
S3_REGION否S3 區域auto
S3_FORCE_PATH_STYLE否強制路徑樣式false
RSS_TITLE否RSS 標題Rin Development
RSS_DESCRIPTION否RSS 描述Development Environment
WEBHOOK_URL否留言通知 Webhook-
REPO_WORKER_NAME否Worker 名稱rin-server
REPO_DB_NAME否D1 資料庫名稱rin
R2_BUCKET_NAME否R2 儲存桶名稱-
EMAIL_SEND_URLS條件MailPort 寄件位址(JSON 陣列)-

Repository Secrets(Settings → Secrets and variables → Secrets)

變數名稱必填描述
CLOUDFLARE_API_TOKEN是Cloudflare API 權杖
CLOUDFLARE_ACCOUNT_ID是Cloudflare 帳戶 ID
S3_ENDPOINT條件S3/R2 接入點
S3_ACCESS_HOST條件S3/R2 存取網域
S3_BUCKET條件S3 儲存桶名稱
S3_ACCESS_KEY_ID條件S3 存取金鑰 ID
S3_SECRET_ACCESS_KEY條件S3 存取金鑰
JWT_SECRET是JWT 簽章金鑰
RIN_GITHUB_CLIENT_ID條件GitHub OAuth ID
RIN_GITHUB_CLIENT_SECRET條件GitHub OAuth Secret
RIN_GITEE_CLIENT_ID條件Gitee OAuth ID
RIN_GITEE_CLIENT_SECRET條件Gitee OAuth Secret
RIN_QQ_TOKEN條件心月互聯 QQ 登入 Token
ADMIN_USERNAME條件管理員使用者名稱
ADMIN_PASSWORD條件管理員密碼
EMAIL_SEND_KEYS條件MailPort API 金鑰(與 EMAIL_SEND_URLS 依序對應)
EMAIL_RESEND_FROM條件依序為每個寄件端點指定 from 寄件人(英文逗號分隔,空項不傳)

本地開發環境變數

本地開發使用 .env 檔案,參考 .env.example:

# 站台設定
NAME="My Blog"
DESCRIPTION="A personal blog"
AVATAR=https://example.com/avatar.png
PAGE_SIZE=5
RSS_ENABLE=false

# S3 儲存(使用 R2 或 MinIO)
S3_FOLDER=images/
S3_CACHE_FOLDER=cache/
S3_BUCKET=my-bucket
S3_REGION=auto
S3_ENDPOINT=https://xxx.r2.cloudflarestorage.com
S3_ACCESS_HOST=https://cdn.example.com
S3_FORCE_PATH_STYLE=false

# 快取模式
CACHE_STORAGE_MODE=database

# Webhook
WEBHOOK_URL=

# RSS
RSS_TITLE=My Blog
RSS_DESCRIPTION=My Personal Blog

# 驗證方式(至少設定一種)

# 方式一:GitHub OAuth
RIN_GITHUB_CLIENT_ID=xxx
RIN_GITHUB_CLIENT_SECRET=xxx

# 方式二:Gitee OAuth
RIN_GITEE_CLIENT_ID=xxx
RIN_GITEE_CLIENT_SECRET=xxx

# 方式三:心月互聯 QQ 登入
RIN_QQ_TOKEN=xxx

# 方式四:聚合登入 WeChat
RIN_WECHAT_APPID=xxx
RIN_WECHAT_APPKEY=xxx

# 方式五:電子郵件驗證碼登入
# 部署 MailPort(https://github.com/wool-hmq/mailport)後,設定以下環境變數:
# - MailPort 專案:建立寄件端點,設定寄件方式與收件網域白名單,產生 API 金鑰
# - Rin 部落格環境變數:EMAIL_SEND_URLS 是寄件位址的 JSON 陣列,EMAIL_SEND_KEYS 是對應金鑰
#   單一寄件端點(金鑰可直接寫一般字串):
EMAIL_SEND_URLS=["https://your-mailport.vercel.app/api/xxxxxx/send"]
EMAIL_SEND_KEYS=your-mailport-api-key
#   多個寄件端點(金鑰與位址依索引一一對應,或共用一個金鑰):
# EMAIL_SEND_URLS=["https://mail-a.vercel.app/api/aaaaaa/send","https://mail-b.vercel.app/api/bbbbbb/send"]
# EMAIL_SEND_KEYS=["key-for-a","key-for-b"]
# 舊方案(未設定上面兩個變數時回退使用,需部署 Rin-Email 到 Vercel):
EMAIL_RESEND_URL=https://your-rin-email.vercel.app/api/send
EMAIL_RESEND_PASS=your-email-pass

# 方式六:帳號密碼登入
ADMIN_USERNAME=admin
ADMIN_PASSWORD=secure_password

# JWT 金鑰(必須)
JWT_SECRET=random_secret_key

# S3 存取金鑰(使用 S3 儲存時需要)
S3_ACCESS_KEY_ID=xxx
S3_SECRET_ACCESS_KEY=xxx

最小部署清單

僅使用帳號密碼登入(最小設定)

變數類型必填
JWT_SECRETSecret是
ADMIN_USERNAMESecret是
ADMIN_PASSWORDSecret是
S3_FOLDERVariable是
S3_BUCKETVariable是
S3_REGIONVariable是
S3_ENDPOINTVariable是
S3_ACCESS_KEY_IDSecret條件
S3_SECRET_ACCESS_KEYSecret條件

完整設定(所有功能)

包含站台設定、所有 OAuth、電子郵件登入、S3 儲存、Webhook、RSS。


常見問題

Q: CACHE_STORAGE_MODE=database 還需要設定 S3 嗎?

不需要。database 模式會把快取儲存在 D1 資料庫中,無需 S3/R2 設定。但如果需要上傳圖片,仍需設定 S3 儲存變數。

Q: 可以同時啟用多種登入方式嗎?

可以。同時設定多種登入方式的憑證即可,前端會自動顯示對應的登入按鈕。

Q: 如何設定電子郵件驗證碼登入?

電子郵件驗證碼功能透過 MailPort 寄件服務實作:

  1. 部署 MailPort 專案,建立寄件端點並設定寄件方式(SMTP / HTTP API / Outlook 或 Gmail OAuth)
  2. 在 MailPort 寄件端點頁面產生 API 金鑰,並依需求設定收件網域白名單
  3. 在 Cloudflare Worker 中設定:
    • EMAIL_SEND_URLS = MailPort 寄件端點的完整寄件位址(JSON 陣列,可填多個)
    • EMAIL_SEND_KEYS = 對應的 API 金鑰(與位址依序一一對應)

EMAIL_SEND_URLS 與 EMAIL_SEND_KEYS 依序輪詢:第一個失敗會自動嘗試下一個,全部失敗才回報錯誤。 未設定這兩個變數時,回退到舊的 EMAIL_RESEND_URL / EMAIL_RESEND_PASS(Rin-Email)。

Q: EMAIL_SEND_URLS / EMAIL_SEND_KEYS 的 JSON 格式怎麼填?

EMAIL_SEND_URLS 是寄件位址的 JSON 陣列,每個元素形如 https://<你的網域>/api/<寄件端點ID>/send;EMAIL_SEND_KEYS 是與之一一對應的金鑰陣列。

只用一個寄件端點時,金鑰可直接寫成一般字串:

EMAIL_SEND_URLS=["https://your-mailport.vercel.app/api/xxxxxx/send"]
EMAIL_SEND_KEYS=your-api-key

使用多個寄件端點,且金鑰各不相同時,兩個陣列依索引對應:

EMAIL_SEND_URLS=["https://mail-a.vercel.app/api/aaaaaa/send","https://mail-b.vercel.app/api/bbbbbb/send"]
EMAIL_SEND_KEYS=["key-for-a","key-for-b"]

多個寄件端點共用一個金鑰時,金鑰只寫一個:

EMAIL_SEND_URLS=["https://mail-a.vercel.app/api/aaaaaa/send","https://mail-b.vercel.app/api/bbbbbb/send"]
EMAIL_SEND_KEYS=shared-api-key

多個金鑰的數量必須與位址數量一致,或只提供一個金鑰共用;數量不符會在傳送時回報錯誤。

Q: 如何限制允許的信箱網域?

在 MailPort 寄件端點設定的「收件網域白名單」中加入允許的網域(例如 qq.com、example.com),只有白名單內的收件位址才會寄送。

白名單留空則不限制網域。

Q: MailPort 支援哪些寄件方式?

MailPort 支援以下寄件方式:

  • SMTP:任意 SMTP 服務供應商(163 信箱、QQ 信箱、Gmail 等)
  • HTTP API:轉發到自訂的 HTTP 介面
  • Outlook OAuth2 / Gmail OAuth2:免應用程式密碼,授權後直接寄件

詳見 MailPort 專案文件。