Saltar al contenido principal
Supabase29 de julio de 202610 min de lectura
Intermedio10 min Full Stack Developer Backend Developer

Supabase: backend como servicio con PostgreSQL

Guía de Supabase: crear proyecto, SQL Editor, Auth con RLS policies, Realtime subscriptions, Storage, Edge Functions y ejercicios prácticos.

SupabasePostgreSQLAuthRLSRealtimeBackendBaaS

Requisitos previos

Lo que aprenderás

  • Crear un proyecto en Supabase
  • Definir tablas con SQL Editor y RLS policies
  • Implementar autenticación con Auth
  • Usar Realtime para suscripciones en vivo
  • Subir archivos con Storage policies
  • Desplegar Edge Functions
Tutorial10 min

Supabase: backend como servicio con PostgreSQL

Supabase es la alternativa open-source a Firebase. Combina PostgreSQL, Auth, Realtime, Storage y Edge Functions en una plataforma unificada. Un backend completo sin escribir servidores.


¿Qué es Supabase?

Lanzada en 2020, Supabase te da un backend completo basado en PostgreSQL. Cada proyecto es una instancia PostgreSQL dedicada con API REST y GraphQL automáticas, autenticación, suscripciones en tiempo real, almacenamiento de archivos y funciones serverless.

A diferencia de Firebase (que usa NoSQL), Supabase usa PostgreSQL con Row Level Security. Esto significa que tienes todas las ventajas de SQL — JOINs, transacciones, migraciones — combinadas con la seguridad a nivel de fila.

Crear un proyecto

1. Ve a supabase.com y haz login con GitHub.

2. "New project" → nombre, contraseña segura (guárdala), región (ej: eu-west-1 para Europa).

3. Obtienes dos claves: SUPABASE_URL (https://tu-proyecto.supabase.co) y SUPABASE_ANON_KEY (clave pública de API).

Database: Table Editor y SQL Editor

Puedes crear tablas visualmente con el Table Editor o directamente con SQL:

-- SQL Editor dentro del dashboard de Supabase
CREATE TABLE tareas (
  id BIGINT GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
  titulo TEXT NOT NULL,
  completada BOOLEAN DEFAULT false,
  user_id UUID NOT NULL REFERENCES auth.users(id),
  creado_en TIMESTAMPTZ DEFAULT NOW()
);

-- Activar Row Level Security
ALTER TABLE tareas ENABLE ROW LEVEL SECURITY;

-- Política: cada usuario ve solo sus propias tareas
CREATE POLICY "Usuarios ven solo sus tareas"
  ON tareas FOR SELECT
  USING (auth.uid() = user_id);

-- Política: cada usuario crea sus propias tareas
CREATE POLICY "Usuarios crean sus tareas"
  ON tareas FOR INSERT
  WITH CHECK (auth.uid() = user_id);
Sin RLS policies, cualquier usuario con la anon key puede leer y escribir toda la tabla. Las RLS son obligatorias para datos sensibles.

Auth

Supabase Auth maneja registro, login, magic links, OAuth (Google, GitHub, Apple, etc.) y sesiones con JWT. Desde el cliente:

import { createClient } from '@supabase/supabase-js'

const supabase = createClient(SUPABASE_URL, SUPABASE_ANON_KEY)

// Registro
const { data, error } = await supabase.auth.signUp({
  email: 'ana@email.com',
  password: 'mi-contraseña-segura'
})

// Login
const { data, error } = await supabase.auth.signInWithPassword({
  email: 'ana@email.com',
  password: 'mi-contraseña-segura'
})

// Obtener sesión actual
const { data: { session } } = await supabase.auth.getSession()
console.log(session.user.id) // El user_id que usan las RLS

Las RLS policies usan auth.uid() automáticamente para identificar al usuario autenticado. No necesitas pasar el ID manualmente.

Realtime

Suscríbete a cambios en cualquier tabla de PostgreSQL vía WebSockets. Cuando alguien inserta, actualiza o elimina una fila, todos los clientes conectados reciben el cambio al instante:

const channel = supabase
  .channel('tareas_realtime')
  .on('postgres_changes',
    { event: '*', schema: 'public', table: 'tareas' },
    (payload) => {
      console.log('Cambio recibido:', payload)
      // payload.new → dato nuevo
      // payload.old → dato anterior
      // payload.eventType → INSERT / UPDATE / DELETE
    }
  )
  .subscribe()

Para usar Realtime, actívalo desde la UI de Supabase: Database → Replication → selecciona la tabla.

Storage

Sube archivos a buckets con políticas de acceso también vía RLS:

// Subir archivo
const { data, error } = await supabase.storage
  .from('avatars')
  .upload('public/ana.jpg', file)

// Descargar URL pública
const { data } = supabase.storage
  .from('avatars')
  .getPublicUrl('public/ana.jpg')

Las policies de Storage se definen con SQL similares a las de tablas:

CREATE POLICY "Cada usuario sube sus propios archivos"
  ON storage.objects FOR INSERT
  WITH CHECK (bucket_id = 'avatars' AND auth.uid() = owner);

Edge Functions

Funciones serverless escritas en Deno / TypeScript. Se despliegan con la CLI de Supabase:

# Instalar CLI
brew install supabase/tap/supabase

# Crear función
supabase functions new mi-webhook

# Desplegar
supabase functions deploy mi-webhook

Ideales para webhooks, procesamiento de imágenes, integraciones con APIs externas, y lógica que no quieres en el cliente.


Ejercicios


Supabase es ideal para proyectos que necesitan un backend completo sin gestionar servidores. La combinación de PostgreSQL + RLS + Realtime lo hace especialmente potente para aplicaciones en tiempo real como chats, dashboards y herramientas colaborativas.