236 lines
6.0 KiB
Markdown
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)*
|