Загрузить файлы в «/»
This commit is contained in:
@@ -0,0 +1,268 @@
|
||||
|
||||
# Свой 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!
|
||||
|
||||
---
|
||||
Reference in New Issue
Block a user