Серёга Маркевич

Блог айтишника, спекулянта, авантюриста. Обо всем том, что волнует лично меня. Фотки и видео, путешествия и стендап, радио и музыка, инвестиции и бизнес, покер и прочая годнота.

параллель

Установка и настройка Jabber сервера Prosody + IMAP авторизация dovecot + http_upload_external

Ман переодически обновляется. Добавьте в закладки и смотрите обновления иногда.
Версионность
16.08.2019 — Дата создания
18.08.2019 — Отключил epol в связи с нестабильной работой сервера см. комментарий в конфиге

После эксперементов над Matrix, а так же попыткой из сервера конференций Jitsi превратить его в полноценный jabber сервер для домена (не удачной), Nextcloud Talk (тоже сырой сильно) я все таки вернулся к первоначальной мысли о том, что Jabber пока лучшее open-source решение для безопасного приватного обмена сообщениями на основе своего сервера и обязательным шифрованием e2e на стороне клиентов.

Потратил я на всю настройку и тестирование около недели, так как проблем было очень много это в основном касалось того, что бы сервер на 100% покрывал возможности клиентов, которые на нем будут использоваться.
А так же полностью покрывал или максимально возможно проходил требования xmpp.net и compliance.conversations.im

На вопрос зачем мне все это я в краце ответил в статье про Matrix

Требования к клиентам:

  • OMEMO шифрование сквозное и один на один и комнат чатов.
  • Приличный современный дизайн и юзабилити, что бы не гики пользовались, а родственники и друзья.
  • Стабильность, что бы все сообщения доходили
  • Работа приложений в фоне и пуши

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

-Android — Conversations, Pix-Art Messeger (Pix-Art форк первого, но с небольшой разницей (я заметил, что видеопроигрывать встроен уже, больше инфы о сервере дает), причем я ставил его из маркета, а потом он для России пропал, но apk всегда можно скачать с сайта)
-iOS — ChatSecure (без альтернатив, их просто нет с нормально работающим OMEMO шифрованием)
-Windows — Gajim, PSI+ (тут вообще все печально с красотой клиентов, ничего с 2010 года не изменилось)
-MacOS — Monal, Siskin (Не тестировал еще, но заявлено, что умеют OMEMO на вид ниче такие)

Требования к серверу

  • Стабильность, обновляемость, покрытие XEP для клиентов, модули
  • Простота настройки
  • Наличие мануалов (язык не важен)
  • Ubuntu, Debian
  • Поддержка нескольких виртуальных хостов и простота настройки
  • Аутентификация через IMAP Dovecot сервер.
  • Хранение архива сообщений и всей служебной инфомации в БД
  • Работа на уже установленной VestaCP и отсутствие конфликтов.

Остановился на Prosody, Ejabberd слишком сложен для меня в настройке, несколько раз сталкивался с ним, не зашел.

Сложности, которые возникли при настройке и потребовали времени на решение:

  1. Заморочка с сертификатами, какие куда и вообще нужно ли прописывать.
  2. Push уведомления в ChatSecure не доходили, засыпали клиенты и все, сообщения не доходят.
  3. Обмен файлами между виртуальными хостами, сложность была в сертификатах, подсовывал одному хосту другой, решено внедрением http_upload_external
  4. Не отображение аватарок при смене, пропадаение при использовании mod_vcard_legacy ради 100% покрытия https://compliance.conversations.im/

Результаты проверок на xmpp.net и compliance.conversations.im в карусели по настройке сервера по данной инструкции.

Все настройка и установка проходила в следующих реалиях:
Ubuntu 18.04, Prosody 0.11.2 с уже установленной VestaCP + https force шаблоном (nginx+apache) + dovecot + mysql + postgress + fastcgi.

Вам не обязательно ставить vestacp, это лишь у меня стоит, но тогда надо будет заморочиться с установкой apache2 для работы external upload модуля файлов, но если у вас хост всего 1 и не планируете добавлять домены новые то можно не париться на тему установки веб сервера и работать со встроенным в prosody и использовать для файлов обычный http_upload, а не http_upload_external.

Открыть порты в файрволе Vestacp

