记Synapse+Element服务器Docker Compose搭建

作者:Stevie0427 发布时间: 2024-04-07 阅读量:145

准备工作

1、一台x86/amd64架构的Linux服务器(基本无性能要求,可用内存建议在200M以上)

2、安装Docker

curl -fsSL https://get.docker.com -o get-docker.sh
sudo sh ./get-docker.sh

若未安装可使用上述命令安装

3、一个域名(文中使用Cloudflare作为DNS提供商,并使用Cloudflare Pages部署客户端,如有需要也可使用其他提供商)

4、一个邮箱(可使用SMTP,用于设置发信,自建邮局/outlook等均可)

5、一个Cloudflare账户

搭建过程

1、使用Docker Compose搭建Synapse

创建一个文件夹以存放数据,并在该文件夹下创建docker-compose.yml,内容如下

version: "3.3"

services:
  synapse:
    image: "matrixdotorg/synapse:latest"
    container_name: "matrix_synapse"
    restart: unless-stopped
    healthcheck: #healthcheck,由于该镜像原有的Healthcheck在Nginx反代后疑似不起效导致服务始终显示Unhealthy,在此修改Healthcheck
      test: ["CMD", "curl", "-f", "你的服务器URL"]
      interval: 30s
      timeout: 10s
      retries: 3
      start_period: 40s
    ports:
      - '监听IP:端口:VIRTUAL_PORT'#此处VIRTUAL_PORT输入与下文VIRTUAL_PORT同样的端口
    volumes:
      - "./data:/data"#数据存放在./data文件夹中,可随意修改为可用路径
      VIRTUAL_HOST: "你的域名" #如使用子域名请填写子域名,下同
      VIRTUAL_PORT: 你的服务端口 #此处指的是Docker容器的端口,端口映射在上文有提到,端口无需加引号
      LETSENCRYPT_HOST: "你的域名" #此为其内置HTTPS使用的域名,本文中使用HTTP协议通过NPM反向代理实现HTTPS,故不重要
      SYNAPSE_SERVER_NAME: "你的域名"
      SYNAPSE_REPORT_STATS: "yes/no" #是否向官方服务器反馈错误

接下来使用如下命令在./data中生成配置文件

docker run -it --rm -v ./data/:/data/ -e SYNAPSE_SERVER_NAME=你的域名 -e SYNAPSE_REPORT_STATS=yes/no matrixdotorg/synapse:latest generate #yes/no选择一个,域名填写与docker-compose.yml相同的域名即可

生成成功后./data(或者自定义的路径)中会出现homeserver.yaml,将其修改,参照以下模板

# 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: "你的域名"
pid_file: /data/homeserver.pid
listeners:
  - port: 你的端口 #同上
    tls: false
    type: http
    x_forwarded: true
    resources:
      - names: [client, federation]
        compress: false
database: #这里使用SQLite,若要使用其他数据库请参考官方文档修改此处配置
  name: sqlite3
  args:
    database: /data/homeserver.db
log_config: "/data/你的域名.log.config" #可修改该文件以配置日志
media_store_path: /data/media_store #此处可以修改用户上传的媒体的存储路径(在容器中的路径)
registration_shared_secret: "保留生成的secret即可"
report_stats: false
macaroon_secret_key: "保留生成的secret即可"
form_secret: "保留生成的secret即可"
signing_key_path: "/data/你的域名.signing.key"
trusted_key_servers:
  - server_name: "matrix.org"

enable_registration: True #若是私人服务器设置为false可关闭注册
registrations_require_3pid: #使用邮箱注册,若需其他方式可参考官方文档
  - email
suppress_key_server_warning: True
public_baseurl: https://你的域名 #其他服务器访问你的服务器所用域名,同上面的域名即可
serve_server_wellknown: true #开启后服务器连接会通过443而不是非标端口,可以用于添加CDN
block_non_admin_invites: false
allow_guest_access: false
email:
  smtp_host: 你的邮件服务器 #无需引号
  smtp_port: 你的邮件服务器端口 #无需引号
  smtp_user: "你的SMTP账户"
  smtp_pass: "你的SMTP密码"
  enable_tls: true #是否开启TLS,OutLook需开启
  require_transport_security: true
  notif_from: "Your Friendly %(app)s homeserver <>" #验证邮件提示语,可按照喜好自行修改
  client_base_url: "https://你的element域名" #不同于上述"你的域名",指的是客户端域名,后续部署element时会提到
  validation_token_lifetime: 15m #验证邮件有效时长
  invite_client_location: https://你的element域名
  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 聊天室"
    invite_from_person: "%(person)s 邀请你注册<>"
    password_reset: "【】密码重置"
    email_validation: "【】验证您的电子邮件"
# vim:ft=yaml

修改完之后,使用chmod -R +777 ./data 将data文件夹权限设为最高,然后在含有docker-compose.yml的目录下使用docker compose up -d 启动服务器

此时,若你将服务器该端口映射到公网,访问公网IP+端口,应出现包含It works! Synapse is running 的界面,证明搭建正确

2、使用Nginx Proxy Manager进行反向代理

打开Nginx Proxy Manager,并添加Proxy Host,此处使用的域名是前文中"你的域名",IP与端口则是前文中Docker容器映射到的IP与端口,回源协议选择HTTP,开启TLS(如果使用Cloudflare CDN也可不开启TLS)

将域名解析至服务器公网IP,若访问https://你的域名 出现与上文一样的It works! Synapse is running 的界面,证明搭建成功

3、接入Cloudflare CDN(可选)

由于Cloudflare CDN会自行提供边缘TLS证书,所以若要接入Cloudflare CDN,前文配置Nginx Proxy Manager时可不使用TLS/使用Cloudflare提供的15年有效期的源服务器证书

另外一种方法是不使用Nginx Proxy Manager,而直接使用Origin Rules将该域名解析会员至指定端口,但是不推荐此种方式,因为Cloudflare免费计划中每个域名只有10条Origin Rules,且使用此种方式需在公网上暴露端口

4、搭建Synapse时的一些注意事项

(1)开启TLS十分重要

Matrix协议的加密与TLS有着密不可分的关系,若不开启TLS直接使用HTTP搭建HomeServer,在使用过程中会发现无法生成加密秘钥等问题

(2)接入Cloudflare CDN后的上传文件限制

在接入Cloudflare CDN后,由于免费版的限制,最大文件上传大小为100MB,否则会返回Error 413

(3)文件存储

文件会全部存储在搭建用服务器上,所以尽量使用硬盘较大的服务器作为HomeServer

5、使用Cloudflare Pages搭建Element客户端

由于Element客户端为纯前端页面,所以可以使用Cloudflare Pages搭建,而不必浪费服务器资源

https://github.com/element-hq/element-web

将此仓库的最新分支/稳定分支部署至Cloudflare Pages/任意前端托管平台上即可

注意需修改config.json,将其中的HomeServer修改为你自己的HomeServer,且将你自己的客户端域名解析至此Pages上,作为上文中的"你的element域名"

结语

Matrix是一个分布式的加密通讯协议,而Synapse是现存的唯一稳定服务端,Element也是一个很好用的稳定客户端,界面十分美观,如有需要也可尝试Android/IOS/PC版,浏览器版的泛用性相对更强,但操作相对更困难一些。