Dcoker 部署 mailserver

前言

查找文章时没找到, 在本地发现了, 重新编辑一下, 供后来者参考。

使用Dcoker 部署邮件服务

DNS records 设置与 PTR records

注意把bar.foo换成需要的域名

Type Homename Value TTL
A bar.foo 000.000.000.000 3600
A *.bar.foo 000.000.000.000 3600
AAAA bar.foo 000.000.000.000 3600
AAAA *.bar.foo 000.000.000.000 3600
NS bar.foo ns1.bar.foo 1800
NS bar.foo ns2.bar.foo 1800
NS bar.foo ns3.bar.foo 1800
MX bar.foo mail.bar.foo. 【10】 14400
TXT bar.foo v=spf1 mx ~all 3600
TXT _dmarc.bar.foo v=DMARC1; p=none 3600
TXT mail._domainkey.bar.foo v=DKIM1; k=rsa; p=**** 3600

说明:

  • NS 为域名解析服务器
  • A 为IPv4 域名绑定
  • AAAA 为IPv6 域名绑定
  • MX 为 收信服务器
  • TXT 为 E-Mail验证与设置
  • 将主机名改为mail.bar.foo后,可以设置PTR records

IPv6使用letsencrypt自动延期证书是会出错要注意下。

p==***********DKIM key这里隐去了

docker-mailserver

  • 注意使用ENABLE_CLAMAV=1时需要RAM≥1G

当网站与邮件服务在同一服务器时,要使用nginx-proxy

新建用户

mailserver目录下,可以使用docker命令添加多个用户

1
2
3
4
5
6
touch config/postfix-accounts.cf
docker run --rm \
-e [email protected] \
-e MAIL_PASS=password \
-ti tvial/docker-mailserver:latest \
/bin/sh -c 'echo "$MAIL_USER|$(doveadm pw -s SHA512-CRYPT -u $MAIL_USER -p $MAIL_PASS)"' >> config/postfix-accounts.cf

创建 DKIM key

1
2
3
docker run --rm \
-v "/root/mailserver/config":/tmp/docker-mailserver \
-ti tvial/docker-mailserver:latest generate-dkim-config bar.foo

查看

1
cat /root/mailserver/config/opendkim/keys/bar.foo/mail.txt

将DKIM1 调整后添加到域名解析mail._domainkey记录下。

1
v=DKIM1; k=rsa; p=***********

p==***********DKIM key这里隐去了

docker-mailserver 启动

启动 docker-proxy 【反向代理】

1
2
3
4
5
6
7
8
docker run -d -p 80:80 -p 443:443 \
--name nginx-proxy \
-v /path/to/certs:/etc/nginx/certs:ro \
-v /etc/nginx/vhost.d \
-v /usr/share/nginx/html \
-v /var/run/docker.sock:/tmp/docker.sock:ro \
--label com.github.jrcs.letsencrypt_nginx_proxy_companion.nginx_proxy \
jwilder/nginx-proxy

启动 letsencrypt-nginx-proxy-companion 【挂载TLS证书】

1
2
3
4
5
docker run -d \
-v /path/to/certs:/etc/nginx/certs:rw \
-v /var/run/docker.sock:/var/run/docker.sock:ro \
--volumes-from nginx-proxy \
jrcs/letsencrypt-nginx-proxy-companion

启动 library/nginx 【用于获取TLS证书, 验证时,需要port:80
也可以使用下方docker-compose.yml

  • 注意:要将nginx桥接到nginx-proxy的网络,使其可以正常解析,LETSENCRYPT_TEST=true在测试时使用,防止证书频繁申请。
    Email 必须为有效地址。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
version: '2'

services:
webmail:
image: nginx:latest
restart: always
environment:
- VIRTUAL_HOST=mail.bar.foo
- LETSENCRYPT_HOST=mail.bar.foo
- [email protected]
# - LETSENCRYPT_TEST=true
network_mode: "bridge"
mailserver:
image: tvial/docker-mailserver:latest
hostname: mail
domainname: bar.foo
container_name: mail
restart: always
ports:
- "25:25"
- "143:143"
- "587:587"
- "993:993"
volumes:
- /root/mailserver/mail:/var/mail
- /root/mailserver/mail-state:/var/mail-state
- /root/mailserver/config/:/tmp/docker-mailserver/
# - /etc/letsencrypt:/etc/letsencrypt
- /path/to/certs/mail.bar.foo:/etc/letsencrypt/live/mail.bar.foo
environment:
- SSL_TYPE=letsencrypt
- ENABLE_SPAMASSASSIN=0
- ENABLE_CLAMAV=0
- ENABLE_FAIL2BAN=0
- ENABLE_POSTGREY=0
- ONE_DIR=1
- DMS_DEBUG=0
- TLS_LEVEL=intermediate

补充

也可以将nginx-proxyletsencrypt-nginx-proxy-companion写在一起,这样还可以运行其他服务

具体可以查看这篇

letsencrypt-nginx-proxy-companion可以手动更新

1
2
3
4
5
6
手动更新 或 申请证书
docker exec letsencrypt-nginx-proxy-companion /app/force_renew


证书状态
docker exec letsencrypt-nginx-proxy-companion /app/cert_status

测试SSL

1
2
docker exec mailserver openssl s_client -connect 0.0.0.0:587 -starttls smtp -CApath /etc/letsencrypt/
docker exec mailserver openssl s_client -connect 0.0.0.0:993 -starttls imap -CApath /etc/letsencrypt/

其他

使用nginx-proxy

一般挂载

1
2
3
4
5
docker run -d \
--name webblog \
--expose 80 \
-e "VIRTUAL_HOST=bar.foo" \
library/nginx

获取证书

1
2
3
4
5
6
7
docker run -d \
--name web \
--expose 80 \
-e "VIRTUAL_HOST=mail.bar.foo" \
-e "LETSENCRYPT_HOST=mail.bar.foo" \
-e "[email protected]" \
library/nginx

查看 域名映射

1
curl -H "Host:bar.foo" localhost

查看 nginx 代理设置

1
docker exec nginx-proxy  cat /etc/nginx/conf.d/default.conf

包管理

1
docker run --rm --expose 9000 -e VIRTUAL_HOST=test.bar.foo -v /var/run/docker.sock:/var/run/docker.sock portainer/portainer