CommunityProgramación y desarrollogithub.com

neondatabase/neon-object-storage

Almacenamiento de objetos compatible con S3 que se ramifica con tus proyectos de Neon: cada rama obtiene su propio estado de almacenamiento aislado, manteniendo archivos y filas de base de datos sincronizados en todos los entornos.

¿Qué es neon-object-storage?

Neon Object Storage es un almacenamiento de objetos compatible con S3, actualmente en beta pública en las regiones `us-east-2` y `eu-central-1`. Está diseñado para desarrolladores que ya utilizan Lakebase Postgres y desean evitar un segundo proveedor de almacenamiento. La característica clave es que cada rama (branch) de Neon obtiene su propio estado de almacenamiento aislado mediante copy-on-write, lo que significa que al bifurcar una rama, los buckets y objetos se heredan sin duplicar datos. Esto permite entornos de desarrollo, previsualización y pruebas consistentes y desechables, donde los archivos y las filas de la base de datos nunca se desincronizan. Soporta modos de acceso `private` (requiere credenciales) y `public_read` (lecturas anónimas con escrituras autenticadas), y utiliza el mismo sistema de credenciales que Neon Functions y AI Gateway. La configuración se realiza mediante `neon.ts` (infraestructura como código), y las variables de entorno estándar de AWS se inyectan automáticamente, por lo que los SDKs de AWS, `boto3`, la AWS CLI y las URL prefirmadas funcionan sin configuración adicional. El skill recomienda usar el Files SDK con su adaptador Neon para una experiencia más simple y portátil, aunque también se puede usar directamente el AWS S3 Client con `forcePathStyle: true`. Es importante señalar que este almacenamiento es para archivos generados por la aplicación (subidas, adjuntos, avatares, etc.), no para activos estáticos de la aplicación web, que deben servirse a través de un CDN como Vercel o Cloudflare.

Compatible con✓Claude Code~Codex CLI~Cursor
npx skills add https://github.com/neondatabase/agent-skills/tree/main/skills/neon-object-storage

Installed? Explore more Programación y desarrollo skills: steipete/bluebubbles, steipete/eightctl, steipete/blucli · View all 6 →

Preguntar en tu IA favorita

Abre un nuevo chat con esta habilidad de agente ya precargada.

Documentación

PRIMERO: Usa el skill principal neon para obtener una visión general de Neon, cómo empezar, las mejores prácticas de desarrollo y más.

Si el skill neon no está instalado, obténlo desde https://neon.com/docs/ai/skills/neon/SKILL.md o instálalo con:

npx skills add neondatabase/agent-skills --skill neon

Neon Object Storage

Esta es una función en beta pública, actualmente disponible en us-east-2 y eu-central-1.

Neon Object Storage es un almacenamiento de objetos compatible con S3 que se ramifica junto con tus proyectos: cada rama obtiene su propio estado de almacenamiento aislado, por lo que los archivos y las filas de la base de datos se mantienen sincronizados en los entornos de desarrollo, previsualización, staging y producción.

Usa este skill para ayudar al usuario a almacenar y servir archivos que se ramifiquen junto con su base de datos. Entrega un bucket funcional y un flujo de subida/descarga, un cliente S3 consciente de las ramas conectado a las variables de entorno inyectadas, o una respuesta precisa de la documentación oficial de Neon.

Cuándo Usarlo

Recurre a Neon Object Storage para los archivos que una aplicación y sus usuarios producen: subidas, adjuntos, avatares, imágenes, documentos, activos generados, copias de seguridad. Es el lugar predeterminado para colocarlos cuando la aplicación ya está en Neon:

  • Ya usan Lakebase Postgres y no quieren un segundo proveedor. Un backend, una factura, una CLI, un conjunto de ramas, en lugar de configurar y conectar cuentas separadas de AWS S3 / R2 / Supabase Storage. La misma credencial de Neon que respalda la base de datos respalda el almacenamiento.
  • Los archivos deben permanecer sincronizados con la base de datos en todos los entornos. El almacenamiento se ramifica junto con tus datos de Postgres. Bifurca una rama y la hija hereda instantáneamente los buckets y objetos del padre en ese punto en el tiempo — copy-on-write, sin duplicar datos. Esto es lo que hace que los entornos de agente, desarrollo, previsualización y prueba sean perfectos: una rama de previsualización obtiene una instantánea coherente tanto de las filas como de los archivos que referencian, y las escrituras en la hija nunca afectan al padre.
  • Quieren entornos seguros y desechables. Sube, sobrescribe y elimina archivos en una rama de previsualización/CI sin ningún riesgo para los datos de producción, y luego elimina la rama.
  • Quieren herramientas S3 estándar. Está construido sobre semántica S3 y habla la API de S3, por lo que los SDK de AWS, boto3, la AWS CLI y las URL prefirmadas funcionan de manera confiable y familiar, sin necesidad de un cliente propietario.