Порты 5222,5223,5269 — обязательны, через них идет связь c2s, s2s.
Порты 5000,5280,5281 — тут не очень уверен в необходимости, 5000 это proxy65, остальные для внутреннего http сервера prosody, который принимает websocket, bosh. Но его я проксирую с nginx поэтому можно закрывать а в конфиге я потом себе поставлю 127.0.0.1 интерфейс на эти штуки, это будущая задача, пока вот в таком виде работает.

Установка Prosody + модули

Добавим репозиторий Prosody

echo deb http://packages.prosody.im/debian $(lsb_release -sc) main | sudo tee -a /etc/apt/sources.list
wget https://prosody.im/files/prosody-debian-packages.key -O- | sudo apt-key add -

Обновим систему и репозитории. В идеале потом ребутнуться.

sudo apt-get update && apt-get upgarde

Теперь можно устанавливать Prosody и пакеты для epol и для работы с БД вы можете выбрать свою, какую хотите, оставить одну. У меня все на PG работает.

sudo apt-get install prosody lua-event lua-dbi-postgresql lua-dbi-mysql

Установим модули в папку /opt скачаем из репозитория свежие:

cd /opt
sudo apt-get install mercurial
hg clone https://hg.prosody.im/prosody-modules/ prosody-modules
chown -R prosody:prosody /opt/prosody-modules

Обновление модулей в будущем делается так:

cd /opt/prosody-modules
hg pull -u

Дальше можно установить mc для удобства и уже через него очистить папку /etc/prosody от старых конфигов и сертификатов, можете забекапить куда-нибудь на всякий случай.

apt-get install mc

Следующий этап это нужно создать сертификаты через VestaCP если она есть если нет, то сами решите как получите сертификаты Letscrypt манов в сети полно. А я буду про весту писать, как чего.

Создали домен в весте, получили на него сертификаты в весте прям внутри. Дальше нужно создать символические ссылки на файлы сертификатов из папки (к примеру пользак у вас в весте admin)
из папки /home/admin/conf/web в папку /etc/prosody/certs делаем сиволическую ссылку, я просто делал через mc а не командами в консоли и на ссылку поставить права на чтение для всех. Это конечно не совсем верное решение, надо бы подумать над тем, что бы prosody добавить в группу пользака admin в будущем, так как это может не заработать, когда обновится сертификат, vesta может переписать права, тут момент спорный не спорю, но пока работает. Дальше бы изменил.

Нюанс как называть символические ссылки из весты в prosody, так как он ищет именно эти названия файлов в своем каталоге с сертификатами:

Vesta Prosody ссылка
ssl.domain.com.pem domain.com.crt
ssl.domain.com.key domain.com.key

Еще для пущей безопасности умные люди советуют
Ключ Диффи-Хеллмана сделать:

cd /etc/prosody/certs/
openssl dhparam -out dh-2048.pem 2048
chown prosody:prosody dh-2048.pem
chmod u=rw,go= dh-2048.pem

Dovecot

Открываем файл /etc/dovecot/conf.d/10-master.conf на редактирование, находим секцию service auth и вписываем в неё:

service auth {
    unix_listener prosody-auth-client {
        mode = 0660
        user = prosody
        group = prosody
    }
}

Альтернативый вариант в файл /etc/dovecot/dovecot.conf это записать до строчки: !include conf.d/*.conf

Пользователь

Создайте в вашем домене почтовый ящик для админа, логин и пароль будут такие же для Jabber как и для почты.

Домен для upload файлов

Что бы нормально работала загрузка файлов, когда у вас несколько виртуальных хостов, то обязательно нужно использовать mod_http_upload_external иначе будут проблемы с сертификатами, и отправка файлов будет работать нормально только на одном из виртуальных хостов, а другие будут ругаться на ошибочный сертификат, заставить работать на встроенном в prosody веб сервере загрузку файлов и привязать к каждому домену свой я так и не смог, просто применил внешний веб сервер и все.

  1. Создайте в VestaCP домен upload.domain.com и получите на него сертификат.
  2. Из папки /opt/prosody-modules/mod_http_upload_external скопируйте файл share_v2.php в папку /home/admin/web/upload.domain.com/public_html/
  3. Создайте папку в любом месте удобном на сервере, но не в папке public_html папку uploads и дайте на него все права пользователю admin что бы в нее складывались загруженные пользователями файлы.
  4. Сделайте владельцем файла share_v2.php в папке веб сервера пользака admin (при условии, что сам домен uploads в vestacp создан под пользователем admin, если вы не используете весту то у вас пользак www-data это касается прав и п. 3) и поставьте права на исполнение.
  5. В файле share_v2.php отредактируйте строки:
/* Change this to a directory that is writable by your web server, but is outside your web root */
$CONFIG_STORE_DIR = '/var/lib/prosody/uploads'; 

