# 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)*
