Self-hosted PostgreSQL vs Supabase Comparación

Base de datos relacional de código abierto que se ejecuta en tu propio servidor, madurando desde 1986

VS
Supabase

Plataforma backend gestionada y de código abierto, construida sobre PostgreSQL real

17 min de lecturaBase de datos

Veredicto rápido

Esta decisión no tiene una única respuesta correcta. Si eres un equipo pequeño y la prioridad es la velocidad, Supabase es la elección correcta: auth, storage, realtime y el pooler vienen listos. Con una carga predecible, una restricción de residencia de datos (entre las 17 regiones no está Turquía) o un coste que crece con el número de usuarios, PostgreSQL autoalojado gana. Una advertencia: la documentación oficial indica que el backup/PITR gestionado queda deshabilitado en self-host — con el control heredas el simulacro de restauración. Tener una copia no es el criterio; poder recuperarla sí lo es.

Self-hosted PostgreSQLSupabase
Leer el veredicto completo

Comparación de puntuaciones

Cargando gráfico...

Puntuación detallada

Puntuación detallada: Self-hosted PostgreSQL y Supabase — puntuaciones por categoría sobre 10
CategoríaSelf-hosted PostgreSQLSupabase
Rendimiento
8/10
8/10
Facilidad de aprendizaje
5/10
8/10
Ecosistema
9/10
8/10
Comunidad
9/10
9/10
Mercado laboral
8/10
7/10
A prueba de futuro
8/10
8/10

Pros y contras

Self-hosted PostgreSQL

Pros

  • El software es totalmente gratuito (PostgreSQL License) — el coste queda fijado a tu infraestructura
  • Libertad total de extensiones: puedes instalar pgvector, PostGIS, pg_cron, lo que necesites
  • Los datos permanecen físicamente en el servidor que elijas — la residencia de datos está directamente bajo tu control
  • El PITR es una función del núcleo (archivado WAL + pg_basebackup)
  • No hay bloqueo de proveedor — ya estás en tu propia infraestructura
  • Cada versión major recibe 5 años de soporte oficial, un calendario de parches predecible
  • RLS es una función del núcleo desde la versión 9.5, puedes usarla como quieras

Contras

  • Auth, Storage y Realtime no están en el núcleo — hay que instalarlos y operarlos por separado
  • Para el connection pooling hace falta una herramienta aparte como PgBouncer/Supavisor
  • Backup/PITR/HA/monitoring son responsabilidad tuya por completo, no hay SLA oficial
  • La curva de aprendizaje es más pronunciada: configurar auth+pooling+HA a mano requiere tiempo
  • No se publica una página oficial de casos de cliente/benchmark (proyecto comunitario)

Ideal para

Proyectos de escala media-grande que necesitan un presupuesto fijo y predecibleSistemas con requisitos contractuales de protección de datos/residencia de datosTrabajos que requieren combinaciones de extensiones específicas como pgvector/PostGISEquipos con capacidad DevOps que van a agendar el simulacro de restauraciónProyectos de larga duración donde la independencia de proveedor es crítica

Supabase

Pros

  • Auth, Storage, Realtime y Data API vienen listos — no escribes la capa de auth desde cero
  • Empiezas con $0/mes en el plan Free (500MB de BD, 5GB de egress, 50k MAU)
  • El connection pooling viene listo con opciones de pooler Dedicated/Shared (Supavisor)
  • Certificaciones de cumplimiento listas como HIPAA (BAA), ISO 27001, DPA de GDPR
  • Con Health Check Advisors, la tasa de errores del servicio se monitoriza automáticamente (septiembre 2026)
  • Observabilidad con integración de un clic con Grafana Cloud (julio 2026)
  • Como por debajo corre PostgreSQL real, es portable con pg_dump, el bloqueo de proveedor es bajo

Contras

  • El coste crece de forma escalonada al aumentar usuarios/datos ($0,125/GB de disco, $0,09/GB de egress, $0,00325/MAU)
  • Entre las 17 regiones no está Turquía — surge la cuestión de transferencia internacional de datos
  • En el plan Free no hay backup automático, en Pro solo 7 días
  • Las extensiones están limitadas al catálogo curado de la plataforma, no hay libertad total a nivel de SO
  • La opción self-host es 'community-supported' — no hay SLA oficial, el backup/PITR gestionado queda deshabilitado

Ideal para

