время чтения : 12 minutes

Вместо того чтобы выбирать между простотой Supabase и мощью Spring Boot, почему бы не объединить оба? Узнайте о гибридной архитектуре, которая использует лучшее из каждой технологии.

Table of Contents

Ложная дилемма современной архитектуры

При построении современного приложения со статическим фронтендом мы часто сталкиваемся с бинарным выбором:

  • Ставь всё на решение Backend-as-a-Service(Supabase, Firebase) - простая, но ограниченная

  • Создать полноценный бэкенд(Spring Boot, Node.js) - мощный но сложный

Этот выбор — ложная дилемма. Гибридная архитектура предлагает третий путь: использовать каждую технологию там, где она преуспевает.

Архитектурное видение

Традиционная архитектура: монолитная

@startuml
skinparam backgroundColor #FEFEFE
skinparam componentStyle rectangle

package "Традиционная архитектура" {
  actor Utilisateur as user
  component "Фронтенд" as frontend #LightBlue
  component "Монолитный бэкенд" as backend #LightCoral {
    [Authentification]
    [CRUD]
    [Logique Métier]
    [Jobs]
    [APIs Tierces]
  }
  database "База данных" as db #LightGray

  user --> frontend
  frontend --> backend : Toutes les requêtes
  backend --> db
}

note right of backend
Всё проходит через бэкенд,
даже простые операции
⚠️ Единая точка отказа
⚠️ Сложность с самого начала
⚠️ Сильная связанность
end note
@enduml

В этом подходе даже самые простые операции (чтение статьи, создание комментария) должны проходить через ваш бекенд. Вы платите за сложность уже с первого дня.

Архитектура BaaS: Любой делегат

@startuml
skinparam backgroundColor #FEFEFE
skinparam componentStyle rectangle

package "Архитектура Pure BaaS" {
  actor Utilisateur as user
  component "Frontend" as frontend #LightBlue
  cloud "Supabase / Firebase" as baas #LightGreen {
    [Auth]
    [Database]
    [Storage]
    [Edge Functions]
  }

  user --> frontend
  frontend --> baas : Toutes les opérations
}

note right of baas
Быстрая разработка
Нет необходимости управлять сервером
⚠️ Ограничено для сложной логики
⚠️ Привязка к вендору (Vendor lock-in)
⚠️ Ограничения Edge Functions
end note
@enduml

С другой стороны, делегировать всё BaaS кажется привлекательным в начале, но быстро проявляет свои ограничения, как только бизнес-логика усложняется.

Гибридная архитектура: разделение обязанностей

@startuml
skinparam backgroundColor #FEFEFE
skinparam componentStyle rectangle

actor Utilisateur as user #LightBlue

package "Frontend-слой" {
  component "Статический сайт JBake" as frontend #SkyBlue
}

package "Простой слой (Supabase)" #LightGreen {
  component "Аутентификация" as auth
  component "Базовый CRUD" as crud
  component "Хранилище файлов" as storage
  component "Режим реального времени" as realtime
}

package "Бизнес-слой (Spring Boot)" #Coral {
  component "Сложная логика" as logic
  component "Оркестрация" as orchestration
  component "Запланированные задания" as jobs
  component "Интеграции" as integrations
}

database "Общий PostgreSQL" as db #LightGray

user --> frontend

frontend --> auth : OAuth2, JWT
frontend --> crud : Articles, Profils
frontend --> storage : Images, Fichiers
frontend --> realtime : Notifications

frontend --> logic : Calculs, Rapports
frontend --> orchestration : Workflows
logic --> integrations : Stripe, APIs
orchestration --> db
jobs --> db

crud --> db
auth --> db

note bottom of db
**Единый источник истины**
Общий для Supabase и Spring Boot
end note

note right of auth
**Бесплатно до 50k пользователей**
Настройка в несколько кликов
OAuth2 multi-providers
end note

note right of logic
**Активируется только при необходимости**
Kotlin + Coroutines
Сложные транзакции
end note
@enduml

Гибридная архитектура четко разделяет ответственности в зависимости от сложности и характера операций.

Принципы проектирования

Принцип 1 : Начать просто, развиваться умно

@startuml
skinparam backgroundColor #FEFEFE

rectangle "**Этап 1: MVP**" #LightGreen {
  component "JBake + Supabase" as mvp
  note right
✓ Разработка в днях
✓ Стоимость: 0€
✓ Валидация концепта
  end note
}

rectangle "**Этап 2: Рост**" #LightYellow {
  component "JBake + Supabase\n+ Spring Boot (опционально)" as growth
  note right
