<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>软件配置 on CTmH</title><link>/categories/%E8%BD%AF%E4%BB%B6%E9%85%8D%E7%BD%AE/</link><description>Recent content in 软件配置 on CTmH</description><generator>Hugo -- gohugo.io</generator><language>zh</language><lastBuildDate>Wed, 05 Oct 2022 00:00:00 +0000</lastBuildDate><atom:link href="/categories/%E8%BD%AF%E4%BB%B6%E9%85%8D%E7%BD%AE/index.xml" rel="self" type="application/rss+xml"/><item><title>安装和配置电子邮件服务端软件 Mailu</title><link>/p/%E5%AE%89%E8%A3%85%E5%92%8C%E9%85%8D%E7%BD%AE%E7%94%B5%E5%AD%90%E9%82%AE%E4%BB%B6%E6%9C%8D%E5%8A%A1%E7%AB%AF%E8%BD%AF%E4%BB%B6-mailu/</link><pubDate>Wed, 05 Oct 2022 00:00:00 +0000</pubDate><guid>/p/%E5%AE%89%E8%A3%85%E5%92%8C%E9%85%8D%E7%BD%AE%E7%94%B5%E5%AD%90%E9%82%AE%E4%BB%B6%E6%9C%8D%E5%8A%A1%E7%AB%AF%E8%BD%AF%E4%BB%B6-mailu/</guid><description>&lt;img src="/p/%E5%AE%89%E8%A3%85%E5%92%8C%E9%85%8D%E7%BD%AE%E7%94%B5%E5%AD%90%E9%82%AE%E4%BB%B6%E6%9C%8D%E5%8A%A1%E7%AB%AF%E8%BD%AF%E4%BB%B6-mailu/mailu_webui.png" alt="Featured image of post 安装和配置电子邮件服务端软件 Mailu" /&gt;&lt;p&gt;Mailu是一个简单但功能齐全的邮件服务器，通过一套Docker镜像来组织服务。当然它是自由软件。该项目提供了一个易于设置、易于维护和功能齐全的邮件服务器，同时不提供专有软件中经常出现的无关功能。&lt;/p&gt;&#10;&lt;p&gt;建议以开发者给出的&lt;a class="link" href="https://mailu.io/" target="_blank" rel="noopener"&#10; &gt;文档&lt;/a&gt;为主要参考，本文仅作为补充。本文安装的版本是1.9稳定版。写下本文时，podman-compose还不能正确解析mailu的&lt;code&gt;docker-compose.yml&lt;/code&gt;文件中的子网设置部分，因此除非后续podman-compose更新解决这一问题，否则不要用podman来替代docker。安装docker的方法此处略过。&lt;/p&gt;&#10;&lt;h1 id="配置dns"&gt;配置DNS&#10;&lt;/h1&gt;&lt;p&gt;访问域名供应商或者DNS服务供应商。向DNS中添加&lt;strong&gt;A&lt;/strong&gt;类记录。&lt;code&gt;a.b.c.d&lt;/code&gt;是服务器的地址。&lt;/p&gt;&#10;&lt;pre&gt;&lt;code&gt;mail.mydomain.com. IN A a.b.c.d&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;p&gt;再添加一条&lt;strong&gt;MX&lt;/strong&gt;类记录，指向服务器&lt;code&gt;mail.mydomain.com&lt;/code&gt;。&lt;/p&gt;&#10;&lt;pre&gt;&lt;code&gt;mydomain.com. IN MX 10 mail.mydomain.com.&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;p&gt;再访问VPS供应商，写入一条rDNS记录。rDNS记录是从IP地址&lt;code&gt;a.b.c.d&lt;/code&gt;到域名&lt;code&gt;mail.mydomain.com&lt;/code&gt;的反向解析，因此需要通过VPS供应商来设置。&lt;/p&gt;&#10;&lt;h1 id="配置防火墙"&gt;配置防火墙&#10;&lt;/h1&gt;&lt;p&gt;通过SSH连接到服务器后，首先配置防火墙。可以选择安装ufw来间接配置或者直接配置iptables，我觉得ufw更加方便。配置防火墙需要以root身份或使用sudo。&lt;/p&gt;&#10;&lt;p&gt;ufw自带了根据应用预设的防火墙配置，需要打开其中的&lt;code&gt;OpenSSH&lt;/code&gt;、&lt;code&gt;Nginx Full&lt;/code&gt;、&lt;code&gt;Mail submission&lt;/code&gt;、&lt;code&gt;SMTP&lt;/code&gt;、&lt;code&gt;POP3&lt;/code&gt;、&lt;code&gt;POP3S&lt;/code&gt;、&lt;code&gt;IMAP&lt;/code&gt;、&lt;code&gt;IMAPS&lt;/code&gt;。注意&lt;code&gt;OpenSSH&lt;/code&gt;一定要打开，否则会和服务器丢失连接，如果修改过SSH的端口，也要记得打开相应端口。除了以上预设配置外，需要额外开启端口&lt;code&gt;465&lt;/code&gt;用于TLS的SMTP通信、端口&lt;code&gt;587&lt;/code&gt;用于STARTLS的SMTP通信，端口&lt;code&gt;5432&lt;/code&gt;用于Mailu从其容器中访问Postgresql。ufw添加规则的方法如下。&lt;/p&gt;&#10;&lt;p&gt;添加预设规则（如&lt;code&gt;Mail submission&lt;/code&gt;）：&lt;/p&gt;&#10;&lt;pre&gt;&lt;code&gt;sudo ufw allow &amp;quot;Mail submission&amp;quot;&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;p&gt;打开指定端口（如&lt;code&gt;465&lt;/code&gt;）的TCP功能：&lt;/p&gt;&#10;&lt;pre&gt;&lt;code&gt;sudo ufw allow 465/tcp&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;p&gt;添加后使用以下命令查看规则。&lt;/p&gt;&#10;&lt;pre&gt;&lt;code&gt;sudo ufw status numbered&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;p&gt;根据以上命令列出的规则编号删除规则。比如删除11号规则：&lt;/p&gt;&#10;&lt;pre&gt;&lt;code&gt;sudo ufw delete 11&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;p&gt;以上命令删除多个规则时，不能一次填写多个编号。由于删除规则后规则编号会变化，需要重新查看规则编号，修改后再次执行以上命令。&lt;/p&gt;&#10;&lt;p&gt;设置好规则后激活生效。&lt;/p&gt;&#10;&lt;pre&gt;&lt;code&gt;sudo ufw enable&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;h1 id="安装和配置postgresql"&gt;安装和配置Postgresql&#10;&lt;/h1&gt;&lt;p&gt;为了方便，我也使用docker来安装postgresql数据库管理软件。以下的配置里Postgresql的容器和Mailu的容器运行在同一个服务器上。&lt;/p&gt;&#10;&lt;p&gt;使用docker时需要以root身份或使用sudo，本文中的docker相关操作都通过sudo运行。为了方便之后的配置，这里最好使用默认端口号5432。注意替换&lt;code&gt;POSTGRES_PASSWORD=your-password&lt;/code&gt;部分。&lt;/p&gt;&#10;&lt;pre&gt;&lt;code&gt;sudo docker run -it --name postgresql-default --restart always -e POSTGRES_PASSWORD=your-password -v /srv/postgresql-data:/var/lib/postgresql/data -e POSTGRES_INITDB_ARGS=&amp;quot;--data-checksums&amp;quot; -p 5432:5432 postgres&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;p&gt;连接到docker中配置数据库&lt;/p&gt;&#10;&lt;pre&gt;&lt;code&gt;sudo docker exec -it postgresql-default psql -U postgres -d postgres&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;p&gt;之后创建mailu用户和相应的数据库。注意替换&lt;code&gt;my_secure_pass&lt;/code&gt;部分。&lt;/p&gt;&#10;&lt;pre&gt;&lt;code&gt;postgres=# create user mailu;&#10;postgres=# alter user mailu password 'my_secure_pass';&#10;postgres=# create database mailu owner mailu;&#10;postgres=# \c mailu&#10;mailu=# create extension citext;&#10;mailu=# \q&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;p&gt;注意记录数据库用户mailu的密码。由于Mailu服务的各个容器位于另一个子网中，为了Mailu能够顺利访问数据库，需要设置Postgresql的访问权限。&lt;/p&gt;&#10;&lt;p&gt;在当前目录创建&lt;code&gt;pg_hba.conf&lt;/code&gt;文件，其中的内容类似于：&lt;/p&gt;&#10;&lt;pre&gt;&lt;code&gt;# TYPE DATABASE USER ADDRESS METHOD&#10;&#10;# &amp;quot;local&amp;quot; is for Unix domain socket connections only&#10;local all all trust&#10;# IPv4 local connections:&#10;host all all 127.0.0.1/32 trust&#10;# IPv6 local connections:&#10;host all all ::1/128 trust&#10;# Allow replication connections from localhost, by a user with the&#10;# replication privilege.&#10;local replication all trust&#10;host replication all 127.0.0.1/32 trust&#10;host replication all ::1/128 trust&#10;host mailu mailu 172.17.0.0/16 md5&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;p&gt;注意将类似&lt;code&gt;host all all all scram-sha-256&lt;/code&gt;的部分删除，阻止其他远程访问请求。限定除了本机通信外（如&lt;code&gt;127.0.0.1/32&lt;/code&gt;和&lt;code&gt;::1/128&lt;/code&gt;），只有用户&lt;code&gt;mailu&lt;/code&gt;能从Docker的网段&lt;code&gt;172.17.0.0/16&lt;/code&gt;访问数据库&lt;code&gt;mailu&lt;/code&gt;。&#10;然后将配置文件覆盖到Postgresql的容器中并重启数据库。&lt;/p&gt;&#10;&lt;pre&gt;&lt;code&gt;sudo docker cp ~/pg_hba.conf postgresql-default:/var/lib/postgresql/data/pg_hba.conf&#10;sudo docker restart postgresql-default&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;p&gt;为了验证数据库可用，可以尝试在服务器的Shell中尝试连接到数据库。&lt;/p&gt;&#10;&lt;pre&gt;&lt;code&gt;psql -U mailu -d mailu -h 127.0.0.1&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;h1 id="生成mailu配置文件"&gt;生成Mailu配置文件&#10;&lt;/h1&gt;&lt;p&gt;Mailu的开发者们提供了一个&lt;a class="link" href="https://setup.mailu.io/" target="_blank" rel="noopener"&#10; &gt;Web应用&lt;/a&gt;来生成配置文件。开发者提供了配置建议，非常方便。需要注意的是 &lt;em&gt;TLS certificates&lt;/em&gt; 、&lt;em&gt;Database preferences&lt;/em&gt; 和 &lt;em&gt;IPv4 listen address&lt;/em&gt; 选项。&lt;/p&gt;&#10;&lt;p&gt;由于我打算使用外置的Nginx服务器作为反向代理，因此 &lt;em&gt;TLS certificates&lt;/em&gt; 可以选择 &lt;code&gt;mail&lt;/code&gt; 或者 &lt;code&gt;mail-letsencrypt&lt;/code&gt; 。这两个选项意味着将Web的TLS交给反向代理服务器来处理，Mailu的Web服务只需处理HTTP协议的通信，而IMAP、POP、SMTP的TLS还是由Mailu来处理。选项 &lt;code&gt;mail&lt;/code&gt; 意味着使用手动安装的证书，需要在 &lt;em&gt;Mailu storage path&lt;/em&gt; 项目里填写的目录下创建 &lt;code&gt;certs&lt;/code&gt; 文件夹，并在其中安装证书文件&lt;code&gt;cert.pem&lt;/code&gt;和密钥文件&lt;code&gt;key.pem&lt;/code&gt;。当然也可以在之后生成的&lt;code&gt;mailu.env&lt;/code&gt;文件中通过变量&lt;code&gt;TLS_CERT_FILENAME&lt;/code&gt;和&lt;code&gt;TLS_KEYPAIR_FILENAME&lt;/code&gt;来更改这两个文件的名称。如果选择&lt;code&gt;mail-letsencrypt&lt;/code&gt;，则Mailu服务会自动申请并安装证书。服务器上没有其他占用80和443端口的服务时，可以不使用反向代理，此时这里可以选择&lt;code&gt;letsencrypt&lt;/code&gt;。&lt;/p&gt;&#10;&lt;p&gt;如果和我一样使用外置的Postgresql数据库管理软件，则在&lt;em&gt;Database preferences&lt;/em&gt;中选择&lt;code&gt;postgresql&lt;/code&gt;并填写上一步里配置的信息即可。注意在数据库的地址栏中要填写数据库的真实地址，不要填写&lt;code&gt;127.0.0.1&lt;/code&gt;。也不要添加端口号，如果在地址里添加了端口号（如&lt;code&gt;1.1.1.1:5432&lt;/code&gt;），会导致后续解析数据库地址时出错，因此之前配置数据库时建议不要更改默认端口。&lt;/p&gt;&#10;&lt;p&gt;Mailu的开发者建议在 &lt;em&gt;IPv4 listen address&lt;/em&gt; 中填写实际的IPv4地址。注意在此处填写实际IPv4地址时，Nginx的配置需要做针对性修改，在下文中将会说明。&lt;/p&gt;&#10;&lt;p&gt;为了方便使用，我选择安装了WebUI（对应选项&lt;code&gt;WebMail&lt;/code&gt;）和管理员后台AdminUI。在&lt;code&gt;WebMail&lt;/code&gt;处可以根据喜好选择两种不同风格的UI。&lt;/p&gt;&#10;&lt;p&gt;根据提示填写完所有信息后，点击生成按钮。此时根据跳转后页面中Step1的提示，创建项目文件夹并下载生成的配置文件&lt;code&gt;docker-compose.yml&lt;/code&gt;和&lt;code&gt;mailu.env&lt;/code&gt;。此时先不要按Step3操作。&lt;/p&gt;&#10;&lt;h1 id="配置nginx服务器"&gt;配置Nginx服务器&#10;&lt;/h1&gt;&lt;p&gt;由于服务器上会运行各不相同的服务，相应的配置也千差万别，因此本节仅说明配置Nginx作为反向代理时可能出错的地方。如果不想使用反向代理，可以直接跳过这一节。&lt;/p&gt;&#10;&lt;p&gt;首先修改之前生成并下载到本地的配置文件&lt;code&gt;docker-compose.yml&lt;/code&gt;。找到&lt;code&gt;# Core services&lt;/code&gt;部分，修改容器中的&lt;code&gt;80&lt;/code&gt;和&lt;code&gt;443&lt;/code&gt;在服务器上对应的端口，比如我改为了&lt;code&gt;8080&lt;/code&gt;和&lt;code&gt;8443&lt;/code&gt;。这样就不会和监听&lt;code&gt;80&lt;/code&gt;和&lt;code&gt;443&lt;/code&gt;端口的Nginx冲突。修改后的&lt;code&gt;ports&lt;/code&gt;前两行如下：&lt;/p&gt;&#10;&lt;pre&gt;&lt;code&gt;ports:&#10; - &amp;quot;x.x.x.x:8080:80&amp;quot;&#10; - &amp;quot;x.x.x.x:8443:443&amp;quot;&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;p&gt;修改&lt;code&gt;mailu.env&lt;/code&gt;文件中的&lt;code&gt;REAL_IP_HEADER&lt;/code&gt;和&lt;code&gt;REAL_IP_FROM&lt;/code&gt;部分。&lt;code&gt;x.x.x.x&lt;/code&gt;替换为服务器真实IPv4地址。&lt;/p&gt;&#10;&lt;pre&gt;&lt;code&gt;REAL_IP_HEADER=X-Real-IP&#10;REAL_IP_FROM=x.x.x.x&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;p&gt;此处给出Nginx配置文件的一种写法，更多的配置模板请参考&lt;a class="link" href="https://mailu.io/1.9/reverse.html#have-mailu-web-frontend-listen-locally" target="_blank" rel="noopener"&#10; &gt;文档&lt;/a&gt;。修改Nginx配置后需要重新加载Nginx服务。&lt;/p&gt;&#10;&lt;pre&gt;&lt;code&gt;server {&#10; listen 443 ssl http2 reuseport;&#10; server_name mail.yourdomain.com;&#10; charset utf-8;&#10;&#10; # ssl&#10; ssl_protocols TLSv1.2 TLSv1.3;&#10; ssl_prefer_server_ciphers on;&#10; ssl_session_cache shared:SSL:40m;&#10; ssl_session_timeout 5m;&#10; ssl_session_tickets off;&#10; ssl_certificate /path/to/fullchain.pem;&#10; ssl_certificate_key /path/to/privkey.pem;&#10;&#10; # OCSP stapling&#10; ssl_stapling on;&#10; ssl_stapling_verify on;&#10;&#10; add_header Strict-Transport-Security &amp;quot;max-age=63072000&amp;quot;;&#10;&#10; location / {&#10; proxy_set_header Host $host;&#10; proxy_set_header X-Real-IP $remote_addr;&#10; proxy_set_header WL-Proxy-SSL true;&#10; proxy_set_header X-Forwarded-For $remote_addr;&#10; client_max_body_size 64M;&#10; proxy_pass http://a.b.c.d:8080;&#10; }&#10;}&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;p&gt;&lt;code&gt;server_name&lt;/code&gt;处需要根据之前的DNS记录填写，&lt;code&gt;ssl_certificate&lt;/code&gt;和&lt;code&gt;ssl_certificate_key&lt;/code&gt;处需要填写SSL证书的路径。如果还没有证书，可以通过&lt;a class="link" href="https://github.com/acmesh-official/acme.sh/wiki/%E8%AF%B4%E6%98%8E" target="_blank" rel="noopener"&#10; &gt;acme.sh&lt;/a&gt;获取证书。此处略过获取证书的过程。&lt;/p&gt;&#10;&lt;p&gt;&lt;code&gt;location&lt;/code&gt;中的&lt;code&gt;proxy_set_header&lt;/code&gt;参照以上例子填写即可。但需要特别注意&lt;code&gt;proxy_pass&lt;/code&gt;后需要填写服务器的&lt;strong&gt;真实IPv4地址&lt;/strong&gt;，而&lt;strong&gt;不能&lt;/strong&gt;填写&lt;code&gt;127.0，0，1&lt;/code&gt;之类的地址，后续遇到&lt;strong&gt;502错误&lt;/strong&gt;时可以重点检查此处的信息是否填写正确。&lt;/p&gt;&#10;&lt;h1 id="安装和运行mailu容器"&gt;安装和运行Mailu容器&#10;&lt;/h1&gt;&lt;p&gt;确认配置文件无误后按照Step3的提示进入项目目录并启动服务。&lt;/p&gt;&#10;&lt;pre&gt;&lt;code&gt;cd /srv/mailu&#10;sudo docker-compose -p mailu up -d&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;p&gt;服务启动后添加管理员用户，以&lt;code&gt;adminuser&lt;/code&gt;为例。&lt;/p&gt;&#10;&lt;pre&gt;&lt;code&gt;sudo docker-compose -p mailu exec admin flask mailu admin adminuser yourdomain.com PASSWORD&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;p&gt;参照Step3的说明，&lt;code&gt;PASSWORD&lt;/code&gt;处的初始密码可以在之后进入管理界面修改。如果在添加用户这一步报错，并提示无法访问Postgresql，需要检查Postgresql的访问设置&lt;code&gt;pg_hba.conf&lt;/code&gt;和防火墙的设置。先关闭Mailu服务。&lt;/p&gt;&#10;&lt;pre&gt;&lt;code&gt;sudo docker-compose -p mailu down&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;p&gt;修改相关设置后重启服务。&lt;/p&gt;&#10;&lt;pre&gt;&lt;code&gt;sudo docker-compose -p mailu up -d&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;p&gt;如果添加用户过程中出现过错误，需要删除Postgresql中的数据库&lt;code&gt;mailu&lt;/code&gt;并按照上文中的方法新建数据库&lt;code&gt;mailu&lt;/code&gt;，否则会遇到Postgresql找不到域(Domain)的错误。&lt;/p&gt;&#10;&lt;p&gt;之后可以添加一个普通用户（比如&lt;code&gt;myuser&lt;/code&gt;）来测试收发邮件是否正常。&lt;/p&gt;&#10;&lt;pre&gt;&lt;code&gt;sudo docker-compose exec admin flask mailu user myuser yourdomain.com 'password123'&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;p&gt;用网页访问mail.mydomain.com，登陆后即可测试相关功能。&lt;/p&gt;&#10;&lt;h1 id="维护服务器"&gt;维护服务器&#10;&lt;/h1&gt;&lt;p&gt;后续维护和功能设置可以参考&lt;a class="link" href="https://mailu.io/1.9/maintain.html" target="_blank" rel="noopener"&#10; &gt;文档&lt;/a&gt;。&lt;/p&gt;</description></item><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>