Saltearse al contenido

Sitios estáticos (S3 / disco)

Sirve un sitio 100% estático —HTML, CSS, JS, imágenes, una aplicación de una sola página compilada— directamente desde un almacenamiento de objetos compatible con S3 o desde disco local, sin necesidad de un servidor de origen HTTP. Tero Services trae el objeto del almacenamiento, lo cachea en el borde y lo entrega manteniendo TLS, WAF, geo-bloqueo y el resto de los controles.

El modelo es el de una red de distribución de contenido (estilo CloudFront): definís un origen (el almacenamiento) y una o varias rutas que sirven desde él. La primera solicitud trae el objeto; las siguientes se sirven desde la caché de borde con latencia mínima.

  • Páginas de aterrizaje, sitios institucionales y documentación generada estáticamente (Astro, Hugo, Jekyll, etc.).
  • Aplicaciones de una sola página (React, Vue, Svelte, Angular) compiladas a archivos estáticos.
  • El frontend estático de una aplicación cuyo backend vive en otra ruta (/api/* → servidor de origen, / → sitio estático).
  • Cuando querés desacoplar el contenido del cómputo: publicás subiendo archivos al bucket, sin servidores que mantener.

Un origen es un proveedor de almacenamiento reutilizable: se da de alta una vez y lo referencian todas las rutas que sirven desde él. Hay dos tipos.

Cualquier almacenamiento de objetos que hable el protocolo S3. Probados y soportados:

ProveedorNotas
Amazon S3Servicio de AWS. Región estándar.
Cloudflare R2Sin cargos de egreso; endpoint propio.
Backblaze B2Endpoint compatible con S3.
WasabiAlmacenamiento de bajo costo compatible con S3.
DigitalOcean SpacesEndpoint regional compatible con S3.
GarageAuto-alojado, liviano, ideal en la misma red.
MinIOAuto-alojado, alto rendimiento.
Ceph (RADOS Gateway)Almacenamiento de objetos a escala.

Las credenciales (clave de acceso + secreto) se guardan cifradas en reposo y nunca se devuelven por la API ni aparecen en registros.

Almacenamiento en disco gestionado por Host Admin; cada bucket es una carpeta. No requiere credenciales ni endpoint. Pensado para servir sitios y landings con cero dependencias externas. El acceso queda acotado al área asignada (no puede salir de ella).

La configuración se divide en tres niveles: el origen, la ruta que sirve desde ese origen, y la caché de borde.

OpciónAplica aDescripción
EndpointS3URL del servicio (por ejemplo, https://s3.amazonaws.com o el endpoint de R2/MinIO).
RegiónS3Región del bucket (por ejemplo, us-east-1, auto).
Estilo de pathS3path-style (endpoint/bucket/key) o virtual-hosted (bucket.endpoint/key). Garage/MinIO suelen usar path-style.
Permitir HTTPS3Habilita endpoints sin TLS (solo para almacenamiento en red interna de confianza).
CredencialesS3Clave de acceso + secreto, cifradas en reposo.
Área de discoDiscoEspacio asignado y gestionado por Host Admin; cada bucket es una carpeta dentro de él.
OpciónDescripciónPor defecto
BucketBucket (o subdirectorio, en disco) de donde se sirve.
PrefijoSubcarpeta dentro del bucket que actúa como raíz del sitio.(raíz)
Documento índiceArchivo servido cuando la URL termina en /.index.html
Fallback de aplicación de una sola páginaSi está activo, las rutas que no mapean a un archivo devuelven el índice, para que el enrutador del cliente tome control.desactivado
Documento de errorPágina servida ante un 404 (por ejemplo, 404.html).
Tiempo de vida (TTL)Cuánto vive el contenido en la caché de borde antes de revalidar.configurable
Encabezados de respuestaEncabezados adicionales a inyectar (por ejemplo, Cache-Control, X-Frame-Options, CORS).
ComportamientoDescripción
Tiempo de vida (TTL)Cuánto vive el contenido antes de revalidar (definido por ruta).
CompresiónEl contenido comprimible se entrega comprimido con Brotli cuando el visitante lo acepta.
Servir contenido vencido ante errorSi el almacenamiento no responde, puede seguir sirviéndose la última copia válida en lugar de devolver un error.

El contenido se cachea en el borde para minimizar las idas al almacenamiento: la primera solicitud trae el objeto; las siguientes se sirven desde la caché con latencia mínima. El contenido comprimible (texto, JS, JSON, SVG, WASM) se entrega comprimido con Brotli respetando Accept-Encoding: br; los binarios se sirven tal cual.

  • Tiempo de vida (TTL). Cada objeto expira según el TTL de la ruta.
  • Revalidación por ETag. Antes de servir contenido vencido, el borde consulta al almacenamiento con If-None-Match; si no cambió, responde 304 y renueva la frescura sin volver a transferir el objeto.
  • Purga manual. Se solicita al equipo el vaciado de paths específicos de una ruta ({ "paths": ["/index.html", "/assets/app.js"] }) o el vaciado total de la ruta. La purga global está reservada a administración.
  • La entrega al visitante usa la misma postura TLS que el resto de las rutas.
  • Las credenciales de los orígenes S3 viajan y se guardan cifradas; nunca se exponen.
  • El mapeo de path a objeto rechaza el traversal (../), tanto en S3 como en disco local.
  • El sitio debe ser estático: no hay ejecución del lado servidor en esta capacidad. Para PHP, ver Alojamiento PHP; para lógica liviana, Funciones Lambda.
  • La caché de borde no es una red de distribución global con presencia en múltiples regiones; está optimizada como entrada en la región del servicio.
  • ¿Puedo servir el frontend estático y la API bajo el mismo dominio? Sí: una ruta / sirve el sitio desde el origen y otra ruta /api/* proxya a tu servidor de origen. Ver Casos de uso.
  • ¿Cómo publico una versión nueva? Subís los archivos al bucket (o a la carpeta, en disco local). Al expirar el TTL —o ante una purga— el borde toma la versión nueva. El versionado por hash en el nombre del archivo evita esperas.
  • ¿Puedo usar un bucket privado? Sí: ese es el modo recomendado. Tero Services accede con sus credenciales; los visitantes nunca acceden al bucket directamente.
  • ¿Sirve para una aplicación de una sola página con rutas del lado del cliente? Sí, activando el fallback de aplicación de una sola página.