自托管

快速开始

我们的自托管邮件解决方案,和我们所有产品一样,100% 开源——包括前端和后端。这意味着:

  1. 完全透明:处理您邮件的每一行代码都可供公众审查
  2. 社区贡献:任何人都可以贡献改进或修复问题
  3. 开放带来的安全性:漏洞可以被全球社区发现并修复
  4. 无供应商锁定:您永远不依赖于我们公司的存在

整个代码库托管在 GitHub,地址为 https://github.com/forwardemail/forwardemail.net,采用 MIT 许可证。

架构包括以下容器:

  • 用于外发邮件的 SMTP 服务器
  • 用于邮件检索的 IMAP/POP3 服务器
  • 用于管理的 Web 界面
  • 用于配置存储的数据库
  • 用于缓存和性能的 Redis
  • 用于安全加密邮箱存储的 SQLite

Note

请务必查看我们的 自托管博客

对于想要更详细分步骤版本的用户,请参阅我们的基于 UbuntuDebian 的指南。

需求

在运行安装脚本之前,请确保您具备以下条件:

  • 操作系统:基于 Linux 的服务器(当前支持 Ubuntu 22.04 及以上版本)。
  • 资源:1 个 vCPU 和 2GB 内存
  • Root 权限:具备执行命令的管理员权限。
  • 域名:准备好用于 DNS 配置的自定义域名。
  • 干净的 IP:确保您的服务器拥有干净的 IP 地址,无垃圾邮件历史,可通过检查黑名单确认。更多信息见 这里
  • 支持端口 25 的公网 IP 地址
  • 能够设置 反向 PTR
  • 支持 IPv4 和 IPv6

Cloud-init / 用户数据

大多数云服务商支持在虚拟专用服务器(VPS)配置时使用 cloud-init 配置。这是提前设置一些文件和环境变量的好方法,供脚本的初始设置逻辑使用,从而避免脚本运行时需要额外提示输入信息。

