云网牛站
所在位置:首页 > Linux云服务器 > 在Fedora CoreOS操作系统上部署Matrix服务器的方法

在Fedora CoreOS操作系统上部署Matrix服务器的方法

2021-01-19 11:56:38作者:谓自力稿源:云网牛站

本文介绍在Fedora CoreOS操作系统上部署Matrix服务器的方法。运行Matrix服务需要的软件有:Synapse(Matrix服务器)、PostgreSQL数据库、Nginx(Web服务器)、Element(Matrix Web客户端)、Let’s Encrypt(证书)。本文将演示如何在同一FCOS服务器上的容器中运行上述所有软件,所有服务都将配置为在podman容器引擎下运行。

在Fedora CoreOS操作系统上部署Matrix服务器的方法

 

组装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模型的主要优点。

 

相关主题

Debian 10 Nginx服务器上安装和更新Let’s Encrypt SSL并启用HTTP/2

精选文章
热门文章