devzone.org.ua/post/vstanovlennia-ta-bazove-nalashtuvannia-irc-baunsera-soju.md
2025-11-29 08:53:08 +02:00

244 lines
No EOL
12 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Встановлення та базове налаштування 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
Для отримання повного списку доступних команд, пишемо в чат до `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](http://[203:75b7:45af:ecca:d641:cd42:38dc:4788]/projects/bonobonet/) виглядатиме так:
``` irc
/msg BouncerServ network create -name bonobonet -addr irc+insecure://[200:6f99:2afe:41fd:fc3b:b1f7:af9d:f3a0]:6667
```
* тут я ще вказую свій нік аргументом `-nick <nick>` інакше буде глобальний (з таблиці `User`)
Відповідь soju буде такою:
> BouncerServ created network "bonobonet"
Щоб змінити нік для певної мережі після її додавання:
``` irc
/msg BouncerServ network update bonobonet -nick mynick
```
Актуальну довідку з додавання нових мереж, можна отримати командою:
``` irc
/msg BouncerServ help network create
```
* або прибираємо `create` і виводимо довідку по всім командам `network`
### Підключення до кімнат окремої мережі
Додавши мережу, в залежності від клієнта, обираємо потрібну зі списку (в GUI клієнтах - клікаємо на неї мишею) та пишемо в чат команду отримання кімнат:
``` irc
/list
```
* список кімнат залежатиме від конкретного сервера IRC
Обираємо потрібну з відповіді сервера і переходимо до спілкування!
### Отримання інформації про поточний профіль підключення
Перевірити інформацію щодо підключення до конкретної мережі можна стандартною для IRC командою:
``` irc
/whois <nick>
```
## Посилання
* [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)