✓ Бизнес-логика формируется
✓ Первые запланированные задания
✓ Сторонние интеграции
  end note
}

rectangle "**Этап 3: Масштабирование**" #LightCoral {
  component "Полная архитектура" as scale
  note right
✓ Сложная оркестрация
✓ Оптимизированная производительность
✓ Распределенный кэш
  end note
}

mvp -down-> growth : Quand la complexité\nle justifie
growth -down-> scale : Optimisation\ncontinue
@enduml

Не стройте Spring Boot, если вам это не нужно.Начните с Supabase, добавьте Spring Boot, когда сложность оправдывает это.

Принцип 2: Разделение по характеру операции

@startmindmap
skinparam backgroundColor #FEFEFE
* Opérations\nApplicatives

left side

** Opérations Simples\n(Supabase)
***_ CRUD Standard
****_ Lecture
****_ Création
****_ Mise à jour
****_ Suppression
***_ Authentification
****_ Login/Logout
****_ OAuth2
****_ Gestion session
***_ Stockage
****_ Upload fichiers
****_ CDN automatique
***_ Temps Réel
****_ WebSocket
****_ Notifications

right side

** Opérations Complexes\n(Spring Boot)
***_ Logique Métier
****_ Calculs complexes
****_ Règles métier
****_ Validations avancées
***_ Orchestration
****_ Multi-services
****_ Transactions distribuées
****_ Saga patterns
***_ Tâches Planifiées
****_ Rapports périodiques
****_ Synchronisations
****_ Nettoyages
***_ Intégrations
****_ Paiements (Stripe)
****_ APIs tierces
****_ Services ML/AI

@endmindmap

Принцип 3 : Единственный источник истины

@startuml
skinparam backgroundColor #FEFEFE

database "PostgreSQL" as db #LightGray {
  package "Схема: auth (Supabase)" #LightGreen {
    [users]
    [sessions]
    [identities]
  }

  package "Схема: public (Общая)" #SkyBlue {
    [articles]
    [comments]
    [profiles]
  }

  package "Схема: business (Spring Boot)" #Coral {
    [orders]
    [payments]
    [reports]
  }
}

component "Supabase" as supabase #LightGreen
component "Spring Boot" as spring #Coral

supabase -down-> users : Gère
supabase -down-> sessions : Gère
supabase -down-> articles : Accède
supabase -down-> comments : Accède
supabase -down-> profiles : Accède

spring -down-> articles : Accède
spring -down-> profiles : Accède
spring -down-> orders : Gère
spring -down-> payments : Gère
spring -down-> reports : Gère

note right of db
**Преимущества:**
• Нет сложной синхронизации
• Возможны JOIN-ы между таблицами
• Гарантированная согласованность
• Унифицированные миграции
end note
@enduml

Используя один и тот же экземпляр PostgreSQL, Supabase и Spring Boot работают с одними и теми же данными без сложной синхронизации.

Оркестрование потоков

Поток 1: Централизованная аутентификация

@startuml
skinparam backgroundColor #FEFEFE
autonumber

actor "Пользователь" as user
participant "JBake" as jbake
participant "Supabase Auth" as auth
participant "Spring Boot" as spring
database "PostgreSQL" as db

== Authentification ==
user -> jbake : Clique "Войти"
jbake -> auth : Redirect OAuth2 (Google/GitHub)
auth -> user : Consent screen
user -> auth : Autorise
auth -> auth : Génère JWT
auth -> jbake : Retourne JWT + Refresh Token
jbake -> jbake : Stocke tokens (sessionStorage)

== Accès aux Ressources ==
group Opération Simple (CRUD)
  user -> jbake : Crée un article
  jbake -> db : POST avec JWT
  note right: Supabase Row Level Security\nавтоматически проверяет JWT
  db -> jbake : Article créé
end

group Opération Complexe (Métier)
  user -> jbake : Génère un rapport
  jbake -> spring : POST /api/reports\navec JWT
  spring -> spring : Valide JWT Supabase
  spring -> spring : Extrait claims (user_id, roles)
  spring -> db : Requêtes complexes
  spring -> jbake : Rapport généré
end

note over auth, spring
**JWT универсален**
Валидируется и Supabase, И Spring Boot
Без двойной аутентификации
end note
@enduml

Ключевой пункт: Один процесс аутентификации, один JWT, пригодный для использования везде.

Поток 2: Оркестрация сложного бизнес-процесса

@startuml
skinparam backgroundColor #FEFEFE
autonumber

actor "Клиент" as user
participant "JBake" as jbake
participant "Spring Boot" as spring
participant "Supabase DB" as supadb
participant "Stripe API" as stripe
participant "Сервис инвентаризации" as inventory
participant "Сервис электронной почты" as email
database "PostgreSQL" as db

