# Guia SSL con Certbot - GAMILIT

**Version:** 1.0.0
**Fecha:** 2025-12-18
**Autor:** Requirements-Analyst (SIMCO)

---

## 1. INTRODUCCION Y PROPOSITO

### Que hace el script `setup-ssl-certbot.sh`

Configura SSL/HTTPS automaticamente para la plataforma GAMILIT usando:
- **Let's Encrypt (Certbot):** Certificados SSL gratuitos y automaticos para dominios reales
- **Auto-firmado:** Certificados locales para servidores sin dominio publico

### Cuando usar cada opcion

| Escenario | Opcion | Comando |
|-----------|--------|---------|
| Servidor con dominio real (produccion) | Let's Encrypt | `./scripts/setup-ssl-certbot.sh gamilit.com` |
| Servidor sin dominio (desarrollo/staging) | Auto-firmado | `./scripts/setup-ssl-certbot.sh --self-signed` |
| Multiples dominios | Let's Encrypt | `./scripts/setup-ssl-certbot.sh gamilit.com www.gamilit.com` |

---

## 2. ARQUITECTURA

### Diagrama de Flujo HTTP a HTTPS

```
                    Internet
                       │
                       ▼
              ┌─────────────────┐
              │  Puerto 80/443  │
              │     (Nginx)     │
              └────────┬────────┘
                       │
        ┌──────────────┼──────────────┐
        │              │              │
        ▼              ▼              ▼
   /api/*         /socket.io     /*
        │              │              │
        ▼              ▼              ▼
┌───────────┐  ┌───────────┐  ┌───────────┐
│  Backend  │  │ WebSocket │  │ Frontend  │
│   :3006   │  │   :3006   │  │   :3005   │
└───────────┘  └───────────┘  └───────────┘
```

### Puertos Utilizados

| Puerto | Servicio | Tipo |
|--------|----------|------|
| 80 | Nginx HTTP | Externo (redirect a 443) |
| 443 | Nginx HTTPS | Externo |
| 3005 | Frontend (PM2) | Interno |
| 3006 | Backend (PM2) | Interno |
| 5432 | PostgreSQL | Interno |

---

## 3. REQUISITOS PREVIOS

### Sistema
- [x] Ubuntu/Debian
- [x] Acceso root (sudo)
- [x] Puertos 80 y 443 abiertos en firewall

### Servicios
- [x] PM2 instalado y ejecutando
- [x] `gamilit-backend` activo en PM2
- [x] `gamilit-frontend` activo en PM2

### DNS (solo para Let's Encrypt)
- [x] Dominio registrado
- [x] DNS A record apuntando al servidor (IP: 74.208.126.102 o tu IP)

### Verificar requisitos

```bash
# Verificar PM2
pm2 list

# Verificar puertos
sudo ufw status

# Verificar DNS (reemplaza con tu dominio)
dig +short tu-dominio.com
```

---

## 4. INSTALACION RAPIDA

### Opcion A: Con Dominio Real (Let's Encrypt)

```bash
# 1. Hacer script ejecutable
chmod +x scripts/setup-ssl-certbot.sh

# 2. Ejecutar con tu dominio
sudo ./scripts/setup-ssl-certbot.sh gamilit.com

# 3. Para multiples dominios
sudo ./scripts/setup-ssl-certbot.sh gamilit.com www.gamilit.com
```

### Opcion B: Sin Dominio (Auto-firmado)

```bash
# 1. Hacer script ejecutable
chmod +x scripts/setup-ssl-certbot.sh

# 2. Ejecutar con flag auto-firmado
sudo ./scripts/setup-ssl-certbot.sh --self-signed
```

### Ayuda

```bash
./scripts/setup-ssl-certbot.sh --help
```

---

## 5. CONFIGURACION DETALLADA

### Paso a Paso: Let's Encrypt

1. **Verificacion de prerequisitos**
   - Instala Nginx si no existe
   - Instala Certbot si no existe
   - Verifica procesos PM2

2. **Verificacion DNS**
   - Resuelve el dominio
   - Verifica que apunte al servidor correcto
   - Si hay discrepancia, pregunta confirmacion

3. **Configuracion Nginx inicial (HTTP)**
   - Crea config en `/etc/nginx/sites-available/gamilit`
   - Configura proxies para Frontend, API, WebSocket
   - Habilita sitio y recarga Nginx

4. **Obtencion de certificado**
   - Ejecuta Certbot con el dominio
   - Configura renovacion automatica
   - Actualiza config Nginx con SSL

5. **Actualizacion de variables de entorno**
   - Modifica `.env.production` del backend
   - Modifica `.env.production` del frontend

6. **Rebuild y restart**
   - Rebuild del frontend con nuevas variables
   - Restart de todos los servicios PM2

7. **Validacion**
   - Verifica HTTPS en Frontend
   - Verifica HTTPS en API
   - Verifica redirect HTTP->HTTPS

### Paso a Paso: Auto-firmado

