昨天受Peter先生的邀请,在他的 Matrix 服务器上注册了一个帐户,试用了一下感觉还不错。

正好 Mastodon 服务器上 CPU、内存好像都还有富裕,何不自己建一个 Matrix 服务器?

准备工作

所需物品:

  • 域名一个

  • 内存空间至少4G的服务器一台

本文所有命令均在 Debian 10 系统下执行。


在这里着重说一下域名选择,因为 Matrix 的分布式架构,server name 作为服务器的唯一标识一但确定,后续便无法更改,所以设置 server name 时一定要特别注意。

具体而言:不要用 .cf.tk 这类免费域名,也不要用域名注册局位于中国大陆的顶级域等等。

此外,Matrix 具有 Delegation 功能可与其他服务共用一个域名,因此 设置 server name 无需考虑该域名是否已经被现在服务占用,可以完全依靠自己的喜好来设置。

你喜欢是单独用一个子域 synapse.example.com,还是直接使用 example.com

安装 Synapse

安装Synapse挺简单的,没有什么难度。我这里直接装包。

sudo apt install -y lsb-release wget apt-transport-https
sudo wget -O /usr/share/keyrings/matrix-org-archive-keyring.gpg https://packages.matrix.org/debian/matrix-org-archive-keyring.gpg
echo "deb [signed-by=/usr/share/keyrings/matrix-org-archive-keyring.gpg] https://packages.matrix.org/debian/ $(lsb_release -cs) main" |
    sudo tee /etc/apt/sources.list.d/matrix-org.list
sudo apt update
sudo apt install matrix-synapse-py3

配置 Synapse

安装完毕,就到了配置环节了。 配置是大坑!

一切开始前先把服务停了。

sudo systemctl stop matrix-synapse.service

大坑数据库

Synapse 默认使用 sqlite 数据库,性能非常坑爹,所以一定要将数据库更换为 PostgreSQL

PostgreSQL 安装不再赘述。

创建用户

sudo -u postgres createuser --pwprompt synapse_user

创建数据库

sudo -u postgres psql
CREATE DATABASE synapse
ENCODING 'UTF8'
LC_COLLATE='C'
LC_CTYPE='C'
template=template0
OWNER synapse_user;

修改 pg_hba.conf

如果 synapse_user 设置了密码,向 pg_hba.conf 文件添加以下行:

host    synapse     synapse_user    ::1/128     md5

如果 synapse_user 没有设置了密码:

host    synapse     synapse_user    ::1/128     trust

性能调优

可以参考 PGTune ,以及官方维基 Tuning Your PostgreSQL Server

总而言之,数据库调参是玄学。

修改 homeserver.yaml

打开 /etc/matrix-synapse/homeserver.yaml ,找到 database 一节,注释掉 sqlite3 相关配置,找到 psycopg2 去除相应注释,填写配置。

下面是一个示例:

database:
    name: psycopg2
    args:
        user: synapse_user
        password: 6HE8WNLAzqRQyLkhZaTF
        database: synapse
        host: 169.254.37.1
        cp_min: 5
        cp_max: 10
        keepalives_idle: 30
        keepalives_interval: 10
        keepalives_count: 3

诸多小坑

除了上面的数据库,homeserver.yaml 配置文件里还有不少小坑。

  • trusted_key_servers 不能为空,默认为 matrix.org,可以填上一些自己认识的实例,例如: neo.angry.imbgme.me
    • suppress_key_server_warning 如果 trusted_key_servers 中有 matrix.org,请将此项设为 true,否则启动时会有警告。

  • macaroon_secret_key 填上,不填启动服务时会报错。

  • registration_shared_secret 填上,如果不填后面创建帐户的脚本无法运行。

  • url_preview_enabled 如果需要开启链接预览功能,将此项设为 true
    • url_preview_ip_range_blacklist 如开启链接预览,请去除该块注释,否则会报错无法启动。

如果只是自用,不打算开放注册,SMTP相关配置可以不填。


启动数据库,确定相应端口能正常连接后。

sudo systemctl start matrix-synapse.service
sudo systemctl enable matrix-synapse.service

启动 Synapse 服务。

