Публикация в Nextcloud
avatar
81 минут читать

Настройка сервера сигнализации (High-performance backend) для Nextcloud Talk

Настройка сервера сигнализации (High-performance backend) для Nextcloud Talk

Как правило для небольшой организации вы можете просто использовать сервер TURN для совершения вызовов, и этого будет достаточно. Однако для крупных компаний с большим количеством пользователей рекомендуется настроить отдельный сервер сигнализации, чтобы снизить нагрузку на пользователей Nextcloud. В этой статье я приведу полный процесс настройки сервера сигнализации (High-performance backend) для вашего Nextсloud портала.

Что вам понадобится:

  • Виртуальный сервер начиная с 4GB RAM и 2 ядер CPU
  • Чистая Ubuntu 22.04 LTS с публичным IP
  • Домен или поддомен подключенный к нашему публичному IP
  • Знание базовых команд в Linux

Для наглядности я буду использовать поддомен talk.hackerspace.ru в качестве примера домена в этой статье.

Итак, давайте начнем..

1. Подготовка системы

Если вы еще не обновили свою систему, сделайте это с помощью комманды:

apt update && apt upgrade

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

У нас должны быть включены следующие порты:

  • 22 (ваш SSH порт)
  • 80 (TCP)
  • 443 (TCP)
  • 3478 (UDP и TCP)

Порт 3478 зависит от ваших потребностей. Если вы собираетесь использовать этот сервер также в качестве сервера TURN, откройте его; в противном случае вы можете не открывать данный порт.

После выполнения действий описанных выше, установите следующие пакеты:

apt install make protobuf-compiler git python3 docker.io zip unzip

2. Установка последней версии Go

Сервер сигнализации не будет компилироваться с Go, предоставляемый в Ubuntu по умолчанию. Для этого нам понадобится как минимум версия v1.20 или выше. Прочитайте данную статью, чтобы загрузить и настроить пакет Go v1.20.

3. Настройка NATS сервера

Сервер NATS используется для распространения сообщений между различными экземплярами. Они предоставляют решение в Docker, которое мы будем использовать здесь.

docker pull nats:latest

Запускаем его в фоновом режиме.

docker run -d --name nats-server -p 4222:4222 -ti nats:latest

Вы можете проверить статус контейра с помощью команды docker ps. Порт, который нам понадобится позже при настройке, - 4222.

4. Установка Janus (WebRTC)

Janus доступен в репозиториях Ubuntu, и мы установим его оттуда.

apt install janus

systemctl enable janus
systemctl status janus

Сначала нам нужно настроить несколько параметров в Janus. Вы можете создать случайный ключ из 16 символов самостоятельно или с помощью OpenSSL.

openssl rand -hex 8

Отредактируйте этот файл:

nano /etc/janus/janus.jcfg

Найдите full_trickle в разделе nat, который должен быть примерно в строке 274.

full_trickle = true
turn_rest_api_key = <key_created_above>

Измените интерфейс на lo в /etc/janus/janus.transport.http.jcfg. А также, в /etc/janus/janus.transport.websockets.jcfg, обновите ws_interface на ‘lo‘.

После изменений перезапустите Janus.

systemctl restart janus

5. Установка coTURN

apt install coturn
systemctl enable coturn

cp /etc/turnserver.conf /etc/turnserver.conf_BAK

Создайте случайный ключ:

openssl rand -hex 16

Отредактируйте файл /etc/turnserver.conf и добавьте в него следующие строки (удалите все остальное)

listening-port=3478
fingerprint
use-auth-secret
static-auth-secret=<key_created_above>
realm=talk.hackerspace.ru
total-quota=100
bps-capacity=0
stale-nonce
no-multicast-peers

Сохраните и перезапустите coTURN.

systemctl restart coturn

6. Загрузка и компиляция сервера сигнализации

Теперь мы загрузим и подготовим сервер сигнализации. Хотя вы можете загрузить последнюю сборку из основной ветки, используя git clone, но я не рекомендую делать это по соображениям стабильности. Вместо этого мы загрузим самую последнюю стабильную версию, которая на момент написания этой статьи была 1.2.2.

