在Linux中部署SOGo网页邮件系统

大家好!SOGo是历史悠久、免费开源的网页邮件与协作系统。和Roundcube, SnappyMail等程序类似,SOGo能够提供网页邮件的收发,联系人和日历管理,SieveScript管理等等多种邮件与协作相关功能,并且拥有现代化的、简介明晰的用户使用界面。很多收费的邮件服务提供商,比如Netcup, 就是使用的SOGo作为自己的网页邮件系统。

和Roundcube/Snappymail等程序不同,SOGo的安装和配置较为复杂。因此,我单独写了一期教程,介绍如何部署SOGo网页邮件系统

本文作者为香菇肥牛,原文连接为 https://qing.su/article/sogo-webmail-installation-configuration.html, 转载请注明原文链接。谢谢!


1. SOGo的安装

这里,我将使用Ubuntu 24.04操作系统安装SOGo,并且使用MySQL作为SOGo的存储数据库。如果您使用其他版本的操作系统,或者选择使用PostgreSQL,您可以参考官方的安装手册.

完整的SOGo 安装 + MySQL + Nginx需要约600 MB左右的系统内存。建议您使用至少有1 GB内存的VPS.  SOGo也可以直接安装在邮件服务器上,同样地,需要预留至少600 MB的空余内存。

在安装SOGo之前,我们首先安装MySQL或者MariaDB,这两者没有显著区别.  如果您习惯使用MariaDB, 可以直接通过apt安装。如果您在邮件服务器上安装SOGo,并且邮件服务器已经装好了MySQL/MariaDB, 那么就可以跳过这一步。

1
apt-get install mariadb-server -y

如果您更习惯MySQL,需要首先添加源,再通过apt安装。

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

安装MySQL之后,配置默认的安全选项。

1
mysql_secure_installation

接下来就可以安装SOGo了。

1
2
3
4
5
6
wget -O- "https://keys.openpgp.org/vks/v1/by-fingerprint/74FFC6D72B925A34B5D356BDF8A27B36A6E2EAE9" | gpg --dearmor | apt-key add -
apt-get update
apt-get install apt-transport-https -y
echo "deb https://packages.sogo.nu/nightly/5/ubuntu/ noble noble" >> /etc/apt/sources.list.d/SOGo.list
apt-get update
apt-get install sogo sope4.9-gdl1-mysql -y

安装好SOGo之后,需要在MySQL中建立对应的账户和数据库。这里,我将建立一个 sogodb 数据库,以及对应的 sogouser 用户和 sogopassword 密码,供SOGo使用。

1
2
3
4
CREATE DATABASE `sogodb` CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
CREATE USER 'sogouser'@'localhost' IDENTIFIED BY 'sogopassword';
GRANT ALL PRIVILEGES ON `sogodb`.* TO 'sogouser'@'localhost' WITH GRANT OPTION;
FLUSH PRIVILEGES;

然后回到SSH, 在SOGo中设置数据库连接信息。需要注意的是,SOGo使用Unix Socket连接数据库;如果您的数据库用户名和密码中有特殊字符,需要首先转化为对应的URL编码(比如%20这种)。

1
2
3
defaults -u sogo write sogod OCSFolderInfoURL "mysql://sogouser:sogopassword@localhost:3306/sogodb/sogo_folder_info"
defaults -u sogo write sogod SOGoProfileURL "mysql://sogouser:sogopassword@localhost:3306/sogodb/sogo_user_profile"
defaults -u sogo write sogod OCSSessionsFolderURL "mysql://sogouser:sogopassword@localhost:3306/sogodb/sogo_sessions_folder"

最后,重启SOGo

1
service sogo restart

这样,我们完成了最基础的SOGo安装和MySQL数据库的初始化。但是,SOGo的配置到这里还远没有结束。我们继续配置其余部分。


2. 安装和配置Nginx反代

第一部分安装完毕的SOGo默认运行于服务器的20000端口。我们需要安装服务器程序来反代。这里,我是用最简单的Nginx来反代;您也可以按照您自己的情况选择Apache, Litespeed, HAProxy, Traefik等程序来配置反代。

首先,安装Nginx和Certbot.

1
apt-get install nginx python3-certbot-nginx -y

新建一个配置文件

1
vi /etc/nginx/conf.d/sogo.conf

