烦死了
似乎是第三篇或者第四篇,反正不是第一篇······

在很久~很久~以前,有一个开放的 IM 协议,他的名字叫做 Matrix。

相传,他披着黑色的中括号,腰杆儿挺得笔直,但是,从来没有人见过他真实的样子,因为他只使用化身为人们带来福音——那最著名的化身是 Synapse,生活在 Python 镇,但他厚重的铠甲常常令前来学艺或拜访的服务器望而生畏;比较灵巧些的化身是 Dendrite,他是 Go 城邦的贵公子,虽然装备不如老大 Synapse 那么齐全,但一样功夫了得,尤其是迅捷的身法,传闻只需要几百 Mb 的内存便可大展拳脚。他们二位长期为人们所称道,可谓家喻户晓哇!

然而,客官,咱们说的是另一位隐世的公子。Rust 派的嫡传弟子,Conduit。

简介

在 Synapse、Dendrite、Ruma 等等一大堆 Homeserver 中最后还是选择了 Conduit 尝鲜,一是因为它比较轻量级,不至于让我的服务器叫苦连天;二是因为它很新,我喜欢新东西(即使它们功能不一定齐全);三嘛,因为它的开发者和社区热情且平等,没有架子,开发非常活跃。

真的很乐于助人的说!

另外,熟悉我的朋友都知道,我是个 Rust 爱好者,用 Rust 开发的 Conduit 本身就是个有吸引力的选择。而它的官网宣传语也让人十分动心:Conduit is a simple, fast and reliable chat server powered by Matrix.

那还说什么呢,快让我也 Powered By Matrix 吧。

安装&部署

由于我是使用 Traefik 做反向代理的,所以下面的安装适用于 Traefik 用户。

先是 Docker-compose 一把梭:

yml
version: '3'

services:
    homeserver:
        image: matrixconduit/matrix-conduit:latest
        restart: unless-stopped
        volumes:
            - db:/var/lib/matrix-conduit/
        networks:
            - traefik
        environment:
            CONDUIT_SERVER_NAME: chat.crisq.top # 你实例将要绑定到的域名
            CONDUIT_DATABASE_PATH: /var/lib/matrix-conduit/
            CONDUIT_DATABASE_BACKEND: rocksdb # 类似 Sqlite 的轻量 K-V 数据库
            CONDUIT_PORT: 6167 #嘛~默认就好了
            CONDUIT_MAX_REQUEST_SIZE: 20_000_000
            CONDUIT_ALLOW_REGISTRATION: 'false' # 第一次运行的时候设置为 true,如果是自用,创建完自己的账户就可以设置成 false 了。请尽快创建账户,以防被他人捷足先登:Conduit 默认第一个被创建的用户为管理员。
            CONDUIT_ALLOW_FEDERATION: 'true'
            CONDUIT_TRUSTED_SERVERS: '["matrix.org"]'
            #CONDUIT_MAX_CONCURRENT_REQUESTS: 100
            CONDUIT_ADDRESS: 0.0.0.0 # 确保能被 traefik 发现。

    well-known: # 我们简单的部署一个 nginx,为其他服务器提供 well_known 文件,你问我为啥还要配置第二个反向代理?我也烦啊淦······
        networks:
            - traefik # 我的 traefik 和 docker 容器们都跑在这个网络中
        image: nginx:latest
        restart: unless-stopped
        volumes:
            - ./nginx/matrix.conf:/etc/nginx/conf.d/matrix.conf

volumes:
    db:

networks:
    traefik:
        external: true

可是,看起来并没有什么和 Traefik 相关的配置项,因为我们使用了另外一个文件:docker-compose.override.yml

yml
version: '3'

services:
    homeserver:
        labels:
            - "traefik.enable=true"
            - "traefik.docker.network=traefik"

            - "traefik.http.routers.to-conduit.rule=Host(`your.domain`) && PathPrefix(`/_matrix`)" # 我们将让 Conduit 处理所有指向"_matrix"的流量,而剩余部分则交给 nginx。
            - "traefik.http.routers.to-conduit.tls=true"
            - "traefik.http.routers.to-conduit.tls.options=chat@file" # 你需要在 Traefik 的动态配置中启用这一 Option,或者删掉这行配置,下面对 well_known 的配置同理
            - "traefik.http.routers.to-conduit.tls.certresolver=mytlschallenge" # 同样改成你在配置中启用
            - "traefik.http.routers.to-conduit.middlewares=cors-headers@docker"

            - "traefik.http.middlewares.cors-headers.headers.accessControlAllowOriginList=*"
            - "traefik.http.middlewares.cors-headers.headers.accessControlAllowHeaders=Origin, X-Requested-With, Content-Type, Accept, Authorization"
            - "traefik.http.middlewares.cors-headers.headers.accessControlAllowMethods=GET, POST, PUT, DELETE, OPTIONS"

    well-known:
        labels:
            - "traefik.enable=true"
            - "traefik.docker.network=traefik"

            - "traefik.http.routers.to-matrix-wellknown.rule=Host(`your.domain`)"
            - "traefik.http.routers.to-matrix-wellknown.tls=true"
            - "traefik.http.routers.to-matrix-wellknown.tls.options=chat@file"
            - "traefik.http.routers.to-matrix-wellknown.tls.certresolver=mytlschallenge"
            - "traefik.http.routers.to-matrix-wellknown.middlewares=cors-headers@docker"

            - "traefik.http.middlewares.cors-headers.headers.accessControlAllowOriginList=*"
            - "traefik.http.middlewares.cors-headers.headers.accessControlAllowHeaders=Origin, X-Requested-With, Content-Type, Accept, Authorization"
            - "traefik.http.middlewares.cors-headers.headers.accessControlAllowMethods=GET, POST, PUT, DELETE, OPTIONS"

愉快地docker-compose up -d,就能跑起来一个 Matrix Homeserver 了。你可以使用Federation Tester检测你的 Federation 功能是否成功配置。

配置&使用

我倒没有怎么特别配置过 Conduit,感觉已经比较顺手了。但是文档介绍了一些额外的配置,例如 TURN 和 Appservice(Bridge),有兴趣的可以配置着玩。

至于使用,第一次创建用户时会生成一个会话密钥,请妥善保管。在其他平台登录该账号时使用此密钥验证,或与其他设备比较验证即可。需要注意的是,Conduit 目前不支持历史消息的获取,也不支持 Sliding Sync 功能,所以 ElementX 是无法使用的,其它客户端的 Space 功能也并不支持。(但基本的私聊,群组等功能是完整的)。

客户端方面,比较推荐的是Cinny,优雅极简的 Web Client,Android 上则推荐ElementFluffyChat,Gnome 上推荐 Fractal (Devel 版的,目前正式版不支持登录 Conduit),但 KDE 上不推荐 NeoChat。cli 端没用过,可以都尝试以下,选择你最喜欢的。俺现在就是 FluffyChat + Cinny 了。不过,值得注意的是,Fractal 在我的设备上似乎存在无法获取消息的问题,不清楚是否是普遍性问题。

哦,对了,我的账户是Cris.Q,欢迎来找我玩耍哦。你也可以去我的GoToSocial账户逛逛。