269 lines
8.3 KiB
Markdown
269 lines
8.3 KiB
Markdown
|
|
# Свой Matrix-сервер (Synapse) + PostgreSQL + S3 (Rclone)
|
|
|
|
**Архитектура:**
|
|
* **Среда:** Proxmox LXC (Debian 12/13).
|
|
* **БД:** Выделенный PostgreSQL (на NAS).
|
|
* **Файлы:** S3-совместимое хранилище (RustFS/MinIO) примонтированное через `rclone`.
|
|
|
|
### ⚠️ ШАГ 0: Настройка Proxmox (Критически важно!)
|
|
Перед созданием контейнера убедитесь, что гипервизор разрешает ему монтировать файловые системы:
|
|
1. В веб-интерфейсе Proxmox выберите ваш LXC-контейнер.
|
|
2. Идем в **Options -> Features**.
|
|
3. Обязательно ставим галочку **FUSE** (и `Nesting`).
|
|
4. Перезагружаем контейнер.
|
|
|
|
---
|
|
CREATE USER synapse WITH PASSWORD 'SyperParol';
|
|
|
|
|
|
### 🗄 ШАГ 1: Подготовка Базы Данных (Выполняется на NAS)
|
|
Matrix ОЧЕНЬ требователен к кодировкам. Если создать базу по умолчанию, она упадет с ошибкой сортировки текстов.
|
|
Заходим по SSH на сервер с базами данных (NAS) и выполняем:
|
|
|
|
```bash
|
|
sudo -u postgres psql
|
|
```
|
|
```sql
|
|
CREATE USER synapse WITH PASSWORD 'ТвойСуперПароль';
|
|
-- Обязательно используем локаль 'C' и template0
|
|
CREATE DATABASE synapse OWNER synapse ENCODING 'UTF8' LC_COLLATE = 'C' LC_CTYPE = 'C' TEMPLATE template0;
|
|
\q
|
|
```
|
|
|
|
---
|
|
|
|
### ☁️ ШАГ 2: Подключение S3-хранилища через Rclone (В LXC-контейнере Matrix)
|
|
Мы монтируем бакет на уровне системы с кэшем в RAM/SSD.
|
|
|
|
**0. Создайте бакет в S3:**
|
|
```
|
|
Имя бакета matrix-media
|
|
Создайте ваш API ключ
|
|
```
|
|
|
|
**1. Устанавливаем зависимости:**
|
|
```bash
|
|
apt update && apt upgrade -y
|
|
apt install -y curl rclone fuse3
|
|
```
|
|
|
|
**2. Разрешаем FUSE работать для всех пользователей:**
|
|
```bash
|
|
echo "user_allow_other" >> /etc/fuse.conf
|
|
```
|
|
|
|
**3. Создаем конфиг Rclone:**
|
|
```bash
|
|
mkdir -p /root/.config/rclone
|
|
nano /root/.config/rclone/rclone.conf
|
|
```
|
|
*Вставляем:*
|
|
```ini
|
|
[rustfs]
|
|
type = s3
|
|
provider = Minio
|
|
env_auth = false
|
|
access_key_id = ТВОЙ_ACCESS_KEY
|
|
secret_access_key = ТВОЙ_SECRET_KEY
|
|
endpoint = http://172.20.50.13:9000
|
|
force_path_style = true
|
|
region = us-east-1
|
|
```
|
|
|
|
**4. Настраиваем системную службу монтирования:**
|
|
```bash
|
|
mkdir -p /opt/synapse/data/media_store
|
|
mkdir -p /var/cache/rclone
|
|
nano /etc/systemd/system/rclone-matrix.service
|
|
```
|
|
*Вставляем:*
|
|
```ini
|
|
[Unit]
|
|
Description=Rclone mount for Matrix Media
|
|
After=network-online.target
|
|
|
|
[Service]
|
|
Type=notify
|
|
ExecStartPre=/bin/mkdir -p /opt/synapse/data/media_store
|
|
ExecStartPre=/bin/mkdir -p /var/cache/rclone
|
|
ExecStart=/usr/bin/rclone mount rustfs:matrix-media /opt/synapse/data/media_store \
|
|
--config=/root/.config/rclone/rclone.conf \
|
|
--allow-other \
|
|
--dir-perms 0770 \
|
|
--file-perms 0660 \
|
|
--vfs-cache-mode full \
|
|
--vfs-cache-max-size 5G \
|
|
--vfs-cache-max-age 24h \
|
|
--vfs-read-chunk-size 16M \
|
|
--buffer-size 32M \
|
|
--umask 007
|
|
ExecStop=/bin/fusermount3 -uz /opt/synapse/data/media_store
|
|
Restart=on-failure
|
|
RestartSec=5
|
|
|
|
[Install]
|
|
WantedBy=multi-user.target
|
|
```
|
|
*Запускаем и проверяем:*
|
|
```bash
|
|
systemctl daemon-reload
|
|
systemctl enable --now rclone-matrix
|
|
systemctl status rclone-matrix # Должно быть active (running)
|
|
```
|
|
|
|
---
|
|
|
|
### 🧠 ШАГ 3: Установка ядра Matrix Synapse
|
|
Ставим всё в единое, чистое виртуальное окружение.
|
|
|
|
**1. Системные пакеты:**
|
|
```bash
|
|
apt install -y build-essential python3 python3-dev python3-venv python3-pip \
|
|
libffi-dev libssl-dev libjpeg-dev libxslt1-dev libpq-dev \
|
|
zlib1g-dev libwebp-dev sudo nano
|
|
```
|
|
|
|
**2. Создание системного пользователя:**
|
|
```bash
|
|
adduser --system --group --no-create-home synapse
|
|
chown -R synapse:synapse /opt/synapse
|
|
```
|
|
|
|
**3. Установка в VENV:**
|
|
```bash
|
|
python3 -m venv /opt/synapse/env
|
|
source /opt/synapse/env/bin/activate
|
|
|
|
# Обновляем базовые утилиты
|
|
pip install --upgrade pip setuptools wheel
|
|
|
|
# Ставим Матрикс и драйвер базы (если качает медленно, добавьте -i https://pypi.tuna.tsinghua.edu.cn/simple)
|
|
pip install matrix-synapse[all] psycopg2
|
|
```
|
|
|
|
**4. Генерация базового конфига:**
|
|
```bash
|
|
cd /opt/synapse/data
|
|
python -m synapse.app.homeserver \
|
|
--server-name ВАШ_ДОМЕН.ru \
|
|
--config-path /opt/synapse/data/homeserver.yaml \
|
|
--generate-config \
|
|
--report-stats=no
|
|
|
|
# ВАЖНО: Отдаем права на сгенерированные ключи пользователю synapse!
|
|
chown -R synapse:synapse /opt/synapse/data
|
|
```
|
|
|
|
---
|
|
|
|
### ⚙️ ШАГ 4: Тюнинг `homeserver.yaml`
|
|
```bash
|
|
nano /opt/synapse/data/homeserver.yaml
|
|
```
|
|
|
|
**Что нужно изменить:**
|
|
1. Разрешаем слушать сеть (а не только localhost):
|
|
```yaml
|
|
listeners:
|
|
- port: 8008
|
|
tls: false
|
|
type: http
|
|
x_forwarded: true
|
|
bind_addresses: ['0.0.0.0']
|
|
cors_allowed_origins:
|
|
- "*"
|
|
```
|
|
2. Подключаем нашу базу Postgres (удаляем sqlite3):
|
|
```yaml
|
|
database:
|
|
name: psycopg2
|
|
args:
|
|
user: "synapse"
|
|
password: "ТвойСуперПароль"
|
|
database: "synapse"
|
|
host: "172.20.50.10"
|
|
port: 5432
|
|
cp_min: 5
|
|
cp_max: 10
|
|
```
|
|
3. Подключаем redis для кеша
|
|
```yaml
|
|
redis:
|
|
enabled: true
|
|
host: "172.20.50.12"
|
|
port: 6379
|
|
password: "ТвойСуперПароль"
|
|
|
|
```
|
|
4. Убеждаемся, что путь к файлам указывает на наш Rclone:
|
|
```yaml
|
|
media_store_path: "/opt/synapse/data/media_store"
|
|
```
|
|
5. Отключаем свободную регистрацию (безопасность):
|
|
```yaml
|
|
enable_registration: false
|
|
```
|
|
6. включам пуши:
|
|
```
|
|
push:
|
|
# Включаем саму систему пушей
|
|
enabled: true
|
|
|
|
# Список серверов, которым мы доверяем пересылать уведомления в Apple/Google
|
|
trusted_proxies:
|
|
- "https://matrix.org"
|
|
- "https://vector.im"
|
|
- "https://element.io"
|
|
|
|
# Показывать ли текст сообщения в уведомлении (на заблокированном экране)
|
|
include_content: true
|
|
```
|
|
---
|
|
|
|
### 🚀 ШАГ 5: Финальный запуск и создание Админа
|
|
|
|
**1. Создаем службу для Synapse:**
|
|
```bash
|
|
nano /etc/systemd/system/matrix-synapse.service
|
|
```
|
|
*Вставляем:*
|
|
```ini
|
|
[Unit]
|
|
Description=Matrix Synapse
|
|
After=network.target rclone-matrix.service
|
|
Requires=rclone-matrix.service
|
|
|
|
[Service]
|
|
Type=simple
|
|
User=synapse
|
|
Group=synapse
|
|
WorkingDirectory=/opt/synapse/data
|
|
ExecStart=/opt/synapse/env/bin/python -m synapse.app.homeserver --config-path /opt/synapse/data/homeserver.yaml
|
|
Restart=always
|
|
RestartSec=3
|
|
|
|
[Install]
|
|
WantedBy=multi-user.target
|
|
```
|
|
|
|
**2. Запускаем сервер:**
|
|
```bash
|
|
# Выходим из VENV
|
|
deactivate
|
|
|
|
systemctl daemon-reload
|
|
systemctl enable --now matrix-synapse
|
|
systemctl status matrix-synapse # Должен быть зеленым!
|
|
```
|
|
|
|
**3. Создаем учетную запись Администратора:**
|
|
```bash
|
|
/opt/synapse/env/bin/register_new_matrix_user -c /opt/synapse/data/homeserver.yaml http://localhost:8008
|
|
```
|
|
*Отвечаем на вопросы (логин, пароль, Make admin: **yes**).*
|
|
|
|
**ГОТОВО!** Ваш сервер работает, файлы надежно кэшируются и улетают в S3, а база данных защищена ZFS. Можно заходить через клиент Element!
|
|
|
|
---
|