Введение
В любой момент могут запретить Telegram, WhatsApp и Microsoft Teams. Но для работы обычной электронной почты уже недостаточно, так как общение через неё медленнее, а видеозвонки могут быть затруднительными.
Необходима альтернатива, которая удовлетворяла бы следующим критериям:
1. Отсутствие доступа во внешний интернет.
2. Возможность совершать видео- и аудиозвонки.
3. Создание групповых чатов.
4. Удалённые филиалы могут общаться в своих чатах и, при необходимости, подключаться к чатам главного офиса. В сети Matrix это называется «Федерация».
Федерация — это механизм, который позволяет пользователям с разных серверов участвовать в одной и той же комнате. Чтобы это работало, другим серверам необходимо иметь возможность связываться с вашим и отправлять сообщения. Поэтому выбор пал на сеть Matrix Synapse. Element– web-версия клиента.
Начало
1) Создаем конфигурацию
mkdir -p ~/matrix-data создадим папку
Теперь нужно сгенерировать базовый конфиг
docker run -it --rm -v ~/matrix-data:/data -e SYNAPSE_SERVER_NAME=localhost -e SYNAPSE_REPORT_STATS=no matrixdotorg/synapse:latest generate
2) запуск контейнера
docker run -d --name matrix -p 8008:8008 -v ~/matrix-data:/data --network bridge matrixdotorg/synapse:latest
docker exec -it matrix register_new_matrix_user -c /data/homeserver.yaml http://localhost:8008
Система запросит у вас ввод логина (можно оставить root), пароля и информацию о том, является ли данный пользователь администратором.
Создаем автоматическую установку Matrix Synapse
В выбранной вами папке создайте файл docker-compose.yml со следующим содержимым (используйте форматирование в VS Code или веб-редакторе):
version: '3.8'
services:
matrix-gen: (Создаем контейнер с первичной генерацией)
image: matrixdotorg/synapse:latest
container_name: matrix-gen
volumes:
- ./matrix-data:/data
environment:
SYNAPSE_SERVER_NAME: "localhost"
SYNAPSE_REPORT_STATS: "no"
command: ["generate"]
networks:
- matrix-net
restart: "no" (убираем контейнер после запуска)
matrix-register: (создаем контейнер на регистрацию)
build:
context: .
dockerfile: Dockerfile.register
container_name: matrix-register
depends_on:
matrix-gen:
condition: service_completed_successfully
volumes:
- ./matrix-data:/data
networks:
- matrix-net
restart: "no" (убираем его после первого запуска)
environment:
- SYNAPSE_SERVER_NAME=localhost
- SYNAPSE_REPORT_STATS=no
matrix: (создаем главный контейнер , который будет работать в будущем)
image: matrixdotorg/synapse:latest
container_name: matrix
hostname: matrix
depends_on:
matrix-register:
condition: service_completed_successfully
ports:
- "8008:8008"
volumes:
- ./matrix-data:/data
environment:
SYNAPSE_SERVER_NAME: "localhost"
SYNAPSE_REPORT_STATS: "no"
SYNAPSE_CONFIG_PATH: "/data/homeserver.yaml"
networks:
- matrix-net
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:8008/health"]
interval: 30s
timeout: 10s
retries: 3
networks:
matrix-net:
driver: bridge
ipam:
config:
- subnet: 172.20.0.0/16
В той же папке создадим файл dockerfile.register, в котором укажем путь к скрипту register.sh и его содержимое.
FROM matrixdotorg/synapse:latest
RUN apt-get update && \
apt-get install -y --no-install-recommends bash && \
rm -rf /var/lib/apt/lists/*
COPY register.sh /register.sh
RUN chmod +x /register.sh
ENTRYPOINT ["/register.sh"]
сам файл скрипта register.sh
#!/bin/bash
# Сохраняем PID сервера
/start.py &
SYNAPSE_PID=$!
# Ждем инициализации
sleep 15
# Регистрируем пользователя (с повторной попыткой)
register_new_matrix_user -c /data/homeserver.yaml http://localhost:8008 \
-u admin -p admin -a || \
sleep 5 && \
register_new_matrix_user -c /data/homeserver.yaml http://localhost:8008 \
-u admin -p admin -a
# Останавливаем сервер через kill
kill $SYNAPSE_PID
Файл для регистрации пользователя register_user.py
#!/usr/bin/env python
import os
import time
import subprocess
from subprocess import Popen
# Запускаем synapse в фоне
synapse = Popen(["/start.py"])
# Ждем инициализации
time.sleep(10)
# Регистрируем пользователя
subprocess.call([
"register_new_matrix_user",
"-c", "/data/homeserver.yaml",
"http://localhost:8008",
"-u", "admin",
"-p", "admin",
"-a"
])
# Останавливаем synapse
synapse.terminate()
В этом файле вы можете указать нужного пользователя.
Порядок запуска приложений в контейнере
# Пересобираем образ
docker-compose build matrix-register
# Запускаем
docker-compose up matrix-gen matrix-register
# Если регистрация прошла успешно, запускаем основной сервер
docker-compose up -d matrix
Открываем matrix и проверяем
Наша структура файлов.
your-project-folder/
├── docker-compose.yml
├── Dockerfile.register
├── register.sh
└── matrix-data/ (автоматически создастся)
Давайте установим клиент Element.
sudo apt install -y wget (обновим wget) если надо.
wget https://packages.element.io/debian/pool/main/e/element-desktop/element-desktop_1.11.50_amd64.deb
sudo dpkg -i element-desktop_*.deb
Открываем его (в приложениях) и вводим адрес контейнера с нужным портом. Затем вводим логин и пароль, указанные в файле скрипта.
Добавление нового пользователя docker exec -it matrix register_new_matrix_user -c /data/homeserver.yaml http://localhost:8008
Заключение
Как мы видим, существуют аналоги для популярных мессенджеров, в которых общедоступный сервер заменён на наш собственный.
Другие части