在同一域名下部署 mastodon 与 matrix

本文最后更新于 2024年8月23日 晚上

背景

前段时间部署了 matrix 服务器,并水了一篇博客,现在又对 mastodon 心心念念,今天终于开始尝试 mastodon 了! mastodon 的部署还是挺简单的,先安装 aur 的 mastodon 包, 按照 postinstall 的指示进行。很快我就将 mastodon 部署在了境内的腾讯云服务器上。

但是,我希望我的 local domain 是 askk.cc,web domain 是 mastodon.askk.cc, 这个诉求很简单,改一下 mastodon 的配置文件就行了,参见 mastodon 文档. 不推荐参考 使用你的主网域作為 Mastodon 實例名

可是,还有个问题是,我的主域名已经被 matrix 占用了,并且,服务端 dendrite 部署在境外的服务器上,而且主域名 askk.cc 也解析到了境外。

我该怎么办呢?

失败的尝试

首先呢,想到腾讯的 DNSPOD 可以将一个域名解析到多个 IP, 我将主域名解析到两个服务器不就行了嘛。我试了下,失败,一堆 matrix 的请求发到了 mastodon 所在服务器。

成功的尝试

想到 Nick Cao 老师曾经提过, dendrite 的 homeserver 与 well-known server 不一定要在一台服务器上,于是我想到了把 dendrite 的 homeserver 搬到境内,well-known server 还是在境外,dendrite 也还是运行在境外的机器上。

mastodon 本身就支持 LOCAL_DOMAINWEB_DOMAIN,根据我的需求, WEB_DOMAINmastoson.askk.cc,也就是 WEB 面板,LOCAL_DOMAINaskk.cc,它决定了我的帐号叫 @i@askk.cc。根据 mastodon 的文档

To install Mastodon on mastodon.example.com in such a way it can serve @alice@example.com, set LOCAL_DOMAIN to example.com and WEB_DOMAIN to mastodon.example.com. This also requires additional configuration on the server hosting example.com to redirect or proxy requests to https://example.com/.well-known/webfinger to https://mastodon.example.com/.well-known/webfinger. For instance, with nginx, the configuration could look like the following:

1
2
3
location /.well-known/webfinger {
return 301 https://mastodon.example.com$request_uri;
}

我们只要在 askk.cc 的 Nginx 配置文件里面加上这么一段就可以了,最后我的 主域名配置文件变成了这样子

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
server {
server_name askk.cc;
# mastodon
set $mastodon_host mastodon.askk.cc;
location /.well-known/webfinger {
return 301 https://$mastodon_host$request_uri;
}

## matrix
listen 8448 ssl;
listen [::]:8448 ssl;
location ~ ^/_matrix/ {
proxy_pass http://matrix.askk.cc:8008;
#proxy_pass http://127.0.0.1:8008;
proxy_set_header X-Forwarded-For $remote_addr;
}
location /.well-known/matrix/server {
default_type application/json;
return 200 '{ "m.server": "matrix.askk.cc:443" }';
}

location /.well-known/matrix/client {
# If your sever_name here doesn't match your matrix homeserver URL
# (e.g. hostname.com as server_name and matrix.hostname.com as homeserver URL)
default_type application/json;
add_header Access-Control-Allow-Origin '*';
return 200 '{ "m.homeserver": { "base_url": "https://askk.cc" } }';
}

listen [::]:443 ssl ipv6only=on; # managed by Certbot
listen 443 ssl; # managed by Certbot
ssl_certificate /etc/letsencrypt/live/askk.cc-0001/fullchain.pem; # managed by Certbot
ssl_certificate_key /etc/letsencrypt/live/askk.cc-0001/privkey.pem; # managed by Certbot
include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot

}
server {
if ($host = askk.cc) {
return 301 https://$host/$request_uri;
} # managed by Certbot


listen 80;
listen [::]:80;
server_name askk.cc;
return 404; # managed by Certbot
}

先将 askk.cc 解析到 mastodon 所在的服务器上。然后在该服务器上进行下面的操作。

修改 mastodon 的 nginx 配置 /etc/nginx/conf.d/mastodon.conf,在合适的位置加入了include conf.d/matrix_homeserver.conf.sub;

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
...
server {
server_name askk.cc;
set $mastodon_host mastodon.askk.cc;
root /var/lib/mastodon/public;
#location /.well-known/acme-challenge/ { allow all; }
#location / { return 301 https://$host$request_uri; }
# 加入了下面这一行
# matrix server
include conf.d/matrix_homeserver.conf.sub;
location = /.well-known/host-meta {
return 301 https://mastodon.askk.cc$request_uri;
}


## mastodon web url
location ~ ^/(about/more|settings|web|pghero|sidekiq|admin|interact|explore|public|@.*|relationships|filters|terms|inert.css){
rewrite ^(.*) https://$mastodon_host$1 permanent;
}
...

其中 /etc/nginx/conf.d/matrix_homeserver.conf.sub 的内容为

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
listen 8448 ssl  default_server;
listen [::]:8448 ssl default_server;

## matrix url
location ~ ^/_matrix/ {
#rewrite ^(.*) http://matrix.askk.cc:8008;
proxy_pass http://matrix.askk.cc:8008;
proxy_set_header X-Forwarded-For $remote_addr;
}
location /.well-known/matrix/server {
default_type application/json;
return 200 '{ "m.server": "matrix.askk.cc:443" }';
}

location /.well-known/matrix/client {
# If your sever_name here doesn't match your matrix homeserver URL
# (e.g. hostname.com as server_name and matrix.hostname.com as homeserver URL)
default_type application/json;
add_header Access-Control-Allow-Origin '*';
return 200 '{ "m.homeserver": { "base_url": "https://askk.cc" } }';
}

其实就是从境外服务器 dendrite 的 nginx 配置里面把 homeserver 部分的配置抄了出来。主要的点其实在于 location ~ ^/_matrix/ 这一段。后面的 well-known 我也顺便抄了过来。

最后重启 nginx 服务就好了。 matrix 跟 mastodon 运行在同一个域名下,并且一个在境内,一个在境外。

总结

突然发现 dendrite 的配置真的非常灵活,有非常多的可能性,而 mastodon 的话,感觉就不如 dendrite 灵活。 mastodon 也非常灵活!


在同一域名下部署 mastodon 与 matrix
https://blog.askk.cc/2022/05/05/mastodon-and-matrix-under-same-domain/
作者
sukanka
发布于
2022年5月5日
许可协议