Как правило для небольшой организации вы можете просто использовать сервер 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
Сделайте следующее в этом файле:
- Раскомментируйте там, где это необходимо
- Измените строки, где это необходимо, например, ключи и т.д.
- Вы можете оставить nats, janus и turn URL сервера как есть
- Дважды проверьте все перед сохранением
Примечание: Я добавил номера строк перед ними, чтобы вы могли легко их найти.
[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
, указав путь, как показано выше.
Добрый день. Настроил по инструкции, спасибо. Но мой nextcloud пишет ошибку версии "Ошибка: Запущенная версия: unknown; Сервер необходимо обновить для совместимости с этой версией Talk". Подскажите, пожалуйста, как мне обновить?
Nextcloud Hub 9 (30.0.1), Talk 20.0.1
Прошу прощения, обновил. Все работает. Спасибо. хотелось бы еще сервер записи поднять.
Настроил эту штуку, все галочки в NC зеленые, но все равно все работает через 1 место. Сильно нагружается компьютер, не приходят уведомления, тормозит видео и отстает от голоса. На практике Talk вообще можно использовать как ВКС для группы людей?...
Смысл этой штуки чтобы она стояла на отдельном сервере и распределяла нагрузку, если использовать на том же сервере что и NC думаю не будет эффекта.
Ну и минимальные системные требования надо учитывать.
Она стоит на отдельном сервере без nat. Но улучшение связи не заметил :( спасибо за статью!
Сколько человек запускали ?
Хочу тесты провести
4 человека + 2 из них же с мобильных устройств, итого 6 в конференции
Понял спасибо! Сделаю тесты
Хочу дополнить свой комментарий. На самом деле штука работает :) просто у меня ноутбук со встроенной видеокартой и нагружался во время любого звонка на 100% (частично помогает отключение аппаратного ускорения в браузере). Провели конференцию на 27 одновременных участника. Около 8-10 с видеопотоком. В целом все работает, со звуком проблем нет. Но качество видео Talk автоматически снижает и это печально. На сигнальном сервере у меня еще установлен сервер записи видео. Качество видео не то чтобы радует (но я еще не пробовал настроить максимальную ширину канала). Кроме того, увеличение производительности получил за счет улучшения CPU на этом сервере (сейчас 8 по 5.1 ггц в турбо бусте). Во время записи этой конференции загрузка CPU 40-100%
О спасибо за комментарий. На процессор да идет основная нагрузка. Если будут новые данные по оптимизации напишите пожалуйста. Я хочу попробовать запустить тесты на бюджетном железе типа HUANANZHI https://ozon.ru/t/YKl2bqo с двумя процами Xeon e5 2690 v4
И посмотреть производительность
Echo "Hello Word";