Stalwart邮件服务器接入MySQL作为数据存储后端

大家好!Stalwart邮件服务器支持各类存储方式,比如RocksDB, FoundationDB, MySQL, MariaDB, PostgreSQL等数据库作为数据存储后端。相比于默认的RocksDB,尽管使用MySQL/MariaDB的性能稍弱,但是他们能够提供更方便的数据管理、更好的集群支持,并且更容易与其他应用直接集成。

今天,我就来介绍如何在Stalwart邮件服务器中接入使用MySQL作为数据后端。这也是我自己的邮件服务器正在使用的架构。如果您更熟悉PostgreSQL, 您也可以根据本教程稍作修改,即可将PostgreSQL接入Stalwart服务器。

本文作者为香菇肥牛,原文链接为 https://qing.su/article/mysql-data-backend-stalwart-mail-server.html 转载请注明原文链接。谢谢!


1. MySQL的安装

本文将以Ubuntu 24.04操作系统为例,介绍MySQL的安装与接入Stalwart.

需要提前声明的是,Stalwart邮件服务器需要五项存储后端(默认均为RocksDB),包括Data (邮件信息、服务器配置信息), Blob (邮件正文与附件), FTS (邮件的全文索引), In-memory (内存临时存储), 以及Directory (用户信息).  虽然MySQL可以用作全部这些存储种类,但是它本身并不适合作为FTS store和in-memory store.  因此,本文仅将MySQL作为Data Store和Directory接入Stalwart邮件服务器。

MySQL本身并不在Ubuntu 24自带的源中。我们首先需要添加源。

1
2
3
wget https://dev.mysql.com/get/mysql-apt-config_0.8.33-1_all.deb
dpkg -i mysql*.deb
apt-get update -y

然后使用apt安装mysql.

apt-get install mysql-server -y

如果您想要使用MariaDB, 您可以直接使用apt安装,无需添加源。MySQL和MariaDB并没有什么显著的区别,您可以选择自己习惯的版本安装使用。

1
apt-get install mariadb-server -y

安装完毕后,给MySQL设置开机启动。

1
2
systemctl enable mysql
service mysql start

首次使用之前,我们一般会进行安全设置。

1
mysql_secure_installation

到这里,我们就安装好了MySQL, 可以开始使用了。

 


2. 初始化数据库并添加用户

Stalwart邮件服务器会自动给在数据库中建立需要的各个表 (a, b, c, 等等)。我们需要额外处理的是储存用户信息的部分 (Directory)。如果你是从Dovecot等程序迁移至Stalwart, 那么很可能你已经有了一个现成的SQL数据库存储了用户信息,这样就不需要新建一个数据库了,可以直接使用现成的。如果没有现成的数据库,那么我们可以用下面的方法简单地初始化一个数据库。

首先进入MySQL数据库。

1
mysql -u root

我们给Stalwart邮件服务器建立一个新的数据库。这里我就用stalwartdb作为数据库名,并且设置用户stalwartuser和密码stalwartpw作为这个数据库的管理用户。

1
2
3
4
CREATE DATABASE stalwartdb;
CREATE USER stalwartuser IDENTIFIED BY 'stalwartpw';
GRANT ALL ON stalwartdb.* TO stalwartuser;
FLUSH PRIVILEGES;

这个数据库需要作为用户信息服务后端接入邮件服务器,我们需要考虑下面这些字段:用户名,密码,邮箱,用户姓名,邮箱别名,以及邮箱容量。

1
2
3
4
5
USE stalwartdb;
CREATE TABLE accounts (name VARCHAR(32) PRIMARY KEY, secret VARCHAR(1024), description VARCHAR(1024), TYPE VARCHAR(32) NOT NULL, quota INTEGER DEFAULT 0, active BOOLEAN DEFAULT 1);
CREATE TABLE group_members (name VARCHAR(32) NOT NULL, member_of VARCHAR(32) NOT NULL, PRIMARY KEY (name, member_of));
CREATE TABLE emails (name VARCHAR(32) NOT NULL, address VARCHAR(128) NOT NULL, TYPE VARCHAR(32), PRIMARY KEY (name, address));
QUIT;