user -> jbake : Passe commande
jbake -> spring : POST /api/orders/create

== Orchestration Spring Boot ==
spring -> db : BEGIN TRANSACTION

par Vérifications Parallèles
  spring -> inventory : Vérifier stock
  inventory -> spring : Stock OK
else
  spring -> db : Vérifier profil client
  db -> spring : Client vérifié
end

spring -> stripe : Créer Payment Intent
stripe -> spring : Intent créé (ID: pi_xxx)

spring -> db : Créer Order (status: PENDING)
db -> spring : Order créé

spring -> stripe : Confirmer paiement
stripe -> spring : Paiement confirmé

spring -> db : Update Order (status: PAID)
spring -> inventory : Décrémenter stock
spring -> db : COMMIT TRANSACTION

par Notifications Asynchrones
  spring -> email : Email confirmation
else
  spring -> supadb : Insert notification
  note right: Уведомления в реальном времени\nчерез Supabase Realtime
end

spring -> jbake : Order confirmé
jbake -> user : Affiche confirmation

note over spring
**Обязанности Spring Boot:**
• ACID-транзакции
• Оркестрация нескольких сервисов
• Автоматический откат при ошибке
• Обработка граничных случаев
end note
@enduml

Что Spring Boot приносит: Надёжная оркестровка сложных процессов, затрагивающих несколько систем, с гарантией транзакционной целостности.

Поток 3 : Запланированные задания и синхронизации

@startuml
skinparam backgroundColor #FEFEFE

participant "Планировщик\n(Spring Boot)" as scheduler
participant "Сервис отчетов" as report
participant "PostgreSQL" as db
participant "Внешний API" as api
participant "Сервис электронной почты" as email
participant "Supabase Storage" as storage

== Job Quotidien : 2h00 ==
activate scheduler
scheduler -> report : Déclenche génération rapport

activate report
report -> db : Récupère données\ndes dernières 24h
db -> report : Dataset

report -> report : Calculs & Agrégations
report -> report : Génération PDF

report -> storage : Upload PDF
storage -> report : URL publique

report -> email : Envoie aux admins\navec lien PDF
deactivate report

== Job Hebdomadaire : Dimanche 3h00 ==
scheduler -> report : Synchronisation externe

activate report
report -> api : Fetch données externes
api -> report : Nouvelles données

report -> db : Mise à jour tables
report -> db : Nettoyage données obsolètes
deactivate report

== Job Mensuel : 1er du mois ==
scheduler -> report : Facturation

activate report
report -> db : Liste clients actifs
report -> report : Calcul montants
report -> api : Génération factures (Stripe)
report -> email : Envoi factures
deactivate report

deactivate scheduler

note right of scheduler
**Невозможно реализовать только с помощью Supabase**
Edge Functions не подходят
для длительных и повторяющихся задач
end note
@enduml

Что Spring Boot предоставляетНадёжные запланированные задачи с управлением состоянием, автоматической попыткой повторного выполнения и гарантированным выполнением.

Матрица решений

Когда использовать Supabase ?

@startuml
skinparam backgroundColor #FEFEFE

start

:Nouvelle fonctionnalité à implémenter;

if (CRUD simple ?) then (oui)
  :✅ **Supabase**;
  stop
else (non)
  if (Authentification ?) then (oui)
    :✅ **Supabase Auth**;
    stop
  else (non)
    if (Upload fichiers ?) then (oui)
      :✅ **Supabase Storage**;
      stop
    else (non)
      if (Temps réel ?) then (oui)
        :✅ **Supabase Realtime**;
        stop
      else (non)
        if (Row Level Security\nsuffisante ?) then (oui)
          :✅ **Supabase + Policies**;
          stop
        else (non)
          :⚠️ **Considérer Spring Boot**;
          #Coral:Passer à l'arbre\nde décision Spring Boot;
          stop
        endif
      endif
    endif
  endif
endif

@enduml

Когда использовать Spring Boot?

@startuml
skinparam backgroundColor #FEFEFE

start

:Nouvelle fonctionnalité complexe;

if (Orchestration\nmulti-services ?) then (oui)
  :✅ **Spring Boot**;
  stop
