Как создать журнал активности в приложении с 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);
});
tenant_id из JWT и нужный action (например, "login", "payment").Как обеспечить безопасность журнала активности и соответствие 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 — работает онлайн, без регистрации.
Теги