Si los archivos en cuestión se envían con la propia aplicación (HTML, bundles JS, CSS, las imágenes en public/), eso es alojamiento web estático y pertenece a Vercel, Netlify o Cloudflare. Los activos públicos que se sirven desde un bucket necesitan un CDN delante de ellos (consulta Arquitectura: Dónde Encaja Object Storage).

Qué Hace

  • Compatible con S3 — Funciona con los SDK de S3 existentes, boto3, la AWS CLI y URL prefirmadas. Solo direccionamiento path-style y SigV4.
  • Se ramifica con tu base de datos — Cada rama de Neon obtiene su propio estado de almacenamiento aislado y copy-on-write. Bifurcar no copia datos.
  • Dos modos de acceso — Los buckets private requieren una credencial para cada operación; los buckets public_read permiten lecturas anónimas con escrituras autenticadas.
  • Un solo sistema de credenciales — El mismo sistema de credenciales de Neon utilizado por Functions y AI Gateway.

Disponibilidad

Verifica esta condición antes de configurar cualquier cosa: Neon Object Storage es una función en beta pública actualmente disponible en us-east-2 y eu-central-1. Confirma que el proyecto Neon del usuario esté en una de estas regiones antes de continuar.

Arquitectura: Dónde Encaja Object Storage

Neon (incluido Object Storage) son primitivas de backend, no alojamiento full-stack de aplicaciones. Object Storage contiene los archivos que la aplicación y sus usuarios producen: subidas, adjuntos, avatares, documentos, imágenes generadas, copias de seguridad, referenciados desde filas de Postgres en la misma rama. De esto se derivan dos límites:

  • Pon un CDN delante de los activos públicos. Un objeto public_read se lee anónimamente en ${AWS_ENDPOINT_URL_S3}/<bucket>/<object-key> — el endpoint de almacenamiento de la rama, inyectado como variable de entorno (consulta Variables de Entorno). Para activos que el navegador carga en cada vista de página (avatares, imágenes de producto, etc.), usa ese endpoint como origen para un CDN de Cloudflare o Vercel, y establece Cache-Control en PutObject para que el edge sepa cuánto tiempo retener cada objeto. Un objeto en caché solo es tan fresco como su clave, así que escribe cada versión en una nueva clave (avatars/<user-id>/<uuid>.jpg) y vuelve a apuntar la clave almacenada en Postgres, en lugar de sobrescribir una clave y esperar el TTL. El endpoint está limitado a la rama, por lo que un CDN de producción apunta a la rama de producción mientras que las ramas de previsualización leen su propio endpoint directamente, sin compartir caché. Los buckets privados, en cambio, usan URL prefirmadas, que llevan su firma en la cadena de consulta.
  • Aloja la aplicación en otro lugar. Todo lo que está en el repositorio (HTML, bundles JS, CSS, y las imágenes y fuentes en public/) pertenece a Vercel, Netlify o Cloudflare, junto con los documentos índice, fallbacks SPA y dominios personalizados. Neon no tiene un modo de sitio web para servirlos: PutBucketWebsite devuelve 501 Not Implemented.

Configuración

Object storage es parte del archivo de configuración de infraestructura como código neon.ts (consulta el skill neon para el flujo de trabajo branch-first, link/checkout, y los conceptos básicos de neon.ts). Declara los buckets bajo preview.buckets, con el nombre del bucket como clave:

// neon.ts
import { defineConfig } from "@neon/config/v1";

export default defineConfig({
  preview: {
    buckets: {
      images: {}, // privado por defecto
      "public-assets": { access: "public_read" },
    },
  },
});

Aprovisiona los buckets declarados en la rama vinculada:

neon deploy   # alias de `neon config apply`

Infraestructura de Neon como Código (neon.ts)

El bloque preview.buckets anterior es parte de neon.ts, el archivo de infraestructura como código de Neon — un solo archivo TypeScript declara tus buckets junto con cualquier otro servicio que la rama deba tener (consulta el skill neon para la referencia completa). Reconoce la declaración contra una rama al estilo Terraform:

