Ring Platform Logo

    Завантаження документації...

    Підготовка контенту платформи Ring

    Documentation

    Приветствие — миссия и аудитории

    Добро пожаловать в Ring Platform

    Хаб библиотеки

    Документация платформы Ring

    Начало работы

    Индекс
    Предварительные требования
    Установка
    Миграции базы данных
    Первый успех
    Устранение неполадок
    Next Steps

    Архитектура

    Обзор архитектуры
    Режимы бэкенда и базы данных
    Data Model
    Архитектура Аутентификации
    Архитектура Email AI-CRM
    Архитектура PaymentConductor
    Архитектура News Kingdom
    Proxy и интернационализация
    Real Time
    Security

    Функции

    Index
    Authentication
    Email AI-CRM
    Entities
    Opportunities
    Messaging
    Notifications
    Push-уведомления через FCM (Ring)
    Web3 Кошелек
    Store
    Интеграция платежей
    PaymentConductor
    Интеграция WayForPay

    API-интерфейс

    Index
    Аутентификация
    Email AI-CRM API
    Сущности
    Opportunities
    Messaging
    Notifications
    Wallet
    Store

    CLI

    Ring CLI (только enterprise)

    Кастомизация

    Index
    Branding
    Features
    Localization
    Themes
    Components

    Развёртывание

    Index
    Self-hosted развёртывание
    Vercel
    Docker
    Environment
    Monitoring
    Оптимизация производительности
    Backup

    Разработка

    Index
    Local Setup
    Code Structure
    Community tooling
    Ring MCP Server
    OSS vs enterprise
    Best Practices
    Workflow

    Примеры

    Index
    Quick Start
    Authentication
    Email AI-CRM — туториал
    Api Integration
    Интеграция Web3
    White Label
    Реальные Проекты

    Интеграции

    Ethereum-кошельки (Wagmi v3)

    Быстрый вход (CTO · аудиторы · агенты)

    Хаб библиотеки
    Приветствие — миссия и аудитории
    Начало работы
    Архитектура и Auth.js
    Режимы бэкенда и БД (DB_BACKEND_MODE)
    Self-hosted
    Ring MCP
    Деплой (Docker · k8s)
    Безопасность и комплаенс
    Ring Platform Logo

    Завантаження документації...

    Підготовка контенту платформи Ring

    Documentation

    Приветствие — миссия и аудитории

    Добро пожаловать в Ring Platform

    Хаб библиотеки

    Документация платформы Ring

    Начало работы

    Индекс
    Предварительные требования
    Установка
    Миграции базы данных
    Первый успех
    Устранение неполадок
    Next Steps

    Архитектура

    Обзор архитектуры
    Режимы бэкенда и базы данных
    Data Model
    Архитектура Аутентификации
    Архитектура Email AI-CRM
    Архитектура PaymentConductor
    Архитектура News Kingdom
    Proxy и интернационализация

    Функции

    Index
    Authentication
    Email AI-CRM
    Entities
    Opportunities
    Messaging
    Notifications
    Push-уведомления через FCM (Ring)

    API-интерфейс

    Index
    Аутентификация
    Email AI-CRM API
    Сущности
    Opportunities
    Messaging
    Notifications
    Wallet
    Store

    CLI

    Ring CLI (только enterprise)

    Кастомизация

    Index
    Branding
    Features
    Localization
    Themes
    Components

    Развёртывание

    Index
    Self-hosted развёртывание
    Vercel
    Docker
    Environment
    Monitoring
    Оптимизация производительности
    Backup

    Разработка

    Index
    Local Setup
    Code Structure
    Community tooling
    Ring MCP Server
    OSS vs enterprise
    Best Practices
    Workflow

    Примеры

    Index
    Quick Start
    Authentication
    Email AI-CRM — туториал
    Api Integration
    Интеграция Web3
    White Label
    Реальные Проекты

    Интеграции

    Ethereum-кошельки (Wagmi v3)

    Быстрый вход (CTO · аудиторы · агенты)

    Хаб библиотеки
    Приветствие — миссия и аудитории
    Начало работы
    Архитектура и Auth.js
    Режимы бэкенда и БД (DB_BACKEND_MODE)
    Self-hosted
    Ring MCP
    Деплой (Docker · k8s)
    Безопасность и комплаенс
    Ring Platform Logo

    Завантаження документації...

    Підготовка контенту платформи Ring

    Documentation

    Приветствие — миссия и аудитории

    Добро пожаловать в Ring Platform

    Хаб библиотеки

    Документация платформы Ring

    Начало работы

    Индекс
    Предварительные требования
    Установка
    Миграции базы данных
    Первый успех
    Устранение неполадок
    Next Steps

    Архитектура

    Обзор архитектуры
    Режимы бэкенда и базы данных
    Data Model
    Архитектура Аутентификации
    Архитектура Email AI-CRM
    Архитектура PaymentConductor
    Архитектура News Kingdom
    Proxy и интернационализация

    Функции

    Index
    Authentication
    Email AI-CRM
    Entities
    Opportunities
    Messaging
    Notifications
    Push-уведомления через FCM (Ring)

    API-интерфейс

    Index
    Аутентификация
    Email AI-CRM API
    Сущности
    Opportunities
    Messaging
    Notifications
    Wallet
    Store

    CLI

    Ring CLI (только enterprise)

    Кастомизация

    Index
    Branding
    Features
    Localization
    Themes
    Components

    Развёртывание

    Index
    Self-hosted развёртывание
    Vercel
    Docker
    Environment
    Monitoring
    Оптимизация производительности
    Backup

    Разработка

    Index
    Local Setup
    Code Structure
    Community tooling
    Ring MCP Server
    OSS vs enterprise
    Best Practices
    Workflow

    Примеры

    Index
    Quick Start
    Authentication
    Email AI-CRM — туториал
    Api Integration
    Интеграция Web3
    White Label
    Реальные Проекты

    Интеграции

    Ethereum-кошельки (Wagmi v3)

    Быстрый вход (CTO · аудиторы · агенты)

    Хаб библиотеки
    Приветствие — миссия и аудитории
    Начало работы
    Архитектура и Auth.js
    Режимы бэкенда и БД (DB_BACKEND_MODE)
    Self-hosted
    Ring MCP
    Деплой (Docker · k8s)
    Безопасность и комплаенс
    Модуль Новостей - Цифровой Газетный Опыт
    Блоги участников
    Научный редактор
    Система локалей
    Безопасность и соответствие
    NFT Маркетплейс
    Система Стейкинга Токенов
    Паттерны Оптимизации Производительности
    Мобильный Опыт
    Администрирование
    Code Style
    Performance
    Testing
    Deployment
    Debugging
    Contributing
    Api Examples
    ringdom.org — база LegioX
    Исходники — лицензия MIT (GitHub)
    Real Time
    Security
    Web3 Кошелек
    Store
    Интеграция платежей
    PaymentConductor
    Интеграция WayForPay
    Модуль Новостей - Цифровой Газетный Опыт
    Блоги участников
    Научный редактор
    Система локалей
    Безопасность и соответствие
    NFT Маркетплейс
    Система Стейкинга Токенов
    Паттерны Оптимизации Производительности
    Мобильный Опыт
    Администрирование
    Code Style
    Performance
    Testing
    Deployment
    Debugging
    Contributing
    Api Examples
    ringdom.org — база LegioX
    Исходники — лицензия MIT (GitHub)
    Real Time
    Security
    Web3 Кошелек
    Store
    Интеграция платежей
    PaymentConductor
    Интеграция WayForPay
    Модуль Новостей - Цифровой Газетный Опыт
    Блоги участников
    Научный редактор
    Система локалей
    Безопасность и соответствие
    NFT Маркетплейс
    Система Стейкинга Токенов
    Паттерны Оптимизации Производительности
    Мобильный Опыт
    Администрирование
    Code Style
    Performance
    Testing
    Deployment
    Debugging
    Contributing
    Api Examples
    ringdom.org — база LegioX
    Исходники — лицензия MIT (GitHub)

    Push-уведомления через FCM (Ring)

    Ring Platform хранит FCM-токены в основной базе данных (PostgreSQL или Firestore в зависимости от режима бэкенда) — по одной записи на пользователя и устройство. React-приложения регистрируют токены через Server Action; остальные клиенты используют ограниченный по частоте API. Оба пути вызывают один и тот же серверный слой БД, поэтому поведение и безопасность везде одинаковы.

    Обзор: логика FCM в Ring

    «Ring-powered» FCM — это единая, не зависящая от бэкенда схема:

    • Хранилище токенов как источник истины — Таблица (или коллекция) fcm_tokens хранит все токены регистрации. Полезная нагрузка хранится в колонке JSONB data где применимо (PostgreSQL). Отдельного кэша нет; реестром служит БД.
    • Одна строка на устройство и пользователя — Составное уникальное ограничение по (user_id, device_fingerprint) даёт одну запись на устройство. Значение токена не уникально, поэтому при ротации FCM-токена обновляется та же строка, а не создаётся дубликат.
    • React-приложение → Server Action — Основной путь для браузера и React Native web — Server Action upsertFcmToken. Идентификатор пользователя сервер берёт только из auth(); клиент его не передаёт.
    • Остальные клиенты → API — Мобильные приложения или внешние сервисы вызывают POST /api/notifications/fcm/register с тем же телом запроса. Этот endpoint ограничен по частоте на пользователя (например, 10 запросов в минуту).
    • Жизненный цикл в данных — В каждой строке хранятся status (active | stale | invalid) и invalidatedAt. Реактивная очистка срабатывает при ошибках FCM по токену; по расписанию помечаются устаревшие токены и при необходимости выполняется жёсткое удаление.
    • Режим бэкенда — Хранилище токенов не привязано к конкретному бэкенду. BackendSelector направляет запросы по DB_BACKEND_MODE в PostgreSQL (например k8s-postgres-fcm, supabase-fcm) или Firestore (firebase-full). Один код; ветвлений в Server Action или API нет.
    Регистрация и доставка FCM в Ring

    Push-уведомления через FCM (Ring)

    Ring Platform хранит FCM-токены в основной базе данных (PostgreSQL или Firestore в зависимости от режима бэкенда) — по одной записи на пользователя и устройство. React-приложения регистрируют токены через Server Action; остальные клиенты используют ограниченный по частоте API. Оба пути вызывают один и тот же серверный слой БД, поэтому поведение и безопасность везде одинаковы.

    Обзор: логика FCM в Ring

    «Ring-powered» FCM — это единая, не зависящая от бэкенда схема:

    • Хранилище токенов как источник истины — Таблица (или коллекция) fcm_tokens хранит все токены регистрации. Полезная нагрузка хранится в колонке JSONB data где применимо (PostgreSQL). Отдельного кэша нет; реестром служит БД.
    • Одна строка на устройство и пользователя — Составное уникальное ограничение по (user_id, device_fingerprint) даёт одну запись на устройство. Значение токена не уникально, поэтому при ротации FCM-токена обновляется та же строка, а не создаётся дубликат.
    • React-приложение → Server Action — Основной путь для браузера и React Native web — Server Action upsertFcmToken. Идентификатор пользователя сервер берёт только из auth(); клиент его не передаёт.
    • Остальные клиенты → API — Мобильные приложения или внешние сервисы вызывают POST /api/notifications/fcm/register с тем же телом запроса. Этот endpoint ограничен по частоте на пользователя (например, 10 запросов в минуту).
    • Жизненный цикл в данных — В каждой строке хранятся status (active | stale | invalid) и invalidatedAt. Реактивная очистка срабатывает при ошибках FCM по токену; по расписанию помечаются устаревшие токены и при необходимости выполняется жёсткое удаление.
    • Режим бэкенда — Хранилище токенов не привязано к конкретному бэкенду. BackendSelector направляет запросы по DB_BACKEND_MODE в PostgreSQL (например k8s-postgres-fcm, supabase-fcm) или Firestore (firebase-full). Один код; ветвлений в Server Action или API нет.
    Регистрация и доставка FCM в Ring

    Push-уведомления через FCM (Ring)

    Ring Platform хранит FCM-токены в основной базе данных (PostgreSQL или Firestore в зависимости от режима бэкенда) — по одной записи на пользователя и устройство. React-приложения регистрируют токены через Server Action; остальные клиенты используют ограниченный по частоте API. Оба пути вызывают один и тот же серверный слой БД, поэтому поведение и безопасность везде одинаковы.

    Обзор: логика FCM в Ring

    «Ring-powered» FCM — это единая, не зависящая от бэкенда схема:

    • Хранилище токенов как источник истины — Таблица (или коллекция) fcm_tokens хранит все токены регистрации. Полезная нагрузка хранится в колонке JSONB data где применимо (PostgreSQL). Отдельного кэша нет; реестром служит БД.
    • Одна строка на устройство и пользователя — Составное уникальное ограничение по (user_id, device_fingerprint) даёт одну запись на устройство. Значение токена не уникально, поэтому при ротации FCM-токена обновляется та же строка, а не создаётся дубликат.
    • React-приложение → Server Action — Основной путь для браузера и React Native web — Server Action upsertFcmToken. Идентификатор пользователя сервер берёт только из auth(); клиент его не передаёт.
    • Остальные клиенты → API — Мобильные приложения или внешние сервисы вызывают POST /api/notifications/fcm/register с тем же телом запроса. Этот endpoint ограничен по частоте на пользователя (например, 10 запросов в минуту).
    • Жизненный цикл в данных — В каждой строке хранятся status (active | stale | invalid) и invalidatedAt. Реактивная очистка срабатывает при ошибках FCM по токену; по расписанию помечаются устаревшие токены и при необходимости выполняется жёсткое удаление.
    • Режим бэкенда — Хранилище токенов не привязано к конкретному бэкенду. BackendSelector направляет запросы по DB_BACKEND_MODE в PostgreSQL (например k8s-postgres-fcm, supabase-fcm) или Firestore (firebase-full). Один код; ветвлений в Server Action или API нет.
    Регистрация и доставка FCM в Ring

    Предварительные требования

    • Аутентификация — Выполнен вход (сессия Auth.js). Регистрация токена всегда привязана к аутентифицированному пользователю; сервер не доверяет идентификатору пользователя от клиента.
    • Web Push (браузер) — HTTPS (или localhost в разработке), поддержка Web Push в браузере, зарегистрированный service worker и Firebase client SDK. Файл service worker обычно доступен по /firebase-messaging-sw.js.
    • API-клиенты — Действующая сессия (cookie или Bearer) и тот же контракт тела запроса (token, deviceFingerprint, deviceInfo).

    React-приложение: путь через Server Action

    Используйте Server Action как основной способ регистрации и обновления FCM-токенов из любого React- или Next.js-клиента. Этот путь не ограничен по частоте, в отличие от API, и идентификатор пользователя остаётся только на сервере.

    Основной путь

    React-приложениям следует использовать Server Action как основной путь. API предназначен для остальных клиентов и ограничен по частоте.

    Предварительные требования

    • Аутентификация — Выполнен вход (сессия Auth.js). Регистрация токена всегда привязана к аутентифицированному пользователю; сервер не доверяет идентификатору пользователя от клиента.
    • Web Push (браузер) — HTTPS (или localhost в разработке), поддержка Web Push в браузере, зарегистрированный service worker и Firebase client SDK. Файл service worker обычно доступен по /firebase-messaging-sw.js.
    • API-клиенты — Действующая сессия (cookie или Bearer) и тот же контракт тела запроса (token, deviceFingerprint, deviceInfo).

    React-приложение: путь через Server Action

    Используйте Server Action как основной способ регистрации и обновления FCM-токенов из любого React- или Next.js-клиента. Этот путь не ограничен по частоте, в отличие от API, и идентификатор пользователя остаётся только на сервере.

    Основной путь

    React-приложениям следует использовать Server Action как основной путь. API предназначен для остальных клиентов и ограничен по частоте.

    Предварительные требования

    • Аутентификация — Выполнен вход (сессия Auth.js). Регистрация токена всегда привязана к аутентифицированному пользователю; сервер не доверяет идентификатору пользователя от клиента.
    • Web Push (браузер) — HTTPS (или localhost в разработке), поддержка Web Push в браузере, зарегистрированный service worker и Firebase client SDK. Файл service worker обычно доступен по /firebase-messaging-sw.js.
    • API-клиенты — Действующая сессия (cookie или Bearer) и тот же контракт тела запроса (token, deviceFingerprint, deviceInfo).

    React-приложение: путь через Server Action

    Используйте Server Action как основной способ регистрации и обновления FCM-токенов из любого React- или Next.js-клиента. Этот путь не ограничен по частоте, в отличие от API, и идентификатор пользователя остаётся только на сервере.

    Основной путь

    React-приложениям следует использовать Server Action как основной путь. API предназначен для остальных клиентов и ограничен по частоте.

    1

    Получите стабильный device fingerprint

    Сгенерируйте или загрузите стабильное значение (например, crypto.randomUUID() из localStorage) и используйте его при каждой загрузке и при обновлении токена. Сервер по паре (user_id, device_fingerprint) выполняет upsert одной строки на устройство.

    2

    Запросите разрешение и получите FCM-токен

    В компоненте с 'use client' (например внутри провайдера уведомлений) вызовите Notification.requestPermission(). После разрешения вызовите getToken(messaging, { vapidKey }) из Firebase Messaging SDK. Не вызывайте getToken() в Server Components — в них нет контекста браузера.

    3

    Вызовите Server Action для регистрации токена

    Вызовите upsertFcmToken({ token, deviceFingerprint, deviceInfo, platform: 'web' }). Не передавайте userId; сервер берёт его из auth().

    4

    Обработка обновления токена

    Когда Firebase SDK выдаёт новый токен (например через onTokenRefresh), снова вызовите тот же Server Action с новым токеном и тем же deviceFingerprint. Общий слой БД обновит существующую строку для этого пользователя и устройства.

    1

    Получите стабильный device fingerprint

    Сгенерируйте или загрузите стабильное значение (например, crypto.randomUUID() из localStorage) и используйте его при каждой загрузке и при обновлении токена. Сервер по паре (user_id, device_fingerprint) выполняет upsert одной строки на устройство.

    2

    Запросите разрешение и получите FCM-токен

    В компоненте с 'use client' (например внутри провайдера уведомлений) вызовите Notification.requestPermission(). После разрешения вызовите getToken(messaging, { vapidKey }) из Firebase Messaging SDK. Не вызывайте getToken() в Server Components — в них нет контекста браузера.

    3

    Вызовите Server Action для регистрации токена

    Вызовите upsertFcmToken({ token, deviceFingerprint, deviceInfo, platform: 'web' }). Не передавайте userId; сервер берёт его из auth().

    4

    Обработка обновления токена

    Когда Firebase SDK выдаёт новый токен (например через onTokenRefresh), снова вызовите тот же Server Action с новым токеном и тем же deviceFingerprint. Общий слой БД обновит существующую строку для этого пользователя и устройства.

    1

    Получите стабильный device fingerprint

    Сгенерируйте или загрузите стабильное значение (например, crypto.randomUUID() из localStorage) и используйте его при каждой загрузке и при обновлении токена. Сервер по паре (user_id, device_fingerprint) выполняет upsert одной строки на устройство.

    2

    Запросите разрешение и получите FCM-токен

    В компоненте с 'use client' (например внутри провайдера уведомлений) вызовите Notification.requestPermission(). После разрешения вызовите getToken(messaging, { vapidKey }) из Firebase Messaging SDK. Не вызывайте getToken() в Server Components — в них нет контекста браузера.

    3

    Вызовите Server Action для регистрации токена

    Вызовите upsertFcmToken({ token, deviceFingerprint, deviceInfo, platform: 'web' }). Не передавайте userId; сервер берёт его из auth().

    4

    Обработка обновления токена

    Когда Firebase SDK выдаёт новый токен (например через onTokenRefresh), снова вызовите тот же Server Action с новым токеном и тем же deviceFingerprint. Общий слой БД обновит существующую строку для этого пользователя и устройства.

    Пример: регистрация и обновление токена в клиентском компоненте.

    Пример: регистрация FCM-токена в клиентском компоненте
    typescript

    Остальные клиенты: API

    Мобильные приложения и другие клиенты без React регистрируют токены через тот же контракт по HTTP.

    Endpoint: POST /api/notifications/fcm/register

    Тело запроса:

    • token (string, обязательно) — FCM registration token из клиентского SDK.
    • deviceFingerprint (string, обязательно) — Стабильный идентификатор устройства (например UUID в local storage). Не более 128 символов; только буквы, цифры, дефис и подчёркивание.
    • deviceInfo (object, необязательно) — Произвольные метаданные устройства (например platform, userAgent).

    Аутентификация: Обязательна (session cookie или Bearer). Сервер использует идентификатор аутентифицированного пользователя; не передавайте userId в теле.

    Ответы:

    • 200 — { "success": true }
    • 400 — Ошибка валидации (например отсутствует или неверный deviceFingerprint)
    • 401 — Не аутентифицирован
    • 429 — Превышен лимит запросов (заголовок Retry-After)
    • 500 — Ошибка сервера

    Пример: регистрация и обновление токена в клиентском компоненте.

    Пример: регистрация FCM-токена в клиентском компоненте
    typescript

    Остальные клиенты: API

    Мобильные приложения и другие клиенты без React регистрируют токены через тот же контракт по HTTP.

    Endpoint: POST /api/notifications/fcm/register

    Тело запроса:

    • token (string, обязательно) — FCM registration token из клиентского SDK.
    • deviceFingerprint (string, обязательно) — Стабильный идентификатор устройства (например UUID в local storage). Не более 128 символов; только буквы, цифры, дефис и подчёркивание.
    • deviceInfo (object, необязательно) — Произвольные метаданные устройства (например platform, userAgent).

    Аутентификация: Обязательна (session cookie или Bearer). Сервер использует идентификатор аутентифицированного пользователя; не передавайте userId в теле.

    Ответы:

    • 200 — { "success": true }
    • 400 — Ошибка валидации (например отсутствует или неверный deviceFingerprint)
    • 401 — Не аутентифицирован
    • 429 — Превышен лимит запросов (заголовок Retry-After)
    • 500 — Ошибка сервера

    Пример: регистрация и обновление токена в клиентском компоненте.

    Пример: регистрация FCM-токена в клиентском компоненте
    typescript

    Остальные клиенты: API

    Мобильные приложения и другие клиенты без React регистрируют токены через тот же контракт по HTTP.

    Endpoint: POST /api/notifications/fcm/register

    Тело запроса:

    • token (string, обязательно) — FCM registration token из клиентского SDK.
    • deviceFingerprint (string, обязательно) — Стабильный идентификатор устройства (например UUID в local storage). Не более 128 символов; только буквы, цифры, дефис и подчёркивание.
    • deviceInfo (object, необязательно) — Произвольные метаданные устройства (например platform, userAgent).

    Аутентификация: Обязательна (session cookie или Bearer). Сервер использует идентификатор аутентифицированного пользователя; не передавайте userId в теле.

    Ответы:

    • 200 — { "success": true }
    • 400 — Ошибка валидации (например отсутствует или неверный deviceFingerprint)
    • 401 — Не аутентифицирован
    • 429 — Превышен лимит запросов (заголовок Retry-After)
    • 500 — Ошибка сервера
    Лимит запросов

    Этот endpoint ограничен по частоте на пользователя (например 10 запросов в минуту). Используйте Server Action из React-приложений, чтобы не расходовать лимит API.

    Пример с cURL (подставьте cookie сессии или Bearer в соответствии с вашей настройкой auth):

    Пример: регистрация токена через API
    bash

    Переменные окружения

    Настройки разделены так, чтобы на клиент попадали только публичные и безопасные значения.

    Безопасность

    Приватный ключ VAPID и учётные данные Firebase service account не должны попадать на клиент. Храните их только на сервере.

    Лимит запросов

    Этот endpoint ограничен по частоте на пользователя (например 10 запросов в минуту). Используйте Server Action из React-приложений, чтобы не расходовать лимит API.

    Пример с cURL (подставьте cookie сессии или Bearer в соответствии с вашей настройкой auth):

    Пример: регистрация токена через API
    bash

    Переменные окружения

    Настройки разделены так, чтобы на клиент попадали только публичные и безопасные значения.

    Безопасность

    Приватный ключ VAPID и учётные данные Firebase service account не должны попадать на клиент. Храните их только на сервере.

    Лимит запросов

    Этот endpoint ограничен по частоте на пользователя (например 10 запросов в минуту). Используйте Server Action из React-приложений, чтобы не расходовать лимит API.

    Пример с cURL (подставьте cookie сессии или Bearer в соответствии с вашей настройкой auth):

    Пример: регистрация токена через API
    bash

    Переменные окружения

    Настройки разделены так, чтобы на клиент попадали только публичные и безопасные значения.

    Безопасность

    Приватный ключ VAPID и учётные данные Firebase service account не должны попадать на клиент. Храните их только на сервере.

    НазначениеПеременныеГде
    Клиент (браузер / приложение)NEXT_PUBLIC_FIREBASE_API_KEY, NEXT_PUBLIC_FIREBASE_AUTH_DOMAIN, NEXT_PUBLIC_FIREBASE_PROJECT_ID, NEXT_PUBLIC_FIREBASE_MESSAGING_SENDER_ID, NEXT_PUBLIC_FIREBASE_APP_ID, NEXT_PUBLIC_FIREBASE_VAPID_KEYБезопасны для клиента; используются Firebase client SDK и service worker
    Сервер (хранилище токенов, отправка FCM)FIREBASE_SERVICE_ACCOUNT_* или путь к JSON сервисного аккаунта; DB_BACKEND_MODE (например k8s-postgres-fcm, firebase-full, supabase-fcm)Только сервер; используются BackendSelector и Firebase Admin SDK
    НазначениеПеременныеГде
    Клиент (браузер / приложение)NEXT_PUBLIC_FIREBASE_API_KEY, NEXT_PUBLIC_FIREBASE_AUTH_DOMAIN, NEXT_PUBLIC_FIREBASE_PROJECT_ID, NEXT_PUBLIC_FIREBASE_MESSAGING_SENDER_ID, NEXT_PUBLIC_FIREBASE_APP_ID, NEXT_PUBLIC_FIREBASE_VAPID_KEYБезопасны для клиента; используются Firebase client SDK и service worker
    Сервер (хранилище токенов, отправка FCM)FIREBASE_SERVICE_ACCOUNT_* или путь к JSON сервисного аккаунта; DB_BACKEND_MODE (например k8s-postgres-fcm, firebase-full, supabase-fcm)Только сервер; используются BackendSelector и Firebase Admin SDK
    НазначениеПеременныеГде
    Клиент (браузер / приложение)NEXT_PUBLIC_FIREBASE_API_KEY, NEXT_PUBLIC_FIREBASE_AUTH_DOMAIN, NEXT_PUBLIC_FIREBASE_PROJECT_ID, NEXT_PUBLIC_FIREBASE_MESSAGING_SENDER_ID, NEXT_PUBLIC_FIREBASE_APP_ID, NEXT_PUBLIC_FIREBASE_VAPID_KEYБезопасны для клиента; используются Firebase client SDK и service worker
    Сервер (хранилище токенов, отправка FCM)FIREBASE_SERVICE_ACCOUNT_* или путь к JSON сервисного аккаунта; DB_BACKEND_MODE (например k8s-postgres-fcm, firebase-full, supabase-fcm)Только сервер; используются BackendSelector и Firebase Admin SDK

    Снятие регистрации и выход

    При выходе или отключении push пользователем:

    • Браузер / React — Вызовите deleteToken(messaging) из Firebase client SDK, затем снимите регистрацию на сервере: DELETE /api/notifications/fcm/register с телом { "deviceFingerprint": "same-uuid-as-register" }. Идемпотентно; можно вызывать, даже если запись уже удалена или инвалидирована.
    • Остальные клиенты — Тот же запрос DELETE с тем же deviceFingerprint, что и при регистрации.

    Сервер помечает строку как status: 'invalid' и выставляет invalidatedAt; доставка на этот токен прекращается.

    Устранение неполадок

    Снятие регистрации и выход

    При выходе или отключении push пользователем:

    • Браузер / React — Вызовите deleteToken(messaging) из Firebase client SDK, затем снимите регистрацию на сервере: DELETE /api/notifications/fcm/register с телом { "deviceFingerprint": "same-uuid-as-register" }. Идемпотентно; можно вызывать, даже если запись уже удалена или инвалидирована.
    • Остальные клиенты — Тот же запрос DELETE с тем же deviceFingerprint, что и при регистрации.

    Сервер помечает строку как status: 'invalid' и выставляет invalidatedAt; доставка на этот токен прекращается.

    Устранение неполадок

    Снятие регистрации и выход

    При выходе или отключении push пользователем:

    • Браузер / React — Вызовите deleteToken(messaging) из Firebase client SDK, затем снимите регистрацию на сервере: DELETE /api/notifications/fcm/register с телом { "deviceFingerprint": "same-uuid-as-register" }. Идемпотентно; можно вызывать, даже если запись уже удалена или инвалидирована.
    • Остальные клиенты — Тот же запрос DELETE с тем же deviceFingerprint, что и при регистрации.

    Сервер помечает строку как status: 'invalid' и выставляет invalidatedAt; доставка на этот токен прекращается.

    Устранение неполадок

    ПроблемаПричинаДействие
    Permission denied или токен не полученПользователь отклонил уведомления или разрешение ещё не запрашивалиЗапросите разрешение до вызова getToken(); обрабатывайте permission === 'denied' в интерфейсе
    429 при регистрацииПревышен лимит запросовИспользуйте Server Action из React; для API-клиентов соблюдайте Retry-After и снизьте частоту регистрации
    Неверный deviceFingerprintОшибка валидацииСтрока длиной 1–128 символов: только буквы, цифры, дефис и подчёркивание
    401 при регистрацииНе аутентифицированУбедитесь, что отправляется действующая сессия (cookie или Bearer); не передавайте userId в теле
    ПроблемаПричинаДействие
    Permission denied или токен не полученПользователь отклонил уведомления или разрешение ещё не запрашивалиЗапросите разрешение до вызова getToken(); обрабатывайте permission === 'denied' в интерфейсе
    429 при регистрацииПревышен лимит запросовИспользуйте Server Action из React; для API-клиентов соблюдайте Retry-After и снизьте частоту регистрации
    Неверный deviceFingerprintОшибка валидацииСтрока длиной 1–128 символов: только буквы, цифры, дефис и подчёркивание
    401 при регистрацииНе аутентифицированУбедитесь, что отправляется действующая сессия (cookie или Bearer); не передавайте userId в теле
    ПроблемаПричинаДействие
    Permission denied или токен не полученПользователь отклонил уведомления или разрешение ещё не запрашивалиЗапросите разрешение до вызова getToken(); обрабатывайте permission === 'denied' в интерфейсе
    429 при регистрацииПревышен лимит запросовИспользуйте Server Action из React; для API-клиентов соблюдайте Retry-After и снизьте частоту регистрации
    Неверный deviceFingerprintОшибка валидацииСтрока длиной 1–128 символов: только буквы, цифры, дефис и подчёркивание
    401 при регистрацииНе аутентифицированУбедитесь, что отправляется действующая сессия (cookie или Bearer); не передавайте userId в теле

    См. также

    • Уведомления — Типы уведомлений, каналы и настройки
    • Схема и миграции для fcm_tokens (например data/schema.sql, data/migrations/fcm_jsonb_schema.sql) в вашем клоне Ring
    • Truth lens FCM-специалиста (AI-LEGIOX/legiox-truth-lens/fcm-specialist.json) — жизненный цикл токенов, реактивная очистка и путь отправки

    См. также

    • Уведомления — Типы уведомлений, каналы и настройки
    • Схема и миграции для fcm_tokens (например data/schema.sql, data/migrations/fcm_jsonb_schema.sql) в вашем клоне Ring
    • Truth lens FCM-специалиста (AI-LEGIOX/legiox-truth-lens/fcm-specialist.json) — жизненный цикл токенов, реактивная очистка и путь отправки

    См. также

    • Уведомления — Типы уведомлений, каналы и настройки
    • Схема и миграции для fcm_tokens (например data/schema.sql, data/migrations/fcm_jsonb_schema.sql) в вашем клоне Ring
    • Truth lens FCM-специалиста (AI-LEGIOX/legiox-truth-lens/fcm-specialist.json) — жизненный цикл токенов, реактивная очистка и путь отправки