选项

  • EMAIL - 用于 certbot 证书过期提醒的邮箱
  • DOMAIN - 用于自托管设置的自定义域名(例如 example.com
  • AUTH_BASIC_USERNAME - 首次设置时用于保护网站的用户名
  • AUTH_BASIC_PASSWORD - 首次设置时用于保护网站的密码
  • /root/.cloudflare.ini - (仅限 Cloudflare 用户)certbot 用于 DNS 配置的 Cloudflare 配置文件。需要通过 dns_cloudflare_api_token 设置您的 API 令牌。详情见 这里。 Example:
#cloud-config
write_files:
  - path: /root/.cloudflare.ini
    content: |
      dns_cloudflare_api_token = "xxx"
    owner: root:root
    permissions: '0600'
  - path: /etc/profile.d/env.sh
    content: |
      export EMAIL="test@myemail.com"
      export DOMAIN="mydomain.com"

runcmd:
  - chmod +x /etc/profile.d/env.sh

安装

在您的服务器上运行以下命令以下载并执行安装脚本:

bash <(curl -fsSL https://raw.githubusercontent.com/forwardemail/forwardemail.net/master/self-hosting/setup.sh)

调试安装脚本

在安装脚本前添加 DEBUG=true 以获得详细输出:

DEBUG=true bash <(curl -fsSL https://raw.githubusercontent.com/forwardemail/forwardemail.net/master/self-hosting/setup.sh)

提示

1. 初始设置
2. 设置备份
3. 设置自动升级
4. 续订证书
5. 从备份恢复
6. 帮助
7. 退出
  • 初始设置:下载最新的 forward email 代码,配置环境,提示输入您的自定义域名,并设置所有必要的证书、密钥和秘密。
  • 设置备份:将设置一个 cron 任务,使用兼容 S3 的存储来备份 mongoDB 和 redis,实现安全的远程存储。另有 sqlite 会在登录时备份(如果有更改),以实现安全加密备份。
  • 设置升级:设置一个 cron 任务,查找每晚更新,安全地重建并重启基础设施组件。
  • 续订证书:使用 Certbot / lets encrypt 获取 SSL 证书,证书和密钥每 3 个月过期。此操作将为您的域名续订证书,并将其放置在相关组件可使用的必要文件夹中。详见 重要文件路径
  • 从备份恢复:将触发 mongodb 和 redis 从备份数据恢复。

初始设置(选项 1)

选择选项 1. 初始设置 开始。

完成后,您应该会看到成功消息。您甚至可以运行 docker ps 查看启动的组件。组件的更多信息见下文。

服务

服务名称 默认端口 描述
Web 443 所有管理交互的 Web 界面
API 4000 抽象数据库的 API 层
Bree 后台作业和任务运行器
SMTP 465(推荐)/ 587 用于外发邮件的 SMTP 服务器
SMTP Bree SMTP 后台作业
MX 2525 用于收件邮件和邮件转发的邮件交换服务器
IMAP 993/2993 用于收件邮件和邮箱管理的 IMAP 服务器
POP3 995/2995 用于收件邮件和邮箱管理的 POP3 服务器
SQLite 3456 用于与 sqlite 数据库交互的 SQLite 服务器
SQLite Bree SQLite 后台作业
CalDAV 5000 用于日历管理的 CalDAV 服务器
CardDAV 6000 用于日历管理的 CardDAV 服务器
MongoDB 27017 用于大部分数据管理的 MongoDB 数据库
Redis 6379 用于缓存和状态管理的 Redis
SQLite 用于加密邮箱的 SQLite 数据库

重要文件路径

注意:下方 主机路径 是相对于 /root/forwardemail.net/self-hosting/ 的。

组件 主机路径 容器路径
MongoDB ./mongo-backups /backups
Redis ./redis-data /data
Sqlite ./sqlite-data /mnt/{SQLITE_STORAGE_PATH}
环境文件 ./.env /app/.env
SSL 证书/密钥 ./ssl /app/ssl/
私钥 ./ssl/privkey.pem /app/ssl/privkey.pem
完整链证书 ./ssl/fullchain.pem /app/ssl/fullchain.pem
CA 证书 ./ssl/cert.pem /app/ssl/cert.pem
DKIM 私钥 ./ssl/dkim.key /app/ssl/dkim.key

Important

请安全保存 .env 文件。这对于故障恢复至关重要。 你可以在 /root/forwardemail.net/self-hosting/.env 找到它。

配置

初始 DNS 设置

在你选择的 DNS 提供商处,配置相应的 DNS 记录。请注意,括号内的内容(<>)是动态的,需要替换为你的实际值。

类型 名称 内容 TTL
A "@", ".", 或空白 <ip_address> auto
CNAME api <domain_name> auto
CNAME caldav <domain_name> auto
CNAME carddav <domain_name> auto
CNAME fe-bounces <domain_name> auto
CNAME imap <domain_name> auto
CNAME mx <domain_name> auto
CNAME pop3 <domain_name> auto
CNAME smtp <domain_name> auto
MX "@", ".", 或空白 mx.<domain_name> (优先级 0) auto
TXT "@", ".", 或空白 "v=spf1 a -all" auto

反向 DNS / PTR 记录

反向 DNS(rDNS)或反向指针记录(PTR 记录)对邮件服务器非常重要,因为它们有助于验证发送邮件服务器的合法性。每个云服务提供商的操作方式不同,你需要查找如何添加“反向 DNS”以将主机和 IP 映射到对应的主机名。通常在提供商的网络设置部分。

端口 25 被阻止

一些 ISP 和云服务提供商会阻止端口 25 以防止恶意行为。你可能需要提交支持工单以开放端口 25 用于 SMTP / 外发邮件。

入门

  1. 打开登录页面
    访问 https://<domain_name>,将 <domain_name> 替换为你 DNS 设置中配置的域名。你应该能看到 Forward Email 的登录页面。

  2. 登录并添加你的域名

  • 使用有效的邮箱和密码登录。
  • 输入你想设置的域名(必须与 DNS 配置匹配)。
  • 按提示添加所需的 MXTXT 记录以完成验证。
  1. 完成设置
  • 验证通过后,进入别名页面创建你的第一个别名。
  • 可选地,在 域设置 中配置 SMTP 用于外发邮件。这需要额外的 DNS 记录。

Note

没有信息会发送到你的服务器之外。自托管选项和初始账户仅用于管理员登录和网页管理域名、别名及相关邮件配置。

测试

创建你的第一个别名

  1. 进入别名页面
    打开别名管理页面:
https://<domain_name>/en/my-account/domains/<domain_name>/aliases
  1. 添加新别名
  • 点击右上角的 添加别名
  • 输入别名名称并根据需要调整邮件设置。
  • (可选)勾选启用 IMAP/POP3/CalDAV/CardDAV 支持。
  • 点击 创建别名
  1. 设置密码
  • 点击 生成密码 创建一个安全密码。
  • 该密码用于登录你的邮件客户端。
  1. 配置你的邮件客户端
  • 使用 Thunderbird 等邮件客户端。
  • 输入别名名称和生成的密码。
  • 按照要求配置 IMAPSMTP 设置。

邮件服务器设置

用户名:<alias name>

类型 主机名 端口 连接安全性 认证方式
SMTP smtp.<domain_name> 465 SSL / TLS 普通密码
IMAP imap.<domain_name> 993 SSL / TLS 普通密码

发送 / 接收你的第一封邮件

配置完成后,你应该能够使用新创建的自托管邮箱发送和接收邮件!

故障排除

为什么这在 Ubuntu 和 Debian 之外不起作用

我们目前正在寻求支持 MacOS,并将考虑其他系统。如果您希望支持其他系统,请打开一个讨论或贡献代码。

为什么 certbot acme 挑战失败

最常见的问题是 certbot / letsencrypt 有时会请求 2 个挑战。您需要确保添加 两个 TXT 记录。

示例: 您可能会看到两个挑战,如下所示: _acme-challenge.example.com -> "randomstring1" _acme-challenge.example.com -> "randomstring2"

也有可能 DNS 传播尚未完成。您可以使用类似 https://toolbox.googleapps.com/apps/dig/#TXT/_acme-challenge.<your_domain> 的工具。这将帮助您了解 TXT 记录的更改是否已反映出来。也有可能主机上的本地 DNS 缓存仍在使用旧的、过时的值,或者尚未获取到最近的更改。

另一种选择是在初始 VPS 设置时,通过在 cloud-init / user-data 中设置 /root/.cloudflare.ini 文件并包含 API 令牌,使用自动化 certbot DNS 更改。或者创建此文件后再次运行脚本。这将自动管理 DNS 更改和挑战更新。

基本认证的用户名和密码是什么

对于自托管,我们会添加首次浏览器原生认证弹窗,用户名为简单的 admin,密码在初始设置时随机生成。我们这样做是为了防止自动化程序 / 爬虫抢先完成网页体验的首次注册。您可以在初始设置后,在 .env 文件中的 AUTH_BASIC_USERNAMEAUTH_BASIC_PASSWORD 找到此密码。

如何知道正在运行什么

您可以运行 docker ps 查看所有正在运行的容器,这些容器是由 docker-compose-self-hosting.yml 文件启动的。您也可以运行 docker ps -a 查看所有容器(包括未运行的)。

如何知道应该运行的服务是否未运行

您可以运行 docker ps -a 查看所有容器(包括未运行的)。您可能会看到退出日志或相关提示。

如何查找日志

您可以通过 docker logs -f <container_name> 获取更多日志。如果有容器退出,通常是 .env 文件配置错误导致的。

在网页 UI 中,您可以查看 /admin/emails/admin/logs,分别用于查看外发邮件日志和错误日志。

为什么我的外发邮件超时

如果您看到类似“连接到 MX 服务器时连接超时”的消息,则可能需要检查端口 25 是否被阻塞。ISP 或云服务提供商通常默认阻止此端口,您可能需要联系支持或提交工单以开放该端口。

我应该使用哪些工具来测试邮件配置最佳实践和 IP 声誉

请查看我们的常见问题解答