cd /opt
wget https://github.com/strukturag/nextcloud-spreed-signaling/archive/refs/tags/v1.2.2.zip

unzip v1.2.2.zip
rm v1.2.2.zip

После загрузки и распаковки, создадим двоичный файл для сигнального сервера.

cd nextcloud-spreed-signaling-1.2.2
make build

Если все пройдет хорошо, вы найдете двоичный файл в каталоге bin. Давайте скопируем его в /usr/bin.

cp bin/signaling /usr/bin/

Также скопируем файл server.conf.in в папку /etc/signaling как server.conf.

mkdir /etc/signaling

cp server.conf.in /etc/signaling/server.conf

7. Подготовка сервера сигнализации

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

groupadd --system signaling

useradd --system \
    --gid signaling \
    --shell /usr/sbin/nologin \
    --comment "Standalone signaling server for Nextcloud Talk." \
    signaling

После этого измените разрешения server.conf.

chmod 600 /etc/signaling/server.conf

chown signaling:signaling /etc/signaling/server.conf

Чтобы запустить сервер сигнализации в качестве демона, скопируйте системный файл signaling.service, в каталог systemd.

cp /opt/nextcloud-spreed-signaling-1.2.2/dist/init/systemd/signaling.service /etc/systemd/system/signaling.service

Далее мы отредактируем его и добавим следующую строку после строки описания.

nano /etc/systemd/system/signaling.service
After=janus.service

Теперь вы можете перезагрузить демон systemd.

systemctl daemon-reload

8. Настройка сервера сигнализации

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

На этом этапе нам понадобятся четыре случайных ключа.

Hash ключ:

openssl rand -hex 16

Block ключ:

openssl rand -hex 16

Internal secret (используется для внешних клиентов, таких как сервер записи):

openssl rand -hex 16

Nextcloud облачный секретный ключ:

openssl rand -hex 16

Запишите ключи из приведенных выше шагов 4 и 5.

nano /etc/signaling/server.conf

Сделайте следующее в этом файле:

  1. Раскомментируйте там, где это необходимо
  2. Измените строки, где это необходимо, например, ключи и т.д.
  3. Вы можете оставить nats, janus и turn URL сервера как есть
  4. Дважды проверьте все перед сохранением

Примечание: Я добавил номера строк перед ними, чтобы вы могли легко их найти.

[http]
listen = 127.0.0.1:8080 (line 4)

[sessions] 
hashkey = <hashkey_created_above> (line 40)
blockkey = <blockkey_created_above> (line 45)

[clients]
internalsecret = <clientkey_created_above> (line 50)

[backend]
backends = backend-1 (line 67)

[backend-1] (line 109)
url = https://your.nextcloud.domain (line 111)
secret = <nextcloud_secret_key_created_above>  (line 116)

[nats] 
url = nats://localhost:4222 (line 144)

[mcu] 
type = janus (line 149)
url = ws://127.0.0.1:8188 (line 154)

[turn] 
apikey = <turn_rest_api_key_set_in_janus_step_4_above> (line 209)
secret = <turnserver_secret_created_in_turnserver.conf_as_static-auth-secret_step_5_above>  (line 209)
servers = turn:127.0.0.1:3478?transport=udp,turn:127.0.0.1:3478?transport=tcp (line 209)

Сохраните файл конфигурации и приступайте к запуску сервера сигнализации.

systemctl enable signaling
systemctl start signaling

Проверьте его статус:

systemctl status signaling

Ваш результат будет аналогичен приведенному ниже.

● signaling.service - Nextcloud Talk signaling server
     Loaded: loaded (/etc/systemd/system/signaling.service; enabled; vendor preset: enabled)
     Active: active (running) since Fri 2024-01-05 18:46:59 UTC; 13s ago
   Main PID: 669700 (signaling)
      Tasks: 6 (limit: 2237)
     Memory: 3.1M
        CPU: 98ms
     CGroup: /system.slice/signaling.service
             └─669700 /usr/bin/signaling --config /etc/signaling/server.conf

