本文档将提供一个详细的分步指南,帮助你使用 GitHub Actions 将 MoeMail 项目部署到 Cloudflare Pages。我们将重点介绍如何获取部署过程中所需的每一个环境变量。
Github Actions 部署
前期准备
-
一个 Cloudflare 账户: 如果没有,请先注册。
-
一个 GitHub 账户: 你将在这里完成所有操作。
-
Fork 项目: 打开 MoeMail 项目主页,点击右上角的 “Fork” 按钮,将项目复刻到你自己的 GitHub 仓库中。后续所有操作都在你 Fork 的仓库里进行。
第一步:获取 Cloudflare 账户 ID (CLOUDFLARE_ACCOUNT_ID
)
-
登录到 Cloudflare 仪表板。
-
在主页的右侧栏,你可以直接找到并复制你的 账户 ID。
第二步:创建并获取 Cloudflare API 令牌 (CLOUDFLARE_API_TOKEN
)
这个令牌将授权 GitHub Actions 操作你的 Cloudflare 账户资源。此步骤至关重要,请确保权限正确。
-
在 Cloudflare 仪表板,点击右上角的头像,选择 “我的个人资料”。
-
在左侧菜单中选择 “API 令牌”。
-
点击 “创建令牌”。
-
在“自定义令牌”部分,点击 “创建自定义令牌” 旁边的 “开始使用” 按钮。
-
令牌命名: 给你的令牌起一个容易识别的名字,例如
moemail-deploy-token
。 -
配置权限 (Permissions): 这是最关键的一步。你需要为令牌添加以下四项权限,全部选择
账户(Account)
类型,并赋予编辑(Edit)
权限:-
Cloudflare Pages
:编辑(Edit)
-
Workers & Pages D1
:编辑(Edit)
-
Workers KV Storage
:编辑(Edit)
-
Workers Scripts
:编辑(Edit)
-
-
账户资源 (Account Resources): 确保设置为
包括 (Include)
->特定账户 (Specific account)
->你的账户
。 -
继续以生成摘要: 点击页面底部的蓝色按钮。
-
创建令牌: 在摘要页面,确认信息无误后,点击 “创建令牌”。
-
复制令牌: Cloudflare 会生成一个令牌。这是你唯一一次看到这个令牌的机会,请立即复制并妥善保管。如果丢失,只能重新生成。
第三步:创建 GitHub OAuth App 并获取 ID 和 Secret
这将用于 MoeMail 的 GitHub 登录功能。
-
登录 GitHub,点击右上角你的头像,选择 “Settings”。
-
在左侧菜单最下方,选择 “Developer settings”。
-
选择 “OAuth Apps”,然后点击 “New OAuth App”。
-
填写 App 信息:
-
Application name: 任意填写,例如
MoeMail
。 -
Homepage URL: 你的网站主页。这里可以先预估一个地址,部署成功后再来修改。
-
如果你打算使用自定义域名(例如
moemail.yourdomain.com
),就填写https://moemail.yourdomain.com
。 -
如果你不使用自定义域名,可以预估为
https://moemail.pages.dev
(这里的moemail
是你计划使用的PROJECT_NAME
)。
-
-
Authorization callback URL: 这是最重要的一步。格式为
[你的主页 URL]/api/auth/callback/github
。- 例如:
https://moemail.pages.dev/api/auth/callback/github
- 例如:
-
-
获取 ID 和 Secret:
-
创建成功后,页面会显示 Client ID。这就是
AUTH_GITHUB_ID
。 -
点击 “Generate a new client secret” 生成一个客户端密码。这个密码也只显示一次,请立即复制。这就是
AUTH_GITHUB_SECRET
。
-
第四步:生成 NextAuth Secret (AUTH_SECRET
)
这是一个用于加密会话(Session)的随机字符串,你可以通过以下任何一种方式生成。
-
使用在线工具: 搜索 “random string generator” 或 “password generator” 生成一个 32 位以上的随机字符串。
-
使用命令行 (推荐):
-
在 Linux 或 macOS 的终端中,运行以下命令:
openssl rand -hex 32 -
这会生成一个 64 个字符的十六进制字符串,复制它即可。
-
第五步:整理所有变量值
现在,你应该已经获得了以下所有值:
-
CLOUDFLARE_API_TOKEN
: 从第二步获得的 Cloudflare API 令牌。 -
CLOUDFLARE_ACCOUNT_ID
: 从第一步获得的 Cloudflare 账户 ID。 -
AUTH_GITHUB_ID
: 从第三步获得的 GitHub OAuth App Client ID。 -
AUTH_GITHUB_SECRET
: 从第三步获得的 GitHub OAuth App Client Secret。 -
AUTH_SECRET
: 从第四步生成的随机字符串。
以下变量是可选的,如果你不设置,将使用项目默认值。
-
CUSTOM_DOMAIN
: 你的自定义域名 (例如moemail.yourdomain.com
)。如果留空,将使用 Cloudflare Pages 的默认域名 (<PROJECT_NAME>.pages.dev
)。 -
PROJECT_NAME
: Cloudflare Pages 项目名,默认是moemail
。 -
DATABASE_NAME
: D1 数据库名称,默认是moemail-db
。 -
KV_NAMESPACE_NAME
: KV 存储的名称,默认是moemail-kv
。
第六步:在你的 GitHub 仓库中设置 Secrets
这是最后一步,将你获取的所有密钥安全地存储到你的 GitHub 仓库中,以便 GitHub Actions 可以使用它们。
-
进入你 Fork 的 MoeMail 仓库。
-
点击 “Settings” -> “Secrets and variables” -> “Actions”。
-
在 “Repository secrets” 部分,点击 “New repository secret”。
-
逐一添加所有上一步中提到的变量。请确保名称完全匹配。
-
例如,创建一个名为
CLOUDFLARE_API_TOKEN
的 secret,然后将你复制的令牌粘贴到 “Value” 框中。 -
重复这个过程,添加所有必需和可选的变量。
你需要添加的 Secret 列表:
-
CLOUDFLARE_API_TOKEN
-
CLOUDFLARE_ACCOUNT_ID
-
AUTH_GITHUB_ID
-
AUTH_GITHUB_SECRET
-
AUTH_SECRET
-
CUSTOM_DOMAIN
(如果不用自定义域名,可以留空或不创建此 secret) -
PROJECT_NAME
(建议添加,即使是默认值) -
DATABASE_NAME
(建议添加,即使是默认值) -
KV_NAMESPACE_NAME
(建议添加,即使是默认值)
-
第七步:运行 GitHub Actions 进行部署
-
在你的仓库中,点击顶部的 “Actions” 标签。
-
在左侧选择 “Deploy to Cloudflare Pages” 工作流。
-
点击 “Run workflow” 下拉菜单,然后再次点击绿色的 “Run workflow” 按钮。
-
部署过程会自动开始。你可以点击工作流来查看实时日志和部署进度。整个过程大约需要几分钟。
第八步:完成和验证
-
检查部署: 当 Action 显示绿色对勾时,表示部署成功。
-
访问网站:
-
如果你配置了
CUSTOM_DOMAIN
,访问你的自定义域名。 -
否则,访问
https://<PROJECT_NAME>.pages.dev
。
-
-
更新回调 URL: 回到你之前创建的 GitHub OAuth App 设置页面,确保 “Homepage URL” 和 “Authorization callback URL” 与你最终的网站地址完全一致。如果不一致,请更新它们。
至此,整个部署过程就完成了!现在你应该可以正常访问和使用你的 MoeMail 实例了。
在 MoeMail 个人中心页面,可以配置网站的邮箱域名,支持多域名配置,多个域名用逗号分隔
Cloudflare 邮件路由配置
首次设置电子邮件路由,直接跳过新手指南,然后按照下面步骤部署。
为了使邮箱域名生效,还需要在 Cloudflare 控制台配置邮件路由,将收到的邮件转发给 Email Worker 处理。
- 登录 Cloudflare 控制台
- 选择您的域名
- 点击左侧菜单的 “电子邮件” -> “电子邮件路由”
- 如果显示 “电子邮件路由当前被禁用,没有在路由电子邮件”,请点击 “启用电子邮件路由” <
- 点击后,会提示你添加电子邮件路由 DNS 记录,点击 “添加记录并启用” 即可
- 配置路由规则:
- Catch-all 地址: 启用 “Catch-all”
- 编辑 Catch-all 地址
- 操作: 选择 “发送到 Worker”
- 目标位置: 选择刚刚部署的 “email-receiver-worker”
- 保存
注意事项
- 确保域名的 DNS 托管在 Cloudflare
- Email Worker 必须已经部署成功
- 如果 Catch-All 状态不可用(一直 loading),请点击
路由规则
旁边的目标地址
, 进去绑定一个邮箱
常见问题与排错 (FAQ)
Q: 部署时遇到 AuthenticationError: 401
错误怎么办?
A: 这个错误明确表示你的 CLOUDFLARE_API_TOKEN
身份验证失败。请按以下步骤排查:
-
检查 GitHub Secrets: 确保你在 GitHub 仓库的
Settings -> Secrets
中设置的CLOUDFLARE_API_TOKEN
和CLOUDFLARE_ACCOUNT_ID
的名称和值都完全正确,没有多余的空格或字符。 -
检查令牌权限: 这是最常见的原因。请严格按照本教程第二步的指示,创建一个自定义令牌,并确保它包含了
Pages
、D1
、KV
和Workers Scripts
的编辑(Edit)
权限。使用模板创建的令牌权限可能不足。 -
重新生成令牌: 如果以上两步都无法解决问题,请尝试删除 Cloudflare 上的旧令牌,重新生成一个新令牌,并更新到 GitHub Secrets 中,然后再次运行部署。 Q:我绑定的自定义域名一直处于“验证中”状态,怎么办?
A: 这通常意味着 Cloudflare 无法验证你的域名所有权,根本原因在于 DNS 配置。分两种情况讨论:
如果你的主域名(例如 yourdomain.com)没有托管在 Cloudflare: 你需要去你购买域名的服务商(如 GoDaddy)那里,为你的子域名(如 moemail)添加一条指向 <你的项目名>.pages.dev 的 CNAME 记录。
如果你的主域名(例如 loveximi.de)已经托管在 Cloudflare (即 NameServer 已指向 Cloudflare): 这是最常见的情况。你不需要去域名购买商那里操作,而是应该直接在 Cloudflare 内部完成设置。
登录 Cloudflare 仪表板,选择你的主域名(例如 loveximi.de)。
在左侧菜单中找到并点击 “DNS”。
点击 “添加记录 (Add record)”。
类型 (Type): 选择 CNAME。
名称 (Name): 填写你的子域名,例如 moemail。
目标 (Target): 填写你的 Cloudflare Pages 默认地址,例如 moemail.pages.dev。
代理状态 (Proxy status): 请确保云朵图标是灰色的(仅限 DNS)。等验证通过后,你可以再把它点亮(橙色,代理)。
点击 “保存 (Save)”。
保存后,回到 Pages 项目的自定义域页面,验证应该很快就会通过。
Q: 部署时遇到 Catch-All无法加载出来? 如果电子邮箱服务Catch-All无法加载出来可以绑定一下目标地址刷新试试。(绑定一个邮箱,验证一下即可)