База знаний (цифровой суверенитет)
  • Установка Matrix Synapse (а также Element Web и Synapse Admin) на Debian 12

    Перенесена
    Сети - теория и практика
    1 11 25

    A
    951
    0

    1. Устанавливаем основные компоненты для Synapse, Element Web и Synapse Admin


    Можно использовать как скрипт

    #!/usr/bin/env bash
    set -euo pipefail
    
    # =========================================== #
    #           Предварительные действия          #
    # =========================================== #
    
    # Обновляем систему
    apt update -y
    apt upgrade -y
    apt full-upgrade -y
    
    # Установка необходимых утилит (gnupg2 и lsb-release — самые важные)
    apt install -y curl wget gnupg lsb-release mc htop lsof lynx
    apt install -y apt-transport-https jq
    apt install -y cockpit
    apt install -y nginx
    
    systemctl stop nginx
    systemctl disable nginx
    rm /etc/nginx/sites-enabled/default
    
    
    # ============================================ #
    #    Установка Matrix Synapse и компонентов    #
    # ============================================ #
    
    
    # Ключ репозитория matrix.org
    wget -qO /usr/share/keyrings/matrix-org-archive-keyring.gpg \
      https://packages.matrix.org/debian/matrix-org-archive-keyring.gpg
    
    # Добавляем репозиторий
    echo "deb [signed-by=/usr/share/keyrings/matrix-org-archive-keyring.gpg] https://packages.matrix.org/debian/ $(lsb_release -cs) main" \
      > /etc/apt/sources.list.d/matrix-org.list
    
    # Обновляем списки пакетов с новым репозиторием
    apt update -y
    
    # Предзаполняем debconf (замените example.com на нужный домен)
    cat <<EOF | debconf-set-selections
    matrix-synapse-py3 matrix-synapse/server-name string example.com
    matrix-synapse-py3 matrix-synapse/report-stats boolean false
    EOF
    
    # Установка Synapse + PostgreSQL без вопросов
    DEBIAN_FRONTEND=noninteractive \
    apt install -y matrix-synapse-py3 postgresql libpq5 python3-psycopg2 
    apt update
    apt install -y coturn
    
    systemctl stop matrix-synapse coturn cockpit postgresql
    systemctl disable matrix-synapse coturn cockpit postgresql
    
    # =========================================== #
    #           Установка Element Web             #
    # =========================================== #
    
    # Добавляем ключ подписи
    wget -O /usr/share/keyrings/element-io-archive-keyring.gpg \
      https://packages.element.io/debian/element-io-archive-keyring.gpg
    
    # Добавляем репозиторий
    echo "deb [signed-by=/usr/share/keyrings/element-io-archive-keyring.gpg] https://packages.element.io/debian/ default main" \
      | tee /etc/apt/sources.list.d/element-io.list
    
    # Обновляем и устанавливаем Element Web
    apt update
    apt install -y element-web
    
    # =========================================== #
    #           Установка Synapse-Admin           #
    # =========================================== #
    
    mkdir -p /var/www/synapse-admin
    cd /var/www/synapse-admin
    latest=$(curl -s https://api.github.com/repos/Awesome-Technologies/synapse-admin/releases/latest | jq -r .tag_name)
    wget -q "https://github.com/Awesome-Technologies/synapse-admin/releases/download/$latest/synapse-admin-$latest.tar.gz" -O synapse-admin.tar.gz
    tar xzf synapse-admin.tar.gz --strip-components=1
    rm synapse-admin.tar.gz
    chown -R www-data:www-data /var/www/synapse-admin
    
    # =========================================== #
    #           Создание конфигов Nginx           #
    # =========================================== #
    
    touch /etc/nginx/sites-available/synapse-admin.conf
    touch /etc/nginx/sites-available/element.conf
    ln -s /etc/nginx/sites-available/synapse-admin.conf /etc/nginx/sites-enabled/
    ln -s /etc/nginx/sites-available/element.conf /etc/nginx/sites-enabled/
    
    # Очищаем кэш Apt
    apt clean
    rm -rf /var/lib/apt/lists/*
    
  • A
    951
    0

    2. Настройка базы данных


    Запускаем Postgresql

    sudo systemctl start postgresql
    sudo systemctl enable postgresql
    sudo systemctl status postgresql
    

    Переходим в PostgreSQL и создаём пользователя и базу данных для Synapse (замените your_secure_password на сильный пароль):

    sudo -u postgres psql
    

    В консоли psql выполните:

    CREATE USER synapse_user WITH PASSWORD 'your_secure_password';
    CREATE DATABASE synapse ENCODING 'UTF8' LC_COLLATE='C' LC_CTYPE='C' TEMPLATE=template0 OWNER synapse_user;
    \q
    
  • A
    951
    0

    3. Настройка Synapse для работы с PostgreSQL


    Запускаем matrix-synapse:

    systemctl start matrix-synapse
    systemctl enable matrix-synapse
    

    Проверяем статус:

    systemctl status matrix-synapse
    ss -antpl | grep python
    

    Создаём файл конфигурации базы в директории дополнений (рекомендуется, чтобы не редактировать основной файл):

    mcedit /etc/matrix-synapse/conf.d/database.yaml
    

    Добавляем:

    database:
      name: psycopg2
      args:
        user: synapse_user
        password: your_secure_password
        database: synapse
        host: localhost
        cp_min: 5
        cp_max: 10
    

    your_secure_password - подставляем вместо этой фразы пароль, которые создали во время настройки базы данных.

  • A
    951
    0

    4. Дополнительные настройки Synapse


    Создаём файл

    mcedit /etc/matrix-synapse/conf.d/listeners.yaml
    

    с таким содержимым:

    listeners:
      - bind_addresses:
        - '::1'
        - '0.0.0.0'
        port: 8008
        resources:
          - names:
            - client
            - federation
        tls: false
        type: http
        x_forwarded: true
    

    Открываем файл

    /etc/matrix-synapse/conf.d/server_name.yaml
    

    и меняем там имя домена с example.com на реальное доменное имя серверной части Synapse.


    Настраиваем регистрацию

    Генерируем registration_shared_secret (если его нет в конфиге) следующей командой:

    cat /dev/urandom | tr -dc 'a-zA-Z0-9' | fold -w 32 | head -n 1
    

    Получится что-то вроде этого

    3KqoaSzYUFJulqjVfSSJIIutPZCRxoHz

    Нужно запомнить этот секрет (где-то временно записать).

    Создаём файл (или добавляем в существующий в /etc/matrix-synapse/conf.d/) :

    mcedit /etc/matrix-synapse/conf.d/registration.yaml
    

    Записываем туда:

    enable_registration: false
    registration_shared_secret: "ваш_сгенерированный_код"
    

    Это если прямая регистрация запрещена (новых пользователей регистрирует сам администратор).

    В случае, если прямая регистрация нужна, причём без проверки по почте, пишем так:

    enable_registration: true
    enable_registration_without_verification: true
    registration_shared_secret: "ваш_сгенерированный_код"
    

    Создаём первого пользователя-админа

    register_new_matrix_user -c /etc/matrix-synapse/conf.d/registration.yaml http://localhost:8008
    

    На основе вопросника создаём логин и пароль пользователя.
    Для режима админа отвечаем yes


    Перезапускаем службу:

    systemctl restart matrix-synapse
    
  • A
    951
    0

    5. Создаём для Synapse конфиг Nginx и сертификат


    1. Создаём простой стандартный конфиг для нужного домена
    cd /etc/nginx/sites-available
    sudo touch synapse.conf
    sudo nano synapse.conf
    
    1. Вписываем в конфиг примитив, сохраняем
    server {
        listen 80;
        server_name my_domain.tld; # Замените на ваш домен
    
        location / {
            root /var/www/html;
        }
    }
    
    1. Создаём линк
    sudo ln -s /etc/nginx/sites-available/synapse.conf /etc/nginx/sites-enabled/
    
    1. Устанавливаем certbot, если ещё не установлен
    sudo apt install certbot python3-certbot-nginx -y
    
    1. Создаём сертификат для домена
    sudo certbot --nginx -d my_domain.tld
    
    1. Заходим сюда
    mcedit /etc/nginx/sites-available/synapse.conf
    

    и меняем текст конфига таком образом:

    server {
        server_name my_domain.tld;  # Замените на ваш домен
        listen 443 ssl; 
    
        # SSL настройки...
        ssl_certificate /etc/letsencrypt/live/my_domain.tld/fullchain.pem; # Замените на ваш домен
        ssl_certificate_key /etc/letsencrypt/live/my_domain.tld/privkey.pem; # Замените на ваш домен
    
        location / {
            proxy_pass http://10.214.97.46:8008; # Замените на IP контейнера
            proxy_set_header X-Forwarded-For $remote_addr;
            proxy_set_header X-Forwarded-Proto $scheme; 
            proxy_set_header Host $host;                
        }
    
        # БЛОК ДЕЛЕГИРОВАНИЯ
        location /.well-known/matrix/server {
            default_type application/json;
            return 200 '{"m.server": "my_domain.tld:443"}';  # Замените на ваш домен
        }
    
        location /.well-known/matrix/client {
            default_type application/json;
            add_header Access-Control-Allow-Origin *;
            return 200 '{"m.homeserver": {"base_url": "https://my_domain.tld"}}';      # Замените на ваш домен                                                                                                                             
        }                                                                                                                                                                                                             
                                                                                                                                                                                                                      
        client_max_body_size 2000M;
    }
    
  • A
    951
    0

    6. Настройка Coturn


    Порты, необходимы для coturn:
    3478
    5349
    49152:65535/udp


    Запускаем Coturn

    systemctl start coturn
    systemctl enable coturn
    systemctl status coturn
    

    Сделайте резервную копию файла конфигурации по умолчанию

    mv /etc/turnserver.conf /etc/turnserver.conf.bak
    

    Сгенерируйте секрет аутентификации и сохраните его в файле конфигурации

    echo "static-auth-secret=$(cat /dev/urandom | tr -cd '[:alnum:]' | fold -w 256 | head -n 1)" | sudo tee /etc/turnserver.conf
    

    Вы получите очень длинный ключ, примерно такой:

    Nmnc2kkqIvmsJUjcEhQJCETTqiJQCyvonBcsj3i6554vTSbBBSA49YxPwRSzZa9kdmsuePBHA7vIqYYlLKgivEWQ5NST97kq92Bq1Kcr7oVR6p0MxiDRBdQ3KMtdiLVK4qy5TCtOrAocrtBHZrXasFXXGkU4e9zIrUnVPlrRybOZz8vu88ED1y2Cv9JYbwRgllVhROwI17xNK4GZiyGXEKbQJ1QhlTpjjNwqQQjoYqIEkgOyPDESqTSIJYkSGyO1
    

    Откройте файл конфигурации Coturn

    mcedit /etc/turnserver.conf
    

    После открытия файла ключи будет в самом вверху, сделайте отступ после ключа и добавьте полную конфигурацию.

    В итоге, конфигурация должна получиться такая (сгенерированный ключ и домен замените на нужные):

    static-auth-secret=вставьте_сгенерированный_для_coturn_секрет
    realm=my_domain.tld  # Замените на ваш домен
    cert=/etc/letsencrypt/live/my_domain.tld/fullchain.pem  # Замените на ваш домен
    pkey=/etc/letsencrypt/live/my_domain.tld/privkey.pem  # Замените на ваш домен
    
    # VoIP is UDP, no need for TCP
    no-tcp-relay
    
    # Do not allow traffic to private IP ranges
    no-multicast-peers
    
    denied-peer-ip=0.0.0.0-0.255.255.255
    denied-peer-ip=10.0.0.0-10.255.255.255
    denied-peer-ip=100.64.0.0-100.127.255.255
    denied-peer-ip=127.0.0.0-127.255.255.255
    denied-peer-ip=169.254.0.0-169.254.255.255
    denied-peer-ip=172.16.0.0-172.31.255.255
    denied-peer-ip=192.0.0.0-192.0.0.255
    denied-peer-ip=192.0.2.0-192.0.2.255
    denied-peer-ip=192.88.99.0-192.88.99.255
    denied-peer-ip=192.168.0.0-192.168.255.255
    denied-peer-ip=198.18.0.0-198.19.255.255
    denied-peer-ip=198.51.100.0-198.51.100.255
    denied-peer-ip=203.0.113.0-203.0.113.255
    denied-peer-ip=240.0.0.0-255.255.255.255
    denied-peer-ip=::1
    denied-peer-ip=64:ff9b::-64:ff9b::ffff:ffff
    denied-peer-ip=::ffff:0.0.0.0-::ffff:255.255.255.255
    denied-peer-ip=100::-100::ffff:ffff:ffff:ffff
    denied-peer-ip=2001::-2001:1ff:ffff:ffff:ffff:ffff:ffff:ffff
    denied-peer-ip=2002::-2002:ffff:ffff:ffff:ffff:ffff:ffff:ffff
    denied-peer-ip=fc00::-fdff:ffff:ffff:ffff:ffff:ffff:ffff:ffff
    denied-peer-ip=fe80::-febf:ffff:ffff:ffff:ffff:ffff:ffff:ffff
    
    # Limit number of sessions per user
    user-quota=12
    
    # Limit total number of sessions
    total-quota=1200
    

    Создайте файл конфигурации Synapse для Coturn

    mcedit /etc/matrix-synapse/conf.d/turn.yaml
    

    Замените в файле значения на свои (имя домена и секрет)

    turn_uris: [ "turn:my_domain.tld?transport=udp", "turn:my_domain.tld?transport=tcp" ]
    turn_shared_secret: 'вставьте_сгенерированный_для_coturn_секрет'
    turn_user_lifetime: 86400000
    turn_allow_guests: True
    

    Перезапустите Coturn и Synapse, чтобы применить настройки

    systemctl restart coturn
    systemctl restart matrix-synapse
    

    Важно: После всех настроек перезагрузите сервер:

    reboot
    
  • A
    951
    0

    7. Настраиваем конфигурацию Web Element


    # Редактируем конфиг
    mcedit /etc/element-web/config.json
    

    Минимальный рабочий конфиг (но можете в оригинальный конфиг просто вставить имя домена для Element):

    {
        "default_server_config": {
            "m.homeserver": {
                "base_url": "https://адрес_сервера_Synapse",
                "server_name": "адрес_сервера_Synapse"
            },
            "m.identity_server": {
                "base_url": "https://vector.im"
            }
        },
        "disable_custom_urls": false,
        "brand": "Element",
        "integrations_ui_url": "https://scalar.vector.im/",
        "integrations_rest_url": "https://scalar.vector.im/api",
        "integrations_widgets_urls": [
            "https://scalar.vector.im/_matrix/integrations/v1",
            "https://scalar.vector.im/api"
        ],
        "features": {},
        "default_theme": "light"
    }
    

    Важно: В base_url укажите адрес вашего homeserver (не Element-web).

  • A
    951
    0

    8. Конфиг Nginx для Element Web, в контейнере


    Запускаем Nginx

    systemctl start nginx
    systemctl enable nginx
    systemctl status nginx
    

    Открываем ранее созданный конфиг

    mcedit /etc/nginx/sites-available/element.conf
    

    Вставляем туда следующую конфигурацию:

    server {
        listen 80;
        listen [::]:80;
        
        root /usr/share/element-web;
        index index.html;
    
        server_name _;
    
        location / {
            try_files $uri $uri/ /index.html;
        }
    
        # Кэширование статики
        location ~* \.(jpg|jpeg|gif|png|ico|cur|gz|svg|svgz|mp4|ogg|ogv|webm|htf|css|js|woff|woff2|ttf|eot)$ {
            expires 1y;
            add_header Cache-Control "public, immutable";
        }
    }
    

    После этого:

    sudo nginx -t
    sudo systemctl reload nginx
    

  • A
    951
    0

    9. Конфиг Nginx для Element Web, на хосте


    1. Создаём простой стандартный конфиг для нужного домена
    cd /etc/nginx/sites-available
    sudo touch elementhost.conf
    sudo nano elementhost.conf
    
    1. Вписываем в конфиг примитив, сохраняем
    server {
        listen 80;
        server_name my_domain.tld; # Замените на ваш домен
    
        location / {
            root /var/www/html;
        }
    }
    
    1. Создаём линк
    sudo ln -s /etc/nginx/sites-available/elementhost.conf /etc/nginx/sites-enabled/
    
    1. Устанавливаем certbot, если ещё не установлен
    sudo apt install certbot python3-certbot-nginx -y
    
    1. Создаём сертификат для домена
    sudo certbot --nginx -d my_domain.tld
    
    1. Заходим сюда /etc/nginx/sites-available/elementhost.conf и меняем текст конфига таком образом:
    server {
        listen 80;
        listen [::]:80;
        server_name my_domain.tld; # Замените на свой домен
        
        # Перенаправляем HTTP на HTTPS
        return 301 https://$server_name$request_uri;
    }
    
    server {
        listen 443 ssl;
        listen [::]:443 ssl;
        http2 on;  
        server_name my_domain.tld; # Замените на свой домен
    
        # SSL сертификаты
        ssl_certificate /etc/letsencrypt/live/my_domain.tld/fullchain.pem; # Замените на свой домен
        ssl_certificate_key /etc/letsencrypt/live/my_domain.tld/privkey.pem; # Замените на свой домен
        include /etc/letsencrypt/options-ssl-nginx.conf;
        ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;
    
        # Прокси на контейнер с Element-web
        location / {
            proxy_pass http://10.142.130.19:80; # Замените на ip контейнера, учитывайте порт, прописанный в контейнерном Nginx
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header X-Forwarded-Proto $scheme;
            
            proxy_http_version 1.1;
            proxy_set_header Upgrade $http_upgrade;
            proxy_set_header Connection "upgrade";
        }
    
        # Кэширование статики (вынесено отдельно)
        location ~* \.(jpg|jpeg|gif|png|ico|cur|gz|svg|svgz|mp4|ogg|ogv|webm|htc|css|js|woff|woff2|ttf|eot)$ {
            expires 1y;
            access_log off;
            add_header Cache-Control "public";
            proxy_pass http://10.142.130.19:80; # Замените на ip контейнера, учитывайте порт, прописанный в контейнерном Nginx
            proxy_set_header Host $host;
        }
    } 
    
    

    Далее:

    sudo nginx -t
    sudo systemctl reload nginx
    
  • A
    951
    0

    10. Конфиг Nginx для Synapse Admin, в контейнере


    Открываем ранее созданный конфиг

    mcedit /etc/nginx/sites-available/synapse-admin.conf
    

    Вставляем туда следующую конфигурацию:

    server {
        listen 8002; # Обратите внимание на порт - должен отличаться от 80
        listen [::]:8002; # Главное, чтобы порт совпадал с тем что в конфиге на хосте
        server_name _;
    
        root /var/www/synapse-admin;
        index index.html;
    
        location / {
            try_files $uri $uri/ /index.html;
        }
    
        location ~* \.(?:jpg|jpeg|gif|png|ico|cur|gz|svg|svgz|mp4|ogg|ogv|webm|htc|css|js|woff|woff2|ttf|eot)$ {
            expires 1y;
            access_log off;
            add_header Cache-Control "public";
        }
    
        access_log /var/log/nginx/synapse-admin_access.log;
        error_log /var/log/nginx/synapse-admin_error.log;
    }
    

    После этого:

    sudo nginx -t
    sudo systemctl reload nginx
    

  • A
    951
    0

    11. Конфиг Nginx для Synapse Admin, на хосте


    1. Создаём простой стандартный конфиг для нужного домена
    cd /etc/nginx/sites-available
    sudo touch synadminhost.conf
    sudo nano synadminhost.conf
    
    1. Вписываем в конфиг примитив, сохраняем
    server {
        listen 80;
        server_name my_domain.tld; # Замените на ваш домен
    
        location / {
            root /var/www/html;
        }
    }
    
    1. Создаём линк
    sudo ln -s /etc/nginx/sites-available/synadminhost.conf /etc/nginx/sites-enabled/
    
    1. Устанавливаем certbot, если ещё не установлен
    sudo apt install certbot python3-certbot-nginx -y
    
    1. Создаём сертификат для домена
    sudo certbot --nginx -d my_domain.tld
    
    1. Заходим сюда /etc/nginx/sites-available/synadminhost.conf и меняем текст конфига таком образом:
    # Перенаправление HTTP на HTTPS
    server {
        listen 80;
        listen [::]:80;
        server_name my_domain.tld; # Замените на свой домен
    
        location /.well-known/acme-challenge/ {
            root /var/www/certbot;
        }
    
        location / {
            return 301 https://$server_name$request_uri;
        }
    }
    
    # Основной HTTPS-сервер
    server {
        listen 443 ssl http2;
        listen [::]:443 ssl http2;
        server_name my_domain.tld;  # Замените на свой домен
    
        # SSL-сертификаты (будут добавлены Certbot)
        ssl_certificate     /etc/letsencrypt/live/my_domain.tld/fullchain.pem;  # Замените на свой домен
        ssl_certificate_key /etc/letsencrypt/live/my_domain.tld/privkey.pem;  # Замените на свой домен
    
        # Настройки SSL
        ssl_protocols TLSv1.2 TLSv1.3;
        ssl_ciphers HIGH:!aNULL:!MD5;
        ssl_prefer_server_ciphers on;
        ssl_session_cache shared:SSL:10m;
        ssl_session_timeout 10m;
    
        # Заголовки безопасности
        add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
        add_header X-Frame-Options "SAMEORIGIN" always;
        add_header X-Content-Type-Options "nosniff" always;
        add_header X-XSS-Protection "1; mode=block" always;
    
        # Прокси на Incus-контейнер
        location / {
            proxy_pass http://10.214.97.64:8002; # Замените на ip контейнера, учитывайте порт, прописанный в контейнерном Nginx
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header X-Forwarded-Proto $scheme;
            proxy_set_header X-Forwarded-Host $host;
            proxy_set_header X-Forwarded-Port $server_port;
    
            # Таймауты
            proxy_connect_timeout 60s;
            proxy_send_timeout 60s;
            proxy_read_timeout 60s;
    
            # Буферизация
            proxy_buffering off;
            proxy_http_version 1.1;
            proxy_set_header Upgrade $http_upgrade;
            proxy_set_header Connection "upgrade";
        }
    
        # Логи
        access_log /var/log/nginx/synapse-admin_access.log;
        error_log /var/log/nginx/synapse-admin_error.log;
    } 
    

    Далее:

    sudo nginx -t
    sudo systemctl reload nginx
    
  • A Admin переместил эту тему из в