Configura y administra los backends de App Hosting

App Hosting se diseñó para facilitar su uso y reducir el mantenimiento, con parámetros de configuración predeterminados optimizados para la mayoría de los casos de uso. Al mismo tiempo, App Hosting proporciona herramientas para que administres y configures backends para tus necesidades específicas. En esta guía, se describen esas herramientas y procesos.

Configurar un backend

Para la configuración avanzada, como las variables de entorno o la configuración del entorno de ejecución, como la simultaneidad, la CPU y los límites de memoria, deberás crear y editar el archivo apphosting.yaml en el directorio raíz de tu app. Este archivo también admite referencias a secretos administrados con Cloud Secret Manager, lo que hace que sea seguro realizar el registro en el control de código fuente.

Para crear apphosting.yaml, ejecuta el siguiente comando:

firebase init apphosting

Esto crea un archivo apphosting.yaml de partida básico con una configuración de ejemplo (con comentarios). Después de editarlo, un archivo apphosting.yaml típico podría verse así, con la configuración del servicio Cloud Run del backend, algunas variables de entorno y algunas referencias a secretos administrados por Secret Manager de Cloud:

# Settings for Cloud Run
runConfig:
  minInstances: 2
  maxInstances: 100
  concurrency: 100
  cpu: 2
  memoryMiB: 1024

# Environment variables and secrets
env:
  - variable: STORAGE_BUCKET
    value: mybucket.firebasestorage.app
    availability:
      - BUILD
      - RUNTIME

  - variable: API_KEY
    secret: myApiKeySecret

    # Same as API_KEY above but with a pinned version.
  - variable: PINNED_API_KEY
    secret: myApiKeySecret@5

    # Same as API_KEY above but with the long form secret reference as defined by Cloud Secret Manager.
  - variable: VERBOSE_API_KEY
    secret: projects/test-project/secrets/secretID

    # Same as API_KEY above but with the long form secret reference with pinned version.
  - variable: PINNED_VERBOSE_API_KEY
    secret: projects/test-project/secrets/secretID/versions/5

En el resto de esta guía, se proporciona más información y contexto para estos parámetros de configuración de ejemplo.

Configura la configuración del servicio Cloud Run

Con la configuración de apphosting.yaml, puedes configurar cómo se aprovisiona tu servicio Cloud Run. La configuración disponible para el servicio Cloud Run se proporciona en el objeto runConfig:

  • cpu: Es la cantidad de CPUs que se usan para cada instancia de publicación (predeterminada: 0).
  • memoryMiB: Es la cantidad de memoria asignada para cada instancia de publicación en MiB (512 de forma predeterminada).
  • maxInstances: Es la cantidad máxima de contenedores que se pueden ejecutar a la vez (100 de forma predeterminada y administrada por cuota).
  • minInstances: Es la cantidad de contenedores que se mantendrán activos siempre (el valor predeterminado es 0).
  • concurrency: Es la cantidad máxima de solicitudes que puede recibir cada instancia de publicación (80 de forma predeterminada).

Ten en cuenta la relación importante entre cpu y memoryMiB. La memoria se puede establecer en cualquier valor entero entre 128 y 32768, pero aumentar el límite de memoria puede requerir aumentar los límites de la CPU:

  • Más de 4 GiB requieren al menos 2 CPUs
  • Más de 8 GiB requiere al menos 4 CPUs
  • Más de 16 GiB requieren al menos 6 CPUs
  • Más de 24 GiB requieren al menos 8 CPUs

Del mismo modo, el valor de cpu afecta la configuración de simultaneidad. Si estableces un valor inferior a 1 CPU, debes establecer la simultaneidad en 1, y la CPU solo se asignará durante el procesamiento de solicitudes.

Configura el entorno de compilación

A veces, necesitarás una configuración adicional para tu proceso de compilación, como claves de API de terceros o una configuración ajustable. App Hosting ofrece la configuración del entorno en apphosting.yaml para almacenar y recuperar este tipo de datos para tu proyecto.

env:
-   variable: STORAGE_BUCKET
    value: mybucket.firebasestorage.app

En el caso de las apps de Next.js, los archivos dotenv que contienen variables de entorno también funcionarán con App Hosting. Te recomendamos usar apphosting.yaml para el control detallado de las variables de entorno con cualquier framework.

En apphosting.yaml, puedes especificar qué procesos tienen acceso a tu variable de entorno con la propiedad availability. Puedes restringir una variable de entorno para que solo esté disponible para el entorno de compilación o solo para el entorno de ejecución. De forma predeterminada, está disponible para ambos.

env:
-   variable: STORAGE_BUCKET
    value: mybucket.firebasestorage.app
    availability:
    -   BUILD
    -   RUNTIME

En el caso de las apps de Next.js, también puedes usar el prefijo NEXT_PUBLIC_ de la misma manera que lo harías en tu archivo dotenv para que se pueda acceder a una variable en el navegador.

env:
-   variable: NEXT_PUBLIC_STORAGE_BUCKET
    value: mybucket.firebasestorage.app
    availability:
    -   BUILD
    -   RUNTIME

