去中心化通信服务Matrix Synapse

Synapse是一个Matrix协议的服务器实现,允许用户和组织部署自己的Matrix节点

写在前面


首先,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


配置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登陆网站,总之国内使用相对麻烦点

当然,如果你有代理的话,以上都不是问题

发表了43篇文章 · 总计78.96k字
·
Built with Hugo
主题 StackJimmy 设计