基于Martix协议的synapse服务部署教程:去中心化&端对端加密聊天服务
开始之前
如果使用1panel管理面板的话,以下的部署内容均可以在应用商店安装,安装时候请勾选修改docker compose文件,部分参数需要手动添加
文章包含:
后端服务部署
前端UI部署
coturn服务部署
可选择admin管理后台部署
需要用到的各项服务:
SMTP发信服务【可以使用gmail、qq邮箱等,也可以自行部署:https://111111111.net/archives/deploy-stalwart-docker】
各项功能和服务需要自定义解析域名,文中仅是参考
synapse部署
服务部署
首先生成服务端所需的配置文件,按需修改参数,未作特别说明的参数保持默认即可
-v /root/synapse-data:/data
映射文件夹用于保存数据,宿主机路径可以自定义修改
-e SYNAPSE_SERVER_NAME=设置主机名
要用作synapse服务端的域名,后期不可更改
docker run -it --rm -v /root/synapse-data:/data -e SYNAPSE_SERVER_NAME=设置主机名 -e SYNAPSE_REPORT_STATS=no -e SYNAPSE_HTTP_PORT=8008 -e SYNAPSE_CONFIG_DIR=/data -e SYNAPSE_DATA_DIR=/data -e TZ=Asia/Shanghai -e UID=1000 -e GID=1000 matrixdotorg/synapse:latest generate
创建用于运行服务的docker compose文件
services:
synapse:
container_name: synapse
environment:
- TZ=Asia/Shanghai
- UID=1000
- GID=1000
image: matrixdotorg/synapse:latest
logging:
options:
max-size: 10m
ports:
- 8008:8008
restart: always
volumes:
- /root/synapse-data:/data
前端element部署
目前element前端功能以及支持平台相对完善
docker compose一键部署:
services:
element-web:
image: vectorim/element-web
ports:
- 8080:80
volumes:
- ./root/element-web/config.json:/app/config.json # 映射配置文件
restart: always
coturn部署
如果希望使用语音以及视频电话,需要turn服务器,若不需要使用则可以跳过
Ubuntu一键安装:apt install coturn -y
synapse管理后台部署
可选功能,能够比较方便的管理synapse服务器,源码以及教程:https://github.com/Awesome-Technologies/synapse-admin
docker compose一键部署:
services:
synapse-admin:
container_name: synapse-admin
hostname: synapse-admin
build:
context: https://github.com/Awesome-Technologies/synapse-admin.git
args:
- BUILDKIT_CONTEXT_KEEP_GIT_DIR=1
# - NODE_OPTIONS="--max_old_space_size=1024"
# - BASE_PATH="/synapse-admin"
ports:
- "18080:80"
restart: always
配置优化
coturn配置文件
配置文件位于:/etc/turnserver.conf
由于内容过于庞大,以下仅挑出部分需要修改的参数说明,若是自行修改,要启用相应功能请删除注释,也可以使用以下配置文件直接覆盖掉已有的配置文件
域名证书申请部分可以使用acme申请,再导出到特定文件夹以供turn服务器使用,如果使用1panel面板,可以在申请证书的时候勾选推送到指定文件夹
以下配置文件的服务器认证配置中包含测试用的功能,请注意阅读注释并移除相关功能
# 监听端口部分
listening-port=3478
tls-listening-port=5349
alt-listening-port=0
alt-tls-listening-port=0
# 监听IP部分
listening-ip=192.168.1.10 # 改为coturn需要监听的内网IP,部分服务器有分配内网IP的例如192.168.x.x或是10.10.x.x等等,没有的话可以尝试填写0.0.0.0或者127.0.0.1或者服务器公网IP地址
external-ip=1.1.1.1 # 改为服务器的公网IP
# turn端口部分,分别设置最小和最大端口,按需修改,一般端口范围越大所消耗的性能也越多
min-port=45555
max-port=55555
# 一些相关安全设置,保持默认即可
fingerprint
lt-cred-mech
# 服务器认证部分
# 建议可以先注释掉以下两行,使用简单的oauth认证方式先检测一下turn服务的可用性
use-auth-secret
static-auth-secret=#自定义turn服务器认证密钥
# 启用oauth认证,对turn服务器进行简单测试,测试方式看下文
# 测试结束以后将以下两行配置删除或者添加注释符号禁用
oauth
user=guest:guest
realm=turn.domain.net # 填写turn服务器域名
cert=/etc/ssl/fullchain.pem # 上方域名的ssl证书
pkey=/etc/ssl/privkey.pem # 上方域名的ssl证书密钥
# 其他相关设置,保持默认即可
log-file=/var/tmp/turn.log
syslog
no-multicast-peers
no-cli
no-tlsv1
no-tlsv1_1
no-rfc5780
no-stun-backward-compatibility
response-origin-only-with-rfc5780
修改完以上配置文件以后,通过systemctl restart coturn
重启turn服务
可用性测试
打开turn测试网站:https://webrtc.github.io/samples/src/content/peerconnection/trickle-ice
在网页中分别添加3478和5349两个端口的turn服务器地址,填入测试用的oauth认证信息
turns:turn.domain.net:5349
turns:turn.domain.net:3478
按照下图所示填写完成以后点击“Gather candidates”按钮进行测试
重点观察输出类型是否包含”relay“和”srflx“,两者分别表示turn和sturn服务正常
最后一段输出为”Down“,此输出证明服务器正常运作
”URL (if present) relayProtocol (if present)“字段输出的URL和协议,URL应该包含3478和5349端口,协议则是tls,证明turn服务器使用tls安全通讯
服务器测试通过以后,应关闭oauth认证并使用secret认证
synapse配置文件
数据库
用于生产环境,建议使用官方推荐的postgresql数据库并且设置区域为C,若是使用1panel面板一键安装,需要添加参数:
- POSTGRES_INITDB_ARGS=--locale=C --encoding=UTF8 # 设置区域为C并且使用UTF-8编码以支持多语言文本存储
docker compose一键部署,按需修改参数
运行以后创建一个数据库用于synapse
services:
postgresql:
container_name: postgresql
environment:
- POSTGRES_USER=数据库root用户
- POSTGRES_PASSWORD=数据库root密码
- POSTGRES_INITDB_ARGS=--locale=C --encoding=UTF8 # 设置区域为C并且使用UTF-8编码以支持多语言文本存储
healthcheck:
interval: 30s
retries: 5
start_period: 20s
test:
- CMD
- pg_isready
- -h
- 127.0.0.1
- -p
- "5432"
- -q
- -U
- 数据库root用户名
timeout: 5s
image: postgres:17.4-alpine
ports:
- 5432:5432
restart: always
volumes:
- ./data:/var/lib/postgresql/data
配置文件
修改docker映射目录下的“homeserver.yaml”文件,其中已存在的部分特别是server name、key等关键字段勿修改,以下非完整配置文件,请阅读其中的功能模块按需添加至自己的服务器配置文件中
# 数据库部分
# 以下是参考参数
database:
name: psycopg2
args:
user: 数据库用户
password: 数据库密码
dbname: 数据库名称
host: 数据库连接地址
cp_min: 5
cp_max: 10
# ... as above
# seconds of inactivity after which TCP should send a keepalive message to the server
keepalives_idle: 10
# the number of seconds after which a TCP keepalive message that is not
# acknowledged by the server should be retransmitted
keepalives_interval: 10
# the number of TCP keepalives that can be lost before the client's connection
# to the server is considered dead
keepalives_count: 3
# Email发信服务部分
# 主要用于新用户注册验证以及部分消息通知
# 带说明或注释部分自定义修改,其余部分可以保持默认
email:
smtp_host: 邮箱主机名
smtp_port: SMTP端口
smtp_user: "登录用户名" # 一般是邮箱地址,根据自己邮件服务商的登录方式填写
smtp_pass: "邮箱密码"
force_tls: true
require_transport_security: true
enable_tls: true
notif_from: "自定义发信人名称 <邮箱地址>"
enable_notifs: true
notif_for_new_users: false
client_base_url: "https://element.domain.net" # 填写自部署的element前端域名,这是访问synapse服务器的基础域名,一般附加在注册邮件中
validation_token_lifetime: 15m
invite_client_location: https://element.domain.net # 填写自部署的element前端域名,发送邀请注册邮件时附加的域名
#templates:
# custom_template_directory: /path/to/custom/templates/
#自定义邮件模板,请参考官方文档配置 https://element-hq.github.io/synapse/latest/templates.html
#以下是各类邮件的标题,可自定义
subjects:
message_from_person_in_room: "%(person)s 在 %(room)s 聊天室中给你发送了一条消息"
message_from_person: "%(person)s 给你发送了一条消息"
messages_from_person: "%(person)s 给你发送了多条消息"
messages_in_room: "你有一条来自 %(room)s 聊天室的消息"
messages_in_room_and_others: "你有一些来自 %(room)s 聊天室和其他人的消息"
messages_from_person_and_others: "[%(app)s] 你有一些来自 %(person)s 和其他人的消息"
invite_from_person_to_room: "%(person)s 邀请你加入 %(room)s 聊天室"
# 以下3项主机名自行修改,会出现在邮件标题中
invite_from_person: "%(person)s 邀请你注册synapse.domain.net"
password_reset: "【synapse.domain.net】密码重置"
email_validation: "【synapse.domain.net】验证您的电子邮件"
# 用户体验部分
# 此部分允许了用户以Email邮件认证的方式进行注册
max_avatar_size: 10M #最大头像上传大小,一般不需要修改
federation_domain_whitelist: #与其它Matrix服务器联合的白名单,一般不需要修改
allow_profile_lookup_over_federation: false
max_upload_size: 1024M #最大文件上传大小,一般不需要修改
enable_registration: true #是否启用注册,一般不需要修改
#enable_registration_captcha: true #是否启用 recaptchat
#recaptcha_public_key: "<填入你的recaptchat公钥>"
#recaptcha_private_key: "<填入你的recaptchat私钥>"
registrations_require_3pid: #允许的3pid注册方式
- email
allow_guest_access: false #禁止访客
user_directory:
enabled: true
search_all_users: true
prefer_local_users: true
show_locked_users: false
# 以下定义用于将新注册用户自动邀请到聊天的空间或者房间,根据需要选择是否添加,空间和房间可以设置多个,一行一个隔开
auto_join_rooms:
- "空间或房间名称"
# 音视频通话部分
# 如果不使用功能,可以不添加
turn_uris:
- "turns:填写turn服务器域名?transport=udp"
- "turns:填写turn服务器域名?transport=tcp"
turn_shared_secret: "填写turn服务器认证密钥"
turn_user_lifetime: 86400000
turn_allow_guests: false
# 服务器消息部分
# 如果不安装synapse管理后台,这部分可以省略
server_notices:
system_mxid_localpart: server
system_mxid_display_name: "Server Notices" # 通知机器人名称,可以任意设置
system_mxid_avatar_url: "" # 头像设置,可以为空
room_name: "服务器通知" # 通知群组标题,可以任意设置
room_avatar_url: "" # 头像设置,可以为空
room_topic: "这是由管理员通过服务器向用户发送通知信息的频道" # 通知说明,可以任意设置
auto_join: true
修改完成以后重启synapse容器
启动以后创建一个管理员账户,自行修改用户名和密码字段
docker exec -it synapse register_new_matrix_user http://localhost:8008 -c /data/homeserver.yaml -a -u 管理员用户名 -p 密码
反向代理
参考配置:
官方建议的配置是把第一行写成:location ^~ (/_matrix|/_synapse/(client|admin))
但实际测试发现synapse管理后台连接服务器会有点问题,可以直接使用下方配置或者自行修改都行
location ^~ / {
proxy_pass http://127.0.0.1:8008;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header REMOTE-HOST $remote_addr;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $http_connection;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_http_version 1.1;
add_header X-Cache $upstream_cache_status;
add_header Cache-Control no-cache;
proxy_ssl_server_name off;
proxy_ssl_name $proxy_host;
}
尝试访问synapse服务端的域名,得到下图输出则证明synapse服务器成功运行
element配置文件
基础的element配置文件,参考说明进行修改,注意需要删除注释,未作说明的部分保持默认即可
反向代理参考synapse服务端的方向代理即可
{
"default_server_config": {
"m.homeserver": {
"base_url": "https://synapse.domain.net", //填写synapse服务端域名,需要与synapse配置文件中的保持一致
"server_name": "synapse.domain.net" //主机名,需要与synapse配置文件中的保持一致
},
"m.identity_server": {
"base_url": "https://vector.im"
}
},
"disable_custom_urls": true, //是否禁用自定义synapse域名
"disable_guests": true, //是否禁用游客访问
"disable_login_language_selector": false, //是否禁用用户更改显示语言
"disable_3pid_login": false, //是否禁用3pid登录,如果禁用则邮件、电话号码等登录方式将不可用
"force_verification": false,
"brand": "Element", //前端网页标题
"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"
],
"default_widget_container_height": 280,
"default_country_code": "CN",
"show_labs_settings": false,
"features": {},
"default_federate": false,
"default_theme": "light",
"room_directory": {
"servers": ["synapse.domain.net"] //填写synapse服务端域名
},
"enable_presence_by_hs_url": {
"https://matrix.org": false,
"https://matrix-client.matrix.org": false,
"https://synapse.domain.net": false //填写synapse服务端域名
},
"setting_defaults": {
"breadcrumbs": true
},
"jitsi": {
"preferred_domain": "meet.element.io"
},
"element_call": {
"url": "https://call.element.io",
"participant_limit": 8,
"brand": "Element Call"
},
"map_style_url": "https://api.maptiler.com/maps/streets/style.json?key=fU3vlMsMn4Jb6dnEIFsx"
}
修改完成以后重启element容器
尝试访问element前端网页,语言默认英文,可以自由选择显示语言
此时可以用synapse的管理员账户登录
synapse管理后台
前端网页中填入synapse服务端域名,使用synapse管理员账户登录即可