Matrix 是一种开源的通信协议,可以根据应用需求和场景自行搭建
只本地聊天
异地使用+少数联邦
全球无障碍通信
注意:选择海外 VPS 时,建议优先考虑具有良好网络连接和数据中心合规性的服务商。 |
配置域名DNS
root账号登录 ssh:ssh -p port root@ip
1、启用防火墙(强烈推荐)并开放指定端口,以Ubuntu为例:
# 允许外网访问指定端口 ufw allow 443/tcp # matrix联邦和客户端端口 ufw allow 8448/tcp # ssh端口(默认22) ufw allow 22/tcp # ssh端口(手动新添加的端口) ufw allow 2202/tcp # 其他需要开放的端口,例如25邮箱端口,或指定开放端口范围 ufw allow 8000:9000/tcp # 允许本地网络访问任意端口 ufw allow from 127.0.0.1 ufw allow from 172.16.0.0/12 ufw allow from 192.168.0.0/16 # 启用防火墙 ufw enable # 查看规则 ufw status verbose # --- # 如果需要删除规则 ufw delete allow 80/tcp # 重启防火墙 ufw reload # 或禁用防火墙 ufw disable |
2、修改SSH端口(强烈推荐)
vi /etc/ssh/sshd_config port 22 # 在配置中找到这一行取消注释并改成指定端口 /etc/init.d/ssh restart |
3、安装Docker和Docker Compose环境
设置docker开机自启:
systemctl enable docker.service |
4、申请SSL证书(推荐使用 acme.sh)
5、安装Nginx(推荐,也可选择其他反向代理工具)
有三种情况下需要使用反向代理:
apt update apt install nginx |
配置nginx: vi /etc/nginx/nginx.conf,参考:
# matrix的.well-known(服务发现)配置,如果.well-known异机提供则不需要 # 联邦(server)和客户端(client)路由可使用不同的端点 server { listen 443 ssl; server_name your_domain.com; # ssl证书放在自己手动上传的位置 ssl_certificate /root/ssl/fullchain.cer; ssl_certificate_key /root/ssl/*.your_domain.com.key; location = /.well-known/matrix/server { default_type application/json; add_header Access-Control-Allow-Origin "*"; return 200 '{"m.server": "matrix.your_domain.com:8448"}'; } location = /.well-known/matrix/client { default_type application/json; add_header Access-Control-Allow-Origin "*"; return 200 '{"m.homeserver": {"base_url": "https://matrix.your_domain.com:8448"}}'; } } # 使用alist备份 matrix 数据 server { listen 443 ssl; server_name alist.your_domain.com; ssl_certificate /root/ssl/fullchain.cer; ssl_certificate_key /root/ssl/*.your_domain.com.key; location / { proxy_pass http://localhost:5244; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; proxy_set_header Host $http_host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header Range $http_range; proxy_set_header If-Range $http_if_range; proxy_redirect off; client_max_body_size 20000m; } } # 给 matrix 反代(联邦和客户端可共用) server { listen 8448 ssl; listen [::]:8448 ssl; server_name matrix.your_domain.com; ssl_certificate /root/ssl/fullchain.cer; ssl_certificate_key /root/ssl/*.your_domain.com.key; add_header Strict-Transport-Security "max-age=15768000; includeSubdomains; preload" always; proxy_ssl_protocols TLSv1.1 TLSv1.2 TLSv1.3; location ~ ^(/_matrix|/_synapse/client) { proxy_pass http://localhost:8008; proxy_set_header X-Forwarded-For $remote_addr; proxy_set_header X-Forwarded-Proto $scheme; proxy_set_header Host $host; client_max_body_size 1024M; proxy_connect_timeout 300; proxy_read_timeout 300; proxy_send_timeout 300; proxy_http_version 1.1; } location / { proxy_pass http://localhost:8008; proxy_http_version 1.1; proxy_set_header X-Forwarded-For $remote_addr; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-Proto $scheme; } } |
检查nginx配置并重载:
nginx -t systemctl reload nginx |
如果是家庭 NAS
推荐用 Synapse.,目前最成熟的 matrix 服务端实现,可选 dendrite(go语言编写,理论上性能更优,但项目缺少维护),以下教程使用 synapse。
中国推荐用 pgzhparser,包含中文分词的 postgres 数据库。synapse不原生支持中文搜索,具体参考博文:给 Matrix Synapse 添加中文搜索。
# database_user、database_password、path填入自己新数据库的设置 # 可以使用bridge模式,指定端口映射 # 建议用17而不是latest标签,因为latest会有大版本更新,导致后续更新后数据库不兼容 docker run -d --restart=unless-stopped --name pgzhparser --net=host -e POSTGRES_USER=database_user \ -e POSTGRES_PASSWORD=database_password -e POSTGRES_DB=postgres -e PGDATA=/var/lib/postgresql/data \ -v /root/pgzhparser/data:/var/lib/postgresql/data abcfy2/zhparser:17 |
记住 database_user、database_password。进入数据库容器创建 matrix 数据库(指定LC_COLLATE、LC_CTYPE):
docker exec -it pgzhparser bash # 使用 `psql` 连接到 默认的 PostgreSQL 数据库 psql -U database_user -d postgres -- 在 `psql` 提示符下,执行以下 SQL 命令 -- synapsedb是新的数据库名称,database_user是之前使用的数据库用户名 CREATE DATABASE synapsedb WITH OWNER = database_user ENCODING = 'UTF8' LC_COLLATE = 'C' LC_CTYPE = 'C' TEMPLATE = template0; `\q`退出 |
中文搜索需要启用 Zhparser 分词:
# 再次进入 `psql` 提示符,并切换到新创建的数据库: psql -U database_user -d synapsedb -- 在 `psql` 提示符下,执行以下 SQL 命令来创建zhparser扩展和配置: CREATE EXTENSION IF NOT EXISTS zhparser; -- “chinese”是一个自定义名称,后续将用到 CREATE TEXT SEARCH CONFIGURATION chinese (PARSER = zhparser); ALTER TEXT SEARCH CONFIGURATION chinese ADD MAPPING FOR n,v,a,i,e,l WITH simple; -- 在 event_search 表中添加 chinese_vector 列,用于存储中文分词后的向量 ALTER TABLE event_search ADD COLUMN IF NOT EXISTS chinese_vector tsvector; -- 对已有数据进行中文分词处理 UPDATE event_search SET chinese_vector = to_tsvector('chinese', vector::text); -- 为中文列创建 GIN 索引 CREATE INDEX CONCURRENTLY event_search_chinese_vector_idx ON event_search USING GIN (chinese_vector) -- 退出交互命令 |
删除上述创建的数据库容器(数据已映射到本地):docker rm pgzhparser
使用 docker run 命令初始化 synapse 的 homeserver.yaml 文件,自动生成以下参数:
docker run -it --rm \ -v /root/synapse:/data \ -e SYNAPSE_SERVER_NAME=your_domain.com \ -e SYNAPSE_REPORT_STATS=no \ matrixdotorg/synapse:latest generate |
参考文档:Configuration Manual - Synapse
services: pgzhparser: image: abcfy2/zhparser:17 container_name: pgzhparser restart: unless-stopped # ports: # - "5503:5432" environment: POSTGRES_USER: 上一步创建的数据库账号 POSTGRES_PASSWORD: 上一步创建的数据库密码 POSTGRES_DB: postgres PGDATA: /var/lib/postgresql/data volumes: - /root/pgzhparser/data:/var/lib/postgresql/data network_mode: host # network_mode: bridge synapse: image: docker.io/matrixdotorg/synapse:latest container_name: synapse restart: unless-stopped environment: - SYNAPSE_CONFIG_PATH=/data/homeserver.yaml - UID=0 - GID=0 - TZ=Asia/Shanghai volumes: - ./data:/data - /root/ssl/your_domain.key:/ssl/your_domain.key:ro - /root/ssl/your_domain.cer:/ssl/your_domain.cer:ro # 映射上一节下载的自定义搜索脚本 - ./py_config/search.py:/usr/local/lib/python3.11/site-packages/synapse/storage/databases/main/search.py # 映射上一级下载的密码提供程序 - ./py_config/shared_secret_authenticator.py:/usr/local/lib/python3.11/site-packages/shared_secret_authenticator.py # .. or you may split this between different storage points # - /path/to/ssd:/data/uploads # - /path/to/large_hdd:/data/media network_mode: host # network_mode: bridge depends_on: - pgzhparser # ports: # - 8228:8448 # - 8008:8008 # - 8413:8413 healthcheck: disable: true alist: image: 'xhofe/alist:latest' container_name: alist volumes: - /root/alist/data:/opt/alist/data - /root:/backupsync # ports: # - '5244:5244' # network_mode: bridge network_mode: host environment: - PUID=0 - PGID=0 - UMASK=022 - TZ=Asia/Shanghai restart: unless-stopped |
# 在docker compse所在的文件夹 docker compose up -d # 检查一下日志有没有错误 docker logs -f synapse # 如果出现错误,停止服务,根据错误进行修正 docker compose down |
docker exec -it pgzhparser bash psql -U database_user -d synapsedb UPDATE users SET admin = 1 WHERE name = '@your_id:your_domain.com'; \q |
# http://localhost:8008 为synapse的服务端地址 docker exec -it synapse register_new_matrix_user http://localhost:8008 -c /data/homeserver.yaml --help |
管理员账号可以用来管理用户、房间、媒体、服务器监控和性能优化等,可以用 Synapse-Admin 这个 web 端和 Admin API - Synapse。
matrix的支持客户端:Matrix.org - Clients,以下是推荐:
国内手机用户推荐 Element 及其分支,它支持通过保持在后台或使用第三方网关的方式接收消息通知。Element 官版移动端首次登录或默认连接 matrix.org 服务器,有较长的超时响应,然后可以改为自己的服务器。
根据服务端配置,有三种方式注册用户:
1、SSH终端用预共享密钥注册(synapse):
# synapse 注册新用户 # http://localhost:8008 为synapse的服务端地址 docker exec -it synapse register_new_matrix_user http://localhost:8008 -c /data/homeserver.yaml --help # dendrite 注册新用户 docker exec -it dendrite /usr/bin/create-account -config /etc/dendrite/dendrite.yaml -username xxx |
2、使用admin_api注册:注册用户 - Synapse,可以在 Synapse-Admin 进行。
3、在客户端注册,需要在配置中启用注册功能,为防滥用,有以下几种配置方式:
发送通知测试:https://element-hq.github.io/synapse/latest/admin_api/server_notices.html
curl -X -v POST "https://matrix.your_domain.com:8443/_synapse/admin/v1/send_server_notice" \ -H "Authorization: Bearer syt_Z2Fs_qzgGUPbSiCunXXLaJKrT_0xFdnM" \ -H "Content-Type: application/json" \ -d '{"user_id": ""@youername:your_domain.com", "content": {"msgtype": "m.text", "body": "欢迎来到我们的服务器!"}}' |
docker compose -f /root/synapse/docker-compose.yaml pull docker compose -f /root/synapse/docker-compose.yaml up -d docker image prune -f |
# 更新证书 docker run --rm -v "/root/ssl":/acme.sh -e CF_Token="xxx" --net=host neilpang/acme.sh --renew --force --dns dns_cf --ocsp --server letsencrypt -d "*.your_domain.com" # 安装证书 acme.sh --install-cert -d example.com \ --key-file /path/to/keyfile/in/nginx/key.pem \ --fullchain-file /path/to/fullchain/nginx/cert.pem \ --reloadcmd "service nginx force-reload" # 重启synapse docker restart synapse # 重载nginx service nginx force-reload |
1、定时备份数据库
# 对数据库进行热备份并映射到外部目录 docker exec pgzhparser pg_dumpall -h synapsedb | gzip -c > /root/backup/pgzhparser_backup.sql.gz |
2、定时任务脚本
# 每天 08:00 更新服务组件 0 4 * * * cd /root/synapse && docker compose pull && docker compose up -d && docker image prune -f # 每天 04:00 备份数据库 0 8 * * * docker exec pgzhparser pg_dumpall -h synapsedb | gzip -c > /root/backup/pgzhparser_backup.sql.gz # 每88天更新SSL证书 0 0 */88 * * docker run --rm -v "/root/ssl":/acme.sh -e CF_Token="xxx" --net=host neilpang/acme.sh --renew \ --force --dns dns_cf --ocsp --server letsencrypt -d "*.your_domain.com" \ && acme.sh --install-cert -d example.com --key-file /path/to/keyfile/in/nginx/key.pem \ --fullchain-file /path/to/fullchain/nginx/cert.pem --reloadcmd "service nginx force-reload" \ && docker restart synapse && service nginx force-reload |
1、使用 Alist,Alist 的使用参考 AList 文档。
2、在其他服务器(如本地 NAS )实时同步 VPS 数据
1、清除无人值守的房间:synapse-admin 里面删一下
2、设置消息保留策略,不需要永久保留的房间可以单独设置短一些:Message Retention Policies - Synapse
3、单独设计房间的消息过期时间:Message Retention Policies - Synapse
4、清除房间历史记录:Purge History - Synapse
5、按用户|房间|大小|时间 清理媒体文件:Media - Synapse
6、清除远程用户设备列表的缓存:Useful SQL for Admins - Synapse
7、使用工具压缩数据库:matrix-org/rust-synapse-compress-state: A tool to compress some state in a Synapse instance's database
8、homeserver.yaml 中有关优化的配置: