Skip to main content
LadeStack LogoLadeStack
Backend as a Service 8 мин чтения 12 августа 2024 г.

Сравнение BaaS-платформ: архитектурный анализ Firebase, Supabase и Appwrite

Объективное архитектурное сравнение Firebase, Supabase и Appwrite: модели данных, безопасность и RLS, протоколы синхронизации в реальном времени, edge-функции, автономное развертывание и риски vendor lock-in.

Сравнение архитектур Firebase, Supabase и Appwrite

Введение: эволюция платформ Backend-as-a-Service

Платформы Backend-as-a-Service (BaaS) прошли путь от простых инструментов синхронизации мобильных баз данных до комплексных фундаментов для веб- и мобильных систем. Абстрагируя типовую инфраструктуру — управление аутентификацией, хостинг баз данных, авторизацию на стороне клиента, объектное хранилище и serverless compute, — платформы BaaS позволяют командам инженеров сосредоточиться на ключевой бизнес-логике.

Однако выбор конкретного BaaS-движка является фундаментальным архитектурным решением. Миграция с неподходящей платформы на поздних этапах требует глубокого рефакторинга клиентского кода, логики безопасности и схем данных. Сегодня три доминирующих решения представляют принципиально разные парадигмы:

  1. Google Firebase: пионер управляемых облачных BaaS, тесно интегрированный в проприетарную экосистему Google Cloud Platform (GCP).
  2. Supabase: открытая альтернатива Firebase, построенная на базе полноценной реляционной СУБД PostgreSQL со стандартным SQL-инструментарием.
  3. Appwrite: ориентированная на контейнеризацию BaaS-платформа с открытым исходным кодом, созданная для полного контроля инфраструктуры и локального развертывания (self-hosting).

В этом руководстве представлен детальный архитектурный анализ платформ по шести ключевым направлениям: моделирование данных, авторизация, синхронизация в реальном времени, serverless-функции, опыт разработки (DX) и риски привязки к поставщику (vendor lock-in).


1. Архитектурный обзор и философия платформ

┌─────────────────────────────────────────────────────────────────────────────┐
│                          ЛАНДШАФТ ПЛАТФОРМ BAAS                             │
├─────────────────────┬───────────────────────────┬───────────────────────────┤
│   Google Firebase   │         Supabase          │         Appwrite          │
├─────────────────────┼───────────────────────────┼───────────────────────────┤
│ • Проприетарное ПО  │ • Открытый исходный код   │ • Открытый исходный код   │
│ • NoSQL документы   │ • Реляционный PostgreSQL  │ • Документы / Key-Value   │
│ • Полный Managed    │ • Cloud и Self-Hostable   │ • Docker-контейнеры       │
│ • Экосистема GCP    │ • SQL и расширения pg_*   │ • Независимость от облака │
└─────────────────────┴───────────────────────────┴───────────────────────────┘

Firebase: полностью управляемая облачная экосистема

Firebase выступает удобной надстройкой над инфраструктурой Google Cloud. Главный приоритет платформы — масштабирование с нулевыми затратами на обслуживание (Zero-Ops): разработчикам не нужно выделять пулы соединений, конфигурировать серверы или расширять диски. Платой за это является закрытый исходный код хранилищ (Cloud Firestore и Realtime Database).

Supabase: реляционная надежность на базе открытого PostgreSQL

Supabase отказывается от проприетарных механизмов хранения данных. Каждый проект Supabase — это выделенный экземпляр PostgreSQL с возможностями суперпользователя. Он комплектуется компонентом PostgREST для автоматической генерации REST API, GoTrue для авторизации и Realtime для рассылки сообщений через WebSockets. Если разработчик знаком с SQL, он уже готов к работе с Supabase.

Appwrite: модульность контейнеров и автономное развертывание

Appwrite изначально спроектирован для запуска везде, где поддерживается Docker. Платформа объединяет сервисы аутентификации, базы данных, хранилища файлов и выполнения функций в единый набор микросервисов, оркеструемый через Docker Compose. Автономный хостинг является базовым сценарием использования, что делает Appwrite идеальным выбором для проектов с жесткими регуляторными требованиями к хранению персональных данных (152-ФЗ, GDPR).


2. Модели данных и возможности выполнения запросов

Фундаментальное различие между платформами заключается в принципах организации данных:

