diff --git a/post/vstanovlennia-ta-bazove-nalashtuvannia-irc-baunsera-soju.md b/post/vstanovlennia-ta-bazove-nalashtuvannia-irc-baunsera-soju.md new file mode 100644 index 0000000..d62e0f7 --- /dev/null +++ b/post/vstanovlennia-ta-bazove-nalashtuvannia-irc-baunsera-soju.md @@ -0,0 +1,238 @@ +# Встановлення та базове налаштування IRC-баунсера soju в Linux + +> Почав писати цей гайд з наміром запустити soju через проксі I2P, але з цим виникли труднощі. Публікую те, що вже занотував. Якщо вам потрібне рішення, що працюватиме через проксі HTTP/SOCKS - дивіться інструкцію [Встановлення та налаштування IRC-баунсера ZNC в Linux ](https://devzone.org.ua/post/vstanovlennia-ta-nalashtuvannia-irc-baunsera-znc-v-linux) у зв'язці з proxychains. + +[soju](https://soju.im) - це відносно сучасний баунсер [IRC](https://uk.wikipedia.org/wiki/IRC), написаний мовою [Go](https://uk.wikipedia.org/wiki/Go_(мова_програмування)). + +* баунсер (англ. *bouncer*) - це спеціальний проксі-сервер, що працює 24/7 і надає спільний обліковий запис клієнтським програмам; використовуються для читання історії дописів під час відсутності, адже перший в історії протокол чатів IRC - не передбачає зберігання статусів (окрім *away*) та історії. + +## Сервер + +У прикладах нижче, використовуються умовні адреси: + +* `a.a.a.a` - хост клієнта IRC +* `b.b.b.b` - хост сервера soju +* `usoju` - користувач баунсера soju (не плутати з акаунтом linux) +* `xxxxx` - пароль до `usoju` + +### Системні залежності + +Перш як продовжити, переконайтесь, що у вас встановлено останню версію Go (див. [Встановлення останньої версії Go в Debian](https://devzone.org.ua/post/vstanovlennia-ostannyoyi-versiyi-go-v-debian)). Додатково, може знадобитися пакунок scdoc: + +``` bash +sudo apt install scdoc +``` + +### Збірка з вихідного коду + +``` bash +git clone https://codeberg.org/emersion/soju.git +cd soju +make +sudo make install +``` + +### Ініціалізація + +Сервер soju буде пускатись від окремого користувача: + +``` bash +useradd -m soju +``` + +Логінимось і продовжуємо наступні кроки вже від нього: + +``` bash +su soju +``` + +Створюємо окремий конфіг в домашній теці: + +``` bash +cp /etc/soju/config /home/soju/config +``` + +``` /home/soju/config +# шлях до бази користувача unix (створюється автоматично при першому запуску) +# стандартно `db sqlite3 /var/lib/soju/main.db` +db sqlite3 /home/soju/soju.db + +# схема `irc+insecure` та порт 6667 - використовується конфігурація без SSL/TLS +# вона є відносно безпечною для підключення до баунсера в локальній мережі +listen irc+insecure://b.b.b.b:6667 + +# умовна або реальна назва хосту, інакше буде використовуватись системний +hostname soju +``` + +Тепер, потрібно ініціалізувати базу і створити в ній обліковий запис для віддаленого керування: + +``` bash +sojudb create-user usoju -admin +``` +* `usoju` - це юзернейм облікового запису адміністратора баунсер-серверу soju; на відміну від ZNC, він також буде використовуватись у якості нікнейму IRC (якщо в таблицях `User` та `Network`, засобами командного рядка, не вказано `nick`) +* команду `sojudb` потрібно виконувати від того системного користувача, від якого пускатиметься баунсер soju, та з тієї теки, де очікується розташування файлу `soju.db` (у нашому випадку - домашня тека користувача) + +Якщо потрібно змінити пароль, переходимо у теку з `soju.db` та виконуємо: + +``` bash +sojudb change-password usoju +``` + +Особисто я додатково корегую права: + +``` bash +chown soju:soju /home/soju/soju.db && chmod 0600 /home/soju/soju.db +chown soju:soju /home/soju/config && chmod 0600 /home/soju/config +``` + +### Фаєрвол + +Оскільки звичайно баунсери пускаються віддалено, потрібно відкрити порт для дозволених хостів: + +``` bash +sudo ufw allow from a.a.a.a to b.b.b.b port 6667 proto tcp +``` + +Або для всього і всіх: + +``` bash +ufw allow 6667/tcp +``` + +### Запуск + +З командного рядка, сервер запускається наступним чином: + +``` bash +soju -debug -config /home/soju/config +``` +* при першому запуску вказую аргумент `-debug` - його можна прибрати згодом + +Для systemd, є готовий [приклад](https://codeberg.org/emersion/soju/src/branch/master/contrib/soju.service). Утім, для конфігурації на базі Debian і поточних налаштувань системного профілю, він в мене відрізняється: + +``` /etc/systemd/system/soju.service +[Unit] +Description=soju IRC bouncer service +Documentation=https://soju.im/ +Documentation=man:soju(1) man:sojuctl(1) + +Wants=network-online.target +After=network-online.target + +[Service] +Type=simple + +User=soju +Group=soju + +RuntimeDirectory=/home/soju +AmbientCapabilities=CAP_NET_BIND_SERVICE + +ExecStart=/usr/local/bin/soju -config /home/soju/config +ExecReload=/bin/kill -HUP $MAINPID + +Restart=on-failure + +# soju не розділяє журнали відлагодження від журналу помилок +StandardOutput=file:///home/soju/debug.log +StandardError=file:///home/soju/error.log + +[Install] +WantedBy=multi-user.target +``` + +## Клієнт + +Оскільки в soju немає Веб-адмінки, керування відбувається через командний рядок клієнта IRC. + +Усі налаштування під час взаємодії з баунсером через командний рядок - будуть збережені до бази даних (`soju.db`) і відновлені після наступного підключення клієнтом IRC до soju, для вказаного в його конфігурації обліковому записі. + +### Halloy + +Пам'ятка з налаштування IRC клієнта [Halloy](https://halloy.chat), яким наразі користуюсь. Актуалізований гайд можна знайти на [офіційній сторінці](https://halloy.chat/guides/connect-with-soju.html#connect-with-soju). Моя конфігурація виглядає приблизно так: + +``` ~/.config/halloy/config.toml +[servers.soju] +nickname = "soju" +server = "b.b.b.b" +port = 6667 +use_tls = false +[servers.soju.sasl.plain] +username = "usoju" +password = "xxxxx" +``` + +* порада: якщо пускаєте Halloy в анонімному режимі, додатково зверніть увагу на опцію: + +``` ~/.config/halloy/config.toml +[preview] +enabled = false +``` + +При додаванні мереж нижче, я перезапускаю клієнт, інакше вони не з'являються в списку. Можливо, це баг поточної версії Halloy. + +### Керування мережами + +Підключившись, можна побачити вітання сервера soju відповідно до наших налаштувань: + +> SASL authentication successful +> Welcome to soju, usoju +> Your host is soju + +Для отримання повного списку доступних команд, пишемо в чат до `BouncerServ`: + +``` irc +/msg BouncerServ help +``` + +Таким чином, можна взаємодіяти з сервером через створений раніше обліковий запис адміна (`usoju`) - наприклад, додати нову мережу: + +``` irc +/msg BouncerServ network create -name some_name -addr ircs://irc.host.org +``` +* аргумент `-name` - опціональний, але варто його вказати, щоб зручно керувати мережею за цим ідентифікатором (інакше замість імені доведеться вказувати адресу) +* саме цей сервер використовує сертифікат TLS і стандартний порт 6697, тому вказується схема `ircs://` + +Особисто я використовую soju для серверів IRC в IPv6 мережі [Yggdrasil](https://devzone.org.ua/post/yggdrasil-mereza-z-detsentralizovanym-routynhom), де TLS не використовується (оскільки трафік вже захищений) тому для прикладу, команда підключення до локального сервера *Bonobonet* виглядатиме так: + +``` irc +/msg BouncerServ network create -name bonobonet -addr irc+insecure://[200:6f99:2afe:41fd:fc3b:b1f7:af9d:f3a0]:6667 +``` +* тут я ще вказую свій нік аргументом `-nick ` інакше буде глобальний (з таблиці `User`) + +Відповідь soju буде такою: + +> BouncerServ created network "bonobonet" + +Актуальну довідку з додавання нових мереж, можна отримати командою: + +``` irc +/msg BouncerServ help network create +``` + +### Підключення до кімнат окремої мережі + +Додавши мережу, в залежності від клієнта, обираємо потрібну зі списку (в GUI клієнтах - клікаємо на неї мишею) та пишемо в чат команду отримання кімнат: + +``` irc +/list +``` +* список кімнат залежатиме від конкретного сервера IRC + +Обираємо потрібну з відповіді сервера і переходимо до спілкування! + +### Отримання інформації про поточний профіль підключення + +Перевірити інформацію з підключення до конкретної мережі можна командою: + +``` irc +/whois +``` + +## Посилання + +* [General Commands Manual](https://soju.im/doc/soju.1.html) +* [Getting started](https://codeberg.org/emersion/soju/src/branch/master/doc/getting-started.md) +* [User-contributed resources](https://codeberg.org/emersion/soju/src/branch/master/contrib/README.md) +* [Problems connecting over tor (feature request?: support SOCKS5)](https://todo.sr.ht/~emersion/soju/230) \ No newline at end of file