FaraMirAI
  • Услуги
  • Кейсы
  • О нас
  • Блог
  • Telegram
  • Обсудить проект
НКО / Наука и образование

Russian Hub — страница сбора донатов со счётчиком и виджетом для стрима

Russian Hub

Full-stack разработка

Смотреть сайт

Страница сбора для независимого академического центра в Ереване: он помогает учёным, преподавателям и студентам, уехавшим из России из-за антивоенной позиции. Собрана за два дня — меньше 48 часов от брифа в мессенджере до боевого домена с сертификатом. Главное в проекте — счётчик сбора: сумма растёт сама, при этом доступа к финансовым аккаунтам клиента у нас нет вообще.

Первый экран — версия для компьютера
Первый экран — версия для компьютера
Полоса сбора: три источника складываются в одну цифру
Полоса сбора: три источника складываются в одну цифру
Виджет для OBS — накладывается поверх картинки стрима
Виджет для OBS — накладывается поверх картинки стрима
Карточка кошелька в обороте: QR-код, адрес, сеть
Карточка кошелька в обороте: QR-код, адрес, сеть
Мобильная версия — свой кадр и отключённые тяжёлые эффекты
Мобильная версия — свой кадр и отключённые тяжёлые эффекты
2 дня

от брифа до боевого сайта

3

источника донатов считаются сами

0

доступов к финансам клиента

0

внешних запросов у страницы

15 с

обновление виджета в эфире

5 мин

интервал проверки кошельков

?

Задача

Хабу нужна была страница со способами поддержать сбор на офлайн-лабораторию: цель 5 000 €, дедлайн — утро субботы. Дальше начались ограничения. Платёжные рельсы: Stripe Армению не обслуживает, PayPal работает только на отправку, российские карты за рубежом не проходят. Сумму надо показывать и на странице, и в прямом эфире донат-стрима, но доступ к своим платёжным аккаунтам клиент давать не хотела — и была права, для неё это личный Telegram и вся её финансовая история. Сервер — 1,9 ГБ памяти без подкачки, сборка проекта на нём не проходит в принципе.

Решение

Страница на Next.js 16 и React 19: сборка идёт локально, на сервер уезжает готовый пакет, дальше nginx, systemd и Let's Encrypt. Сумма сбора складывается из трёх источников, и ни один не требует доступа к чужим финансам. Донаты Tribute прилетают вебхуками с проверкой подписи — клиент сама создаёт ключ у себя и отзывает его одной кнопкой. Три криптокошелька сайт проверяет сам раз в пять минут по открытым данным блокчейна и пересчитывает в евро. Остальное клиент вводит в закрытой панели с телефона: кнопки быстрого плюса удобны прямо во время эфира. Для стрима сделан отдельный виджет-оверлей под OBS — та же цифра, опрос раз в 15 секунд и золотая вспышка в момент доната.

Технологический стек

СлойТехнологияВерсияЗадача
FrontendNext.js 16 + React 1916.3.4App Router, серверный рендер, автономная сборка
ЯзыкTypeScript strict mode5.9Типобезопасность, ноль any
СтилиTailwind CSS4.3Тёмная тема, стеклянные карточки, мягкие стыки секций
Шрифтыnext/font — EB Garamond и ManropenativeРаздача со своего домена, ноль внешних запросов
АнимацияCSS + requestAnimationFramenativeБез сторонней библиотеки: страница видна и без JavaScript
Медиаffmpeg: AV1 10-бит + H.264svt-av1 / x264Фильтр против полос, обязательный запасной формат для iPhone
Приём донатовВебхуки Tribute, HMAC-SHA256—Проверка подписи, защита от повторной доставки
КриптаNode + systemd timer, публичные блокчейн-APIраз в 5 минутБалансы трёх кошельков, пересчёт в евро
ДеплойVPS + nginx + systemd + Let's EncryptUbuntuЛокальная сборка, сертификат, автоперезапуск

Хронология проекта

01
10 сентября, первая половина дня

Разбор задачи: какие платёжные рельсы вообще работают для Армении, палитра и тексты сняты с материалов клиента, проверен сервер — сборка только локально

