Share link for secure video call between two or more anonymous users. Anonymous and confidential real-time communication use open source WebRTC JavaScript library of peer-to-peer network RTCMultiConnection.
Disclaimer: DD Talk service was developed by IT volunteers on the Donbass Dialogue Platform, 2014—2020. DD Talk is Beta version. For professional goals use technical support!
Good article in English Deploy a Node.js Application to DigitalOcean with HTTPS
С помощью PuTTYgen www.puttygen.com на локальной машине создаем приватный и публичный SSH ключи:
private.ppk
pub.key
В облаке Microsoft Azure в Западной Европе: B1S Standard (1 виртуальный ЦП Intel(R) Xeon(R) CPU E5-2673 v4 @ 2.30GHz, память 1 ГиБ ОЗУ) c Ubuntu 18.04. Диск: 64 ГиБ SSD, цен. категория "Премиум".
Указываем имя пользователя. И вставляем из PuTTY Key Generator открытый ключ SSH. В поле Общедоступные входящие порты
активируем Разрешить выбранные порты
и активируем 22
- для PuTTY, 80
и 443
- HTTP и HTTPS.
На вкладке Сетевые подключения
в поле Общедоступный IP адрес
нажмите создать и в поле Назначение
выберите Статический
. После чего активируем процесс создания ВМ.
В админ панели ВМ в разделе Сетевые соединения
добавляем правила безопасности для входящего трафика. Открываем 3478
и 5349
порты для STUN/TURN (TCP и UDP).
В сетевых подключениях активируем статический публичный IP адрес
Редактируем настройки домена через админ-панель регистратора домена. Если домен ранее был привязан к другому IP:
-
Очищаем кеш Гугла: https://google-public-dns.appspot.com/cache
-
Очищаем DNS в Windows используя CLI (Microsoft Windows command line):
C:\> ipconfig /flushdns
Если нет домена используем DNS-имя: ***.westeurope.cloudapp.azure.com. Для этого в ip-Конфигурация
в поле Метка DNS-имени
создаем уникальный идентификатор.
Загружаем, устанавливаем PuTTY и настраиваем подключение. Для подключения нужно указать IP
ВМ, во вкладке Connection/Data
указываем имя пользователя
, а во вкладке Connection/SSH/Auth
указываем путь к файлу с приватным ключом для SSH доступа, который создали ранее.
После подключения к ВМ обновляемся и устанавливаем вспомогательный софт: mc - файловый менеджер, htop - системный монитор, ifstat - вывод нагрузки на сетевые каналы.
$ sudo apt-get update && sudo apt-get upgrade -y
$ sudo apt-get install mc htop ifstat
Настраиваем локальное время ВМ
-
Получаем список Timezones
$ timedatectl list-timezones
-
Устанавливаем выбранную Timezone
$ sudo timedatectl set-timezone Europe/Kiev
-
Показать текущую дату и время
$ date
С правами ROOT
работать опасно, поэтому создаем нового пользователя с правами администратора sudo
(подробнее об этом написано тут)
$ sudo adduser newUser
Даем ему административные привилегии
$ sudo usermod -aG sudo newUser
В режиме отладки отключаем требование ввести пароль для команд с SUDO
. Открываем файл конфигурации sudo:
$ sudo visudo
В редакторе отключаем запрос пароля следующей строчкой:
newUser ALL=(ALL) NOPASSWD: ALL
И сохраняем файл. В конце после всех настроек и отладки нужно включить обратно ввод пароля для sudo команд.
Копируем ключи доступа ~/.ssh/authorized_keys
в домашний каталог нового пользователя и меняем скопированным файлам владельца и группу:
$ sudo rsync --archive --chown=newUser:newUser ~/.ssh /home/newUser
Теперь открываем новый сеанс терминала и используем SSH с новым именем пользователя и подключаемся к ВМ.
$ sudo ufw status
Если статус не активный, то идем к следующему пункту
Status: inactive
Если статус активный - настраиваем файервол ВМ и открываем все необходимые порты для: SSH, HTTH, HTTPS, TURN и STUN.
Немного об этом How To Set Up a Node.js Application Installation instructions Node.js v12.x:
$ sudo curl -sL https://deb.nodesource.com/setup_12.x | sudo -E bash -
$ sudo apt-get install -y nodejs
Проверяем версии
$ node -v
$ npm -v
Протестируем Node.js используя RTCMultiConnection. Подробности читаем тут: Пошаговая инструкция по установке библиотеки RTCMultiConnection и Общая инструкция к библиотеке. Скачиваем и разархивируем в новую папку демоверсию
$ sudo apt-get update && sudo apt-get upgrade -y
$ wget https://github.com/muaz-khan/RTCMultiConnection/archive/master.zip
$ unzip master.zip
$ rm master.zip
$ cd RTCMultiConnection-master
В новой папке инсталлируем все зависимости которые указаны в файле package.json
:
$ sudo npm install
Для публичного сервера в package.json
игнорируем scripts и пакеты для разработки указанные в блоках scripts и devDependencies :
$ sudo npm install --only=prod --ignore-scripts
В файле config.json
для переменной port
указываем значение 3478
(ранее открытый порт для STUN/TURN) и запускаем Node.js:
$ node server.js
В браузере в адресной строке вводим IP или домен ВМ:
http://___YOU_DOMEN_OR_IP_ADRESS___:3478
и в браузере загрузится демонстрационная страница сервиса RTCMultiConnection.
По умолчанию Node.js запрещен доступ портам 80 и 443. Доступ к низким портам есть только для root доступа. Но если запустить Node.js под root с командой SUDO, то Node.js получит доступ 80-му порту и сервер запустится.
$ sudo node server.js
Если не планируется установка обратного проксирующего сервера, можно организовать доступ к портам 80 и 443 для Node.js без root прав. Для этого нужно через
CAP_NET_BIND_SERVICE
предоставить доступ к процессу с низким номером порта (Ссылка 1 и Ссылка 2):
$ sudo apt-get install libcap2-bin
$ sudo setcap 'cap_net_bind_service=+ep' /usr/bin/node
После экспериментов можно удалить папку RTCMultiConnection-master
Полезные команды для управления Node.js Проверка на чтение директорий:
$ curl -v --path-as-is https://___YOU_DOMEN_OR_IP_ADRESS___:PORT/../../../../../../etc/passwd
Просмотреть все запущенные процессы:ps -ax | grep node
Чтобы убить процесс с нодой нужно указать ее ID:kill -9 ID
Если разворачивался архив подroot
то чтобы работать сSFTP
файловым менеджером нужна рекурсивная замена владельца:chown -R owner:group dirname/
Удалить все зависимости и установить заново:rm -rf node_modules && npm install
Можно установить пакет Reinstall который дополнительно очищает кеш после удаления node modules. Установка пакета Reinstall:npm install reinstall -g
Использование:reinstall
Удаляет пакеты разработчика "devDependencies" указанные вpackage.json
:npm prune --production
Полезные ссылки:
- Общая информация
- Скринкаст о hmac-password shared secret key between HTTP and TURN servers
- Документация
- Описание команд в конфиге
- Описание настройки RTCMultiConnection
- Пример конфига для webrtc
- Оригинальный конфиг
- Описание флагов
Установка Coturn:
$ sudo apt-get update && sudo apt-get upgrade -y
$ sudo apt-get install coturn
Чтобы он автоматически запускался после перезагрузки сервера в файле
$ sudo nano /etc/default/coturn
Удаляем символ #
#
TURNSERVER_ENABLED=1
и сохраняем файл, после чего перегружаем Coturn:
$ sudo service coturn restart
$ sudo systemctl status coturn
Конфиг настраивается позже, после того как получим SSL сертификаты.
Команды для управления Coturn Ручной запуск:
sudo service coturn start
илиsudo systemctl start coturn
Перезагрузка:sudo service coturn restart
Остановка:sudo service coturn stop
Запуск turnserver с заданного конфига:sudo turnserver -c /etc/turnserver.conf --daemon -v -u USER:PASS
Проверка слежения на портах 3478 и 5349 (или 80/443)
$ sudo lsof -n -i4TCP:3478 | grep LISTEN
$ sudo lsof -n -i4TCP:5349 | grep LISTEN
$ sudo apt-get update && sudo apt-get upgrade -y
$ sudo apt-get install nginx
Проверка статуса:
sudo systemctl status nginx
When you have your server's IP address or domain, enter it into your browser's address bar:
http://_YOU_DOMEN_OR_IP_ADRESS_
Конфиг настраивается позже, после того как получим SSL сертификаты.
To stop your web server, type:
sudo systemctl stop nginx
To start the web server when it is stopped, type:sudo systemctl start nginx
To stop and then start the service again, type:sudo systemctl restart nginx
If you are simply making configuration changes, Nginx can often reload without dropping connections. To do this, type:sudo systemctl reload nginx
By default, Nginx is configured to start automatically when the server boots. If this is not what you want, you can disable this behavior by typing:sudo systemctl disable nginx
To re-enable the service to start up at boot, you can type:sudo systemctl enable nginx
Nginx on Ubuntu 18.04 LTS (bionic) Add Certbot PPA
$ sudo apt-get update
$ sudo apt-get install software-properties-common
$ sudo add-apt-repository universe
$ sudo add-apt-repository ppa:certbot/certbot
$ sudo apt-get update
Install Certbot
$ sudo apt-get install certbot python-certbot-nginx
Either get and install your certificates... Run this command to get a certificate and have Certbot edit your Nginx configuration automatically to serve it, turning on HTTPS access in a single step.
$ sudo certbot --nginx -d ___YOU_1_DOMEN___ -d ___YOU_2_DOMEN___
При получении сертификатов желательно выбрать пункт 2: Redirect - Make all requests redirect to secure HTTPS access. Choose this for new sites, or if you're confident your site works on HTTPS. You can undo this change by editing your web server's configuration.
Test automatic renewal
$ sudo certbot renew --dry-run
Скачиваем и разархивируем в новую папку DDTalk
$ sudo apt-get update && sudo apt-get upgrade -y
$ wget https://github.com/VShtaba/ddtalk/archive/master.zip
$ unzip master.zip
$ rm master.zip
$ cd ddtalk-master
В config.json проверяем порт который слушает Node.js (по умолчанию 8081) и устанавливаем случайное значение для socketCustomEvent
:
{
...
"socketCustomEvent": "__YOU_PASS__",
"port": "8081",
...
}
В файле site-config.json в поле ioServerOrigins
через запятую перечисляем с какого адреса будт доступен Socket.IO и, если нужно, указываем порты для сокета или ставим *
:
{
...
"ioServerOrigins": ["___IPADRESS1___:*, ___ddtalk.IPADRESS2____:*"],
}
В этой папке где находятся файлы сервиса инсталлируем все зависимости, которые указаны в файле package.json:
$ sudo npm install
Запускаем Node.js:
$ node server.js
PM2 устанавливаем глобально (подробнее по ссылке pm2):
$ sudo apt-get update && sudo apt-get upgrade -y
$ sudo npm install pm2@latest -g
В папке где лежит скрипт сервера server.js
и запускаем приложение присваивая ему алиас:
$ pm2 start server.js --name ddtalk
Для включения режима отслеживания изменений файлов (добавляем параметр --watch
) подробнее:
$ pm2 start server.js --name ddtalk --watch
Просмотреть список запущенных приложений (если их на сервере несколько):
pm2 list
Мониторинг работающих приложений - команда:pm2 monit
Остановка приложения (доп. команды {start|stop|restart}):pm2 stop ddtalk
Перезагрузкаpm2 reload all
Убрать приложение из списка:pm2 delete ddtalk
Инициализация автозагрузки приложения
$ pm2 startup
P2 выдаст команду, которую нужно запустить с помощью sudo. Скопируйте и вставьте команду, чтобы закончить процесс
sudo su -c "env PATH=$PATH:/usr/bin pm2 startup systemd -u newUser --hp /home/newUser"
Сохранить список текущих процессов на случай перезагрузки сервера:
pm2 save
Отключение системы запуска:pm2 unstartup
Логи приложения находятся в папкеroot/pm2/logs/
Очистка логов:pm2 flush
Затем нужно отредактировать основной файл конфигурации Coturn:
$ sudo nano /etc/turnserver.conf
Меняем его содержание на то, что лежит в папке tools/Coturn Редактируем realm=CoturnPublicIpAddressOrDomen, user=YOU_USER:PASS и сохраняем конфигурационный файл.
Перегружаем Coturn:
$ sudo service coturn restart
В файле ./ui/dist/lib-ice-servers.json нужно указать имя сервера, имя пользователя и пароль для подключения к STUN/TURN серверу.
Тестирование TURN сервера:
- Trickle-ice https://webrtc.github.io/samples/src/content/peerconnection/trickle-ice/
- Еще один сервис для проверки STUN&TURN (в настройках сервиса нужно указать параметры STUN и TURN серверов) https://test.webrtc.org/
- Чтобы все входящие включения по WebRTC шли через TURN сервер в настройках Firefox
about:config
флагmedia.peerconnection.ice.relay_only
нужно установить в значениеTRUE
. - Чтобы использовать только TURN без STUN нужно активировать в конфиге
turnserver.conf
параметрno-stun
.
Проверка нагрузки на сеть сервера:
$ ifstat -b -S -z -t
Нужно создать новый файл конфигурации где будут храниться настройки Nginx:
$ sudo nano /etc/nginx/conf.d/backend.conf
И вставить в него содержимое из файла tools/Nginx/backend.conf. В конфиге меняем:
# Указываем IP и домен
server_name __YOU_Server_IP __YOU_Server_Domain_Name_1__ __YOU_Server_Domain_Name_2__;
...
# Проверяем порт (должен быть тем же что и в config.json)
server 127.0.0.1:8081
...
# Указываем путь к SSL сертификатам
ssl_certificate /etc/letsencrypt/live/__YOU_Server_Domain_Name_1__/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/__YOU_Server_Domain_Name_1__/privkey.pem;
...
Перезагружаем Nginx:
$ sudo systemctl restart nginx
или
$ sudo service nginx restart
📙 Заходим в браузер, вводим
https://_YOU_SERVER_ADRESS_
и проверяем работу сервиса.
Без браузера можно проверить из консоли загрузку socket.io:
$ curl -vI https://__YOU_SERVER_ADRESS__/socket.io/socket.io.js
Чтобы обращаться к локальным переменным и функциям закомментируйте две строчки в файле ui/dist/main.js
...
//(function () {
...
//}());
...
Чтобы отобразить отладочную информацию в chrome devtools в файле
site-config.json нужно активировать поле enableClientSideLogs
и пергрузить NodeJS сервер:
$ pm2 restart ddtalk-dev
Чтобы в активировать debug mode
без перезагрузки сервера в файле ui/dist/debug.js присвойте переменной DEBUG
значение true
...
const DEBUG = true;
...
В заголовках Content Security Policy Presentations разрешены следующие ресурсы: для Google Docs, которые используются в фреймах на страницах About и Manual разрешены:
iframe https://docs.google.com, style-src https://fonts.googleapis.com, font-src https://fonts.gstatic.com
для Stream Canvas PDF handler file который находится__WEBSITE_DIR__/ddtalk/ui/dist/canvas-designer/widget.html
запрашивает внешний ресурс https://cdn.jsdelivr.net/npm/pdfjs-dist@2.0.489/build/pdf.min.js
- SSL Server Test - бесплатный онлайн-сервис для анализа конфигурации SSL-веб-сервера в Интернете.
- Test a website's performance - используется для измерения и анализа производительности веб-страниц.
- Facebook Crawler - отладчик репостов, чтобы смотреть, какая информация используется, когда контентом с вашего сайта делятся на Facebook, в Messenger
- Twitter Card validator - помогает проверить оптимизированны ли твиты с помощью карт
- Schema Markup Generator (JSON-LD) - генератор структурированных данных Schema.org для создания разметок JSON-LD
- Google Проверка структурированных данных - Snippet валидатор
MIT Free Software
Markdown редактор https://dillinger.io