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.
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);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 RLSLas 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-webhookIdeales 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.