else (non)
  if (Transaction ACID\ncritique ?) then (oui)
    :✅ **Spring Boot**;
    stop
  else (non)
    if (Job planifié ?) then (oui)
      :✅ **Spring Boot Scheduler**;
      stop
    else (non)
      if (Intégration API\ntierce complexe ?) then (oui)
        :✅ **Spring Boot**;
        stop
      else (non)
        if (Calculs lourds\n> 10 secondes ?) then (oui)
          :✅ **Spring Boot**;
          stop
        else (non)
          if (Cache distribué\nnécessaire ?) then (oui)
            :✅ **Spring Boot + Redis**;
            stop
          else (non)
            :⚠️ **Probablement Supabase**;
            #LightGreen:Revenir à l'arbre\nde décision Supabase;
            stop
          endif
        endif
      endif
    endif
  endif
endif

@enduml

Примеры архитектуры по типам проектов

Блог / Портфолио

@startuml
skinparam backgroundColor #FEFEFE
skinparam componentStyle rectangle

package "Персонал блога - 95% Supabase" {
  component "JBake" as jbake #SkyBlue

  package "Supabase (Бесплатно)" #LightGreen {
    [Auth: OAuth2 Google]
    [Articles (CRUD)]
    [Commentaires]
    [Images (Storage)]
    [Notifications Realtime]
  }

  package "Spring Boot (Опционально)" #LightCoral {
    [Newsletter Mensuelle]
    note bottom: Только запланированное задание
  }

  database "PostgreSQL" as db

  jbake --> [Auth: OAuth2 Google]
  jbake --> [Articles (CRUD)]
  jbake --> [Commentaires]
  jbake --> [Images (Storage)]
  jbake --> [Notifications Realtime]

  [Articles (CRUD)] --> db
  [Commentaires] --> db
  [Newsletter Mensuelle] --> db
}

note bottom of "Spring Boot (Опционально)"
**Spring Boot не обязателен**
Рассылка может управляться
сторонним сервисом (Mailchimp)
end note
@enduml

Вердикт: 100% Supabase более чем достаточно.

Приложение SaaS

@startuml
skinparam backgroundColor #FEFEFE
skinparam componentStyle rectangle

package "SaaS-приложение — Гибридная архитектура" {
  component "JBake / React" as frontend #SkyBlue

  package "Supabase" #LightGreen {
    [Auth Multi-tenant]
    [Profils Utilisateurs]
    [Données Simples]
    [Storage Documents]
  }

  package "Spring Boot" #Coral {
    [Facturation (Stripe)]
    [Analytics Avancées]
    [Rapports Mensuels]
    [Quotas & Limites]
    [Webhooks Stripe]
  }

  cloud "Внешние сервисы" {
    [Stripe API]
    [SendGrid Email]
  }

  database "Общий PostgreSQL" as db

  frontend --> [Auth Multi-tenant]
  frontend --> [Profils Utilisateurs]
  frontend --> [Données Simples]
  frontend --> [Facturation (Stripe)]
  frontend --> [Analytics Avancées]

  [Auth Multi-tenant] --> db
  [Profils Utilisateurs] --> db
  [Données Simples] --> db

  [Facturation (Stripe)] --> db
  [Facturation (Stripe)] --> [Stripe API]
  [Analytics Avancées] --> db
  [Rapports Mensuels] --> db
  [Rapports Mensuels] --> [SendGrid Email]
  [Webhooks Stripe] ..> [Stripe API] : Écoute
}

note right of "Spring Boot"
**Необходимо для:**
• Управления подписками
• Рекуррентного биллинга
• Динамических квот
• Сложной аналитики
• Надежных вебхуков
end note
@enduml

Вердикт: Гибридная архитектура необходима. Supabase для основного, Spring Boot для критической части (платежи, начисления).

электронная коммерция

@startuml
skinparam backgroundColor #FEFEFE
skinparam componentStyle rectangle

package "E-commerce - 70% Spring Boot" {
  component "Storefront (JBake/React)" as frontend #SkyBlue

  package "Supabase" #LightGreen {
    [Auth Clients]
    [Catalogue Produits\n(lecture seule)]
    [Images Produits]
  }

  package "Spring Boot (бизнес-логика)" #Coral {
    [Gestion Commandes]
    [Paiements Stripe]
    [Gestion Stock]
    [Calcul Frais Port]
    [Génération Factures]
    [Synchronisation ERP]
    [Emails Transactionnels]
  }

  cloud "Интеграции" {
    [Stripe]
    [Transporteur API]
    [ERP Externe]
  }

  database "PostgreSQL" as db

  frontend --> [Auth Clients]
  frontend --> [Catalogue Produits\n(lecture seule)]
  frontend --> [Gestion Commandes]

  [Auth Clients] --> db
  [Catalogue Produits\n(lecture seule)] --> db

  [Gestion Commandes] --> db
  [Paiements Stripe] --> [Stripe]
  [Gestion Stock] --> db
  [Calcul Frais Port] --> [Transporteur API]
  [Génération Factures] --> db
  [Synchronisation ERP] --> [ERP Externe]
  [Synchronisation ERP] --> db
}

