Здравствуйте, коллеги!
Новый год подкрадывается всё ближе, а это значит, что нам снова пора собраться вместе для того чтобы хорошо провести время!
Для тех кто еще не знаком с новогодним хабрачатом, расскажу немного про него. Это несколько чатов на разных платформах, объединенных мостом. Боты в каждой из платформ пересылают сообщения из остальных и получается, что все как-бы находятся в одном чате, при этом не покидая любимой платформы. В этом чате мы традиционно встречаем Новый год уже четвертый раз (в прошлом году только в одном 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 сессию может писать либо читать прямо из нее. Кроме этого, код довольно заурядный, с его последней версией вы можете ознакомиться на гитхабе.
Как попасть в чаты
Выбирайте любой понравившийся и присоединяйтесь. С наступающим Новым Годом!
SSH чат: хост: habr2021.podivilov.ru, порт 22. Для подключения к SSH-чату можно использовать любой SSH-клиент. Например, OpenSSH.
XMPP чат: ny@conference.helldev.net. Список клиентов доступен здесь.
Telegram чат: @habrachat2021.
IRC чат: #habr2021 на FreeNode.
Oxyd
Не надо так. Если нет желания или возможности пакетировать бинарник, то положить его надо в /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 и ставим сервис в автостарт с одновременным запуском:
Аналогично поступаем со вторым сервисом. Юнит будет отличаться только строками ExecStart=; User=; Group= и Description=
Если мост будет хоститься на том-же хосте что и SSH чат, то есть смысл изменить строчку After=, добавив зависимость:
After=network.target network-online.target ssh-chat.service
13werwolf13
Самый правильный, нужный и адекватный коммент. спасибо тебе друг, рад что не все ещё на это забили
Oxyd
Спасибо. так получилось, что это не единичный случай, поэтому запилил краткий тутор.
13werwolf13
Я бы ещё добавил туда небольшой ликбез почему стоит соблюдать fshs
Oxyd
Ну туда врядли, а вот краткий гайд по FSHS не помешал-бы, да.
Rundik Автор
спасибо, учту в будующем, добавил ссылку в статье
Oxyd
Спасибо! Как говорится, «Нужно делать так как нужно. А как ненужно, делать ненужно» © ;-)