Similar al anterior pero:
- Genera certificado con OpenSSL (365 dias)
- Almacena en `/etc/nginx/ssl/`
- No requiere validacion DNS

---

## 6. VARIABLES DE ENTORNO ACTUALIZADAS

### Backend (.env.production)

```env
# ANTES
CORS_ORIGIN=http://74.208.126.102:3005
FRONTEND_URL=http://74.208.126.102:3005

# DESPUES (Let's Encrypt)
CORS_ORIGIN=https://gamilit.com
FRONTEND_URL=https://gamilit.com

# DESPUES (Auto-firmado)
CORS_ORIGIN=https://74.208.126.102
FRONTEND_URL=https://74.208.126.102
```

### Frontend (.env.production)

```env
# ANTES
VITE_API_HOST=74.208.126.102:3006
VITE_API_PROTOCOL=http
VITE_WS_HOST=74.208.126.102:3006
VITE_WS_PROTOCOL=ws

# DESPUES
VITE_API_HOST=gamilit.com
VITE_API_PROTOCOL=https
VITE_WS_HOST=gamilit.com
VITE_WS_PROTOCOL=wss
```

---

## 7. VALIDACION POST-INSTALACION

### Validacion Automatica

```bash
./scripts/validate-deployment.sh --ssl --verbose
```

### Validacion Manual

```bash
# Frontend HTTPS
curl -I https://gamilit.com

# API HTTPS
curl https://gamilit.com/api/health

# Redirect HTTP->HTTPS
curl -I http://gamilit.com

# Certificado
echo | openssl s_client -connect gamilit.com:443 2>/dev/null | openssl x509 -noout -dates
```

### URLs de Acceso (post-SSL)

| Servicio | URL |
|----------|-----|
| Frontend | https://gamilit.com |
| API | https://gamilit.com/api |
| Health | https://gamilit.com/api/health |
| WebSocket | wss://gamilit.com/socket.io |

---

## 8. TROUBLESHOOTING

### DNS no resuelve

```
Error: No se pudo resolver dominio gamilit.com
```

**Solucion:**
1. Verificar DNS: `dig +short gamilit.com`
2. Esperar propagacion DNS (hasta 48h)
3. Verificar A record en registrador de dominio

### Certbot falla

```
Error: Challenge failed for domain
```

**Solucion:**
1. Verificar puerto 80 abierto: `sudo ufw allow 80`
2. Verificar que Nginx responde: `curl http://localhost`
3. Revisar logs: `sudo tail -f /var/log/letsencrypt/letsencrypt.log`

### Nginx no inicia

```
Error: Configuracion Nginx invalida
```

**Solucion:**
1. Verificar sintaxis: `sudo nginx -t`
2. Revisar config: `sudo cat /etc/nginx/sites-available/gamilit`
3. Revisar logs: `sudo tail -f /var/log/nginx/error.log`

### CORS errors despues de SSL

```
Error: CORS policy blocked
```

**Solucion:**
1. Verificar CORS_ORIGIN en backend: `grep CORS apps/backend/.env.production`
2. Debe ser exactamente `https://tu-dominio.com` (sin trailing slash)
3. Restart backend: `pm2 restart gamilit-backend`

### Certificado expirado

```
Error: SSL certificate has expired
```

**Solucion:**
1. Renovar manualmente: `sudo certbot renew`
2. Verificar cron de renovacion: `sudo systemctl status certbot.timer`
3. Si falla, regenerar: `sudo certbot certonly --nginx -d gamilit.com`

---

## 9. RENOVACION Y MANTENIMIENTO

### Renovacion Automatica

Certbot configura automaticamente un cron/timer para renovacion.

```bash
# Verificar timer
sudo systemctl status certbot.timer

# Ver proxima renovacion
sudo certbot certificates
```

### Renovacion Manual

```bash
# Dry-run (sin cambios)
sudo certbot renew --dry-run

# Renovacion forzada
sudo certbot renew --force-renewal
```

### Logs de Renovacion

```bash
# Logs de Certbot
sudo tail -f /var/log/letsencrypt/letsencrypt.log

# Historial de renovaciones
sudo ls -la /etc/letsencrypt/renewal-hooks/
```

---

## 10. REFERENCIAS

- [Documentacion Certbot](https://certbot.eff.org/docs/)
- [Nginx SSL Configuration](https://nginx.org/en/docs/http/configuring_https_servers.html)
- [Let's Encrypt](https://letsencrypt.org/docs/)

### Documentacion Relacionada

- `GUIA-SSL-NGINX-PRODUCCION.md` - Configuracion manual de SSL
- `GUIA-SSL-AUTOFIRMADO.md` - Certificados auto-firmados
- `GUIA-DEPLOYMENT-RAPIDO.md` - Deployment general
- `GUIA-VALIDACION-PRODUCCION.md` - Validaciones post-deployment

---

**Script:** `/scripts/setup-ssl-certbot.sh`
**Ultima actualizacion:** 2025-12-18
