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

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

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

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



Современная веб-архитектура без серверной части — использование «PostgREST
Как заставить браузер напрямую взаимодействовать с базой данныхbetterprogramming.pub»





Что такое Супабаза?

Supabase — это облачный сервис с открытым исходным кодом, и вы можете понимать его как одну из следующих двух вещей:

  • Хостер PostgreSQL

Это позволяет вам создавать новые экземпляры Postgres всего за несколько кликов и использовать их в бэкэнде вашего приложения. Он также предоставляет встроенный редактор SQL и браузер данных для управления базой данных внутри браузера.

  • BaaS (серверная часть как услуга)

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

В этой статье давайте рассмотрим Supabase в контексте BaaS.

Пакет функций

Supabase предоставляет пять основных услуг:

  1. Аутентификация аутентифицирует пользователей
  2. База данных обслуживает стандартный PostgreSQL
  3. Realtime поддерживает широковещательную передачу сообщений и состояний клиентам
  4. Функции Edge позволяют выполнять собственный код TypeScript.
  5. Хранилище хранит и обслуживает файлы

Каждую из этих служб можно использовать отдельно, но вы, скорее всего, будете использовать аутентификацию и все остальное для авторизации пользовательских запросов.

Авторизация

Служба аутентификации занимается регистрацией и аутентификацией пользователей. Он поддерживает электронную почту, магические ссылки и широкий спектр методов входа в социальные сети. Если вы знакомы с NextAuth, вы можете думать о модуле Auth Supabase как о новой реализации NextAuth без жесткой зависимости от Next.js. Что хорошо в службе Auth, так это то, что, поскольку у нее есть служба базы данных напарника, у нее есть естественное место для хранения пользовательских данных, поэтому вам не нужно настраивать для нее хранилище.

Служба аутентификации находится в центре архитектуры Superbase. Он проверяет личность пользователя, но не контролирует, что он может или не может делать. Последнее называется «авторизацией» и обрабатывается каждой из четырех других служб соответственно, но для этого они полагаются на проверенную личность.

База данных

Supabase отличается от других BaaS своим сильным наследием от PostgreSQL, и служба базы данных является тому доказательством. Служба базы данных напрямую унаследовала все навороты Postgres — таблицы, представления, функции, безопасность на уровне строк (RLS) и т. д.

Наиболее значительным дополнением, добавленным Supabase в Postgres, являются «бессерверные API». Каждая таблица, представление и функция автоматически сопоставляются с API RESTful и GraphQL (все еще бета-версия). Эти API позволяют выполнять операции CRUD непосредственно из внешнего интерфейса. Но, конечно, надо сразу насторожиться: а как же безопасность? Supabase полностью делегирует это RLS PostgreSQL. Вы должны использовать службу «Аутентификация» для аутентификации пользователей и настройки RLS для защиты от несанкционированных операций. Типичный RLS выглядит так:

# Simple RLS for blog posts

# owner has full access to her own posts
CREATE POLICY post_owner_policy ON post
    USING (owner = current_user);

# all users can read published posts
CREATE POLICY post_read_policy ON post FOR SELECT
    USING (published = true);

Весь поток для авторизованного запроса выглядит следующим образом:

Вызов базы данных из внешнего интерфейса выглядит так:

// Initialize the JS client
import { createClient } from '@supabase/supabase-js'
const supabase = createClient(SUPABASE_URL, SUPABASE_ANON_KEY)

// Make a request
const { data: todos, error } = await supabase.from('todos').select('*')

Общая идея очень похожа на то, как работает PostgREST. Уровень RESTful Supabase построен с помощью PostgREST. Пожалуйста, ознакомьтесь со следующей статьей, если вам интересно.



Современная веб-архитектура без серверной части — использование «PostgREST
Как заставить браузер напрямую взаимодействовать с базой данныхbetterprogramming.pub»



В реальном времени

