大家好!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作为数据存储后端”