[教程]自建Matrix通讯协议的服务端与客户端

前言

  • 加入NS这么久了,从0级水贴水到了6级,也没弄出什么像样的教程,这次就来个大的,在我的签名博客也有同步更新,欢迎MJJ们造访
  • Matrix是一种开源分布式加密通讯协议,在这里我将介绍如何使用其第一代较稳定的官方服务端Synapse搭建Homeserver(根服务器)以及搭建官方客户端Element,若想了解更多服务端与客户端,可去matrix.org(需要魔法)自行探索

准备工作

  • 1、一台x86/amd64架构的Linux服务器(基本无性能要求,可用内存建议在200M以上)

  • 2、安装Docker

    • curl -fsSL https://get.docker.com -o get-docker.sh
      sudo sh ./get-docker.sh
      
    • 若未安装可使用上述命令安装

  • 3、一个域名(文中使用Cloudflare作为DNS提供商,并使用Cloudflare Pages部署客户端,如有需要也可使用其他提供商)

  • 4、一个邮箱(可使用SMTP,用于设置发信,自建邮局/outlook等均可)

  • 5、一个Cloudflare账户

搭建过程

  • 1、使用Docker Compose搭建Synapse

    • 创建一个文件夹以存放数据,并在该文件夹下创建docker-compose.yml,内容如下

    • version: "3.3"
      
      services:
        synapse:
          image: "matrixdotorg/synapse:latest"
          container_name: "matrix_synapse"
          restart: unless-stopped
          healthcheck: #healthcheck,由于该镜像原有的Healthcheck在Nginx反代后疑似不起效导致服务始终显示Unhealthy,在此修改Healthcheck
            test: ["CMD", "curl", "-f", "你的服务器URL"]
            interval: 30s
            timeout: 10s
            retries: 3
            start_period: 40s
          ports:
            - '监听IP:端口:VIRTUAL_PORT'#此处VIRTUAL_PORT输入与下文VIRTUAL_PORT同样的端口
          volumes:
            - "./data:/data"#数据存放在./data文件夹中,可随意修改为可用路径
            VIRTUAL_HOST: "你的域名" #如使用子域名请填写子域名,下同
            VIRTUAL_PORT: 你的服务端口 #此处指的是Docker容器的端口,端口映射在上文有提到,端口无需加引号
            LETSENCRYPT_HOST: "你的域名" #此为其内置HTTPS使用的域名,本文中使用HTTP协议通过NPM反向代理实现HTTPS,故不重要
            SYNAPSE_SERVER_NAME: "你的域名"
            SYNAPSE_REPORT_STATS: "yes/no" #是否向官方服务器反馈错误
      
    • 接下来使用如下命令在./data中生成配置文件

    • docker run -it --rm -v ./data/:/data/ -e SYNAPSE_SERVER_NAME=你的域名 -e SYNAPSE_REPORT_STATS=yes/no                    matrixdotorg/synapse:latest generate #yes/no选择一个,域名填写与docker-compose.yml相同的域名即可
      
    • 生成成功后./data(或者自定义的路径)中会出现homeserver.yaml,将其修改,参照以下模板

    • # Configuration file for Synapse.
      #
      # This is a YAML file: see [1] for a quick introduction. Note in particular
      # that *indentation is important*: all the elements of a list or dictionary
      # should have the same indentation.
      #
      # [1] https://docs.ansible.com/ansible/latest/reference_appendices/YAMLSyntax.html
      #
      # For more information on how to configure Synapse, including a complete accounting of
      # each option, go to docs/usage/configuration/config_documentation.md or
      # https://element-hq.github.io/synapse/latest/usage/configuration/config_documentation.html
      server_name: "你的域名"
      pid_file: /data/homeserver.pid
      listeners:
        - port: 你的端口 #同上
          tls: false
          type: http
          x_forwarded: true
          resources:
            - names: [client, federation]
              compress: false
      database: #这里使用SQLite,若要使用其他数据库请参考官方文档修改此处配置
        name: sqlite3
        args:
          database: /data/homeserver.db
      log_config: "/data/你的域名.log.config" #可修改该文件以配置日志
      media_store_path: /data/media_store #此处可以修改用户上传的媒体的存储路径(在容器中的路径)
      registration_shared_secret: "保留生成的secret即可"
      report_stats: false
      macaroon_secret_key: "保留生成的secret即可"
      form_secret: "保留生成的secret即可"
      signing_key_path: "/data/你的域名.signing.key"
      trusted_key_servers:
        - server_name: "matrix.org"
      
      enable_registration: True #若是私人服务器设置为false可关闭注册
      registrations_require_3pid: #使用邮箱注册,若需其他方式可参考官方文档
        - email
      suppress_key_server_warning: True
      public_baseurl: https://你的域名 #其他服务器访问你的服务器所用域名,同上面的域名即可
      serve_server_wellknown: true #开启后服务器连接会通过443而不是非标端口,可以用于添加CDN
      block_non_admin_invites: false
      allow_guest_access: false
      email:
        smtp_host: 你的邮件服务器 #无需引号
        smtp_port: 你的邮件服务器端口 #无需引号
        smtp_user: "你的SMTP账户"
        smtp_pass: "你的SMTP密码"
        enable_tls: true #是否开启TLS,OutLook需开启
        require_transport_security: true
        notif_from: "Your Friendly %(app)s homeserver " #验证邮件提示语,可按照喜好自行修改
        client_base_url: "https://你的element域名" #不同于上述"你的域名",指的是客户端域名,后续部署element时会提到
        validation_token_lifetime: 15m #验证邮件有效时长
        invite_client_location: https://你的element域名
        subjects: #各种提示消息的主题,如需修改样式,请参阅官方文档并自行搜索主题
          message_from_person_in_room: "%(person)s 在 %(room)s 聊天室中给你发送了一条消息"
          message_from_person: "%(person)s 给你发送了一条消息"
          messages_from_person: "%(person)s 给你发送了多条消息"
          messages_in_room: "你有一条来自 %(room)s 聊天室的消息"
          messages_in_room_and_others: "你有一些来自 %(room)s 聊天室和其他人的消息"
          messages_from_person_and_others: "[%(app)s] 你有一些来自 %(person)s 和其他人的消息"
          invite_from_person_to_room: "%(person)s 邀请你加入 %(room)s 聊天室"
          invite_from_person: "%(person)s 邀请你注册"
          password_reset: "【】密码重置"
          email_validation: "【】验证您的电子邮件"
      # vim:ft=yaml
      
    • 修改完之后,使用chmod -R 777 ./data 将data文件夹权限设为最高,然后在含有docker-compose.yml的目录下使用docker compose up -d 启动服务器

    • 此时,若你将服务器该端口映射到公网,访问公网IP 端口,应出现包含It works! Synapse is running 的界面,证明搭建正确

  • 2、使用Nginx Proxy Manager进行反向代理

    • 打开Nginx Proxy Manager,并添加Proxy Host,此处使用的域名是前文中"你的域名",IP与端口则是前文中Docker容器映射到的IP与端口,回源协议选择HTTP,开启TLS(如果使用Cloudflare CDN也可不开启TLS)

    • 将域名解析至服务器公网IP,若访问https://你的域名 出现与上文一样的It works! Synapse is running 的界面,证明搭建成功

  • 3、接入Cloudflare CDN(可选)

    • 由于Cloudflare CDN会自行提供边缘TLS证书,所以若要接入Cloudflare CDN,前文配置Nginx Proxy Manager时可不使用TLS/使用Cloudflare提供的15年有效期的源服务器证书

    • 另外一种方法是不使用Nginx Proxy Manager,而直接使用Origin Rules将该域名解析会员至指定端口,但是不推荐此种方式,因为Cloudflare免费计划中每个域名只有10条Origin Rules,且使用此种方式需在公网上暴露端口

  • 4、搭建Synapse时的一些注意事项

    • (1)开启TLS十分重要

    • Matrix协议的加密与TLS有着密不可分的关系,若不开启TLS直接使用HTTP搭建HomeServer,在使用过程中会发现无法生成加密秘钥等问题

    • (2)接入Cloudflare CDN后的上传文件限制

    • 在接入Cloudflare CDN后,由于免费版的限制,最大文件上传大小为100MB,否则会返回Error 413

    • (3)文件存储

    • 文件会全部存储在搭建用服务器上,所以尽量使用硬盘较大的服务器作为HomeServer

  • 5、使用Cloudflare Pages搭建Element客户端

    • 由于Element客户端为纯前端页面,所以可以使用Cloudflare Pages搭建,而不必浪费服务器资源
    • 将此仓库的最新分支/稳定分支部署至Cloudflare Pages/任意前端托管平台上即可
    • 注意需修改config.json,将其中的HomeServer修改为你自己的HomeServer,且将你自己的客户端域名解析至此Pages上,作为上文中的"你的element域名"

结语

  • Matrix是一个分布式的加密通讯协议,而Synapse是现存的唯一稳定服务端,Element也是一个很好用的稳定客户端,界面十分美观,如有需要也可尝试Android/IOS/PC版,浏览器版的泛用性相对更强,但操作相对更困难一些。
  • 所以这作为聊天软件比TG好用多了,别给杜叔叔送钱了
点赞
  1. Stevie0427说道:

    凌晨发技术贴没人看是吧,MJJ都去睡觉了

  2. soga说道:

    白天试试

  3. shuai说道:

    @Stevie0427 #7

    加精了,我是看懂了,但建议最前面就说清楚Synapse,Element,matrix,homeserver的关系,不然看着一头雾水

发表回复

电子邮件地址不会被公开。必填项已用 * 标注

×
订阅图标按钮