Realtime — это служебная служба, которая позволяет подписаться на три типа событий в реальном времени: «Broadcast» для шаблона pub-sub, «Presence» для синхронизации онлайн-статуса пользователя и «Postgres Changes» для прослушивания изменений в базе данных.

Стоит отметить, что если вы настроили RLS в таблицах базы данных, уведомления об изменениях базы данных также учитывают политики RLS, и клиенты получают только те сообщения, которые они должны видеть.

Хранилище

Предложение хранилища Supabase похоже на службы хранения BLOB-объектов от большинства других облачных провайдеров: простая структура ведра/папки/файла. Хотя Storage не является частью хранилища базы данных SQL, управление доступом к нему настраивается с помощью Postgres RSL, но как?

Идея состоит в том, что, хотя большие двоичные объекты хранятся в другом месте, их метаданные находятся в базе данных SQL в виде обычных таблиц. Поэтому, когда вы используете RLS для указания политик доступа к хранилищу, вы фактически настраиваете его для своих метаданных. Когда служба хранилища обрабатывает запрос, она сначала проверяет со стороны Postgres, разрешено ли это.

Пограничные функции

Пограничные функции — это настраиваемые коды TypeScript, которые вы можете развернуть в Supabase и позволить им работать на пограничных узлах, отвечая на запросы клиентов.

Функции Edge используют Deno во время выполнения — для лучшей безопасности и более быстрого холодного запуска — поэтому предположительно код TypeScript должен оставаться в пределах того, что поддерживается Deno.

Пограничные функции имеют простой способ поддержки авторизации. Клиент отправляет токен JWT, полученный во время аутентификации. Код пограничной функции получает идентификатор пользователя (извлеченный из токена) в качестве входных данных, поэтому он может использовать его для проверки разрешений. Если функция обращается к базе данных, она также может создать клиент Postgres с контекстом аутентифицированного пользователя, поэтому политики RLS базы данных могут творить чудеса.

Это хороший выбор для меня?

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

  1. Согласны ли вы с использованием сторонней службы в качестве всей серверной части?
    Supabase имеет открытый исходный код, и вы сможете разместить ее самостоятельно. Тем не менее, прямо сейчас документация по самостоятельному хостингу ограничена, и я никогда не слышал и не читал, чтобы кто-то делал самостоятельный хостинг для серьезных приложений.
  2. Удобно ли вам много работать с PostgreSQL?
    Supabase имеет сильное происхождение от Postgres. Вы будете чувствовать себя как дома, если хорошо знаете Postgres, и можете пострадать, если нет. Для правильного использования необходимо твердое знание Postgres.
  3. Нравится ли вам идея написания бизнес-логики на SQL?
    Структура PostgreSQL — мощный инструмент. Он работает как очень надежный привратник для обеспечения безопасности ваших данных. Однако по мере того, как вы будете использовать его больше, вы неизбежно попадете в ситуацию, когда большая часть вашей бизнес-логики будет выражена в SQL. ИМХО, язык SQL не был оптимально разработан для этого.
  4. Как насчет того, чтобы модель данных вашего приложения больше не оставалась в коде?
    Если вы используете Supabase в качестве BaaS, вы больше не используете ORM. Вместо этого вы используете бессерверные API (RESTful или GraphQL). В результате теряется одно из основных преимуществ ORM — централизованная модель данных всего вашего приложения в исходном коде.

Заворачивать

Supabase — отличный продукт, который охватывает многие аспекты серверной части веб-приложения. Это может значительно сократить время вашего выхода на рынок. Я надеюсь, что эта статья поможет вам увидеть плюсы и минусы его использования и, наконец, принять правильное решение.

Want to Connect?

I'm the creator of ZenStack, a toolkit that supercharges
Prisma ORM with a powerful access control layer and
unleashes its full potential for full-stack development.
Our goal is to let you save time writing boilerplate code
and focus on building what matters - the user experience.