Jan 05 18:47:00 vps2617142 signaling[669700]: mcu_janus.go:316: Created Janus session 3896517509338209
Jan 05 18:47:00 vps2617142 signaling[669700]: mcu_janus.go:323: Created Janus handle 8168179460168699
Jan 05 18:47:00 vps2617142 signaling[669700]: main.go:263: Using janus MCU
Jan 05 18:47:00 vps2617142 signaling[669700]: hub.go:387: Using a timeout of 10s for MCU requests
Jan 05 18:47:00 vps2617142 signaling[669700]: backend_server.go:98: Using configured TURN API key
Jan 05 18:47:00 vps2617142 signaling[669700]: backend_server.go:99: Using configured shared TURN secret
Jan 05 18:47:00 vps2617142 signaling[669700]: backend_server.go:101: Adding "turn:127.0.0.1:3478?transport=udp" as TURN serv>
Jan 05 18:47:00 vps2617142 signaling[669700]: backend_server.go:101: Adding "turn:127.0.0.1:3478?transport=tcp" as TURN serv>
Jan 05 18:47:00 vps2617142 signaling[669700]: backend_server.go:114: No IPs configured for the stats endpoint, only allowing>
Jan 05 18:47:00 vps2617142 signaling[669700]: main.go:339: Listening on 127.0.0.1:8080

9. Прокси-сервер

Ваш выбор интерфейса или прокси зависит от удобства использования. Я буду использовать Apache. Вы можете использовать другие прокси здесь.

apt install apache2

a2enmod ssl rewrite headers proxy proxy_http deflate cache proxy_wstunnel http2 proxy_fcgi env expires

systemctl restart apache2
systemctl enable apache2

rm /var/www/html/index.html

Мы приступим к созданию файла виртуального хоста.

cd /etc/apache2/sites-available/

nano signaling.conf

Добавьте к нему следующее:

<VirtualHost *:80>
	ServerName talk.hackerspace.ru

	DocumentRoot /var/www/html

	<Directory "/var/www/html">
		AllowOverride All
		Options -Indexes +FollowSymLinks
	</Directory>

	ErrorLog /var/log/apache2/signaling_error.log
</VirtualHost>

Включите эту конфигурацию и перезапустите Apache.

a2dissite 000-default.conf
a2ensite signaling.conf

apachectl -t
systemctl restart apache2

10. SSL

Если у вас есть собственные сертификаты, вы можете использовать их в файле конфигурации ниже (шаг 11). Но для всех остальных мы установим Certbot, чтобы получить бесплатный SSL-сертификат от Let's Encrypt.

apt install certbot

Получите бесплатный сертификат и запишите их пути.

certbot certonly --webroot -w /var/www/html -d talk.hackerspace.ru

Чтобы автоматически обновлять сертификат, вы можете настроить задание в cron.

crontab -e

Добавьте в него следующее.

30 04 * * * certbot renew

11. Обновление виртуального хоста

Теперь мы можем добавить поддержку SSL нашего виртуального хоста:

<VirtualHost *:443>
	ServerName talk.hackerspace.ru

	SSLProtocol all -SSLv2 -SSLv3
	SSLCipherSuite ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA:ECDHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA256:DHE-RSA-AES256-SHA:ECDHE-ECDSA-DES-CBC3-SHA:ECDHE-RSA-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:DES-CBC3-SHA:!DSS
	SSLHonorCipherOrder on
	SSLCompression off

	ErrorLog /var/log/apache2/signaling_error.log

	SSLEngine on
	SSLCertificateKeyFile /etc/letsencrypt/live/talk.myncserver.com/privkey.pem
	SSLCertificateFile /etc/letsencrypt/live/talk.myncserver.com/fullchain.pem

	ProxyPass "/standalone-signaling/"  "ws://127.0.0.1:8080/"

    RewriteEngine On
    RewriteRule ^/standalone-signaling/spreed/$ - [L]
    RewriteRule ^/standalone-signaling/api/(.*) http://127.0.0.1:8080/api/$1 [L,P]
</VirtualHost>

Сохраните его и перезапустите Apache.

apachectl -t
systemctl restart apache2

12. Тестирование и добавление в Nextcloud

После того, как все настроено, вы можете попробовать протестировать сервер сигнализации.

