В наше время стало не приятно вести переписки в обычных мессенджерах,  такие как Whatsapp, Viber и пр. им просто нет доверия, ведь если они  до сих пор работают, значит никому не мешают и сливают данные  для рекламы вам же товаров и услуг.
Раньше была только 1 альтернатива это Jabber. Следующая статья будет  посвещена ему в 2019 году, когда решены проблемы с передачей файлов  и замороченной конфигурацией.

Сегодня будем ставить альтернативу, которая из коробки по этой  инструкции позволит совершать видео конференции, видео звонки, аудио  звонки и поддерживает шифрование E2E по алгоритму подобному в мессенжере  Signal и работающей федерацией для связи с другими пользователями  matrix на других серверах. Отличное решение для android и веб, постоянно  развивается и допиливается, но у меня возникли проблемы с клиентами  для iOS где я не смог сделать видео звонок и создать коференцию. Именно  по этой причине я отказался это этого решения, так как у многих моих  iPhone. Плюс сам по себе клиент не такой красивый и удобный как например  Conversations для android под jabber. Но сама по себе сеть очень  перспективная, и клиенты скоро смогут стать более юзабельными.

В итоге получим:
Сервер Synapse + Веб-клиент на этом же сервере + работающие звонки видео  и аудио p2p и конференции на основе jitsi, который встроен в клиенты,  а так же работающую федерацию + весь трафик даже до федераций  проксируется через Nginx оборачивая то все в TLS шифрованный слой.

Все сделано на Ubuntu 18.04

Обновляем порты

sudo apt update && sudo apt upgrade && reboot

Ставим  БД (нужна, что бы вы смогли находить пользователей в БД своей лишь  напечатав 2 символа первых его логина, без БД не будет это работать ну  и производительность будет ниже).

sudo apt-get install postgresql postgresql-contrib

В конфиге ставим слушать только 127.0.0.1

nano /etc/postgresql/10/main/postgresql.conf
listen_addresses = '127.0.0.1'

Делаем пользака для БД:

su - postgres
createuser --pwprompt synapse_user

Создаем БД

su - postgres
psql

Втыкаем команды ему:

CREATE DATABASE synapse
 ENCODING 'UTF8'
 LC_COLLATE='C'
 LC_CTYPE='C'
 template=template0
 OWNER synapse_user;

Не забываем пароль, он нужен будет для конфига сервера матрикс.

Добавляем репозиторий matrix

wget -qO - https://matrix.org/packages/debian/repo-key.asc | sudo apt-key add -
sudo add-apt-repository https://matrix.org/packages/debian/
wget -qO - https://matrix.org/packages/debian/repo-key.asc | sudo apt-key add -
sudo add-apt-repository https://matrix.org/packages/debian/

Ставим сервер:

sudo apt install matrix-synapse -y
sudo systemctl start matrix-synapse
sudo systemctl enable matrix-synapse

Проверяем слушает ли 8008 порт

netstat -plntu

Генерируем секретый код:

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

Получаем сохраняем его себе в блокнот, скоро пригодится для конфига matrix-synapse

Правим конфиг сервера:

nano /etc/matrix-synapse/homeserver.yaml

Находим  поиском по строке каждый параметр если он закоментин втыкам в том  месте, что бы не потерять, там есть мануалы по каждому.

- port: 8008
    tls: false
    bind_addresses: ['127.0.0.1']
    type: http
    x_forwarded: true

   resources:
      - names: [client, webclient]
        compress: false

  - port: 8449
    tls: false
    bind_addresses: ['127.0.0.1']
    type: http
    x_forwarded: true

    resources:
      - names: [federation]
        compress: false

enable_registration: False
registration_shared_secret: "ВАШ КОД"
max_upload_size: 4194304000
web_client_location: "/var/www/html/"
public_baseurl: https://Ваш домен
user_directory:
   enabled: true
   search_all_users: true
email:
   riot_base_url: "https://ваш домен"
   trust_identity_server_for_password_resets: true
   validation_token_lifetime: 1h

database:
    name: psycopg2
    args:
        user: synapse_user
        password: Пароль
        database: synapse
        host: 127.0.0.1
        cp_min: 5
        cp_max: 10

SSL
Ставим сертификаты:

sudo apt install letsencrypt -y
certbot certonly --rsa-key-size 2048 --standalone --agree-tos --no-eff-email --email вашемайл -d ваш домен

Ставим Nginx

sudo apt install nginx -y
sudo systemctl start nginx
sudo systemctl enable nginx

Правим конфиг Nginx

cd /etc/nginx/
nano sites-available/matrix
server {
       listen 80;
       server_name ваш домен;
       return 301 https://$server_name$request_uri;
}

server {
    listen 443 ssl;
    server_name ваш домен;

    ssl_certificate /etc/letsencrypt/live/ваш домен/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/ваш домен/privkey.pem;

    # If you don't wanna serve a site, comment this out
    root /var/www/html;
    index index.php index.html index.htm;
     location /_matrix {
      proxy_pass http://127.0.0.1:8008;
      proxy_set_header X-Forwarded-For $remote_addr;

    }
}

