Matrix聊天服务器有多种实现方法,例如Synapse、Dendrite等(Matrix.org - Servers),Dendrite理论上要优于Synapse,但是由于有关Dendrite的内容在网上是少之又少,所以写篇文章记录一下Dendrite搭建过程

Dendrite的搭建方法其实非常简单,几乎可以一键安装Dendrite和Postgresql只是官方文档写的有点太简单了

本文章将介绍使用Docker搭建Dendrite-Matrix聊天服务器

Matrix官网:Matrix.org

Dendrite官方文档:Installation | Dendrite (matrix-org.github.io)

文件结构规划

预计将Dendrite根目录放在/root/dendrite,所以现在/root下新建一个dendrite文件夹:

mkdir -p ./dendrite

然后进入目录/dendrite

cd dendrite

然后创建目录/config

mkdir -p ./config

完成文件夹创建,结构应当为:

  • root
    • dendrite
      • config
        • dendrite.yaml
        • matrix_key.pem
      • docker-compose.yml

准备工作

生成私钥

首先,我们将生成私钥(matrix_key.pem),用于对事件进行签名

注意:这只需要执行一次,否则会覆盖密钥

docker run --rm --entrypoint="/usr/bin/generate-keys" \
  -v $(pwd)/config:/mnt \
  matrixdotorg/dendrite-monolith:latest \
  -private-key /mnt/matrix_key.pem

下载docker-compose文件

前往下载官方提供的docker-compose.yml文件(dendrite/build/docker/docker-compose.yml at main · matrix-org/dendrite · GitHub

修改docker-compose.yml 文件,至少需要修改以下内容:

  • POSTGRES_PASSWORD :修改为需要设置的数据库密码

以下为docker-compose.yml的示例:

version: "3.4"

services:
  postgres:
    hostname: postgres
    image: postgres:15-alpine
    restart: always
    volumes:
      # This will create a docker volume to persist the database files in.
      # If you prefer those files to be outside of docker, you'll need to change this.
      - dendrite_postgres_data:/var/lib/postgresql/data
    environment:
      POSTGRES_PASSWORD: passwd
      POSTGRES_USER: dendrite
      POSTGRES_DATABASE: dendrite
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U dendrite"]
      interval: 5s
      timeout: 5s
      retries: 5
    networks:
      - internal

  monolith:
    hostname: monolith
    image: matrixdotorg/dendrite-monolith:latest
    ports:
      - 8008:8008
      - 8448:8448
    volumes:
      - ./config:/etc/dendrite
      # The following volumes use docker volumes, change this
      # if you prefer to have those files outside of docker.
      - dendrite_media:/var/dendrite/media
      - dendrite_jetstream:/var/dendrite/jetstream
      - dendrite_search_index:/var/dendrite/searchindex
    depends_on:
      postgres:
        condition: service_healthy
    networks:
      - internal
    restart: unless-stopped

networks:
  internal:
    attachable: true

volumes:
  dendrite_postgres_data:
  dendrite_media:
  dendrite_jetstream:
  dendrite_search_index:

修改完后上传到服务器,上传位置参考上文文件规划结构

生成配置

接下来需要生成dendrite.yaml配置文件

执行以下命令来生成配置文件,你至少需要修改以下内容与docker-compose.yml中填写的内容保持一致:

  • itsasecret:替换为之前输入的需要设置的数据库密码

  • YourDomainHere:替换为你的服务器地址(如果需要反向代理,则输入反向代理后的地址)

docker run --rm --entrypoint="/bin/sh" \
  -v $(pwd)/config:/mnt \
  matrixdotorg/dendrite-monolith:latest \
  -c "/usr/bin/generate-config \
    -dir /var/dendrite/ \
    -db postgres://dendrite:itsasecret@postgres/dendrite?sslmode=disable \
    -server YourDomainHere > /mnt/dendrite.yaml"

此处同时完成了对环境变量db的定义,所以可以在下文中使用db

此时dendrite.yaml应当已经生成在了/root/config

修改dendrite.yaml

按需修改,至少需要修改以下内容:

  • connection_string:修改为上一步中postgres://开头的内容

启动!

完成配置更改后,现在执行以下命令启动 Dendrite

docker-compose -f docker-compose.yml up 

这将自动安装Postgresql和Dendrite

之后在访问服务器地址或反向代理80端口后的地址,看见it works!的提示即为成功