Параметр Firebase (Firestore) Supabase Appwrite
Движок хранения Cloud Firestore (NoSQL) PostgreSQL (Реляционный) MariaDB / Redis / Custom
Структура Коллекции и документы Таблицы, строки, связи Базы данных, коллекции, документы
Поддержка связей Отсутствует (деномализация) Полный реляционный SQL (JOIN) Внутренние связи (Relationships)
Индексация Автоматические составные индексы B-Tree, GIN, GiST в PostgreSQL Ручное создание индексов
Гибкость запросов Строгие фильтры по индексам Произвольный SQL, CTE, агрегации Структурированный API (Query.equal)

Практические примеры выполнения запросов

Firestore (NoSQL поиск документов)

Запросы в Firestore требуют жесткого соблюдения правил индексации. Фильтры по диапазонам значений в разных полях не могут быть выполнены без явного предварительного построения составного индекса:

import { collection, query, where, getDocs } from 'firebase/firestore';

// Требует создания составного индекса в консоли Firebase
const q = query(
  collection(db, 'invoices'),
  where('tenantId', '==', 'tenant_123'),
  where('status', '==', 'unpaid')
);

const snapshot = await getDocs(q);
const invoices = snapshot.docs.map(doc => ({ id: doc.id, ...doc.data() }));

Supabase (Реляционный SQL через клиент PostgREST)

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

import { supabase } from './supabaseClient';

// Реляционное объединение: получение счетов тенанта вместе с контактами клиента
const { data, error } = await supabase
  .from('invoices')
  .select(`
    id,
    amount_cents,
    status,
    customers (
      name,
      email
    )
  `)
  .eq('tenant_id', 'tenant_123')
  .eq('status', 'unpaid');

Appwrite (Запросы по документам через Query Builder)

Appwrite предлагает типобезопасный программный конструктор запросов по коллекциям документов:

import { Client, Databases, Query } from 'appwrite';

const databases = new Databases(client);

const response = await databases.listDocuments(
  'production_db',
  'invoices_col',
  [
    Query.equal('tenantId', 'tenant_123'),
    Query.equal('status', 'unpaid'),
    Query.limit(50)
  ]
);

3. Модели безопасности и разграничение доступа

Поскольку фронтенд-приложения часто напрямую обращаются к API баз данных, правила авторизации формируют главный рубеж безопасности.

Firebase: Декларативные правила Security Rules

Firestore использует специализированный предметно-ориентированный язык (DSL), исполняемый на серверах Google:

rules_version = '2';
service cloud.firestore {
  match /databases/{database}/documents {
    match /invoices/{invoiceId} {
      // Изоляция данных тенанта на основе утверждений токена
      allow read, write: if request.auth != null 
        && request.auth.token.tenant_id == resource.data.tenantId;
    }
  }
}

Ограничение: При усложнении логики (проверка иерархии ролей в связанных документах) правила становится трудно отлаживать, тестировать и версионировать.

Supabase: Row-Level Security (RLS) в PostgreSQL

Supabase передает управление безопасностью встроенному механизму политик PostgreSQL:

-- Включение механизма Row Level Security
ALTER TABLE invoices ENABLE ROW LEVEL SECURITY;

-- Политика изоляции тенанта с извлечением контекста из JWT-токена
CREATE POLICY tenant_isolation_policy ON invoices
  FOR ALL
  USING (
    tenant_id = (auth.jwt() -> 'app_metadata' ->> 'tenant_id')::uuid
  );

Преимущество: Правила безопасности действуют на уровне ядра СУБД независимо от источника вызова — будь то клиентский SDK, внутренний микросервис или прямое подключение через psql.

Appwrite: Списки разрешений и роли

Appwrite использует интуитивную модель массивов разрешений (Permissions), привязываемых непосредственно к документам:

import { Permission, Role } from 'appwrite';

await databases.createDocument(
  'production_db',
  'invoices_col',
  'unique()',
  { tenantId: 'tenant_123', amount: 5000 },
  [
    Permission.read(Role.team('team_123', 'admin')),
    Permission.update(Role.team('team_123', 'finance')),
    Permission.delete(Role.team('team_123', 'owner')),
  ]
);

4. Архитектура синхронизации данных в реальном времени

Каждая система применяет собственный механизм передачи обновлений на клиентские устройства:

