# 10 - Runbook: Rollback > Cómo regresar a la versión anterior de la aplicación cuando algo sale mal. --- ## 1. ¿Qué es un rollback? Un **rollback** es el proceso de "deshacer" un despliegue. Si la nueva versión de la aplicación tiene errores, el rollback vuelve a poner la versión anterior para que los usuarios no se vean afectados. > 💡 **Analogía simple**: es como cuando instalas una actualización en tu celular y algo deja de funcionar, así que regresas a la versión anterior del sistema. --- ## 2. ¿Cuándo hacer un rollback? Haz rollback **inmediatamente** si ves alguna de estas situaciones: - 🔴 El **health check** falla después del despliegue. - 🔴 La aplicación se cae al poco tiempo de iniciar. - 🟡 Los usuarios reportan errores graves que no existían antes. - 🟡 El pipeline detectó un fallo en el paso de deploy. - 🟠 El servicio de `systemd` no puede arrancar. > ⚠️ **Regla de oro**: si dudas, haz rollback. Es mejor tener la versión anterior estable mientras investigas el problema. --- ## 3. Paso a paso: cómo hacer rollback El rollback ahora tiene **dos partes**: el frontend en S3 y la API en la EC2. --- ### PARTE A: Rollback del frontend en S3 Si el problema es visual (interfaz rota, pantalla en blanco, etc.), restaura el frontend anterior. #### Paso A1: Lista las versiones anteriores del archivo `index.html` ```bash aws s3api list-object-versions \ --bucket ccsoft-proyectosacc-frontend \ --prefix index.html \ --query 'Versions[?IsLatest==`false`].[VersionId,LastModified]' \ --output table ``` #### Paso A2: Restaura la versión anterior Copia el `VersionId` de la versión anterior y restáurala: ```bash aws s3api copy-object \ --bucket ccsoft-proyectosacc-frontend \ --copy-source ccsoft-proyectosacc-frontend/index.html?versionId= \ --key index.html ``` #### Paso A3: Invalida la caché de CloudFront ```bash aws cloudfront create-invalidation \ --distribution-id \ --paths "/*" ``` #### Paso A4: Verifica el frontend Abre `https://sacc.ccsoft.mx` y confirma que la interfaz anterior ha vuelto. --- ### PARTE B: Rollback de la API en la EC2 Si el problema es del backend (errores 500, API caída, etc.), restaura la API. #### Paso B1: Conéctate al servidor EC2 ```bash ssh -i ~/.ssh/tu_llave.pem ubuntu@ ``` #### Paso B2: Cambia al usuario thoth ```bash sudo su - thoth ``` #### Paso B3: Ve al directorio de artefactos ```bash cd /home/thoth/deploy/artifacts ``` #### Paso B4: Revisa los backups disponibles ```bash ls -lah backup/ ``` Verás algo como: ``` proyectosacc-app-20260414_103000.jar proyectosacc-app-20260413_154500.jar ``` Cada archivo tiene una fecha y hora en su nombre. #### Paso B5: Identifica cuál es la versión anterior estable Normalmente es el backup **más reciente antes del deploy fallido**. ```bash # Ordena por fecha para ver el más reciente ls -lt backup/ | head -5 ``` #### Paso B6: Detén el servicio actual ```bash sudo systemctl stop proyectosacc-app.service ``` #### Paso B7: Reemplaza el archivo actual con el backup ```bash # Guarda una copia del archivo fallido (por si necesitas investigarlo después) mv current/proyectosacc-app.jar current/proyectosacc-app.jar.fallo-$(date +%Y%m%d_%H%M%S) # Copia el backup al directorio current cp backup/proyectosacc-app-20260414_103000.jar current/proyectosacc-app.jar ``` > 💡 **Tip**: reemplaza `20260414_103000` con la fecha real del backup que quieres restaurar. #### Paso B8: Recarga systemd y reinicia el servicio ```bash sudo systemctl daemon-reload sudo systemctl start proyectosacc-app.service ``` #### Paso B9: Verifica que el servicio esté corriendo ```bash sudo systemctl status proyectosacc-app.service ``` Debe decir `active (running)`. #### Paso B10: Ejecuta el health check ```bash curl http://localhost:8080/actuator/health ``` Debe responder: ```json {"status":"UP"} ``` #### Paso B11: Verifica la API desde fuera ```bash curl https://sacc.ccsoft.mx/api/actuator/health ``` Si todo funciona, el rollback fue exitoso. --- ## 4. Cómo verificar que el rollback funcionó ### Checklist de verificación (API) - [ ] El servicio `systemd` está en estado `active (running)`. - [ ] El health check responde `"status":"UP"`. - [ ] El endpoint `https://sacc.ccsoft.mx/api/actuator/health` responde sin errores. - [ ] Los usuarios pueden iniciar sesión y usar la aplicación. - [ ] No hay errores críticos recientes en los logs. ### Checklist de verificación (Frontend) - [ ] La página `https://sacc.ccsoft.mx` carga sin errores. - [ ] La invalidación de CloudFront se completó. - [ ] No hay errores de consola del navegador relacionados con assets faltantes. ### Comandos útiles para verificar ```bash # Estado del servicio API sudo systemctl status proyectosacc-app.service # Health check local curl -s http://localhost:8080/actuator/health | grep '"status"' # Health check remoto curl -s https://sacc.ccsoft.mx/api/actuator/health | grep '"status"' # Últimos logs tail -n 30 /var/log/proyectosacc/proyectosacc-app/proyectosacc-app-service.log # Verificar que Nginx sigue redirigiendo bien la API sudo systemctl status nginx # Verificar invalidación de CloudFront aws cloudfront list-invalidations --distribution-id ``` --- ## 5. Después del rollback Una vez que la versión anterior esté estable: 1. **Investiga qué falló** en la nueva versión. 2. **Revisa los logs** del intento fallido. 3. **Notifica al equipo** por Telegram o el canal de comunicación que usen. 4. **Corrige el problema** en el código. 5. **Haz un nuevo deploy** solo cuando estés seguro de que el error está corregido. ### Mensaje de notificación sugerido ``` 🚨 Rollback ejecutado en proyectosacc Motivo: [describe brevemente el problema] Estado actual: Aplicación estable con versión anterior Próximo paso: Investigación del error en la nueva versión ``` --- *Anterior: [`09-runbook-deploy.md`](09-runbook-deploy.md)* *Siguiente: [`11-checklist-primer-deploy.md`](11-checklist-primer-deploy.md)*