准备工作

  • 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好用多了,别给杜叔叔送钱了