matrix是一种聊天协议规范,主要特色是端到端加密(服务器无法解密数据可以反审查)和去中心化,而在这个规范上目前官方社区有开发两种实现,一个是用python写得Synapse,另一种就是用go写得第二代服务端Dendrite,python我不怎么熟悉,官方也没提供windows的文件,我之前都是开linux虚拟机来专门运行Synapse,go我平时用得就比较多了,go的特性在任何系统中编译都非常方便,编译完也没有什么依赖,全部都编译进了单个程序中,go的运行速度也要快很多,因为各种原因我打算换成Dendrite,虽然官方说还在测试阶段不稳定,不过作为小型服务器已经是很稳定了。
这次我不打算解释双平台了,linux的流程几乎差不多。
pgsql数据库
这一步不是必须的,可以使用sqlite,但sqlite官方不保证可靠性(我在Synapse遇到过因为版本更新原本的sqlite数据库不能用了),而且sqlite必须每个配置都使用各自独立的文件,不能只用一个db文件,这其实比pgsql要麻烦得多。
数据库的安装很简单,在官方下载页面Windows x86-64找个喜欢的版本无脑下一步安装,我以版本16为例,安装时全默认,密码设置一下。
假设安装时的密码是111111,cmd创建数据库
set PGPASSWORD=111111
"C:\Program Files\PostgreSQL\16\bin\createdb.exe" -w -h 127.0.0.1 -p 5432 -U postgres --encoding=UTF-8 dendrite这样就创建成功了,在官方说明中UTF-8是必须的。
编译
官方没提供可执行文件,所以需要自己编译,go环境下载安装包无脑下一步安装,编译也很简单,这里没有用git,我觉得编译一次用git没有什么特别的好处,在cmd中运行
cd %UserProfile%
::上面这行不是必须的,为了避免有人用管理员开cmd在system32里运行
curl -o dendrite-main.zip -L https://github.com/element-hq/dendrite/archive/refs/heads/main.zip
powershell "Expand-Archive -Path dendrite-main.zip -DestinationPath .\\"
del dendrite-main.zip
cd dendrite-main
go build -o bin/ ./cmd/...这些命令使用得是最新的代码,运行过第一行的cd的话编译完文件会在%UserProfile%\dendrite-main\bin文件夹中,目前应该一共有9个文件,把这些文件放到喜欢的目录就行,之后的所有文件和命令都是在这个目录操作的。
我会通过脚本定期编译最新代码,在这里可以下载到最新由我编译的windows-x64文件,我的服务端也同样定期更新到这些文件。
如果遇到连不上github可以设置一下代理(如果不知道代理是什么,就不要运行这条命令,这会导致cmd完全连不上网)set http_proxy=http://127.0.0.1:7890 & set https_proxy=http://127.0.0.1:7890,clash端口号是7890,v2rayn是10809,这个命令应该在上面所有命令之前运行,并且保持同一个cmd终端,如果重开cmd需要重新设置代理。
生成签名密钥
之前编译完的文件中有一个叫generate-keys.exe,运行generate-keys --private-key matrix_key.pem,就会看到matrix_key.pem文件已经生成了。
配置文件
创建文本文件dendrite.yaml,在其中写入
global:
server_name: xxx.com #主域名,理应是顶级域名,像邮箱肯定是更希望看到@gmail.com而不是@www.gmail.com一样
private_key: ./matrix_key.pem
database:
connection_string: postgresql://postgres:111111@127.0.0.1/dendrite?sslmode=disable #数据库用户名:密码@数据库地址/数据库名称
max_open_conns: 90
max_idle_conns: 5
conn_max_lifetime: -1
cache:
max_size_estimated: 1gb
client_api:
registration_disabled: true #true为禁止注册
guests_disabled: true #true为禁止来宾账户
media_api:
base_path: ./media_store #媒体或其他文件存储目录
max_file_size_bytes: 10485760 #0为上传文件大小无限制
dynamic_thumbnails: false #不生成动态缩略图
sync_api:
real_ip_header: X-Forwarded-For #运行在其他web服务器后来获取真实ip这些是必须要写得配置,还有更多其他配置可以在官方示例中找到。
想要无条件注册除了registration_disabled改成false以外,还需要启动参数需要加上-really-enable-open-registration,不加上参数会不允许启动。
配置反向代理服务器
这一步不是必须的,只是web服务器一般都会有部署,比如我喜欢用caddy,这是我的配置
e.example.com {
header {
Strict-Transport-Security max-age=31536000; # enable HSTS
}
reverse_proxy 127.0.0.1:8008 {
trusted_proxies 0.0.0.0/0
header_up X-Forwarded-For {remote_host}
header_up X-Real-IP {remote_host}
}
}
example.com {
header {
Strict-Transport-Security max-age=31536000;
}
header /.well-known/matrix/* Content-Type application/json
header /.well-known/matrix/* Access-Control-Allow-Origin *
respond /.well-known/matrix/server `{"m.server": "e.example.com:443"}`
respond /.well-known/matrix/client `{"m.homeserver": {"base_url": "https://example.com"}}`
@matrix {
path /_matrix*
path /_dendrite*
path /_synapse*
}
handle @matrix {
reverse_proxy 127.0.0.1:8008 {
trusted_proxies 0.0.0.0/0
header_up X-Forwarded-For {remote_host}
header_up X-Real-IP {remote_host}
}
}
}如果在cdn后在只需要注释掉两条header_up就行,其中/.well-known/matrix/server用于服务器间联合通信,/.well-known/matrix/client是给客户端使用的地址,由于顶级域名一般是其他东西,所以matrix规定了可以通过两个响应来重定向服务端和客户端的请求,而我虽然是直接拿顶级域名部署的,但是由于服务器在国内,和国外联合比较困难,所以我在服务器间通信用了其他服务器来代理。
运行
直接运行dendrite -config .\dendrite.yaml -http-bind-address 127.0.0.1:8008就可以了,如果不希望看到那个终端窗口,也希望开机在登录用户之前运行,可以把这条命令放进bat文件中,然后把bat脚本用nssm做成服务。
服务器上用浏览器访问127.0.0.1:8008能看到matrix的字样就是启动成功了。
创建管理员账户
create-account -config .\dendrite.yaml -username myname -admin用户名可以修改,输入密码后就创建成功了。
数据库备份
写了一个脚本来定期备份,每6小时自动备份,备份前会保留最新的11个文件删除所有旧文件,这个脚本不依赖于计划任务,而是直接运行,也可以通过nssm做成服务,脚本启动后会在10秒后才开始备份,为了在开机时确保数据库比备份脚本先运行。备份的位置可以自己修改,比如onedrive这种自动同步云端的就是个好选择
@echo off
set PGPASSWORD=12345678
timeout /t 10
:start
for /f "delims=:" %%a in ('dir /b ".\backup\*.bak" ^| find /v /c "&#@"') do set count=%%a
if %count% GEQ 11 (
FOR /F "skip=11 tokens=*" %%i IN ('DIR /B /A-D /O-D ".\backup\"') DO DEL /F ".\backup\%%i"
)
if "%time:~0,1%"==" " (
set h=%time:~1,1%
) else (
set h=%time:~0,2%
)
"C:\Program Files\PostgreSQL\16\bin\pg_dump.exe" -w -h localhost -p 5432 -U postgres -d dendrite> .\backup\dendrite_backup_%date:~0,4%-%date:~5,2%-%date:~8,2%_%h%-%time:~3,2%-%time:~6,2%.bak
timeout /t 21600
goto start搭建完后打开网址效果就应该和我的服务器一样,我自己用得客户端是element。
虽然我的服务器开放注册,但是并不能保证数据库不会被我失手删了,这事我已经干过1次了。
如果遇到国内已经开了代理但是依旧打不开验证码的情况,把www.recaptcha.net加入代理名单中。