Files
proyectosacc-mirror/docs/10-runbook-rollback.md
T
2026-04-14 14:53:05 -06:00

236 lines
6.0 KiB
Markdown

# 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=<VERSION_ID> \
--key index.html
```
#### Paso A3: Invalida la caché de CloudFront
```bash
aws cloudfront create-invalidation \
--distribution-id <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@<IP_DE_LA_EC2>
```
#### 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 <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)*