Разработка административной панели для управления мобильным приложением
Мобильное приложение выпущено, пользователи зарегистрированы — и тут оказывается, что нет способа заблокировать аккаунт без прямого SQL-запроса, поменять баннер без деплоя, или посмотреть статистику без выгрузки в Excel. Административная панель — это инфраструктура, которую принято откладывать и которую потом делают второпях.
Что именно входит в admin panel для мобильного приложения
Зависит от типа приложения, но типичный состав:
- Управление пользователями: список с поиском/фильтрацией, просмотр профиля, бан/разбан, ручная верификация, history действий
- Управление контентом: CRUD для сущностей приложения (товары, посты, события), модерация пользовательского контента
- Push-уведомления: ручная отправка сегментам пользователей, шаблоны, история отправок, статистика доставки
- Аналитика: DAU/MAU, retention, воронки конверсии, технические метрики (crash rate, ANR rate)
- Feature flags: включение/выключение функций без деплоя, A/B-тест конфигурации
- Конфигурация: параметры приложения (лимиты, тексты, URL) без релиза
Технический стек и архитектура
Backend API для admin
Admin panel работает с теми же бэкенд-сервисами что и мобилка, но через отдельный set эндпоинтов с более широкими правами. Важно: не давать мобильному клиенту admin-права через тот же токен. Admin API — отдельная аутентификация (отдельный OAuth2 client_id или отдельный сервис), отдельный набор middleware с проверкой ролей.
На Laravel — spatie/laravel-permission для ролей и разрешений. Роли: super_admin, content_moderator, support. Каждое admin-действие логируется в activity_log (пакет spatie/laravel-activitylog): кто, когда, что изменил, старое и новое значение. Без этого лога разобраться в инциденте невозможно.
На Node.js/NestJS — @nestjs/passport + casl для ABAC (Attribute-Based Access Control). Для аудит-лога — middleware, пишущий в отдельную таблицу или отправляющий events в Kafka/RabbitMQ.
Frontend admin panel
Три основных пути:
React + headless UI (Tanstack Table, React Hook Form, Shadcn/ui). Максимальная гибкость, пишем сами. Подходит если есть нестандартные требования к UX или нужна тесная интеграция с существующей дизайн-системой. Tanstack Table для таблиц с серверной пагинацией, сортировкой и фильтрацией — один из лучших вариантов на рынке. React Query для кеширования запросов и инвалидации.
React Admin (marmelab). Быстрый старт — компоненты List, Edit, Create, Show из коробки. Хорошо если данные CRUD-образны. Начинает ограничивать когда нужна нестандартная бизнес-логика или сложные дашборды.
Retool / AppSmith (low-code). Скорость разработки максимальная, деплоится за день. Минусы: vendor lock-in, ограничения кастомизации, платные тарифы при масштабировании, некоторые клиенты против размещения данных в SaaS.
Для большинства мобильных продуктов — React + Tanstack Table + React Query + Shadcn/ui. Не велосипед, не low-code, хорошо масштабируется.
Управление push-уведомлениями из панели
Интеграция с Firebase Cloud Messaging через Admin SDK. Панель позволяет выбрать сегмент пользователей (по дате регистрации, платформе, активности, кастомным тегам), написать текст и заголовок, запланировать отправку или отправить немедленно.
На бэкенде: FirebaseAdmin.messaging().sendMulticast() для групповой отправки (максимум 500 токенов за раз, нужна батчевая отправка для больших сегментов). Или через Firebase Topics для предопределённых групп. Результат отправки — BatchResponse с successCount и failureCount — сохраняем для истории.
Важный момент: токены FCM протухают. FirebaseMessagingException с кодом UNREGISTERED — сигнал удалить токен из базы. Делаем это автоматически в handler'е отправки.
Feature flags
Простейшая реализация: таблица feature_flags (key, enabled, rollout_percentage, updated_at). Мобилка запрашивает флаги при старте и кеширует. Панель позволяет включать/выключать флаги и настраивать процент аудитории.
Для более сложных сценариев — Firebase Remote Config или LaunchDarkly. Remote Config бесплатен и достаточен для 90% задач: панель в Firebase Console, SDK на мобилке с fetch() + activate(), minimumFetchInterval в секундах для контроля частоты запросов.
Безопасность admin panel
- Отдельный домен или subdomain (
admin.yourapp.com), неyourapp.com/admin - MFA обязателен для всех admin-аккаунтов
- IP-whitelist если команда работает из фиксированных офисов
- Rate limiting на все эндпоинты
- HTTPS only, HSTS
- Сессии с коротким TTL (8 часов), автологаут при бездействии
- Content Security Policy headers
Срок: от 1 недели до 3 месяцев. Базовая CRUD-панель с управлением пользователями и push — 1–2 недели. Полноценная система с аналитикой, feature flags, сложной ролевой моделью и аудит-логом — 1–3 месяца в зависимости от объёма.