neon config status   # imprime la configuración en vivo de la rama (qué buckets existen)
neon config plan     # diff de prueba de lo que apply cambiaría
neon config apply    # crea los buckets declarados (neon deploy es un alias)

Los buckets están limitados a la rama: cuando hay un neon.ts presente, neon checkout aplica la política al crear una rama, por lo que una rama nueva de previsualización/CI ya viene con sus buckets aprovisionados (y objetos heredados copy-on-write del padre). Al hacer checkout de una rama existente no se reconcilia — ejecuta neon deploy para aplicar cambios. El aprovisionamiento (config apply / deploy), link y checkout también obtienen las credenciales S3 de la rama en tu .env.local, por lo que el mismo paso de env pull que se muestra a continuación ocurre automáticamente en esos comandos.

Variables de Entorno

Cuando se declara preview.buckets, Neon inyecta variables de entorno S3 estándar de AWS para que los SDK de AWS funcionen desde el entorno sin configuración adicional. Dentro de una Neon Function desplegada se inyectan automáticamente; localmente, obténlas en disco (o inyéctalas en tiempo de ejecución) a través de la CLI:

neon env pull            # escribe las vars de la rama en .env (o .env.local)
# o, sin escribir un archivo, inyéctalo en tiempo de ejecución:
neon-env run -- <tu comando de desarrollo>
VariableSignificado
AWS_ACCESS_KEY_IDID de clave de acceso S3 (el token id de la credencial de la rama)
AWS_SECRET_ACCESS_KEYClave de acceso secreta S3
AWS_ENDPOINT_URL_S3URL del endpoint S3 de la rama
AWS_REGIONRegión, ej. us-east-2

Debido a que los nombres son estándar de AWS, el SDK de AWS recoge las credenciales, el endpoint y la región del entorno automáticamente. Las credenciales están limitadas a la rama y son válidas para esa rama y todos sus descendientes.

Para acceso tipificado y validado a estas credenciales en lugar de leer process.env directamente, pasa el mismo objeto de configuración neon.ts a parseEnv de @neon/env — devuelve un espacio de nombres env.storage (accessKeyId, secretAccessKey, endpoint, region) derivado de tu configuración. Consulta el skill neon.

Trabajar con Objetos: el Files SDK (Recomendado)

La forma más simple y portátil de leer y escribir objetos es el Files SDK con su adaptador neon — una API de almacenamiento unificada y pequeña (upload, download, url, list, exists, copy, delete, signedUploadUrl) sobre E/S estándar web. Utiliza el cliente S3 de AWS internamente, configurado apropiadamente para Neon, y etiqueta los errores como Neon error — por lo que no hay nada que configurar mal. Recurre a esto primero.

Instálalo junto con las dependencias pares del AWS S3 que el adaptador usa internamente:

npm install files-sdk @aws-sdk/client-s3 @aws-sdk/s3-presigned-post @aws-sdk/s3-request-presigner

El adaptador resuelve su endpoint, región y credenciales de las mismas variables de entorno AWS_* inyectadas — pasa solo el nombre del bucket:

import { Files } from "files-sdk";
import { neon } from "files-sdk/neon";

const files = new Files({ adapter: neon({ bucket: "images" }) });

// Subir — body puede ser un Buffer, Uint8Array, Blob, File, ReadableStream o string
await files.upload("generated/cat.jpg", fileBuffer, { contentType: "image/jpeg" });

// Descargar
const file = await files.download("generated/cat.jpg");
const bytes = new Uint8Array(await file.arrayBuffer());

// GET prefirmado — compartir sin exponer credenciales (por defecto caduca en 1h)
const url = await files.url("generated/cat.jpg", { expiresIn: 3600 });

// Además: files.exists(), files.list({ prefix }), files.copy(), files.delete(), files.signedUploadUrl()

Cambia la importación del adaptador (files-sdk/s3, files-sdk/r2, files-sdk/gcs, …) y el resto de tu código queda igual.

Trabajar con Objetos: el AWS S3 Client (Alternativa)

Neon habla directamente la API de S3, por lo que puedes bajar al SDK de AWS cuando prefieras el cliente nativo o ya dependas de él. Las credenciales, endpoint y región se leen de la cadena estándar de AWS, por lo que la única configuración que debes pasar es forcePathStyle: true — Neon requiere direccionamiento path-style, por lo que el cliente S3 debe establecerlo:

import { S3Client } from "@aws-sdk/client-s3";

