# Встановлення та базове налаштування IRC-баунсера soju в Linux

> Почав писати цей гайд з наміром запустити soju через проксі I2P, але з цим виникли труднощі. Публікую те, що вже занотував. Якщо вам потрібне рішення, що працюватиме через проксі HTTP/SOCKS - гортайте вниз до посилань: там є інструкція з налаштування альтернативного баунсера ZNC у зв'язці з proxychains.

soju - це відносно сучасний баунсер IRC, написаний мовою Go:

=> https://soju.im

* баунсер (англ. bouncer) - це спеціальний проксі-сервер, що працює 24/7 і надає спільний обліковий запис клієнтським програмам; використовуються для читання історії дописів під час відсутності, адже перший в історії протокол чатів IRC - не передбачає зберігання статусів (окрім away) та історії.

## Сервер

У прикладах нижче, використовуються умовні адреси:

* a.a.a.a - хост клієнта IRC
* b.b.b.b - хост сервера soju
* usoju - користувач баунсера soju (не плутати з акаунтом linux)
* xxxxx - пароль до usoju

### Системні залежності

Перш як продовжити, переконайтесь, що у вас встановлено останню версію Go:
=> install-latest-golang-version-on-debian-linux.gmi Встановлення останньої версії Go в 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/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, де TLS не використовується (оскільки трафік вже захищений) тому для прикладу, команда підключення до локального сервера 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>
```

## Посилання

=> https://soju.im/doc/soju.1.html General Commands Manual
=> https://codeberg.org/emersion/soju/src/branch/master/doc/getting-started.md Getting started
=> https://codeberg.org/emersion/soju/src/branch/master/contrib/README.md User-contributed resources
=> https://todo.sr.ht/~emersion/soju/230 Problems connecting over tor (feature request?: support SOCKS5)

### Дивіться також

=> znc-irc-bouncer-setup.gmi Встановлення та налаштування IRC-баунсера ZNC в Linux
=> enhancing-privacy-in-linux-apps.gmi Підвищення рівня приватності в застосунках Linux
=> yggdrasil-is-network-with-distributed-routing.gmi Yggdrasil - мережа з децентралізованою маршрутизацією