Documentation

    Концепції, цінність і типові сценарії

    Ласкаво просимо до Ring
    Швидкий довідник
    Початок роботи
    Передумови
    Встановлення
    Валідація першого успіху
    Наступні кроки
    Функції
    Магазин
    Склад і залишки
    Керування вендорами
    Комісії та розрахунки
    SubscriptionConductor
    PaymentConductor
    Інтеграція платежів
    Інтеграція WayForPay
    Web3 Гаманець
    Реферальні коди (Refcodes)
    NFT Exhibition Marketplace
    Система Стейкінга Токенів
    Сутності
    Можливості
    Повідомлення
    Модуль Новин - Цифровий Газетний Досвід
    Блоги учасників
    Система Резервування Імен Користувачів
    Науковий редактор
    Notifications
    Push-сповіщення через FCM (Ring)
    Email AI-CRM
    Протокол Tunnel
    Authentication
    Безпека та відповідність
    Система локалей
    Мобільний Досвід
    Паттерни Оптимізації Продуктивності
    Приклади
    Швидкий старт
    Білий лейбл
    Інтеграція Web3
    Реальні приклади
    Кастомізація
    Швидкий старт — ваш перший клон Ring
    Повний посібник налаштування
    Брендування
    Теми
    Функції
    Локалізація
    Налаштування токеноміки
    Інтеграція платіжних шлюзів
    Еталонні деплої Ring
    Web3
    Token launch jurisdictions
    Інтеграції
    Ethereum гаманці (Wagmi v3)
    Розгортання
    Self-hosted розгортання
    Vercel
    Docker
    Конфігурація Середовища
    Моніторинг та аналітика
    Оптимізація продуктивності
    Резервне копіювання та відновлення
    Архітектура
    Data Model
    Security
    Real Time
    Архітектура PaymentConductor
    Бекенд Сервіси
    Інтеграція Firebase
    Розробка
    Ring MCP Server

    Швидкий вхід (CTO · аудитори · агенти)

    Вітаємо — місія та аудиторії
    Швидкий довідник
    Початок роботи
    Архітектура та Auth.js
    Режими бекенду та БД (DB_BACKEND_MODE)
    Self-hosted
    Ring MCP Tools
    Ring MCP Server
    Token economics
    Token launch jurisdictions
    Деплой (Docker · k8s)
    Безпека та відповідність
    ringdom.org — база LegioX
    Код — ліцензія MIT (GitHub)

    Documentation

    Концепції, цінність і типові сценарії

    Ласкаво просимо до Ring
    Швидкий довідник
    Початок роботи
    Передумови
    Встановлення
    Валідація першого успіху
    Наступні кроки
    Функції
    Магазин
    Склад і залишки
    Керування вендорами
    Комісії та розрахунки
    SubscriptionConductor
    PaymentConductor
    Інтеграція платежів
    Інтеграція WayForPay
    Web3 Гаманець
    Реферальні коди (Refcodes)
    NFT Exhibition Marketplace
    Система Стейкінга Токенів
    Сутності
    Можливості
    Повідомлення
    Модуль Новин - Цифровий Газетний Досвід
    Блоги учасників
    Система Резервування Імен Користувачів
    Науковий редактор
    Notifications
    Push-сповіщення через FCM (Ring)
    Email AI-CRM
    Протокол Tunnel
    Authentication
    Безпека та відповідність
    Система локалей
    Мобільний Досвід
    Паттерни Оптимізації Продуктивності
    Приклади
    Швидкий старт
    Білий лейбл
    Інтеграція Web3
    Реальні приклади
    Кастомізація
    Швидкий старт — ваш перший клон Ring
    Повний посібник налаштування
    Брендування
    Теми
    Функції
    Локалізація
    Налаштування токеноміки
    Інтеграція платіжних шлюзів
    Еталонні деплої Ring
    Web3
    Token launch jurisdictions
    Інтеграції
    Ethereum гаманці (Wagmi v3)
    Розгортання
    Self-hosted розгортання
    Vercel
    Docker
    Конфігурація Середовища
    Моніторинг та аналітика
    Оптимізація продуктивності
    Резервне копіювання та відновлення
    Архітектура
    Data Model
    Security
    Real Time
    Архітектура PaymentConductor
    Бекенд Сервіси
    Інтеграція Firebase
    Розробка
    Ring MCP Server

    Швидкий вхід (CTO · аудитори · агенти)

    Вітаємо — місія та аудиторії
    Швидкий довідник
    Початок роботи
    Архітектура та Auth.js
    Режими бекенду та БД (DB_BACKEND_MODE)
    Self-hosted
    Ring MCP Tools
    Ring MCP Server
    Token economics
    Token launch jurisdictions
    Деплой (Docker · k8s)
    Безпека та відповідність
    ringdom.org — база LegioX
    Код — ліцензія MIT (GitHub)

    Documentation

    Концепції, цінність і типові сценарії

    Ласкаво просимо до Ring
    Швидкий довідник
    Початок роботи
    Передумови
    Встановлення
    Валідація першого успіху
    Наступні кроки
    Функції
    Магазин
    Склад і залишки
    Керування вендорами
    Комісії та розрахунки
    SubscriptionConductor
    PaymentConductor
    Інтеграція платежів
    Інтеграція WayForPay
    Web3 Гаманець
    Реферальні коди (Refcodes)
    NFT Exhibition Marketplace
    Система Стейкінга Токенів
    Сутності
    Можливості
    Повідомлення
    Модуль Новин - Цифровий Газетний Досвід
    Блоги учасників
    Система Резервування Імен Користувачів
    Науковий редактор
    Notifications
    Push-сповіщення через FCM (Ring)
    Email AI-CRM
    Протокол Tunnel
    Authentication
    Безпека та відповідність
    Система локалей
    Мобільний Досвід
    Паттерни Оптимізації Продуктивності
    Приклади
    Швидкий старт
    Білий лейбл
    Інтеграція Web3
    Реальні приклади
    Кастомізація
    Швидкий старт — ваш перший клон Ring
    Повний посібник налаштування
    Брендування
    Теми
    Функції
    Локалізація
    Налаштування токеноміки
    Інтеграція платіжних шлюзів
    Еталонні деплої Ring
    Web3
    Token launch jurisdictions
    Інтеграції
    Ethereum гаманці (Wagmi v3)
    Розгортання
    Self-hosted розгортання
    Vercel
    Docker
    Конфігурація Середовища
    Моніторинг та аналітика
    Оптимізація продуктивності
    Резервне копіювання та відновлення
    Архітектура
    Data Model
    Security
    Real Time
    Архітектура PaymentConductor
    Бекенд Сервіси
    Інтеграція Firebase
    Розробка
    Ring MCP Server

    Швидкий вхід (CTO · аудитори · агенти)

    Вітаємо — місія та аудиторії
    Швидкий довідник
    Початок роботи
    Архітектура та Auth.js
    Режими бекенду та БД (DB_BACKEND_MODE)
    Self-hosted
    Ring MCP Tools
    Ring MCP Server
    Token economics
    Token launch jurisdictions
    Деплой (Docker · k8s)
    Безпека та відповідність
    ringdom.org — база LegioX
    Код — ліцензія MIT (GitHub)
    Ring Platform Logo

    Loading documentation...

    Preparing Ring Platform content

    Ring Platform Logo

    Loading documentation...

    Preparing Ring Platform content

    Ring Platform Logo

    Loading documentation...

    Preparing Ring Platform content

    Інтеграція Firebase

    Ring Platform використовує Firebase у двох окремих напрямках — серверний Admin SDK для FCM push і серверних операцій, та клієнтський браузерний SDK для реєстрації push-токенів і відображення сповіщень. Ці напрямки використовують різні стратегії облікових даних і різні версії SDK.

    У режимах k8s-postgres-fcm і supabase-fcm Firebase Admin використовується лише для FCM push. Абстракція бази даних (DatabaseService) маршрутизує до PostgreSQL, а не до Firestore. Лише DB_BACKEND_MODE=firebase-full активує Firestore як основне сховище даних.

    Серверні файли

    ФайлПризначенняСтратегія облікових даних
    lib/firebase-admin.server.tsSingleton Firebase Admin SDK — FCM, Auth, Firestore, RTDBЗавжди явний cert() — потребує AUTH_FIREBASE_CLIENT_EMAIL + AUTH_FIREBASE_PRIVATE_KEY
    lib/database/adapters/FirebaseAdapter.tsАбстракція бази даних для Firestore (активний лише в режимі firebase-full)ADC-first — резервний cert() за наявності облікових даних у конфігурації
    lib/services/firebase-service-manager.tsКешовані читання Firestore з використанням React 19 cache(), пакетні операції, транзакціїДелегує до firebase-admin.server.ts
    lib/firebase/build-mock.server.tsІмітація сервісів під час SSG-збірки Next.js — запобігає 22+ зайвим ініціалізаціямПовертає імітації без підключення

    Клієнтські файли

    ФайлПризначення
    public/firebase-messaging-sw.jsService worker — Firebase compat SDK v12.9.0 завантажується з CDN, обробляє push-події та фонові повідомлення

    Файл lib/firebase.ts відсутній — клієнтський Firebase ініціалізується виключно всередині service worker через importScripts() з CDN. Реєстрація FCM-токена в браузері відбувається в React-компонентах за допомогою хука use-fcm.ts всередині FCMProvider.

    Коли мені потрібен Firebase?

    Ваш Ring-клон потребує облікових даних Firebase у двох контекстах:

    1. Push-сповіщення (FCM) — опціонально для всіх значень DB_BACKEND_MODE. Firebase є лише транспортним засобом доставки push; ваші дані додатку залишаються в основній базі даних (PostgreSQL або Firestore).
    2. Повноцінний бекенд Firestore — лише коли DB_BACKEND_MODE=firebase-full. Firebase Admin SDK слугує основною базою даних.

    Якщо вам не потрібні push-сповіщення, ви можете опустити всі змінні середовища Firebase. Платформа працює на одному PostgreSQL.

    Які функції Firebase НЕ використовуються

    • Firebase Authentication (Auth.js v5 обробляє всю автентифікацію — Google, Apple, email, криптогаманець)
    • Firebase Storage (завантаження файлів здійснюється через Vercel Blob або /api/entities/upload)
    • Firebase Realtime Database (не під'єднано до даних додатку; експорт RTDB існує в firebase-admin.server.ts, але не використовується в режимі firebase-full)
    • Firebase Hosting (Ring Platform працює на k3s, Vercel або Docker)
    • FirebaseUI / клієнтський auth SDK (файл lib/firebase.ts відсутній)

    Firebase Admin SDK (firebase-admin.server.ts)

    Admin SDK ініціалізується з явними обліковими даними службового акаунта через cert(). Усі три змінні середовища AUTH_FIREBASE_* є обов'язковими — резервний варіант ADC у цьому файлі відсутній.

    Експорти:

    ЕкспортПовертаєПримітки
    getAdminDb()Firestore або імітаціяПовертає імітацію в режимах postgres-primary та під час збірки
    getAdminAuth()Auth або імітаціяТа ж логіка імітації
    getAdminRtdb()Database або імітаціяRTDB — активно не використовується в маршрутах додатку

    У режимах k8s-postgres-fcm і supabase-fcm усі три повертають з . Імітація задовольняє типи TypeScript, але ніколи не підключається до Firebase. Це запобігає ініціалізації Firebase, коли активний лише PostgreSQL.

    Інтеграція Firebase

    Ring Platform використовує Firebase у двох окремих напрямках — серверний Admin SDK для FCM push і серверних операцій, та клієнтський браузерний SDK для реєстрації push-токенів і відображення сповіщень. Ці напрямки використовують різні стратегії облікових даних і різні версії SDK.

    У режимах k8s-postgres-fcm і supabase-fcm Firebase Admin використовується лише для FCM push. Абстракція бази даних (DatabaseService) маршрутизує до PostgreSQL, а не до Firestore. Лише DB_BACKEND_MODE=firebase-full активує Firestore як основне сховище даних.

    Серверні файли

    ФайлПризначенняСтратегія облікових даних
    lib/firebase-admin.server.tsSingleton Firebase Admin SDK — FCM, Auth, Firestore, RTDBЗавжди явний cert() — потребує AUTH_FIREBASE_CLIENT_EMAIL + AUTH_FIREBASE_PRIVATE_KEY
    lib/database/adapters/FirebaseAdapter.tsАбстракція бази даних для Firestore (активний лише в режимі firebase-full)ADC-first — резервний cert() за наявності облікових даних у конфігурації
    lib/services/firebase-service-manager.tsКешовані читання Firestore з використанням React 19 cache(), пакетні операції, транзакціїДелегує до firebase-admin.server.ts
    lib/firebase/build-mock.server.tsІмітація сервісів під час SSG-збірки Next.js — запобігає 22+ зайвим ініціалізаціямПовертає імітації без підключення

    Клієнтські файли

    ФайлПризначення
    public/firebase-messaging-sw.jsService worker — Firebase compat SDK v12.9.0 завантажується з CDN, обробляє push-події та фонові повідомлення

    Файл lib/firebase.ts відсутній — клієнтський Firebase ініціалізується виключно всередині service worker через importScripts() з CDN. Реєстрація FCM-токена в браузері відбувається в React-компонентах за допомогою хука use-fcm.ts всередині FCMProvider.

    Коли мені потрібен Firebase?

    Ваш Ring-клон потребує облікових даних Firebase у двох контекстах:

    1. Push-сповіщення (FCM) — опціонально для всіх значень DB_BACKEND_MODE. Firebase є лише транспортним засобом доставки push; ваші дані додатку залишаються в основній базі даних (PostgreSQL або Firestore).
    2. Повноцінний бекенд Firestore — лише коли DB_BACKEND_MODE=firebase-full. Firebase Admin SDK слугує основною базою даних.

    Якщо вам не потрібні push-сповіщення, ви можете опустити всі змінні середовища Firebase. Платформа працює на одному PostgreSQL.

    Які функції Firebase НЕ використовуються

    • Firebase Authentication (Auth.js v5 обробляє всю автентифікацію — Google, Apple, email, криптогаманець)
    • Firebase Storage (завантаження файлів здійснюється через Vercel Blob або /api/entities/upload)
    • Firebase Realtime Database (не під'єднано до даних додатку; експорт RTDB існує в firebase-admin.server.ts, але не використовується в режимі firebase-full)
    • Firebase Hosting (Ring Platform працює на k3s, Vercel або Docker)
    • FirebaseUI / клієнтський auth SDK (файл lib/firebase.ts відсутній)

    Firebase Admin SDK (firebase-admin.server.ts)

    Admin SDK ініціалізується з явними обліковими даними службового акаунта через cert(). Усі три змінні середовища AUTH_FIREBASE_* є обов'язковими — резервний варіант ADC у цьому файлі відсутній.

    Експорти:

    ЕкспортПовертаєПримітки
    getAdminDb()Firestore або імітаціяПовертає імітацію в режимах postgres-primary та під час збірки
    getAdminAuth()Auth або імітаціяТа ж логіка імітації
    getAdminRtdb()Database або імітаціяRTDB — активно не використовується в маршрутах додатку

    У режимах k8s-postgres-fcm і supabase-fcm усі три повертають з . Імітація задовольняє типи TypeScript, але ніколи не підключається до Firebase. Це запобігає ініціалізації Firebase, коли активний лише PostgreSQL.

    Інтеграція Firebase

    Ring Platform використовує Firebase у двох окремих напрямках — серверний Admin SDK для FCM push і серверних операцій, та клієнтський браузерний SDK для реєстрації push-токенів і відображення сповіщень. Ці напрямки використовують різні стратегії облікових даних і різні версії SDK.

    У режимах k8s-postgres-fcm і supabase-fcm Firebase Admin використовується лише для FCM push. Абстракція бази даних (DatabaseService) маршрутизує до PostgreSQL, а не до Firestore. Лише DB_BACKEND_MODE=firebase-full активує Firestore як основне сховище даних.

    Серверні файли

    ФайлПризначенняСтратегія облікових даних
    lib/firebase-admin.server.tsSingleton Firebase Admin SDK — FCM, Auth, Firestore, RTDBЗавжди явний cert() — потребує AUTH_FIREBASE_CLIENT_EMAIL + AUTH_FIREBASE_PRIVATE_KEY
    lib/database/adapters/FirebaseAdapter.tsАбстракція бази даних для Firestore (активний лише в режимі firebase-full)ADC-first — резервний cert() за наявності облікових даних у конфігурації
    lib/services/firebase-service-manager.tsКешовані читання Firestore з використанням React 19 cache(), пакетні операції, транзакціїДелегує до firebase-admin.server.ts
    lib/firebase/build-mock.server.tsІмітація сервісів під час SSG-збірки Next.js — запобігає 22+ зайвим ініціалізаціямПовертає імітації без підключення

    Клієнтські файли

    ФайлПризначення
    public/firebase-messaging-sw.jsService worker — Firebase compat SDK v12.9.0 завантажується з CDN, обробляє push-події та фонові повідомлення

    Файл lib/firebase.ts відсутній — клієнтський Firebase ініціалізується виключно всередині service worker через importScripts() з CDN. Реєстрація FCM-токена в браузері відбувається в React-компонентах за допомогою хука use-fcm.ts всередині FCMProvider.

    Коли мені потрібен Firebase?

    Ваш Ring-клон потребує облікових даних Firebase у двох контекстах:

    1. Push-сповіщення (FCM) — опціонально для всіх значень DB_BACKEND_MODE. Firebase є лише транспортним засобом доставки push; ваші дані додатку залишаються в основній базі даних (PostgreSQL або Firestore).
    2. Повноцінний бекенд Firestore — лише коли DB_BACKEND_MODE=firebase-full. Firebase Admin SDK слугує основною базою даних.

    Якщо вам не потрібні push-сповіщення, ви можете опустити всі змінні середовища Firebase. Платформа працює на одному PostgreSQL.

    Які функції Firebase НЕ використовуються

    • Firebase Authentication (Auth.js v5 обробляє всю автентифікацію — Google, Apple, email, криптогаманець)
    • Firebase Storage (завантаження файлів здійснюється через Vercel Blob або /api/entities/upload)
    • Firebase Realtime Database (не під'єднано до даних додатку; експорт RTDB існує в firebase-admin.server.ts, але не використовується в режимі firebase-full)
    • Firebase Hosting (Ring Platform працює на k3s, Vercel або Docker)
    • FirebaseUI / клієнтський auth SDK (файл lib/firebase.ts відсутній)

    Firebase Admin SDK (firebase-admin.server.ts)

    Admin SDK ініціалізується з явними обліковими даними службового акаунта через cert(). Усі три змінні середовища AUTH_FIREBASE_* є обов'язковими — резервний варіант ADC у цьому файлі відсутній.

    Експорти:

    ЕкспортПовертаєПримітки
    getAdminDb()Firestore або імітаціяПовертає імітацію в режимах postgres-primary та під час збірки
    getAdminAuth()Auth або імітаціяТа ж логіка імітації
    getAdminRtdb()Database або імітаціяRTDB — активно не використовується в маршрутах додатку

    У режимах k8s-postgres-fcm і supabase-fcm усі три повертають з . Імітація задовольняє типи TypeScript, але ніколи не підключається до Firebase. Це запобігає ініціалізації Firebase, коли активний лише PostgreSQL.

    імітації
    build-mock.server.ts

    Очищення змінних середовища (важливо):

    SDK агресивно очищає вхідні дані змінних середовища — видаляє зовнішні лапки, перетворює \\n на реальні нові рядки, обрізає пробіли. Узгодженість подвійних лапок у env.local.template для AUTH_FIREBASE_PRIVATE_KEY є навмисною:

    FirebaseAdapter (FirebaseAdapter.ts)

    FirebaseAdapter реалізує IDatabaseService і використовується лише коли DB_BACKEND_MODE=firebase-full. За замовчуванням він використовує Application Default Credentials (ADC):

    Адаптер надає стандартний контракт DatabaseService:

    firebase-service-manager (firebase-service-manager.ts)

    Надає кешовані операції Firebase з використанням React 19 cache() для дедуплікації на один запит. Використовується лише коли getAdminDb() повертає реальний (не імітований) екземпляр Firestore.

    Ключові експорти:

    ЕкспортОпис
    getCachedDocument(collection, docId)Одиничний документ з дедуплікацією через cache()
    getCachedCollection(collection, options)Запит колекції з кешуванням
    getCachedDocumentBatch(requests)Пакетне отримання кількох документів
    getCachedCollectionAdvanced(collection, queryConfig)Складні запити (where, orderBy, paginate)
    getCachedSubcollection(parentCol, parentId, subCol, options)Запити вкладених колекцій
    getCachedCollectionGroup(collectionId, options)Міжколекційні запити
    createDocument, updateDocument, deleteDocumentОперації запису (без кешування)
    createBatchWriter / executeBatchПакетний запис
    runTransactionАтомні транзакції
    getCacheMetrics / logCachePerformanceНалагоджувальні метрики (лише для розробки)

    Оптимізація на етапі збірки: Усі кешовані функції викликаються лише коли getAdminDb() повертає реальний Firestore. Під час збірки (SSG) методи імітованого Firestore повертають порожні результати, а шар cache() дедуплікує в межах кожного запиту.

    Імітація на етапі збірки (build-mock.server.ts)

    Під час статичної генерації Next.js (NEXT_PHASE=phase-production-build) виклики Firebase Admin перехоплюються імітованими сервісами:

    Це запобігає приблизно 22 зайвим ініціалізаціям Firebase Admin під час SSG і скорочує час збірки приблизно на 31%.

    Клієнтський Firebase (FCM service worker)

    Service worker за адресою public/firebase-messaging-sw.js завантажує Firebase compat SDK v12.9.0 з Google CDN:

    Service worker підтримує впроваджену під час виконання конфігурацію Firebase через змінні self.* (встановлюються заповнювачами env.local.template на етапі збірки або впроваджуються в розгортаннях k8s).

    Процес реєстрації FCM-токена:

    1. React-компонент 'use client' викликає Notification.requestPermission()
    2. Після надання дозволу викликає getToken(messaging, { vapidKey })
    3. Токен зберігається через Server Action upsertFcmToken до основної бази даних (PostgreSQL або Firestore залежно від DB_BACKEND_MODE)
    4. При виході з системи useAuth().signOut() викликає unregisterCurrentDeviceFcmToken(), яка запускає deleteToken Firebase + інвалідацію на стороні сервера

    Змінні середовища

    Admin SDK (серверна частина)

    Client SDK (браузерна частина)

    Ключові відмінності між двома напрямками Firebase

    АспектAdmin SDK (firebase-admin.server.ts)Адаптер (FirebaseAdapter.ts)
    Облікові даніЗавжди явний cert()ADC-first, резервний cert()
    Змінні середовищаУсі 3 AUTH_FIREBASE_* обов'язковіЛише AUTH_FIREBASE_PROJECT_ID для ADC
    Активний уУсі значення DB_BACKEND_MODE (FCM)Лише firebase-full
    Імітація у postgres-primaryТак — повертає імітовані Firestore/AuthНі — адаптер не зареєстровано
    Шлях імпортуfirebase-admin/app, firebase-admin/firestoreТе саме
    Версіяv14 (іменовані підшляхи імпорту)v14

    Пов'язана документація

    Режими бекенду

    Push-сповіщення (FCM)

    Змінні середовища

    Автентифікація

    bash
    
    AUTH_FIREBASE_PRIVATE_KEY="-----BEGIN PRIVATE KEY-----\nMIIEvQ...\n-----END PRIVATE KEY-----\n"
    bash
    
    # Обов'язкові для FCM + ініціалізації Firebase Admin (усі три):
    AUTH_FIREBASE_PROJECT_ID=your_firebase_project_id
    AUTH_FIREBASE_CLIENT_EMAIL=your_firebase_client_email
    AUTH_FIREBASE_PRIVATE_KEY="-----BEGIN PRIVATE KEY-----\n...\n-----END PRIVATE KEY-----\n"
    
    # Опціонально:
    FIREBASE_DATABASE_URL=https://your-project-default-rtdb.firebaseio.com
    FIREBASE_PRIVATE_KEY_ID=your_firebase_private_key_id
    FIREBASE_CLIENT_ID="your_firebase_client_id"
    FIREBASE_FIRESTORE_DEBUG=true
    bash
    
    NEXT_PUBLIC_FIREBASE_API_KEY=your_api_key
    NEXT_PUBLIC_FIREBASE_AUTH_DOMAIN=your_auth_domain
    NEXT_PUBLIC_FIREBASE_PROJECT_ID=your_firebase_project_id
    NEXT_PUBLIC_FIREBASE_STORAGE_BUCKET=your_storage_bucket
    NEXT_PUBLIC_FIREBASE_MESSAGING_SENDER_ID=your_messaging_sender_id
    NEXT_PUBLIC_FIREBASE_APP_ID=your_app_id
    NEXT_PUBLIC_FIREBASE_MEASUREMENT_ID=G-YCZKPV315E
    NEXT_PUBLIC_FIREBASE_VAPID_KEY=your_vapid_key
    імітації
    build-mock.server.ts

    Очищення змінних середовища (важливо):

    SDK агресивно очищає вхідні дані змінних середовища — видаляє зовнішні лапки, перетворює \\n на реальні нові рядки, обрізає пробіли. Узгодженість подвійних лапок у env.local.template для AUTH_FIREBASE_PRIVATE_KEY є навмисною:

    FirebaseAdapter (FirebaseAdapter.ts)

    FirebaseAdapter реалізує IDatabaseService і використовується лише коли DB_BACKEND_MODE=firebase-full. За замовчуванням він використовує Application Default Credentials (ADC):

    Адаптер надає стандартний контракт DatabaseService:

    firebase-service-manager (firebase-service-manager.ts)

    Надає кешовані операції Firebase з використанням React 19 cache() для дедуплікації на один запит. Використовується лише коли getAdminDb() повертає реальний (не імітований) екземпляр Firestore.

    Ключові експорти:

    ЕкспортОпис
    getCachedDocument(collection, docId)Одиничний документ з дедуплікацією через cache()
    getCachedCollection(collection, options)Запит колекції з кешуванням
    getCachedDocumentBatch(requests)Пакетне отримання кількох документів
    getCachedCollectionAdvanced(collection, queryConfig)Складні запити (where, orderBy, paginate)
    getCachedSubcollection(parentCol, parentId, subCol, options)Запити вкладених колекцій
    getCachedCollectionGroup(collectionId, options)Міжколекційні запити
    createDocument, updateDocument, deleteDocumentОперації запису (без кешування)
    createBatchWriter / executeBatchПакетний запис
    runTransactionАтомні транзакції
    getCacheMetrics / logCachePerformanceНалагоджувальні метрики (лише для розробки)

    Оптимізація на етапі збірки: Усі кешовані функції викликаються лише коли getAdminDb() повертає реальний Firestore. Під час збірки (SSG) методи імітованого Firestore повертають порожні результати, а шар cache() дедуплікує в межах кожного запиту.

    Імітація на етапі збірки (build-mock.server.ts)

    Під час статичної генерації Next.js (NEXT_PHASE=phase-production-build) виклики Firebase Admin перехоплюються імітованими сервісами:

    Це запобігає приблизно 22 зайвим ініціалізаціям Firebase Admin під час SSG і скорочує час збірки приблизно на 31%.

    Клієнтський Firebase (FCM service worker)

    Service worker за адресою public/firebase-messaging-sw.js завантажує Firebase compat SDK v12.9.0 з Google CDN:

    Service worker підтримує впроваджену під час виконання конфігурацію Firebase через змінні self.* (встановлюються заповнювачами env.local.template на етапі збірки або впроваджуються в розгортаннях k8s).

    Процес реєстрації FCM-токена:

    1. React-компонент 'use client' викликає Notification.requestPermission()
    2. Після надання дозволу викликає getToken(messaging, { vapidKey })
    3. Токен зберігається через Server Action upsertFcmToken до основної бази даних (PostgreSQL або Firestore залежно від DB_BACKEND_MODE)
    4. При виході з системи useAuth().signOut() викликає unregisterCurrentDeviceFcmToken(), яка запускає deleteToken Firebase + інвалідацію на стороні сервера

    Змінні середовища

    Admin SDK (серверна частина)

    Client SDK (браузерна частина)

    Ключові відмінності між двома напрямками Firebase

    АспектAdmin SDK (firebase-admin.server.ts)Адаптер (FirebaseAdapter.ts)
    Облікові даніЗавжди явний cert()ADC-first, резервний cert()
    Змінні середовищаУсі 3 AUTH_FIREBASE_* обов'язковіЛише AUTH_FIREBASE_PROJECT_ID для ADC
    Активний уУсі значення DB_BACKEND_MODE (FCM)Лише firebase-full
    Імітація у postgres-primaryТак — повертає імітовані Firestore/AuthНі — адаптер не зареєстровано
    Шлях імпортуfirebase-admin/app, firebase-admin/firestoreТе саме
    Версіяv14 (іменовані підшляхи імпорту)v14

    Пов'язана документація

    Режими бекенду

    Push-сповіщення (FCM)

    Змінні середовища

    Автентифікація

    bash
    
    AUTH_FIREBASE_PRIVATE_KEY="-----BEGIN PRIVATE KEY-----\nMIIEvQ...\n-----END PRIVATE KEY-----\n"
    bash
    
    # Обов'язкові для FCM + ініціалізації Firebase Admin (усі три):
    AUTH_FIREBASE_PROJECT_ID=your_firebase_project_id
    AUTH_FIREBASE_CLIENT_EMAIL=your_firebase_client_email
    AUTH_FIREBASE_PRIVATE_KEY="-----BEGIN PRIVATE KEY-----\n...\n-----END PRIVATE KEY-----\n"
    
    # Опціонально:
    FIREBASE_DATABASE_URL=https://your-project-default-rtdb.firebaseio.com
    FIREBASE_PRIVATE_KEY_ID=your_firebase_private_key_id
    FIREBASE_CLIENT_ID="your_firebase_client_id"
    FIREBASE_FIRESTORE_DEBUG=true
    bash
    
    NEXT_PUBLIC_FIREBASE_API_KEY=your_api_key
    NEXT_PUBLIC_FIREBASE_AUTH_DOMAIN=your_auth_domain
    NEXT_PUBLIC_FIREBASE_PROJECT_ID=your_firebase_project_id
    NEXT_PUBLIC_FIREBASE_STORAGE_BUCKET=your_storage_bucket
    NEXT_PUBLIC_FIREBASE_MESSAGING_SENDER_ID=your_messaging_sender_id
    NEXT_PUBLIC_FIREBASE_APP_ID=your_app_id
    NEXT_PUBLIC_FIREBASE_MEASUREMENT_ID=G-YCZKPV315E
    NEXT_PUBLIC_FIREBASE_VAPID_KEY=your_vapid_key
    імітації
    build-mock.server.ts

    Очищення змінних середовища (важливо):

    SDK агресивно очищає вхідні дані змінних середовища — видаляє зовнішні лапки, перетворює \\n на реальні нові рядки, обрізає пробіли. Узгодженість подвійних лапок у env.local.template для AUTH_FIREBASE_PRIVATE_KEY є навмисною:

    FirebaseAdapter (FirebaseAdapter.ts)

    FirebaseAdapter реалізує IDatabaseService і використовується лише коли DB_BACKEND_MODE=firebase-full. За замовчуванням він використовує Application Default Credentials (ADC):

    Адаптер надає стандартний контракт DatabaseService:

    firebase-service-manager (firebase-service-manager.ts)

    Надає кешовані операції Firebase з використанням React 19 cache() для дедуплікації на один запит. Використовується лише коли getAdminDb() повертає реальний (не імітований) екземпляр Firestore.

    Ключові експорти:

    ЕкспортОпис
    getCachedDocument(collection, docId)Одиничний документ з дедуплікацією через cache()
    getCachedCollection(collection, options)Запит колекції з кешуванням
    getCachedDocumentBatch(requests)Пакетне отримання кількох документів
    getCachedCollectionAdvanced(collection, queryConfig)Складні запити (where, orderBy, paginate)
    getCachedSubcollection(parentCol, parentId, subCol, options)Запити вкладених колекцій
    getCachedCollectionGroup(collectionId, options)Міжколекційні запити
    createDocument, updateDocument, deleteDocumentОперації запису (без кешування)
    createBatchWriter / executeBatchПакетний запис
    runTransactionАтомні транзакції
    getCacheMetrics / logCachePerformanceНалагоджувальні метрики (лише для розробки)

    Оптимізація на етапі збірки: Усі кешовані функції викликаються лише коли getAdminDb() повертає реальний Firestore. Під час збірки (SSG) методи імітованого Firestore повертають порожні результати, а шар cache() дедуплікує в межах кожного запиту.

    Імітація на етапі збірки (build-mock.server.ts)

    Під час статичної генерації Next.js (NEXT_PHASE=phase-production-build) виклики Firebase Admin перехоплюються імітованими сервісами:

    Це запобігає приблизно 22 зайвим ініціалізаціям Firebase Admin під час SSG і скорочує час збірки приблизно на 31%.

    Клієнтський Firebase (FCM service worker)

    Service worker за адресою public/firebase-messaging-sw.js завантажує Firebase compat SDK v12.9.0 з Google CDN:

    Service worker підтримує впроваджену під час виконання конфігурацію Firebase через змінні self.* (встановлюються заповнювачами env.local.template на етапі збірки або впроваджуються в розгортаннях k8s).

    Процес реєстрації FCM-токена:

    1. React-компонент 'use client' викликає Notification.requestPermission()
    2. Після надання дозволу викликає getToken(messaging, { vapidKey })
    3. Токен зберігається через Server Action upsertFcmToken до основної бази даних (PostgreSQL або Firestore залежно від DB_BACKEND_MODE)
    4. При виході з системи useAuth().signOut() викликає unregisterCurrentDeviceFcmToken(), яка запускає deleteToken Firebase + інвалідацію на стороні сервера

    Змінні середовища

    Admin SDK (серверна частина)

    Client SDK (браузерна частина)

    Ключові відмінності між двома напрямками Firebase

    АспектAdmin SDK (firebase-admin.server.ts)Адаптер (FirebaseAdapter.ts)
    Облікові даніЗавжди явний cert()ADC-first, резервний cert()
    Змінні середовищаУсі 3 AUTH_FIREBASE_* обов'язковіЛише AUTH_FIREBASE_PROJECT_ID для ADC
    Активний уУсі значення DB_BACKEND_MODE (FCM)Лише firebase-full
    Імітація у postgres-primaryТак — повертає імітовані Firestore/AuthНі — адаптер не зареєстровано
    Шлях імпортуfirebase-admin/app, firebase-admin/firestoreТе саме
    Версіяv14 (іменовані підшляхи імпорту)v14

    Пов'язана документація

    Режими бекенду

    Push-сповіщення (FCM)

    Змінні середовища

    Автентифікація

    bash
    
    AUTH_FIREBASE_PRIVATE_KEY="-----BEGIN PRIVATE KEY-----\nMIIEvQ...\n-----END PRIVATE KEY-----\n"
    bash
    
    # Обов'язкові для FCM + ініціалізації Firebase Admin (усі три):
    AUTH_FIREBASE_PROJECT_ID=your_firebase_project_id
    AUTH_FIREBASE_CLIENT_EMAIL=your_firebase_client_email
    AUTH_FIREBASE_PRIVATE_KEY="-----BEGIN PRIVATE KEY-----\n...\n-----END PRIVATE KEY-----\n"
    
    # Опціонально:
    FIREBASE_DATABASE_URL=https://your-project-default-rtdb.firebaseio.com
    FIREBASE_PRIVATE_KEY_ID=your_firebase_private_key_id
    FIREBASE_CLIENT_ID="your_firebase_client_id"
    FIREBASE_FIRESTORE_DEBUG=true
    bash
    
    NEXT_PUBLIC_FIREBASE_API_KEY=your_api_key
    NEXT_PUBLIC_FIREBASE_AUTH_DOMAIN=your_auth_domain
    NEXT_PUBLIC_FIREBASE_PROJECT_ID=your_firebase_project_id
    NEXT_PUBLIC_FIREBASE_STORAGE_BUCKET=your_storage_bucket
    NEXT_PUBLIC_FIREBASE_MESSAGING_SENDER_ID=your_messaging_sender_id
    NEXT_PUBLIC_FIREBASE_APP_ID=your_app_id
    NEXT_PUBLIC_FIREBASE_MEASUREMENT_ID=G-YCZKPV315E
    NEXT_PUBLIC_FIREBASE_VAPID_KEY=your_vapid_key
    1. Документація
    2. /Бекенд Сервіси
    3. /Інтеграція Firebase

    Оновлено 28 черв. 2026 р.5 хв прослуховування

    1. Документація
    2. /Бекенд Сервіси
    3. /Інтеграція Firebase

    Оновлено 28 черв. 2026 р.5 хв прослуховування

    1. Документація
    2. /Бекенд Сервіси
    3. /Інтеграція Firebase

    Оновлено 28 черв. 2026 р.5 хв прослуховування