TToolBox
💻
💻 dev
16 апреля 2026 г.6 мин чтения

Как создать журнал активности в приложении с Convex и Kinde

Как создать журнал активности в приложении с Convex и Kinde
В этой статье

Журнал активности в вашем приложении можно построить за несколько шагов, используя Convex для серверной логики и Kinde для управления пользователями. Это позволяет в реальном времени отслеживать, кто и что делал.

В 2026 году более 70 % SaaS‑продуктов используют централизованный журнал активности для аудита действий пользователей — это повышает безопасность и упрощает расследования. С помощью Convex и Kinde вы сможете реализовать такой журнал в мультиарендном приложении за 3‑4 часа разработки, получив мгновенную историю всех операций.

Как настроить Kinde для идентификации пользователей в мультиарендной среде?

Для начала необходимо создать тестовый клиент в Kinde, указав URL вашего приложения и включив поддержку мультиарендности. После этого каждый пользователь получает JWT‑токен, содержащий поле tenant_id, которое будет использоваться в дальнейшем.

  • 1. Зарегистрируйтесь в Kinde (бесплатный план) и создайте приложение‑клиент.
  • 2. В настройках включите Custom Claims и добавьте tenant_id и role.
  • 3. Сгенерируйте клиентский ID и секрет, сохраните их в переменных окружения KINDE_CLIENT_ID и KINDE_CLIENT_SECRET.
  • 4. Интегрируйте SDK Kinde в ваш фронтенд (React, Vue или Svelte) и запросите токен через login().
  • 5. При каждом запросе к серверу передавайте токен в заголовке Authorization: Bearer <token>.

Почему Convex идеален для хранения и обработки событий аудита?

Convex предлагает реактивную базу данных с автоматическим масштабированием и встроенными триггерами, что позволяет записывать события мгновенно и выполнять запросы в реальном времени без дополнительных серверов.

  • • Автоматические mutations — каждый вызов функции записывает запись в коллекцию activity_log за ≈ 20 мс.
  • • Встроенный query language поддерживает фильтрацию по полям tenant_id, action, timestamp.
  • • Стоимость хранения: ₽1 200 за 10 ГБ в 2026 году, что покрывает до 5 млн записей в месяц.
  • • Возможность задавать TTL (time‑to‑live) для старых записей, экономя до 95 % места.

Что делать, если нужно отфильтровать действия по арендатору и типу события?

Для выборки данных используйте Convex queries с параметрами tenant_id и action_type. Запрос возвращает только нужные записи, а индексы гарантируют время отклика < 100 мс даже при 1 млн записей.

  • 1. Создайте функцию‑запрос queryActivityLog в Convex:
  • export const queryActivityLog = query(async ({ db }, { tenantId, action }) => {
        return await db
          .query('activity_log')
          .filter(q => q.eq('tenant_id', tenantId) && q.eq('action', action))
          .order('timestamp', 'desc')
          .take(100);
    });
  • 2. На клиенте вызывайте её через SDK, передавая текущий tenant_id из JWT и нужный action (например, "login", "payment").
  • 3. Отобразите результаты в таблице с колонками: пользователь, действие, время, IP‑адрес.

Как обеспечить безопасность журнала активности и соответствие GDPR в 2026 году?

Журнал должен быть неизменяемым и доступным только уполномоченным ролям. Для этого применяйте шифрование на уровне поля и ограничьте доступ через политики Convex.

  • • Шифруйте поле details с помощью AES‑256‑GCM перед записью.
  • • В Convex задайте role‑based access control: только роли admin и audit могут читать записи; запись допускается только функции с ролью system.
  • • Реализуйте право на удаление (right to be forgotten) — создайте отдельный endpoint, который помечает запись как deleted: true и запускает процесс «затирания» через deleteAfterTTL.
  • • В 2026 году нормативы требуют хранить аудит‑логи минимум 2 года, поэтому установите TTL = 730 дней и экспортируйте архивы в S3 для долгосрочного хранения.

Какие метрики и отчёты можно построить на основе собранных данных?

Собранные события позволяют формировать как оперативные дашборды, так и периодические отчёты для руководства. Пример типовых метрик:

  • Среднее время отклика API после действия пользователя — рассчитывается как разница между request_start и request_end.
  • Количество входов в систему по арендатору за день — СУММ записей с action="login" и tenant_id.
  • Процент неуспешных платежей (action="payment_failed") — ≈ 2,3 % в среднем за Q1 2026.
  • Топ‑5 самых активных пользователей за месяц — сортировка по полю action_count в агрегированном запросе.

Для визуализации используйте любой BI‑инструмент (Metabase, Superset) либо встроенные графики в админ‑панели, подключив их к Convex через GraphQL‑endpoint.

Воспользуйтесь бесплатным инструментом ActivityLogGenerator на toolbox-online.ru — работает онлайн, без регистрации.
Поделиться:

Теги

#dev#backend#security#audit#javascript

Похожие статьи

Материалы, которые могут вас заинтересовать