mailcow 邮件服务器 Docker 部署:30 分钟从零到可用
【免费下载链接】mailcow-dockerizedmailcow: dockerized - 🐮 + 🐋 = 💕项目地址: https://gitcode.com/GitHub_Trending/ma/mailcow-dockerized
mailcow-dockerized 是一套基于 Docker 的企业级邮件服务器解决方案,它把 Postfix、Dovecot、Rspamd、MariaDB、Nginx 等一整套邮件栈打包成容器,几条命令就能完成一次自建邮件服务器的 Docker 部署。
上周有个客户换了域名,五十个同事的邮箱全得重配,IT 一个人对着十来个组件的配置文档发呆——Postfix 怎么配转发、Dovecot 怎么存邮件、Rspamd 怎么打分,组件版本还未必互相兼容。换成 mailcow,这件事变成了:在 Web 面板里改几条记录,剩下的交给容器自动接管。
mailcow 集成了哪些核心组件
mailcow-dockerized 本质上是由 docker-compose.yml 编排的一组容器:Postfix 负责 SMTP 收发,Dovecot 负责 IMAP/POP3 接入与邮件存储,Rspamd 负责反垃圾打分,配合 ClamAV 病毒扫描和 Olefy 办公文档检测,MariaDB 存放全部配置数据,Nginx 统一前置 Web 面板与 webmail,SOGo 提供 webmail、DAV 和 Exchange ActiveSync,另外还有 Unbound 做本地 DNS 解析、Redis 做缓存、ACME 自动签发 Let's Encrypt 证书、watchdog 做容器健康巡检。
所有组件的配置文件统一放在 data/conf/ 下,不用满机器找散落的文件。它适合想自建邮件服务器、又不想逐组件折腾的个人和小团队,一台 2~4GB 内存的 VPS 就能跑起来。
mailcow 部署前的准备清单
动手之前把下面几项过一遍,每一项都能帮你省一次回头路:
- Linux 系统(Ubuntu/Debian/CentOS)且 Docker 24 以上。因为 mailcow 使用新版 Compose 语法,配置脚本会直接校验版本。
- 一个 FQDN(如 mail.example.com)和它的 DNS 控制权。因为主机名是全部记录的锚点,ACME 容器还要靠 80 端口的 HTTP 验证来签证书。
- 放行 25、465、587、143、993、110、995、80、443 端口。因为这是邮件收发、邮件客户端接入和 Web 面板的端口。
- 至少 2GB 可用内存。因为 ClamAV 杀病毒比较吃内存,2.5GB 以下的机器配置脚本会建议你直接关掉它。
- 至少 20GB 空闲磁盘。因为邮件存储、病毒库和容器镜像都会占用空间。
- 公网 IP 最好不在云厂商的屏蔽 ASN 上。因为这直接影响你的外发邮件能不能被各大邮箱接收。
mailcow 执行链路:从拉代码到服务上线
这一段建议一口气做完,关键节点我用 ✅ 标了出来。
先拿到源码,并建立配置脚本要求的环境文件软链(.env指向mailcow.conf,Docker Compose 从这里读取所有变量):
git clone https://gitcode.com/GitHub_Trending/ma/mailcow-dockerized cd mailcow-dockerized ln -s mailcow.conf .env软链创建成功时没有任何输出,没报错就可以继续。
接着运行配置脚本。它会依次问你:邮件服务器主机名 FQDN(注意这是服务器地址,不是邮箱域名,例如 mail.example.com)、时区、是否禁用 ClamAV,以及使用哪个分支(生产环境选推荐的 master 即可)。
./generate_config.sh跑完后目录下会生成一份 mailcow.conf,数据库、Redis 的随机密码都已经填好。
✅ 检查点:mailcow.conf 已生成,且 MAILCOW_HOSTNAME 和你申请的域名一致。
配置就绪后,启动整个服务栈:
docker compose up -d首次运行要拉取十几个容器的镜像,等几分钟属于正常现象。
✅ 检查点:浏览器打开 https://mail.example.com(换成你的域名),应出现管理面板登录页,默认账号 admin,密码 moohoo,登录后立即改掉。
登录后直接进入面板的 DNS 页,把系统生成的 MX、SPF、DKIM、DMARC、SRV、TXT 等记录全部复制,发布到域名服务商的 DNS 管理后台。
✅ 检查点:记录发布后稍等几分钟,面板里的 DNS 诊断功能应全部显示通过。
mailcow 启动后的跑通验证
确认分三层,从浅到深。
先看容器状态,所有服务都应该是 Up(或 healthy):
docker compose ps如果某个容器反复重启,先对它执行 docker compose logs 看日志定位。
再发一封真实邮件验证链路。在面板里添加一个域名(自己的域名即可)、建一个测试邮箱,用 SOGo webmail(https://mail.example.com/sogo)登录,给一个 Gmail 或 QQ 邮箱发信,对方收件箱能收到、且邮件头里能看到 DKIM 签名,说明发信链路完全打通。
再确认 DNS 记录真的生效:
dig mx example.com +short dig txt example.com +short输出里应分别出现指向你服务器的 MX 记录和刚发布的 SPF 记录。
mailcow 日常运维:几件具体的事
系统跑起来之后,日常工作基本都在 Web 面板里完成,终端只是辅助。
给新员工开一个邮箱
入口在左侧菜单“邮件 → 域名”:选中域名后添加邮箱,填地址、设密码和配额,提交即可。新同事马上就能登录 SOGo,或者在 Outlook、手机客户端里配置 IMAP(993)/SMTP(587)。想让客户端零配置的话,mailcow 自带 autodiscover 支持,客户端里输入邮箱地址就能自动发现服务器。
给高管设自动回复
高管出差期间需要假期自动回复。用该邮箱登录 SOGo,在设置里开启“度假回复”,填好起止时间和文案。SOGo 容器内置了定时任务(在 docker-compose.yml 里能看到 sogo_eautoreply 这条 cron),每 5 分钟同步一次自动回复状态,到期会自动停止,不会出现常年回“出差中”的尴尬。
排查一波钓鱼邮件
员工上报可疑邮件时,先看 Web 面板的隔离区页面:Rspamd 拦下的每一封都会展示评分和命中的规则,可以查看完整邮件头,然后选择放行、举报或删除。想调整策略的话,配置在 data/conf/rspamd/:local.d 放本地规则参数,custom/ 放自定义字典,改完重启 rspamd 容器生效。
备份与升级
备份建议从第一天就做。helper-scripts/ 目录里有现成脚本,一条命令把邮箱数据、数据库和配置全备份下来:
./helper-scripts/backup_and_restore.sh backup all /backup会在 /backup 下生成带时间戳的备份目录,给 crontab 加一行就能每天自动跑。升级更省事,在 mailcow 目录下执行 ./update.sh 即可把各组件更新到最新版本。
升级前可以留意一下项目的分支节奏:稳定版走 master,测试版走 nightly,安装时 generate_config.sh 会让你二选一。项目通过 PR 工作流把变更合入稳定分支:
mailcow 踩坑与排查
下面是几个高频问题,都按“看到什么现象、跑什么命令、根因在哪、怎么修”的顺序讲。
最常见的是 Web 面板 502 或打不开。先跑 docker compose ps 看 phpfpm-mailcow 是否反复重启,再用 docker compose logs phpfpm 看日志。典型根因是 mailcow.conf 里的 MAILCOW_HOSTNAME 和实际访问的域名对不上(必须用安装时设置的那个 FQDN),或者 .env 软链在清理目录时被删掉了。修好主机名、确认软链存在,重启整个服务栈即可。
第二种是外发邮件大量积压在队列里。看一下队列:
docker exec -it postfix-mailcow postqueue -p如果 deferred 里全是 4xx/5xx 的远端报错,根因通常是宿主机 25 端口出网被云厂商封掉——云上机器非常常见。修复办法是找厂商申请解封 25 端口,实在不行就统一改用 587 端口提交发信,并在 data/conf/postfix/ 里调整相应的中继策略。
第三种是系统内部正常,但外部邮件收不进来。先跑 dig mx example.com +short 确认 MX 真的解析到了你的服务器,再检查 SPF 和 DMARC 是否已发布。根因一般是记录没发布或 TTL 还没生效。把面板 DNS 页里的记录补全,等生效后用面板自带的 DNS 诊断复查,它会直接告诉你哪条记录有问题。
第四种是 ClamAV 容器因内存不足反复退出,整个邮件扫描链路卡住。根因是机器内存较小而 ClamAV 没有关掉。修复:在 mailcow.conf 里设 SKIP_CLAMD=y 然后重启整个栈,Rspamd 会自动探测到 ClamAV 缺失并跳过查毒,不会卡住邮件处理。以后内存扩容了再改回 n。
还有一个大家都会遇到的情况:管理员密码忘了。项目里有专门的脚本:
./helper-scripts/mailcow-reset-admin.sh它会生成一个新的随机管理员密码并直接打印在屏幕上,登录后再改一次即可。
走到这里,邮件系统已经在你手里了。接下来可以慢慢折腾的方向其实不少:性能调优,比如调整 data/conf/mysql/my.cnf 里的 innodb_buffer_pool_size、在内存吃紧时关掉 Dovecot 全文搜索;高可用,比如用 mailcow.conf 里的 MASTER/REPLICA 搭一个复制节点做主备;安全加固,比如 watchdog(默认就是开启的)会在容器异常时发邮件报警,fail2ban 可以拦掉暴力破解的 IP。这些都不着急,先把每天自动备份的 crontab 跑起来,剩下的随时有空随时上。
【免费下载链接】mailcow-dockerizedmailcow: dockerized - 🐮 + 🐋 = 💕项目地址: https://gitcode.com/GitHub_Trending/ma/mailcow-dockerized
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考