curl -i https://talk.hackerspace.ru/standalone-signaling/api/v1/welcome

Выходные данные будут выглядеть так, как показано ниже;

HTTP/2 200 
content-type: application/json; charset=utf-8
server: nextcloud-spreed-signaling/unknown
x-spreed-signaling-features: audio-video-permissions, dialout, hello-v2, incall-all, mcu, simulcast, switchto, transient-data, update-sdp, welcome
date: Mon, 08 Jan 2024 16:48:17 GMT
content-length: 61

{"nextcloud-spreed-signaling":"Welcome","version":"unknown"}

Теперь перейдите на страницу настроек администрирования Nextcloud, нажмите “Конференции”, перейдите к разделу "Высокопроизводительный механизм обработки вызовов", а затем нажмите кнопку "Добавить новый высокопроизводительный сервер обработки вызовов".

Введите следующий URL-адрес в поле URL-адрес и введите свой Nextcloud облачный секретный ключ, созданный выше. Так же вы можете установить флажок Проверить SSL-сертификат.

URL = https://talk.hackerspace.ru/standalone-signaling/

Вот и все — счастливого звонка! 📞

13. Отладка

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

tail -f /var/log/syslog

tail -f /var/log/janus.log

tail -f /var/log/apache2/signaling_error.log

docker logs --since=1h <container_name_or_id>

Примечание: Журналы Janus по умолчанию отключены; вы можете включить их в /etc/janus/janus.jcfg, указав путь, как показано выше.

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

avatar
Стасон barabooz
1 месяц назад

Добрый день. Настроил по инструкции, спасибо. Но мой nextcloud пишет ошибку версии "Ошибка: Запущенная версия: unknown; Сервер необходимо обновить для совместимости с этой версией Talk". Подскажите, пожалуйста, как мне обновить?
Nextcloud Hub 9 (30.0.1), Talk 20.0.1

avatar
Стасон barabooz
1 месяц назад

Прошу прощения, обновил. Все работает. Спасибо. хотелось бы еще сервер записи поднять.

avatar
X3PPY
8 месяцев назад

Настроил эту штуку, все галочки в NC зеленые, но все равно все работает через 1 место. Сильно нагружается компьютер, не приходят уведомления, тормозит видео и отстает от голоса. На практике Talk вообще можно использовать как ВКС для группы людей?...

avatar
Печеницын Петр Автор
8 месяцев назад

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

avatar
X3PPY
8 месяцев назад

Она стоит на отдельном сервере без nat. Но улучшение связи не заметил :( спасибо за статью!

avatar
Печеницын Петр Автор
8 месяцев назад

Сколько человек запускали ?
Хочу тесты провести

avatar
X3PPY
8 месяцев назад

4 человека + 2 из них же с мобильных устройств, итого 6 в конференции

avatar
Печеницын Петр Автор
8 месяцев назад

Понял спасибо! Сделаю тесты

avatar
X3PPY
8 месяцев назад

Хочу дополнить свой комментарий. На самом деле штука работает :) просто у меня ноутбук со встроенной видеокартой и нагружался во время любого звонка на 100% (частично помогает отключение аппаратного ускорения в браузере). Провели конференцию на 27 одновременных участника. Около 8-10 с видеопотоком. В целом все работает, со звуком проблем нет. Но качество видео Talk автоматически снижает и это печально. На сигнальном сервере у меня еще установлен сервер записи видео. Качество видео не то чтобы радует (но я еще не пробовал настроить максимальную ширину канала). Кроме того, увеличение производительности получил за счет улучшения CPU на этом сервере (сейчас 8 по 5.1 ггц в турбо бусте). Во время записи этой конференции загрузка CPU 40-100%

avatar
Печеницын Петр Автор
8 месяцев назад

О спасибо за комментарий. На процессор да идет основная нагрузка. Если будут новые данные по оптимизации напишите пожалуйста. Я хочу попробовать запустить тесты на бюджетном железе типа HUANANZHI https://ozon.ru/t/YKl2bqo с двумя процами Xeon e5 2690 v4
И посмотреть производительность

avatar
Хакерспейс
9 месяцев назад

Echo "Hello Word";