2024.12.16 更新了升级matrix的过程。
QQ群频繁被封,不少人开始寻求替代方案。我之前也看过几个自托管聊天室,但动力不足,没精力尝试。今天想起老外那边最近流行Matrix ,部署一个试一下。
Matrix 是一个开源的即时通讯协议和网络平台,旨在提供去中心化、安全、互操作的通信方式。它允许用户在不同的服务器和应用之间进行即时消息、语音通话、视频通话等多种形式的交流,而不依赖于单一的集中式服务。Matrix 的核心优势在于其去中心化的架构,用户可以选择自己信任的服务器,确保更大的隐私和控制权。
本次使用https://github.com/spantaleev/matrix-docker-ansible-deploy ,准备了控制端(ansible)、服务端(synapse)、客户端(element-web/cinny)三个服务器。参考本文时请保持质疑,这不是教程,只是记录我部署和折腾的过程方便以后查看,我自己也是第一次使用!尤其是,我根本没用过Ansible!
1. 简介
- Ansible
- 一个开源的自动化工具,用于配置管理、应用部署、云服务编排等 IT 自动化任务
- 使用 Python 开发,采用 YAML 语法编写任务
- Inventory (清单)
- 定义要管理的主机列表和主机组
- 可以是静态文件(通常是 /etc/ansible/hosts)或动态生成
- 支持定义主机变量和组变量
- Playbook (剧本)
- Ansible 的配置、部署和编排语言
- 使用 YAML 格式编写
- 描述了一系列要在远程主机上执行的任务
- Task (任务)
- Playbook 中的基本执行单元
- 定义一个具体的操作,如安装包、复制文件等
- 每个任务会调用一个 Ansible 模块
- Module (模块)
- Ansible 的功能执行单元
- 内置了大量模块,如:
- apt/yum: 包管理
- copy: 文件复制
- service: 服务管理
- template: 模板处理
- Role (角色)
- 将 Playbook 组织成可重用的组件
- 包含完成特定功能所需的所有文件和配置
- 标准结构包含: tasks、handlers、files、templates、vars、defaults、meta
- Handler (处理器)
- 特殊的任务,只在被通知时执行
- 通常用于服务重启等操作
- 由 task 通过 notify 触发
- Variable (变量)
- 可在 Playbook 中使用的动态值
- 来源多样: inventory、playbook、role、命令行等
- 支持不同优先级和作用域
- Fact (事实)
- 通过 ansible 自动收集的目标主机信息
- 包括操作系统、硬件、网络等系统信息
- 可在 Playbook 中使用这些信息做条件判断
- Control Node (控制节点)
- 安装 Ansible 的主机
- 负责执行自动化任务
- 通过 SSH 连接管理其他节点
- Managed Node (被管理节点)
- 被 Ansible 管理的远程主机
- 一般只需要支持 SSH 和 Python
- 不需要安装专门的客户端软件
- 插件 (Plugin)
- 扩展 Ansible 功能的组件
- 类型包括:
- Connection: 连接插件
- Callback: 回调插件
- Filter: 过滤器插件
- 等等
- Collection (集合)
- Ansible 内容的分发格式
- 包含 playbook、角色、模块和插件
- 可通过 ansible-galaxy 管理
- Vault (保险库)
- 用于加密敏感数据
- 可加密整个文件或单个变量
- 保护密码、密钥等敏感信息
1. 配置ssh key
如果直接使用root密码登录可以跳过。
在Ansible控制机上放公钥和私钥,目录结构:
~/.ssh/
├── matrix_server_key # Matrix服务器私钥
├── matrix_server_key.pub # Matrix服务器公钥
└── config # SSH配置文件
SSH配置文件(~/.ssh/config)示例:
Host matrix-server
HostName matrix.yourdomain.com
User root
IdentityFile ~/.ssh/matrix_server_key
IdentitiesOnly yes
编辑添加公钥私钥:
# 创建目录(如果不存在)
mkdir -p /root/.ssh
# 设置正确的权限
chmod 700 /root/.ssh
# 现在创建/编辑密钥文件
vim /root/.ssh/matrix_server_key
# 设置密钥文件权限
chmod 600 /root/.ssh/matrix_server_key
设置公钥
vim /root/.ssh/matrix_server_key.pub
chmod 644 ~/.ssh/matrix_server_key.pub
如果ssh key还有密码,使用ssh-agent来管理密钥和密码:
# 启动ssh-agent
eval $(ssh-agent)
# 添加密钥到ssh-agent
ssh-add ~/.ssh/matrix_server_key
# 此时会要求输入一次密码,之后就不需要再输入了
# 将ssh-agent启动命令添加到~/.bashrc:
echo 'eval $(ssh-agent) > /dev/null' >> ~/.bashrc
如果重启服务器后需要重新执行:
ssh-add ~/.ssh/matrix_server_key
测试SSH连接:
ssh -i ~/.ssh/matrix_server_key root@your_ip
2. 安装Ansible(控制端)
我在一个1H1G30G的小鸡安装。用配置更高的服务器或本地运行应该能提高效率,我这台在运行剧本时经常cpu100%
apt update
apt install ansible python3 python3-pip git pwgen just -y
目录结构
~/matrix/
├── matrix-docker-ansible-deploy/ # playbook 目录
├── backups/ # 配置文件备份
└── logs/ # 部署日志
git项目
git clone https://github.com/spantaleev/matrix-docker-ansible-deploy.git
cd matrix-docker-ansible-deploy
编辑配置
# 创建配置目录
mkdir -p inventory/host_vars/matrix.yourdomain.com/
# 复制示例配置
cp examples/vars.yml inventory/host_vars/matrix.yourdomain.com/vars.yml
# 编辑主机配置文件
cp examples/hosts inventory/hosts
编辑 inventory/hosts, 其中修改ansible_ssh_private_key_file的值为ssh私钥位置
[matrix_servers]
matrix.yourdomain.com ansible_host=YOUR_SERVER_IP ansible_ssh_user=root ansible_ssh_private_key_file=~/.ssh/authorized_keys/matrix_server_key
打开编辑 inventory/host_vars/matrix.yourdomain.com/vars.yml,
以下是需要修改的关键配置:
# 基础域名配置
matrix_domain: example.com
matrix_server_fqn_matrix: "matrix.{{ matrix_domain }}"
# 用pwgen -s 64 1 生成
matrix_homeserver_generic_secret_key
# 用pwgen -s 32 1 生成
devture_postgres_connection_password
# 填写邮箱用于申请ssl
traefik_config_certificatesResolvers_acme_email
以下是我添加的配置
# 禁用 coturn(音视频通话)
matrix_coturn_enabled: false
# 禁用默认安装的element客户端,我要分离部署
matrix_client_element_enabled: false
# 禁用内置邮件服务,通过smtp发送邮件
matrix_mailer_enabled: false
exim_relay_sender_address: "another.sender@example.com"
exim_relay_relay_use: true
exim_relay_relay_host_name: "mail.example.com"
exim_relay_relay_host_port: 587
exim_relay_relay_auth: true
exim_relay_relay_auth_username: "another.sender@example.com"
exim_relay_relay_auth_password: "some-password"
# 填写邮箱用于申请ssl
traefik_config_certificatesResolvers_acme_email
# 允许注册,但需要邀请码
matrix_synapse_enable_registration: true
matrix_synapse_registration_requires_token: true
# 启用 Synapse Admin,可以生成邀请码管理用户等,链接为matrix.example.com/synapse-admin/
matrix_synapse_admin_enabled: true
限制上传大小
# 限制最大上传大小之类,还可以添加数据库备份等设置
matrix_synapse_max_upload_size_mb: 10
管理机器人,我使用pantalaimon不能正常运行,不知道为什么
matrix_bot_draupnir_enabled: true
matrix_bot_draupnir_access_token: "修改" # 在无痕浏览器打开element web获取后,不要登出,直接关闭窗口
matrix_bot_draupnir_management_room: "修改"
chatgpt机器人baibot
matrix_bot_baibot_enabled: true
matrix_bot_baibot_config_user_password: '生成强密码'
matrix_bot_baibot_config_user_encryption_recovery_passphrase: '编写'
matrix_bot_baibot_config_persistence_session_encryption_key: '生成强密码'
matrix_bot_baibot_config_persistence_config_encryption_key: '生成强密码'
matrix_admin: '@l1angth6:{{ matrix_domain }}'
Matrix Corporal,用来限制用户权限,比如创建房间。
Matrix Corporal添加允许私聊管理员配置,未测试
在运行 playbook 之前,需要配置以下 DNS 记录:
# A 记录
matrix IN A YOUR_SERVER_IP
element IN A YOUR_SERVER_IP # 如果需要 Element Web 客户端
3. 部署Synapse(服务端)
在服务端synapse安装:
apt install python3 python3-pip sudo git -y
以下操作都在ansible控制端进行:
安装just:
curl --proto '=https' --tlsv1.2 -sSf https://just.systems/install.sh | sudo bash -s -- --to /usr/local/bin
# 检查是否安装成功
just --version
启动安装步骤:
# 更新 ansible roles
just roles
# 安装
ansible-playbook -i inventory/hosts setup.yml --tags=install-all,ensure-matrix-users-created,start
通过ansible添加管理员用户:
just register-user <your-username> <your-password> <admin access: yes or no>
# Example: `just register-user john secret-password yes`
# 或者使用
ansible-playbook -i inventory/hosts setup.yml --extra-vars='username=admin password=YOUR_STRONG_PASSWORD admin=yes' --tags=register-user
4. 部署element-web 或 cinny 等(客户端)
安全提示:不要使用和matrix同一个主域名以避免出现跨域安全问题。
我最开始尝试使用ansible单独安装客户端,发现并不怎么方便。直接安装配置客户端非常简单,因此我还是直接用docker dompose安装了。
4.1 element-web
我觉得这个客户端最大的问题是没有手机网页端适配。
docker-compose.yml
services:
element-web:
image: vectorim/element-web:latest
volumes:
- ./config.json:/app/config.json
restart: unless-stopped
config.json, 比如要限制home server等。如果要默认配置可以不添加config文件
{
"default_server_config": {
"m.homeserver": {
"base_url": "https://matrix.example.com",
"server_name": "example.com"
}
},
"brand": "Element",
"default_country_code": "CN",
"disable_custom_urls": true,
"disable_guests": true,
"disable_login_language_selector": false,
"disable_3pid_login": true,
"default_federate": false,
"default_theme": "light",
"room_directory": {
"servers": [
"example.com"
]
},
"enable_presence_by_hs_url": {
"https://matrix.org": false,
"https://matrix-client.matrix.org": false
},
"setting_defaults": {
"breadcrumbs": true,
"MessageSearch": true
},
"features": {
"feature_thread": true,
"feature_location_share": false,
"feature_voice_messages": false
},
"labs_group": {
"enableNewRoomList": true
},
"showDevTools": false,
"auto_join_rooms": [
"!WdXUlsYTkFWaSPDyKK:example.com"
]
}
4.2 cinny
这个客户端最大的问题是没有多语言适配,自定义项麻烦。对于另一些人来说,消息通知也是问题。
docker-compose.yml
services:
cinny:
image: ghcr.io/cinnyapp/cinny:latest
container_name: cinny
restart: unless-stopped
volumes:
- ./config.json:/app/config.json
config.json
{
"defaultHomeserver": 0,
"homeserverList": [
"matrix.example.com"
],
"allowCustomHomeservers": false,
"featuredCommunities": {
"openAsDefault": true,
"spaces": [
"#main:example.com"
],
"rooms": [
"!DhWOamsXYxbaYISjiF:example.com"
],
"servers": ["matrix.example.com"]
},
"roomDirectory": {
"enabled": true
},
"spaceDirectory": {
"enabled": true
},
"hashRouter": {
"enabled": false,
"basename": "/"
},
"default_routes": {
"after_login": "#main:example.com"
},
"auto_join": {
"spaces": [
"#main:example.com"
]
}
}
5. 其他维护
版本控制建议
cd matrix-docker-ansible-deploy
git init
git add inventory/
git commit -m "Initial matrix config"
备份建议
定期备份以下内容:
- 整个 playbook 目录
- SSH 密钥
- inventory 配置
可以创建简单的备份脚本:
#!/bin/bash
BACKUP_DIR=~/matrix/backups
DATE=$(date +%Y%m%d)
# 备份配置
tar czf $BACKUP_DIR/matrix-config-$DATE.tar.gz matrix-docker-ansible-deploy/inventory/
# 备份 SSH 密钥
cp ~/.ssh/id_ed25519* $BACKUP_DIR/
1. 备份脚本 (backup_matrix.sh)
这个脚本会将 Inventory 配置、SSH 密钥 和 Vault 密码文件 打包成一个带有日期的压缩包。
#!/bin/bash
# --- 配置部分 ---
BACKUP_DIR="$HOME/matrix_backups" # 备份存放目录
PROJECT_DIR="$HOME/matrix-docker-ansible-deploy" # 项目所在目录
DATE=$(date +%Y%m%d_%H%M%S) # 时间戳
OUTPUT_FILE="$BACKUP_DIR/matrix_ansible_backup_$DATE.tar.gz"
# --- 准备工作 ---
mkdir -p "$BACKUP_DIR"
echo "正在开始备份..."
# --- 核心备份命令 ---
# 说明:
# 1. matrix项目下的 inventory 文件夹 (服务器配置)
# 2. .ssh 目录下的特定密钥 matrix_server_key 和 config (如果存在)
# 3. .vault_pass 文件 (密码文件)
# 4. ansible.cfg
tar -czvf "$OUTPUT_FILE" \
-C "$HOME" "matrix-docker-ansible-deploy/inventory" \
-C "$HOME" ".ssh/matrix_server_key" 2>/dev/null \
-C "$HOME" ".ssh/matrix_server_key.pub" 2>/dev/null \
-C "$HOME" ".ssh/config" 2>/dev/null \
-C "$HOME" ".vault_pass" 2>/dev/null \
-C "$HOME" "matrix-docker-ansible-deploy/ansible.cfg" 2>/dev/null || true
# 检查结果
if [ -f "$OUTPUT_FILE" ]; then
echo "------------------------------------------------"
echo "✅ 备份成功!"
echo "文件位置: $OUTPUT_FILE"
echo "包含密钥: matrix_server_key (如果存在)"
echo "------------------------------------------------"
else
echo "❌ 备份失败,可能是没有找到文件。"
fi
2. 恢复脚本 (restore_matrix.sh)
这个脚本用于在新 VPS 上运行。它会自动拉取最新的项目代码(如果还没拉取),解压配置文件,并自动修复 SSH 密钥权限。
#!/bin/bash
# 检查参数
if [ -z "$1" ]; then
echo "❌ 错误: 请指定备份文件路径。"
echo "用法: ./restore_matrix_ansible.sh <备份文件.tar.gz>"
exit 1
fi
BACKUP_FILE="$1"
PROJECT_DIR="$HOME/matrix-docker-ansible-deploy"
# ==========================================
# 1. 交互式环境检测与安装
# ==========================================
echo "🔍 正在检查环境依赖..."
# 定义需要检查的工具
NEEDED_CMDS="git python3 pip3 ansible sshpass"
MISSING_CMDS=""
for cmd in $NEEDED_CMDS; do
if ! command -v "$cmd" &> /dev/null; then
MISSING_CMDS="$MISSING_CMDS $cmd"
fi
done
if [ -n "$MISSING_CMDS" ]; then
echo "⚠️ 检测到缺少以下工具:$MISSING_CMDS"
read -p "❓ 是否尝试自动安装这些工具 (apt/pip)? [y/N] " response
if [[ "$response" =~ ^[yY]$ ]]; then
echo "⬇️ 正在安装基础工具..."
apt update
apt install -y git python3 python3-pip sshpass
# 检查 Ansible 是否安装 (有时 apt 源里的 ansible 版本太老,推荐 pip,但也可用 apt)
if ! command -v ansible &> /dev/null; then
echo "⬇️ 正在通过 apt 安装 Ansible..."
apt install -y ansible
fi
# 再次检查
if ! command -v git &> /dev/null; then
echo "❌ 安装失败,请手动安装 git 后重试。"
exit 1
fi
else
echo "❌ 用户取消安装,脚本退出。"
exit 1
fi
else
echo "✅ 所有基础依赖检查通过。"
fi
# ==========================================
# 2. 拉取项目代码 (版本处理)
# ==========================================
if [ ! -d "$PROJECT_DIR" ]; then
echo "⬇️ 正在克隆最新版 Matrix Ansible 代码..."
git clone https://github.com/spantaleev/matrix-docker-ansible-deploy.git "$PROJECT_DIR"
echo "ℹ️ 注意:已拉取最新版代码。如果因版本差异导致运行报错,请查阅项目 Changelog。"
else
echo "📂 项目目录已存在,跳过克隆。"
fi
# ==========================================
# 3. 解压与恢复
# ==========================================
echo "📦 正在解压备份文件..."
TEMP_DIR=$(mktemp -d)
tar -xzvf "$BACKUP_FILE" -C "$TEMP_DIR" > /dev/null 2>&1
# --- 恢复 Inventory (智能查找路径) ---
echo "⚙️ 正在恢复配置文件..."
# 无论备份时带不带项目文件夹,都能找到 host_vars 的上级目录
SOURCE_INVENTORY=$(find "$TEMP_DIR" -type d -name "host_vars" | head -n 1 | xargs dirname)
if [ -n "$SOURCE_INVENTORY" ] && [ -d "$SOURCE_INVENTORY" ]; then
# 先清空目标 inventory,防止旧文件干扰
# rm -rf "$PROJECT_DIR/inventory/*"
# (注:保留上面注释,建议覆盖而不是清空,以免误删 sample 文件)
cp -r "$SOURCE_INVENTORY/"* "$PROJECT_DIR/inventory/"
echo "✅ 配置已恢复。"
else
echo "❌ 错误: 备份文件中未找到 inventory 数据!"
fi
# --- 恢复 Vault 密码 ---
if [ -f "$TEMP_DIR/.vault_pass" ]; then
cp "$TEMP_DIR/.vault_pass" "$HOME/.vault_pass"
echo "✅ Vault 密码已恢复。"
fi
# --- 恢复 Ansible 配置 ---
if [ -f "$TEMP_DIR/matrix-docker-ansible-deploy/ansible.cfg" ]; then
cp "$TEMP_DIR/matrix-docker-ansible-deploy/ansible.cfg" "$PROJECT_DIR/ansible.cfg"
fi
# ==========================================
# 4. 恢复 SSH 密钥并强制修正权限
# ==========================================
echo "🔑 正在恢复 SSH 密钥..."
mkdir -p "$HOME/.ssh"
# 强制修正目录权限
chmod 700 "$HOME/.ssh"
KEY_RESTORED=false
# 恢复 matrix_server_key
if [ -f "$TEMP_DIR/.ssh/matrix_server_key" ]; then
cp "$TEMP_DIR/.ssh/matrix_server_key"* "$HOME/.ssh/"
# 强制修正文件权限 (回应你的问题1)
chmod 600 "$HOME/.ssh/matrix_server_key"
[ -f "$HOME/.ssh/matrix_server_key.pub" ] && chmod 644 "$HOME/.ssh/matrix_server_key.pub"
KEY_RESTORED=true
echo "✅ matrix_server_key 权限已修正为 600。"
fi
# 恢复 config
if [ -f "$TEMP_DIR/.ssh/config" ]; then
cp "$TEMP_DIR/.ssh/config" "$HOME/.ssh/"
chmod 644 "$HOME/.ssh/config"
echo "✅ SSH config 已恢复。"
fi
# 兜底检查 id_ed25519 (以防万一备份的是默认名)
if [ -f "$TEMP_DIR/.ssh/id_ed25519" ]; then
cp "$TEMP_DIR/.ssh/id_ed25519"* "$HOME/.ssh/"
chmod 600 "$HOME/.ssh/id_ed25519"
chmod 644 "$HOME/.ssh/id_ed25519.pub"
fi
if [ "$KEY_RESTORED" = false ]; then
echo "⚠️ 提示: 未在备份中找到 'matrix_server_key'。如果您使用密码或默认密钥登录,请忽略。"
fi
# ==========================================
# 5. 清理
# ==========================================
rm -rf "$TEMP_DIR"
echo "------------------------------------------------"
echo "🎉 迁移环境准备完成!"
echo "1. 进入目录: cd $PROJECT_DIR"
echo "2. 测试连接: ansible -i inventory/hosts all -m ping"
echo "------------------------------------------------"
如何使用
第一步:在旧 VPS 上备份
- 创建并保存脚本:
nano backup_matrix.sh # (粘贴上面的备份脚本内容,保存退出) chmod +x backup_matrix.sh - 运行脚本:
./backup_matrix.sh - 它会生成类似
~/matrix_backups/matrix_ansible_backup_20260201_120000.tar.gz的文件。
第二步:转移文件
使用 scp 或 SFTP 将生成的 .tar.gz 文件下载到你电脑,再上传到新 VPS 的用户主目录(例如 /root/ 或 /home/username/)。
第三步:在新 VPS 上恢复
- 创建并保存恢复脚本:
nano restore_matrix.sh # (粘贴上面的恢复脚本内容,保存退出) chmod +x restore_matrix.sh - 运行脚本(后面跟上你的压缩包文件名):
./restore_matrix.sh matrix_ansible_backup_20260201_120000.tar.gz - 测试:
ansible -i inventory/hosts all -m ping
日常使用建议
1. 更新 playbook:
cd matrix-docker-ansible-deploy
git pull
ansible-galaxy install -r requirements.yml --force
2. 修改配置后:
# 保存配置变更
git add inventory/
git commit -m "Update configuration"
# 应用配置
ansible-playbook -i inventory/hosts setup.yml --tags=setup-all,start
6. 迁移备份
先检查更新日志,看是否有需要手动调整的修改。https://github.com/spantaleev/matrix-docker-ansible-deploy/blob/master/CHANGELOG.md
更新剧本和 Ansible 角色
cd matrix-docker-ansible-deploy
just update
重新运行剧本设置
ansible-playbook -i inventory/hosts setup.yml --tags=setup-all,ensure-matrix-users-created,start
更新:如果使用debian12 apt install的ansible提示版本太旧,则使用pip3重新安装:
apt remove -y ansible
apt autoremove -y
pip3 install ansible --break-system-packages
hash -r
ansible --version
## 随后
ansible-galaxy install -r requirements.yml --force
## 可能需要
pip3 install passlib --break-system-packages
## 完整更新
ansible-playbook -i inventory/hosts setup.yml --tags=setup-all,start
## 升级数据库
ansible-playbook -i inventory/hosts setup.yml --tags=upgrade-postgres && \
ansible-playbook -i inventory/hosts setup.yml --tags=start
## 优化数据库
ansible-playbook -i inventory/hosts setup.yml --tags=run-postgres-vacuum -e postgres_vacuum_preset=analyze
## 自检
ansible-playbook -i inventory/hosts setup.yml --tags=self-check
其他
搭建完成后发现对我来说实际用途并不大。并且在matrix这个主要目的为去中心化的项目上添加各种管理和限制是有些麻烦和水土不服的。现在确实有成品解决方案,但热度太低,浪费了我比较多时间。
另外,matrix的管理机器人和gpt等机器人设计及其反人类,完全不是面向用户设计的。如果你习惯用discord机器人应该能感受到。
总之我折腾部署这个项目本来是打算实际使用的,现在看来可能大概率是要吃灰了。虽然我花了大量时间,熟悉了多项流程,解决了多个问题,让这个项目能在我们的需求下大致实际应用了,但用户并不买单——你不能出于想要解决监管问题简单的期望能用matrix替代discord或是qq群之类。这可能也是很多自建im的人遇到的问题。







![表情[qiang]-THsInk](https://www.thsink.com/wp-content/themes/zibll/img/smilies/qiang.gif)