Как создавался новогодний Хабрачат в этом году

  • Tutorial

Здравствуйте, коллеги!

Новый год подкрадывается всё ближе, а это значит, что нам снова пора собраться вместе для того чтобы хорошо провести время!

Для тех кто еще не знаком с новогодним хабрачатом, расскажу немного про него. Это несколько чатов на разных платформах, объединенных мостом. Боты в каждой из платформ пересылают сообщения из остальных и получается, что все как-бы находятся в одном чате, при этом не покидая любимой платформы. В этом чате мы традиционно встречаем Новый год уже четвертый раз (в прошлом году только в одном SSH-чате было больше сотни человек).

В центре внимания, конечно, SSH-чат, который работает только несколько дней до нового года и несколько после. В этом году разные люди также подняли чаты в XMPP (Jabber), Телеграме и IRC. Также традиционно есть чат-бот tars, который может вывести ёлку и поздравить с новым годом. В прошлые года таких ботов делали несколько человек (кто-то даже на баше).

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

Настраиваем SSH-чат

SSH-чат обычно открывает @podivilov, для этого используется кастомный SSH сервер, написанный на go. Устанавливается и настраивается он довольно просто. Для начала можно освободить стандартный порт SSH, чтобы при заходе в наш чат не вводить порт. В ubuntu server, например, это делается так. В файле /etc/ssh/sshd_config находим строку Port 22 и меняем число на нужный порт. После этого перезапускаем ssh демон sudo systemctl restart sshd и стандартный порт свободен (убедитесь, что фаерфол пропустит вас по новому порту).

Скачивается бинарник под нужную платформу из релизов на github. Можно положить его, например, в /usr/bin. Далее пишем простой скрипт, который будет перезапускать сервер, в случае падения. (Этот вариант не очень хорош, советую делать так, как в этой статье)

Скрипт для запуска сервера start.sh
#!/bin/bash

while :
do

/usr/bin/ssh-chat --admin=/root/.config/ssh-chat/admins --bind=0.0.0.0:22 --log /root/ssh-chat.log --motd=/root/.config/ssh-chat/motd

sleep 1

done

Давайте разберем параметры запуска

  • admin путь до файла со списком публичных ключей администраторов (у них стандартный набор возможностей: кик, бан и прочее)

  • bind айпи и порт, на котором сервер будет транслировать

  • log путь до файла с логами чата

  • motd путь до файла с сообщением дня (message of the day), которое будет показываться при каждом заходе в чат

Теперь мы можем запустить этот скрипт любым удобным способом (в сессии tmux/screen, через systemctl и т.д.) и чат готов. Вводим ssh nickname@habr2021.podivilov.ru и попадаем в наш чат. Для списка комманд нужно ввести /help, а для выхода /exit или Ctrl+D.

Настраиваем мост между чатами

Мост уже который год хостит @mrDoctorWho, для этого используется matterbridge, который кстати тоже написан на go. Его установка и настройка, как ни странно происходит точно так же. Скачиваем бинарник из релизов на github и кладем его, куда нам надо. Далее пишем конфигурационный файл и скрипт старта. Как-то так выглядит конфиг от @mrDoctorWho:

Файл конфигурации matterbridge.toml
[xmpp.myxmpp]
Server="helldev.net:5222"
#Jid your userid
Jid=""
Password=""
Muc="conference.helldev.net"
Nick="bridge"
RemoteNickFormat="[{PROTOCOL}] <{NICK}> "


[sshchat.mychat]
Server="habr2021.podivilov.ru:22"
RemoteNickFormat="[{PROTOCOL}] <{NICK}> "

[telegram.mytelegram]
Token=""
RemoteNickFormat="[{PROTOCOL}] `<{NICK}>` "
MessageFormat="Markdown"

[general]
MediaDownloadPath="/var/www/"
MediaServerDownload="https://helldev.net/"


[[gateway]]
name="gateway1"
enable=true


[[gateway.inout]]
account="telegram.mytelegram"
channel="-1001200239638"