/* This must be the same as 'http_upload_external_secret' that you set in Prosody's config file */
$CONFIG_SECRET = 'набор символов большой как пароль для просоди он нужен будет в конфиге просоди';

$CONFIG_STORE_DIR — полный путь к папке uploads которую вы сделали в шаге 3.
$CONFIG_SECRET  — Произвольный большой пароль для prosody когда он будет лить файлы

PHP и fcgid

Для загрузки больших файлов и снятия ограничения надо отредактировать файлы конфигов отвечающих за выполнение скриптов

nano /etc/apache2/mods-enabled/fcgid.conf

Добавить:

MaxRequestLen 2000000000

Я не стал париться и сделал ограничение в 2гб на сервере, вы можете сделать меньше, этот объем для сервера prosody будет регулироваться еще и в конфиге.

Так же на всякий случай я сделал следующие изменения в файлах:

/etc/php/7.2/apache2/php.ini
/etc/php/7.2/cgi/php.ini
/etc/php/7.2/cli/php.ini

Установил следующие параметры для загрузки файлов и выполнение скриптов

max_execution_time = 600
max_input_time = 600
post_max_size = 2000M
upload_max_filesize = 2000M
max_file_uploads = 200

В файле /etc/nginx/nginx.conf
Параметр изменить надо тоже, вы можете ставить везде не 2гб как я а скажем 500m как хотите:

client_max_body_size            2000m;

Это сняло ограничение на mod_http_upload_external ну вернее на nginx, который файлы эти закачивал.

Prosody

Я постарался сделать так, что бы лего можно было добавлять новые virtualhost для обслуживания сервером, что бы не париться с сертификатами и работоспособностью загрузки файлов. Для добавления новых хостов, вам нужно будет только создать домен в vestacp, сделать символические ссылки на сертификаты как делали выше по инструкции и добавить новый файл domain.com.cfg.lua в папку /etc/prosody/conf.d/ и он автоматом подключиться и будет работать после рестарта просоди.

Сам конфиг постарался причесать как смог, но в нем есть конечно еще вопросы у меня о необходимости тех или иных модулей в текущем времени, например я не уверен в необходимости подключения proxy65 с учетом того, что вся загрузка практически идет через http. Хз в общем насколько это актуально.

Большой головной болью для меня на целый день стала плохая работа ChatSecure вернее push уведомления не приходили, буквально уже через минуту, как chatsecure уходил в спячку на iPhone, пуши переставали приходить, я долго рыл форумы, пока не нашел причину, при погоне за секурностью сертификатов и отличных результатов на xmpp.net я отключил много вариантов шифрования по рекомендациям на других сайтах, на этом и погорел, ну я так думаю по крайней мере в результате, что бы пуши нормально начали доходить, надо было обязательно добавить следующе вещи в конфиг помимо самого модуля mod_cloud_notify
следующие модули

"filter_chatstates";
 "pinger";
 "throttle_presence";

И добавить в раздел SSL ciphers:

AES256-GCM-SHA384

Ну я так думаю, если бы я не использовал всякие опции для SSL то проблем бы и не было.

Безусловно нужно включить mam, pep и smack и smack_offline это описано в мануалах тут вопросов не было. Но не очевидные вещи я описал выше.

Весь конфиг с моими комментариями НЕ КОПИРУЙТЕ БЕЗДУМНО:

/etc/prosody/prosody.cfg.lua

--конфиг взят с  markevich.ru

admins = { "login@domain.ru" }

---Запрещаем регистрацию---
allow_registration = false
-----------------------------------

----служебное барахло для запуска---
--use_libevent = true -- ОТКЛЮЧЕНО, нельзя было авы поставить на чатсекуре, в логах были ошибки с днс связанные косвенно это изза епула, так нарыл в нете, отключил. Более хорошо стал работать на медленных соединениях это у меня субъективно.
daemonize = true;
pidfile = "/var/run/prosody/prosody.pid";

