从 0 搭建 Mailu 邮件服务器：Docker Compose 部署 + DNS 记录 + 证书/反向代理要点
Mailu 是一个“全家桶”式的邮件服务器方案：SMTP/IMAP、反垃圾、Webmail、管理后台都给你打包好了。本文用 Docker Compose 从 0 在一台 VPS 上搭建可用的 Mailu，并把 DNS 记录、证书、端口/反向代理冲突、投递成功率（PTR/反向解析） 这些容易踩坑的点一次讲清。0. 前置准备（别跳过） 一台干净的 VPS（建议 Debian 12/13 / Ubuntu 22.04+）。 一个域名：*你的主域名*（示例：example.com）。 一个邮件主机名（MX 指向它）：*你的邮件主机名*（示例：mx.example.com）。 服务器公网 IP：*你的服务器公网IP*。 重要：最好能设置 PTR（反向解析）把 IP 指回 *你的邮件主机名*，否则很多收件方会降权甚至拒收。 1. 规划：端口、主机名、证书模式1.1 邮件常用端口（建议全部开放） 25/tcp：SMTP（服务器间投递） 465/tcp：SMTPS（客户端提交，隐式 TLS） 587/tcp：SMTP Submission（客户端提交，STARTTLS） 143/tcp：IMAP（STARTTLS） 993/tcp：IMAPS（隐式 TLS） 4190/tcp：Sieve（邮件过滤规则） 80/443：Web 管理后台 / Webmail（以及 Let's Encrypt 校验） 如果你只想给自己用，理论上可以不开放 110/995（POP3），一般也不建议开。1.2 证书（TLS）怎么选 推荐：让 Mailu 自己申请 Let's Encrypt（简单直接）。要求：80/443 能从公网直连到 Mailu 前端容器。 如果你的服务器上已经有 Nginx/Apache 占用 80/443：要么把网站迁到反代到 Mailu（或改端口），要么改用“外置证书”模式（见后文“端口冲突/反向代理”）。 2. 安装 Docker 与 Docker Compose下面以 Debian 为例，其他发行版按官方文档调整即可。# 更新系统 sudo apt update sudo apt -y upgrade # 安装 Docker sudo apt -y install ca-certificates curl gnupg sudo install -m 0755 -d /etc/apt/keyrings curl -fsSL https://download.docker.com/linux/debian/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg sudo chmod a+r /etc/apt/keyrings/docker.gpg echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/debian $(. /etc/os-release && echo $VERSION_CODENAME) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null sudo apt update sudo apt -y install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin # 验证 docker --version docker compose version3. 用 Mailu 向导生成配置Mailu 官方提供配置向导，会输出 docker-compose.yml 和 mailu.env。你可以在浏览器里用向导生成，也可以参考本文直接写。3.1 目录结构（建议）sudo mkdir -p /mailu cd /mailu3.2 核心配置（mailu.env 示例，关键项解释）下面是常用关键项（示例值都请替换为你自己的）。# /mailu/mailu.env DOMAIN=*你的主域名* # 例如 example.com HOSTNAMES=*你的邮件主机名* # 例如 mx.example.com（也可逗号分隔多个） POSTMASTER=*你的postmaster用户名* # 例如 postmaster 或 admin # 让 Mailu 自己申请 Let's Encrypt TLS_FLAVOR=letsencrypt # Web 路径（默认就挺好） WEB_ADMIN=/admin WEB_WEBMAIL=/webmail WEBROOT_REDIRECT=/webmail # 时区 TZ=Asia/Shanghai # 初始化管理员（首次启动时生效） INITIAL_ADMIN_DOMAIN=*你的主域名* INITIAL_ADMIN_ACCOUNT=*你的管理员用户名* INITIAL_ADMIN_PW=*请设置一个强密码*提示：HOSTNAMES 里最重要的是放你的邮件主机名（MX 指向它）。如果你把博客/其他站点也放在同一台机子上，不要随意把无关域名加进来，避免证书/路由变复杂。3.3 docker-compose.yml（简化示例）Mailu 的 compose 会包含前端（nginx）、admin、postfix、dovecot、rspamd、redis 等。最关键的是 front 服务的端口映射。services: front: image: ghcr.io/mailu/nginx:2024.06 restart: always env_file: mailu.env ports: - "0.0.0.0:80:80" - "0.0.0.0:443:443" - "0.0.0.0:25:25" - "0.0.0.0:465:465" - "0.0.0.0:587:587" - "0.0.0.0:143:143" - "0.0.0.0:993:993" - "0.0.0.0:4190:4190" volumes: - "/mailu/certs:/certs" - "/mailu/overrides/nginx:/overrides:ro" admin: image: ghcr.io/mailu/admin:2024.06 restart: always env_file: mailu.env volumes: - "/mailu/data:/data" - "/mailu/dkim:/dkim" imap: image: ghcr.io/mailu/dovecot:2024.06 restart: always env_file: mailu.env volumes: - "/mailu/mail:/mail" smtp: image: ghcr.io/mailu/postfix:2024.06 restart: always env_file: mailu.env volumes: - "/mailu/mailqueue:/queue" antispam: image: ghcr.io/mailu/rspamd:2024.06 restart: always env_file: mailu.env volumes: - "/mailu/filter:/var/lib/rspamd"4. 防火墙与系统参数如果你用的是 ufw：sudo apt -y install ufw sudo ufw default deny incoming sudo ufw default allow outgoing # SSH sudo ufw allow 22/tcp # Web + Mail sudo ufw allow 80/tcp sudo ufw allow 443/tcp sudo ufw allow 25/tcp sudo ufw allow 465/tcp sudo ufw allow 587/tcp sudo ufw allow 143/tcp sudo ufw allow 993/tcp sudo ufw allow 4190/tcp sudo ufw enable sudo ufw status注意：有些云厂商会在“安全组”层面也挡端口，记得双端都开。5. DNS 记录（决定你能不能稳定收发）5.1 A / AAAAmx IN A *你的服务器公网IP* ; 可选：如果有 IPv6 mx IN AAAA *你的服务器公网IPv6*5.2 MX@ IN MX 10 mx.*你的主域名*.5.3 SPF（TXT）@ IN TXT "v=spf1 mx ~all"5.4 DKIM（TXT）Mailu 启动后会生成 DKIM 密钥，你需要把公钥写进 DNS。一般记录长这样：dkim._domainkey IN TXT "v=DKIM1; k=rsa; p=*这里粘贴Mailu生成的公钥*"5.5 DMARC（TXT）_dmarc IN TXT "v=DMARC1; p=quarantine; rua=mailto:*你的汇总报告邮箱*; ruf=mailto:*你的取证报告邮箱*; fo=1"5.6 PTR（反向解析，强烈建议）到你的 VPS/云厂商控制台把 *你的服务器公网IP* 的 PTR 设置为 *你的邮件主机名*（例如 mx.example.com）。这是提升投递成功率最划算的一步。6. 启动 Mailucd /mailu # 启动 docker compose up -d # 看状态 docker compose ps # 查看日志（前端） docker logs -n 200 mailu-front-1第一次启动时会自动初始化管理员。稍等 1~2 分钟后访问： 管理后台：https://*你的邮件主机名*/admin Webmail：https://*你的邮件主机名*/webmail 7. 从后台创建邮箱与别名 登录管理后台。 创建一个用户：user@*你的主域名*，设置密码。 如需转发/别名，创建 alias（比如 hi@*你的主域名* 指向你的主邮箱）。 8. 客户端配置（IMAP/SMTP）以常见邮箱客户端为例： IMAP 服务器：*你的邮件主机名*，端口 993（SSL/TLS） SMTP 服务器：*你的邮件主机名*，端口 587（STARTTLS）或 465（SSL/TLS） 用户名：完整邮箱地址（如 user@*你的主域名*） 密码：你在后台设置的密码 9. 常见坑与排查思路9.1 25 端口被封 很多云厂商默认封 25（出站/入站）。如果入站 25 被封，别人无法投递到你；如果出站 25 被封，你发信会失败。 解决：申请解封、换 provider，或用中继（SMTP relay）。 9.2 80/443 端口冲突（同机部署网站/博客）Mailu 的 front 默认要占用 80/443（申请证书 + 提供 web）。如果你的服务器上已经有 Nginx/Apache：你有三种典型方案： 方案 A：把网站迁移到另外的反向代理里，让 Mailu front 继续直占 80/443（最省事）。 方案 B：Mailu front 只监听本地端口（如 127.0.0.1:8080/8443），由你自己的 Nginx 统一对外反代；同时证书也由你自己的 Nginx/ACME 来管理（Mailu 改用外置证书模式）。 方案 C：给邮件系统单独一张公网 IP，让 Mailu 独占 80/443（如果你有多 IP）。 9.3 SPF/DKIM/DMARC 没配好，进垃圾箱 SPF：至少要包含 mx 或 ip4。 DKIM：确保 DNS 里那条 TXT 没断行/没漏引号。 DMARC：先用 p=none 观察报告，再逐步收紧到 quarantine/reject。 9.4 反向解析（PTR）不匹配PTR 最好指向你的邮件主机名，并且该主机名正向解析回同一个 IP（即正反一致）。否则一些大厂会直接给你“高风险”标签。10. 升级与备份建议 升级：docker compose pull && docker compose up -d，升级前建议先备份卷目录。 备份：至少备份 /mailu/data、/mailu/mail、/mailu/dkim、/mailu/certs（如果你自己管理证书）。 监控：关注磁盘（邮件很吃盘），以及 mailu-front / postfix / dovecot 日志。 如果你准备把 Mailu 和你现有的网站（例如博客）放在同一台机器上，建议一开始就把“端口占用”和“证书归属”规划清楚，后面会省很多折腾。
Linux 常用命令大全：文件、进程、网络、磁盘、日志速查
Linux 常用命令很多，但日常高频其实就那一批：看目录、找文件、查进程、看端口、压缩传输、看日志、排查磁盘/内存。本文按场景整理一份常用命令清单，配最常见的例子，适合收藏备用。说明：示例以常见发行版（Debian/Ubuntu/CentOS/RHEL 系）通用命令为主；需要管理员权限时用 sudo。目录（按场景速查） 文件与目录：ls / cd / cp / mv / rm / mkdir 内容查看：less / head / tail -f 搜索：find / grep / rg 权限：chmod / chown / sudo 进程性能：ps / top / kill 网络端口：ip / ss / curl 磁盘：df / du / lsblk systemd 日志：systemctl / journalctl 压缩：tar / zip 远程：ssh / scp / rsync 1）目录与文件查看与切换pwd # 当前路径 ls # 列出文件 ls -lah # 人类可读 + 显示隐藏文件 + 详细信息 cd /path/to/dir # 进入目录 cd .. # 返回上级创建/复制/移动/删除mkdir -p a/b/c # 递归创建目录 cp a.txt b.txt # 复制 cp -r dir1 dir2 # 复制目录 mv old new # 移动/重命名 rm file # 删除文件 rm -r dir # 删除目录（谨慎）查看文件内容cat file # 直接输出（小文件） less file # 分页查看（推荐） head -n 50 file # 看前 50 行 tail -n 50 file # 看后 50 行 tail -f app.log # 实时追踪日志2）搜索：找文件、找内容找文件（按名字/类型/大小/时间）find /var/log -name "*.log" find . -type f -maxdepth 2 find . -type f -size +100M find . -type f -mtime -1 # 1 天内修改在文件中找内容（grep）grep "keyword" file grep -R "keyword" /etc # 递归搜索目录 grep -RIn "keyword" . # 显示行号、忽略大小写更快的替代（如果已安装）rg "keyword" . # ripgrep3）权限与用户ls -l chmod 644 file chmod 755 script.sh chmod -R 755 dir chown user:group file chown -R user:group dir sudo command4）进程与性能ps aux | head ps aux | grep nginx top # 经典交互 htop # 更友好（需安装） kill PID kill -9 PID # 强制（谨慎） pkill nginx # 按进程名杀 uptime # load average free -h # 内存 vmstat 1 # 每秒刷新（需安装 procps 等）5）网络与端口ip a # 网卡与 IP ip r # 路由表 cat /etc/resolv.conf # DNS ss -lntp # 监听的 TCP 端口 + 进程 ss -lnup # 监听的 UDP 端口 ping -c 4 8.8.8.8 curl -I https://example.com curl -sS https://example.com | head wget -O- https://example.com | head6）磁盘与文件系统df -h du -sh * | sort -h # 当前目录下各项占用（可能较慢） du -sh /var/log/* | sort -h lsblk mount | head7）压缩与解压# tar.gz（最常见） tar -czf backup.tar.gz dir/ tar -xzf backup.tar.gz # zip zip -r archive.zip dir/ unzip archive.zip8）日志与排错（systemd）systemctl status nginx systemctl restart nginx systemctl enable nginx journalctl -u nginx --no-pager -n 200 journalctl -u nginx -f journalctl --since "1 hour ago"9）包管理# Debian / Ubuntu（apt） apt update apt install -y git curl # CentOS / RHEL（dnf） dnf install -y git curl10）远程与传输ssh user@your_server_ip ssh -p 2222 user@your_server_ip scp file user@host:/path/ scp -r dir user@host:/path/ rsync -avz dir/ user@host:/path/dir/速查表（收藏用） 文件：ls -lah / cp / mv / rm / mkdir -p 内容：less / tail -f / grep -RIn 查找：find / rg 权限：chmod / chown / sudo 进程：ps aux / top / kill / pkill 网络：ip a / ss -lntp / curl -I 磁盘：df -h / du -sh 服务：systemctl status|restart / journalctl -u -f 压缩：tar -czf / tar -xzf 远程：ssh / scp / rsync