Funciones · Base de datos

Una base de datos real, ya conectada.

Postgres administrado, sin necesidad de abrir una cuenta de base de datos. En un plan de pago, tus bases de datos administradas son un total compartido entre todas tus apps: pide una al desplegar, y una sola acción la crea, la conecta y solo entonces compila, así que las migraciones que ejecuta tu compilación llegan a ella ya en la primera compilación. El plan Free incluye una para tu app: con su primer despliegue cuando el plan Free ejecuta el código de servidor de la app y, en caso contrario, una vez que está en línea; se conserva mientras la app siga en línea.

Leer la documentaciónConfigurar tu agente

Lo que llama tu agente

  • deploy
  • databaseCreate
  • databaseStatus
  • databaseReconcile
claude · ~/franks-kitchenejemplo

Take my restaurant app live, with a database.

tofu · setFramework nextjs

confirmed

tofu · deploy database: true

managed database ready · Postgres

DATABASE_URL + 5 more · write-only

build ready

HTTP 200 · publicly reachable

Live at https://franks-kitchen-3f9a1c07b2e4.trytofu.app

Una sola acción

Crea, conecta y luego compila. En ese orden y en un solo paso.

Elige una base de datos en el paso de despliegue: una casilla en el panel, database: true desde tu agente o deploy --database desde una terminal. Cada base de datos cuenta para las que incluye tu plan, así que nunca viene por defecto: solo tu sí, para esa app, crea una.

  1. Crear la base de datos

    Una base de datos Postgres propia, en la región que elijas: Americas, EMEA o APAC.
  2. Esperar a que esté en buen estado

    Hasta 2 minutos. Si para entonces no está conectada, no se envía ninguna compilación y la respuesta indica en qué estado está.
  3. Escribir la configuración de conexión

    En el proyecto de alojamiento de tu app: la conexión como valores de solo escritura y el certificado público de la base de datos junto a esos valores. En un primer despliegue, Tofu crea ese proyecto aquí.
  4. Compilar, con la base de datos en su lugar

    Solo ahora. Cuando tu compilación ejecuta tus migraciones, estas se ejecutan contra la nueva base de datos ya en la primera compilación, antes de que la app se ponga en línea.

Una base de datos creada antes desde la página Base de datos se conecta de la misma manera con tu siguiente despliegue, antes de que ese despliegue compile.

Lo que recibe tu app

Todo conectado, nunca a la vista.

Tofu escribe la configuración de conexión directamente en el entorno sensible y de solo escritura de tu proveedor de alojamiento y, junto a ella, el certificado público de la base de datos como un valor no secreto. Tofu solo guarda los nombres y nada más, y no se usa ninguna clave de service role.

VariableQuién la recibe
DATABASE_URLTodas las apps: la cadena de conexión, a través del pooler de transacciones del proveedor.
SUPABASE_URLTodas las apps: la dirección pública del proyecto de base de datos.
SUPABASE_ANON_KEYTodas las apps: su clave pública.
SUPABASE_CA_CERTTodas las apps: el certificado raíz público del servidor de base de datos, para que tu código pueda comprobar que habla con tu base de datos. No es un secreto.
‹prefix›SUPABASE_URL‹prefix›SUPABASE_ANON_KEY‹prefix›SUPABASE_PUBLISHABLE_KEYApps de Next.js (NEXT_PUBLIC_), Vite (VITE_) y Astro (PUBLIC_): de nuevo la dirección pública y la clave, con el nombre que espera el código que se ejecuta en el navegador.

Cualquier otro preset, incluidas las apps de servidor en Python, Go o JavaScript, recibe solo los nombres del lado del servidor, porque Tofu no adivina un prefijo para el navegador.

Confirma el framework de tu app antes de que se conecte la base de datos: los nombres para el navegador se eligen a partir de él en ese momento y no se agregan después.

En el plan Free, si tu app está en el alojamiento estático compartido de Tofu, sus páginas llegan a la base de datos directamente desde el navegador, así que solo recibe la dirección pública y la clave bajo VITE_, y no recibe DATABASE_URL ni el certificado. En caso contrario, recibe lo mismo que en un plan de pago.

Tu esquema

Tus migraciones, las ejecuta tu compilación.

La base de datos empieza vacía a propósito: el esquema pertenece al repositorio que lo define. Si pones tu migración en el comando de compilación, cada despliegue trae consigo el esquema: no se copia ninguna credencial a ningún lugar y el esquema no puede quedarse atrás respecto del código con el que se despliega.

A partir del 30 de octubre de 2026, Supabase ya no concede automáticamente acceso a las tablas nuevas de public a los roles que usan las páginas de la app, así que la migración que crea una tabla tiene que otorgarle permisos: select a anon solo para lo que pueden leer los visitantes que no iniciaron sesión, select, insert, update, delete a authenticated, y los mismos a service_role si el código del servidor lo usa. Una vista necesita su propio grant select, creado con security_invoker = true para que las filas que están debajo sigan protegidas por sus reglas de acceso.