---------------------------------
default_storage = "sql"

-- POSTGRES SQL driver
---------------------------------

sql = {
    driver = "PostgreSQL";
    database = "prosody";
    host = "localhost";
    port = 5432;
    username = "prosody";
    password = "пароль от бд";
}

--Может ли просоди сам управлять своими таблицами и делать ремонт, рекомендовано.
sql_manage_tables = true

--------------------------------

---TLS для сервера--------------
certificates = "/etc/prosody/certs"

ssl = {
options = { "no_sslv3", "no_sslv2", "no_ticket", "no_compression", "cipher_server_preference", "single_dh_use", "single_ecdh_use" };
ciphers="EECDH+ECDSA+AESGCM:EECDH+aRSA+AESGCM:EECDH+ECDSA+SHA384:EECDH+ECDSA+SHA256:EECDH+aRSA+SHA384:EECDH+aRSA+SHA256:EECDH+aRSA+RC4:EECDH:EDH+aRSA:!aNULL:!eNULL:!LOW:!3DES:!MD5:!EXP:!PSK:!SRP:!DSS:!RC4:AES256-GCM-SHA384";
protocol = "tlsv1_1+";
dhparam = "/etc/prosody/certs/dh-2048.pem";
}

--требуем от всех и пользаков и серверов шифрование исключение гугл и циска они не хотят такого делать
c2s_require_encryption = true;
s2s_require_encryption = true;
s2s_encryption_exceptions = {
    "cisco.com",
    "gmail.com",
}

s2s_secure_auth = true;

--Для ботов своих или старых клиентов обычно включают старый вариант авторизации на старом порту
legacy_ssl_ports = { 5223 }

-------------------------------
-- Prosody Module 
---------------------------------

plugin_paths = { "/opt/prosody-modules/" }

-- Глобальные модули--------------------------

modules_enabled = {
                -- Wichtige Module
                        "roster";
                        "saslauth";
                        "tls";
                        "dialback";
                        "disco";

                -- Empfohlene Module
                        "private";
                        "profile";
                        "offline";
                        "admin_adhoc";
                        "admin_telnet";
                        "http_files";
                        "legacyauth";
                        "version";
                        "uptime";
                        "time";
                        "ping";
                        "register_web";
                        "register";
                        "posix";
                        "bosh";
                        "announce";
                        "proxy65";
                        "pep";
                        "smacks";
                        "smacks_offline";
                        "carbons";
                        "blocklist";
                        "csi";
                        "csi_battery_saver";
                        "mam";
                        "lastlog";
                        "list_inactive";
                        "cloud_notify";
                        "compat_dialback";
                        "throttle_presence";
                        "log_auth";
                        "server_contact_info";
                        "websocket";
                        "bookmarks";
                        "privacy_lists";
                        "pubsub";
                        "filter_chatstates";
                        "vcard_legacy"; 
                        "pinger";
                        "http_upload_external";
};
---------------------------------
--
-- Включаем логи, после отладки закоментить все кроме error
----------------------------------

-- log = "/var/log/prosody/prosody.log"
log = {
    debug = "/var/log/prosody/debug.log";
    info = "/var/log/prosody/info.log";
    warn = "/var/log/prosody/warn.log";
    error = "/var/log/prosody/error.log";
}

------------------------------------
--
-- MAM settings
----------------------------
default_archive_policy = true;
archive_expires_after = "4w";

---------------------------
-- HTTP Upload settings НЕ УВЕРЕН В НЕОБХОДИМОСТИ ЭТОЙ ХРЕНИ в связи с подключением external если что уберу или попробуйте сами убрать
----------------------------
http_max_content_size = 524288000;
http_upload_file_size_limit = 524288000;
http_upload_path = "/var/lib/prosody/http_upload";
http_max_content_size = 7000000000
http_upload_expire_after = 2592000
https_ports = { 5281 }
http_ports = { 5280 }
--------------------------------------

---EXTERNAL HTTP UPLOAD - работающее решение сейчас
--Путь до файла share_v2 URL должен быть обязательно с / на конце!
http_upload_external_base_url = "https://upload.domain.ru/share_v2.php/"
http_upload_external_secret = "тот самый пароль большой из share_v2.php"
http_upload_external_file_size_limit = 2147483648
http_upload_external_protocol = "v2";
--------------------------------