配置反代及Delegation

Delegation

如前所说,由于 Matrix 的 Delegation 功能 。 Matrix 的 server_name 可以与其它服务共用。

就本次情况而言。Matrix 的 server_namebgme.me,实际后端地址(客户端API、与其它实例互动)为 neo.bgme.me:443

因此需要在 https://bgme.me/.well-known/matrix/server 托管以下内容:

{
"m.server": "neo.bgme.me:443"
}

又因为 bgme.me 已经被 Mastodon 服务占据,因此还需在 https://bgme.me/.well-known/matrix/client 托管:

{
    "m.homeserver": {
        "base_url": "https://neo.bgme.me"
    }
}

同时在 homeserver.yamlpublic_baseurl 设为上面的 base_url,即 https://neo.bgme.me

由于本人使用 Caddy,所以直接向配置中添加如下内容:

{
    "handle": [
        {
            "body": "{\"m.server\": \"neo.bgme.me:443\"}",
            "close": true,
            "handler": "static_response",
            "headers": {
                "Content-Type": [
                    "application/json"
                ]
            },
            "status_code": 200
        }
    ],
    "match": [
        {
            "path": [
                "/.well-known/matrix/server"
            ]
        }
    ]
}
{
    "handle": [
        {
            "body": "{\"m.homeserver\":{\"base_url\":\"https://neo.bgme.me\"}}",
            "close": true,
            "handler": "static_response",
            "headers": {
                "Access-Control-Allow-Origin": [
                    "*"
                ],
                "Content-Type": [
                    "application/json"
                ]
            },
            "status_code": 200
        }
    ],
    "match": [
        {
            "path": [
                "/.well-known/matrix/client"
            ]
        }
    ]
}

如果你使用 nginx 的话,应为:

location /.well-known/matrix/server {
    return 200 '{"m.server": "neo.bgme.me:443"}';
    default_type application/json;
    add_header Access-Control-Allow-Origin *;
}

location /.well-known/matrix/client {
    return 200 '{"m.homeserver": {"base_url": "https://neo.bgme.me"}}';
    default_type application/json;
    add_header Access-Control-Allow-Origin *;
}

配置反代

反代配置可参考官方文档

由于没有使用默认的8448端口,而将端口改至443端口,官方文档中8448端口相关内容可以直接去除。

下面附上本人配置文件:

{
    "@id": "neo.bgme.me",
    "handle": [
        {
            "handler": "subroute",
            "routes": [
                {
                    "handle": [
                        {
                            "handler": "headers",
                            "response": {
                                "set": {
                                    "Referrer-Policy": [
                                        "same-origin"
                                    ],
                                    "Strict-Transport-Security": [
                                        "max-age=31536000;"
                                    ],
                                    "X-Content-Type-Options": [
                                        "nosniff"
                                    ],
                                    "X-Frame-Options": [
                                        "DENY"
                                    ],
                                    "X-Robots-Tag": [
                                        "noindex, nofollow"
                                    ],
                                    "X-Xss-Protection": [
                                        "1; mode=block"
                                    ]
                                }
                            }
                        },
                        {
                            "encodings": {
                                "gzip": {}
                            },
                            "handler": "encode"
                        }
                    ]
                },
                {
                    "handle": [
                        {
                            "handler": "reverse_proxy",
                            "upstreams": [
                                {
                                    "dial": "169.254.12.38:8008"
                                }
                            ]
                        }
                    ]
                }
            ]
        }
    ],
    "match": [
        {
            "host": [
                "neo.bgme.me"
            ]
        }
    ],
    "terminal": true
}

反代配置好之后,服务便已经上线可以使用了。

进入 federation tester 输入你的 server_name,验证互连功能是否已正确配置。

如果没有问题,你的 Matrix 服务器已经部署完毕了。

后续

注册帐户

运行如下命令:

$ source ~/synapse/env/bin/activate
$ synctl start # if not already running
$ register_new_matrix_user -c homeserver.yaml http://localhost:8008
New user localpart: [username]
Password:
Confirm password:
Make admin [no]:
Success!

帐户注册完毕后,便可以通过客户端登录使用了。