Despliegues
Qué pasa entre un push y un contenedor en ejecución, cómo leer los logs del build y de runtime, volver a desplegar, revertir, cancelar y qué significa cada estado.
Un despliegue es un ciclo de build y puesta en marcha de un servicio en un entorno. Se crea con un push a la rama seguida, con skiffly up, al volver a desplegar desde el panel o con serviceInstanceDeployV2. El despliegue anterior sigue sirviendo tráfico hasta que el nuevo pasa su health check; después se elimina.
Ciclo de vida#
QUEUED → BUILDING → DEPLOYING → SUCCESS
↘ FAILED ↘ CRASHED
↘ SLEEPING (App Sleeping) ⇄ SUCCESS
cualquiera → REMOVED (reemplazado, cancelado, servicio eliminado)| Estado | Significado |
|---|---|
QUEUED | esperando un nodo; el único estado que se puede cancelar |
BUILDING | build de Railpack/Dockerfile en curso (o esperando un slot de build: corren dos builds a la vez por nodo) |
DEPLOYING | imagen subida, contenedores arrancando, health check todavía no superado |
SUCCESS | en vivo y recibiendo tráfico |
FAILED | el build falló, o el contenedor nunca llegó a estar sano a tiempo (ver límites), o se excedió la cuota |
CRASHED | el contenedor terminó repetidamente después de estar en vivo (tres reinicios seguidos) |
SLEEPING | escalado a cero por App Sleeping; la siguiente solicitud lo despierta |
REMOVED | reemplazado por un despliegue más nuevo, cancelado, o el servicio fue eliminado |
El enum completo es compatible con Railway; consulta la referencia de estados.
Disparadores#
- Push a la rama seguida de un repositorio conectado (o a la rama del PR en un entorno
pr-*). skiffly upsube el directorio actual, lo construye y transmite los logs;--gitconstruye en su lugar el HEAD ya enviado (push) del repositorio conectado, y--git --commit <sha>elige un commit.- Volver a desplegar reconstruye y despliega otra vez el último commit con las variables y la configuración actuales (
serviceInstanceRedeploy,skiffly redeploy,redeployde MCP). - Desplegar inicia un build nuevo (
serviceInstanceDeployV2,deployde MCP). - Los cambios de variables vuelven a desplegar los servicios afectados unos cinco segundos después del último cambio (varias ediciones seguidas se convierten en un solo despliegue): el servicio dueño de la variable más todos los que la referencian con
${{servicio.VAR}}; una variable compartida redespliega todos los servicios del entorno. PasaskipDeploys: true(skiffly variables set --skip-deploys,skipDeploysen MCP) para solo guardar. Los servicios que nunca se han desplegado no se tocan. - Cambios de configuración: guardar ajustes de runtime (réplicas, CPU/memoria, ruta y tiempo de espera del health check, comando de inicio, cron, política de reinicio, builder, ruta del Dockerfile, comando de build, directorio raíz, rama) vuelve a desplegar un servicio en ejecución (
serviceInstanceUpdate,skipDeploys: truepara solo guardar). Las rutas de vigilancia se aplican en el siguiente push y App Sleeping se aplica en el sitio: ninguno de los dos redespliega. - Revertir despliega la imagen guardada de un despliegue anterior; ver más abajo.
Logs#
Tres flujos por despliegue: build, runtime (deploy) y sistema (reinicios, OOM kills, eventos de programación).
skiffly logs # logs de runtime del último despliegue
skiffly logs -f # sigue en vivo (consulta cada 2 s)
skiffly logs --build # salida del build
skiffly logs --system # scheduler / reinicios / OOM
skiffly logs -n 500 --filter "error"
skiffly logs <deploymentId>Los logs se conservan en un búfer circular con las últimas 5 000 líneas por despliegue; environmentLogs combina los búferes de los últimos despliegues del entorno. Las líneas más antiguas no se pueden recuperar, así que envía desde la app a tu propio servicio de logs todo lo que debas conservar.
Volver a desplegar, revertir, reiniciar, cancelar#
| Acción | Qué hace | CLI | GraphQL |
|---|---|---|---|
| Volver a desplegar | reconstruye el último commit con las variables y la configuración actuales | skiffly redeploy | serviceInstanceRedeploy(serviceId, environmentId) / deploymentRedeploy(id) |
| Revertir | despliegue nuevo a partir de la imagen guardada de un despliegue anterior y sus variables, sin reconstruir | panel | deploymentRollback(id) / deploymentRollbackV2(id) / deploymentRedeploy(id, usePreviousImageTag: true) |
| Reiniciar | reinicia los contenedores en el sitio, sin despliegue nuevo | skiffly restart | serviceRestart(serviceId, environmentId) |
| Cancelar | descarta un despliegue QUEUED | panel | deploymentCancel(id) |
| Eliminar | deja de servir un despliegue | panel | deploymentRemove(id) |
Reversión (rollback)#
Cada despliegue que llegó a ejecutarse conserva su imagen construida en el registry, junto con una instantánea de las variables y la configuración de runtime con la que corrió. Revertir a este en el menú del despliegue (o deploymentRollback(id)) crea un despliegue nuevo a partir de esa imagen e instantánea: sin clonar ni construir; la etapa Build se omite y la puesta en marcha tarda lo que tarden en arrancar los contenedores. Dominios, volúmenes, proxies TCP y límites de recursos son los de hoy; la imagen, las variables, el comando de inicio, el health check, las réplicas, el cron y la política de reinicio vienen de la instantánea. En los servicios de imagen se vuelve a desplegar la misma etiqueta. El despliegue aparece como Reversión a <commit> con el disparador rollback.
Deployment.canRollback es true cuando el despliegue llegó a ejecutarse (SUCCESS, REMOVED, CRASHED, SLEEPING) y su imagen sigue en el registry. Se conservan las imágenes de los 10 despliegues más recientes de un servicio que llegaron a ejecutarse, salvo los que llevan más de 14 días en REMOVED; las imágenes de builds fallidos, despliegues cancelados y más antiguos las borra un trabajo nocturno de retención (se rellena imageRemovedAt y la reversión se rechaza con un error claro: vuelve a desplegar el commit). La retención nunca toca la imagen que el servicio está ejecutando.
Puesta en marcha y tiempo de inactividad#
Un despliegue nuevo arranca junto al anterior y recibe tráfico cuando pasa el health check; después se detienen los contenedores antiguos. Con una ruta de health check esto ocurre sin tiempo de inactividad para los servicios HTTP. Los servicios con volumen son la excepción: el volumen solo puede montarlo un contenedor a la vez, así que el antiguo se detiene primero (unos segundos de inactividad para las bases de datos).
Una puesta en marcha que no llega a estar sana en 10 minutos se marca como FAILED y el despliegue anterior sigue corriendo. Los builds o puestas en marcha que dejan de reportar durante 20 minutos (un nodo desapareció) los marca como fallidos un watchdog.
Metadatos del despliegue#
Cada despliegue registra el SHA y el mensaje del commit, el disparador (webhook, manual, redeploy, rollback, variables, pr-preview, upload, billing), quién lo inició y un mensaje que explica esperas y fallos (ImagePullBackOff, OOMKilled, CrashLoopBackOff: <últimas líneas del log>, exceeded quota). skiffly deployment list y deployments(input: { serviceId, environmentId }) los devuelven.
Métricas#
CPU, memoria y tráfico saliente por servicio están disponibles en Proyecto → Observabilidad para la última hora, 6 horas, 24 horas o 7 días (serviceMetrics(environmentId, range: H1 | H6 | H24 | D7)). Las muestras en bruto (alrededor de una por minuto) se conservan 7 días; los agregados por hora se conservan 90 días y alimentan Espacio de trabajo → Uso, que muestra las mismas cifras agregadas al período de facturación.