Установка и настройка High-performance backend для Nextcloud Talk на Ubuntu
Опубликовано:
Используемые термины: Nextcloud, Ubuntu.
Для реализации высокопроизводительного сервера под Nextcloud Talk будут установлены и настроены следующие компоненты:
- Signaling Server — ключевой компонент. Обрабатывает установление соединений между пользователями, координирует аудио- и видеопотоки.
- Janus — сервер WebRTC общего назначения, решающий проблему соединения большого числа пользователей. Предоставляет низкоуровневый API для управления медиа-потоками.
- Coturn — решает проблему NAT и фаерволов. Помогает устройствам узнать свои внешние IP-адреса. Когда нужно, получает трафик от одного пользователя и передает другому.
- NATS Server — обмен служебными сообщениями, координация между компонентами.
- Nginx — веб-сервер для обработки и проксирования https-запросов на Signaling Server.
Рассмотрим запуск этих компонентов по шагам.
Требования
Особое внимание стоит обратить на требования к High-performance backend:
- Внешний IP адрес.
- Зарегистрированное доменное имя. В нашем примере будет signaling.dmosk.ru.
- Отдельный сервер. Мы не можем установить Nextcloud и High-performance backend на одном сервере.
- Требования к оборудованию зависят от количества активных пользователей. Но начать стоит с конфигурации: CPU: 4 Cores / RAM: 8 GB / Disk: 32 GB.
Подготовка системы
Предварительно выполним настройки на сервере.
Пакеты
Обновим список пакетов в репозиториях:
apt update
На свежеустановленной системе также рекомендуется выполнить обновление пакетов:
apt upgrade
Установим следующие пакеты:
apt install make protobuf-compiler git python3 zip unzip curl
* где:
- make — система сборки проектов. Автоматизирует компиляцию и сборку программ из исходного кода, управляя зависимостями и этапами сборки.
- protobuf-compiler — компилятор Protocol Buffers (protobuf). Преобразует .proto файлы в код на различных языках программирования для сериализации структурированных данных.
- git — утилита для работы с системами контроля версий. Нужна для загрузки проектов, которые хранятся в GitHub.
- python3 — интерпретатор языка программирования Python. Используется для запуска Python-скриптов.
- zip — утилита для архивации файлов в формат ZIP.
- unzip — утилита для распаковки ZIP-архивов.
- curl — инструмент для передачи данных (в нашем случае, загрузки файлов) по сетевым протоколам.
Время
Задаем часовой пояс:
timedatectl set-timezone Europe/Moscow
* В данном примере мы задаем зону по московскому времени.
Список всех доступных зон можно посмотреть командой:
timedatectl list-timezones
Если мы увидим только одну зону UTC, скорее всего, у нас установлена минимальная версия Ubuntu. Для установки всех зон вводим:
apt install tzdata
Устанавливаем утилиту для синхронизации времени:
apt install chrony
Настройка брандмауэра
Если в нашей системе по умолчанию блокируются сетевые запросы с помощью фаервола, необходимо открыть следующие порты:
- 80, 443 / TCP — веб-запросы по http и https.
- 3478 / TCP, UDP — TURN + STUN.
В системах на базе Deb для настройки фаервола можно использовать утилиту iptables. Вводим команды:
iptables -I INPUT -p tcp --dport 80 -j ACCEPT
iptables -I INPUT -p tcp --dport 443 -j ACCEPT
iptables -I INPUT -p tcp --dport 3478 -j ACCEPT
iptables -I INPUT -p udp --dport 3478 -j ACCEPT
Для сохранения правил можно использовать утилиту iptables-persistent:
apt install iptables-persistent
netfilter-persistent save
Последовательности для ключей
Для безопасного взаимодействия компонентов используются секреты — пароли. Нам нужно 6 таких последовательностей символов.
Можно придумать их самостоятельно, или сгенерировать, например:
seq 6 | xargs -I {} openssl rand -hex 16
Команда выдаст 6 строк, каждая из которых состоит из 16 символов. Сразу скопируйте их и подпишите, например:
# Janus
c178fcea4d2c0e45194cccb245283cff
# Turn Server
c3f84de2fe59c8bc1db0c10d9cf02450
# Hash
07e164de3c2ff5656ef10f115b3d54e3
# Block
e4bef0271402c471ba45e3d97fb3c2ac
# Internal secret
5aa3203091196cfb909af062b2022aae
# Nextcloud secret
f9b088e2cc8e4e175092f8663da498d9
Данные последовательности мы будем использовать в ходе настройки компонентов.
Установка Golang
Для сборки signaling нам нужен Golang. Однако, его установка из репозитория считается ненадежной, так как таким методом может быть установлена низкая версия программного продукта. Рекомендуется ручная распаковка бинарного файла.
Переходим на официальный сайт Golang. Смотрим последнюю стабильную версию и создаем переменную:
GO_VER=1.25.0
* в моем случае последней версией была 1.25.0.
Скачиваем архив с бинарным файлом:
curl -sLO https://go.dev/dl/go${GO_VER}.linux-amd64.tar.gz
Удаляем старый бинарник (если он есть), распаковываем новый:
rm -rf /usr/local/go && tar -C /usr/local -xzf go${GO_VER}.linux-amd64.tar.gz
Указываем дополнительный путь для поиска исполняемых файлов и сохраняем его в общий конфигурационный файл профилей пользователей:
echo "export PATH=$PATH:/usr/local/go/bin" >> /etc/profile
Применяем настройки общего профиля, чтобы сразу наша среда знала, где искать бинарник для go:
source /etc/profile
Проверим, что установка прошла успешно:
go version
Мы должны увидеть что-то на подобие:
go version go1.25.0 linux/amd64
Можно двигаться дальше.
Установка компонентов для Signaling
В данном разделе мы рассмотрим установку, настройку и запуск всех компонентов, которые нужны для корректной работы Signaling Server.
Nats Server
Данный компонент может быть установлен из репозитория и не требует настройки.
Выполняем команду:
apt install nats-server
Проверить работу сервиса можно командой:
systemctl status nats-server
Janus
Выполним команду для установки компонента:
apt install janus
Открываем конфигурационный файл:
vi /etc/janus/janus.jcfg
Приводим следующие строки к виду:
full_trickle = true
...
turn_rest_api_key = <Janus Key>
* обратите внимание, что <Janus Key> — один из 6-и ключей, которые мы сгенерировали при подготовке к работе.
Перезапускаем сервис:
systemctl restart janus
Turn Server
Устанавливаем программное обеспечение:
apt install coturn
Открываем конфигурацию:
vi /etc/turnserver.conf
В самый низ добавим:
listening-port=3478
fingerprint
use-auth-secret
static-auth-secret=<Turn Server Key>
realm=signaling.dmosk.ru
total-quota=100
bps-capacity=0
stale-nonce
no-multicast-peers
* где:
- static-auth-secret — один из сгенерированных ключей.
- realm — внешней доменное имя, по которому будет доступен высокопроизводительный сервер.
Перезапускаем TURN-сервер:
systemctl restart coturn
Переходим к запуску основного компонента.
Signaling server
Приступаем к установке и настройке сервиса, который будет принимать основные запросы от Nextcloud Talk. Разделим процесс на установку и настройку.
Установка
Переходим на страницу репозитория проекта и смотрим последнюю версию. Фиксируем ее, создав переменную:
SIG_VER=2.0.4
Скачиваем исходник:
curl -sLO https://github.com/strukturag/nextcloud-spreed-signaling/archive/refs/tags/v${SIG_VER}.tar.gz
Распаковываем его:
tar -zxf v${SIG_VER}.tar.gz
Переходим в каталог, который появился после распаковки архива:
cd nextcloud-spreed-signaling-${SIG_VER}
Собираем рабочие файлы из исходников:
make build
После копируем бинарник signaling в каталог /usr/bin:
cp bin/signaling /usr/bin/
Создаем каталог для хранения конфигурации и копируем в него файл server.conf.in:
mkdir /etc/signaling
cp server.conf.in /etc/signaling/server.conf
* обратите внимание, что целевое имя файла уже server.conf.
Копируем файл для юнита systemd:
cp dist/init/systemd/signaling.service /etc/systemd/system/signaling.service
И немного его подредактируем:
vi /etc/systemd/system/signaling.service
[Unit]
...
After=janus.service
* в первый раздел Unit добавляем одну строку.
Создаем пользователя signaling:
useradd -r -s /usr/sbin/nologin signaling
Установка завершена.
Настройка и запуск
Открываем конфигурационный файл
vi /etc/signaling/server.conf
Правим следующие строки:
[http]
listen = 127.0.0.1:8080
[sessions]
hashkey = <Hash Key>
blockkey = <Block Key>
[clients]
internalsecret = <Internal Secret Key>
[backend]
backends = backend-1
[backend-1]
url = https://nextcloud.dmosk.ru
secret = <Nextcloud Secret Key>
[mcu]
type = janus
url = ws://127.0.0.1:8188
[turn]
apikey = <Janus Key>
secret = <Turn Server Key>
servers = turn:127.0.0.1:3478?transport=udp,turn:127.0.0.1:3478?transport=tcp
* строки, которые будут закомментированы необходимо раскомментировать. Недостающие строки нужно добавить.
** обратите внимание на:
- hashkey, blockkey, internalsecret, backend-1 secret, apikey, turn secret — ключи, которые были ранее сгенерированы.
- backend-1 url — доменное имя с адресом, по которому доступен nextcloud.
Разрешаем автозапуск сервиса signaling:
systemctl enable signaling
И запустим его:
systemctl start signaling
Проверяем, что нет ошибок:
systemctl status signaling
Можно сделать запрос:
curl -i http://127.0.0.1:8080/api/v1/welcome
Если все работает корректно, мы должны увидеть что-то на подобие:
HTTP/1.1 200 OK
Content-Type: application/json; charset=utf-8
Server: nextcloud-spreed-signaling/unknown
X-Spreed-Signaling-Features: audio-video-permissions, dialout, federation, hello-v2, incall-all, join-features, mcu, offer-codecs, recipient-call, serverinfo, simulcast, switchto, transient-data, update-sdp, welcome
Date: Sun, 31 Aug 2025 16:59:34 GMT
Content-Length: 61
{"nextcloud-spreed-signaling":"Welcome","version":"unknown"}
Идем дальше.
Прокси NGINX
Для корректной работы веб-запросы к сигналинг серверу должны отправляться по https с использованием корректного сертификата. Мы рассмотрим пример использования NGINX с получением сертификата от Let's Encrypt.
Устанавливаем пакеты:
apt install nginx certbot
Удалим конфигурацию виртуального домена, которая создается по умолчанию:
rm -f /etc/nginx/sites-enabled/default
Создаем новый файл:
vi /etc/nginx/sites-enabled/signaling.conf
server {
listen 80;
server_name signaling.dmosk.ru;
location ~ /.well-known/acme-challenge {
root /usr/share/nginx/html;
allow all;
}
}
* где в качестве server_name указываем свой домен для подключения к серверу signaling.
Перечитываем конфигурацию nginx:
nginx -t && nginx -s reload
Запрашиваем сертификат для домена:
certbot certonly --webroot --agree-tos --email postmaster@dmosk.ru --webroot-path /usr/share/nginx/html/ -d signaling.dmosk.ru
Сразу добавим задание для автопродления:
crontab -e
0 0 * * 1,4 /usr/bin/certbot renew --noninteractive
И добавляем хук на перезапуск nginx:
vi /etc/letsencrypt/cli.ini
...
deploy-hook = systemctl reload nginx
Снова открываем конфигурационный файл nginx:
vi /etc/nginx/sites-enabled/signaling.conf
Приводим его к виду:
server {
listen 80;
server_name signaling.dmosk.ru;
return 301 https://$host$request_uri;
}
server {
listen 443 ssl;
server_name signaling.dmosk.ru;
ssl_certificate /etc/letsencrypt/live/signaling.dmosk.ru/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/signaling.dmosk.ru/privkey.pem;
access_log off;
location ~ /.well-known/acme-challenge {
root /usr/share/nginx/html;
allow all;
}
location / {
proxy_pass http://127.0.0.1:8080;
proxy_redirect off;
proxy_http_version 1.1;
proxy_set_header Host $host;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto http;
}
}
Проверяем конфигурацию и перечитываем конфигурацию nginx:
nginx -t && nginx -s reload
Можно еще раз сделать запрос, но уже без указания порта:
curl -k https://127.0.0.1/api/v1/welcome
Мы должны увидеть:
{"nextcloud-spreed-signaling":"Welcome","version":"unknown"}
Сервер готов к работе. Остается настроить Nextcloud.
Подключение Nextcloud к High-performance backend
Открываем веб-интерфейс Nextcloud и переходим к настройкам (Administration settings):

Переходим в раздел с настройками конференций:

Сначала меняем настройки для STUN — указываем свой новый сервер, а также добавляем TURN-сервер:

Добавляем высокопроизводительный сервер. Для этого указываем https адрес домена, который планировали использовать для signaling server, а также секретный ключ, сгенерированный для Nextcloud:

Настройки применяются сразу.
Если мы увидим ошибку при проверке High-performance backend:

... перезагружаем страницу.
Настройка завершена. Можно тестировать звонки.