XiaBee's Studio.

Docker 搭建 Postal 邮件系统

字数统计: 1.4k阅读时长: 5 min
2022/05/08

前情提要

上次搭建了一个Hydro-OJ,注册需要邮箱验证,想着要不一步到位顺带把邮件系统也处理了(x)

系统选择

有很多酷炫且开源的邮件系统,github上能搜到很多,比如mailcowpostal等。本片主要介绍postal的搭建方式。

Postal 简介

Postal is a complete and fully featured mail server for use by websites & web servers. Think Sendgrid, Mailgun or Postmark but open source and ready for you to run on your own servers. Postal was developed by Krystal to serve its own mail processing requirements and we have since decided that it should be released as an open source project for the community.

摘自官网,懒癌晚期,就不翻译了(x)

本篇主要讲解如何使用docker进行安装,即如何利用官方推荐的安装方式安装postal邮件系统。

本篇均以Ubuntu/Debian系统为例,其他包管理器的系统可以做类似参考——因为主要工作是容器做的,所以和系统版本不是直接相关。

准备工作

服务器配置

官方强烈建议服务器至少拥有以下配置:

  • 至少 4GB RAM内存
  • 至少 2 CPU 核心
  • 至少 100GB 的硬盘空间

但是实测之后发现,如果服务体量不大的话,2~3G内存也是基本够用的,硬盘空间也不需要100G,大硬盘只是用于存储邮件和备份。

另外,邮件系统需要一个可控域名,即需要一个域名,同时需要能够设置子域名。

系统环境

1
2
3
4
5
6
7
8
sudo apt install git curl jq
# 安装所需软件

git clone https://postalserver.io/start/install /opt/postal/install
# 克隆安装代码

sudo ln -s /opt/postal/install/bin/postal /usr/bin/postal
# 创建软连接,用于快速启动postal

如果上述命令不能正常执行,可以尝试添加sudo,或者将代码克隆到常规目录下,再利用sudo cp等方式复制到对应目录下。

Docker

服务器中已经安装了docker,并且能够以非root身份运行。

1
2
3
4
5
6
7
8
9
sudo apt install docker
# 安装docker

sudo gpasswd -a ${USER} docker
newgrp - docker
# 切换到docker组

sudo service docker restart
# 重启服务,确保非root用户可以运行docker

MariaDB

1
2
3
4
5
6
7
docker run -d \
--name postal-mariadb \
-p 127.0.0.1:3306:3306 \
--restart always \
-e MARIADB_DATABASE=postal \
-e MARIADB_ROOT_PASSWORD=postal \
mariadb

这里直接利用docker运行所需数据库,其中数据库设置为postalroot密码设置为postal;如需修改,直接将MARIADB_DATABASE=xxxMARIADB_ROOT_PASSWORD=xxx修改掉就行,之后的配置中如果遇到连接服务器的服务,改为对应密码即可。

RabbitMQ

1
2
3
4
5
6
7
8
docker run -d \
--name postal-rabbitmq \
-p 127.0.0.1:5672:5672 \
--restart always \
-e RABBITMQ_DEFAULT_USER=postal \
-e RABBITMQ_DEFAULT_PASS=postal \
-e RABBITMQ_DEFAULT_VHOST=postal \
rabbitmq:3.8

同样,利用docker运行消息队列。需要改密码的话将RABBITMQ_DEFAULT_PASS=xxx等改掉即可。

docker-compose 2

postal需要利用2.0以上的docker-compose进行安装。

查看docker-compose版本:

1
2
docker-compose version
# Docker Compose version v2.4.1

如何安装高版本的docker-compose可以参考这篇博客:安装 docker-compose 2 · xiabee-瞎哔哔

安装过程

这里假设我们使用的域名为yourdomain.com

初始化 postal

1
postal bootstrap postal.yourdomain.com

在初始化之后,需要将postal.yourdomain.com解析到服务器的ip上,如果在本地搭建则解析到localhost或者127.0.0.1上。

同时,上述命令会在 /opt/postal/config中生成三个文件:

  • postal.yml :主要配置文件
  • signing.key 各项签名的私钥
  • Caddyfile Caddy服务器的配置文件(Caddy类似于Nginx,用作代理服务器)

初始化数据库

1
2
postal initialize
postal make-user

创建第一个用户,执行命令过程中会提示你设置用户名和密码。

运行 postal

1
postal start

此时会开始运行容器,如果没有相关镜像会直接拉取,耐心等待即可。

注意:需要利用2.0以上的docker-compose进行安装,确保宿主机中的docker-compose版本高于2.0

Caddy (可选)

1
2
3
4
5
6
7
docker run -d \
--name postal-caddy \
--restart always \
--network host \
-v /opt/postal/config/Caddyfile:/etc/caddy/Caddyfile \
-v /opt/postal/caddy-data:/data \
caddy

Caddy为代理服务器,可选项很多,比如NginxAppache等,甚至可以不装(如果不需要https的话)

最终应该看到这个样子:

1
postal status

image.png

注意事项

上述方法安装的postal服务端运行在5000端口,如果浏览器访问不了的话检查防火墙是否放行该端口的流量。

如果还是不能访问,检查/opt/postal/config目录下的postal.yml,找到web_server模块:

1
2
3
4
web_server:
# Specify configuration for the Postal web server
bind_address: 127.0.0.1
port: 5000

原文件默认将地址绑定到127.0.0.1,只能在域内访问,从域外访问就会被拦截。如果VPS没有特定设置的话,直接把绑定地址设置为0.0.0.0,允许任何流量即可:

1
2
3
4
web_server:
# Specify configuration for the Postal web server
bind_address: 0.0.0.0
port: 5000

同时,如果没有设置SSL证书的话,可以把服务协议改为http

1
2
3
4
5
web:
# The host that the management interface will be available on
host: postal.yourdomain.com
# The protocol that requests to the management interface should happen on
protocol: http

最终效果

浏览器访问http://postal.yourdomain.com:5000,即可看到以下界面:

image.png

到目前为止,postal已经搭建完毕,具体的设置我们下期再写。

Refference

https://docs.postalserver.io/

CATALOG
  1. 1. 前情提要
  2. 2. 系统选择
  3. 3. Postal 简介
  4. 4. 准备工作
    1. 4.1. 服务器配置
    2. 4.2. 系统环境
    3. 4.3. Docker
    4. 4.4. MariaDB
    5. 4.5. RabbitMQ
    6. 4.6. docker-compose 2
  5. 5. 安装过程
    1. 5.1. 初始化 postal
    2. 5.2. 初始化数据库
    3. 5.3. 运行 postal
    4. 5.4. Caddy (可选)
  6. 6. 注意事项
  7. 7. 最终效果
  8. 8. Refference