Saltar al contenido principal

Supabase Self-Hosted — Guía del usuario

Guía del producto Supabase Self-Hosted del marketplace: qué es, para qué sirve, en qué se diferencia de Supabase Cloud y cómo acceder y operar lo que se instala.


1. Qué es​

Supabase es una alternativa open-source a Firebase. En un único paquete, entrega el backend completo de una aplicación sobre una base de datos PostgreSQL:

ComponentePara qué sirve
PostgreSQLBase de datos relacional, con acceso directo mediante cadena de conexión
API REST y GraphQLAPI generada automáticamente a partir de las tablas (PostgREST)
AuthRegistro, login (email/contraseña, magic link, OAuth), sesiones y JWT
StorageCarga y entrega de archivos, con reglas de acceso
RealtimeEventos en tiempo real (cambios en la base, broadcast, presencia)
Edge FunctionsFunciones serverless en Deno/TypeScript
StudioPanel web para administrar todo lo anterior

Este producto instala la versión self-hosted oficial (self-hosted/v0.8.2), siguiendo la documentación de Supabase, en un nodo Docker de tu entorno, con HTTPS (certificado Let's Encrypt) a través del proxy Caddy.

2. Para qué sirve​

  • Tener el backend de una app (web o móvil) — base de datos, login, archivos y API — sin escribir un servidor desde cero.
  • Mantener los datos en tu infraestructura, en la región de tu entorno (útil para LGPD/RGPD y políticas internas).
  • Tener un costo previsible, según los recursos del entorno, sin cobros de Supabase por usuario activo, solicitud o almacenamiento.
  • Entornos de desarrollo, homologación o producción que controlas por completo.

3. Self-hosted × Supabase Cloud: qué cambia​

Solo las diferencias que afectan el uso diario:

TemaSupabase Cloud (hosted)Este producto (self-hosted)
ProyectosVarios proyectos por organizaciónUn proyecto por entorno (para otro proyecto, instala otro entorno)
ActualizacionesLas hace SupabaseVersión fija (v0.8.2); actualizar es manual
Config. de Auth (SMTP, proveedores OAuth, URLs de redirect)Desde el panelDesde el archivo .env + reinicio (ver sección 8.2)
Emails de AuthSMTP integrado (con límites)Sin SMTP real: configura el tuyo antes de habilitar el registro por email
Panel (Studio)Completo: organizaciones, billing, branchingReducido: un proyecto, sin billing/branching
Edge FunctionsDeploy con la CLI (supabase functions deploy)Código en /home/supabase/volumes/functions en el servidor
Escala y recursosGestionados por SupabaseRecursos del nodo ajustables por ti

Resumen: ganas control, datos en tu servidor y costo fijo; a cambio, backups, actualizaciones, email y monitoreo pasan a ser tuyos.

4. Instalación​

4.1 Opciones​

OpciónPredeterminadoQué hace
Habilitar MCPDesmarcadaExpone el servidor MCP de Supabase en https://<dominio>/mcp, protegido por token (ver secciones 6.3 y 7). Se puede habilitar o deshabilitar después con el add-on MCP.

4.2 Qué se crea​

Un nodo Docker Engine con IP pública, puertos 80/443, hasta 32 cloudlets (8 reservados) y 30 GB de disco. Todo lo de Supabase queda en /home/supabase (volumen persistente).

Durante la instalación, automáticamente:

  1. Se generan la contraseña del panel, la contraseña de PostgreSQL, las claves JWT/API y, si está marcado, el token del MCP.
  2. Se descargan los archivos oficiales de Supabase y el .env se configura con el dominio del entorno.
  3. Se descargan las imágenes Docker y se inician los servicios mientras el add-on Let's Encrypt Free SSL emite el certificado (en paralelo, para instalar más rápido).
  4. Caddy arranca con el certificado y se prueba el HTTPS.
  5. Se instalan los add-ons Senha do painel Supabase, Custom Domain y MCP.

Al final, la pantalla de éxito (también enviada por email) trae todos los accesos. Guarda ese email — es el único lugar con todas las contraseñas y claves juntas.

5. Accesos​

En los ejemplos, <dominio> es el dominio del entorno (ej.: env-1234567.sp1.br.saveincloud.net.br) o tu dominio propio, si está configurado.

5.1 Studio (panel)​

AccesoValor
URLhttps://<dominio>
Usuariosupabase
Contraseñala del email de instalación (cámbiala con el add-on Senha do painel Supabase)

Studio es el panel de administración: tablas, SQL Editor, usuarios de Auth, buckets de Storage, políticas (RLS) y claves.

5.2 API (para las apps)​

La URL del proyecto es https://<dominio> — la misma que se usa en el SDK:

import { createClient } from '@supabase/supabase-js'
const supabase = createClient('https://<dominio>', '<publishable key>')
ClaveDónde usarla
Publishable key (sb_publishable_…)Frontend y apps móviles. Es pública; el acceso queda limitado por las políticas RLS.
Secret key (sb_secret_…)Solo en el backend. Ignora el RLS: nunca la pongas en código de navegador/app.
Anon key (legado)Equivalente a la publishable, para bibliotecas antiguas.
Service role key (legado)Equivalente a la secret, para bibliotecas antiguas. Solo en el backend.

Endpoints disponibles: /rest/v1, /graphql/v1, /auth/v1, /storage/v1, /realtime/v1 y /functions/v1.

5.3 PostgreSQL (conexión directa)​

La conexión pasa por el pooler (Supavisor). El usuario incluye el nombre del entorno:

postgresql://postgres.<nombre-del-entorno>:<contraseña-de-postgres>@<dominio>:5432/postgres
PuertoModoCuándo usarlo
5432SessionHerramientas (DBeaver, pgAdmin, psql), migraciones, apps con conexiones largas
6543TransactionServerless y muchas conexiones cortas

Si la conexión externa no funciona, verifica que el firewall del entorno permita los puertos 5432/6543. Si no necesitas acceso externo a la base, mantenlos cerrados.

6. Add-ons​

Están en la pestaña Add-Ons del nodo. Todos piden confirmación antes de actuar.

6.1 Senha do painel Supabase (contraseña del panel de Supabase)​

Botón Redefinir senha (Restablecer contraseña): genera una contraseña nueva para Studio (usuario supabase), la aplica y la envía por email. La contraseña anterior deja de funcionar al instante. El panel queda indisponible por unos segundos.

6.2 Custom Domain​

Aplica un dominio propio (ej.: api.tuempresa.com) en la configuración de Supabase. No emite certificado. El orden es:

  1. En el DNS, apunta el dominio al entorno: un CNAME al dominio del entorno o un registro A a la IP pública del nodo.
  2. En el add-on Let's Encrypt Free SSL → Configure, agrega el dominio.
  3. En el add-on Custom Domain, ingresa el dominio y haz clic en Configurar domínio (Configurar dominio).

Los contenedores se reinician (hasta ~1 minuto fuera de línea). Supabase pasa a responder en el dominio nuevo y sigue respondiendo en el dominio del entorno. Después, actualiza la URL en tus apps. Para volver, ingresa el propio dominio del entorno.

6.3 MCP​

El MCP (Model Context Protocol) permite que asistentes de IA (Claude, Cursor, VS Code, etc.) consulten y administren el proyecto: listar tablas, ejecutar SQL, ver la documentación.

BotónQué hace
Habilitar / gerar novo token (Habilitar / generar nuevo token)Habilita el endpoint (si aún no lo está) y genera un token nuevo, enviado por email. Un token anterior deja de funcionar.
Desabilitar (Deshabilitar)Bloquea /mcp, elimina el token y deshace la configuración del MCP, volviendo al estado predeterminado de la instalación.

En ambos casos se reinician el proxy y el api-gw (unos segundos fuera de línea).

⚠️ Quien tiene el token tiene acceso administrativo al proyecto. Trátalo como la secret key: no lo publiques, no lo subas a un repositorio y genera otro si se filtra.

7. Uso del MCP​

7.1 Conexión​

CampoValor
URLhttps://<dominio>/mcp
HeaderAuthorization: Bearer <token>

Sin el header correcto, /mcp responde 401. Con el MCP deshabilitado, la ruta queda bloqueada (403).

7.2 Ejemplo de configuración en el cliente​

La mayoría de los clientes MCP acepta un JSON como este:

{
"mcpServers": {
"supabase": {
"type": "http",
"url": "https://<dominio>/mcp",
"headers": { "Authorization": "Bearer <token>" }
}
}
}

8. Operación​

El acceso al servidor es por el Web SSH del nodo (usuario root). Los comandos de abajo se ejecutan en /home/supabase.

8.1 Comandos​

ComandoQué hace
sh run.sh startAplica los cambios del .env (recrea solo lo que cambió)
sh run.sh statusEstado de los contenedores
sh run.sh logsSigue los logs (sh run.sh logs auth para un servicio; Ctrl+C para salir)
sh run.sh restartReinicia los servicios

Toda la configuración está en /home/supabase/.env. Después de editarlo, ejecuta sh run.sh start.

8.2 Configuración de Auth y email​

El .env viene sin un servidor de email real. Sin SMTP, los emails de Auth (confirmación de registro, magic link, recuperación de contraseña) no se entregan — y, como la confirmación por email viene activada, los usuarios nuevos no pueden confirmar su registro.

Antes de habilitar el registro por email, ajusta en el .env:

VariablePara qué
SMTP_HOST, SMTP_PORT, SMTP_USER, SMTP_PASSTu proveedor de email
SMTP_ADMIN_EMAIL, SMTP_SENDER_NAMERemitente de los emails
SITE_URLURL de tu app (destino predeterminado de los enlaces de email)
ADDITIONAL_REDIRECT_URLSOtras URLs permitidas para redirect, separadas por coma
DISABLE_SIGNUPtrue para bloquear nuevos registros
ENABLE_EMAIL_AUTOCONFIRMtrue omite la confirmación por email (no recomendado en producción)

Los proveedores OAuth (Google, GitHub, etc.) también se configuran con variables de entorno del servicio auth — consulta la documentación de Supabase.

8.3 Dónde están los datos​

RutaContenido
/home/supabase/volumes/db/dataDatos de PostgreSQL
/home/supabase/volumes/storageArchivos de Storage
/home/supabase/volumes/functionsCódigo de las Edge Functions (una carpeta por función)
/home/supabase/.envConfiguración, contraseñas y claves

8.4 Backups​

No hay backup automático. Recomendado:

  • Base de datos: pg_dump periódico, por ejemplo:
    cd /home/supabase
    docker exec supabase-db pg_dump -U postgres -Fc postgres > backup-$(date +%F).dump
    y copia el archivo fuera del servidor.
  • Archivos: copia /home/supabase/volumes/storage.
  • Configuración: guarda una copia del .env en un lugar seguro (sin él, las claves JWT cambian y los tokens emitidos dejan de ser válidos).

8.5 Recursos​

Si Studio se vuelve lento o los contenedores se reinician por falta de memoria, aumenta el límite de cloudlets del nodo en la Topología del Entorno.

9. Seguridad — checklist​

  • Guardar el email de instalación en un lugar seguro y cambiar la contraseña del panel si se comparte.
  • Usar solo la publishable key en el frontend; secret/service role solo en el backend.
  • Activar RLS en todas las tablas expuestas por la API.
  • Configurar SMTP antes de abrir el registro por email.
  • Cerrar los puertos 5432/6543 si no hay acceso externo a la base.
  • Habilitar el MCP solo si lo vas a usar, generar un token nuevo si se filtra y deshabilitarlo cuando ya no se necesite.

10. Problemas comunes​

SíntomaCausa probable / qué hacer
El navegador avisa de un certificado inválidoCertificado aún no emitido o el dominio no está en él: revisa el add-on Let's Encrypt
El dominio propio no abreEl DNS no apunta al entorno, o el dominio no se agregó en Let's Encrypt antes de Custom Domain
No llega el email de confirmaciónSMTP no configurado (ver sección 8.2)
/mcp responde 401Token ausente/incorrecto en el header Authorization: Bearer
/mcp responde 403MCP deshabilitado: usa Habilitar en el add-on MCP
Algo no arrancash run.sh status y sh run.sh logs <servicio>

11. Referencias​