Matrix聊天服务器Synapse的搭建

发布于 2021-10-16  7072 次阅读


这是我第一次安装Synapse,走了很多弯路,再加上中文互联网上相关的内容相当少,所以特地写一篇文章来记录一下我的安装过程。

1、安装环境准备

我准备了一台4C/4G的虚拟机来安装Synapse。系统为Debian 11 64位,桥接连接上路由器。在此特地提醒一下,请确保你的服务器能够访问matrix.org和packages.matrix.org,这关系着你之后能否正常地从matrix的官方源下载到包。由于matrix.org是被GFW拦在墙外的,所以请在大陆主机上安装Synapse前准备好梯子。墙外的主机不存在这一问题,但是由于聊天应用对时延非常敏感,所以如果要在大陆使用,请准备一台在大陆访问时延足够低的主机,比如香港地区的某些主机。

官网上的整个安装过程可以不涉及Docker,但是我还是推荐选择配置高一些的主机来安装,这种“高”几乎是全方位的。要求及时处理用户请求--CPU,要求存储用户的数据,并实时读取--硬盘、内存,要求处理音、视频通话--网络。所以搭建一个Synapse不困难,但是要求各方面比较完善是非常难的。

此外,还需要一个域名来让Synapse实例接入Matrix网络并与其它服务器通信。为了保证通信的安全,请准备好SSL证书。

那么接下来就正式开始了。