Paso rápido de 0 a 1 en desarrolladores únicos o equipos pequeñosEquipos de producto que no quieren montar Auth/Storage/Realtime desde ceroProyectos que requieren certificaciones listas como HIPAA/ISO 27001/GDPREquipos que quieren monitorización gestionada y alertas automáticas de tasa de erroresQuienes quieren empezar rápido manteniendo la independencia de proveedor con pg_dump

Comparación de código

Self-hosted PostgreSQL
# PostgreSQL autoalojado - configuración de archivado WAL + PITR (postgresql.conf)
wal_level = replica
archive_mode = on
archive_command = 'test ! -f /var/backups/pg_wal_archive/%f && cp %p /var/backups/pg_wal_archive/%f'
max_wal_senders = 3

# Tomar backup base (pg_basebackup)
pg_basebackup -D /var/backups/base -Ft -z -P -U replicator -h localhost

# PITR: volver a un momento concreto (recovery.signal + postgresql.conf)
# 1) Restaurar el backup base en el directorio de restauración
# 2) Añadir estas líneas a postgresql.conf, crear el archivo recovery.signal
restore_command = 'cp /var/backups/pg_wal_archive/%f %p'
recovery_target_time = '2026-09-23 09:00:00+03'

# pg_hba.conf - conexión solo desde el servidor de aplicación
host    appdb    app_user    10.0.0.5/32    scram-sha-256

-- SQL (psql): instalación de extensiones (libertad total - propio de self-host)
CREATE EXTENSION IF NOT EXISTS vector;
CREATE EXTENSION IF NOT EXISTS postgis;
CREATE EXTENSION IF NOT EXISTS pg_cron;

# Connection pooling (PgBouncer, pgbouncer.ini)
[databases]
appdb = host=127.0.0.1 port=5432 dbname=appdb
[pgbouncer]
pool_mode = transaction
max_client_conn = 500
default_pool_size = 25
Supabase
-- SQL (Supabase SQL Editor): 1) Crear la tabla y activar RLS (la Data API lo exige)
create table public.notes (
  id uuid default gen_random_uuid() primary key,
  user_id uuid references auth.users not null,
  content text not null,
  created_at timestamptz default now()
);
alter table public.notes enable row level security;

create policy "kullanicilar kendi notlarini okur"
  on public.notes for select
  using (auth.uid() = user_id);

create policy "kullanicilar kendi notlarini yazar"
  on public.notes for insert
  with check (auth.uid() = user_id);

// 2) Consulta con supabase-js (RLS se aplica automáticamente)
import { createClient } from '@supabase/supabase-js'

const supabase = createClient(
  process.env.SUPABASE_URL!,
  process.env.SUPABASE_ANON_KEY!
)

const { data: notes, error } = await supabase
  .from('notes')
  .select('id, content, created_at')
  .order('created_at', { ascending: false })

// 3) Cadenas de conexión con el cliente Postgres (tabla oficial "Endpoints and IP versions")
// Conexión directa (backend persistente, pg_dump, migration):
// postgresql://postgres:[YOUR-PASSWORD]@db.[PROJECT-REF].supabase.co:5432/postgres
// Dedicated pooler (solo transaction mode, en planes de pago):
// postgresql://postgres:[YOUR-PASSWORD]@db.[PROJECT-REF].supabase.co:6543/postgres
// Configurar la cadena a mano: cópiala desde la pantalla Dashboard > Connect (el host del shared pooler no puede derivarse de la región).

Conclusión

Esta decisión no tiene una única respuesta correcta. Si eres un equipo pequeño y la prioridad es la velocidad, Supabase es la elección correcta: auth, storage, realtime y el pooler vienen listos. Con una carga predecible, una restricción de residencia de datos (entre las 17 regiones no está Turquía) o un coste que crece con el número de usuarios, PostgreSQL autoalojado gana. Una advertencia: la documentación oficial indica que el backup/PITR gestionado queda deshabilitado en self-host — con el control heredas el simulacro de restauración. Tener una copia no es el criterio; poder recuperarla sí lo es.

Solicita una consultoría gratuita
FAQ

Preguntas frecuentes

Como Supabase usa PostgreSQL estándar, puedes exportar con `pg_dump`/`pg_dumpall` o mediante replicación nativa de Postgres; la documentación oficial explica la migración entre proyectos con un ejemplo de script en Node.js (incluyendo auth/storage). Reconstruir en el lado self-host servicios propios de Supabase como Auth, Storage y Realtime (ejecutando el stack self-host oficial con Docker Compose) es un trabajo aparte — migrar los datos y lograr paridad de servicios son pasos distintos.

Artículos de blog relacionados

Ver todos los artículos
Todas las comparaciones