填入下面的配置信息。请注意,将 mail.qing.su 替换为您自己的网页邮箱的域名。

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
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
server {
    listen 80 default;
    server_name mail.qing.su;

    root /usr/lib/GNUstep/SOGo/WebServerResources/;
    location = / {
        rewrite ^ https://$server_name/SOGo;
        allow all;
    }

    location = /principals/ {
        rewrite ^ https://$server_name/SOGo/dav;
        allow all;
    }

    location ^~/SOGo {
        proxy_pass http://127.0.0.1:20000;
        proxy_redirect http://127.0.0.1:20000 default;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $host;
        proxy_set_header x-webobjects-server-protocol HTTP/1.0;
        proxy_set_header x-webobjects-remote-host 127.0.0.1;
        proxy_set_header x-webobjects-server-name $server_name;
        proxy_set_header x-webobjects-server-url $scheme://$host;
        proxy_connect_timeout 90;
        proxy_send_timeout 90;
        proxy_read_timeout 90;
        proxy_buffer_size 4k;
        proxy_buffers 4 32k;
        proxy_busy_buffers_size 64k;
        proxy_temp_file_write_size 64k;
        client_max_body_size 50m;
        client_body_buffer_size 128k;
        break;
    }

    location /SOGo.woa/WebServerResources/ {
        alias /usr/lib/GNUstep/SOGo/WebServerResources/;
        allow all;
    }

    location /SOGo/WebServerResources/ {
        alias /usr/lib/GNUstep/SOGo/WebServerResources/;
        allow all;
    }

    location ^/SOGo/so/ControlPanel/Products/([^/]*)/Resources/(.*)$ {
        alias /usr/lib/GNUstep/SOGo/$1.SOGo/Resources/$2;
    }

    location ^/SOGo/so/ControlPanel/Products/[^/]*UI/Resources/.*\.(jpg|png|gif|css|js)$ {
        alias /usr/lib/GNUstep/SOGo/$1.SOGo/Resources/$2;
    }
}

保存退出后,测试配置文件并重新载入Nginx使其生效。

1
2
nginx -t
service nginx reload

最后,使用Certbot配置SSL安全证书。以域名 mail.qing.su 为例,执行:

1
certbot --nginx --redirect -d mail.qing.su

这样,我们就配置好了Nginx反代,并且安装了免费的 Let’s Encrypt SSL 安全证书。

此时,打开网站 https://mail.qing.su, 就能看到SOGo的登录界面了。

当然,到这里,我们仅仅是能打开登录界面而已,还没有办法登录邮箱。我们将继续配置SOGo连接邮件服务器。


3. SOGo的用户验证配置

和Snappymail等程序不同,SOGo不支持将用户验证直接代理给IMAP服务器。因此,我们需要配置目录服务,以支持SOGo用户验证。SOGo支持通过SQL数据库,LDAP, OpenID, SAML2等方式实现用户验证。

这里,我们将以SQL数据库为例,结合自己的Stalwart邮件服务器,配置用户验证。由官方配置文件说明可知,SOGo在调用SQL数据库查询验证的时候会查询下面5个字段:c_uid, c_name, c_password, c_cn, mail.  其中,c_uid和c_name可以相同,作为独立的登录用户名;c_password是密码;c_cn是用户的姓名(或者描述名);mail是用户的邮箱。

接入Stalwart的MySQL用户数据库结构已在前文中详述。具体地看,用户名、邮件、密码等字段存储与 stalwartmail 数据库的两个表 accountsemails 中。因此,最方便的方法是从 stalwartmail 数据库中新建一个View (SQL视图), 用来给SOGo进行登录验证。在MySQL中执行:

1
2
3
4
5
6
7
8
9
10
11
12
USE stalwartmail;
CREATE VIEW sogo_view AS
    SELECT
        a.name AS c_uid,
        a.name AS c_name,
        a.secret AS c_password,
        a.description AS c_cn,
        e.address AS mail
    FROM
        accounts a
    LEFT JOIN
        emails e ON a.name = e.name AND e.type = 'primary';

这样,就新建了一个名为 sogo_view 的SQL视图,用于SOGo的用户验证。

接着,赋予 sogouser 用户访问这个SQL视图的权限。

1
2
GRANT SELECT ON `stalwartmail`.`sogo_view` TO 'sogouser'@'localhost';
FLUSH PRIVILEGES;

这样,sogouser 就可以读取 stalwartmail.sogo_view 这个视图的数据了,进行用户登录验证了。

以域名 qing.su 为例,完整的用户登录验证配置如下。

