meowzone
Как я поднял свой личный Matrix-мессенджер
Я давно хотел иметь свой собственный семейный мессенджер, без зависимостей от Telegram/WhatsApp на случай, если один из них станет не доступен.
Мне нужен был простой вариант: сообщения, фото, файлы. Звонки и видео для меня были избыточными, поэтому всю усложняющую историю с coturn я сразу отбросил.
В итоге я развернул Matrix Synapse в Docker. Всё работает стабильно, шифрование есть, и самое главное - всё хранится у меня на домашнем сервере, в роли которого выступает старенький неттоп на Intel Core i3 7100T, на нем же крутится система умного дома Home Assistant, а так же медиасерверы Jellyfin и Navidrome.
Так как получил предложение написать об этом пост, рассказываю как это реализовывал.
1. Для начала давайте сперва поговорим, что такое Matrix и зачем он нужен
Matrix - это защищённый протокол обмена сообщениями.
Он похож на Telegram, но:
полностью открытый
работает на вашем железе, либо на вашем облачном сервере
переписка шифруется на устройстве
Мы будем поднимать сервер Synapse (основная реализация Matrix) на Docker
2. Docker Сompose
Matrix может работать на SQLite, но лучше взять PostgreSQL - он надёжнее.
Вот минимальный рабочий docker-compose.yml:
services:
synapse:
image: matrixdotorg/synapse:latest
container_name: matrix-synapse
restart: unless-stopped
environment:
SYNAPSE_SERVER_NAME: chat.example.net
SYNAPSE_REPORT_STATS: "no"
volumes:
- ./synapse:/data
depends_on:
- postgres
logging:
driver: "json-file"
options:
max-size: "50m"
max-file: "3"
networks:
- internal
postgres:
image: postgres:14
container_name: matrix-postgres
restart: unless-stopped
environment:
POSTGRES_DB: synapse_db_r72m
POSTGRES_USER: synuser_k84t
POSTGRES_PASSWORD: dN8vQ3pL7wS1zFgB9rT2
POSTGRES_INITDB_ARGS: "--encoding=UTF8 --lc-collate=C --lc-ctype=C"
volumes:
- ./postgres:/var/lib/postgresql/data
logging:
driver: "json-file"
options:
max-size: "50m"
max-file: "3"
networks:
- internal
networks:
internal:
driver: bridge
Всё, что вам нужно - создать папку с проектом и положить этот файл туда. Там же в дальнейшем появятся папки с конфигурациями самого сервера и сервера баз данных. Логин, пароль и имя базы созданы рандомно, вы их можете поменять на свои. Так же замените chat.example.net на ваш домен.
3. Генерация начального конфига
Synapse в самом начале нужно инициализировать:
docker compose run --rm synapse generate
Появится папка synapse/ с файлом homeserver.yaml.
Там находим блок базы данных и меняем его на PostgreSQL, блок с SQLite можно закомментировать:
database:
name: psycopg2
args:
user: synuser_k84t
password: dN8vQ3pL7wS1zFgB9rT2
database: synapse_db_r72m
host: matrix-postgres
port: 5432
Это всё.
4. Запуск сервера
docker compose up -d
5. HTTPS + домен (основной вариант)
Самый нормальный способ пробросить сервер наружу - через домен и HTTPS.
Я использую Nginx Proxy Manager (NPM), но подойдёт любой прокси.
Важно: Nginx Proxy Manager должен быть в одной Docker-сети с Matrix-сервером.
Synapse по умолчанию создаёт свою сеть - она называется так же, как папка с проектом, с суффиксом _internal (если не меняли compose файл). Если NPM не подключён к этой сети, он просто не увидит контейнер matrix-synapse и проксирование работать не будет.
Чтобы подключить NPM к нужной сети:
docker network connect <имя_сети_internal> <контейнер_NPM>
Создаём Proxy Host на matrix-synapse:8008
Получаем SSL-сертификат
Добавляем два обязательных пути .well-known:
location /.well-known/matrix/server {
add_header Content-Type application/json;
return 200 '{"m.server": "chat.example.net:443"}';
}
location /.well-known/matrix/client {
add_header Content-Type application/json;
return 200 '{"m.homeserver": {"base_url": "https://chat.example.net"}}';
}
Не забудьте заменить chat.example.net на ваш домен.
Проверяем прямо на сервере, или в консоли вашего компа:
Ответ должен быть таким:
{"m.homeserver":{"base_url":"https://chat.example.net"}}
6. Если домен не нужен, то можно работать по HTTP и IP
Просто пробрасываете порт наружу и подключаетесь к серверу вот так:
http://server-ip:8008/
Matrix всё равно шифрует переписку, поэтому содержимое сообщений никто не увидит.
Минусы:
Element может ругнуться
федерации (общения с другими серверами) не будет
Для семейного чата идеальный упрощённый вариант.
После можно зайти через браузер. Если сервер успешно поднялся, вы увидите такую страницу:
7. Создание администратора
Первого пользователя я создавал так:
docker exec -it matrix-synapse \
register_new_matrix_user \
-c /data/homeserver.yaml \
-a \
http://matrix-synapse:8008
(matrix-synapse:8008 — адрес внутри Docker-сети)
8. Создание обычного пользователя
docker exec -it matrix-synapse \
register_new_matrix_user \
-c /data/homeserver.yaml \
--no-admin \
http://matrix-synapse:8008
9. Важное замечание о паролях при создании пользователей
При создании пользователей через CLI нельзя использовать в пароле символы UTF-16, иначе Synapse выдает ошибку:
UnicodeEncodeError: 'utf-8' codec can't encode character '\udce3'
10. Как узнать свой токен для админских команд
Для работы с API нужен токен доступа.
Получить его проще всего через CLI-авторизацию.
Шаг 1. Выполнить вход через API:
docker exec -it matrix-synapse curl -s -X POST \
-H "Content-Type: application/json" \
-d '{"type":"m.login.password","user":"ВАШ_ЛОГИН","password":"ВАШ_ПАРОЛЬ"}' \
http://localhost:8008/_matrix/client/r0/login
Шаг 2. В ответе найдите поле:
"access_token": "syt_xxxxxxx..."
11. Полезные команды с токеном
Проверить, кто вы:
docker exec -it matrix-synapse curl -H "Authorization: Bearer ВАШ_ТОКЕН" \
http://localhost:8008/_matrix/client/r0/account/whoami
Список пользователей:
docker exec -it matrix-synapse curl -H "Authorization: Bearer ВАШ_ТОКЕН" \
http://localhost:8008/_synapse/admin/v2/users
Список комнат:
docker exec -it matrix-synapse curl -H "Authorization: Bearer ВАШ_ТОКЕН" \
http://localhost:8008/_synapse/admin/v1/rooms
Удалить комнату:
docker exec -it matrix-synapse curl -X DELETE \
-H "Authorization: Bearer ВАШ_ТОКЕН" \
http://localhost:8008/_synapse/admin/v1/rooms/ROOM_ID
Деактивация пользователя:
docker exec -it matrix-synapse curl -s -X PUT \
-H "Authorization: Bearer ВАШ_ТОКЕН" \
-H "Content-Type: application/json" \
-d '{"deactivated": true}' \
"http://localhost:8008/_synapse/admin/v2/users/@user:chat.example.net"
Получить список устройств пользователя:
docker exec -it matrix-synapse curl -s \
-H "Authorization: Bearer ВАШ_ТОКЕН" \
"http://localhost:8008/_synapse/admin/v2/users/@user:chat.example.net/devices"
Удалить конкретное устройство:
docker exec -it matrix-synapse curl -s -X DELETE \
-H "Authorization: Bearer ВАШ_ТОКЕН" \
"http://localhost:8008/_synapse/admin/v2/users/@user:chat.example.net/devices/ИДЕНТИФИКАТОР_УСТРОЙСТВА"
12. Подключение с телефона
На телефон ставим приложение Element (iOS/Android) и настраиваем подключение к другому серверу.
Если у вас HTTPS и домен:
Если вы работаете по IP:
http://server-ip:8008/
Далее вводите имя пользователя и пароль, затем через поиск находите второго пользователя:
@имя
И отправляете ему приглашение. Второй пользователь принимает приглашение и создается комната, в которой вы можете общаться.
Важно: Сохраните в настройках клиента ключи восстановления, чтобы в следующий раз восстановить зашифрованные сообщения, иначе не получится их прочитать.
13. Немного про звонки
Звонки и видео требуют настроенный TURN-сервер (coturn).
Он поднимается отдельно, настраивается не сложно, но это уже другая тема.
Для обычной текстовой переписки не нужен вообще.
14. Итог
Matrix - это несложно.
Он даёт вам:
свой личный мессенджер
без рекламы
без чужих серверов
с нормальным шифрованием
с хранением данных у вас
Для семьи или небольшой группы - идеальный вариант.
Вот и до меня добрался маразм Авито)
Выставил на продажу старое файловое хранилище, ничего не предвещало беды, как объявление заблокировали по причине "Контакты на фото". Кажется я уже с таким сталкивался 10 лет назад, тогда просто бот цифровые значения в описании принимал за контакты и банил, но тут все оказалось куда забавнее.
Написал я в техподдержку, что у меня нет контактов на фотографиях и тут явно какая то ошибка, на что у меня состоялся вот такой диалог:
Ответ на пост «Взлетел»1
Когда я играл в ГТА 4, у меня был свой кайф: просто медленно ехал по улицам Либерти Сити, смотрел на пейзажи, людей, фасады, этот серый мокрый асфальт. И вот однажды, чисто случайно, я был свидетелем такой сцены, что я пожалел, что у меня не был запущен какой нибудь Fraps.
Стою я на перекрестке, в соседнем ряду машина тихо сбрасывает скорость и останавливается на красный и вдруг сзади в нее на полном ходу вписывается патрульная. Из полицейской тачки выбегают копы, из той машины впереди выбирается водитель, начинает что то возражать, а менты просто хладнокровно кладут его прямо на дороге. Потом спокойно садятся обратно в свою машину, включают сирену и, переехав труп, улетают куда-то дальше по служебным делам.
Вот за такие моменты ты понимаешь, что мир игры живет своей жизнью. Это не было похоже на заскриптованную сцену, все выглядело как чистая случайность, из за которой сработали побочные скрипты - Из машины вылез оглушенный и недовольный водитель, а копы проявили агрессию сразу, как только им что то не понравилось. В эту секунду Либерти Сити казался не просто декорацией, а городом где в любой момент может случиться полное безумие.
По настоящему прорывная была игра в свое время, ГТА 5 уже не вызывала таких эмоций.
Ответ Appelsin88 в «Полицейские, какую самую тупую вещь вы когда-либо видели или слышали от преступника?»78
Как-то обслуживал я инфраструктуру (сеть, видеонаблюдение) в одном учебном заведении. У них был заключен договор на услуги ЧОП и охранники были приходящие. И вот звонит мне зам по АХЧ и говорит, что охранник в общаге сбил настройки камер. Я сначала не понял: как сбил, у него же никогда паролей от регистраторов не было? Но решил вечером заехать, глянуть, что случилось.
Приезжаю. Навстречу выходит сотрудница, которая сама жила в этой же общаге. Смотрим комп охраны, а там в программе для просмотра потоков с камер - пусто, ни одного регистратора в списке. Ну я запускаю "Автопоиск", нахожу все регистраторы, добавляю и камеры снова оживают.
Спрашиваю: "А где охранник-то?"
А мне отвечают: "Да он вчера вечером ушел и больше не приходил".
И тут у меня пазл складывается: регистраторы из программы специально удалили (а это можно сделать даже без админских прав), а сам охранник испарился. Записи, к счастью, хранились не на компе, а на самих регистраторах, которые стояли в разных корпусах общаги, в железных шкафах под замком.
Начали разбираться по хронологии. Оказалось, что прошлым вечером, когда общага почти пустовала (каникулы, студентов почти не было), охранник сперва отвернул камеру, которая смотрела прямо на его пост, потом снёс регистраторы из программы и пошел гулять по этажам, где никого не было. Попутно заходил в комнаты и воровал вещи, прям видно было, как заходил с пустыми руками, а выходил уже вынося что то. У одной девушки исчез старенький ноутбук, у других пропали какие-то мелочи.
Вызвали полицию, оформили заявление, передали записи с камер. Ноутбук, кстати, нашли в соседнем ломбарде. Даже удивляет, что такую старую рухлядь у него приняли (там ноут чисто под печатную машинку, очень старый).
Чем в итоге закончилась история уже и не вспомню, вроде бы задержали его и даже срок какой-то дали. Но то, что охранник оказался тупой ворюгой - факт))
Ответ Аноним в «Стыдно за свидание»36
Я когда-то познакомился с девушкой по аське - это был 2003-й. Я тогда жил в Екатеринбурге, она в Москве. И у нас закрутился настоящий бурный интернет-роман: каждый день переписывались в аське, часами зависали онлайн.
Фотки друг другу слали - ей легко, у неё был классный цифровик, а я сначала отсканированные фотки ей кидал, потому что фотика не было. Потом плюнул, пошёл и купил себе вебку только ради того, чтобы щёлкать кадры и отсылать ей.
Это длилось почти год. Мы не теряли связь, мечтали когда-нибудь увидеться, но, честно, в 17 лет при таком расстоянии - всё это больше похоже было на красивую сказку. В итоге мы начали отдаляться, она нашла парня в Москве, а наше общение сошло на нет. Помню, жила она в Выхино, звали Наташа, ник GeLLa. Увлекалась рисованием мультфильмов в Adobe Flash, прям талантливая была.
Теперь я сам живу в Москве. Бывает, проезжаю Выхино и невольно думаю: а что было бы, окажись я тут тогда, 22 года назад? Остались только тёплые, приятные воспоминания))







