基于docker的轻量级邮件服务器的搭建和使用教程

标签

linux

docker

mail

server

教程

发布时间:

本文字数:1,080 字 阅读完需:约 3 分钟

前言

很早就想配置一个自己的邮件服务器,苦于没有时间。偶然的机会,黑色星期五买了一台1G内存的特价服务器,开放了25端口,于是趁这个周末,决定搭建一个自己的域名邮箱。

技术选型: docker-mailserver

优势:

  1. 简单/方便。你要知道自己去手动配一台这样功能完全的邮件服务器,也许一个晚上的时间都不够,稍微一个地方出错还可能用不了。

  2. 安全,你要知道邮件服务器,自用问题不大,如果是公共服务,各种SPAM/病毒邮件,你就会发现原来邮件服务器是真的难伺候。

  3. 也就是我个人觉得最重要的原因。我自建一个邮件服务器,是出于自用的目的,我拿一台VPS出来就只装一个邮件服务,我真的觉得太浪费。所以像这样用Docker,在部署完了后,我还可以装点别的程序跑一跑。而我之前介绍的Mailcow/Mailu/Poste.io这些,虽然它们都是用Docker部署的,但是都把80/443占用了,我们最多也就只能再跑一些小脚本,如果我们还想建站呢?那这些方案就不适合我们。

搭建步骤

配置DNS

首先需要在主机商配置反向dns解析

之后前往域名提供商进行dns解析设置

|类型|记录名|记录值| |--|--|--| |A|mail|xxx.xxx.xxx.xxx(自己服务器的ip)| |MX|@|mail.example.com(mail.<域名>); 优先级选10| |TXT|@|v=spf1 mx ~all|

使用certbot申请https证书

安装好管理工具之后, 我们需要申请证书下来, 这里我的web服务器是NGINX, 并且我没有网站的静态目录, 所以我使用这个命令申请:

sudo certbot certonly --standalone -d example.com -d www.example.com -d m.example.com

如果你的网站有静态目录的话, 可以把--standalone改成--webroot并且加上-w参数申请, 类似这样:

sudo certbot certonly --webroot -w /var/www/html -d example.com -d www.example.com

在你使用--standalone申请证书的时候需要关闭nginx, 因为certbot会启用443端口校验你的域名信息, 如果nginx没有关闭, 会导致端口占用, 所以我们关闭nginx, 我这里是使用ubuntu, 所以使用这个命令关闭nginx:

sudo services nginx stop

更新证书时使用certbot renew命令即可

使用crontab添加定时任务

可使用crontab配置证书自动续签

crontab -e
# 添加如下
0 3 1 * * /usr/bin/certbot renew --quiet
  • 0 3 1 * * 指每个月1号3点0分执行任务

解析验证

使用dig验证解析是否生效

apt-get install dnsutils
dig TXT _acme-challenge.mail.example.com

安装docker

基于debian11系统进行,参考官方文档 https://docs.docker.com/engine/install/debian/

# 移除之前的版本
sudo apt-get remove docker docker-engine docker.io containerd runc 
# 安装依赖
sudo apt-get update
sudo apt-get install \
    ca-certificates \
    curl \
    gnupg \
    lsb-release
# 配置apt源
sudo mkdir -p /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/debian/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/debian \
  $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
# 安装
sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-compose-plugin

修改docker存储目录(可选)

查看原始存储目录

docker info

可以发现Docker Root项默认目录为/var/lib/docker

cd /etc/docker/
vim daemon.json

添加以下内容

{
        "data-root": "/data/docker"
}

保存退出,然后重启 docker 服务:

systemctl restart docker
docker info # 查看是否修改成功

拉取配置文件

git clone https://github.com/docker-mailserver/docker-mailserver.git
# 所需文件
- docker-compose.yml 容器部署文件
- setup.sh 服务配置脚本

如果后续读取配置报错,需要在docker-compose.yml头部添加 version: '3' ,以配置版本

开放端口

需要开放[25,193,993,465,587]这几个端口,以下以ufw举例,具体开放防火墙请自行Google

ufw allow 25
ufw allow 143
ufw allow 993
ufw allow 465
ufw allow 587

生成DKIM签名记录

./setup.sh config dkim keysize 2048
cd ~/docker-mailserver/docker-data/dms/
cat config/opendkim/keys/example.com/mail.txt
# 截取格式如下
v=DKIM1;h=sha256;k=rsa;p=xxx

添加到dns解析当中

|类型|记录名|记录值| |--|--|--| |TXT|mail._domainkey|v=DKIM1;h=sha256;k=rsa;p=xxx

配置tls

编辑docker-mailserver配置文件

cd docker-mailserver
vim .env

编辑 -volumes配置项下添加 - /etc/letsencrypt/:/etc/letsencrypt:ro

编辑mailserver.env文件

SSL_TYPE=letsencrypt
SSL_CERT_PATH=/etc/letsencrypt/live/mail.timeshike.com/fullchain.pem
SSL_KEY_PATH=/etc/letsencrypt/live/mail.timeshike.com/privkey.pem

最后重启docker-mailserver即可:

docker-compose stop
systemctl restart docker.service
docker-compose up -d
docker-compose logs -f # 查看容器日志

安装完成!

邮箱服务器管理

利用setup.sh脚本可以轻松实现管理账户

可参考官方文档 https://docker-mailserver.github.io/docker-mailserver/edge/config/setup.sh/

./setup.sh email add admin@example.com "xxx" # 添加账号密码
# 其他功能参见help
./setup.sh help

参考文章

本文参考了以下博文,感谢作者的付出

  1. https://blog.cetacean.top/mailserver/
  2. https://lala.im/4224.html
  3. https://docker-mailserver.github.io/docker-mailserver/edge/
  4. https://zhuanlan.zhihu.com/p/95533274