-- Websocket нужен для того, что бы через веб-клиенты можно было подключаться
consider_websocket_secure = true;

------------------------------------
--
-- Bosh config та же песня для веб херни
----------------------------------
cross_domain_bosh = true;
consider_bosh_secure = true;

---------------------------------
--
-- SMACK settings помогает на мобилах не засыпать и пуши сраные что бы работали
----------------------------------

smacks_enabled_s2s = true
smacks_hibernation_time = 7200
smacks_max_unacked_stanzas = 10
smacks_max_ack_delay = 3600
smacks_max_hibernated_sessions = 10
smacks_max_old_sessions = 10
--
-- Push fix for ChatSecure настройка пушей, что бы не отправлял на сервер пушей текст, один хрен он шифрованный, а показывал лишь юхав масаж. что бы данные не летали на сервак пушей

push_notification_important_body = "You have new message"
push_notification_with_body = false
push_notification_with_sender = false

-----PINGER переодически опрашиваем серваки и клиенты на жив ли ты бро, в будущем думаю отключить, если не повлияет на пуши и доставку сообщений на мобилы.

c2s_idle_timeout = 30
c2s_ping_timeout = 30

----
--- Contact info - для красоты проверки комплаинсом
---------------------------------
contact_info = {
  abuse         = { "mailto:abuse@domain.com", "xmpp:abuse@domain.com.ru" };
  admin         = { "mailto:abuse@domain.com.ru", "xmpp:abuse@domain.com.ru" };
  feedback      = { "mailto:abuse@domain.com.ru", "xmpp:abuse@domain.com.ru" };
  sales         = { "mailto:abuse@domain.com.ru", "xmpp:abuse@domain.com.ru" };
  security      = { "mailto:abuse@domain.com.ru", "xmpp:abuse@domain.com.ru" };
  support       = { "mailto:abuse@domain.com.ru", "xmpp:abuse@domain.com.ru" };
};

---ПОДГРУЖАЕМ КОНФИГ ДОМЕНОВ---
Include "conf.d/*.cfg.lua"

Конфиг virtualhost

/etc/prosody/conf.d/domain.ru

plugin_paths = { "/opt/prosody-modules/" }

VirtualHost "domain.ru"
http_host = "domain.ru"

        authentication = "dovecot"
        dovecot_auth_socket = "/var/run/dovecot/prosody-auth-client"
        auth_append_host = true
       

modules_enabled = {
       -- "groups"; если нужен то раскоментить подробности ниже.
}

--файл со списком пользаков, которые добавляются в этом виртуал хосте по умолчанию,
-- это полезно когда делаете виртуал хост для ограниченого числа людей, компании, семью и тп, может быть себя
--во все ростеры хотите включить или поддержку или бота. если надо раскоментите и формат файла такой
--посмотреть на https://prosody.im/doc/modules/mod_groups
--groups_file = "/etc/prosody/share.txt" 

Component "conference.domain.ru" "muc"
        name = "domain.ru Chatrooms"
        restrict_room_creation = "local"
        muc_room_default_public = false
        muc_room_default_members_only = true
        muc_room_default_language = "ru"
        max_history_messages = 500
                modules_enabled = {
                        "muc_mam",
                        "vcard_muc",
                        "muc_cloud_notify";
                }
                muc_log_by_default = true

Component "pubsub.domain.ru" "pubsub"

disco_items = {
    { "conference.domain.ru", "The domain.ru MUC" };
}
proxy65_acl = { "domain.ru" }

Дальше собственно рестартуем prosody

/etc/init.d/prosody restart

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

Шаги за рамками данного мануала:

  1. Настройка проксирования nginx на bosh и websocket
  2. Настройка meta файлов для альтернативного подключения через nginx
  3. настройка DNS

Даже без этих шагов все и так хорошо, но ДНС бы прописать, что бы получить результаты проверки красоты на комплайнс конференс.

Установка и настройка Matrix Synapse + Riot-web на Ubuntu 18.04

