<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Matrix on CTmH</title><link>/tags/matrix/</link><description>Recent content in Matrix on CTmH</description><generator>Hugo -- gohugo.io</generator><language>zh</language><lastBuildDate>Fri, 12 Aug 2022 00:00:00 +0000</lastBuildDate><atom:link href="/tags/matrix/index.xml" rel="self" type="application/rss+xml"/><item><title>通过 Ansible playbook 安装和配置 Matrix 服务端软件 Synapse</title><link>/p/%E9%80%9A%E8%BF%87-ansible-playbook-%E5%AE%89%E8%A3%85%E5%92%8C%E9%85%8D%E7%BD%AE-matrix-%E6%9C%8D%E5%8A%A1%E7%AB%AF%E8%BD%AF%E4%BB%B6-synapse/</link><pubDate>Fri, 12 Aug 2022 00:00:00 +0000</pubDate><guid>/p/%E9%80%9A%E8%BF%87-ansible-playbook-%E5%AE%89%E8%A3%85%E5%92%8C%E9%85%8D%E7%BD%AE-matrix-%E6%9C%8D%E5%8A%A1%E7%AB%AF%E8%BD%AF%E4%BB%B6-synapse/</guid><description>&lt;img src="/p/%E9%80%9A%E8%BF%87-ansible-playbook-%E5%AE%89%E8%A3%85%E5%92%8C%E9%85%8D%E7%BD%AE-matrix-%E6%9C%8D%E5%8A%A1%E7%AB%AF%E8%BD%AF%E4%BB%B6-synapse/element_Login_en.png" alt="Featured image of post 通过 Ansible playbook 安装和配置 Matrix 服务端软件 Synapse" /&gt;&lt;p&gt;最近打算向身边的朋友推广开源通信软件和开放的通信协议，因此打算自建一个稳定好用的通信服务。XMPP和Matrix是目前较为流行的两个开放的、支持端对端加密的通信协议。&#10;我个人其实更喜欢XMPP，因为它有成熟且资源占用更小的服务端软件，能够在很少资源的VPS上承载很大的通信流量（省钱）。&#10;但是支持XMPP的客户端除了Android平台上Conversations之外少有美观好用的，桌面端更是如此。另外我身边的朋友们更喜欢Element的跨平台的一致体验和Matrix更丰富的功能，所以我最终选择Matrix协议。&lt;/p&gt;&#10;&lt;p&gt;Matrix官方的Go语言服务端Dendrite相比官方的Python服务端Synapse更加高效，且占用资源更少，但目前还处于Beta阶段且缺少很多功能。虽然Synapse在用户加入规模大的群聊时会占用很多的内存，但胜在稳定和功能全面，资料丰富，而且我的服务器仅用于小规模的朋友之间的通信，不太可能遇到加入规模大的群聊的情况。因此，为了朋友们有更好的体验以便推广开源开放的通信软件，我选择部署Synapse。&lt;/p&gt;&#10;&lt;p&gt;Ansible是一个自动化的运维工具。通过热心开发者提供的&lt;a class="link" href="https://github.com/spantaleev/matrix-docker-ansible-deploy" target="_blank" rel="noopener"&#10; &gt;Ansible Playbook&lt;/a&gt; ，我能方便地自动化部署Matrix服务端软件Synapse和其他相关服务。&lt;/p&gt;&#10;&lt;p&gt;除了配置SSH时需要登陆到VPS上操作，其余操作均在本地完成。&lt;/p&gt;&#10;&lt;h1 id="获取playbook"&gt;获取Playbook&#10;&lt;/h1&gt;&lt;p&gt;通过git下载仓库。通过本地的包管理器下载安装Ansible。&lt;/p&gt;&#10;&lt;pre&gt;&lt;code&gt;git clone https://github.com/spantaleev/matrix-docker-ansible-deploy.git&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;h1 id="设置dns"&gt;设置DNS&#10;&lt;/h1&gt;&lt;h2 id="默认的dns设置"&gt;默认的DNS设置&#10;&lt;/h2&gt;&lt;p&gt;主要的两条DNS记录。由于我需要matrix服务器来托管基础域名，因此还需要将基础域名地址指向matrix服务器。&lt;/p&gt;&#10;&lt;table&gt;&#10;&#9;&lt;thead&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;Type&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;Host&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;Priority&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;Weight&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;Port&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;Target&lt;/th&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/thead&gt;&#10;&#9;&lt;tbody&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;A&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;matrix&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;-&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;-&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;-&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;matrix-server-IP&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;CNAME&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;element&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;-&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;-&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;-&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;matrix.&amp;lt;your-domain&amp;gt;&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/tbody&gt;&#10;&lt;/table&gt;&#10;&lt;h2 id="其他dns设置"&gt;其他DNS设置&#10;&lt;/h2&gt;&lt;p&gt;我需要配置&lt;code&gt;dimension&lt;/code&gt;用于插件管理，&lt;code&gt;stats&lt;/code&gt;用于查看服务器状态，&lt;code&gt;ntfy&lt;/code&gt;用于消息推送。&lt;/p&gt;&#10;&lt;table&gt;&#10;&#9;&lt;thead&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;Type&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;Host&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;Priority&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;Weight&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;Port&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;Target&lt;/th&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/thead&gt;&#10;&#9;&lt;tbody&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;SRV&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;_matrix-identity._tcp&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;10&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;0&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;443&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;matrix.&amp;lt;your-domain&amp;gt;&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;CNAME&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;dimension&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;-&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;-&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;-&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;matrix.&amp;lt;your-domain&amp;gt;&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;CNAME&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;jitsi&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;-&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;-&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;-&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;matrix.&amp;lt;your-domain&amp;gt;&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;CNAME&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;stats&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;-&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;-&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;-&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;matrix.&amp;lt;your-domain&amp;gt;&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;CNAME&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;goneb&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;-&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;-&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;-&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;matrix.&amp;lt;your-domain&amp;gt;&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;CNAME&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;sygnal&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;-&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;-&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;-&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;matrix.&amp;lt;your-domain&amp;gt;&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;CNAME&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;ntfy&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;-&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;-&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;-&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;matrix.&amp;lt;your-domain&amp;gt;&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;CNAME&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;hydrogen&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;-&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;-&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;-&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;matrix.&amp;lt;your-domain&amp;gt;&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;CNAME&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;cinny&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;-&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;-&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;-&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;matrix.&amp;lt;your-domain&amp;gt;&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;CNAME&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;buscarron&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;-&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;-&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;-&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;matrix.&amp;lt;your-domain&amp;gt;&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/tbody&gt;&#10;&lt;/table&gt;&#10;&lt;h1 id="根据需求修改配置文件"&gt;根据需求修改配置文件&#10;&lt;/h1&gt;&lt;h2 id="创建配置文件"&gt;创建配置文件&#10;&lt;/h2&gt;&lt;p&gt;在 &lt;code&gt;inventory/host_vars&lt;/code&gt;中建立以&lt;code&gt;matrix.&amp;lt;your-domain&amp;gt;&lt;/code&gt;为名的文件夹。复制模板到该文件夹&lt;code&gt;cp examples/vars.yml inventory/host_vars/matrix.&amp;lt;your-domain&amp;gt;/vars.yml&lt;/code&gt;。根据模板中的注释填入基本的配置信息。&lt;/p&gt;&#10;&lt;p&gt;复制模板（&lt;code&gt;cp examples/hosts inventory/hosts&lt;/code&gt;）并根据自己的服务器SSH信息修改&lt;code&gt;hosts&lt;/code&gt;文件。&lt;/p&gt;&#10;&lt;h2 id="配置-synapse"&gt;配置 Synapse&#10;&lt;/h2&gt;&lt;p&gt;修改&lt;code&gt;inventory/host_vars/matrix.DOMAIN/vars.yml&lt;/code&gt;文件。&lt;/p&gt;&#10;&lt;p&gt;配置workers实现负载均衡，对每个支持的服务类型都使用workers&#10;matrix_synapse_workers_enabled: true&#10;matrix_synapse_workers_preset: one-of-each&lt;/p&gt;&#10;&lt;h2 id="禁用-element"&gt;禁用 Element&#10;&lt;/h2&gt;&lt;p&gt;由于我的服务器不打算提供 Web APP，因此禁用Element，也不开启 Hydrogen 和 Cinny。&lt;/p&gt;&#10;&lt;p&gt;修改&lt;code&gt;inventory/host_vars/matrix.DOMAIN/vars.yml&lt;/code&gt;文件。&lt;/p&gt;&#10;&lt;pre&gt;&lt;code&gt;matrix_client_element_enabled: false&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;h2 id="配置-synapse-admin"&gt;配置 Synapse Admin&#10;&lt;/h2&gt;&lt;p&gt;修改&lt;code&gt;inventory/host_vars/matrix.DOMAIN/vars.yml&lt;/code&gt;文件。&lt;/p&gt;&#10;&lt;pre&gt;&lt;code&gt;matrix_synapse_admin_enabled: true&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;p&gt;Synapse Admin需要Synapse的Admin APIs来运行，添加该配置项后会自动开放相关API。&lt;/p&gt;&#10;&lt;h2 id="配置用于存储媒体文件的对象存储"&gt;配置用于存储媒体文件的对象存储&#10;&lt;/h2&gt;&lt;p&gt;修改&lt;code&gt;inventory/host_vars/matrix.DOMAIN/vars.yml&lt;/code&gt;文件。&lt;/p&gt;&#10;&lt;pre&gt;&lt;code&gt;matrix_s3_media_store_enabled: true&#10;matrix_s3_media_store_bucket_name: &amp;quot;your-bucket-name&amp;quot;&#10;matrix_s3_media_store_aws_access_key: &amp;quot;access-key-goes-here&amp;quot;&#10;matrix_s3_media_store_aws_secret_key: &amp;quot;secret-key-goes-here&amp;quot;&#10;matrix_s3_media_store_custom_endpoint_enabled: true&#10;matrix_s3_media_store_custom_endpoint: &amp;quot;your-custom-endpoint&amp;quot;&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;h2 id="配置ssl证书"&gt;配置SSL证书&#10;&lt;/h2&gt;&lt;p&gt;如果使用集成的Nginx，那么该 Ansible playbook 会根据配置文件中指定开启的服务来自动获取各个服务或插件对应域名的SSL证书。因此我这里仅仅指定证书的加密算法。&lt;/p&gt;&#10;&lt;pre&gt;&lt;code&gt;matrix_ssl_lets_encrypt_key_type: ecdsa&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;h2 id="基础域名服务"&gt;基础域名服务&#10;&lt;/h2&gt;&lt;p&gt;由于运行Synapse的联邦发现服务需要服务器委托（在基础域名下提供&lt;code&gt;/.well-known/matrix/*&lt;/code&gt;等文件）。相比较为麻烦的自建网页服务器方案，我选择通过matrix集成的网页服务器来托管基础域名。&lt;/p&gt;&#10;&lt;p&gt;修改&lt;code&gt;inventory/host_vars/matrix.DOMAIN/vars.yml&lt;/code&gt;文件。&lt;/p&gt;&#10;&lt;pre&gt;&lt;code&gt;matrix_nginx_proxy_base_domain_serving_enabled: true&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;p&gt;由于我需要使用自定义的主页，因此需要额外添加以下配置：&#10;matrix_nginx_proxy_base_domain_homepage_enabled: false&lt;/p&gt;&#10;&lt;p&gt;有了这个配置，Ansible就不会再处理&lt;code&gt;/matrix/nginx-proxy/data/matrix-domain/index.html&lt;/code&gt;文件。&#10;然后，可以将任何静态网站文件上传到&lt;code&gt;/matrix/nginx-proxy/data/matrix-domain&lt;/code&gt;。更复杂的网站建议使用自建网页服务器的方案。&lt;/p&gt;&#10;&lt;h2 id="turn-服务器"&gt;TURN 服务器&#10;&lt;/h2&gt;&lt;p&gt;为了方便客户端能在 NAT-ed 网络环境中视频/语音通话，需要配置 TURN 服务器。默认情况下该 Ansible playbook 会自动配置，因此无需额外配置。&lt;/p&gt;&#10;&lt;h2 id="遥测数据"&gt;遥测数据&#10;&lt;/h2&gt;&lt;p&gt;该 Ansible playbook 会自动配置为不发送服务器的使用情况，因此无需额外配置。&lt;/p&gt;&#10;&lt;h2 id="更改联邦通信的端口到443"&gt;&lt;del&gt;更改联邦通信的端口到443&lt;/del&gt;&#10;&lt;/h2&gt;&lt;p&gt;修改此项内容会导致&lt;code&gt;matrix-nginx-proxy.service&lt;/code&gt;服务因为443端口被docker-pr占用而无法正常启动，故暂时不配置此项内容。&lt;/p&gt;&#10;&lt;p&gt;&lt;del&gt;为了防止可能的DOS/DDOS攻击，我需要使用CDN。将用于联邦通信的端口改到443后，将能正常使用CDN。&lt;/del&gt;&lt;/p&gt;&#10;&lt;p&gt;&lt;del&gt;修改&lt;code&gt;inventory/host_vars/matrix.DOMAIN/vars.yml&lt;/code&gt;文件。&lt;/del&gt;&lt;/p&gt;&#10;&lt;pre&gt;&lt;code&gt;matrix_synapse_http_listener_resource_names: [&amp;quot;client&amp;quot;,&amp;quot;federation&amp;quot;]&#10;matrix_federation_public_port: 443&#10;matrix_synapse_federation_port_enabled: false&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;p&gt;&lt;del&gt;以下修改是为了适应一些CDN而做出的，可以先尝试一下，看看在设置以下内容为&lt;code&gt;true&lt;/code&gt;的情况下，联邦通信是否工作。如果不行再修改为&lt;code&gt;false&lt;/code&gt;。&lt;/del&gt;&lt;/p&gt;&#10;&lt;pre&gt;&lt;code&gt;matrix_synapse_tls_federation_listener_enabled: true&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;h2 id="邮件设置"&gt;邮件设置&#10;&lt;/h2&gt;&lt;p&gt;可以通过&lt;code&gt;matrix_mailer_sender_address&lt;/code&gt;变量来指定Matrix服务的发件人。默认为&lt;code&gt;matrix@&amp;lt;your-domain-name&amp;gt;&lt;/code&gt;，这里我保持默认。&lt;/p&gt;&#10;&lt;h2 id="身份服务"&gt;身份服务&#10;&lt;/h2&gt;&lt;p&gt;我的服务不打算开启ma1sd身份服务，因此不额外配置。&lt;/p&gt;&#10;&lt;h2 id="设置反垃圾信息服务"&gt;设置反垃圾信息服务&#10;&lt;/h2&gt;&lt;p&gt;修改&lt;code&gt;inventory/host_vars/matrix.DOMAIN/vars.yml&lt;/code&gt;文件。&lt;/p&gt;&#10;&lt;pre&gt;&lt;code&gt;matrix_synapse_ext_spam_checker_synapse_simple_antispam_enabled: true&#10;matrix_synapse_ext_spam_checker_synapse_simple_antispam_config_blocked_homeservers:&#10;- example.com&#10;- another.com&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;h1 id="防火墙设置"&gt;防火墙设置&#10;&lt;/h1&gt;&lt;p&gt;需要开放的端口有80和443用于Web,8448用于联邦通信,3478、5349、49152-49172用于TURN。如果配置了其他服务，其他可能用到端口可以在服务启动后通过&lt;code&gt;docker ps&lt;/code&gt;命令查看。&lt;/p&gt;&#10;&lt;h1 id="安装"&gt;安装&#10;&lt;/h1&gt;&lt;p&gt;运行以下命令安装：&lt;/p&gt;&#10;&lt;pre&gt;&lt;code&gt;ansible-playbook -i inventory/hosts setup.yml --tags=setup-all&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;p&gt;安装过程中可能需要输入SSH登陆信息。&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;Notes&lt;/strong&gt;:&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;如果你 &lt;strong&gt;不使用&lt;/strong&gt; SSH keys 来登陆服务器, 而是使用一般的密码，那在&lt;code&gt;ansible-playbook&lt;/code&gt;指令后添加&lt;code&gt;--ask-pass&lt;/code&gt;。&lt;/li&gt;&#10;&lt;li&gt;如果你 &lt;strong&gt;使用&lt;/strong&gt; SSH keys 来登陆服务器, &lt;strong&gt;并且&lt;/strong&gt; 登陆用户&lt;strong&gt;不是&lt;/strong&gt;root，而是能使用sudo的用户，你可能需要在&lt;code&gt;ansible-playbook&lt;/code&gt;指令后添加 &lt;code&gt;-K&lt;/code&gt; (&lt;code&gt;--ask-become-pass&lt;/code&gt;) 来让Ansible运行特权指令。&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h1 id="检查服务是否正确安装"&gt;检查服务是否正确安装&#10;&lt;/h1&gt;&lt;p&gt;运行以下命令开启服务：&lt;/p&gt;&#10;&lt;pre&gt;&lt;code&gt;ansible-playbook -i inventory/hosts setup.yml --tags=start&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;p&gt;在&lt;a class="link" href="https://federationtester.matrix.org/" target="_blank" rel="noopener"&#10; &gt;Federation Tester&lt;/a&gt;上输入你的服务器域名后可以测试联邦通信服务是否正常工作。&lt;/p&gt;&#10;&lt;p&gt;运行以下命令检查服务：&lt;/p&gt;&#10;&lt;pre&gt;&lt;code&gt;ansible-playbook -i inventory/hosts setup.yml --tags=self-check&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;h1 id="创建用户"&gt;创建用户&#10;&lt;/h1&gt;&lt;p&gt;接下来的很多组件需要用到已有的账户，因此在配置安装这些组件前需要先创建他们。通过以下命令可以创建账户：&lt;/p&gt;&#10;&lt;pre&gt;&lt;code&gt;ansible-playbook -i inventory/hosts setup.yml --extra-vars='username=&amp;lt;your-username&amp;gt; password=&amp;lt;your-password&amp;gt; admin=&amp;lt;yes|no&amp;gt;' --tags=register-user&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;p&gt;通过以下命令可以获取账户的访问令牌：&lt;/p&gt;&#10;&lt;pre&gt;&lt;code&gt;curl -X POST --header 'Content-Type: application/json' -d '{&#10; &amp;quot;identifier&amp;quot;: { &amp;quot;type&amp;quot;: &amp;quot;m.id.user&amp;quot;, &amp;quot;user&amp;quot;: &amp;quot;YourBotUsername&amp;quot; },&#10; &amp;quot;password&amp;quot;: &amp;quot;YourBotPassword&amp;quot;,&#10; &amp;quot;type&amp;quot;: &amp;quot;m.login.password&amp;quot;&#10;}' 'https://matrix.YOURDOMAIN/_matrix/client/r0/login'&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;p&gt;注意修改 &lt;code&gt;YourBotUsername&lt;/code&gt;, &lt;code&gt;YourBotPassword&lt;/code&gt;, 和 &lt;code&gt;YOURDOMAIN&lt;/code&gt; 为合适的值。&lt;/p&gt;&#10;&lt;h1 id="配置安装其他组件"&gt;配置安装其他组件&#10;&lt;/h1&gt;&lt;h2 id="设置-dimension"&gt;设置 Dimension&#10;&lt;/h2&gt;&lt;p&gt;创建名为&lt;code&gt;dimension&lt;/code&gt;的非管理员用户，并获取令牌。&lt;/p&gt;&#10;&lt;p&gt;修改&lt;code&gt;inventory/host_vars/matrix.DOMAIN/vars.yml&lt;/code&gt;文件。&lt;/p&gt;&#10;&lt;pre&gt;&lt;code&gt;matrix_dimension_enabled: true&#10;matrix_dimension_admins:&#10; - &amp;quot;@dimension:{{ matrix_domain }}&amp;quot;&#10;matrix_dimension_access_token: &amp;quot;YOUR ACCESS TOKEN HERE&amp;quot;&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;h2 id="服务器运行情况图表"&gt;服务器运行情况图表&#10;&lt;/h2&gt;&lt;p&gt;修改&lt;code&gt;inventory/host_vars/matrix.DOMAIN/vars.yml&lt;/code&gt;文件。&lt;/p&gt;&#10;&lt;pre&gt;&lt;code&gt;matrix_prometheus_enabled: true&#10;&#10;# You can remove this, if unnecessary.&#10;matrix_prometheus_node_exporter_enabled: true&#10;&#10;# You can remove this, if unnecessary.&#10;matrix_prometheus_postgres_exporter_enabled: true&#10;&#10;matrix_grafana_enabled: true&#10;&#10;matrix_grafana_anonymous_access: false&#10;&#10;# This has no relation to your Matrix user id. It can be any username you'd like.&#10;# Changing the username subsequently won't work.&#10;matrix_grafana_default_admin_user: &amp;quot;some_username_chosen_by_you&amp;quot;&#10;&#10;# Changing the password subsequently won't work.&#10;matrix_grafana_default_admin_password: &amp;quot;some_strong_password_chosen_by_you&amp;quot;&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;p&gt;默认的管理员账户和密码与matrix服务器的账户无关，自行选择设置即可。安装后可登陆&lt;code&gt;https://stats.DOMAIN&lt;/code&gt;查看服务器资源占用情况和历史数据。&lt;/p&gt;&#10;&lt;h2 id="设置注册机器人-matrix-registration-bot"&gt;设置注册机器人 matrix-registration-bot&#10;&lt;/h2&gt;&lt;p&gt;出于安全和服务器承载能力的考虑，我不打算开放注册。因此需要工具来管理邀请令牌。matrix-registration缺乏维护且存在bug，因此我选择部署matrix-registration-bot服务。&#10;创建一个管理员用户，名称不限，并获取令牌。该服务默认使用的管理员账户名称是&lt;code&gt;@bot.matrix-registration-bot:DOMAIN&lt;/code&gt;。&lt;/p&gt;&#10;&lt;p&gt;修改&lt;code&gt;inventory/host_vars/matrix.DOMAIN/vars.yml&lt;/code&gt;文件，添加以下内容。&lt;/p&gt;&#10;&lt;pre&gt;&lt;code&gt;matrix_bot_matrix_registration_bot_enabled: true&#10;# Token obtained via logging into the bot account (see above)&#10;matrix_bot_matrix_registration_bot_bot_access_token: &amp;quot;syt_bW9hbm9z_XXXXXXXXXXXXXr_2kuzbE&amp;quot;&#10;&#10;# Enables registration&#10;matrix_synapse_enable_registration: true&#10;&#10;# Restrict registration to users with a token&#10;matrix_synapse_registration_requires_token: true&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;p&gt;如果需要用自定义的管理员账户，添加&lt;/p&gt;&#10;&lt;pre&gt;&lt;code&gt;matrix_bot_matrix_registration_bot_matrix_user_id_localpart: XXX&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;p&gt;该服务安装完成后，创建一个&lt;strong&gt;非加密的聊天室&lt;/strong&gt;，邀请你创建的机器人的账号进入该聊天室。注意不要直接查找机器人账号后开启聊天，这种方式创建的聊天室是加密的，机器人无法在加密的聊天室中使用。&lt;/p&gt;&#10;&lt;p&gt;在该聊天室中发送&lt;code&gt;help&lt;/code&gt;命令即可了解详细的使用方法。&lt;/p&gt;&#10;&lt;p&gt;其他信息可以查看 &lt;a class="link" href="https://github.com/moan0s/matrix-registration-bot#supported-commands" target="_blank" rel="noopener"&#10; &gt;使用说明&lt;/a&gt;.&lt;/p&gt;&#10;&lt;p&gt;如果更换过机器人的账户或者机器人账户的令牌，再次部署前需要删除&lt;code&gt;/matrix/matrix-registration-bot/data/session.txt&lt;/code&gt;，否则会部署失败。&lt;/p&gt;&#10;&lt;h2 id="recaptcha验证"&gt;ReCaptcha验证&#10;&lt;/h2&gt;&lt;p&gt;本次使用的&lt;a class="link" href="https://github.com/spantaleev/matrix-docker-ansible-deploy" target="_blank" rel="noopener"&#10; &gt;Ansible Playbook&lt;/a&gt;对于Synapse只支持Google的&lt;a class="link" href="https://www.google.com/recaptcha/" target="_blank" rel="noopener"&#10; &gt;ReCaptcha&lt;/a&gt;，如果使用Dendrite的话额外支持&lt;a class="link" href="https://www.hcaptcha.com" target="_blank" rel="noopener"&#10; &gt;hCapcha&lt;/a&gt;。因此我只能选择部署ReCaptcha服务。&lt;/p&gt;&#10;&lt;p&gt;首先需要通过以下链接申请ReCaptcha的公钥和私钥。&lt;/p&gt;&#10;&lt;p&gt;&lt;a class="link" href="http://www.google.com/recaptcha/admin" target="_blank" rel="noopener"&#10; &gt;http://www.google.com/recaptcha/admin&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;注意reCAPTCHA类型要选择 &lt;strong&gt;第2版&lt;/strong&gt; 和 &lt;strong&gt;“进行人机身份验证”复选框&lt;/strong&gt;。&lt;/p&gt;&#10;&lt;p&gt;之后复制公钥（发送给用户）和私钥（用于Synapse服务器和Google的reCAPTCHA服务器之间通信）。&lt;/p&gt;&#10;&lt;p&gt;修改&lt;code&gt;inventory/host_vars/matrix.DOMAIN/vars.yml&lt;/code&gt;文件，添加以下内容。&lt;/p&gt;&#10;&lt;pre&gt;&lt;code&gt;matrix_synapse_enable_registration_captcha: true&#10;matrix_synapse_recaptcha_public_key: 'YOUR_SITE_KEY'&#10;matrix_synapse_recaptcha_private_key: 'YOUR_SECRET_KEY'&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;h2 id="备份-borg-backup"&gt;备份 borg backup&#10;&lt;/h2&gt;&lt;pre&gt;&lt;code&gt;TODO&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;h2 id="推送服务"&gt;推送服务&#10;&lt;/h2&gt;&lt;p&gt;ntfy是一个使用&lt;a class="link" href="https://unifiedpush.org" target="_blank" rel="noopener"&#10; &gt;UnifiedPush&lt;/a&gt;标准的推送服务器，可以替代Google的FCM或者Apple的APN服务。&lt;/p&gt;&#10;&lt;p&gt;修改&lt;code&gt;inventory/host_vars/matrix.DOMAIN/vars.yml&lt;/code&gt;文件，添加以下内容。&lt;/p&gt;&#10;&lt;pre&gt;&lt;code&gt;# Enabling it is the only required setting&#10;matrix_ntfy_enabled: true&#10;# Some other options&#10;matrix_server_fqn_ntfy: &amp;quot;ntfy.{{ matrix_domain }}&amp;quot;&#10;matrix_ntfy_configuration_extension_yaml: |&#10; log_level: DEBUG&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;h2 id="再次配置服务"&gt;再次配置服务&#10;&lt;/h2&gt;&lt;p&gt;修改配置文件后运行以下命令再次配置服务。&lt;/p&gt;&#10;&lt;pre&gt;&lt;code&gt;ansible-playbook -i inventory/hosts setup.yml --tags=setup-all,start&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;h2 id="更新服务"&gt;更新服务&#10;&lt;/h2&gt;&lt;p&gt;用&lt;code&gt;git pull&lt;/code&gt;更新仓库后阅读&lt;a class="link" href="https://github.com/spantaleev/matrix-docker-ansible-deploy/blob/master/CHANGELOG.md" target="_blank" rel="noopener"&#10; &gt;changelog&lt;/a&gt;，确认配置文件无误后运行以下命令。&lt;/p&gt;&#10;&lt;pre&gt;&lt;code&gt;ansible-playbook -i inventory/hosts setup.yml --tags=setup-all,ensure-matrix-users-created,start&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;h1 id="总结"&gt;总结&#10;&lt;/h1&gt;&lt;p&gt;虽然研究如何修改&lt;a class="link" href="https://github.com/spantaleev/matrix-docker-ansible-deploy" target="_blank" rel="noopener"&#10; &gt;Ansible Playbook&lt;/a&gt;花费了不少时间，但修改完成后的自动部署就非常方便了，输入部署命令后只需要开着终端等待就行。刚开始因为一些配置问题导致部署失败，但根据软件仓库的issue信息找到问题并解决了。目前大部分有关Matrix服务器的教程都没有用到Ansible，因此我记录下我的部署过程作为参考，希望能给读者提供另一种部署Matrix服务的思路。固然直接部署灵活性更高，且如果仅仅部署Synapse本体，花费时间未必比使用Ansible多，但如果需要部署大量配套服务，还是Ansible更加方便省力。个人认为这个&lt;a class="link" href="https://github.com/spantaleev/matrix-docker-ansible-deploy" target="_blank" rel="noopener"&#10; &gt;Ansible Playbook&lt;/a&gt;的唯一问题就是部署时间长，在单核VPS上每次部署都要等待20分钟以上。&lt;/p&gt;&#10;&lt;h1 id="补充"&gt;补充&#10;&lt;/h1&gt;&lt;p&gt;2022-12-28：&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;如果在MacOS下运行Ansible时可能会在配置PostgreSQL时遇到&lt;code&gt;crypt.crypt not supported on Mac OS X/Darwin&lt;/code&gt;错误，按提示安装Python包&lt;code&gt;py-passlib&lt;/code&gt;；&lt;/li&gt;&#10;&lt;li&gt;由于matrix-docker-ansible-deploy项目的更新，老用户的&lt;code&gt;inventory/host_vars/matrix.&amp;lt;your-domain&amp;gt;/vars.yml&lt;/code&gt;文件中的&lt;code&gt;matrix_postgres_&lt;/code&gt;开头的模块需要替换为&lt;code&gt;devture_postgres_&lt;/code&gt;开头才能正常使用，新用户不受影响。&lt;/li&gt;&#10;&lt;/ul&gt;</description></item></channel></rss>