本文介绍在Fedora CoreOS操作系统上部署Matrix服务器的方法。运行Matrix服务需要的软件有:Synapse(Matrix服务器)、PostgreSQL数据库、Nginx(Web服务器)、Element(Matrix Web客户端)、Let’s Encrypt(证书)。本文将演示如何在同一FCOS服务器上的容器中运行上述所有软件,所有服务都将配置为在podman容器引擎下运行。
组装FCCT配置 在主机上配置和配置这些容器需要Ignition文件,FCCT使用YAML配置文件作为输入来生成ignition文件,在Fedora Linux上,您可以使用dnf安装FCCT: $ sudo dnf install fcct GitHub存储库可供读者使用(地址:https://github.com/travier/fedora-coreos-matrix),它包含所有需要的配置和一个基本模板系统,以简化配置的个性化设置,这些模板值使用%%VARIABLE%%格式,并且每个变量都在名为secrets的文件中定义。 1、用户和SSH访问 第一步配置是为默认用户核心定义SSH密钥。 variant: fcos version: 1.3.0 passwd: users: - name: core ssh_authorized_keys: - %%SSH_PUBKEY%% 2、Cgroups v2 Fedora CoreOS(Fedora CoreOS版本详细介绍:用于安全和大规模运行容器化工作负载)默认带有cgroups版本1,但是可以配置为使用cgroups v2。使用最新版本的cgroup可以更好地控制主机资源以及其他新功能。 切换到cgroups v2是通过systemd服务完成的,该服务修改内核参数并在首次引导时重新引导主机。 systemd: units: - name: cgroups-v2-karg.service enabled: true contents: | [Unit] Description=Switch To cgroups v2 After=systemd-machine-id-commit.service ConditionKernelCommandLine=systemd.unified_cgroup_hierarchy ConditionPathExists=!/var/lib/cgroups-v2-karg.stamp [Service] Type=oneshot RemainAfterExit=yes ExecStart=/bin/rpm-ostree kargs --delete=systemd.unified_cgroup_hierarchy ExecStart=/bin/touch /var/lib/cgroups-v2-karg.stamp ExecStart=/bin/systemctl --no-block reboot [Install] WantedBy=multi-user.target 3、Podman pod Podman支持Podman的创建。当您需要在同一网络名称空间中将容器分组在一起时,Pod非常方便。容器中的容器可以使用本地主机地址相互通信。 创建并配置一个Pod以运行Matrix所需的各种服务: - name: podmanpod.service enabled: true contents: | [Unit] Description=Creates a podman pod to run the matrix services. After=cgroups-v2-karg.service network-online.target Wants=After=cgroups-v2-karg.service network-online.target [Service] Type=oneshot RemainAfterExit=yes ExecStart=sh -c 'podman pod exists matrix || podman pod create -n matrix -p 80:80 -p 443:443 -p 8448:8448' [Install] WantedBy=multi-user.target 使用Pod的另一个好处是,我们可以从整个Pod中控制哪些端口开放给主机。在这里,我们向主机公开端口80、443(HTTP和HTTPS)和8448(矩阵联合),以使这些服务在Pod之外可用。 参考:在Fedora操作系统上将pod与Podman一起使用。 4、具有“加密”功能的网络服务器(使用Let’s Encrypt) Matrix协议基于HTTP。客户端通过HTTPS连接到其家庭服务器。Matrix家庭服务器之间的联合也通过HTTPS完成。对于此设置,您将需要三个域。使用不同的域有助于隔离每个服务,并防止跨站点脚本(XSS)漏洞。 example.tld:家庭服务器的基本域。这将是用户矩阵ID的一部分(例如:@username:example.tld)。 matrix.example.tld:Synapse Matrix服务器的子域。 chat.example.tld:Element Web客户端的子域。 为了简化配置,您只需在secrets文件中设置一次您自己的域。 您需要在三个域中的每个域的首次启动时要求“Let’s Encrypt”证书。确保将域预先配置为解析为将分配给服务器的IP地址。如果您不知道预先将哪个IP地址分配给服务器,则可能要使用另一种ACME质询方法来获取“Let’s Encrypt”证书。 - name: certbot-firstboot.service enabled: true contents: | [Unit] Description=Run certbot to get certificates ConditionPathExists=!/var/srv/matrix/letsencrypt-certs/archive After=podmanpod.service network-online.target nginx-http.service Wants=network-online.target Requires=podmanpod.service nginx-http.service [Service] Type=oneshot ExecStart=/bin/podman run \ --name=certbot \ --pod=matrix \ --rm \ --cap-drop all \ --volume /var/srv/matrix/letsencrypt-webroot:/var/lib/letsencrypt:rw,z \ --volume /var/srv/matrix/letsencrypt-certs:/etc/letsencrypt:rw,z \ docker.io/certbot/certbot:latest \ --agree-tos --webroot certonly [Install] WantedBy=multi-user.target 一旦证书可用,就可以启动nginx的最终实例。Nginx将充当服务的HTTPS反向代理。 - name: nginx.service enabled: true contents: | [Unit] Description=Run the nginx server After=podmanpod.service network-online.target certbot-firstboot.service Wants=network-online.target Requires=podmanpod.service certbot-firstboot.service [Service] ExecStartPre=/bin/podman pull docker.io/nginx:stable ExecStart=/bin/podman run \ --name=nginx \ --pull=always \ --pod=matrix \ --rm \ --volume /var/srv/matrix/nginx/nginx.conf:/etc/nginx/nginx.conf:ro,z \ --volume /var/srv/matrix/nginx/dhparam:/etc/nginx/dhparam:ro,z \ --volume /var/srv/matrix/letsencrypt-webroot:/var/www:ro,z \ --volume /var/srv/matrix/letsencrypt-certs:/etc/letsencrypt:ro,z \ --volume /var/srv/matrix/well-known:/var/well-known:ro,z \ docker.io/nginx:stable ExecStop=/bin/podman rm --force --ignore nginx [Install] WantedBy=multi-user.target 由于“Let’s Encrypt”证书的寿命很短,因此必须经常更新。设置系统计时器以自动续订: - name: certbot.timer enabled: true contents: | [Unit] Description=Weekly check for certificates renewal [Timer] OnCalendar=Sun --* 02:00:00 Persistent=true [Install] WantedBy=timers.target - name: certbot.service enabled: false contents: | [Unit] Description=Let's Encrypt certificate renewal ConditionPathExists=/var/srv/matrix/letsencrypt-certs/archive After=podmanpod.service network-online.target Wants=network-online.target Requires=podmanpod.service [Service] Type=oneshot ExecStart=/bin/podman run \ --name=certbot \ --pod=matrix \ --rm \ --cap-drop all \ --volume /var/srv/matrix/letsencrypt-webroot:/var/lib/letsencrypt:rw,z \ --volume /var/srv/matrix/letsencrypt-certs:/etc/letsencrypt:rw,z \ docker.io/certbot/certbot:latest \ renew ExecStartPost=/bin/systemctl restart --no-block nginx.service 5、Synapse和数据库 最后,配置Synapse服务器和PostgreSQL数据库。 Synapse服务器需要配置并生成密钥。请按照前面的GitHub存储库的README文件部分进行生成。 完成这些步骤后,使用podman添加systemd服务以将Synapse作为容器运行。 - name: synapse.service enabled: true contents: | [Unit] Description=Run the synapse service. After=podmanpod.service network-online.target Wants=network-online.target Requires=podmanpod.service [Service] ExecStart=/bin/podman run \ --name=synapse \ --pull=always \ --read-only \ --pod=matrix \ --rm \ -v /var/srv/matrix/synapse:/data:z \ docker.io/matrixdotorg/synapse:v1.24.0 ExecStop=/bin/podman rm --force --ignore synapse [Install] WantedBy=multi-user.target 设置PostgreSQL数据库非常相似。您还需要在存储库的密钥文件中提供POSTGRES_PASSWORD,并声明systemd服务。 6、设置Fedora CoreOS主机 FCCT提供了一个存储指令,可用于在Fedora CoreOS主机上创建目录和添加文件。 以下配置确保/var/srv/matrix下存在每个服务所需的配置。每个服务都有一个专用目录。例如/var/srv/matrix/nginx和/var/srv/matrix/synapse。启动容器时,podman将这些目录作为卷安装。 storage: directories: - path: /var/srv/matrix mode: 0700 - path: /var/srv/matrix/synapse/media_store mode: 0777 - path: /var/srv/matrix/postgres - path: /var/srv/matrix/letsencrypt-webroot trees: - local: synapse path: /var/srv/matrix/synapse - local: nginx path: /var/srv/matrix/nginx - local: nginx-http path: /var/srv/matrix/nginx-http - local: letsencrypt-certs path: /var/srv/matrix/letsencrypt-certs - local: well-known path: /var/srv/matrix/well-known - local: element-web path: /var/srv/matrix/element-web files: - path: /etc/postgresql_synapse contents: local: postgresql_synapse mode: 0700 7、自动更新 现在,您可以设置Fedora CoreOS自动更新功能最强大的部分。在Fedora CoreOS上,对于每个新的Fedora CoreOS版本,系统大约每两周自动更新和重新启动一次。启动时,所有容器将更新为最新版本(因为设置了pull=always选项)。容器是无状态的,并且卷挂载用于需要在重新引导后保持不变的任何数据。 PostgreSQL容器是一个例外。由于它需要手动干预主要版本,因此无法完全自动更新。但是,只要支持指定版本(大约五年),它仍将使用新的修补程序版本进行更新,以修复安全问题和错误。请注意,Synapse在支持终止之前可能会开始需要更新的版本。因此,您应该为新的PostgreSQL版本计划大约每年一次的手动更新。该项目的自述文件中记录了更新PostgreSQL的步骤。 为了最大程度地提高可用性并避免一天中的服务中断,请在Zincati的配置中设置更新策略,以仅允许在特定时间段内重新引导更新。例如,您可能希望将UTC重启限制在工作日凌晨2点至凌晨4点之间。确保为您的时区选择正确的时间。Fedora CoreOS默认使用UTC时区。这是一个示例代码片段,您可以将其附加到config.yaml。 [updates] strategy = "periodic" [[updates.periodic.window]] days = [ "Mon", "Tue", "Wed", "Thu", "Fri" ] start_time = "02:00" length_minutes = 120
使用git存储库创建自己的Matrix服务器 对某些部分进行了轻松编辑,以使本文更易于阅读,但您可以在GitHub存储库中找到完整的,未编辑的配置。要通过此配置托管您自己的服务器,请填写secrets值,并通过提供的Makefile使用fcct生成完整配置。 $ cp secrets.example secrets ${EDITOR} secrets # Fill in values not marked as generated by synapse 接下来,生成Synapse机密并将其包含在机密文件中。最后,您可以使用make构建最终配置。 $ make # This will generate the config.ign file 现在,您可以在Fedora CoreOS上部署Matrix家庭服务器了。
注册新用户 在默认情况下,开放注册是禁用的。为避免出现问题,如果您愿意,可以在Synapse配置中重新启用开放注册。另外,即使禁用了开放式注册,也可以通过命令行将新用户添加到您的服务器。 $ sudo podman run --rm --tty --interactive \ --pod=matrix \ -v /var/srv/matrix/synapse:/data:z,ro \ --entrypoint register_new_matrix_user \ docker.io/matrixdotorg/synapse:latest \ -c /data/homeserver.yaml http://127.0.0.1:8008
结论 做完以上操作,部署Matrix服务器就完成了。请记住,如果发生任何问题,您可以将系统回滚到以前的版本,也可以使用以前的容器映像来解决已修复的所有错误。另外,要说一句:能够快速设置将保持更新和安全的系统是Fedora CoreOS模型的主要优点。
相关主题 |