У клиента был платный закрытый Telegram-канал с обучающим видео для квест-бизнеса. После замедления Telegram в России смотреть видео стало невозможно. Мы построили полноценную образовательную платформу с нуля: собственный видеоплеер, три слоя защиты от пиратства, система прогресса, admin-панель и авторизация через Telegram.
React + Node.js
PostgreSQL
HLS + S3
LMS / EdTech
Кейс за 60 секунд
Клиент и боль
Обучающий контент для владельцев квест-бизнеса. После замедления Telegram в России подписчики не могли смотреть оплаченное видео: буферизация, обрывы. Плюс прежние проблемы закрытого канала — нет прогресса, нет аналитики, контент легко утекает.
Что построили
Своя образовательная платформа (LMS — система для онлайн-обучения): видеоплеер на HLS (сегментированный стриминг как у Netflix), 3 слоя водяных знаков для идентификации утечек, вход через Telegram без паролей, прогресс/заметки/чек-листы, 8 страниц админки, режим «День открытых дверей» для конверсии.
Кому подойдёт
Инфобизнес и онлайн-школы, чей контент застрял в Telegram-канале, GetCourse или конструкторе — и которым нужна своя платформа с защитой от пиратства.
Проблема
Клиент продавал доступ к закрытому Telegram-каналу с видеоуроками для владельцев квестов. Контент был ценный, аудитория — платящая. Но после замедления Telegram в России всё развалилось:
После замедления Telegram в России видео в закрытом канале стало невозможно смотреть. Буферизация, обрывы, вечная загрузка — подписчики платили за контент, который не могли потребить.
В Telegram нет понятия «прогресс обучения». Пользователь прокрутил ленту, посмотрел ролик — и забыл. Где остановился, что пропустил, сколько осталось — неизвестно.
Закрытый канал — это иллюзия защиты. Любой участник может переслать видео, скачать его, поделиться ссылкой. Никакой привязки к конкретному человеку.
Владелец канала не знал, кто вообще смотрит контент. Сколько людей зашли, что популярно, кто платит, а кто просто сидит — полная темнота.
Решение
Готовые платформы — это шаблоны, ограничения и ежемесячная плата за чужие серверы. Нет контроля над видеоплеером, нельзя встроить свою защиту от пиратства, нельзя авторизовать через Telegram. И главное — контент по-прежнему легко украсть.
Полноценную образовательную платформу: собственный видеоплеер с HLS-стримингом, три уровня антипиратской защиты, авторизация через Telegram, система прогресса и заметок, admin-панель с аналитикой, 5 ролей пользователей. Всё своё — от первой строки кода до последнего API-эндпоинта.
В цифрах
Видеоплеер
Не YouTube, не Vimeo, не чужой embed-код. Мы написали видеоплеер с нуля на HLS.js — том же протоколе, который используют Netflix и Apple TV. Видео хранится на S3-хранилище, разбито на сегменты по 6–10 секунд и стримится адаптивно.
Видео не скачивается целиком — загружается сегментами по 6–10 секунд через протокол HTTP Live Streaming. Как Netflix или YouTube. Нельзя просто «скачать файл» — его нет в одном месте.
Два варианта качества: 720p и 480p. Плеер автоматически переключается между ними в зависимости от скорости интернета. Плохая связь — не буферизация, а снижение качества.
Каждый сегмент видео запрашивает временную подписанную ссылку на S3-хранилище. Ссылка живёт 1 час, потом становится бесполезной. Даже если кто-то перехватит URL — через час он мёртв.
Переключение скорости воспроизведения: 1x → 1.25x → 1.5x → 2x. Настройка сохраняется между сессиями. Удобно для повторного просмотра или когда спикер говорит медленно.
Отключено контекстное меню на видео, убрана кнопка скачивания из стандартных контролов, заблокирован режим «картинка в картинке». Максимально усложнён путь к сохранению видео.
Для видео длиннее 20 минут — демо-версия. Пользователь видит случайный фрагмент с баннером «Демо-версия — вы смотрите случайный отрывок». В конце — призыв к действию.
Антипиратство
Главная боль инфобизнеса — пиратство. Кто-то записывает экран, делает скриншот, пересылает видео. Мы встроили три уровня водяных знаков прямо в видеоплеер. Каждый привязан к конкретному аккаунту. Утечка = мгновенная идентификация.
Левый верхний угол
Полупрозрачная надпись с @username пользователя. Всегда на экране, но не мешает просмотру. Если кто-то записывает экран — его Telegram-никнейм будет на записи.
Правый нижний угол
Практически невидимый при просмотре видео. Но стоит сделать скриншот — и при JPEG-сжатии он проявляется. Встроен на уровне, который камера или запись экрана обязательно захватит.
Случайная позиция
Меняет положение при каждом открытии видео. Настолько прозрачный, что глаз его не замечает. Но при сильном сжатии (пересылка через мессенджер, загрузка на торрент) — проступает. Экспертиза покажет, чей аккаунт.
/* Слой 1: Видимый */.watermark-visible { position: absolute; top: 12px; left: 16px; opacity: 0.35; color: #1a1a1a; } /* Слой 2: Проявляется на скриншотах */.watermark-subtle { position: absolute; bottom: 8px; right: 12px; opacity: 0.02; /* невидим глазу */ } /* Слой 3: Призрак — случайная позиция */.watermark-ghost { position: absolute; /* top/left вычисляется рандомно */ opacity: 0.008; /* практически 0 */ }
LMS
В Telegram-канале пользователь — пассивный зритель. В нашей LMS — активный ученик. Прогресс, заметки, чек-листы, рейтинги, избранное. Каждый инструмент повышает вовлечённость и завершаемость курса.
Система запоминает, на какой секунде пользователь остановился. Вернулся через неделю — видео начинается ровно с того места. Heartbeat-пинги каждые несколько секунд фиксируют позицию.
Видео автоматически помечается как просмотренное, когда пользователь досмотрел 90%+. Можно отметить вручную — если пересматривать не планируешь. Прогресс виден по каждой категории.
1–5 звёзд + текстовый комментарий к каждому уроку. Владелец видит, какой контент ценят, а какой нужно переработать. Средний балл агрегируется в admin-панели.
К каждому уроку можно написать заметку — конспект, идеи, вопросы. Заметки привязаны к пользователю и уроку. Никто кроме автора их не видит.
Сохраняй уроки в избранное одним кликом. Отдельная страница со всеми сохранёнными материалами — как плейлист, только для обучения.
К урокам можно прикреплять чек-листы с заданиями. Пользователь отмечает пункты — прогресс сохраняется. Практические задания, а не просто «посмотрел и забыл».
Авторизация
Аудитория клиента живёт в Telegram. Поэтому авторизация — через Telegram Login Widget. Одна кнопка, два клика — и пользователь внутри. Никаких паролей, email-подтверждений и «забыл пароль». JWT-токены, httpOnly-cookies, автообновление сессии.
Access-токен живёт 15 минут, refresh — 30 дней в httpOnly cookie. XSS-атака не даст украсть сессию. Ротация: новый refresh-токен при каждом обновлении.
Админ заранее создаёт запись по @username с нужной ролью. Когда человек впервые входит через Telegram — система автоматически привязывает его к заготовке. Не нужно потом вручную выдавать доступ.
Каждый вход верифицируется криптографической подписью от Telegram. Невозможно подделать авторизацию — данные подписаны ботом, сервер проверяет хэш.
Роли
Не все пользователи равны. У кого-то гостевой доступ, кто-то — платный подписчик, кто-то — владелец франшизы с командой. Для каждого — свой уровень доступа и свои инструменты.
Полный доступ: управление контентом, пользователями, аналитика, инсайты. 8 страниц admin-панели.
Доступ к контенту и базовой аналитике. Может управлять пользователями без изменения ролей.
Полный доступ к контенту, заметкам, чек-листам и рейтингам. Основной тип для платных подписчиков.
Видит только бесплатный контент и превью платных видео. Мотивация к покупке доступа.
Заблокированный пользователь. Авторизация проходит, но контент недоступен. Для нарушителей.
Для владельцев
Владелец квест-бизнеса покупает доступ не только для себя, но и для команды. Owner-дашборд показывает прогресс каждого сотрудника: кто учится, кто забил, кто завершил курс. Мотивация через прозрачность.
Admin
Владелец платформы управляет всем из браузера: контент, пользователи, аналитика, права. Без SSH, без терминала, без разработчика. Всё — через удобный интерфейс.
6 карточек статистики: пользователи, контент, категории, просмотры, активные пользователи, завершённые уроки. Таблица последних зарегистрированных.
CRUD для всех типов: видео, статьи, чек-листы, файлы. Фильтрация по категории и типу. Авто-генерация slug из русского заголовка (транслитерация).
Создание и редактирование разделов. Управление видимостью, иконками, сортировкой. Тип категории: стандартный или витрина (для отзывов).
Поиск, назначение ролей, привязка к компании, просмотр истории: что смотрел, что оценил, какие заметки оставил.
Трендовый контент, метрики вовлечённости, распределение просмотров по времени. Данные для принятия решений.
Глубокий анализ: поведение пользователей, эффективность контента, паттерны потребления. BI-уровень аналитики.
Матрица ролей и возможностей. Массовые операции: выдать доступ всей команде, заблокировать группу.
Заранее создай пользователя по @username. Когда он войдёт через Telegram — система автоматически привяжет его к заготовке с нужной ролью.
Маркетинг
Встроенный режим Open House: администратор задаёт дату начала и окончания — и на это время весь контент становится доступным для всех зарегистрированных пользователей. Гости видят полную библиотеку, пробуют, вовлекаются — и покупают доступ, когда окно закрывается.
Администратор указывает OPEN_HOUSE_START и OPEN_HOUSE_END. Активация — автоматическая, по серверному времени.
Гости и бесплатные пользователи получают полный доступ к библиотеке. Замки на контенте исчезают. Превью заменяется полным видео.
Когда окно закрывается — пользователь уже знает ценность контента. Конверсия в покупку кратно выше, чем с холодного трафика.
Поиск
В Telegram «найти что-то в канале» — это боль. Мы встроили PostgreSQL Full-Text Search с весами: заголовок весит больше описания, описание — больше категории. Поиск понимает русский язык, подсвечивает совпадения и показывает контекст. Для аббревиатур — fallback на ILIKE.
-- Веса: A = заголовок, B = описание, C = категория
ts_rank(
setweight(to_tsvector('russian', title), 'A') ||
setweight(to_tsvector('russian', description), 'B') ||
setweight(to_tsvector('russian', category), 'C'),
plainto_tsquery('russian', :query)
) AS rankТехнический стек
Итог
Клиент пришёл с проблемой: «Telegram замедлили, подписчики не могут смотреть видео». Мы могли бы просто перенести видео на сайт. Но вместо этого построили платформу, которая решает все проблемы инфобизнеса: защита контента, аналитика, прогресс, командный доступ.
Результат — продукт, который стоит дороже, чем «закрытый канал в Telegram». Потому что это уже не канал. Это образовательная платформа с собственным видеоплеером, антипиратской защитой и admin-панелью. Своя LMS — без ежемесячных платежей за GetCourse.
Расскажите задачу — мы спроектируем решение. Если ваш контент застрял в Telegram, мессенджере или на конструкторе — мы перенесём его в собственную платформу с защитой и аналитикой.
Написать в Telegram