В наше время стало просто опасно вести переписки на конфиденциальные темы в обычных мессенджерах, такие как Whatsapp, Viber и пр. им просто нет доверия, ведь если они до сих пор работают, значит никому не мешают. Рано или поздно либо их заблокируют как телеграмм, который предоставляет E2E шифрование, либо продолжат сливать данные корпорациям и правительству.
Раньше была только 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/

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

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 в гитхабе.

9 признаков, по которым покер похож на бизнес

  1. Ты должен играть с картами, которые тебе сдали, и с тем количеством фишек, которые перед тобой на столе. Бизнес надо начинать с того, что есть.
  1. Выигрыш зависит в первую очередь не от того, какие карты на руках у тебя — а от того, какие карты у других. Дело не в том, хорошая ли у тебя идея, а насколько она конкурентноспособна.
  1. Чтобы продолжать играть — надо продолжать делать ставки. Расходы это или инвестиции в выигрыш — будет понятно только в конце игры.
  1. Даже с двумя тузами на префлопе можно проиграть, выигрышная комбинация собирается из двух карт на руках и пяти карт на столе. Нельзя надеяться на то, что начальная идея супервыигрышна, ее обязательно надо дополнять или изменять.
  1. Ты никогда не знаешь наверняка, что на руках и в голове у других игроков. Планы конкурентов неизвестны, но ты их должен учитывать.
  1. Случайно повезти может любому, системно выигрывают только опытные игроки. Успех в бизнесе — это опыт, умение считать и стальные яйца.
  1. Выигрывают не на одной раздаче, а в игре. Есть пословица «не рассказывай мне, с какой рукой ты выиграл — расскажи, какую руку ты сбросил». Нужно уметь вовремя отказаться от неудачной идеи, сбросить карты и пойти на следующий круг.
  1. Выиграть много денег можно только в том случае, если у других игроков хорошие карты, на которые они ставят — а у тебя еще лучше. Когда карты у всех плохие — денег в банке не будет. Заработать много денег в бизнесе можно только на конкурентном рынке.
  1. Покер — это не игра в карты, а игра в фишки. Карты — это только средство потерять их или выиграть. Любой бизнес — это финансовый механизм по вложению и возврату фишек. Продукт — это то, что нарисовано на игральных картах.

Темная Сторона

Прогресс

Работа над игрой не проходит впустую. Вчера вполне себе прошёл глубоко 11 место в турнире за $1.10, что говорить и карты иногда даже заходили. На суммы не смотрите, они пока не важны, рано или поздно будет и первое место.

К теме переездов

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

Не поддавайтесь на провокации и не позволяйте вывести себя из равновесия.

Держите свою важность на минимальном уровне и действуйте осознанно. От вас требуются не усилия и не стойкость, а только осознанное намерение держать важность на нуле.

T9s или как загнать себя в угол

PokerStars No-Limit Hold’em, 0.5 Tournament, 100/200 Blinds (5 handed)

Button (t1,800)
Hero (SB) (t2,090)
BB (t2,002)
UTG (t3,500)
MP (t4,108)

Hero’s M: 6.97

Preflop: Hero is SB with 9, 10
1 fold, MP raises to t400, 1 fold, Hero calls t300, 1 fold

Flop: (t1,000) J, 6, 7 (2 players)
Hero checks, MP bets t400, Hero calls t400

Turn: (t1,800) 10 (2 players)
Hero checks, MP bets t800, Hero calls t800

River: (t3,400) Q (2 players)
Hero checks, MP bets t600, Hero calls t490 (All-In)

Total pot: t4,380

Results below:
Hero had 9, 10 (one pair, tens).
MP had J, K (one pair, Jacks).
Outcome: MP won t4,380

Разбирая руки, в одной нашел ошибки одну за одной:

  1. Зачем было вообще ее играть после рейза, но рейзер лузовый товарищ 54/36 ладно.
  2. С какой целью чекал на флопе? Надо было ставить 1\3 и смотреть перекрутит либо кольнет и падать.
    Сам завел себя.
  3. Ненужно играть уставшим.

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

Мне очень нравится то, что игра в покер учит важным навыкам основа, которым мышление. Мышление в покере можно перекладывать на большинство сфер в жизни: бизнес, переговоры, проекты. Ведь даже выводы на ошибках легко использовать в жизни.

