🇺🇸 EN
Cloud
·5 min read·↗·🇺🇸 EN

Next.js en Google Cloud Run: Caché en producción, secretos y cero cold starts

Portada principal del artículo: Next.js en Google Cloud Run: Caché en producción, secretos y cero cold starts

En mi guía anterior, Migrar Next.js de Vercel a Google Cloud Run, vimos cómo configurar builds de Docker con el modo standalone y desplegar en Cloud Run para conseguir un hosting predecible a coste cero.

Cuando tu aplicación de Next.js ya corre dentro de un contenedor, el siguiente paso es dejarla lista para producción real:

  1. ¿Cómo servir los archivos estáticos de _next/static a velocidad edge sin saturar tu contenedor?
  2. ¿Cómo gestionar claves de API y credenciales de base de datos de forma segura?
  3. ¿Cómo eliminar los cold starts cuando sube el tráfico?
  4. ¿Cómo automatizar los pipelines de despliegue con Google Cloud Build?

Esta es la arquitectura base que uso para ejecutar Next.js con alto rendimiento en Google Cloud Run.


1. Edge Caching y Cloud CDN para archivos estáticos ⚡

Cuando ejecutas Next.js en Vercel, los archivos estáticos en _next/static y public/ se entregan de forma automática desde puntos de presencia en el edge. En Cloud Run, cada petición que no esté en caché consume ciclos de CPU de tu contenedor.

Para evitar sobrecargar el contenedor y asegurar tiempos de respuesta por debajo de 50ms, configura los encabezados Cache-Control en next.config.ts:

// next.config.ts
import type { NextConfig } from "next";
 
const nextConfig: NextConfig = {
  output: "standalone",
  async headers() {
    return [
      {
        // Guardar bundles estáticos inmutables en caché durante 1 año en el edge
        source: "/_next/static/:path*",
        headers: [
          {
            key: "Cache-Control",
            value: "public, max-age=31536000, immutable",
          },
        ],
      },
      {
        // Guardar imágenes e iconos públicos en caché durante 24 horas
        source: "/images/:path*",
        headers: [
          {
            key: "Cache-Control",
            value: "public, max-age=86400, stale-while-revalidate=43200",
          },
        ],
      },
    ];
  },
};
 
export default nextConfig;

Al poner tu servicio detrás de Cloudflare o de un Google Cloud Load Balancer con Cloud CDN activado, los recursos estáticos se quedan en la caché del edge, reduciendo las peticiones que llegan al contenedor en más de un 85%. Con los archivos estáticos optimizados, el siguiente reto es proteger los datos sensibles y credenciales de la aplicación.


2. Gestión de secretos con Google Secret Manager 🔐

Nunca guardes archivos .env ni claves de API dentro de las imágenes de Docker. Es mucho mejor almacenarlos en Google Secret Manager y montarlos en tu servicio de Cloud Run durante el inicio del contenedor.

Paso 1: Crear el secreto en GCP

echo -n "sk_live_my_super_secret_api_key" | gcloud secrets create STRIPE_API_KEY \
  --data-file=- \
  --replication-policy="automatic"

Paso 2: Otorgar permisos a la cuenta de servicio de Cloud Run

PROJECT_ID=$(gcloud config get-value project)
PROJECT_NUMBER=$(gcloud projects describe $PROJECT_ID --format="value(projectNumber)")
 
gcloud secrets add-iam-policy-binding STRIPE_API_KEY \
  --member="serviceAccount:${PROJECT_NUMBER}-compute@developer.gserviceaccount.com" \
  --role="roles/secretmanager.secretAccessor"

Paso 3: Montar los secretos en el comando de despliegue

gcloud run deploy nextjs-blog \
  --image gcr.io/${PROJECT_ID}/nextjs-blog:latest \
  --region us-central1 \
  --set-secrets="STRIPE_SECRET_KEY=STRIPE_API_KEY:latest"

En tu código de Next.js (process.env.STRIPE_SECRET_KEY), el valor estará disponible de forma síncrona como una variable de entorno normal. Una vez resuelta la seguridad de las variables, el próximo punto crítico en Cloud Run es el tiempo de respuesta en frío.


3. Eliminar los cold starts 🚀

Cloud Run escala a cero instancias cuando no hay tráfico, lo que reduce costes. Sin embargo, la primera petición tras un periodo de inactividad sufre un arranque en frío (cold start).

Aquí te muestro cómo reducir la latencia del cold start de 4 segundos a menos de 300ms:

TécnicaComando / ConfiguraciónImpacto
Salida Standaloneoutput: 'standalone' en Next.jsEl contenedor baja de 2.1GB a 120MB
Startup CPU BoostFlag --cpu-boostAsigna un 200% de CPU durante el arranque del contenedor
Instancias mínimas--min-instances=1Mantiene 1 contenedor activo todo el tiempo (opcional)
Ajuste de concurrencia--concurrency=80Procesa hasta 80 peticiones simultáneas por contenedor