note right of "Spring Boot (бизнес-логика)"
**Spring Boot незаменим при:**
• Критических транзакциях
• Сложной оркестрации
• Множественных интеграциях
• Соответствии законодательству
• Заданиях по синхронизации
end note
@enduml

ВердиктSpring Boot необходим. Supabase только для аутентификации и каталога.

Стратегия постепенной миграции

@startuml
skinparam backgroundColor #FEFEFE

|Semaine 1-2|
start
:Créer projet Supabase;
:Configurer Auth (Google, GitHub);
:Définir schéma PostgreSQL initial;
:Implémenter CRUD de base sur JBake;
:Déployer MVP sur GitHub Pages;
note right
**Результат:** Функциональное приложение
**Стоимость:** 0€
**Срок:** 1-2 недели
end note

|Semaine 3-4|
:Observer utilisation réelle;
:Identifier limitations;

|Décision|
if (Logique complexe\némerge ?) then (non)
  |Supabase|
  :Continuer avec Supabase seul;
  :Ajouter Edge Functions si besoin;
  stop
else (oui)
  |Spring Boot|
  :Créer projet Spring Boot;
  :Configurer validation JWT Supabase;
  :Migrer logique complexe vers Spring Boot;
  note right
**Селективная миграция**
Только то, что сложно
  end note
endif

|Semaines suivantes|
:Déployer Spring Boot (Cloud Run, EC2);
:Connecter à PostgreSQL Supabase;
:Implémenter premiers jobs planifiés;
:Intégrer APIs tierces;

stop

note right
**Итоговая гибридная архитектура**
Supabase + Spring Boot
в полной гармонии
end note
@enduml

Затраты и эксплуатационные соображения

Структура затрат

@startuml
skinparam backgroundColor #FEFEFE

package "Оценочные ежемесячные расходы" {

  rectangle "Фаза MVP\n(0-1000 пользователей)" #LightGreen {
    [JBake (GitHub Pages): 0€]
    [Supabase: 0€]
    [Spring Boot: N/A]
    note bottom: **Итого: 0€/мес**
  }

  rectangle "Фаза роста\n(1k-10k пользователей)" #LightYellow {
    [JBake (GitHub Pages): 0€]
    [Supabase: 0€]
    [Spring Boot (Cloud Run): 20-50€]
    [PostgreSQL (si séparé): 0-30€]
    note bottom: **Итого: 20-80€/мес**
  }

  rectangle "Фаза масштабирования\n(10k-100k пользователей)" #LightCoral {
    [JBake (Netlify Pro): 19€]
    [Supabase Pro: 25€]
    [Spring Boot (instances multiples): 100-300€]
    [Redis Cache: 20-50€]
    [Monitoring: 20€]
    note bottom: **Итого: 184-414€/мес**
  }
}

note right of "Фаза масштабирования\n(10k-100k пользователей)"
На данном этапе доходы с лихвой оправдывают затраты
end note
@enduml

Операционные обязанности

@startuml
skinparam backgroundColor #FEFEFE

package "Кто за что отвечает?" {

  rectangle "Управляется Supabase (0 усилий)" #LightGreen {
    [Authentification]
    [Base de données]
    [Backups automatiques]
    [Scaling automatique]
    [Monitoring DB]
    [Sécurité DB]
  }

  rectangle "Управляется GitHub (0 усилий)" #SkyBlue {
    [Hébergement site statique]
    [HTTPS/SSL]
    [CDN global]
    [Déploiement automatique]
  }

  rectangle "Требует управления (Spring Boot)" #LightCoral {
    [Déploiement application]
    [Monitoring APM]
    [Logs centralisés]
    [Scaling horizontal]
    [Mises à jour sécurité]
  }
}

note bottom of "Требует управления (Spring Boot)"
**Минимизируется с помощью:**
• Cloud Run (serverless)
• Kubernetes (если необходимо)
• Управляемых сервисов (RDS и т. д.)
end note
@enduml

Заключение: Совершенное равновесие

Гибридная архитектура Supabase + Spring Boot — это не компромисс, этосинергия.

Принципы, которые следует запомнить

@startmindmap
skinparam backgroundColor #FEFEFE
* Architecture\nHybride

** Commencer Simple
***_ MVP avec Supabase
***_ 0€ de coût initial
***_ Validation rapide

** Évoluer Intelligemment
***_ Ajouter Spring Boot\nsi nécessaire
***_ Migration progressive
***_ Pas de refonte totale