首先登录上终端,并确保是在拥有超级用户权限(命令前的提示符为#而不是$)执行下面的命令,如果不是,需要在下面的每一条命令前加sudo,或者使用su及sudo -I命令来提升权限,

首先更新系统:

# apt-get update

安装上官网上要求的工具

# apt-get install lsb-release wget apt-transport-https

添加Matrix官方源

# echo "deb [signed-by=/usr/share/keyrings/matrix-org-archive-keyring.gpg] https://packages.matrix.org/debian/ $(lsb_release -cs) main" |
 tee /etc/apt/sources.list.d/matrix-org.list

如果上面的命令失败,可以试一试下面这两个手动将官方Matrix源添加到系统的APT的命令:

# add-apt-repository https://matrix.org/packages/debian/

添加存储库的密钥:

# wget -qO - https://matrix.org/packages/debian/repo-key.asc | sudo apt-key add -

如果没有问题,就可以更新索引了:

# apt upgrade 

然后再次更新系统:

 # apt-get update 

2、安装Synapse

用下面的命令来安装Synapse:

# apt install matrix-synapse-py3

在安装的过程中,安装程序会弹框要求你输入分配给这台Matrix服务器的名称,也就是域名。这关系到两个部分:1、以后你的用户的@后面的后缀。2、只有这里填写正确了,以后才能加入Matrix网络。

询问域名

然后安装程序会询问你是否发送匿名统计信息,这个就看个人喜好了。

在安装成功之后,你可以运行

# wget http://localhost:8008

然后

# cat index.html

如果出现了“Synapse is running”相关字眼,则说明搭建成功。我们接下来要做的事是配置它,以便能让它正常使用。

3、配置Synapse

首先说明一下,Synapse的配置文件是/etc/matrix-synapse/homeserver.yaml,接下来我们就需要修改它来配置Synapse。

首先生成一个32位的字符串:

# cat /dev/urandom | tr -dc 'a-zA-Z0-9' | fold -w 32 | head -n 1

这是注册的共享机密,任何知道这个的人都可以使用它来在你的服务器上注册用户,包括管理员,因此请务必不要泄露出去。

编辑 /etc/matrix-synapse/homeserver.yaml,找到#registration_shared_secret,删除后面的内容,把机密用英文双引号括起来,然后去除前面的#,就好像:

registration_shared_secret: "uieB2wrx7nV4R9D50p0jfZSgKDRJSWJ7"

接下来,编辑enable_registration的值来启用公共注册,当设置为

nable_registration: true

即代表启用注册,其他人可以在客户端处注册普通用户。nable_registration的值为false或者前面有#则代表关闭注册。当然也可以先开启公共注册,然后在需要使用这个服务器的用户都注册了之后再关闭注册。

修改完成后,保存文件, 然后来安装数据库。

这里安装的数据库是PostgreSQL,来用作Synapse的数据库,因为Synapse的默认数据库是SQLite3,这种数据库的性能很低下,只能勉强支撑Synapse的日常简单使用。因此我们需要安装数据库来替代SQLite3.

输入以下命令来安装 PostgreSQL :

# apt-get install postgresql

PostgreSQL安装完成后会创建一个名为postgres的系统用户作为数据库的管理员,密码随机,所以需要修改密码,这里先登陆为postgres用户,更改数据库里的postgres用户密码,然后创建synapse数据库,最后再退回到root用户,修改系统用户postgres的密码。

首先使用以下的命令登录为postgres用户:

# su postgres

输入以下的命令进入postgres命令行工具:

$ psql

出现“输入 "postgres=#”后,输入以下的命令将数据库的postgres用户的密码重置为“12345678”:

# ALTER USER postgres WITH PASSWORD '12345678';

这里的12345678可以改成想要的值。

接下来输入以下的命令来创建sypanse数据库:

# CREATE DATABASE synapse
ENCODING 'UTF8'
LC_COLLATE='C'
LC_CTYPE='C'
template=template0
OWNER postgres;

上面的命令表示创建的数据库名为SYNAPSE,编码方式为UTF8,拥有者为postgres用户。

然后输入

# /q

来退出工具,之后返回到系统root用户下,输入

# passwd -d postgres

删除系统用户postgres的密码,再使用

# su postgres

重新进入postgres用户,使用

$ passwd

来修改密码。

然后返回root用户,编辑synapse配置文件/etc/matrix-synapse/homeserver.yaml,在文件中找到sqlite3相关的配置,在它们的前面加上#来把它们全部全部注释掉,类似于

#database:
#  name: sqlite3
#  args:
#    database: /var/lib/matrix-synapse/homeserver.db

然后在下面加入PostgreSQL的配置内容,好像

database:
    name: psycopg2
    args:
        user: postgres
        password: 12345678
        database: synapse
        host: 127.0.0.1
        cp_min: 5
        cp_max: 10
        keepalives_idle: 30
        keepalives_interval: 10
        keepalives_count: 3

上面表示在127.0.0.1地址以postgres用户名,12345678为密码连接synapse数据库。

然后保存配置文件,用

# systemctl restart matrix-synapse

重启服务就行了。

不过在配置文件里还有几个地方需要介绍一下。

media_store_path指定用来保存用户上传的媒体文件的目录;

url_preview_enabled表示开启链接预览,如果开启这个功能,还需要同时开启url_preview_ip_range_blacklist(即解除这一部分配置的注释)

trusted_key_servers可以用来填上其他你知道的Matrix的服务器,默认是matrix.org。另外,如果 trusted_key_servers 中有 matrix.org,需要将下面的suppress_key_server_warning设为 true,否则启动时会有警告。

email模块可以配置SMTP给用户发信。

redis部分用来给Synapse开启redis缓存服务。

配置文件 /etc/matrix-synapse/homeserver.yaml里其他内容我也还在摸索,官方的详细说明可以在这里看到

确定一切都修改完成后,保存文件,并用

# systemctl restart matrix-synapse

来重新启动Synapse服务器。

重启完成后,需要注册一个管理员用户。用

# register_new_matrix_user -c /etc/matrix-synapse/homeserver.yaml http://localhost:8008

来创建用户,按照提示输入用户名、密码,当提示是否为管理员时,输入yes来将用户注册为管理员。在终端中创建用户不受配置文件中的 enable_registration 参数影响。

最后,我们来设置Synapse开机启动,这样服务器一开机,Synapse就开始运行了。

# systemctl enable matrix-synapse

4、设置外部访问

当安装完Synapse以后,你会发现Synapse仅在本地可以访问,虽然我们可以修改配置文件 /etc/matrix-synapse/homeserver.yaml来让它为外网提供服务,但是这并不是官方推荐的做法,官方推荐的做法就是用Nginx进行反向代理。

所以,首先安装nginx:

# apt-get install nginx

接下来,需要创建一个对应Synapse反向代理的虚拟主机配置文件,nginx的虚拟主机文件默认存在于/etc/nginx/sites-available目录下。

在这个目录下创建一个虚拟主机配置文件,这里以matrix.conf为例:

# nano /etc/nginx/sitees-available/matrix.conf

在文件中输入以下内容:

server {
    listen 443 ssl;
    listen [::]:443 ssl;

    client_max_body_size 10480M;   #设置nginx上传大小为10G

    ssl_certificate /home/debianuser/certs/Server_root.crt;
    ssl_certificate_key /home/debianuser/certs/Server_private.key;    #这里修改为服务器域名对应的SSL证书的证书和私钥地址

    root /var/www/html;
    index index.html index.htm index.nginx-debian.html;

    server_name matrix.example.com;        #把matrix.example.com换成服务器的域名

    location /{
	ssl_certificate /home/eastmoe/certs/Server_root.crt;
        ssl_certificate_key /home/eastmoe/certs/Server_private.key;
        	proxy_pass http://127.0.0.1:8008;  #如果你的Synapse服务器不是运行在8008端口,请修改这里的端口号
		proxy_redirect off;
		proxy_set_header Host $host;
		proxy_set_header X-Real-IP $remote_addr;
		proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }

    location ~ /.well-known {
        allow all;
    }
}

如上面所示,修改域名和证书。上传大小则受到此处nginx与Synapse配置的双重限制。

然后重启nginx,来让我们的配置生效。

# systemctl restart nginx

然后就是防火墙了,使用ufw防火墙放行指定端口:

# ufw allow 443
# ufw allow 22  

然后可以用

# ufw status

来查看端口开放情况。

5、结束语与其他

完成这一切之后,理论上就可以使用客户端(比如Element)连接到服务器,开始使用了。注意, Element 要在开始的“选择服务器”里选择其他,然后输入你的服务器地址进行连接。

原本想多插一些图的,想想看还是算了。

下次我会来尝试搭建一下element的WebUI和Nextcloud Talk。

6、参考资料

1、Installation - Synapse

2、如何在CVM上安装Matrix Synapse - 云+社区 - 腾讯云

3、安装Matrix系统(Riot.im)的服务端Synapse - 简书

4、Matrix踩坑记(一) - 影子屋

最后更新于 2021-10-24