Сегодня я нашел удобный лейаут, что бы все покерные столы выглядели одинакого.
Делюсь: thesamelayout.ru и платная и бесплатная версия.
В 2014 такого еще не видел. Кстати очень много, что изменилось за 4 года, поля стали сложнее на старзах, есть мысль попробовать зарегаться на .ES говорят там сладкие 2008 по опам.

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

Sit&Go >> 9max Turbo SNG

Поиграв спины в легкий минус, поняв, что десперсия просто дикая, а чаще всего ты получишь максимум х2 от байина, перехожу на привычные 9max турбо снг. Ибо режим пиханины вводит в тильт очень быстро, когда фишам с KJo часто доезжает. Буду не дергаться, а играть одну привычную дисциплину.

Бэдбиты

Уже которую неделю у меня даунстрик, раздают мусор, а если придет во фо флоп не попадаю или получаю бэдбит на ривере, когда опу доезжает сет с 33 на руках а тащил он их по все мои рейзы и беты с размером в банк, у меня КК карманки были. Треш. =)

Отрывок из статьи Майка Каро, который врезался мне в память, гласит примерно следующее: если вы сталкиваетесь с большим количеством бэдбитов в игре — это хороший знак, и значит, что вы играете хорошо. Как это так? Но, если задуматься, то в этом есть смысл. Бэдбит — это когда ты доминируешь и все деньги идут на стол. Если ты постоянно оказываешься в ситуации с лучшей рукой, ставя все свои фишки в центр стола, ты играешь в правильный покер.

Заставить своих оппонентов тянуться за чудо-картой каждый раз, чтобы обыграть тебя — вот твоя цель на дистанции. Ты должен стремиться поставить все свои фишки на кон против оппонента, тянущего дро, как можно чаще. Да, это может служить лишь слабым утешением, когда ты попадаешь под *надцатый переезд кряду, попытайся мыслить объективно и понять, что ты всё равно сыграл правильно. Не меняй свою стратегию, основываясь на краткосрочных результатах.

Подождём...и тащим дальше.

Система маятников

Телевизор — чтобы всегда жить в страхе.
Алкоголь — чтобы убежать от реальности.
Работа — чтобы не было времени думать.
Потребление — чтобы заглушить совесть.
Прививки — чтобы разрушить иммунитет.
Мясо — чтобы труп гнил 3 дня в кишечнике.
Кредиты — чтобы быть нищим в рабстве.
Беспорядочный секс — чтобы терять свою энергию.
Таблетки — чтобы загонять болезнь ещё глубже.
Пенсия — чтобы дети не заботились о родителях.
Религия — чтобы быть вечной жертвой.
Зрелища — чтобы чувствовать себя в стаде.
Табак — чтобы оплачивать своё уничтожение.
Школа — чтобы потом стать винтиком в Системе.
Президент — чтобы была иллюзия выбора.
Войны — чтобы управлять людьми через патриотизм.

Возобновил игру на старзах

Сегодня начал снова играть на старзах, эх тряхнул стариной занес 5 турниров. После отмены нормальной системы рейкбека много регуляров сбежало из рума. А когда придумали spin&go набежало много рыбы.
Они себя безопаснее чувствуют, когда опы выбираются рандомно. Не подсядешь просто так, только рандом.

Покатал сейчас и получил сумасшедшие ROI в 25% в легкий приятный плюс. Это конечно забавно, просто маленькая дистанция, дай бог их катать в 4-5% да и вспомнить надо много чего.

Вот как они работают: участвуют три игрока, бай-ин от $0.25 до $1000, структура гипер-турбо (турнир обычно занимает около 5-7 минут), победитель забирает все.
Перед началом турнира призовой фонд определяется случайным образом — от х2 до х10000 бай-ина.
Например: если играть на лимите $1, максимальный призовой фонд составит $10000

Очень важно интуитивно понимать стадию пуш фолд и тренить ее не поддаваясь эмоциям.
Посмотрим через неделю как пойдет, обязательно выложу скрин со статами.

Цель: с $18 накатать банкролл до $100 и перейти на лимит $1 по времени не загадываю +- 1 месяц.

Жалко, что времени катастрофически мало сейчас на игру.
А еще зеленый мерзкий банк не дал пополнить банкролл со своих карт, блокирует платежи. Красный хороший банк вполне дал.

Катал под отличный плейлист:

Ранее Ctrl + ↓