![](https://habrastorage.org/webt/qm/mn/ng/qmmnngz8lzxo1llywj1aege3dnu.jpeg)
Период скачка проблем с видео
26 февраля у нас начались серьёзные проблемы с видеосвязью. Роскомнадзор начал замедлять трафик для Facebook (запрещённой в России организации). Если вы помните, как они блокировали Телеграм, когда из нормально работающих сервисов остался только он, то вот получилось примерно то же самое. Конкретно, как мы предполагаем, они закрывали целые подсети, и наши Янус-сервера для видео тоже попали под эти баны. Также, похоже, применялась какая-то маска по пакетам, потому что в Хроме видео отвалилось почти сразу, а вот в Firefox ещё работало. Проблемы были у всего WebRTC-сообщества.
Мы сначала по возможности переводили пользователей на другие браузеры, потом начали проксировать видеотрафик через другие страны, а затем подняли сборки видеосерверов на других протоколах.
Что гораздо хуже, с развитием ситуации стало понятно, что нас либо могут заблокировать, либо заблокируют самые разные сервисы, которые так или иначе использовались в стеке разработки и деплоя. Причём блокировки шли и по аккаунту регистрации (при наличии русского юрлица или русской карты), и по адресам почт (*.ru), и даже просто по источникам трафика из русских подсетей.
Ну и дополнительным приятным аккордом стало то, что опенсорс-библиотеки были дискредитированы, и просто включать их, как раньше, было нельзя: некоторые контрибьютеры контаминировали их.
Пришлось заняться большой уборкой, заменой вендоров и вообще масштабно рассмотреть все возможные риски.
Видеосвязь
Сначала симптомы блокировок (точнее, тогда ещё замедления трафика) от РКН касались только видеопакетов, отправленных из-под Хрома. Как это ни странно, почему-то видеосвязь работала в той же новой Опере (которая Хромиум, а не старый Престо), то есть, возможно, был какой-то фильтр не только по подсетям, но и по заголовкам пакетов.
Мы начали терять уроки, что прямо било по учителям и ученикам. Первым быстрым решением было порекомендовать всем перейти на Firefox, что мы и сделали через оповещения в личных кабинетах и рассылку для учителей. Кто-то перешёл, кто-то нет (поставить новый браузер для пользователя — та ещё сложность), но это точно не могло быть окончательным решением.
Поскольку видеосвязь у нас написана как сервис, можно было перебросить подключение на другой аналогичный сервис. Мы почти сразу начали прорабатывать варианты со сторонним решением и другими серверами внутри компании. Плюс пытались как-то запатчить Янус, чтобы он использовал другую версию шифрования, что, по логике, должно было вывести его из-под удара РКН.
Подняли coturn на каждом сервере с Янусом. Это отдельный видеосервер, мы его давали как кандидат между Янусом и клиентом. Фактически проксировали через него трафик. Если бы это помогло на 100 %, то всё было бы хорошо, просто дороже по вычислениям. Но помогло не очень успешно, поэтому в итоге пришлось подготовить возможность переключаться в случае проблем на сторонний сервис Voximplant. Мы с ним уже работали когда-то, сравнивали с нашей собственной системой видео, и поэтому в истории коммитов он был. Пришлось откопать старые отключённые ветки кода, немного помолиться, что за пару лет без поддержки они более-менее запустятся, кое-что пофиксить костылями на горячую и вытащить в прод. Протащить через стейджинг получилось не с первой попытки, но всё же на порядок быстрее, чем если бы интегрировали с нуля.
В отличие от нашей Янус-схемы Voximplant — полностью стороннее SaaS, и у нас нет возможности получать записи уроков, прошедших с использованием связи Voximplant. А они нужны, в частности, для аналитики: например, можно измерять время говорения учителя или ученика, распознавать речь ученика, оценивать широту его словарного запаса и так далее. В принципе мы можем собирать больше аналитики и с SaaS-решения, но всё равно это далеко не тот уровень детализации, который у нас был на Янусе.
В итоге при переключении проблемного трафика на Voximplant потери прекратились.
Параллельно мы отправили запрос в РКН с описанием проблемы. Внятного разъяснения по поводу того, с чем она связана, мы не получили, однако ситуация с потерей пакетов каким-то образом стала лучше.
Сейчас большая часть уроков использует нашу видеосвязь, в проблемных же кейсах есть возможность переключиться на Voximplant. Продолжаем тестировать гипотезы, которые позволят стабилизировать нашу связь.
Параллельно работаем над p2p-решениями, когда трафик вообще будет отправляться напрямую между пользователями. Это не решит проблему блокировок пакетов определённого типа, поэтому пока мы не делаем боевых версий такого решения, но поэкспериментировать и иметь это в резерве может быть полезным.
Параллельно с блокировками РКН, возможно, на потерю пакетов повлияли задержки у провайдеров. Была информация, что у ряда магистральных игроков сильно замедлялся трафик. Это может объяснить фильтрацию пакетов, если учесть, что РКН, скорее всего, работал только с ip-блокировками.
В итоге с 26 февраля по 9 марта количество отменённых уроков по техническим причинам колебалось до 16 % от общей доли уроков. До 24 февраля обычный показатель был в районе от 1 до 1,5 %. Сейчас отмена по техническими причинам — в районе 3-4 %.
Стек разработки
Помните, как Слак банил Крым, ЛНР и ДНР, ещё когда это не было мейнстримом? В текущей ситуации где-то нас начали банить до того, как мы среагировали, а где-то мы заранее проанализровали риски и продумали аналоги.
Первым отвалился Pusher — это кросс-браузерное средство доставки уведомлений. Они, что называется, «проанализировали нашу бигдату» и закрыли аккаунты, потому что мы из РФ.
Первое, что мы сделали, — это постарались перенести все аккаунты на кипрское юрлицо, а также избавиться от + 7 в номерах привязанных телефонов (теперь у нас везде + 44), затем заменить все почты типа *.ru на почты хотя бы *.com или в другом национальном домене. Ещё ряд блокировок был связан с самими источниками трафика: например, некоторые украинские провайдеры частично блокируют российский трафик, российский же трафик частично блокируется в некоторых сервисах (если ваш ip — из РФ, то вам становятся недоступны какие-то сервисы). В итоге мы сделали туннелирование серверного трафика офиса через Германию, где у нас есть сервера для этой цели. В случае Украины также туннелируются видеотрафик и трафик из браузера с помощью geoDNS.
Пушер после этих мер заработал, но ненадолго, и мы всё равно собираемся искать ему аналог. Правда, скорее всего, всё закончится тем, что аналог будет самописный. Забегая наперёд, сейчас мы в 80 % сервисов отказались от Пушера.
Вообще первый шаг в такой ситуации — всеобщий бекап на случай, если какой-то из сервисов отвалится просто так и не отдаст данных. В первый же день мы запустили бекап GSuite, где лежали все гуглодиски сотрудников. Там было 67 Тб, поэтому собиралось и качалось всё это в итоге больше недели. Переложили на облако Яндекса плюс решили забирать к себе на сервера раз в месяц. Miro — собрали все данные так, что можем развернуть на другой Miro-аккаунт. Естественно, сохранили всё из Figma, потому что, если потеряются все наши дизайны, то нам тоже будет очень обидно. У некоторых компаний Slack удалял целый воркспейс: по слухам, в Сбербанке было прямо удаление данных с сервера. Мы подняли Мattermost (он чем-то похож на Slack) и сделали синхронизацию всех сообщений. Миграцию истории сделали за последний месяц.
Ещё мы используем Lokalise — это сервис, где хранятся разные языковые версии. От него нужно отказываться полностью, потому что, хоть нас там и не банили, риск очень высокий. Аналогов с низкими рисками мы так и не нашли, поэтому это тоже кандидат на собственную разработку.
Firebase от облака Google — тоже отказываемся.
New Relic — сервис для отслеживания работы кода на продакшене. Большая компания, крутое решение, очень хорошо показывает узкие места разработчикам, очень красивые дашборды, которые используют даже девопсы. Так вот, проект уже банил некоторых российских пользователей. Ожидаем, что рано или поздно побанят и нас. В августе заканчивается контракт, поэтому будем собирать замену из нескольких опенсорсных решений: скорее всего, речь идёт про Кибану плюс что-то ещё. Пока делаем анализ.
Докер (точнее, под угрозой DockerHub) — переносим в Registry необходимые нам Docker-образы (до этого в части проектов образы качались напрямую).
Важнее, чтобы не отвалился GitHub. А пример есть: они уже банили Иран. И тогда речь шла не про отдельные аккаунты, а в целом про трафик из страны. Подключили Artifactory — это решение, которое сохраняет полный кэш зависимостей. Лезет и сохраняет к себе. В какой-то момент URL Гитхаба можно просто переключить на неё. Прелесть в том, что Артифактори вроде не банит российских пользователей, но при этом сама ходит в GitHub, сохраняет локально оттуда код и позволяет деплоиться. Около 45 % проектов на Artifactory ещё не мигрировало: в процессе (всего у нас ~ 480 сервисов).
Ну и раз уж дошли до опенсорс-библиотек, то пара слов — про то, что с ними происходило. Много куда были коммиты с бекдорами или разными пропагандистскими сообщениями. В Интернете гуляют списки скомпрометированных библиотек, мы начали регулярно сканировать все наши зависимости на предмет наличия чего-то скомпрометированного. По факту прям жёстких вещей, способных убить сервер или удалить с него данные, не было, но вот разные сообщения пытались пронести. В случае контаминации опенсорс-источника мы остаёмся на старой версии библиотеки и ждём, пока сообщество не разберётся.
Ещё действия
Провели чебурнет-учения. На сетевом уровне банили на серверах прода весь зарубежный исходящий трафик. В целом всё в нашем процессе работает, но отваливаются оплаты и расписания: там российские сервисы вроде Яндекс.Кассы, Тинькофф и т. п., то есть они-то в случае чего сами быстро переедут.
Сейчас покупаем отдельный канал Россия-ЕС. Он поможет на случай, если трафик между Россией и Европой рубанут так, что замедлятся каналы. Выросло число направленных хакерских атак и попыток DDoS, мы тоже приняли меры, но здесь ИБ просили не рассказывать особо.
Перенесли DNS с Amazon Route 53 в Яндекс.Облако. Думаем, что делать с SSL. Сейчас в основном используем сертификаты Let’s Encrypt и Zero SSL. Zero SSL уже перестал выпускать сертификаты на домены ru. Быстрое решение выглядит как покупка доменов где-то ещё и отказ от четвёртого уровня, а в случае чебурнета — ГОСТ-сертификаты в ГОСТ-браузере.
Ещё офис зависит от Зума и других прикладных приложений, там были проблемы с оплатой — нормально решили билингом с кипрского юрлица.
Так что пока всё выглядит как ужас, но не ужас-ужас-ужас. А как у вас?
Комментарии (11)
Alexufo
28.04.2022 19:38Открываете OBS studio, вставляете в сцену браузер, отрываете по ссылке ваш урок как пользователь, включаете в обс запись. (в теории)
Moraiatw
28.04.2022 21:01+11Я все видел )
Hidden text
Skyeng-Habr
29.04.2022 00:05+7Мы решили не нести сюда политику.
SergeyMax
29.04.2022 09:35+4Сначала решили, а потом не решили?
HukuToc2288
29.04.2022 14:02+5Да тут политика не причём — эти события же действительно имели место быть. Вот только репозитории портили не столько украинские разработчики, сколько "сочувствующие", вспомним тот же node-ipc. Всё правильно исправили, к украинским разрабам претензий почти нет
Amanku
29.04.2022 16:59Помните, как Слак банил Крым, ЛНР и ДНР, ещё когда это не было мейнстримом?
Стесняюсь спросить, а где такое было? А то не могу найти новостей о блокировке Слака в описанных выше квазигосударствах.Да и в целомОн разве может заблокировать малую часть территории государства, где Слак доступен в полной мере, тем более, что их никто в мире и не признал?
followmyutopia
У Voximplant есть возможность записывать видеозвонки и видеоконференции, так что записи уроков, прошедших с использованием связи Voximplant, получать проще простого :)
Вот мануал по записи видеозвонков, вот мануал по записи конференций, да и в поддержке, думаю, вам быстро помогут настроить получение любых записей :)
Skyeng-Habr
Спасибо! Мы знали, что Voximplant предоставляет такую возможность в отдельном тарифе. В статье имели в виду, что сейчас мы ее не интегрировали, так как фокусировались на скорости предоставления резервного канала видеосвязи пользователям.
irbisadm
У Voximplant нет тарифов на услуги, кроме поддержки и MAU, он же Pay-as-you-go.
Записать видео и отправить ссылку в свой бекенд примерно вот кода:
Надеюсь это вам поможет собирать больше необходимой аналитики.