server {
    listen 8448 ssl;
    server_name ваш домен;

    ssl_certificate /etc/letsencrypt/live/ваш домен/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/ваш домен/privkey.pem;

    location / {
        proxy_pass http://127.0.0.1:8449;
        proxy_set_header X-Forwarded-For $remote_addr;
    }
}

Делаем симлинк на конфигурацию виртуального домена

ln -s /etc/nginx/sites-available/matrix /etc/nginx/sites-enabled/
nginx -t

Прописываем в Nginx размер максимальный файлов, которые можно передавать.

nano /etc/nginx/nginx.conf

В раздел http добавляем:

client_max_body_size 5000m;

Рестарт nginx

service nginx restart

Уставим TURN, что бы у клиентов из-за NAT не было проблем с конференциями видео и аудио.

apt install coturn pwgen

Геренируем секретный ключ

pwgen -s 64 1

сохранить код в блокнот.

Правим конфиг

nano /etc/turnserver.conf

Втыкаем

use-auth-secret
static-auth-secret=ВАШ КОД который нагерели шаг назад
realm=ваш домен

# VoIP traffic is all UDP. There is no reason to let users connect to arbitrary TCP endpoints via the relay.
no-tcp-relay

# don't let the relay ever try to connect to private IP address ranges within your network (if any)
# given the turn server is likely behind your firewall, remember to include any privileged public IPs too.
denied-peer-ip=10.0.0.0-10.255.255.255
denied-peer-ip=192.168.0.0-192.168.255.255
denied-peer-ip=172.16.0.0-172.31.255.255

# special case the turn server itself so that client->TURN->TURN->client flows work
allowed-peer-ip=10.0.0.1

# consider whether you want to limit the quota of relayed streams per user (or total) to avoid risk of DoS.
user-quota=12 # 4 streams per video call, so 12 streams = 3 simultaneous relayed calls per user.
total-quota=1200

Включаем TURN

nano /etc/default/coturn

Раскоментируйте

TURNSERVER_ENABLED=1

Рестарт

/etc/init.d/coturn restart

Правим конфиг сервера под TURN

nano /etc/matrix-synapse/homeserver.yaml

Втыкаем в конце

turn_uris: [ "turn:вашдомен:3478?transport=udp", "turn:вашдомен:3478?transport=tcp" ]
turn_shared_secret: ваш секретный код который сгенерили шаг назад
turn_user_lifetime: 86400000
turn_allow_guests: True

Рестарт сервера

sudo systemctl restart matrix-synapse

Настраиваем DNS для работы федерации это надо прописать в вашем ДНС сервере в домене создать запись SRV:

_matrix._tcp.вашдомен 3600 IN SRV 10 5 443 вашдомен

После прописания должна быть успешная проверка на

https://matrix.org/federationtester

Впишите свой домен и получить надо УСПЕХ зеленый.

Настраиваем файрвол:

ufw allow ssh
ufw allow http
ufw allow https
ufw allow 3478
ufw allow 8448

Включаем

ufw enable

жмем тут «y»

ufw status

Проверяем.

Регаем первого пользака:

register_new_matrix_user -c /etc/matrix-synapse/homeserver.yaml https://ваш домен:443

Устанавливаем веб-клиента:
https://github.com/vector-im/riot-web/releases
Качать TAR.GZ

wget урл архива актуального

Распаковать в /var/www/html

tar -cvzf riot-v1.xxxxxxxx

Дать права пользаку www-data:

chown -R www-data:www-data /var/www/html

В конфиг веб-клиента записать:

{
    "default_server_config": {
        "m.homeserver": {
            "base_url": "https://ваш домен",
            "server_name": "ваш домен"
        },
        "m.identity_server": {
            "base_url": "https://vector.im"
        }
    },
    "disable_custom_urls": true,
    "disable_guests": true,
    "disable_login_language_selector": false,
    "disable_3pid_login": true,
    "brand": "Matrix",
    "integrations_ui_url": "https://scalar.vector.im/",
    "integrations_rest_url": "https://scalar.vector.im/api",
    "integrations_jitsi_widget_url": "https://scalar.vector.im/api/widgets/jitsi.html",
    "bug_report_endpoint_url": "https://riot.im/bugreports/submit",
    "defaultCountryCode": "RU",
    "showLabsSettings": false,
    "features": {
        "feature_pinning": "labs",
        "feature_custom_status": "labs",
        "feature_custom_tags": "labs",
        "feature_state_counters": "labs",
        "default_federate": true,
        "default_theme": "dark"

    },
    "piwik": false,


    "enable_presence_by_hs_url": {
        "https://ваш домен": false
    }

}

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

cd /etc/cron.daily/
nano deloldfiles

Втыкаем (удаляеет старее 30 дней)

#!/bin/sh
find /var/lib/matrix-synapse/media/ -type f -mtime +30 -exec rm -v {} \;

Делаем файл исполняемым

chmod +x deloldfiles

Вот собственно и все, можно качать клиенты на мобилы Riot.im и пробовать подключаться.
Веб-морда доступна по адресу вашего домена через браузер.

Настройка и включение шифрования делается каждый раз руками в каждой комнате или чате, автоматом не включается.

P.S. Инструкция не содержит то, как включить открытую регистрацию  пользователей на сервере и как подключить защиту от спама  при регистрации с помощью гугл капчи, если захотите найдете ее  в официальной документации по Synapse в гитхабе.