这样,我们就新建并初始化了一个数据库,用来存储Stalwart邮件服务器的用户信息。

接下来,我们向数据库里添加用户。同样地,如果你已经有了从其他程序迁移来的现成的数据库,那么可以跳过这步。首先,生成一个密码。这里我们用sha512算法。

1
openssl passwd -6

输入需要使用的密码,生成sha512加密后的密文($6$xxxxxxx)。

这里,我们新建用户需要向accounts和emails表中插入相应的条目。比如,这里我要建一个 postmaster@qing.su 邮箱,那么应该在MySQL中执行:

1
2
INSERT INTO accounts (name, secret, description, TYPE) VALUES ('postmaster@qing.su', '$6$xxxxxxxx', 'Postmaster', 'individual');
INSERT INTO emails (name, address, TYPE) VALUES ('postmaster@qing.su', 'postmaster@qing.su', 'primary');

相应的,如果要将这个 postmaster@qing.su 设置为catch-all邮箱,那么就需要为其添加 @qing.su 的别名,我们可以执行:

1
INSERT INTO emails (name, address, TYPE) VALUES ('postmaster@qing.su', '@qing.su', 'alias');

以此类推,添加好您的其他账户。


3. 在Stalwart中接入MySQL

完成了数据库的初始化,我们就可以去Stalwart邮件服务器后台接入MySQL了。

首先,配置MySQL的连接信息。登录Stalwart管理后台,找到 Settings – Storage – Stores,添加新的存储。

这里,我们要选择MySQL, 并且填上之前新建的数据库名、用户名、密码等连接信息。

在配置的下方,我们还需要填上数据的查询指令。如果您按照我之前的初始化条件新建了数据库,您可以填写下面的查询指令。如果您使用的是既有的数据库,那需要按照您自己的数据库schema来填写。

1
2
3
4
5
Account by Name: SELECT name, type, secret, description, quota FROM accounts WHERE name = ? AND active = true
Members by Name: SELECT member_of FROM group_members WHERE name = ?
Name by E-mail: SELECT name FROM emails WHERE address = ? ORDER BY name ASC
E-mails by Name: SELECT address FROM emails WHERE name = ? ORDER BY type DESC, address ASC
Passwords by Name: SELECT secret FROM accounts WHERE name = ?

保存退出。再找到 Settings – Storage – Settings, 将Data Store设置为刚刚新建的MySQL store.  如果需要,您也可以将Blob Store设置为MySQL.

保存并重新载入设置。

然后,我们再来配置用户信息 directory的部分。找到 Settings – Authentication – Directories, 添加一个新的Directory, 类型选择SQL Databases, 存储后端选择刚才建的mysql store.

请注意,我们需要在Column Mapping中填入MySQL数据库架构中对应的字段名。如果您按照我之前的初始化条件新建了数据库,那么您可以填入下面的字段映射。如果您使用的是既有的数据库,那需要按照您自己的数据库schema来填写。

1
2
3
4
5
Type: type
Description: description
Password: secret
E-mail: address
Quota: quota

保存退出。

最后,找到 Settings – Authentication – Settings, 将Directory从默认的internal换成刚设置好的SQL Database.

保存退出,并且重新载入设置,就完成了MySQL接入。


至此,我们安装、配置了MySQL,根据邮件服务器的需求建立了数据库结构,并且将其接入了Stalwart邮件服务器。

如果您有任何疑问,欢迎在这里留言,我将尽力解答。

本文作者为香菇肥牛,原文链接为 https://qing.su/article/mysql-data-backend-stalwart-mail-server.html 转载请注明原文链接。谢谢!

1 thought on “Stalwart邮件服务器接入MySQL作为数据存储后端”

Leave a Comment