Supabase CLI: Desarrollo Local
El Supabase CLI te permite correr una instancia completa de Supabase en tu máquina. Base de datos, auth, storage, edge functions -- todo local, sin depender de internet ni de los servidores de Supabase. Esto te da un entorno de desarrollo rápido, reproducible y gratuito.
Instalar el CLI
npm install -g supabaseVerifica la instalación:
supabase --versionDocker requerido
El CLI usa Docker para levantar los servicios locales. Asegúrate de tener Docker Desktop (o Docker Engine en Linux) instalado y corriendo antes de ejecutar supabase start.
Alternativas de instalación
# Con Homebrew (macOS)
brew install supabase/tap/supabase
# Con Scoop (Windows)
scoop bucket add supabase https://github.com/supabase/scoop-bucket.git
scoop install supabaseInicializar un proyecto
Dentro de tu proyecto (dónde está tu package.json), ejecuta:
supabase initEsto crea una carpeta supabase/ con la siguiente estructura:
supabase/
config.toml # Configuración del proyecto local
migrations/ # Archivos de migración SQL
functions/ # Edge Functions
seed.sql # Datos iniciales (opcional)El archivo config.toml contiene la configuración de todos los servicios locales: puerto de la base de datos, configuración de auth, límites de storage, etc.
Levantar Supabase local
supabase startLa primera vez tarda unos minutos porque descarga las imágenes de Docker. Las siguientes veces arranca en segundos.
Cuando termina, te muestra todas las URLs y keys locales:
Started supabase local development setup.
API URL: http://localhost:54321
GraphQL URL: http://localhost:54321/graphql/v1
DB URL: postgresql://postgres:postgres@localhost:54322/postgres
Studio URL: http://localhost:54323
Inbucket URL: http://localhost:54324
JWT secret: super-secret-jwt-token-for-local-dev
anon key: eyJ...
service_role key: eyJ...Qué incluye el entorno local
| Servicio | URL | Descripción |
|---|---|---|
| API | localhost:54321 | PostgREST, GoTrue, Storage, Realtime |
| Studio | localhost:54323 | Dashboard web idéntico al de producción |
| DB | localhost:54322 | PostgreSQL directo |
| Inbucket | localhost:54324 | Captura emails (para probar auth sin enviar emails reales) |
Studio local
Abriendo http://localhost:54323 tienes un dashboard completo para administrar tu base de datos, ver usuarios, configurar RLS y todo lo que harías en el dashboard de producción.
Detener los servicios
supabase stopPara detener y borrar todos los datos locales (reset completo):
supabase stop --no-backupConectar con un proyecto remoto
El CLI puede conectarse a tu proyecto de Supabase en la nube para sincronizar esquemas, migraciones y configuración.
Login
supabase loginEsto abre el browser para autenticarte con tu cuenta de Supabase y guarda un token de acceso local.
Link
supabase link --project-ref tu-project-refEl project-ref es el ID de tu proyecto. Lo encuentras en el dashboard en Settings > General > Reference ID. También es la primera parte de tu URL de Supabase (el abcdef en abcdef.supabase.co).
Cuando linkeas, el CLI sabe a qué proyecto remoto apuntar para operaciones como db push, db pull y functions deploy.
Generar migraciones con db diff
supabase db diff compara el estado actual de tu base de datos local con el último estado conocido y genera un archivo de migración SQL con los cambios.
Flujo de trabajo
- Abre Studio local (
localhost:54323) - Haz los cambios que necesites: crear tablas, agregar columnas, definir políticas RLS
- Genera la migración:
supabase db diff --use-migra -f nombre_descriptivoEsto crea un archivo en supabase/migrations/ con el SQL necesario para reproducir tus cambios:
supabase/migrations/20250312120000_nombre_descriptivo.sqlEl nombre del archivo incluye un timestamp para que las migraciones se ejecuten en orden.
Usa nombres descriptivos
El nombre de la migración es lo único que tienes para entender qué hace sin abrirla. Usa nombres como crear_tabla_productos, agregar_rls_pedidos, indice_busqueda_nombre. Evita nombres genéricos como cambios o update.
Generar tipos de TypeScript
Una de las mejores funciones del CLI: generar tipos de TypeScript basados en tu esquema de base de datos.
supabase gen types typescript --local > lib/database.types.tsEsto lee tu esquema local y genera un archivo con todos los tipos:
// lib/database.types.ts (auto-generado)
export interface Database {
public: {
Tables: {
productos: {
Row: {
id: number
nombre: string
precio: number
activo: boolean
created_at: string
}
Insert: {
id?: number
nombre: string
precio: number
activo?: boolean
created_at?: string
}
Update: {
id?: number
nombre?: string
precio?: number
activo?: boolean
created_at?: string
}
}
// ... mas tablas
}
}
}Usar los tipos generados
// lib/supabase.ts
import { createClient } from '@supabase/supabase-js'
import type { Database } from './database.types'
export const supabase = createClient<Database>(
process.env.NEXT_PUBLIC_SUPABASE_URL!,
process.env.NEXT_PUBLIC_SUPABASE_ANON_KEY!
)Ahora tienes autocompletado completo:
// TypeScript sabe que "productos" es una tabla válida
// y que tiene columnas "id", "nombre", "precio", etc.
const { data } = await supabase
.from('productos') // autocomplete de tablas
.select('nombre, precio') // autocomplete de columnas
.eq('activo', true) // TypeScript valida el tipo del valorGenerar desde el proyecto remoto
supabase gen types typescript --project-id tu-project-ref > lib/database.types.tsAutomatiza la generación
Agrega un script en tu package.json para regenerar los tipos con un solo comando:
{
"scripts": {
"types": "supabase gen types typescript --local > lib/database.types.ts"
}
}Ejecuta npm run types cada vez que modifiques el esquema.
Flujo de trabajo local vs remoto
El CLI te permite trabajar con dos modelos:
Modelo 1: Local primero (recomendado)
- Hacer cambios en la base de datos local (Studio o SQL)
- Generar migración con
supabase db diff - Verificar que la migración es correcta
- Pushear la migración al proyecto remoto con
supabase db push - Regenerar tipos con
supabase gen types - Commitear migración y tipos al repositorio
# Despues de hacer cambios en Studio local
supabase db diff --use-migra -f crear_tabla_pedidos
supabase db push
supabase gen types typescript --local > lib/database.types.ts
git add supabase/migrations/ lib/database.types.ts
git commit -m "feat: crear tabla pedidos"Modelo 2: Remoto primero
- Hacer cambios directamente en el dashboard de producción
- Bajar los cambios con
supabase db pull - Esto genera una migración basada en el diff entre local y remoto
supabase db pull
# Genera migracion en supabase/migrations/Cuidado con el modelo remoto
Hacer cambios directamente en producción es riesgoso. Si algo sale mal, no tienes un archivo de migración para revertir. Siempre que puedas, trabaja en local primero.
Comandos útiles
| Comando | Qué hace |
|---|---|
supabase init | Inicializa la carpeta supabase/ |
supabase start | Levanta todos los servicios locales |
supabase stop | Detiene los servicios |
supabase status | Muestra URLs y keys del entorno local |
supabase login | Autentica con tu cuenta de Supabase |
supabase link | Conecta con un proyecto remoto |
supabase db diff | Genera migración desde cambios locales |
supabase db push | Aplica migraciones al proyecto remoto |
supabase db pull | Baja cambios del proyecto remoto |
supabase db reset | Resetea la DB local y re-ejecuta migraciones |
supabase gen types | Genera tipos de TypeScript |
supabase functions serve | Levanta Edge Functions en modo desarrollo |
supabase functions deploy | Deploya Edge Functions a producción |
Resumen
| Concepto | Detalle |
|---|---|
| Instalación | npm install -g supabase |
| Prerequisito | Docker corriendo |
| Inicializar | supabase init crea la carpeta de configuración |
| Entorno local | supabase start levanta todo con Docker |
| Dashboard local | http://localhost:54323 (Studio) |
| Conectar remoto | supabase link --project-ref ID |
| Tipos TS | supabase gen types typescript --local |
| Flujo recomendado | Cambiar en local, generar migración, push a remoto |