1
2
3
4
5
6
7
8
9
10
SOGoUserSources = (
    {
        type = sql;
        id = directory_example.com;
        viewURL = "mysql://sogousr:sogopassword@127.0.0.1:3306/stalwartmail/sogo_view";
        canAuthenticate = YES;
        isAddressBook = YES;
        userPasswordAlgorithm = sha512-crypt;
    }
);

每一个域名对应一个directory id.  如果您有多个域名,您需要在这里添加多个directory id.


4. 完整SOGo配置

作为功能完备的Webmail, 除了用户验证外,我们还需要配置SMTP, IMAP, Sieve服务器等信息。以我试用的Stalwart邮件服务器为例,假设服务器地址为 mx.qing.su , SMTP服务器配置:

1
2
3
SOGoMailingMechanism = smtp;
SOGoSMTPServer = "smtps://mx.qing.su:465";
SOGoSMTPAuthenticationType = PLAIN;

IMAP服务器配置:

1
SOGoIMAPServer = "smtps://mx.qing.su:993";

Sieve服务器配置:

1
2
SOGoSieveScriptsEnabled = YES;
SOGoSieveServer = "sieve://mx.qing.su:4190/?tls=YES";

其他的各类配置您可以自行参考官方文档 (https://www.sogo.nu/files/docs/SOGoInstallationGuide.pdf)。

以下是我的完整的SOGo配置文件 /etc/sogo/sogo.conf.

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
39
40
41
42
43
44
45
46
47
{
    SOGoProfileURL = "mysql://sogouser:sogopasswd@localhost:3306/sogodb/sogo_user_profile";
    OCSFolderInfoURL = "mysql://sogouser:sogopasswd@localhost:3306/sogodb/sogo_folder_info";
    OCSSessionsFolderURL = "mysql://sogouser:sogopasswd@localhost:3306/sogodb/sogo_sessions_folder";
    OCSAdminURL = "mysql://sogouser:sogopasswd@localhost:3306/sogodb/sogo_admin";
    SOGoSuperUsernames = ("postmaster@qing.su");
    OCSEMailAlarmsFolderURL = "mysql://sogouser:sogopasswd@localhost:3306/sogodb/sogo_alarms_folder";
    OCSStoreURL = "mysql://sogouser:sogopasswd@localhost:3306/sogodb/sogo_store";
    OCSAclURL = "mysql://sogouser:sogopasswd@localhost:3306/sogodb/sogo_acl";
    OCSCacheFolderURL = "mysql://sogouser:sogopasswd@localhost:3306/sogodb/sogo_cache_folder";

    SOGoAppointmentSendEMailNotifications = YES;
    SOGoCalendarDefaultRoles = (
        PublicViewer,
        ConfidentialDAndTViewer
    );
    SOGoLanguage = English;
    SOGoTimeZone = America/Los_Angeles;
    SOGoMailDomain = qing.su;
    SOGoIMAPServer = "smtps://mx.qing.su:993";
    SOGoDraftsFolderName = Drafts;
    SOGoSentFolderName = Sent;
    SOGoTrashFolderName = Trash;
    SOGoJunkFolderName = Junk;
    SOGoMailingMechanism = smtp;
    SOGoSMTPServer = "smtps://mx.qing.su:465";
    SOGoSMTPAuthenticationType = PLAIN;
    SOGoUserSources = (
        {
            type = sql;
            id = sql_directory_qing.su;
            viewURL = "mysql://sogouser:sogopasswd@localhost:3306/stalwartmail/sogo_view";
            canAuthenticate = YES;
            isAddressBook = YES;
            displayName = "Contacts";
            userPasswordAlgorithm = sha512-crypt;
        }
    );

    SOGoSieveScriptsEnabled = YES;
    SOGoSieveServer = "sieve://mx.qing.su:4190/?tls=YES";

    WOWorkersCount = 15;
    SOGoMaximumPingInterval = 3540;
    SOGoMaximumSyncInterval = 3540;
    SOGoInternalSyncInterval = 30;
}

配置完毕后,重启sogo服务器。

1
service sogo restart

这样,我们就可以登录并使用SOGo网页邮件啦!


至此,我们完整地安装好了SOGo网页邮件系统,使用Nginx配置了反代,并且配置了SOGo SQL用户验证和各类服务器信息,可以使用网页邮箱来收发邮件了。

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

本文作者为香菇肥牛,原文连接为 https://qing.su/article/sogo-webmail-installation-configuration.html, 转载请注明原文链接。谢谢!

1 thought on “在Linux中部署SOGo网页邮件系统”

Leave a Comment