Despliega con el impulso de CPU de inicio activado:

gcloud run deploy nextjs-blog \
  --image gcr.io/${PROJECT_ID}/nextjs-blog:latest \
  --region us-central1 \
  --cpu-boost \
  --concurrency=80 \
  --memory=512Mi \
  --cpu=1

Con el contenedor optimizado y respondiendo al instante, el paso final es dejar de desplegar manualmente desde la terminal.


4. CI/CD automatizado con Cloud Build 🛠️

En lugar de hacer despliegues manuales desde tu terminal, crea un archivo cloudbuild.yaml en tu repositorio:

# cloudbuild.yaml
steps:
  # 1. Construir la imagen de Docker con la caché de Kaniko
  - name: 'gcr.io/kaniko-project/executor:latest'
    args:
      - '--destination=gcr.io/$PROJECT_ID/nextjs-blog:$COMMIT_SHA'
      - '--destination=gcr.io/$PROJECT_ID/nextjs-blog:latest'
      - '--cache=true'
      - '--cache-ttl=24h'
 
  # 2. Desplegar el contenedor en Google Cloud Run
  - name: 'gcr.io/google.com/cloudsdktool/cloud-sdk'
    entrypoint: gcloud
    args:
      - 'run'
      - 'deploy'
      - 'nextjs-blog'
      - '--image=gcr.io/$PROJECT_ID/nextjs-blog:$COMMIT_SHA'
      - '--region=us-central1'
      - '--platform=managed'
      - '--allow-unauthenticated'
      - '--cpu-boost'
 
images:
  - 'gcr.io/$PROJECT_ID/nextjs-blog:$COMMIT_SHA'
  - 'gcr.io/$PROJECT_ID/nextjs-blog:latest'

Conecta tu repositorio de GitHub en la consola de Google Cloud dentro de Cloud Build > Triggers. Cada push a la rama main compilará, probará y desplegará tu aplicación de Next.js de forma automática en menos de 90 segundos.


Conclusión y resumen de la arquitectura 🎯

Ejecutar Next.js en Google Cloud Run te permite tener una infraestructura de nivel empresarial sin sorpresas en la factura:

  • Cloud CDN / Cloudflare Cache-Control: Protege tus contenedores y acelera la entrega de archivos estáticos.
  • Secret Manager: Mantiene seguros tus tokens y credenciales sensibles.
  • Startup CPU Boost: Elimina el impacto de los arranques en frío.
  • Cloud Build: Automatiza el despliegue a producción sin pasos manuales.

¿Listo para dar el paso? Revisa la primera parte de esta serie: Migrar Next.js de Vercel a Google Cloud Run: Guía de costes y arquitectura.

Foto de Robson Hatsukami Morgan en Unsplash

Parte de la serie Cloud

Explora más guías prácticas y arquitecturas reales en la serie Cloud.

Ver serie completa

Preguntas Frecuentes

¿Cómo se maneja el caché de archivos estáticos para Next.js en Google Cloud Run?

Conecta tu servicio de Cloud Run con Google Cloud CDN o Cloudflare. Configura encabezados Cache-Control inmutables en los paquetes estáticos (_next/static) para que los servidores edge entreguen los archivos directamente sin hacer peticiones a las instancias de tu contenedor.

¿Cómo inyectar variables de entorno de forma segura desde Google Secret Manager?

Usa el flag --set-secrets en el comando gcloud run deploy para montar los secretos como variables de entorno directamente en tiempo de ejecución, asignando a la cuenta de servicio de Cloud Run el rol de Secret Manager Secret Accessor.

¿Cómo minimizar los cold starts en Next.js sobre Cloud Run?

Mantén las imágenes de Docker lo más ligeras posible usando el modo standalone de Next.js (menos de 120MB), activa el impulso de CPU de inicio con --cpu-boost y configura --min-instances=1 durante las horas de mayor tráfico.

¿Es posible automatizar los despliegues de Next.js en Cloud Run con Cloud Build?

Sí. Crea un archivo cloudbuild.yaml en tu repositorio y configura un trigger de GitHub en Cloud Build para compilar, subir la imagen a Artifact Registry y desplegar en Cloud Run de forma automática con cada push.

Artículos Relacionados

Compartir este artículo

Si esta guía te resultó útil, compártela con tu equipo o con otros desarrolladores.


Software real. Lecciones reales.

Comparto las lecciones que aprendí por las malas, para que puedas evitarlas o estar preparado cuando ocurran.

User avatar
User avatar
User avatar
User avatar
+13K

Únete a 13,800+ desarrolladores y lectores.

Cero spam. Cancela tu suscripción en cualquier momento.