[[gateway.inout]]
account="sshchat.mychat"
channel="sshchat"

[[gateway.inout]]
account="xmpp.myxmpp"
channel="ny"

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

А вот скрипт запуска, который почти ничем не отличается от скрипта для SSH-чата:

Скипт для запуска моста start.sh
#!/bin/bash

while :
do

/usr/bin/matterbridge -conf /root/.config/matterbridge/matterbridge.toml

sleep 1

done

После старта этого скрипта мы имеем полностью работающий мост между всеми нашими чатами.

Создание чат бота

Чат-бот, который гуляет по чатам уже который год подряд, называется tars. Бот поздравляет с Новым годом, выводит новогоднюю ёлку ASCII-артом и имеет несколько других команд, в зависимости от того, кто его делал. Первая версия была запущена три года назад, к сожалению не помню кем. Бот был написан на bash-скрипте с использованием screen.

Свою версию я писал на JavaScript с использованием только стандартных библиотек. С его исходным кодом можно ознакомиться здесь. Если вкратце, он вызвает процесс командной строки с помощью модуля child_process (в зависимости от операционной системы, используются либо bash.exe, либо bash). Далее он открывает ssh сессию может писать либо читать прямо из нее. Кроме этого, код довольно заурядный, с его последней версией вы можете ознакомиться на гитхабе.

Как попасть в чаты

Выбирайте любой понравившийся и присоединяйтесь. С наступающим Новым Годом!

Комментарии 9

    +9
    Скачивается бинарник под нужную платформу из релизов на github. Можно положить его, например, в /usr/bin

    Не надо так. Если нет желания или возможности пакетировать бинарник, то положить его надо в /usr/local/bin. Именно для таких случаев и предназначен данный каталог. Иначе получается бардак, боль, увеличение энтропии вселенной, война и немцы. ;-)
    Далее пишем простой скрипт, который будет перезапускать сервер, в случае падения.

    И так не надо, если это конечно не какая-нибудь фря и прочие *BSD или маргинальные дистрибутивы Linux.
    Создать /etc/systemd/system/ssh-chat.service:

    [Unit]
    Description=SSH Chat Service
    After=network.target network-online.target

    [Service]
    # User=ssh-chat
    # Group=ssh-chat
    Type=Simple
    ExecStart=/usr/local/bin/ssh-chat --admin=/root/.config/ssh-chat/admins --bind=0.0.0.0:22 --log /root/ssh-chat.log --motd=/root/.config/ssh-chat/motd
    Restart=on-failure
    RestartSec=1
    AmbientCapablities=CAP_NET_BIND_SERVICE

    [Install]
    WantedBy=multiuser.target


    Если не лень, то создать соответствующего пользователя, с одноимённой группой и раскомментировать строчки, с группой и юзером, в юните. Ну и конфиг положить куда-нить в /etc/*, не забыв поменять параметры запуска. Так будет безопаснее.
    Далее всё просто, перекидываем порт у штатного sshd и ставим сервис в автостарт с одновременным запуском:

    sudo systemctl enable --now ssh-chat


    Аналогично поступаем со вторым сервисом. Юнит будет отличаться только строками ExecStart=; User=; Group= и Description=
    Если мост будет хоститься на том-же хосте что и SSH чат, то есть смысл изменить строчку After=, добавив зависимость:

    After=network.target network-online.target ssh-chat.service
      +6

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

        +1
        Спасибо. так получилось, что это не единичный случай, поэтому запилил краткий тутор.
          0

          Я бы ещё добавил туда небольшой ликбез почему стоит соблюдать fshs

            0
            Ну туда врядли, а вот краткий гайд по FSHS не помешал-бы, да.
            +1
            спасибо, учту в будующем, добавил ссылку в статье
              0
              Спасибо! Как говорится, «Нужно делать так как нужно. А как ненужно, делать ненужно» © ;-)
          0
          Обижаете!
          image

        Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

        Самое читаемое