概述
Matrix:
- Matrix是一个开放的通信协议,用于实时通信,包括即时消息、音频和视频通话。
- 它是去中心化的,这意味着任何人都可以设置自己的 Matrix 服务器,并与其他 Matrix 服务器通信。
- Matrix 的目标是为所有不同的通信服务提供一个统一的标准,使得不同的服务可以互相通信。
每个 Homeserver 有自己的域名,每个 Matrix 用户属于一个 Homeserver,因此有一个唯一的 ID @user:xxx.com ,不同的 Homeserver 之间可以互相沟通信息,使得所有用户之间可以互相交流。 Matrix 没有区分私聊和群聊,所有聊天都是在聊天室 Room 中进行的,私聊就是只有两个人的聊天室。 Room 也是属于某个 Server #room:xxx.com 的,不过 Homeserver 负责维护所有所属 User 所在的 Room,也要从别的 Homeserver 同步 Room 的信息过来。
Element:
- Element是基于 Matrix 协议的一个客户端应用。
- 它允许用户通过 Matrix 协议进行即时消息、音频和视频通话。
- Element 有多个版本,包括 Web、桌面和移动应用。
- 它是 Matrix 生态系统中最流行的客户端之一。
除了自建Matrix以外,你也可以从这里选择一个公共服务器加入以开始你的聊天之旅。
我的聊天室 服务器地址:https://matrix.yisrime.xyz/
部署
首先创建安装目录,运行如下命令,注意www.example.com
改成自己的域名:
docker run -it --rm
-v /root/Matrix/:/data -e SYNAPSE_SERVER_NAME=www.example.com -e SYNAPSE_REPORT_STATS=yes matrixdotorg/synapse:latest generate
然后编辑homeserver.yaml
,参照官方文档配置以下的各种参数:
注意:少量用户的情况下可以使用内置的SQlite作为数据库,如果用户较多,还是建议使用PostgreSQL作为数据库。
# Configuration file for Synapse.
#
# This is a YAML file: see [1] for a quick introduction. Note in particular
# that *indentation is important*: all the elements of a list or dictionary
# should have the same indentation.
#
# [1] https://docs.ansible.com/ansible/latest/reference_appendices/YAMLSyntax.html
#
# For more information on how to configure Synapse, including a complete accounting of
# each option, go to docs/usage/configuration/config_documentation.md or
# https://element-hq.github.io/synapse/latest/usage/configuration/config_documentation.html
server_name: "www.example.com"
pid_file: /data/homeserver.pid
listeners:
- port: 8008
tls: false
type: http
x_forwarded: true
resources:
- names: [client, federation]
compress: true
database:
name: sqlite3
args:
database: /data/homeserver.db
log_config: "/data/www.example.com.log.config"
media_store_path: /data/media_store
registration_shared_secret: "自动生成"
report_stats: false
macaroon_secret_key: "自动生成"
form_secret: "自动生成"
signing_key_path: "/data/www.example.com.signing.key"
suppress_key_server_warning: true
trusted_key_servers:
- server_name: "matrix.org"
- server_name: "example.com"
tls_certificate_path: "/data/acme.pem"
tls_private_key_path: "/data/acme.key"
# vim:ft=yaml
编辑完成后,然后继续运行如下命令部署Matrix:
docker run -it --name=synapse --restart=unless-stopped -v /root/Matrix/:/data --net=host -e VIRTUAL_HOST=www.example.com -e VIRTUAL_PORT=8088 -e LETSENCRYPT_HOST=www.example.com -e SYNAPSE_SERVER_NAME=www.example.com -e SYNAPSE_REPORT_STATS=yes matrixdotorg/synapse:latest //需使用Ctrl+C终止进程
docker start synapse
注意:
VIRTUAL_HOST
LETSENCRYPT_HOST
SYNAPSE_SERVER_NAME
需要完全一致
运行命令后,即可部署完成,通信端口为8088
,数据存放在/root/Matrix/
中,可根据需要自行修改。
运行如下命令部署Element:
docker run -it --name=element --restart=unless-stopped -p 8009:80 vectorim/element-web
docker start element
添加Nginx反向代理
配置模板如下,可根据需要自行修改,也可查看官方文档
注意:
- Matrix不能使用自签名证书
- Element必须进行加密
- Matrix和Element都需要进行反向代理
server {
listen 443 ssl;
http2 on;
server_name www.example.com;
ssl_certificate /etc/nginx/cert/acme.pem;
ssl_certificate_key /etc/nginx/cert/acme.key;
ssl_session_timeout 1d;
ssl_session_cache shared:MozSSL:10m;
ssl_protocols TLSv1.1 TLSv1.2 TLSv1.3;
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:DHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA:ECDHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES256-SHA256:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:DES-CBC3-SHA;
ssl_prefer_server_ciphers off;
location / {
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $connection_upgrade;
proxy_set_header Host $host:$server_port;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Scheme $scheme;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://0.0.0.0:8000;
}
}
server {
listen 80;
server_name www.example.com;
return 301 https://$host$request_uri;
}
与其它服务器进行通信
如果想要你的服务器上的用户能与其它服务器上的用户相互通信,则需要对链接进行加密。可以在Matrix Federation Tester测试你的服务器是否能与其他服务器通信。如果没有错误,那么恭喜您,一切已经就绪。
在Synapse的配置中,server_name
变量决定了用户ID后面的域名,就像电子邮件地址@
符号后面的域名一样。假设我们要搭建的服务器名server_name=my-example.com
,那么服务器上的一个叫做user
用户名,其完整的用户名就是@user:my-example.com
。默认情况下,Matrix Federation里的其他服务器,会通过server_name:8443
来连接我们的服务器。
如果您打算使用 Synapse 服务器的实际域名(即 Traefik 路由中的Host(`my-example.com`)
内部域名),与用户名后缀(即server_name
)部署是一致的,而且也开放了8443
端口,那么可以跳过本节,直接开始服务。但要注意下面所有代码中的my-example.com
和chat.my-example.com
域名,全部替换成自己的同一个域名,即前面我所提到的保证VIRTUAL_HOST
LETSENCRYPT_HOST
SYNAPSE_SERVER_NAME
完全一致。