Mautic 是开源的营销自动化平台,适合线索收集、邮件培育、标签分组、活动触发和营销漏斗分析。把 Mautic 部署在自己的 VPS 上,可以掌握联系人数据、邮件模板和自动化规则,也能避免 SaaS 按联系人数量持续涨价。代价是你必须自己维护数据库、定时任务、SMTP 信誉、备份和升级。
本文以 Ubuntu 24.04、Docker Compose、MariaDB 和 Caddy 为例,搭建适合小团队使用的 Mautic 单机环境。Mautic 不同大版本的镜像入口和环境变量会变化,生产部署前应以当前官方文档和镜像说明为准。
Mautic 的 Web 页面不算重,但导入联系人、执行 Campaign、发送邮件和生成报告都会消耗 CPU 与内存。建议配置如下:
| 项目 | 测试环境 | 小团队生产环境 |
|---|---|---|
| CPU | 2 vCPU | 4 vCPU 起 |
| 内存 | 2 GB | 4 GB 起 |
| 磁盘 | 30 GB SSD | 60 GB SSD 起 |
| 系统 | Ubuntu 22.04/24.04 | Ubuntu 24.04 LTS |
| 域名 | mautic.example.com | 独立营销子域名 |
为域名添加 A/AAAA 记录指向 VPS。云防火墙只开放 SSH、80 和 443,MariaDB 不要映射到公网。如果服务器上已有多个 Docker 应用,先用 free -h、df -h 和 docker stats 检查余量;资源规划可参考 VPS 配置怎么选。
sudo apt update
sudo apt install -y ca-certificates curl openssl
curl -fsSL https://get.docker.com | sudo sh
sudo usermod -aG docker "$USER"
newgrp docker
sudo mkdir -p /opt/mautic
sudo chown -R "$USER":"$USER" /opt/mautic
cd /opt/mautic
生成数据库密码和应用密钥,真实值放进 .env,不要提交到公开仓库:
openssl rand -hex 32
openssl rand -base64 32
下面是一个可理解的服务结构示例。Mautic 官方镜像的变量名、版本和启动命令可能变化,使用前请对照当前版本文档:
services:
db:
image: mariadb:10.11
restart: unless-stopped
command: --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
environment:
MYSQL_DATABASE: mautic
MYSQL_USER: mautic
MYSQL_PASSWORD: change-a-long-password
MYSQL_ROOT_PASSWORD: change-a-root-password
volumes:
- db_data:/var/lib/mysql
healthcheck:
test: ["CMD", "healthcheck.sh", "--connect", "--innodb_initialized"]
interval: 10s
timeout: 5s
retries: 15
mautic:
image: mautic/mautic:latest
restart: unless-stopped
depends_on:
db:
condition: service_healthy
environment:
MAUTIC_DB_HOST: db
MAUTIC_DB_NAME: mautic
MAUTIC_DB_USER: mautic
MAUTIC_DB_PASSWORD: change-a-long-password
MAUTIC_RUN_CRON_JOBS: "false"
ports:
- "127.0.0.1:8080:80"
volumes:
- mautic_data:/var/www/html
volumes:
db_data:
mautic_data:
生产环境不要直接使用 latest。确认当前稳定版本后固定镜像标签,并把密码移到 .env。启动前检查配置:
docker compose config
docker compose pull
docker compose up -d
docker compose ps
docker compose logs --tail=150 mautic
如果当前镜像需要单独的 Web、Cron 或 Worker 服务,应按官方 Compose 模板拆分,不能只启动 Web 容器后期待 Campaign 自动执行。
确认容器状态稳定后,通过 SSH 隧道临时访问:
ssh -L 8080:127.0.0.1:8080 root@SERVER_IP
浏览器打开 http://127.0.0.1:8080,完成管理员初始化。安装向导中的数据库主机要填 Compose 服务名 db,不要填 localhost。
首次登录后先完成:
- 设置站点名称、默认时区和语言;
- 创建管理员强密码并启用 MFA(如果当前版本支持);
- 配置发件人地址和默认邮件名称;
- 设置公开表单、Landing Page 和跟踪域名;
- 创建一个测试联系人和测试 Campaign;
- 使用测试地址验证打开、点击、退订和失败事件。
安装 Caddy:
sudo apt install -y caddy
sudo nano /etc/caddy/Caddyfile
写入反向代理配置:
mautic.example.com {
encode gzip zstd
reverse_proxy 127.0.0.1:8080
header {
Strict-Transport-Security "max-age=31536000; includeSubDomains"
X-Content-Type-Options "nosniff"
X-Frame-Options "SAMEORIGIN"
}
}
sudo caddy validate --config /etc/caddy/Caddyfile
sudo systemctl reload caddy
curl -I https://mautic.example.com
如果 VPS 上已经运行 Nginx Proxy Manager 或其他网关,只保留一个服务监听 80/443。反向代理和 HTTPS 排错可以参考 VPS 用 Caddy 反向代理完全指南。
Mautic 能否正常工作,很大程度取决于邮件服务,而不是页面能否打开。生产环境不要使用个人邮箱的普通密码,优先使用事务邮件服务或带应用密码的 SMTP:
- 使用独立发件子域名,例如 mail.example.com;
- 配置 SPF、DKIM 和 DMARC;
- 设置正确的 PTR/反向 DNS;
- 为营销邮件提供清晰的退订链接;
- 新域名先低频发送,逐步建立信誉;
- 监控退信、投诉和硬退订,不要反复发送无效地址。
在 Mautic 后台填写 SMTP 后,先给自己发送测试邮件,再测试 Campaign 的自动发送。若邮件进入垃圾箱,检查 SMTP 日志、DNS 记录和供应商退信原因;不要先盲目提高发送并发。
只启动 Web 容器不会自动执行所有营销任务。Mautic 通常需要定时运行 Campaign、分段刷新、邮件队列和清理任务。可以在宿主机使用 Cron 调度:
crontab -e
示例(实际命令以当前 Mautic 版本为准):
*/5 * * * * cd /opt/mautic && docker compose exec -T mautic php bin/console mautic:campaigns:trigger --no-interaction >/dev/null 2>&1
*/10 * * * * cd /opt/mautic && docker compose exec -T mautic php bin/console mautic:segments:update --no-interaction >/dev/null 2>&1
*/5 * * * * cd /opt/mautic && docker compose exec -T mautic php bin/console mautic:emails:send --no-interaction >/dev/null 2>&1
先手动执行一遍确认命令可用,再交给 Cron。不要把任务间隔设置得过短,否则会造成数据库锁、重复发送或 CPU 持续满载。活动量较大时,将 Web、Cron 和 Worker 分到独立容器,并限制每次任务的处理量。
Mautic 跟踪脚本和表单会收集联系人行为数据。上线前要:
- 在隐私政策中说明收集目的、Cookie 和保留期限;
- 只为必要的表单字段设置必填;
- 为营销订阅和服务通知分开记录同意状态;
- 允许联系人查看、导出和删除个人数据;
- 不要把 API Key、SMTP 密码或数据库凭据写进前端;
- 通过 HTTPS 发送表单,检查跨域和安全响应头。
如果通过 Cloudflare 代理域名,确认缓存规则不会缓存带有联系人参数或管理会话的页面。
Mautic 的可恢复性取决于 MariaDB、mautic_data 和 .env。每天导出数据库并打包应用数据:
mkdir -p /opt/mautic/backups
docker compose exec -T db mysqldump -umautic -p"YOUR_DB_PASSWORD" mautic | gzip > /opt/mautic/backups/mautic-$(date +%F).sql.gz
docker run --rm -v mautic_mautic_data:/data -v /opt/mautic/backups:/backup alpine sh -c 'tar czf /backup/mautic-data-$(date +%F).tgz -C /data .'
cp .env docker-compose.yml /opt/mautic/backups/
实际 Volume 名称可用 docker volume ls 确认。备份至少同步一份异地副本并加密,不要只依赖 VPS 快照。恢复前在干净 VPS 还原一次,验证管理员登录、联系人、表单、Campaign、邮件和退订链接。完整恢复思路见 VPS 备份恢复演练。
升级前固定镜像版本并保存配置:
docker compose config > /opt/mautic/backups/compose-$(date +%F).yaml
docker compose pull
docker compose up -d
docker compose ps
docker compose logs --tail=200 mautic
先在测试实例执行数据库迁移,再安排生产升级。不要在没有备份和回滚方案时直接跟随 latest。
docker compose ps
docker compose logs --tail=200 mautic
sudo journalctl -u caddy -n 100 --no-pager
ss -lntp | grep -E ':8080|:80|:443'
确认 Mautic 绑定了 127.0.0.1:8080,Caddy 指向相同端口,且公开 URL 与 HTTPS 域名一致。
先手动运行 Campaign 命令,查看退出码和日志,再检查 Cron 用户是否有权限访问 Docker。若任务执行很慢,观察 MariaDB 锁、内存和队列积压,不要简单地把 Cron 频率调到每分钟。
检查是否有多个 Cron 实例同时运行,确认队列命令没有重叠。再查看 SMTP 供应商的发送限制、退信和投诉记录。删除无效联系人前先导出审计数据,避免误删订阅记录。
- 域名、HTTPS、登录和表单提交正常;
- SMTP、SPF、DKIM、DMARC 和 PTR 已验证;
- Cron、Campaign、分段刷新和邮件队列按计划运行;
- 管理后台、MariaDB 和内部端口未暴露公网;
- .env、数据库和应用数据都有异地备份;
- 完成过一次恢复演练;
- 已固定版本并记录升级回滚步骤。
Mautic 适合把营销自动化掌握在自己的 VPS 上,但邮件信誉和定时任务同样重要。先用小规模测试联系人验证完整链路,再逐步放量,才能避免“系统正常运行但邮件全部进垃圾箱”的上线事故。
