矩阵 是用于 VoIP、即时消息和视频通话(即实时通信)的开源标准(协议)。 它提供端到端加密,并支持连接到各种其他消息传递替代方案,如 松弛国税局, Telegram 或任何其他 XMPP 客户。 它也可以与低带宽连接一起使用。
在本教程中,我将向您展示如何使用 Docker 容器安装 Matrix homeserver Synapse。
什么是 Matrix 家庭服务器?
Matrix 本身只是一个规范,并且有许多公开可用的 Matrix 协议实现。
家庭服务器基本上是部署在服务器上的任何实现,您可以通过任何 Matrix 客户端(如 元素.
可能出现的问题是,如果一些已经公开可用,为什么还要设置私人家庭服务器?
好吧,首先,您可以在您的朋友、家人或同事之间共享您的私人家庭服务器,并将其用作您的日常通信媒介。 除非您与来自另一个家庭服务器的某些用户进行对话,否则所有数据在您的服务器中都是安全的。
这使您可以控制公共家庭服务器无法提供的各个方面。
使用 Docker 容器部署 Synapse Matrix homserver 实现
我会用 突触,本教程中流行的 Matrix 家庭服务器实现。 Synapse 用 Python 编写,由 Matrix 的核心团队开发。
我们在 Linux 手册中更喜欢 docker 而不是本机部署,因此以下部分将介绍使用执行的 Synapse 部署 码头工人.
先决条件
- Linux 系统/服务器。 我们建议使用 锂节点 用于在云中快速部署 Linux 服务器。
- 一个正常运行的域并访问其 DNS 记录(除非您想在 localhost 上设置它)
- 您应该同时安装了 docker 和 docker-compose。 您可以按照我们在 CentOS 上安装 Docker 和 Docker Compose 的指南进行操作。
- 我相信您对基本的 Linux 命令有所了解,并且您不害怕使用终端来编辑配置文件。
- Docker 的基本知识将对您有所帮助,但您也可以在没有它的情况下遵循本教程。
第一步:设置反向代理
在使用 Synapse 之前,首先,您必须设置反向代理容器及其伴侣 让我们加密 TLS 证书的容器(你确实需要 https,相信我)。
配置反向代理容器
在生产环境中,您不使用 docker run ...
, 你用 docker-compose
. 所以,让我们配置 jwilder/nginx-proxy
作为反向代理。
创建一个名为 reverse-proxy 的目录并切换到这个新创建的目录:
mkdir reverse-proxy && cd reverse-proxy
现在打开你喜欢的文本编辑器,创建一个名为 docker-compose.yml
,并添加以下内容:
version: "3.3"
services:
proxy:
image: "jwilder/nginx-proxy"
container_name: "proxy"
volumes:
- "certs:/etc/nginx/certs"
- "vhost:/etc/nginx/vhost.d"
- "html:/usr/share/nginx/html"
- "/run/docker.sock:/tmp/docker.sock:ro"
networks: ["server"]
restart: "always"
ports:
- "80:80"
- "443:443"
所以在这里,首先你定义你的服务,命名为 proxy
. 要记住的关键特征是:
- 卷证书、虚拟主机和 html 将在之间共享
jwilder/nginx-proxy
和jrcs/letsencrypt-nginx-proxy-companion
容器。 - docker 套接字以只读方式安装在
/tmp/docker.sock
. - 它使用默认桥接网络以外的网络。
- 端口 80 和 443 已绑定,分别用于 http 和 https。
配置letsencrypt-nginx-proxy-companion
在同一个撰写文件的末尾添加以下内容
letsencrypt:
image: "jrcs/letsencrypt-nginx-proxy-companion"
container_name: "letsencrypt"
volumes:
- "certs:/etc/nginx/certs"
- "vhost:/etc/nginx/vhost.d"
- "html:/usr/share/nginx/html"
- "/run/docker.sock:/var/run/docker.sock:ro"
environment:
NGINX_PROXY_CONTAINER: "proxy"
networks: ["server"]
restart: "always"
depends_on: ["proxy"]
在这里,您定义了另一个服务,名为letsencrypt。 让我们也来看看这个:
- 以前服务中的所有卷也都安装在此处的相同位置。
- docker 套接字绑定为只读
/var/run/docker.sock
. - 环境变量
NGINX_PROXY_CONTAINER
设置为反向代理容器的容器名称,在我们的例子中是“proxy”。 - 它共享相同的“服务器”网络。
在这两个服务描述的末尾,添加卷的定义和网络定义,如下所示:
networks:
server:
external: true
volumes:
certs:
vhost:
html:
这里需要注意两件重要的事情:
- 您将为 Synapse 使用单独的撰写文件。 这样,您将拥有模块化部署,并且您将能够通过使用不同的 YAML 文件部署反向代理和伴随服务轻松关闭一项服务,而不会影响其他服务。
- 网络是外部的。 这是为了避免与其他容器不共享同一网络的任何问题,因为如何
docker-compose
自动创建它时命名它的卷和网络。 所以这需要我们创建网络。 使用命令docker network create server
创建网络。
现在一切都完成了,保存文件并退出编辑器。
现在是时候启动您的反向代理服务器了。
docker-compose up -d
第 2 步:设置突触
现在是时候你终于开始关注好的部分了。 所以部署突触实际上是一个两步的过程。
首先,您需要它来生成配置,接下来,您整理配置并部署我们的主服务器。
让我们从获取 compose 文件开始。
生成配置
创建一个名为“synapse”的单独目录并切换到它。
mkdir synapse && cd synapse
创建一个名为 docker-compose.yml
并打开它,你知道演习,对不对?
确保使用正确的值 sub.domain.com
在此处的 yml 文件中:
version: "3.3"
services:
synapse:
image: "matrixdotorg/synapse:latest"
container_name: "synapse"
volumes:
- "./data:/data"
environment:
VIRTUAL_HOST: "sub.domain.com"
VIRTUAL_PORT: 8008
LETSENCRYPT_HOST: "sub.domain.com"
SYNAPSE_SERVER_NAME: "sub.domain.com"
SYNAPSE_REPORT_STATS: "yes"
networks: ["server"]
networks:
server:
external: true
从外观上看,这是一个标准的撰写文件,但仍然有几个突出的选项在下面解释:
- 您使用的是绑定挂载而不是卷,这是因为将在那里生成配置文件并且您要对其进行编辑。 您当然可以使用卷,但是您必须编辑位于
/var/lib/docker/volumes/<name>/_data
. - 环境变量
VIRTUAL_HOST
&LETSENCRYPT_HOST
用于letsencrypt和反向代理容器,它将生成必要的配置更改以及证书,而无需您手动干预。 - 确保
SYNAPSE_SERVER_NAME
指向 Synapse 服务器的 FQDN(连同子域)。 - 放
VIRUAL_PORT
到 8008。突触容器公开 HTTP 端口 8008 以供其客户端与其通信。 - 最后,确保该容器与反向代理容器使用相同的网络,否则容器将无法通信,进而破坏整个过程。
确认您已将服务器的 IP 添加到 DNS 的 A 记录中,并且 CNAME 记录指向确切的子域。
创建一个 data
目录并执行以下命令
docker-compose run --rm synapse generate
这将在 ./data 中生成名为“homeserver.yaml”的配置文件。
配置突触
有很多可配置的选项 homeserver.yaml
文件,这超出了本教程的范围。 我建议您仔细阅读该文件中的评论并阅读 这里.
现在,只需确保以下更改:
- 这
server_name
变量设置为您选择的子域,如环境变量中设置的那样SYNAPSE_SERVER_NAME
. - TLS 设置为假。 您正在使用反向代理,因此 TLS 是通过您的 Web 服务器处理的。 离开港口。
- 确保
enable_registration
设置为 true,以便您可以注册并使用您的家庭服务器。
Save 文件并退出。
部署 Synapse Matrix 主服务器
现在一切就绪,您可以使用简单的命令启动突触
docker-compose up -d
现在您的家庭服务器已经可以使用了。 如果您在 Web 浏览器中访问子域,您应该会看到如下消息:
将 PostgreSQL 用于数据库 [optional]
默认情况下,突触使用 SQLite 为其数据库。 现在这对于测试和临时使用很有用,但对于更重要的用例,我建议使用 PostgreSQL.
将 PostgreSQL 添加到突触撰写文件
如果您还没有进入 synapse 目录,请转到该目录,然后打开 docker-compose.yml
. 将以下行添加到此撰写文件中。
postgresql:
image: postgres:latest
restart: always
environment:
POSTGRES_PASSWORD: somepassword
POSTGRES_USER: synapse
POSTGRES_DB: synapse
POSTGRES_INITDB_ARGS: "--encoding='UTF8' --lc-collate="C" --lc-ctype="C""
volumes:
- "postgresdata:/var/lib/postgresql/"
networks: ["server"]
这 POSTGRES_INITDB_ARGS
变量是非常必要的。 它设置用于 postgres 数据库的排序规则、ctype 和编码。 这些是突触发挥作用的绝对必要条件。 将卷添加到卷部分:
volumes:
postgresdata:
配置突触
现在你必须让 synapse 知道 postgresql 数据库。 你可以通过编辑旧的 homeserver.yaml
文件。 打开该文件,并找出以下几行:
database:
name: sqlite3
args:
database: /path/to/homeserver.db
删除这些,因为我们不再需要它们了。 添加以下内容:
database:
name: psycopg2
args:
user: synapse
password: somepassword
host: postgresql
database: synapse
cp_min: 5
cp_max: 10
数据库的名称是 psycopg2,它是一个用于 python 的 PostgreSQL 适配器。
仔细观察,您会发现这与您为 postgresql 容器设置的环境变量之间的相似之处。
至于主机,正如您使用的那样 docker-compose
和自定义网络,突触将能够自动解析服务名称。 你不必担心这一点。
Save 文件并退出。
部署
那么,还剩下什么要做呢? 部署它。
docker-compose up -d
测试 Synapse Matrix 主服务器部署
您的家庭服务器已准备就绪。 让我们测试一下。 Matrix 只是一个协议,Synapse 只是一个实现。 您需要一个 Matrix 客户端才能像消息传递工具一样使用它。
这里有一个 各种 Matrix 客户端列表 可用的。 元素 可能是您可以使用的最流行的 Matrix 客户端之一。
安装 Matrix 客户端后,运行它。 在这里创建一个帐户。
在注册页面上,填写所有详细信息,然后在主服务器上输入您之前使用的子域。 点击注册。

现在,您有了一个完美运行的 Synapse 部署,您可以与家人或朋友一起使用,而不必担心您的数据存储在哪里或类似的事情。
使用 Docker 在 Synapse 中设置联合 [optional]
联合基本上是与不同主服务器上的用户进行通信的能力。
为了 example,如果您的用户 ID 是 @coolguy:coolserver.me,您将能够邀请像 @Greatme:awesome.us 这样的人到您的家庭服务器中的房间。
同样,您也可以加入托管在其他家庭服务器上的房间。
如果您已经运行了突触,则无需停止容器。 您只需要更改您的 NGINX 代理容器。 这包括不超过三个简短而简单的步骤。
有几种方法可以让联邦工作,但其中一种我发现非常容易遵循,并且需要对现有设置进行最少的更改,称为端口委托。
默认情况下,每个矩阵服务器都尝试通过端口 8443 访问另一个矩阵服务器。以下过程基本上告诉其他服务器使用不同的端口。 因为 https 已经在端口 443 中工作,您只需将默认矩阵通信端口委托给 443。
第 1 步:为我们的反向代理创建配置文件
进入 Nginx 反向代理目录。 创建一个文件,命名为 synapse-federation
. 将以下文本添加到此文件中:
location /.well-known/matrix/server {
return 200 '{"m.server": "$VIRTUAL_HOST:443"}';
}
改变 $VIRTUAL_HOST
到其适当的值,这基本上是您的矩阵实例所服务的域(根据突触的 docker-compose 文件设置)。
第 2 步:编辑 docker-compose.yml
打开你的 docker-compose.yml
文件并将另一个条目添加到卷数组:
- ./synapse-federation:/etc/nginx/vhost.d/$VIRTUAL_HOST
再次,改变 $VIRTUAL_HOST
到其适当的值。
第三步:重启代理服务器
现在您需要重新启动代理服务器。
docker-compose up -d proxy
这将重新创建反向代理容器。 您不必担心丢失任何以前的配置,除非您在部署后手动更改任何内容。 配置是动态的,因此一切都会好起来的。
测试更改
您可以通过两种方式测试更改。
尝试加入一个房间,如 #servers:matrix.org
. 执行以下命令,如果有 jq
安装:
curl https://federationtester.matrix.org/api/report?server_name=$VIRTUAL_HOST --silent | jq -r '.FederationOK'
或者使用这个更 hack-y 的:
curl https://federationtester.matrix.org/api/report?server_name=$VIRTUAL_HOST --silent | awk '/FederationOK/ {print $2}'
这应该输出“真”。 并且明显改变 $VIRTUAL_HOST
到为您的突触实例服务的域。
有帮助吗?
我希望这对你有帮助,就像我的经历一样。 如果您想要更多这样的文章,请随时在下面发表评论。 一世如果您遇到任何问题,请发表评论,我会尽力帮助您。