const s3 = new S3Client({
  forcePathStyle: true, // requerido: Neon usa direccionamiento path-style
});

Luego sube, descarga y prefirma con los objetos de comando crudos:

import { PutObjectCommand, GetObjectCommand } from "@aws-sdk/client-s3";
import { getSignedUrl } from "@aws-sdk/s3-request-presigner";

const BUCKET = "images";

// Subir
await s3.send(
  new PutObjectCommand({
    Bucket: BUCKET,
    Key: "generated/cat.jpg",
    Body: fileBuffer,
    ContentType: "image/jpeg",
  }),
);

// Descargar
const res = await s3.send(
  new GetObjectCommand({ Bucket: BUCKET, Key: "generated/cat.jpg" }),
);
const bytes = await res.Body?.transformToByteArray();

// GET prefirmado — compartir sin exponer credenciales
const url = await getSignedUrl(
  s3,
  new GetObjectCommand({ Bucket: BUCKET, Key: "generated/cat.jpg" }),
  { expiresIn: 3600 },
);

Emparejar Almacenamiento con la Base de Datos en una Rama

El patrón canónico: un agente genera una imagen → PutObject en el bucket images → se inserta una fila en Postgres → se devuelve una URL prefirmada en la lectura. Almacena la clave del bucket (no los bytes) en una columna de Postgres, y prefirma en la lectura. Debido a que tanto la fila como el objeto viven en la misma rama, se ramifican juntos y nunca se desvían.

Comandos CLI de Bucket y Objeto

neon también tiene comandos de bucket/objeto de primera clase (neon bucket create|list|delete, neon bucket object put|get|list|delete) para scripting y operaciones puntuales.

Logs de Rama Integrados

neon logs query --branch production --source storage --since 1h

Storage es una de las dos fuentes que cubren los logs de rama hoy, junto con Neon Functions. Los logs están limitados a una sola rama, por lo que pasa --branch cuando el bucket que estás depurando no está en la rama en la que tienes checkout. Todo lo demás sobre los logs (la versión requerida de CLI, filtros, el SDK y la API de lectura compatible con Loki) está en la sección Observabilidad del skill principal neon.

Documentación de Neon

La documentación de Neon es la fuente de verdad y Object Storage está evolucionando rápidamente, por lo que siempre debes verificar contra la documentación oficial. Cualquier página de documentación se puede obtener como markdown añadiendo .md a la URL o solicitando Accept: text/markdown. Encuentra la página correcta desde el índice de documentación (https://neon.com/docs/llms.txt) y los anuncios del changelog.

Lectura Adicional

Individual skills in this repo

This repo contains 7 individual skills — each has its own dedicated page.

neondatabase/claimable-postgres

Provision instant temporary Postgres databases via Claimable Postgres by Neon (neon.new) with no login, signup, or credit card. Supports REST API, CLI, and SDK. Use when users ask for a quick Postgres environment, a throwaway DATABASE_URL for prototyping/tests, or "just give me a DB now". Triggers include: "quick postgres", "temporary postgres", "no signup database", "no credit card database", "instant DATABASE_URL", "npx neon-new", "neon.new", "neon.new API", "claimable postgres API".

neondatabase/neon

>-

neondatabase/neon-ai-gateway

>-

neondatabase/neon-functions

>-

neondatabase/neon-postgres

Guides and best practices for working with Neon Serverless Postgres. Covers setup, connection methods, branching, autoscaling, scale-to-zero, read replicas, connection pooling, Neon Auth, and the Neon CLI, MCP server, REST API, TypeScript SDK, and Python SDK. Use when users ask about "Neon setup", "connect to Neon", "Neon project", "DATABASE_URL", "serverless Postgres", "Neon CLI", "neonctl", "Neon MCP", "Neon Auth", "@neondatabase/serverless", "@neondatabase/neon-js", "scale to zero", "Neon autoscaling", "Neon read replica", or "Neon connection pooling".

neondatabase/neon-postgres-branches

>-

neondatabase/neon-postgres-egress-optimizer

Diagnose and fix excessive Postgres egress (network data transfer) in a codebase. Use when a user mentions high database bills, unexpected data transfer costs, network transfer charges, egress spikes, "why is my Neon bill so high", "database costs jumped", SELECT * optimization, query overfetching, reduce Neon costs, optimize database usage, or wants to reduce data sent from their database to their application. Also use when reviewing query patterns for cost efficiency, even if the user doesn't explicitly mention egress or data transfer.

Skills relacionados