本文记录使用 Python 虚拟环境安装并运行 Matrix Synapse 的基本流程和注意事项。

Python 环境部署 Synapse 部分主要参考 Synapse 的官方文档: Installing as a Python module from PyPI

一、安装依赖

根据自己的操作系统,选择安装依赖,我的是 Ubuntu,所以运行下面命令:

sudo apt install build-essential python3-dev libffi-dev libpq-dev \
                     python3-pip python3-setuptools sqlite3 \
                     libssl-dev virtualenv libjpeg-dev libxslt1-dev libicu-dev

注意,由于后面要安装 Synapse S3 Storage Provider 这个模块,而这个模块需要 libpq-dev,所以上面命令和官方给出的唯一不同之处是我添加了 libpq-dev

二、下载并安装 Synapse

运行下面命令,下载并安装 Synapse 到 ~/synapse 目录:

mkdir -p ~/synapse
virtualenv -p python3 ~/synapse/env
source ~/synapse/env/bin/activate
pip install --upgrade pip
pip install --upgrade setuptools
pip install matrix-synapse

运行下面命令,在 ~/synapse 目录下面生成一份 synapse 配置文件 homeserver.yaml

cd ~/synapse
python -m synapse.app.homeserver \
    --server-name my.domain.name \
    --config-path homeserver.yaml \
    --generate-config \
    --report-stats=no

注意把服务器替换成自己的,上面命令同时还会生成一份密钥,它是用来和其它 Matrix 服务器验证身份用的,所以要保管好。另外,report-stats 我选择了 no

三、安装 PostgreSQL

Synapse 默认使用 SQLite 作为数据库,这个有些单薄了,尤其如果用户数据越来越多的时候,所以推荐做法是从一开始就直接使用 PostgreSQL 作为数据库。

怎么安装 PostgreSQL 和创建 Synapse 数据库,以及备份和恢复单一数据库命令,可以参考《Linux 服务器配置》里面 安装 PostgreSQL 部分的内容。

四、安装 Synapse S3 Storage Provider 模块来使用 AWS S3 存储媒体文件

同样的,Synapse 默认在本地存储媒体文件,这样也是不利于后期扩展的,所以推荐从一开始就使用 AWS S3 来存放媒体文件。

这里要用到官方的一个扩展模块: Synapse S3 Storage Provider,因为是虚拟环境安装的 Synapse,所以这个模块也要安装到同一个虚拟环境里面:

source ~/synapse/env/bin/activate
pip install synapse-s3-storage-provider

前面安装依赖那步已经提到过了,这个模块需要 libpq-dev,如果一开始是按照 Synapse 官方给出的安装依赖命令,那么系统里没有 libpq-dev 的话,安装这个模块时会报错。

然后运行下面命令安装 AWS 命令行工具:

source ~/synapse/env/bin/activate
pip3 install awscli #其实 awscli 也可以全局安装,只不过我选择安装在 synapse 同一个虚拟环境里
aws configure #初始化配置,会要求输入 access_key_id 和 secret_access_key,怎么从 AWS 里面获取这里就不说了。

这里需要注意,如果 awscli 是全局安装的,而我们这个模块以及 Synapse 都是虚拟环境里面安装的,那么需要把存储桶的 key 和 region 信息放到环境变量里面,否则会报错:botocore.exceptions.NoCredentialsError: Unable to locate credentials

export AWS_ACCESS_KEY_ID=AKIA5ORZOSYQ4WI46KOC
export AWS_SECRET_ACCESS_KEY=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
export AWS_DEFAULT_REGION=ap-southeast-1

五、配置 Synapse 使用 PostgreSQL 数据库和 S3 存储桶

前面都是准备步骤,现在我们把数据库以及 S3 相关信息填入 homeserver.yaml 以及 Synapse S3 Storage Provider 模块的 database.yaml 里面就可以了。关于这个模块的详细配置可以参考 《把 Matrix Synapse 的媒体文件转移到 Amazon S3》这篇文章。

六、写一个自启动脚本,通过 systemd 来控制 Synapse

因为 Synapse 是通过 Python 虚拟环境运行的,平时如果需要重启什么的还要每次进入这个虚拟目录,太繁琐了,所以直接写一个自启动脚本交由 systemd 来控制它的自启动,比如服务器重启后自动启动,这样就不用手动来启动了。

假设我们给 Synapse 服务起名为 synapse-venv

sudo vi /etc/systemd/system/synapse-venv.service

自启动脚本如下(请自行替换 username 和路径):

[Unit]
Description=Synapse Matrix Homeserver (Virtual Environment)
After=network.target

[Service]
Type=simple
User=username
Group=username
WorkingDirectory=/home/username/synapse
ExecStart=/home/username/synapse/env/bin/python -m synapse.app.homeserver -c /home/username/synapse/homeserver.yaml
Restart=always
RestartSec=5

[Install]
WantedBy=multi-user.target

上面脚本保存后,运行下面命令就可以启用这个脚本了:

sudo systemctl daemon-reload
sudo systemctl enable synapse-venv

然后,就可以使用熟悉的命令来控制 Synapse 了:

sudo systemctl start synapse-venv
sudo systemctl status synapse-venv
sudo systemctl restart synapse-venv

总结

按照上面的步骤一步一步来,确保权限没有问题,配置信息正确,那么可以确信最终运行 sudo systemctl start synapse-venv 可以一次成功。

然后,后续的在 Synapse 里面创建新用户,安装手机、电脑、平板等聊天客户端以及登录和验证等操作,这里就不提了。