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

270 lines
5.9 KiB
Markdown

# 09 - Runbook: Deploy Manual
> Qué hacer si el pipeline automático falla y necesitas desplegar a mano.
---
## 1. ¿Cuándo hacer un deploy manual?
Un **deploy manual** significa que tú, persona humana, ejecutas los pasos que normalmente hace el pipeline automático.
Haz un deploy manual cuando:
- 🔴 El pipeline de Bitbucket falló y no se puede reintentar.
- 🟡 Necesitas desplegar una corrección urgente fuera de horario.
- 🟠 El servidor EC2 fue recreado y el pipeline no está configurado todavía.
---
## 2. Paso a paso: deploy manual
Un deploy manual ahora tiene **dos partes**: subir el frontend a S3 + CloudFront, y desplegar la API en la EC2.
---
### PARTE A: Subir el frontend React a S3 e invalidar CloudFront
Esta parte puedes hacerla desde tu computadora local o desde cualquier máquina con AWS CLI configurada.
#### Paso A1: Ve a la carpeta del frontend compilado
```bash
cd /ruta/al/proyecto/frontend/build
```
Si no has compilado el frontend aún:
```bash
npm ci
npm run build
```
#### Paso A2: Sincroniza la carpeta `build/` con S3
```bash
aws s3 sync . s3://ccsoft-proyectosacc-frontend --delete
```
#### Paso A3: Invalida la caché de CloudFront
```bash
aws cloudfront create-invalidation \
--distribution-id <DISTRIBUTION_ID> \
--paths "/*"
```
> 💡 **Nota**: el `DISTRIBUTION_ID` lo encuentras en la consola de AWS o en los outputs de Terraform.
#### Paso A4: Verifica el frontend
Abre tu navegador y visita:
```
https://sacc.ccsoft.mx
```
Si ves la interfaz de SACC, la parte A fue exitosa.
---
### PARTE B: Desplegar la API backend en la EC2
#### Paso B1: Conéctate al servidor EC2
Necesitas la IP pública de la instancia y la **llave SSH dedicada** generada para `proyectosacc`.
```bash
ssh -i ~/.ssh/tu_llave.pem ubuntu@<IP_DE_LA_EC2>
```
O si ya estás dentro de la red de la empresa:
```bash
ssh thoth@<IP_DE_LA_EC2>
```
---
#### Paso B2: Conviértete en el usuario thoth
Si entraste como `ubuntu`, cambia al usuario de despliegue:
```bash
sudo su - thoth
```
---
#### Paso B3: Ve al directorio de despliegue
```bash
cd /home/thoth/deploy
```
---
#### Paso B4: Descarga el artefacto compilado de la API
Si el artefacto está en S3, descárgalo:
```bash
aws s3 cp s3://ccsoft-artifacts-sacc4/develop/proyectosacc-app-1.0.0.jar \
/home/thoth/deploy/artifacts/current/
```
Si no tienes acceso a S3, pide el archivo `.jar` a un compañero y súbelo con `scp`.
---
#### Paso B5: Ejecuta el script de deploy de la API
```bash
bash /home/thoth/deploy/setup/deploy.sh
```
Este script hará lo siguiente automáticamente:
1. Hará backup de la versión anterior.
2. Detendrá el servicio actual.
3. Copiará el nuevo archivo a su lugar.
4. Configurará y recargará `systemd`.
5. Iniciará el nuevo servicio.
6. Hará un health check.
---
#### Paso B6: Verifica que el servicio esté corriendo
```bash
sudo systemctl status proyectosacc-app.service
```
Deberías ver algo como:
```
● proyectosacc-app.service - Proyecto SACC App Service
Loaded: loaded (/etc/systemd/system/proyectosacc-app.service; enabled)
Active: active (running) since Mon 2026-04-14 10:30:00 UTC
```
Si dice `active (running)`, ¡excelente!
---
#### Paso B7: Verifica el health check de la API
```bash
curl http://localhost:8080/actuator/health
```
La respuesta debe incluir:
```json
{"status":"UP"}
```
---
#### Paso B8: Verifica la API desde fuera
Desde tu navegador o con `curl`, prueba un endpoint de la API:
```bash
curl https://sacc.ccsoft.mx/api/actuator/health
```
Si responde correctamente, el deploy manual completo fue exitoso.
---
## 3. Cómo revisar si el deploy funcionó
### Frontend (S3 + CloudFront)
- Abre `https://sacc.ccsoft.mx` en el navegador.
- Revisa la consola de AWS > S3 para ver que los archivos nuevos estén en el bucket.
- Verifica el estado de la invalidación de CloudFront en la consola de AWS.
### API (EC2)
#### Revisar los logs del servicio
```bash
sudo journalctl -u proyectosacc-app.service -n 50 --no-pager
```
#### Revisar el archivo de log de la aplicación
```bash
tail -n 50 /var/log/proyectosacc/proyectosacc-app/proyectosacc-app-service.log
```
#### Revisar que Nginx esté funcionando
```bash
sudo systemctl status nginx
```
#### Revisar que la API responda en el puerto correcto
```bash
ss -tlnp | grep 8080
```
---
## 4. Errores comunes y cómo arreglarlos
### Error 1: "Permission denied" al conectarse por SSH
**Causa**: la llave SSH no tiene los permisos correctos o no está en `authorized_keys`.
**Solución**:
```bash
# En tu computadora local
chmod 600 ~/.ssh/tu_llave.pem
# En el servidor, como thoth
chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys
```
---
### Error 2: "No such file or directory" al ejecutar deploy.sh
**Causa**: el script no está donde esperas o la ruta es incorrecta.
**Solución**:
```bash
# Busca el script
find /home/thoth -name "deploy.sh"
# Luego ejecútalo con la ruta completa
bash /home/thoth/deploy/setup/deploy.sh
```
---
### Error 3: El servicio no inicia (failed)
**Causa**: puede ser que falta Java, que el puerto 8080 ya está ocupado, o que hay un error en el archivo `.jar`.
**Solución**:
```bash
# Ver qué dice el log
sudo journalctl -u proyectosacc-app.service -n 100 --no-pager
# Ver si el puerto 8080 está ocupado
sudo lsof -i :8080
# Verificar que Java esté instalado
java -version
```
---
### Error 4: Health check falla después del deploy
**Causa**: la aplicación inició pero no responde correctamente, o tarda más de lo esperado.
**Solución**:
```bash
# Espera unos segundos más y vuelve a intentar
curl -v http://localhost:8080/actuator/health
# Revisa si hay errores en el log de la app
tail -n 100 /var/log/proyectosacc/proyectosacc-app/proyectosacc-app-service.log
```
Si sigue fallando, considera ejecutar el **rollback** (ver [`10-runbook-rollback.md`](10-runbook-rollback.md)).
---
*Anterior: [`08-seguridad-y-secretos.md`](08-seguridad-y-secretos.md)*
*Siguiente: [`10-runbook-rollback.md`](10-runbook-rollback.md)*