** Exploiter les Forces
***_ Supabase: Simplicité
***_ Spring Boot: Puissance
***_ PostgreSQL: Source unique

** Minimiser la Complexité
***_ Pas de synchronisation
***_ Pas de duplication
***_ Architecture claire

** Optimiser les Coûts
***_ Gratuit au départ
***_ Scaling progressif
***_ ROI évident

@endmindmap

Когда выбирать эту архитектуру?

✅ Эта архитектура идеальна, если :

  • Вы хотите начать быстро (MVP за дни, а не за месяцы)

  • Вы предвидите рост сложности бизнеса

  • Вы хотите минимизировать начальные затраты

  • Вам нравится PostgreSQL и вы хотите единый источник истины

  • Вы цените Kotlin и корутины для бизнес‑кода

  • Вы хотите избежать полной привязки к поставщику

❌ Эта архитектура НЕ подходит, если :

  • Ваш проект прост и останется таким (личный блог → 100% Supabase достаточно)

  • У вас уже есть настроенный бэкенд-стек, которым вы владеете

  • Вы предпочитаете традиционный монолит

  • Вам нужен .NET, Python или другой язык бекенда

Финальное общее видение

@startuml
skinparam backgroundColor #FEFEFE

package "Полная гибридная архитектура" {

  actor "Пользователи" as users

  rectangle "Frontend (статический)" #SkyBlue {
    [JBake / GitHub Pages]
    note right: Бесплатно, глобальная CDN
  }

  rectangle "Простой Backend (Supabase)" #LightGreen {
    [Auth OAuth2]
    [CRUD APIs]
    [Storage]
    [Realtime]
    note right
Бесплатно до 50k users
Ноль настроек сервера
    end note
  }

  rectangle "Бизнес-Backend (Spring Boot)" #Coral {
    [Orchestration]
    [Jobs Planifiés]
    [Intégrations]
    [Transactions]
    note right
Активируется только
при необходимости
    end note
  }

  database "PostgreSQL\nЕдиный источник истины" as db #LightGray

  users --> [JBake / GitHub Pages]

  [JBake / GitHub Pages] --> [Auth OAuth2]
  [JBake / GitHub Pages] --> [CRUD APIs]
  [JBake / GitHub Pages] --> [Storage]
  [JBake / GitHub Pages] --> [Realtime]
  [JBake / GitHub Pages] --> [Orchestration]

  [Auth OAuth2] --> db
  [CRUD APIs] --> db
  [Orchestration] --> db
  [Jobs Planifiés] --> db
  [Intégrations] --> db
}

note bottom of db
**Одна база, два потребителя**
• Supabase для простого
• Spring Boot для сложного
• Синхронизация не требуется
end note

@enduml

Лучшее из двух миров

Эта архитектура даёт вам:

🚀 Скорость Supabase

  • Запуск в часах, а не в неделях

  • Аутентификация OAuth2 за несколько кликов

  • автоматически сгенерированные REST API

  • Нулевая конфигурация сервера

💪 Мощность Spring Boot

  • Kotlin и корутины для элегантного асинхронного кода

  • Оркестрация сложных бизнес-процессов

  • Надёжные запланированные задания

  • Гарантированные ACID-транзакции

  • Полная экосистема Spring

💰 Прогрессивная экономика

  • 0€ для запуска и подтверждения

  • Затраты, следующие за ростом

  • Нет преждевременного перепроектирования

🎯 Архитектурная гибкость

  • Постепенная миграция без переработки

  • Добавление Spring Boot только если необходимо

  • Нет полного vendor lock-in

  • Эволюционная архитектура

Для дальнейшего изучения

Технические ресурсы

Документация Supabase :

Документация Spring Boot :

Дополнительные статьи :

  • Защита API с JWT

  • Оптимизация производительности PostgreSQL

  • Паттерны постепенной миграции

  • Обработка ошибок в распределённой архитектуре

Реальные варианты использования

Эта гибридная архитектура успешно используется в :

  • SaaS B2B: Аутентификация Supabase, выставление счетов Spring Boot

  • Маркетплейсы: Каталог Supabase, транзакции Spring Boot

  • Платформы контента: Статьи Supabase, аналитика Spring Boot

  • Внутренние инструменты: CRUD Supabase, рабочие процессы Spring Boot

Контрольный список запуска

Этап 1 - Основы (Неделя 1)

  • Создать аккаунт Supabase - [ ] Настроить проект PostgreSQL - [ ] Включить аутентификацию (Google, GitHub) - [ ] Определить начальную схему - [ ] Настроить Row Level Security - [ ] Тестировать API из JBake