[Firebase] Клиент ◄──── Двунаправленный стрим gRPC/HTTP ───► [Ядро Firestore]
[Supabase] Клиент ◄──── WebSocket (wal2json / pgoutput) ───► [PostgreSQL WAL Engine]
[Appwrite] Клиент ◄──── WebSocket (Redis Pub/Sub) ─────────► [Шлюз Appwrite Realtime]
  1. Firebase: Оптимизированные слушатели снимков (snapshot listeners). При обновлении документа ядро Firestore вычисляет дельту изменений и передает ее по открытому постоянному каналу. Обеспечивает минимальную задержку в мобильных сетях.
  2. Supabase Realtime: Считывает журнал опережающей записи (Write-Ahead Log, WAL) PostgreSQL с помощью плагина логического декодирования pgoutput. Зафиксированные транзакции транслируются через сервер Elixir Phoenix Channels подписчикам по WebSockets.
  3. Appwrite Realtime: Использует кластер Redis Pub/Sub и обработчики WebSockets. При успешной мутации через API событие мгновенно публикуется по сокетам активных клиентов.

5. Вычислительная среда: Serverless и Edge Functions

Сложная бизнес-логика (интеграция платежных систем, генерация документов, обработка вебхуков) требует изолированной среды выполнения:

  • Firebase Cloud Functions: Базируются на инфраструктуре Google Cloud Functions (Node.js, Python). Имеют тесную интеграцию с триггерами событий (onDocumentWritten, onUserCreated). Второе поколение функций на базе Cloud Run обеспечивает параллельную обработку запросов.
  • Supabase Edge Functions: Работают на базе среды Deno и глобальной сети Edge. Отличаются минимальным холодным стартом (<50 мс), нативной поддержкой TypeScript без шага сборки и стандартными Web API (fetch, Request, Response).
  • Appwrite Functions: Исполняются внутри изолированных Docker-контейнеров с поддержкой более 15 сред выполнения (Node.js, Python, PHP, Ruby, Dart, Go, Rust, Swift) и возможностью подключения пользовательских системных библиотек.

6. Автономное развертывание, мобильность данных и Vendor Lock-in

Критерий Google Firebase Supabase Appwrite
Возможность Self-Hosting Невозможна (проприетарный GCP) Высокая (официальный Docker Compose / K8s) Базовый сценарий (Docker в одну команду)
Экспорт данных Экспорт JSON через gcloud Стандартные утилиты pg_dump и psql Дамп MariaDB или экспорт Appwrite CLI
Стоимость смены стека Высокая: переписывание схем и правил Низкая: стандартная СУБД PostgreSQL Умеренная: экспорт документов JSON
Локальная эмуляция Firebase Local Emulator Suite Supabase CLI (локальный PostgreSQL в Docker) Локальный стек контейнеров Appwrite

Если перед проектом стоят строгие требования по суверенитету данных и локализации инфраструктуры, Supabase и Appwrite являются безальтернативными решениями. Используя Supabase, даже при отказе от облачной инфраструктуры компания сохраняет стандартную базу PostgreSQL, готовую к запуску на собственных мощностях.


7. Матрица принятия архитектурных решений

                        Требуется ли реляционная база
                             с SQL и JOIN-запросами?
                                      │
                       ┌──────────────┴──────────────┐
                       │ ДА                          │ НЕТ
                       ▼                             ▼
              [Выбирайте Supabase]         Является ли Self-Hosting
                                             жестким требованием?
                                                     │
                                      ┌──────────────┴──────────────┐
                                      │ ДА                          │ НЕТ
                                      ▼                             ▼
                              [Выбирайте Appwrite]          [Выбирайте Firebase]

Рекомендации по выбору

  • Выбирайте Supabase, если: вы создаете сложный B2B SaaS, финансовую систему или продукт со сложными бизнес-сущностями, где критически важна целостность внешних ключей, представления SQL и специализированные расширения (например, pgvector для семантического поиска).
  • Выбирайте Firebase, если: вы разрабатываете мобильное приложение или MVP в условиях сжатых сроков, где первостепенную роль играет отсутствие затрат на администрирование серверов и бесшовная интеграция с Crashlytics и Google Analytics.
  • Выбирайте Appwrite, если: вам необходим полный контроль над инфраструктурой данных, независимость от провайдеров публичных облаков и удобный унифицированный REST/WebSocket API без необходимости ручного администрирования SQL-серверов.

Заключение и материалы по теме

BaaS-платформы выросли в надежные производственные решения для высоконагруженных систем. Понимание фундаментальных компромиссов между моделями данных и механизмами безопасности на начальном этапе проектирования позволяет избежать дорогостоящих миграций в будущем.

Полезные руководства

More Engineering Articles