selfhost-matrix-element
Linux Matrix + Element (Synapse) 生产级部署实操指南
本指南基于生产级 Docker Compose 架构规范,介绍如何部署 Matrix 通信生态。该方案采用配置与逻辑分离原则,并实施严格的网络隔离策略以确保数据库安全性。
1. 前置准备
1.1 环境要求
- 操作系统:Linux (Ubuntu 22.04+ / RocketLinux 8+ 推荐)
- 核心组件:Docker Engine 24.0+, Docker Compose V2
- 网络条件:已拥有公网 IP 或内网穿透环境,且 80/443 端口已开放。
- 域名准备:需准备两个 A 记录指向服务器 IP:
matrix.example.com(服务端)element.example.com(Web 客户端)
1.2 目录初始化
# 定义基础数据根目录(对应变量 ${BASE_DATA_PATH})
mkdir -p /opt/matrix-data/{synapse,element,postgres}
2. 核心部署配置
2.1 环境配置文件 (.env)
[!WARNING]
.env文件包含敏感凭据,严禁上传至公共代码仓库。修改POSTGRES_PASSWORD后必须同步更新homeserver.yaml中的连接字符串。
# /opt/matrix-data/.env
# 项目基础配置
COMPOSE_PROJECT_NAME=matrix
BASE_DATA_PATH=/opt/matrix-data
PROXY_NETWORK_NAME=proxy_nw
TZ=Asia/Shanghai
# 域名定义
DOMAIN=example.com
MATRIX_SUBDOMAIN=matrix.example.com
# 数据库配置
POSTGRES_VERSION=17-alpine
POSTGRES_USER=synapse
POSTGRES_PASSWORD=your_secure_password_here
POSTGRES_DB=synapse
2.2 服务编排文件 (docker-compose.yml)
网络架构模式说明:
本配置采用 标准隔离 / 数据库保护。
拓扑结构:
matrix.synapse与matrix.element同时接入内部default网络与外部${PROXY_NETWORK_NAME},实现对外服务与内部通信。matrix.db仅接入内部default网络,从物理层面禁止外部直接访问数据库。安全约束: 根据规范,Web UI 及 API 端口(8008, 80)不进行宿主机端口映射(
ports),强制通过反向代理网络访问。
# /opt/matrix-data/docker-compose.yml
services:
# 数据库:后端存储
db:
image: postgres:${POSTGRES_VERSION}
container_name: ${COMPOSE_PROJECT_NAME}-db
restart: unless-stopped
environment:
- POSTGRES_USER=${POSTGRES_USER}
- POSTGRES_PASSWORD=${POSTGRES_PASSWORD}
- POSTGRES_DB=${POSTGRES_DB}
- POSTGRES_INITDB_ARGS=--encoding=UTF-8 --lc-collate=C --lc-ctype=C
- TZ=${TZ}
volumes:
- ${BASE_DATA_PATH}/postgres:/var/lib/postgresql/data
# Matrix 核心服务
synapse:
image: matrixdotorg/synapse:latest
container_name: ${COMPOSE_PROJECT_NAME}-synapse
restart: unless-stopped
networks:
- default:
- proxy_net:
volumes:
- ${BASE_DATA_PATH}/synapse:/data
environment:
- SYNAPSE_CONFIG_PATH=/data/homeserver.yaml
- TZ=${TZ}
depends_on:
- db
# Element Web 客户端
element:
image: vectorim/element-web:latest
container_name: ${COMPOSE_PROJECT_NAME}-element
restart: unless-stopped
networks:
default:
proxy_net:
volumes:
- ${BASE_DATA_PATH}/element/config.json:/app/config.json
environment:
- TZ=${TZ}
networks:
# 声明外部反向代理网络
proxy_net:
external: true
name: ${PROXY_NETWORK_NAME}
# 默认内部网络 (由 Compose 自动管理)
default:
name: ${COMPOSE_PROJECT_NAME}_internal
3. 关键应用配置
3.1 Synapse 初始化与数据库接入
生成初始配置:
docker run -it --rm \
-v "${BASE_DATA_PATH}/synapse:/data" \
-e SYNAPSE_SERVER_NAME=matrix.example.com \
-e SYNAPSE_REPORT_STATS=no \
matrixdotorg/synapse:latest generate
3.2 Synapse 配置优化 (homeserver.yaml)
编辑 ./synapse-data/homeserver.yaml,调整数据库与基础权限:修改 ${BASE_DATA_PATH}/synapse/homeserver.yaml 中的数据库部分:
# 数据库连接配置
database:
name: psycopg2
args:
user: synapse # 对应 .env 中的 POSTGRES_USER
password: your_password # 对应 .env 中的 POSTGRES_PASSWORD
database: synapse # 对应 .env 中的 POSTGRES_DB
host: matrix-db # 对应 container_name
cp_min: 5
cp_max: 10
| 配置项 | 说明 | 建议值 |
|---|---|---|
database.name |
数据库驱动 | psycopg2 |
database.args.host |
数据库主机名 | matrix.db (对应 Compose 别名) |
enable_registration |
开放注册 | false (生产环境建议关闭) |
use_presence |
在线状态追踪 | false (关闭可降低 CPU/内存压力) |
max_upload_size |
最大附件限制 | 50M |
3.3 Element 客户端配置 (config.json)
编辑 ${BASE_DATA_PATH}/element/config.json:
{
"default_server_config": {
"m.homeserver": {
"base_url": "https://matrix.example.com",
"server_name": "matrix.example.com"
}
},
"brand": "Matrix Private Cloud",
"disable_custom_urls": true,
"disable_guests": true,
"default_theme": "dark"
}
4. 宿主机反向代理 (Nginx 示例)
需在宿主机 Nginx 配置文件中添加以下虚拟主机逻辑,并处理 SSL 证书。
4.1 Matrix 服务端配置
server {
listen 443 ssl;
server_name matrix.example.com;
location / {
proxy_pass http://127.0.0.1:8008;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_set_header X-Forwarded-Proto $scheme;
}
# Federation 联邦发现配置
location /.well-known/matrix/server {
return 200 '{"m.server": "matrix.example.com:443"}';
add_header Content-Type application/json;
}
location /.well-known/matrix/client {
return 200 '{"m.homeserver": {"base_url": "https://matrix.example.com"}}';
add_header Content-Type application/json;
add_header "Access-Control-Allow-Origin" "*";
}
}
由于容器未暴露端口,Nginx 必须接入 ${PROXY_NETWORK_NAME} 网络或通过容器名进行转发。若 Nginx 运行在宿主机,请确保防火墙允许反代网络段访问容器。
# 转发至 Synapse API
server {
server_name matrix.example.com;
listen 443 ssl;
location / {
# 使用容器名及内部端口通信
proxy_pass http://matrix-synapse:8008;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
# 转发至 Element Web
server {
server_name element.example.com;
listen 443 ssl;
location / {
proxy_pass http://matrix-element:80;
proxy_set_header Host $host;
}
}
5. 账户管理与运维
5.1 启动服务
docker compose up -d
5.2 账号创建方案
方案 A:命令行创建(推荐)
适用于初始化管理员或手动录入用户。
# 创建管理员账号
docker exec -it matrix-synapse register_new_matrix_user \
http://localhost:8008 -c /data/homeserver.yaml --admin
# 创建普通账号
docker exec -it matrix-synapse register_new_matrix_user \
http://localhost:8008 -c /data/homeserver.yaml --no-admin
注:localpart 提示符处输入所需用户名(如 root),生成的完整 ID 为 @root:matrix.example.com。
方案 B:数据库直接提权
若需将已有账号 user_id 提升为管理员:
docker exec -it matrix-db psql -U synapse -d synapse -c "UPDATE users SET admin = 1 WHERE name = '@user_id:domain';"
6. 常见问题排查
- 数据库连接失败:确保
homeserver.yaml中的database.args.host指向matrix.db而非localhost。 - 联邦通信失败:需确保
.well-known路径可正常访问且返回正确的 JSON 格式。 - 移动端登录错误:在移动端 Element 登录时,必须手动修改“服务器 URL”为
https://matrix.example.com,而非默认的matrix.org。
参考资料
5. 常见管理操作
5.1 用户注册 (本地管理)
在禁用公开注册的情况下,通过容器内工具手动创建用户:
# 创建管理员
docker exec -it matrix-synapse register_new_matrix_user \
http://localhost:8008 -c /data/homeserver.yaml --admin
# 按照提示输入用户名 (localpart) 和密码
5.2 数据库维护
# 进入数据库命令行
docker exec -it matrix-db psql -U synapse -d synapse
6. 参考资料
Would you like me to generate a monitoring sidecar configuration (e.g., Prometheus Exporter) based on this Network Mode A architecture?