Фаза 2 - MVP (Неделя 2-3)

  • Реализовать основные страницы - [ ] Интегрировать аутентификацию OAuth2 - [ ] Создать CRUD-формы - [ ] Настроить хранилище для файлов - [ ] Развернуть на GitHub Pages - [ ] Тестировать в реальных условиях

Этап 3 - Эволюция (по потребностям)

  • Идентифицировать потребности сложной логики - [ ] Создать проект Spring Boot при необходимости - [ ] Настроить валидацию JWT Supabase - [ ] Подключиться к PostgreSQL Supabase - [ ] Мигрировать сложные функции - [ ] Реализовать запланированные задания - [ ] Развернуть Spring Boot (Cloud Run и т.д.)

Антипаттерны, которых следует избегать

❌ Не делать :

  • Дублировать данные между Supabase и Spring Boot

  • Создать две отдельные базы PostgreSQL

  • Реализовать аутентификацию самостоятельно

  • Использовать Spring Boot для простого CRUD

  • Сразу переусложнять архитектуру

  • Игнорировать Row Level Security Supabase

✅ Сделать лучше:

  • Поделиться одной базой PostgreSQL

  • Оставить Supabase управлять аутентификацией

  • Использовать Spring Boot только для сложности

  • Начать просто, развиваться постепенно

  • Использовать сильные стороны каждой технологии

  • Защитить с помощью RLS на уровне базы данных

Перспективы эволюции

Добавление новых возможностей

@startuml
skinparam backgroundColor #FEFEFE

rectangle "Текущая архитектура" #SkyBlue {
  [JBake]
  [Supabase]
  [Spring Boot]
}

rectangle "Возможные улучшения" #LightYellow {

  package "Производительность" {
    [Redis Cache]
    [CDN pour Assets]
    [PostgreSQL Replicas]
  }

  package "Мониторинг" {
    [Grafana]
    [Prometheus]
    [Sentry]
  }

  package "CI/CD" {
    [GitHub Actions]
    [Tests Automatisés]
    [Déploiement Continu]
  }

  package "Функциональные возможности" {
    [Search (ElasticSearch)]
    [Queue (RabbitMQ)]
    [Event Sourcing]
  }
}

[Spring Boot] .down.> [Redis Cache] : Peut ajouter
[Spring Boot] .down.> [Queue (RabbitMQ)] : Peut ajouter
[Spring Boot] .down.> [Search (ElasticSearch)] : Peut ajouter

[Supabase] .down.> [PostgreSQL Replicas] : Peut ajouter

note bottom
**Расширяемая архитектура**
Каждое дополнение независимо
Глобальный пересмотр не требуется
end note
@enduml

Горизонтальное Масштабирование

Когда ваше приложение растёт, гибридная архитектура масштабируется естественно :

Supabase :

  • Автоматически масштабируется до миллионов операций

  • Реплики чтения для производительности чтения

  • Восстановление на момент времени для безопасности

Spring Boot:

  • Множество экземпляров за балансировщиком нагрузки

  • Безсостояющий дизайн облегчает горизонтальное масштабирование

  • Kubernetes для оркестрации при необходимости

PostgreSQL:

  • Разбиение для больших таблиц

  • Пул соединений (PgBouncer)

  • Шардинг действительно необходим (редко)

Архитектурные свидетельства

Стартап SaaS (50 тыс. пользователей)

__ Мы начали на 100% с Supabase. При 5k пользователей мы добавили Spring Boot только для Stripe-биллингa и ежемесячных отчётов. Через год 80% наших операций по-прежнему проходят через Supabase. Spring Boot управляет только критической частью. Это разделение позволило нам масштабироваться без переработки. (Empty)

Платформа электронного обучения (10k пользователей)

B2B маркетплейс (3 тыс. пользователей)

_ Spring Boot управляет транзакциями между покупателями и продавцами (критично). Supabase управляет всем остальным: профили, обмен сообщениями в реальном времени, документы. То, что они используют общую базу PostgreSQL, избавляет нас от сложной синхронизации. Это лучший архитектурный выбор, который мы сделали. _

Синтез : Современная архитектурная парадигма

Гибридная архитектура Supabase + Spring Boot представляет новую парадигму:архитектурная специализация.

@startuml
skinparam backgroundColor #FEFEFE

rectangle "Старый парадигма" #LightCoral {
  card "Все в Backend" {
    [Auth]
    [CRUD]
    [Logique Métier]
    [Jobs]
    [Storage]
    [Realtime]
  }
  note bottom
    Complexité maximale
    dès le jour 1
  end note
}

