Documentation

    Documentation

    Documentation

    Ring Platform Logo

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

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

    Ring Platform Logo

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

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

    Ring Platform Logo

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

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

    1. /
    2. /Інтеграція Firebase

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

    1. /
    2. /Інтеграція Firebase

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

    1. /
    2. /Інтеграція Firebase

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

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

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

    Швидкий вхід (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
    Швидкий довідник
    Початок роботи
    Передумови
    Встановлення
    Валідація першого успіху
    Наступні кроки
    Архітектура
    Data Model
    Real Time
    Security
    Бекенд Сервіси
    Режим k8s-postgres-fcm
    Інтеграція Firebase
    Функції
    Authentication
    Email AI-CRM
    Сутності
    Можливості
    Повідомлення
    Notifications
    Push-сповіщення через FCM (Ring)
    Протокол Tunnel
    Web3 Гаманець
    Магазин
    Реферальні коди (Refcodes)
    Інтеграція платежів
    PaymentConductor
    SubscriptionConductor
    Модуль Новин - Цифровий Газетний Досвід
    Блоги учасників
    Система Резервування Імен Користувачів
    Науковий редактор
    Система локалей
    Безпека та відповідність
    NFT Маркетплейс
    Система Стейкінга Токенів
    Паттерни Оптимізації Продуктивності
    Мобільний Досвід
    API-інтерфейс
    Аутентифікація
    Email AI-CRM API
    Entities
    Можливості
    API повідомлень
    API повідомлень
    Гаманець
    API магазину
    API адміністратора
    Кастомізація
    Швидкий старт — ваш перший клон Ring
    Повний посібник налаштування
    Налаштування токеноміки
    Інтеграція платіжних шлюзів
    Еталонні деплої Ring
    Брендування
    Теми
    Web3
    Token launch jurisdictions
    Розгортання
    Self-hosted розгортання
    Vercel
    Docker
    Моніторинг та аналітика
    Оптимізація продуктивності
    Резервне копіювання та відновлення
    Розробка
    Локальне налаштування
    Структура коду
    Компоненти документації
    Community tooling
    Ring MCP Server
    Генеративні зображення (ImageConductor)
    Автономна редакція (Grok)
    OSS vs enterprise
    Найкращі практики
    Workflow
    Code Style
    Продуктивність
    Тестування
    Розгортання
    Налагодження
    Співпраця
    Приклади
    Швидкий старт
    Білий лейбл
    Реальні приклади
    Інтеграції
    Ethereum гаманці (Wagmi v3)

    Швидкий вхід (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
    Швидкий довідник
    Початок роботи
    Передумови
    Встановлення
    Валідація першого успіху
    Наступні кроки
    Архітектура
    Data Model
    Real Time
    Security
    Бекенд Сервіси
    Режим k8s-postgres-fcm
    Інтеграція Firebase
    Функції
    Authentication
    Email AI-CRM
    Сутності
    Можливості
    Повідомлення
    Notifications
    Push-сповіщення через FCM (Ring)
    Протокол Tunnel
    Web3 Гаманець
    Магазин
    Реферальні коди (Refcodes)
    Інтеграція платежів
    PaymentConductor
    SubscriptionConductor
    Модуль Новин - Цифровий Газетний Досвід
    Блоги учасників
    Система Резервування Імен Користувачів
    Науковий редактор
    Система локалей
    Безпека та відповідність
    NFT Маркетплейс
    Система Стейкінга Токенів
    Паттерни Оптимізації Продуктивності
    Мобільний Досвід
    API-інтерфейс
    Аутентифікація
    Email AI-CRM API
    Entities
    Можливості
    API повідомлень
    API повідомлень
    Гаманець
    API магазину
    API адміністратора
    Кастомізація
    Швидкий старт — ваш перший клон Ring
    Повний посібник налаштування
    Налаштування токеноміки
    Інтеграція платіжних шлюзів
    Еталонні деплої Ring
    Брендування
    Теми
    Web3
    Token launch jurisdictions
    Розгортання
    Self-hosted розгортання
    Vercel
    Docker
    Моніторинг та аналітика
    Оптимізація продуктивності
    Резервне копіювання та відновлення
    Розробка
    Локальне налаштування
    Структура коду
    Компоненти документації
    Community tooling
    Ring MCP Server
    Генеративні зображення (ImageConductor)
    Автономна редакція (Grok)
    OSS vs enterprise
    Найкращі практики
    Workflow
    Code Style
    Продуктивність
    Тестування
    Розгортання
    Налагодження
    Співпраця
    Приклади
    Швидкий старт
    Білий лейбл
    Реальні приклади
    Інтеграції
    Ethereum гаманці (Wagmi v3)

    Швидкий вхід (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)
    Документація
    Бекенд Сервіси
    Документація
    Бекенд Сервіси
    Документація
    Бекенд Сервіси

    Інтеграція 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 усі три повертають імітації з build-mock.server.ts. Імітація задовольняє типи 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 усі три повертають імітації з build-mock.server.ts. Імітація задовольняє типи 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 усі три повертають імітації з build-mock.server.ts. Імітація задовольняє типи TypeScript, але ніколи не підключається до Firebase. Це запобігає ініціалізації Firebase, коли активний лише PostgreSQL.

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

    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
    Очищення змінних середовища (важливо):

    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
    Очищення змінних середовища (важливо):

    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