# Свой 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! ---