Si falla una migración que ejecuta tu compilación, la compilación falla y la versión anterior sigue en línea. Las sentencias que ya se habían aplicado no se revierten.

Cuando la página Base de datos de tu app lo indica, Tofu aplica por sí mismo los archivos de tu carpeta supabase/migrations antes de cada actualización. Si uno de ellos falla, Tofu detiene esa actualización antes de compilarla, y cualquier versión que ya esté en línea sigue funcionando.

La estructura viaja; los datos no. Las migraciones que ejecuta tu compilación llegan a esta base de datos. Las filas que solo existen en tu computadora no llegan, a menos que una migración las inserte.

En el plan Free, si tu app está en el alojamiento estático compartido de Tofu, su compilación no ejecuta migraciones, así que sus tablas se crean fuera de la compilación, como lo muestra la página Base de datos de tu app. Si no, su compilación puede ejecutarlas, como en un plan de pago.

package.jsonprisma
{
  "scripts": {
    "build": "prisma migrate deploy && next build"
  }
}
Drizzle: drizzle-kit migrate. Supabase CLI: supabase db push --db-url "$DATABASE_URL". SQL directo: el ejecutor que ya tiene tu repositorio.

Ver tus datos

Un editor de tablas, no una consola de SQL.

La página Base de datos muestra las tablas de tu esquema public y recorre sus filas página por página, sin entregarle una consola a nadie.

  • Lectura

    Todas las tablas de tu base de datos, 25 filas por página

    Los esquemas propios de tu app y los que el servicio de base de datos mantiene para ella (entre ellos, sus cuentas de inicio de sesión, en modo de solo lectura, con contraseñas y tokens ocultos hasta que presionas Mostrar), con el tipo de cada columna, la clave principal y si la seguridad a nivel de fila está activada. El recuento de filas es una estimación del planificador y la pantalla lo indica.

  • Escritura

    Desactivado hasta que lo actives

    La escritura se activa con un interruptor por app. Cada inserción, cambio o eliminación afecta una sola fila y se confirma por separado; si una fila cambió mientras tanto, se avisa en lugar de sobrescribirla.

  • Nunca

    Sin cambios de esquema, sin SQL, sin exportación

    El editor no puede crear, modificar ni eliminar nada, y las filas solo salen de él una página a la vez, en tu pantalla.

  • Solo para ti

    En tu panel, no en tu agente

    Ningún agente puede leer ni escribir filas. El editor se conecta con el rol de administrador de la propia base de datos, así que la seguridad a nivel de fila no lo limita, y el panel lo indica.

Tuyo para quedártelo

Tus datos, y tu forma de salir.

Se traslada a tu propia organización de Supabase

Si lo solicitas, la base de datos se traslada a una organización de Supabase que te pertenece: un traslado que se acuerda contigo y se revisa, en la misma región, y no un botón.

La cadena de conexión, cuando la necesitas

Para usar una herramienta local o hacer un arreglo de datos puntual, presiona “Mostrar la clave de la base de datos”: la cadena de conexión se vuelve a generar para ti, que eres el propietario, y queda registrado. Ningún agente puede recibirla.

Se elimina cuando tú lo decides

Eliminar una base de datos es una acción del propietario: escribes el nombre de la app y se eliminan la base de datos, su esquema y sus datos, sin dejar ninguna copia.

Todavía no está hecho

  • Solo Next.js, Vite y Astro obtienen nombres de variables para el navegador. Los demás presets reciben los nombres del lado del servidor, y todavía ninguna app de Python o Go se ha ejecutado de principio a fin contra una base de datos administrada.

  • No hay rotación de contraseñas. Nada en el panel cambia la contraseña de la base de datos; si sospechas que se filtró, es un caso de soporte.

Cómo se comporta esta base de datos

  • Tofu no diseña tablas propias ni tiene consola de SQL. Las tablas de tu app provienen de sus propias migraciones: cuando la página Base de datos de tu app lo indica, Tofu aplica los archivos de supabase/migrations antes de cada actualización; si no, las aplica un paso de migración en tu compilación o tu propia computadora con la clave de la base de datos. La falta de consola de SQL es una decisión deliberada: el código que se sube es una entrada no confiable y una sola credencial de operador da acceso a todas las bases de datos administradas.

  • Los datos locales se quedan locales. Las filas que solo existen en tu computadora nunca llegan a esta base de datos, a menos que una migración las inserte.

  • Sin tablas ni políticas propias de Tofu. La base de datos empieza vacía; tus migraciones crean las tablas y las políticas de seguridad a nivel de fila de las que depende tu app.

  • La cantidad de bases de datos depende de tu plan. La cantidad es para todas tus apps en conjunto. La página de precios indica qué planes incluyen bases de datos y cuántas.

Pega un prompt. En línea en 10 minutos.

Tu app, su base de datos, tu dominio y tu inicio de sesión: desde el agente que ya usas, en unos 10 minutos.

Empezar gratis