搭建 Matrix 服务器和网页版聊天

然后发现这个坑太大了,从下午 5 点搞到晚上 10 点。

0x01 搭建之前的准备,以及环境

给自己的小研究室搭建,虽然也没人用啦。

目的是,让外界看到的是 @username:internet.251.sh 这种格式,但是实际上服务器开在 chat.251.sh 二级域名后,网页版聊天也通过它访问。

官方没什么硬性要求,能用 Python,内存至少 1GB 即可。我使用的是 Debian 10。

0x02 开始搭建

安装可以使用手动 Python 里 pip 安装,也可以使用包管理器。我这里就懒一点:

sudo apt install -y lsb-release wget apt-transport-https
sudo wget -O /usr/share/keyrings/matrix-org-archive-keyring.gpg https://packages.matrix.org/debian/matrix-org-archive-keyring.gpg
echo "deb [signed-by=/usr/share/keyrings/matrix-org-archive-keyring.gpg] https://packages.matrix.org/debian/ $(lsb_release -cs) main" |
    sudo tee /etc/apt/sources.list.d/matrix-org.list
sudo apt update
sudo apt install matrix-synapse-py3

之后,服务端是开在 8448 端口。因为我服务器上有 Nginx 了,所以不用它内置的 Web 服务器和证书获取功能,用反代啦。证书使用的是 certbot,顺便吐槽 certbot 也开始用 snap 打包了……

8087 端口是为后面 Element 的 Web 端预留。

server {
    listen 443 ssl;
    listen [::]:443 ssl;

    # For the federation port
    listen 8448 ssl default_server;
    listen [::]:8448 ssl default_server;

    server_name chat.251.sh;

    location ~* ^(\/_matrix|\/_synapse\/client) {
        proxy_pass http://localhost:8008;
        proxy_set_header X-Forwarded-For $remote_addr;
        # Nginx by default only allows file uploads up to 1M in size
        # Increase client_max_body_size to match max_upload_size defined in homeserver.yaml
        client_max_body_size 10M;
    }
    
    ssl_certificate /etc/letsencrypt/live/251.sh/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/251.sh/privkey.pem;
    
    location / {
        proxy_pass http://127.0.0.1:8087/;
        proxy_set_header Host $http_host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        client_max_body_size 0;
    }
    
    location /.well-known/matrix/client {
        return 200 '{"m.homeserver": {"base_url": "https://chat.251.sh"}}';
        add_header Content-Type application/json;
        add_header Access-Control-Allow-Origin *;
    }
    
    location /.well-known/matrix/server {
        return 200 '{"m.homeserver": {"base_url": "https://chat.251.sh"}}';
        add_header Content-Type application/json;
        add_header Access-Control-Allow-Origin *;
    }
}

那两个 JSON 是怎么回事呢?这是一个叫 Client Well-Known URI 的东西。

然后去 /etc/matrix-synapse/homeserver.yaml 编辑设置吧,这个设置实在是太长了……

以我的情况,web_client_locationpublic_baseurl 都是 https://chat.251.sh。而 server_nameinternet.251.sh

Email 因为一个上游包的问题,必须降级成 TLS v1.0 才能发邮件……想了想还是先把配置填好,等上游发新包再搞吧。

最后我们要给自己开一个管理员帐号。因为我是包管理器安装的,所以不需要切换进环境变量

register_new_matrix_user -c homeserver.yaml https://chat.251.sh
New user localpart: **<username here>**
Password:
Confirm password:
Make admin [no]: **yes**
Success!

如果提示什么 registration_shared_secret 没有设置,去配置文件里脸滚键盘弄一个就行了。

视频通话因为没需求,不搞了。

接下来安装网页版,使用 docker 启动其实很快,因为官方是一条命令,而我喜欢 docker-compose 一下:

version: "3.8"
services:
  element-web:
    image: vectorim/riot-web
	ports:
	  - "80:8087"
	volumes:
      - ./config.json:/app/config.json

我的 config.json 长这个样子:

{
    "default_server_config": {
        "m.homeserver": {
            "base_url": "https://chat.251.sh",
            "server_name": "internet.251.sh"
        },
        "m.identity_server": {
            "base_url": "https://matrix.org"
        }
    },
    "disable_custom_urls": false,
    "disable_guests": false,
    "disable_login_language_selector": false,
    "disable_3pid_login": false,
    "brand": "internet.251.sh",
    "integrations_ui_url": "https://scalar.vector.im/",
    "integrations_rest_url": "https://scalar.vector.im/api",
    "integrations_widgets_urls": [
        "https://scalar.vector.im/_matrix/integrations/v1",
        "https://scalar.vector.im/api",
        "https://scalar-staging.vector.im/_matrix/integrations/v1",
        "https://scalar-staging.vector.im/api",
        "https://scalar-staging.riot.im/scalar/api"
    ],
    "bug_report_endpoint_url": "https://element.io/bugreports/submit",
    "defaultCountryCode": "CN",
    "showLabsSettings": false,
    "features": {
        "feature_new_spinner": false
    },
    "default_federate": true,
    "default_theme": "light",
    "roomDirectory": {
        "servers": [
            "internet.251.sh"
        ]
    },
    "piwik": false,
    "enable_presence_by_hs_url": {
        "https://matrix.org": false,
        "https://matrix-client.matrix.org": false
    },
    "settingDefaults": {
        "breadcrumbs": true
    },
    "jitsi": {
        "preferredDomain": "jitsi.riot.im"
    }
}

然后直接打开 chat.251.sh 登录就行了!

后面如果碰到不能 Explore public rooms 的问题,检查一下你的 DNS 设置,在我这里是需要这么设置 SRV 记录:

_matrix._tcp.internet.251.sh points to chat.251.sh and listens on _tcp port 8448 for _matrix services.

然后就可以啦~~~

这篇文章很草,就是把坑记录一下。最后献上一个在自己的实例上连接 #lounge:privacytools.io 的图:

Element.png


如果喜欢本文,欢迎点击下方的「鼓掌」按钮!

如果上面没有加载出任何东西,可以点击这里