Matrix 是去中心化和端到端加密通信的开放标准。它使用通过互联网相互通信的家庭服务器进行联合。家庭服务器存储有关其用户的数据以及创建的聊天室(包括来自其他家庭服务器的聊天室)。由于去中心化的性质,当创建房间的原始家庭服务器脱机时,其他家庭服务器可以继续通信而不会出现问题。由于这种设计,不存在单点故障。
Synapse 是由 Matrix.org 团队创建的 Matrix 主服务器的参考实现,也是最流行、最成熟和最完整的实现。
遵循本指南时,请将所有出现的 替换为您的域名。example.org
一、准备工作
- 在 Vultr 部署 Debian 11 实例
- IPv4地址可选择下载元素和Coturn。
- 更新服务器
- 创建具有 sudo 权限的非 root 用户
- 将域和子域指向您的服务器
matrix
element
turn
二、 安装突触
添加 Matrix.org apt 存储库。
$ 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
在安装过程中,输入主服务器的名称,该名称构成矩阵 ID 的一部分。您可以稍后更改此设置。/etc/matrix-synapse/conf.d/server_name.yaml
三、安装和配置 PostgreSQL
虽然 Synapse 支持使用 SQLite 作为数据库,但由于性能问题,不建议在生产中使用。
安装 PostgreSQL。
$ sudo apt install postgresql
登录 PostgreSQL 用户。
$ sudo -su postgres
为 PostgreSQL 创建一个用户和一个数据库。synapse
synapse
$ createuser --pwprompt synapse
$ createdb --encoding=UTF8 --locale=C --template=template0 --owner=synapse synapse
离开帐户。postgres
$ exit
四、使用 TLS 安装和配置 Nginx
Synapse 支持在没有反向代理的情况下独立运行,但不建议在生产中这样做。
安装 Nginx 和 Certbot。
$ sudo apt install nginx certbot python3-certbot-nginx
Open the HTTP, HTTPS, and Synapse ports in the firewall.
$ sudo ufw allow http
$ sudo ufw allow https
$ sudo ufw allow 8448
Get a TLS certificate from Let’s Encrypt.
$ sudo certbot certonly --nginx -d matrix.example.org -d example.org
Create a new Nginx configuration file.
$ sudo nano /etc/nginx/sites-available/synapse
将以下行添加到配置文件中。
server {
server_name matrix.example.org;
# Client port
listen 80;
listen [::]:80;
return 301 https://$host$request_uri;
}
server {
server_name matrix.example.org;
# Client port
listen 443 ssl http2;
listen [::]:443 ssl http2;
# Federation port
listen 8448 ssl;
listen [::]:8448 ssl;
# TLS configuration
ssl_certificate /etc/letsencrypt/live/matrix.example.org/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/matrix.example.org/privkey.pem;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_prefer_server_ciphers on;
location ~ ^(/_matrix|/_synapse/client) {
proxy_pass http://localhost:8008;
proxy_http_version 1.1;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header Host $host;
# Default Synapse upload size.
# If you change max_upload_size in Synapse config, update it here too.
client_max_body_size 50M;
}
}
如果在 Synapse 安装 () 期间设置的矩阵服务器名称的 DNS 记录指向托管 Synapse () 的同一服务器的 IP 地址,请在末尾添加以下行。如果没有,请在另一台服务器上 () 上为 Nginx 配置文件的适当位置添加以下行。example.org
matrix.example.org
/etc/nginx/sites-available/synapse
example.org
server {
server_name example.org;
listen 443 ssl http2;
listen [::]:443 ssl http2;
# TLS configuration
ssl_certificate /etc/letsencrypt/live/matrix.example.org/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/matrix.example.org/privkey.pem;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_prefer_server_ciphers on;
# Redirect
location ~ ^(/_matrix|/_synapse/client) {
return 301 "https://matrix.example.org$request_uri";
}
# Client homeserver autodiscovery
location /.well-known/matrix/client {
default_type application/json;
add_header Access-Control-Allow-Origin *;
return 200 '{ "m.homeserver": { "base_url": "https://matrix.example.org" } }';
}
# Domain delegation
location /.well-known/matrix/server {
default_type application/json;
add_header Access-Control-Allow-Origin *;
return 200 '{ "m.server": "matrix.example.org" }';
}
}
启用配置。
$ sudo ln -s /etc/nginx/sites-available/synapse /etc/nginx/sites-enabled
重新加载 Nginx 配置。
$ sudo systemctl reload nginx.service
五、 配置突触
您可以在以下位置编辑配置文件,但您应该改为放置 更改 在 APT 中不会要求在每次更新 Synapse 后覆盖配置文件。/etc/matrix-synapse/homeserver.yaml
/etc/matrix-synapse/conf.d/
创建新的数据库配置文件。
$ sudo nano /etc/matrix-synapse/conf.d/database.yaml
将以下行添加到配置文件中。将该值替换为之前为 PostgreSQLuser 设置的密码。如果您在其他服务器上托管 PostgreSQL,请替换为其地址。password
synapse
localhost
database:
name: psycopg2
args:
user: synapse
password: 'password'
database: synapse
host: localhost
cp_min: 5
cp_max: 10
创建秘密注册密钥。确保其安全,因为任何拥有密钥的人都可以注册新用户,即使注册被禁用也是如此。
$ echo "registration_shared_secret: '$(cat /dev/urandom | tr -cd '[:alnum:]' | fold -w 256 | head -n 1)'" | sudo tee /etc/matrix-synapse/conf.d/registration_shared_secret.yaml
默认情况下,Synapse 启用状态指示器,以显示某人是否在线。这可能会导致高 CPU 使用率,并且许多家庭服务器会禁用它们。为此,请创建一个新的配置文件。
$ sudo nano /etc/matrix-synapse/conf.d/presence.yaml
将以下行添加到配置文件中。
presence:
enabled: false
重新启动 Synapse 以应用新配置。
$ sudo systemctl restart matrix-synapse.service
创建一个新的矩阵用户。
$ register_new_matrix_user -c /etc/matrix-synapse/conf.d/registration_shared_secret.yaml http://localhost:8008
若要打开公共注册,请创建新配置。
$ sudo nano /etc/matrix-synapse/conf.d/registration.yaml
将以下行添加到配置文件中。
enable_registration: true
默认情况下,Synapse 不允许在未经验证的情况下进行注册。 要启用电子邮件验证,请添加以下行。
registrations_require_3pid:
- email
email:
smtp_host: mail.example.org
smtp_port: 587
# If mail server has no authentication, skip these 2 lines
smtp_user: 'noreply@example.org'
smtp_pass: 'password'
# Optional, require encryption with STARTTLS
require_transport_security: true
app_name: 'Example Chat' # defines value for %(app)s in notif_from and email subject
notif_from: "%(app)s <noreply@example.org>"
若要不进行任何形式的验证,请添加以下行。
enable_registration_without_verification: true
重新启动 Synapse 以应用新配置。
$ sudo systemctl restart matrix-synapse.service
要验证 Synapse 是否正在运行,请在浏览器中打开您的 Matrix 域。例如:/_matrix/static/
https://matrix.example.org/\_matrix/static/
检查与其他主服务器的联盟是否 工作时,打开联合测试器,键入您的 Matrix 服务器名称,然后单击 Go。
六、安装和配置 Coturn
您通常需要在 NAT (TURN) 服务器周围使用中继进行遍历,以使语音和视频通话正常工作。如果不需要此功能,可以跳过此部分。
安装 Coturn。
$ sudo apt install coturn
打开 TURN 和 UDP 防火墙端口。
$ sudo ufw allow 3478
$ sudo ufw allow 5349
$ sudo ufw allow 49152:65535/udp
从Let’s Encrypt获取TLS证书。
$ sudo certbot certonly --nginx -d turn.example.org
生成身份验证密钥。
$ echo "static-auth-secret=$(cat /dev/urandom | tr -cd '[:alnum:]' | fold -w 256 | head -n 1)" | sudo tee /etc/turnserver.conf
编辑配置文件。
$ sudo nano /etc/turnserver.conf
将以下行添加到配置文件中。
use-auth-secret
realm=turn.example.org
cert=/etc/letsencrypt/live/turn.example.org/fullchain.pem
pkey=/etc/letsencrypt/live/turn.example.org/privkey.pem
# VoIP is UDP, no need for TCP
no-tcp-relay
# Do not allow traffic to private IP ranges
no-multicast-peers
denied-peer-ip=0.0.0.0-0.255.255.255
denied-peer-ip=10.0.0.0-10.255.255.255
denied-peer-ip=100.64.0.0-100.127.255.255
denied-peer-ip=127.0.0.0-127.255.255.255
denied-peer-ip=169.254.0.0-169.254.255.255
denied-peer-ip=172.16.0.0-172.31.255.255
denied-peer-ip=192.0.0.0-192.0.0.255
denied-peer-ip=192.0.2.0-192.0.2.255
denied-peer-ip=192.88.99.0-192.88.99.255
denied-peer-ip=192.168.0.0-192.168.255.255
denied-peer-ip=198.18.0.0-198.19.255.255
denied-peer-ip=198.51.100.0-198.51.100.255
denied-peer-ip=203.0.113.0-203.0.113.255
denied-peer-ip=240.0.0.0-255.255.255.255
denied-peer-ip=::1
denied-peer-ip=64:ff9b::-64:ff9b::ffff:ffff
denied-peer-ip=::ffff:0.0.0.0-::ffff:255.255.255.255
denied-peer-ip=100::-100::ffff:ffff:ffff:ffff
denied-peer-ip=2001::-2001:1ff:ffff:ffff:ffff:ffff:ffff:ffff
denied-peer-ip=2002::-2002:ffff:ffff:ffff:ffff:ffff:ffff:ffff
denied-peer-ip=fc00::-fdff:ffff:ffff:ffff:ffff:ffff:ffff:ffff
denied-peer-ip=fe80::-febf:ffff:ffff:ffff:ffff:ffff:ffff:ffff
# Limit number of sessions per user
user-quota=12
# Limit total number of sessions
total-quota=1200
重新启动 Coturn 以重新加载配置。
$ sudo systemctl restart coturn.service
创建新的突触配置文件。
$ sudo nano /etc/matrix-synapse/conf.d/turn.yaml
将以下行添加到配置文件中。将值替换为 from。turn_shared_secret
static-auth-secret
/etc/turnserver.conf
turn_uris: [ "turn:turn.example.org?transport=udp", "turn:turn.example.org?transport=tcp" ]
turn_shared_secret: 'static-auth-secret'
turn_user_lifetime: 86400000
turn_allow_guests: True
重新启动 Synapse 以应用新配置。
$ sudo systemctl restart matrix-synapse.service
七、使用矩阵
Synapse 现已配置完毕,您可以将其与任何 Matrix 客户端一起使用。Element 是最受欢迎的 Matrix 客户端,可作为托管的 Web 应用程序、桌面和移动应用程序使用。
如果要托管自己的 Element 实例,请进一步阅读有关如何安装和配置它的说明。
要登录您的矩阵客户端,请在用户名字段中输入您的完整矩阵 ID(例如)。大多数客户端(如 Element)会自动获取主服务器信息。如果这不起作用,请检查矩阵服务器上的 URL 是否具有正确的主服务器信息。如果是,则您的客户端不支持主服务器发现,您需要手动插入主服务器地址。@bob:example.org
/.well-known/matrix/client/
八、安装元素
安装 jq。
$ sudo apt install jq
为 Element 创建一个目录。
$ sudo mkdir -p /var/www/element
创建一个新文件以获取最新的元素版本。
$ sudo nano /var/www/element/update.sh
将以下行添加到文件中。
#!/bin/sh
set -e
install_location="/var/www/element"
latest="$(curl -s https://api.github.com/repos/vector-im/element-web/releases/latest | jq -r .tag_name)"
cd "$install_location"
[ ! -d "archive" ] && mkdir -p "archive"
[ -d "archive/element-${latest}" ] && rm -r "archive/element-${latest}"
[ -f "archive/element-${latest}.tar.gz" ] && rm "archive/element-${latest}.tar.gz"
wget "https://github.com/vector-im/element-web/releases/download/${latest}/element-${latest}.tar.gz" -P "archive"
tar xf "archive/element-${latest}.tar.gz" -C "archive"
[ -L "${install_location}/current" ] && rm "${install_location}/current"
ln -sf "${install_location}/archive/element-${latest}" "${install_location}/current"
ln -sf "${install_location}/config.json" "${install_location}/current/config.json"
将文件标记为可执行文件。
$ sudo chmod +x /var/www/element/update.sh
执行文件以下载元素。
$ sudo /var/www/element/update.sh
若要在将来更新元素,请重新运行该命令。
九、配置元素
复制示例元素配置。
$ sudo cp /var/www/element/current/config.sample.json /var/www/element/config.json
编辑配置文件。
$ sudo nano /var/www/element/config.json
将默认 Matrix.org 主服务器地址更改为主服务器。
"m.homeserver": {
"base_url": "https://matrix.example.org",
"server_name": "example.org"
},
如果要在网站标题和其他地方使用自己的名称而不是Element,请更改品牌名称。
"brand": "My Example Chat",
从Let’s Encrypt获取TLS证书。
$ sudo certbot certonly --nginx -d element.example.org
创建一个新的 Nginx 配置文件。
$ sudo nano /etc/nginx/sites-available/element
将以下行添加到配置文件中。
server {
listen 80;
listen [::]:80;
server_name element.example.org;
return 301 https://$host$request_uri;
}
server {
listen 443 ssl http2;
listen [::]:443 ssl http2;
server_name element.example.org;
root /var/www/element/current;
index index.html;
add_header Referrer-Policy "strict-origin" always;
add_header X-Content-Type-Options "nosniff" always;
add_header X-Frame-Options "SAMEORIGIN" always;
# TLS configuration
ssl_certificate /etc/letsencrypt/live/element.example.org/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/element.example.org/privkey.pem;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_prefer_server_ciphers on;
}
启用配置。
$ sudo ln -s /etc/nginx/sites-available/element /etc/nginx/sites-enabled
重新加载 Nginx 配置。
$ sudo systemctl reload nginx.service
您现在可以从子域访问元素(例如,)。要登录,请输入您的用户名或完整的矩阵 ID。element
https://element.example.org