mailcow: dockerized 部署指南:4 条命令跑通完整邮件服务
【免费下载链接】mailcow-dockerizedmailcow: dockerized - 🐮 + 🐋 = 💕项目地址: https://gitcode.com/GitHub_Trending/ma/mailcow-dockerized
在一台干净的 Linux 服务器上进行克隆、生成配置、拉起容器,mailcow: dockerized 就能以一组 Docker 容器的形态提供完整邮件收发能力:Postfix 负责投递,Dovecot 负责 IMAP 存储,Rspamd 负责垃圾与病毒过滤,全部由一个 Web 界面统一配置。它适合想自建邮件服务、又不想逐个手工编译安装组件的个人站长和中小团队。
它解决什么问题,适合谁
mailcow 把一套邮件系统需要的十几个组件打包进 docker-compose.yml,每个组件独立成容器,版本组合由上游统一维护。对你来说,它解决的是三件麻烦事:
- 组件依赖与版本兼容:不用自己处理 Postfix、Dovecot、Rspamd 之间的升级顺序,容器镜像版本由 compose 文件锁定。
- 配置分发:所有服务的配置文件集中在
data/conf/目录,改动后重启对应容器即可生效。 - 运维入口统一:域名、邮箱、配额、垃圾过滤规则都在同一个 Web 界面操作,不需要记住每个组件的命令行。
如果服务器内存低于 2.5 GiB,注意脚本会主动建议关闭 ClamAV 病毒扫描,避免内存耗尽,这一点在 generate_config.sh 里有明确判断。
部署前需要确认什么
部署卡住大多源于环境不达标,先花两分钟对照下面清单:
- 操作系统为 Linux,已安装 Docker 且版本不低于 24(
generate_config.sh会硬性检查,低于 24 直接退出)。 - 已安装 Docker Compose 插件或独立版
docker-compose,脚本会自动探测并使用其中一种。 - 内存至少 4 GiB 比较稳妥;低于 2.5 GiB 时 ClamAV 会被建议禁用。
- 你有一个能解析的域名,并计划给 mailcow 分配一个完整限定主机名(FQDN,形如 mail.example.com),脚本要求必须带子域,裸域只有警告提示。
- 服务器可访问公网,容器镜像需要在线拉取。
验证环境就绪只需一条命令:运行docker version,确认 Client 与 Server 版本均大于等于 24,且 Compose 插件存在。
上手部署:拉代码、生成配置、拉起容器
拉取代码
把仓库克隆到服务器,进入目录。这是后文所有脚本的执行位置。
git clone https://gitcode.com/GitHub_Trending/ma/mailcow-dockerized cd mailcow-dockerized预期结果:目录下出现generate_config.sh、docker-compose.yml、update.sh等文件。脚本还会让你选择使用哪个分支:master 是稳定版,nightly 是测试版,生产环境选 master 即可。
生成配置
generate_config.sh依赖一个.env符号链接指向mailcow.conf,先建链接再运行脚本:
ln -s mailcow.conf .env ./generate_config.sh预期结果:脚本依次询问主机名(FQDN)、时区、是否禁用 ClamAV、使用哪个分支,最后生成权限为 600 的mailcow.conf文件。数据库密码、Redis 密码都会随机生成并写入其中,无需手动编辑。若看到 "is not a FQDN" 报错,说明主机名填成了裸域,重新运行脚本修正即可。
启动整组容器
docker compose up -d预期结果:首次运行会拉取全部镜像,耗时取决于带宽;随后postfix-mailcow、dovecot-mailcow、nginx-mailcow、mysql-mailcow、rspamd-mailcow、watchdog-mailcow等一批容器逐个进入 running 状态。
启动后如何验证部署成功
三个可检查的信号,全部满足才算部署完成:
docker compose ps输出中没有 exited 或 restarting 状态的容器,核心服务都在 running。- 浏览器访问
https://你的主机名,出现登录页。此时用默认管理员账号admin、密码moohoo可以登录(该默认值写在 generate_config.sh 的配置模板注释里),登录后立即改掉它。 - 等待几分钟后再看一次容器状态仍全部 running,说明 watchdog 没有反复拉起崩溃的服务。
另外可以在管理界面的"系统"页查看各组件版本,确认与 docker-compose.yml 中锁定的镜像版本一致。
三个最值得先用起来的功能
Web 管理界面。场景:给新同事开邮箱、加新域名。入口:登录后左侧的域名与邮箱管理(界面代码位于 data/web/admin/)。效果:建域名时系统会列出需要配置的 DNS 记录,建邮箱时直接设置配额,全程无命令行。
Rspamd 垃圾过滤与隔离区。场景:确认某封被拦邮件是不是误杀。入口:管理界面的隔离区页面,规则配置存放在 data/conf/rspamd/。效果:进入隔离区的邮件可在界面查看完整头信息,一键标记放行或拉黑,调整后的规则立即作用于新邮件。
内置备份恢复脚本。场景:升级前或迁移前留后路。入口:helper-scripts/backup_and_restore.sh。效果:运行./helper-scripts/backup_and_restore.sh backup all /backup/path后,vmail 邮件数据、数据库、Redis、Rspamd、Postfix 会被打包成带时间戳的 zstd 归档,恢复时按数据集选择,支持只恢复邮件目录而不停库。
卡住了怎么办:按症状排查
症状一:generate_config.sh 提示.env符号链接不指向 mailcow.conf。运行ls -l .env mailcow.conf检查链接是否存在;修复方向:必须在 mailcow 安装目录内先执行ln -s mailcow.conf .env,且确认没有把.env当成普通文本文件编辑过。
症状二:个别容器反复重启,watchdog 不断报警。先运行docker compose ps锁定问题容器,再用docker compose logs --tail=50加容器名查看日志;修复方向:常见原因是内存不足导致 ClamAV 进程被 OOM 杀掉,把mailcow.conf中SKIP_CLAMD改为y后运行docker compose up -d重建;IPv6 配置错误也会引发类似问题,可在 compose 文件里关闭 IPv6。
症状三:update.sh 更新停在合并代码或报错退出。运行git status查看本地改动;修复方向:更新前务必备份,脚本本身会在合并前保存 diff;如果只想清理过期镜像,单独运行./update.sh --gc;报错后按脚本提示先docker compose up -d恢复原状态再排查。
跑起来之后:按频率做最小维护
首次(上线当天):改掉默认管理员密码;执行一次./helper-scripts/backup_and_restore.sh backup all建立首个恢复点;在mailcow.conf里给 watchdog 配置通知邮箱,让容器异常时能收到邮件。
每周:定时备份一次(把备份命令加入 crontab);运行docker compose ps扫一遍容器状态;用df -h确认邮件数据所在分区未接近写满。
每月:先备份,再运行./update.sh拉取稳定版更新,脚本会合并代码、拉取新镜像并自动重启;同时确认 ACME 容器已为新域名自动签发证书,管理界面里查看证书到期时间即可。
mailcow 的设计把"装得起来"这件事压到了最小成本,剩下的精力可以放在域名、DNS 与日常备份上。想继续深入,可以从 generate_config.sh 读懂全部配置项,或从 helper-scripts/mailcow-reset-admin.sh 这类运维脚本入手,它们都是可直接运行的实现。
【免费下载链接】mailcow-dockerizedmailcow: dockerized - 🐮 + 🐋 = 💕项目地址: https://gitcode.com/GitHub_Trending/ma/mailcow-dockerized
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考