02
10 сентября, день

Первая боевая версия на своём домене: сертификат, редирект с http, ноль внешних запросов

03
10 сентября, вечер

Правки клиента по живой странице: фоновые сцены вместо плоских заливок, переворачивающиеся карточки кошельков, ожившая полоса сбора

04
11 сентября, день

Автоматика сбора: панель для клиента, слежение за тремя кошельками, виджет для OBS; следом — свой аудит панели и два слоя защиты от перебора пароля

05
11 сентября, вечер

Приём донатов Tribute с проверкой подписи и защитой от дублей, фоновые ролики заменены настоящими фотографиями — страница на боевом домене за сутки до дедлайна

Что мы сделали

Приём донатов Tribute вебхуками: проверка подписи, защита от повторной доставки (сервис перепосылает событие сутки), отмены подписок не вычитаются задним числом — оплаченный месяц у хаба не забирают
Автосчёт криптодонатов: три публичных кошелька (USDT в сетях Tron и Ethereum, Bitcoin) опрашиваются раз в 5 минут по открытым данным блокчейна, курс берётся отдельно; деньги, лежавшие в кошельках до старта кампании, донатами не считаются — от них берётся точка отсчёта
Закрытая панель для клиента: сумму по остальным каналам она вводит сама с телефона, кнопки +10 / +50 / +100 € для быстрого счёта во время эфира; ни одного пароля от её платёжных аккаунтов мы не получили
Виджет для OBS: прозрачный оверлей поверх картинки стрима, обновление раз в 15 секунд, цифра плавно докручивается, при новом донате карточка на 2,4 секунды подсвечивается золотом — в эфире видно, что донат прошёл
Три источника пишут в один файл, каждый только в своё поле — проверено тестами, что автоматика и ручной ввод не затирают друг друга; правка видна на сайте в течение минуты без пересборки и выкладки
Защита панели, которую никто не заказывал: нашли и закрыли обход лимита попыток через подменяемый заголовок, добавили второй слой с нарастающей задержкой и сравнение пароля постоянного времени
Предохранитель от ошибки в единицах: тест на донате в 7 € поймал, что сумма может записаться в сто раз больше — исправлено до запуска, добавлена проверка на абсурдные значения и журнал сырых событий для сверки
Три карточки кошельков переворачиваются: лицо — монета и сеть, оборот — QR-код, адрес, кнопка копирования и предупреждение о сети перевода
Фоновые сцены прогнаны через свой конвейер кодирования: фильтр против полос на градиентах ночного неба, на выходе два формата — современный и обязательный запасной, потому что на части iPhone новый кодек не играет вовсе
Когда у клиента кончились кредиты на генерацию и она попросила «пусть сайт будет реальный, а не волшебный», два фоновых кадра заменены настоящими фотографиями со свободной лицензией и медленным наездом камеры — страница стала легче, а просьба закрыта тем же ходом
Библиотека анимаций убрана из проекта: она отдавала секции невидимыми с сервера, и без включённого JavaScript страница, принимающая донаты, выглядела пустой — появление переписано так, что базовое состояние «видно»
Приватность без оговорок: шрифты раздаются со своего домена, внешних запросов у страницы ноль, форм и рекламных счётчиков нет, в подвале прямо написано «Мы не собираем ваши данные», служебные адреса закрыты от индексации

Хотите такой же результат?

Разберём вашу задачу на бесплатной консультации

Обсудить проектНаписать в WhatsApp
Footer illustration

Услуги

  • Разработка чат ботов
  • Автоматизация процессов
  • AI-интеграции
  • Telegram-каналы и боты
  • Сайты и лендинги
  • Таргет и контекстная реклама

Компания

  • О нас
  • Кейсы
  • Блог
  • Обучение
  • Контакты

Документы

  • Политика конфиденциальности
  • Обработка персональных данных

Связь

  • @Lucius_SS_Rank_Ghoul
  • WhatsApp
  • faramir.agency@gmail.com
FaraMirAI

© 2026 FaraMirAI · Политика