rectangle "Новая парадигма" #LightGreen {
  card "Supabase\n(Удобство)" {
    [Auth]
    [CRUD Simple]
    [Storage]
    [Realtime]
  }

  card "Spring Boot\n(Дифференциация)" {
    [Logique Métier]
    [Jobs]
    [Intégrations]
  }

  note bottom
    Complexité progressive
    ajoutée seulement si nécessaire
  end note
}

[Ancien Paradigme] -right-> [Nouveau Paradigme] : Évolution

@enduml
@startuml
skinparam backgroundColor #FEFEFE

rectangle "Старая парадигма" #LightCoral {
  card "Все в бэкенде" {
    [Auth]
    [CRUD]
    [Logique Métier]
    [Jobs]
    [Storage]
    [Realtime]
  }
  note bottom
Максимальная сложность
с первого дня
  end note
}

rectangle "Новая парадигма" #LightGreen {
  card "Supabase\n(Удобство)" {
    [Auth]
    [CRUD Simple]
    [Storage]
    [Realtime]
  }

  card "Spring Boot\n(Дифференциация)" {
    [Logique Métier]
    [Jobs]
    [Intégrations]
  }

  note bottom
Прогрессивная сложность,
добавляемая только при необходимости
  end note
}

[Ancien Paradigme] -right-> [Nouveau Paradigme] : Évolution

@enduml

Правило 80/20

В большинстве приложений:

  • 80% операцийявляются стандартным CRUD → Supabase

  • 20% операцийтребуют бизнес-логики → Spring Boot

Это естественное правило оправдывает гибридную архитектуру.

@startuml
skinparam backgroundColor #FEFEFE

package "Распределение операций" {

  rectangle "80% - Стандартные операции" #LightGreen {
    [Lecture de données]
    [Création d'entités]
    [Mise à jour simple]
    [Suppression]
    [Upload fichiers]
    [Authentification]

    note bottom: **Géré par Supabase**
  }

  rectangle "20% - Бизнес-логика" #Coral {
    [Calculs complexes]
    [Workflows multi-étapes]
    [Transactions critiques]
    [Intégrations tierces]
    [Jobs planifiés]

    note bottom: **Géré par Spring Boot**
  }
}

note right
  **Focus optimal :**
  Votre temps de développement
  concentré sur les 20% qui
  différencient votre produit
end note
@enduml
@startuml
skinparam backgroundColor #FEFEFE

package "Распределение операций" {

  rectangle "80% — Стандартные операции" #LightGreen {
    [Lecture de données]
    [Création d'entités]
    [Mise à jour simple]
    [Suppression]
    [Upload fichiers]
    [Authentification]

    note bottom: **Управляется Supabase**
  }

  rectangle "20% — Бизнес-логика" #Coral {
    [Calculs complexes]
    [Workflows multi-étapes]
    [Transactions critiques]
    [Intégrations tierces]
    [Jobs planifiés]

    note bottom: **Управляется Spring Boot**
  }
}

note right
**Оптимальный фокус:**
Ваше время разработки,
сосредоточенное на тех 20%, которые
отличают ваш продукт
end note
@enduml

Гибридная архитектура — это не технический компромисс, этостратегическое решение.

Это позволяет вам :

  • ✅ Быстро запустить с рабочим MVP

  • ✅ Подтвердите ваш рынок без больших инвестиций

  • ✅ Эволюционировать постепенно, когда сложность этого требует

  • Контролировать ваши расходы на каждом этапе

  • Использовать лучшее из каждой технологии

  • ✅ Избегайте преждевременного избыточного проектирования

  • ✅ Сохранение гибкости на будущее

Она представляет :

  • 🎯ПрагматизмКаждая технология, в которой она преуспевает

  • 🚀СкоростьМинимальное время выхода на рынок

  • 💰Экономика: Затраты, соответствующие стоимости

  • 🔮Масштабируемость: Архитектура, которая растёт вместе с вами

  • 🛡️НадёжностьПроверенные и надёжные услуги

Ваш следующий шаг

Если эта архитектура вам знакома, вот с чего начать:

  1. Создайте аккаунт Supabase(бесплатный)

  2. Определите вашу минимальную схему данных

  3. Настройте аутентификацию OAuth2

  4. Создайте свою первую страницу JBake, которая использует API

  5. Разверните на GitHub Pages

Вы получите работоспособный MVP внесколько дней.

Spring Boot появится естественно, когда он вам понадобится. Не раньше.



Удачной разработки! 🚀



Поделитесь этой статьей, если считаете, что она может помочь другим разработчикам сделать правильный архитектурный выбор.

Похожие статьи