Живая админка без SPA: Laravel + Hotwire Turbo для финтех-сервиса

Для админки, где операторы работают с кошельками и заявками на вывод, соблазн сделать полноценный SPA велик. Но у SPA есть цена — там, где ошибки стоят денег.

В TON-микросервисе выбран другой путь: серверный Laravel + Blade, а «живость» интерфейса обеспечивает Hotwire Turbo — библиотека, которая перехватывает переходы по ссылкам и отправку форм и подменяет содержимое страницы обычным HTML-ответом от сервера, без полной перезагрузки вкладки.

Почему это работает именно для операционной админки

Вся авторизация, 2FA, серверная валидация и маршруты остаются такими же, как в классическом Laravel-приложении — их не пришлось переносить или дублировать под отдельный JSON API для фронтенда. Новая страница админки — это Blade-шаблон и контроллер, а не ещё и клиентский стейт-менеджер.

Таблицы транзакций и выводов, а также прогресс batch-операций по сбору средств, обновляются точечно через Turbo Frames каждые 10–15 секунд. Автообновление приостанавливается, если вкладка скрыта, открыто модальное окно или оператор сейчас взаимодействует с блоком — чтобы фоновый рефреш не сбрасывал незаконченное действие. Пагинация при этом не теряется.

Осознанные исключения из кеша Turbo

Turbo по умолчанию кеширует HTML-снимки страниц для мгновенной навигации назад-вперёд. Страницы, показывающие mnemonic-фразу кошелька, одноразовый пароль или секрет 2FA, явно исключены из snapshot-кеша, чтобы такие данные не оставались в истории браузера дольше, чем нужно. Скачивание CSV и раскрытие seed-фразы выполняются обычным, не-Turbo запросом — намеренно, а не по недосмотру.

Опасные действия — за подтверждением, а не по одному клику

Часть операций необратима или потенциально дорога — например, принудительный запуск синхронизации кошелька с блокчейном. Такие действия доступны только оператору с настроенной двухфакторной аутентификацией, подтверждаются через отдельный popup, а сам запуск не делает сетевой вызов внутри HTTP-запроса — он лишь ставит задачу в очередь, учитывает cooldown и пишет действие в журнал администратора. Повторный клик не порождает вторую параллельную синхронизацию того же кошелька — это гарантировано на уровне очереди задач, а не только блокировкой кнопки в UI.

Итог: админка ощущается «живой» для оператора, но остаётся серверным Laravel-приложением — без раздвоения логики между backend и SPA-фронтендом и с чёткими границами того, какие данные вообще не должны попадать в клиентский кеш браузера.

Обсудить задачу

Если у вас есть проект, связанный с Laravel, CRM, Telegram, AI/RAG, API-интеграциями, автоматизацией или TON/GRAM-логикой — напишите в свободной форме, что нужно сделать.

Можно описать задачу коротко: что есть сейчас, что не работает, какой результат нужен и какие сервисы уже используются.


Сделать заказ

| необходим для связи с вами
В кротчайшие сроки я свяжусь с вами.

Также вы можетете связать со мной:
telegram: @ifwcom