Synapse .well-known not available 解决方案

Synapse .well-known not available 解决方案

写在前面

需要注意的是,我并没有采用官方所推荐的“最佳实践”,以下均属于我自己“瞎折腾”,如果你想要一个稳定好用的家服务器,还是建议你去看着官方的文档进行搭建:

Using a reverse proxy with Synapse

从某种程度上来说,我是因为使用官方提供的 Caddyfile 反代失败才自己折腾

前提摘要

在2024年八月份的时候,我们首次在服务器上搭建了基于 Synapse 的 Matrix 服务器,当时的 Caddyfile 是这样的:

1
2
3
talk.example.com {
reverse_proxy 127.0.0.1:8008
}

就是一个极为简单的反代,之后再套了个 Cloudflare 的CDN,在很长的一段时间内它都运行的很好

在十月份的时候我们进行了一次服务器迁移,但是不要求保留数据,于是我们直接重新起了 docker-compose

之后就出现问题了,我们的小伙伴使用 Element 作为客户端的时候,出现了 .well-known not available 的情况

Element

解决

当时我和另外一个朋友是在 iOS 上使用 Element 作为客户端,没有发生任何问题,所以我们当时怀疑是安卓客户端的问题,提出让该同学使用 Cinny 或者重装尝试

可是后来又有另外一位使用安卓的同学出现了一样的问题,我们这才意识到可能是服务器出现了问题

于是我着手开始解决,搜索之后发现还有许多的用户遇到了类似的问题:

image

尤其是和我一样使用 Caddy 作为反代服务器的用户还挺多,在参考了一些文章之后,我发现原来是反代的问题:

Matrix Synapse getting no .well-known error - Issues with Federation|Caddy

Delegation of incoming federation traffic|Synapse Docu

Can’t login into my server from newly installed Element|GitHub Issue

Installation Instructions|Element

在官方的文档里写了这个.well-known有啥用,大致是为了帮助客户端知道应该要链接哪个服务器,总之我看得很晕

在 GitHub 的一个 Issue 中给出了较为具体的解决方法,大致就是设置一个反代的路由,使其能访问:

1
2
3
(base)~ % curl https://talk.example.com/.well-known/matrix/client 

{"m.homeserver": {"base_url": "https://talk.example.com"}}

这样的话客户端就知道要链接到哪个家服务器了

这样的话,按照文档的说法:

Delegation is a Matrix feature allowing a homeserver admin to retain a server_name of example.com so that user IDs, room aliases, etc continue to look like *:example.com, whilst having federation traffic routed to a different server and/or port (e.g. synapse.example.com:443).

授权是 Matrix 的一项功能,允许家庭服务器管理员保留 example.com 的 server_name ,这样用户 ID、房间别名等看起来仍像 *:example.com ,同时联盟流量被路由到不同的服务器和/或端口(如 synapse.example.com:443 )。

应该指的是一个主域名下可以搭建多个服务器,用户只需要输入example.com,客户端就能自动处理去往哪个家服务器

下面是我的 Caddyfile :

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
talk.example.com {
reverse_proxy 127.0.0.1:8008

# 配置 .well-known/matrix/client
route /.well-known/matrix/client {
respond `{"m.homeserver": {"base_url": "https://talk.example.com"}}` 200
header {
Content-Type application/json
Access-Control-Allow-Origin "*"
}
}

# 这个其实不配置也行,但是我看文档配置了,也弄了个
route /.well-known/matrix/server {
respond `{"m.server": "talk.example.com:443"}` 200
header {
Content-Type application/json
Access-Control-Allow-Origin "*"
}
}
}

虽然目前这样还没有遇到什么奇怪的问题,但是还有待观察