Saltar a contenido

Despliegues

Responde: ¿cómo se pone un cambio en producción sin romper nada, y en qué orden?

Despliegue explica dónde corre cada pieza y qué la pone ahí. Esta página es el procedimiento: qué mirar antes, en qué orden, y qué hacer cuando sale mal.

La regla que explica casi todo

El frontend y el backend se despliegan por separado, y el orden importa. Son dos repositorios, dos pipelines y dos plataformas, y nada los coordina: cada uno despliega a producción al mergear a su rama principal, sin saber del otro.

Hay un tercer actor que no tiene pipeline: la base de datos. Las migraciones las aplica una persona a mano.

Un cambio que toca los tres —y los cambios de permisos tocan los tres— tiene un único orden correcto, y equivocarse deja la aplicación rota para todos los usuarios hasta que alguien lo note.

Qué pasa si se despliega al revés

Conviene tener presente la forma del fallo, porque es la que se repite.

Si el frontend llega a producción antes que la migración que su versión necesita —por ejemplo, la que introduce identificadores de permiso más finos—, el frontend pide permisos que la base todavía no tiene. La sección de administración queda inaccesible para todos los roles, incluido el de mayor privilegio: el filtrado de navegación no hace excepciones.

La salida es aplicar la migración contra producción sin esperar el despliegue del backend, y alcanza porque el endpoint que le dice al frontend qué permisos tiene el usuario lee los permisos en vivo de la base, no del mapa compilado en el binario. Ese mapa solo lo usa la verificación interna, así que el binario anterior sigue sirviendo sin regresión y empieza a devolver los identificadores nuevos.

Tres cosas que conviene tener a mano:

El orden es base → backend → frontend La base es el componente más lento de revertir y el que más depende de él
Una migración puede desbloquear sin desplegar código Solo cuando el dato se lee en vivo. Hay que saber cuál es el caso, no suponerlo
El síntoma puede no parecerse a la causa «Nadie puede entrar a administración» no sugiere «faltó una migración»
No hay staging donde se vería antes main despliega a producción en los dos pipelines automatizados, y los previews de Vercel apuntan a la API de producción

El orden correcto

flowchart LR
  A["1 · Auditar<br/>los datos"] --> B["2 · Aplicar la<br/>migración"]
  B --> C["3 · Desplegar<br/>el backend"]
  C --> D["4 · Desplegar<br/>el frontend"]
  D --> E["5 · Verificar"]

  classDef man fill:#c0392b,stroke:#7b241c,color:#fff
  classDef auto fill:#1168bd,stroke:#0b4884,color:#fff
  class A,B man
  class C,D,E auto

En rojo, lo que hace una persona.

La regla general: el proveedor antes que el consumidor. La base provee al backend, y el backend al frontend. Desplegar un consumidor que exige algo que su proveedor todavía no da es exactamente el incidente de arriba.

Para revertir, el orden se invierte: frontend, backend, y recién después la migración. Y revertir una migración no siempre es posible sin pérdida: hay que mirar su reverso antes de asumirlo.

Dos migraciones conocidas con riesgo de orden, en ambas direcciones

El repositorio del Cloud documenta al menos dos donde el orden cambia el resultado, y una de ellas es simétrica: volver al binario anterior sin revertir la migración rompe igual, en la dirección contraria.

El procedimiento, las consultas de auditoría previas y el orden exacto están en el README de migraciones del repositorio del Cloud, que es su fuente de verdad. Leerlo antes de aplicar, no después.

Antes de desplegar

Paso Por qué
¿El cambio toca permisos, roles o el esquema? Si sí, es un despliegue coordinado y aplica todo lo de arriba
Correr las consultas de auditoría de la migración Algunas empiezan a rechazar datos que ya existen. La auditoría dice si hay filas afectadas
Verificar que el reverso de la migración exista y sea seguro Es la única vía de retroceso de la base
Avisar a la otra persona Son dos. Un despliegue coordinado que una sola persona conoce es el incidente de arriba

Cómo revertir

Pieza Cómo Velocidad
Frontend Promover un despliegue anterior en la plataforma inmediato
Backend El despliegue es por identificador de commit, así que la revisión anterior sigue existiendo: se vuelve a ella desde la plataforma, no con un revert en git inmediato
Base Revertir la migración, a mano lento y con riesgo

Que las dos primeras sean inmediatas y la tercera no es, otra vez, la razón del orden.

Desplegar el backend no corta las peticiones en vuelo

Ante la señal de terminación la API deja de aceptar conexiones y espera hasta 8 s a que terminen las requests en curso; Cloud Run da 10 s entre la señal y el corte.

Tiene un límite: una conexión que nunca queda inactiva, como el flujo en vivo de logs, se corta al vencer el plazo. Para la ingesta no hay pérdida de datos en ningún caso, porque el Edge reintenta y la idempotencia evita duplicados.

El supuesto que hay que reconfirmar

El procedimiento de arriba —aplicar una migración directamente contra producción para destrabar un incidente— se apoya en que producción funciona como entorno de prueba: sin usuarios reales que dependan de su disponibilidad ni de sus datos.

Eso hay que reconfirmarlo cada vez, porque el sistema avanza hacia el traspaso a un cliente. Si ya hay datos de planta que importan, hace falta como mínimo un respaldo previo verificado, que hoy no existe (pendiente).

Lo que falta

Hueco Consecuencia
No hay staging Es la causa raíz del incidente. main despliega a producción en los dos pipelines
El workflow no aplica las migraciones Dependen de que una persona las corra en el orden correcto, o de que el servicio tenga activado el modo de aplicarlas al arrancar (RUN_MIGRATIONS_ON_BOOT, apagado por defecto). Cuál de los dos usa producción no consta en ningún lado
No hay versión desplegada identificable Cuatro de los cinco repositorios no tienen tags. "Qué está desplegado" se responde mirando el identificador de commit
El Edge y el historian no tienen pipeline Se actualizan a mano en cada Pi. Ver instalación en planta
Nada verifica el despliegue de punta a punta La verificación automática del backend comprueba que responda, no que la aplicación funcione

Relacionado