在很久~很久~以前,有一个开放的 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 一把梭:
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
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 上则推荐Element和FluffyChat,Gnome 上推荐 Fractal (Devel 版的,目前正式版不支持登录 Conduit),但 KDE 上不推荐 NeoChat。cli 端没用过,可以都尝试以下,选择你最喜欢的。俺现在就是 FluffyChat + Cinny 了。不过,值得注意的是,Fractal 在我的设备上似乎存在无法获取消息的问题,不清楚是否是普遍性问题。
哦,对了,我的账户是Cris.Q,欢迎来找我玩耍哦。你也可以去我的GoToSocial账户逛逛。