Las claves de variables válidas se componen de caracteres de la A a la Z o guiones bajos. Algunas claves de variables de entorno están reservadas para uso interno. No uses ninguna de estas claves en tus archivos de configuración:

  • Cualquier variable que comience con X_FIREBASE_
  • PORT
  • K_SERVICE
  • K_REVISION
  • K_CONFIGURATION

Almacena y accede a parámetros secretos

La información sensible, como las claves de API, debe almacenarse como secretos. Puedes hacer referencia a secretos en apphosting.yaml para evitar verificar información sensible en el control de código fuente.

Los parámetros de tipo secret representan parámetros de cadena que tienen un valor almacenado en Cloud Secret Manager. En lugar de derivar el valor directamente, los parámetros secretos comprueban la existencia en Cloud Secret Manager y cargan los valores durante el lanzamiento.

  -   variable: API_KEY
      secret: myApiKeySecret

Los secretos de Cloud Secret Manager pueden tener varias versiones. De forma predeterminada, el valor de un parámetro secreto disponible para tu backend activo se fija a la versión más reciente disponible del secreto en el momento en que se compiló el backend. Si tienes requisitos de control de versiones y administración del ciclo de vida de los parámetros, puedes fijar versiones específicas con Secret Manager de Cloud. Por ejemplo, para fijar la versión 5, haz lo siguiente:

  - variable: PINNED_API_KEY
    secret: myApiKeySecret@5

Puedes crear secretos con el comando firebase apphosting:secrets:set de la CLI, y se te pedirá que agregues los permisos necesarios. Este flujo te brinda la opción de agregar automáticamente la referencia secreta a apphosting.yaml.

Para usar el paquete completo de funciones de Secret Manager de Cloud, puedes usar la consola de Secret Manager de Cloud. Si lo haces, deberás otorgar permisos a tu backend de App Hosting con el comando firebase apphosting:secrets:grantaccess de la CLI.

Sincroniza el estado de Firebase Auth

Las apps que usan Firebase Authentication deberían considerar usar el SDK web de Firebase para ayudar a mantener el estado de autenticación sincronizado entre el cliente y el servidor. Esto se puede facilitar implementando FirebaseServerApp con un trabajador de servicio. El flujo de tareas básico es el siguiente:

  1. Implementa un trabajador de servicio que agregue los encabezados correctos para tu app en las solicitudes al servidor.
  2. Obtén los encabezados de la solicitud en el servidor y conviértelos en un usuario de autenticación con FirebaseServerApp.

Administra backends

Los comandos para la administración básica de los backends de App Hosting se proporcionan en la CLI de Firebase. Algunas operaciones también están disponibles en la consola de Firebase. En esta sección, se describirán algunas de las tareas de administración más comunes, como la creación y eliminación de backends.

Crear un backend

Un backend de App Hosting es la colección de recursos administrados que App Hosting crea para compilar y ejecutar tu app web. Puedes crear backends de App Hosting y mostrarlos en una lista con Firebase console o Firebase CLI.

Firebase console: En el menú Build, selecciona App Hosting y, luego, Comenzar.

CLI: (Versión 13.15.4 o posterior) Para crear un backend, ejecuta el siguiente comando desde la raíz del directorio del proyecto local y proporciona tu projectID y región preferida como argumentos:

firebase apphosting:backends:create --project PROJECT_ID --location us-central1

En la consola o la CLI, sigue las indicaciones para asignar un nombre a tu backend, configurar una conexión de GitHub y establecer estos parámetros de configuración de implementación básicos:

  • Establece el directorio raíz de tu app (el valor predeterminado es /).

    Por lo general, es donde se encuentra el archivo package.json.

  • Configura la rama publicada

    Esta es la rama de tu repositorio de GitHub que se implementa en tu URL publicada. A menudo, es la rama en la que se combinan las ramas de funciones o de desarrollo.

  • Acepta o rechaza los lanzamientos automáticos

    Los lanzamientos automáticos están habilitados de forma predeterminada. Cuando se complete la creación del backend, puedes elegir que tu app se implemente en App Hosting de inmediato.

Borrar un backend

Para quitar un backend por completo, primero usa la CLI de Firebase y, luego, quita manualmente los recursos relacionados, teniendo especial cuidado de no borrar ningún recurso que puedan usar otros backends o otros aspectos de tu proyecto de Firebase.

  1. Ejecuta el siguiente comando para borrar el backend de App Hosting. Esta acción inhabilita todos los dominios de tu backend y borra el servicio asociado de Cloud Run:

    firebase apphosting:backends:delete BACKEND_ID --project PROJECT_ID --location us-central1
    
  2. (Opcional) En la pestaña de la consola de Google Cloud para Artifact Registry, borra la imagen de tu backend en "firebaseapphosting-images".

  3. En Cloud Secret Manager, borra todos los secretos que tengan "apphosting" en el nombre del secreto. Ten especial cuidado para asegurarte de que otros backends o otros aspectos de tu proyecto de Firebase no usen estos secretos.