快速部署Matrix服务器,并使用Cloudflare Workers提供联邦验证

发布于 2023-05-23  4978 次阅读


一直想部署个Matrix服务器,但要么担心服务器性能不够卡死,要么因为王八壳的服务器是ARM架构担心出什么莫名其妙的兼容性问题。这次直接头铁一把,用1GB内存硬上Synapse了。

直接用Docker,不用Docker Compose。

首先部署PostgreSQL数据库:

docker run --name postgres -v postgres_data:/var/lib/postgresql/data -e   POSTGRES_PASSWORD=数据库密码 -d postgres

创建数据库用户:

docker exec -it postgres createuser -U postgres --pwprompt synapse

创建时会要求输入密码,接下来创建数据库,执行:

docker exec -it postgres psql -U postgres

然后输入创建命令:

CREATE DATABASE synapse
 ENCODING 'UTF8'
 LC_COLLATE='C'
 LC_CTYPE='C'
 template=template0
 OWNER synapse;

创建后退出容器,然后创建数据库网络并将容器加入:

docker network create postgres_network
docker network connect postgres_network postgres

接下来部署Synapse,先建立存放所需文件的目录,然后生成配置文件:

docker run -it --rm -v 之前建立的目录的绝对路径:/data -e SYNAPSE_SERVER_NAME=域名 -e SYNAPSE_REPORT_STATS=no matrixdotorg/synapse:latest generate

这里的域名不是服务器的域名,而是Matrix用户所在域的域名,两者可以不一致,且部署完成后无法更改,请慎重设置。完成后文件夹中会出现一个Homeserver.yaml文件,编辑它来修改配置:

首先注释掉原有的数据库选项,默认数据库使用SQLite,然后添加PostgreSQL的配置,示例如下:

#database:
#  name: sqlite3
#  args:
#    database: /data/homeserver.db
database:
  name: psycopg2
  args:
    user: synapse
    password: 数据库密码
    database: synapse
    host: postgres
    cp_min: 5
    cp_max: 10

如果用户所在域名和服务器不一致时,需要在配置文件中添加:

public_baseurl: "https://服务器访问地址/"

如果需要由Synapse提供联邦验证文件,在配置文件中添加:

serve_server_wellknown: true

剩余生成的部分大多为访问配置和密钥配置,如果想要添加其他配置,诸如邮件验证、VoIP穿透,单点登录之类的,可以参考配置手册

配置完成后,使用以下命令部署:

docker run -d --name synapse -v 包括配置文件的目录路径:/data -p 8008:8008 --network=postgres_network matrixdotorg/synapse

完成后访问8008端口查看是否成功。

现在Synapse已经启动,接下来部署Caddy作为反向代理并提供证书,首先创建Caaddyfile文件,并填写:

{

        email 证书电子邮件地址

        #acme_ca https://acme-staging-v02.api.letsencrypt.org/directory

}


Synapse服务器地址,不是用户所在域域名 {

        reverse_proxy synapse:8008

}

然后创建网络:

docker network create caddy_network

将Synapse加入Caddy网络:

docker network connect caddy_network synapse

部署Caddy

docker run -d --name caddy -v Caddyfile文件绝对路径:/etc/caddy/Caddyfile -v caddy_data:/data -v caddy_config:/config -p 80:80 -p 443:443 -p 443:443/udp --network=caddy_network caddy

部署完成,但如果之前配置中,将用户域和服务器地址设置的不同的情况下,其他服务器无法发现该服务器,所以需要通过在用户域中设置well-known来帮助其他服务器发现。well-known可以通过SRV或example.com/.well-known/matrix/server的方式来提供,这里利用Cloudflare Workers生成example.com/.well-known/matrix/server响应。

此外,一些客户端也需要example.com/.well-known/matrix/client,这里一起部署:

登录Cloudflare,点击Workers和Pages并选择Create application,创建后将内容改为:

addEventListener('fetch', event => {
  event.respondWith(handleRequest(event.request))
})

async function handleRequest(request) {
  const body = `{
    "m.server": "服务器地址:端口,一般来说就是443"
}`;
  
  return new Response(body, {
    headers: { 'Content-Type': 'application/json' },
  })
}

如果需要创建client,则创建另一个,并改为如下内容:

addEventListener('fetch', event => {
  event.respondWith(handleRequest(event.request))
})

async function handleRequest(request) {
  const body = `{
    "m.homeserver": {
        "base_url": "https://服务器地址/"
    }
}`;
  
  return new Response(body, {
    headers: { 'Content-Type': 'application/json' },
  })
}

其中server中只需要填写服务器地址和端口,不需要带有协议名称,而client中需要带有协议名称。部署后可以访问一下提供的地址来查看效果。其中server应返回:

{
    "m.server": "服务器地址:端口"
}

client应返回:

{
    "m.homeserver": {
        "base_url": "https://服务器地址/"
    }
}

创建成功后,回到Cloudfalre主界面并选择用户所在域的域名,进入后选择Workers路由,分别创建用户域/.well-known/matrix/server用户域/.well-known/matrix/client,并在服务中分别选择对应的项目,然后选择环境,默认就是production,部署完成后分别访问对应的路径查看是否成功。

全都成功后可以用测试网站来检测能否正常加入Matrix联邦。填写用户域,如果显示绿色的Success,则说明Matrix服务器成功部署。

参考文章

使用docker搭建Synapse[Matrix]

联合部署 Mastodon 与 Synapse

以及特别鸣谢ChatGPT的悉心指导

届ける言葉を今は育ててる
最后更新于 2023-05-23