开始之前

如果使用1panel管理面板的话,以下的部署内容均可以在应用商店安装,安装时候请勾选修改docker compose文件,部分参数需要手动添加

文章包含:

  • 后端服务部署

  • 前端UI部署

  • coturn服务部署

  • 可选择admin管理后台部署

需要用到的各项服务:

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管理员账户登录即可