写在前面
首先,Matrix是一个开源的通信协议,可以实现安全和去中心化的开放网络,它被设计用来处理即时消息、语音和视频通话等通信方式,以及进行实时数据的传输
而Synapse是一个用Python写的基于Matrix协议的服务器实现,允许用户和组织部署自己的Matrix节点,这使我们可以通过Synapse来托管自己的聊天服务,保持对数据的完全控制
除了Synapse,Matrix官方还提供了go语言写的第二代服务端,性能会更好,但目前功能可能不够完善,也不及Synapse稳定,此外Matrix官方还提供了一些使用其它语言编写的第三方版本
这篇文章将会记录完全使用Docker Compose来部署Synapse服务端,同时使用Postgresql作为数据库(默认使用Sqlite数据库)
准备数据库服务
这里我的数据库使用的是Postgresql,并且是单独作为一个服务启动的
首先在宿主机创建一个Postgresql数据目录/docker/postgresql/data
,然后在/docker/postgresql/
下面新建一个docker-compose.yml
,写入下面内容
version: "3.4"
services:
postgresql:
image: postgres:latest
container_name: postgresql
restart: always
environment:
POSTGRES_PASSWORD: your_password
volumes:
- "/docker/postgresql/data:/var/lib/postgresql/data"
networks:
- psqlnet
ports:
- 127.0.0.1:5432:5432
networks:
psqlnet:
name: psqlnet
driver: bridge
使用docker-compose up -d
启动,然后docker exec -it postgresql bash
进入容器创建synapse
用户和数据库
$ docker exec -it postgresql bash
$ su postgres
$ createuser --pwprompt synapse
Enter password for new role:
Enter it again:
$ createdb --encoding=UTF8 --locale=C --template=template0 --owner=synapse synapse
现在,数据库服务就暂时配置好了
准备Synapse服务
首先创建一个Synapse的数据目录/docker/synapse/data
,然后在/docker/synapse/
下新建一个docker-compose.yml
,写入下面内容
version: "3.4"
services:
synapse:
image: "matrixdotorg/synapse:latest"
ports:
- 127.0.0.1:8008:8008
container_name: "synapse"
restart: unless-stopped
volumes:
- "/docker/synapse/data:/data"
environment:
SYNAPSE_SERVER_NAME: "domain.name"
SYNAPSE_REPORT_STATS: "yes"
networks:
- psqlnet
networks:
psqlnet:
external: true
然后执行docker-compose run --rm synapse generate
在/docker/synapse/data
下生成配置文件homeserver.yaml
$ docker-compose run --rm synapse generate
[+] Running 10/10
✔ synapse 9 layers [⣿⣿⣿⣿⣿⣿⣿⣿⣿] 0B/0B Pulled 10.8s
✔ 1f7ce2fa46ab Pull complete 0.7s
✔ f66cb2ec4ca8 Pull complete 0.6s
✔ 9e3072bcfe9d Pull complete 0.6s
✔ 4a2b4836be3f Pull complete 0.9s
✔ 312d1214a5ea Pull complete 1.0s
✔ e6b2655a9dba Pull complete 1.3s
✔ 0883e5ecbae6 Pull complete 2.2s
✔ fa50c4c6e4c8 Pull complete 1.3s
✔ 082df609d7e6 Pull complete 1.6s
Setting ownership on /data to 991:991
Creating log config /data/evergarden.ee.log.config
Generating config file /data/homeserver.yaml
Generating signing key file /data/evergarden.ee.signing.key
A config file has been generated in '/data/homeserver.yaml' for server name 'domain.name'. Please review this file and customise it to your needs.
然后我们打开homeserver.yaml
文件,将数据库部分默认的Sqlite3改为我们准备好的Postgresql,也就是替换为下面内容
database:
name: psycopg2
args:
user: synapse
password: your_password
dbname: synapse
host: postgresql
cp_min: 5
cp_max: 10
keepalives_idle: 10
keepalives_interval: 10
keepalives_count: 3
在配置文件最后加入下面两行内容可以开放注册
enable_registration: true
enable_registration_without_verification: true
然后执行docker compose up -d
启动服务就可以了
不过自己用的话如果用户不多,最好还是关闭注册,我们可以在服务器手动给用户注册好
在启动服务后,可以使用docker exec -it synapse register_new_matrix_user -c /data/homeserver.yaml -u username -p xxxxxxxxxx -a http://localhost:8008
来创建一个管理员用户
或者使用docker exec -it synapse register_new_matrix_user -c /data/homeserver.yaml http://localhost:8008
来根据提示创建一个普通用户或管理员用户
到此为止,已经完成了Synapse的初步配置,完整配置如下:
server_name: "your.domain"
pid_file: /data/homeserver.pid
listeners:
- port: 8008
tls: false
type: http
x_forwarded: true
resources:
- names: [client, federation]
compress: false
database:
name: psycopg2
args:
user: synapse
password: synapse_password
dbname: synapse
host: postgresql
cp_min: 5
cp_max: 10
keepalives_idle: 10
keepalives_interval: 10
keepalives_count: 3
log_config: "/data/your.domain.log.config"
media_store_path: /data/media_store
registration_shared_secret: "......"
report_stats: false
macaroon_secret_key: "......"
form_secret: "......"
signing_key_path: "/data/your.domain.signing.key"
trusted_key_servers:
- server_name: "matrix.org"
enable_registration: false
enable_registration_without_verification: false
这些配置实际上已经可以够我们启动服务进行使用了,但Synapse的配置其实远不止这些,关于一些进阶配置将会放在最后介绍
反向代理
最后来配置一下nginx的反向代理
server {
listen 80;
server_name domain.name;
return 301 https://$server_name$request_uri;
}
server {
listen 443 ssl http2;
server_name domain.name;
ssl_certificate /etc/letsencrypt/live/domain.name/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/domain.name/privkey.pem;
location / {
proxy_pass http://127.0.0.1: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;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
执行systemctl restart nginx
加载配置,然后就可以用域名访问可以看到Synapse服务已启动
启动后,我们就可以使用支持Matrix的客户端(例如element)进行登录了
Synapse进阶配置
Synapse的全部配置介绍可以参考官方文档,有很详细的说明,同时内容真的非常多!
另外所有的配置选项几乎都是在homeserver.yml中设置
配置email说白了就是设置一个自己的邮箱用来给用户发送通知和验证邮件的
我用的是自己的Gmail邮箱,以下是针对Gmail邮箱的设置,使用其他邮箱或许需要修改smtp服务器和端口
email:
smtp_host: smtp.gmail.com
smtp_port: 587
smtp_user: [email protected]
smtp_pass: your_pass
require_transport_security: true
notif_from: "[email protected]"
enable_notifs: true
notif_for_new_users: true
client_base_url: https://app.element.io/ #修改为你的客户端域名
validation_token_lifetime: 15m
invite_client_location: https://app.element.io/ #修改为你的客户端域名
subjects:
message_from_person_in_room: "[%(app)s] You have a message on %(app)s from %(person)s in the %(room)s room..."
message_from_person: "[%(app)s] You have a message on %(app)s from %(person)s..."
messages_from_person: "[%(app)s] You have messages on %(app)s from %(person)s..."
messages_in_room: "[%(app)s] You have messages on %(app)s in the %(room)s room..."
messages_in_room_and_others: "[%(app)s] You have messages on %(app)s in the %(room)s room and others..."
messages_from_person_and_others: "[%(app)s] You have messages on %(app)s from %(person)s and others..."
invite_from_person_to_room: "[%(app)s] %(person)s has invited you to join the %(room)s room on %(app)s..."
invite_from_person: "[%(app)s] %(person)s has invited you to chat on %(app)s..."
password_reset: "[[email protected]] Password reset"
email_validation: "[[email protected]] Validate your email"
其中smtp_pass
可以去这里申请谷歌应用服务密码,不过用自己的密码可能也行,我没试
subjects
部分定义了邮箱的内容格式之类的,可以自行修改
turn
需要配置一台TURN服务器进行语音和视频通话,TURN服务器是用于解决位于NAT或防火墙后面的设备之间的通信问题
Linux下可以使用比较流行的开源TURN服务器CoTURN来搭建,搭建方法就不在这里介绍了,具体可以参考我的另一篇文章
下面是在Synapse中配置TURN服务的部分
turn_uris: [ "turns:your.turn.service?transport=udp", "turns:your.turn.service?transport=tcp" ]
turn_shared_secret: "your_secret"
turn_user_lifetime: 86400000
turn_allow_guests: false
user_directory
设置用户目录的选项,我这里开启了可以搜索全部用户
user_directory:
enabled: true
search_all_users: true
prefer_local_users: true
show_locked_users: false
federation
联邦就是让Matrix服务器之间能够相互连通,Matrix服务器之间的通信默认是通过8448端口的TLS连接完成
也就是说我们需要监听8448端口的TLS连接,需要做的就是在Nginx反向代理中SSL块(监听443端口的块)中添加监听8448端口即可
listen 8448 ssl http2;
此外,可能还需要配置一条DNS SRV记录,其中主机名为自己的Matrix域名,服务为_matrix,协议为_tcp,优先级和权重通常设置为10和5,端口为联邦端口8448,目标为指向Matrix服务器的完整域名
最后,我们可以去Matrix Federation Tester测试一下,不出意外的话就可以实现联邦通信了
recapture
reCAPTURE可以用来防止机器人注册账户,如果开放了注册最好配置一下
Matrix Synapse使用了Google的reCAPTURE服务,我们需要从Google获取API密钥,获取方法可以看这里,然后在homeserver.yaml
中配置以下内容
recaptcha_public_key: YOUR_SITE_KEY
recaptcha_private_key: YOUR_SECRET_KEY
enable_registration_captcha: true
other
max_upload_size: 1024M # 允许最大的上传大小
allow_guest_access: false # 拒绝访客登录
enable_3pid_changes: true # 允许用户修改关联的第三方ID(例如邮箱等)
写在最后
有关Synapse的配置实在太多,但本文所述的配置已经是完全够用了
关于客户端的选择,目前最成熟的应该是官方的element.io,有全平台客户端,但遗憾的是其网站在国内被墙,对于手机APP在第一次登陆的时候需要用代理,登陆后只要不退出就可以长期使用国内的网络通信(前提是登录的Synapse服务器没被墙);对于网页版,可以考虑自行搭建一个element-web登陆网站,总之国内使用相对麻烦点
当然,如果你有代理的话,以上都不是问题