# Despliegue En Servidor Linux

Guia para desplegar esta API en un servidor tipo Apache/PHP con proyectos en `/var/www/html`.

La recomendacion es no ejecutar FastAPI como PHP dentro del webroot. Lo mas estable es:

1. Guardar el proyecto en una carpeta propia.
2. Crear un virtualenv con Python 3.11+.
3. Ejecutar Uvicorn con `systemd`.
4. Exponerlo por Apache o Nginx usando reverse proxy HTTPS.

## 1. Ubicacion Recomendada

Puedes usar una carpeta propia bajo `/var/www/html`:

```bash
cd /var/www/html
sudo mkdir macrobase-freshchat-api
sudo chown -R christian:christian macrobase-freshchat-api
cd macrobase-freshchat-api
```

Tambien seria valido usar `/opt/macrobase-freshchat-api`. Si el servidor ya organiza todo en `/var/www/html`, usar una carpeta separada ahi es aceptable.

## 2. Subir El Proyecto

Sube estos archivos al servidor:

```text
app/
docs/
requirements.txt
Dockerfile
README.md
.env.example
```

Luego crea `.env`:

```bash
cp .env.example .env
nano .env
```

Genera un token seguro:

```bash
openssl rand -hex 32
```

Ejemplo de `.env`:

```env
APP_NAME=MacroBase Freshchat API
APP_ENV=production
FRESHCHAT_API_TOKEN=pega-aqui-el-token-generado
DEFAULT_RESPONSE_MODE=freshchat_simple
```

Ese mismo token debe configurarse en Freshchat API Library como:

```http
Authorization: Bearer pega-aqui-el-token-generado
```

## 3. Instalar Python Y Dependencias

Verifica Python:

```bash
python3 --version
```

Si el servidor no tiene Python 3.11+:

```bash
sudo apt update
sudo apt install -y python3.11 python3.11-venv python3-pip
```

Crea el entorno:

```bash
cd /var/www/html/macrobase-freshchat-api
python3.11 -m venv .venv
source .venv/bin/activate
pip install --upgrade pip
pip install -r requirements.txt
```

Prueba local:

```bash
.venv/bin/python -m uvicorn app.main:app --host 127.0.0.1 --port 8010
```

En otra terminal:

```bash
curl http://127.0.0.1:8010/health
```

Debe responder:

```json
{"status":"ok"}
```

## 4. Crear Servicio systemd

Crea el archivo:

```bash
sudo nano /etc/systemd/system/macrobase-freshchat-api.service
```

Contenido:

```ini
[Unit]
Description=MacroBase Freshchat FastAPI
After=network.target

[Service]
User=pruebas_christian
Group=pruebas_christian
WorkingDirectory=/var/www/html/macrobase-freshchat-api
EnvironmentFile=/var/www/html/macrobase-freshchat-api/.env
ExecStart=/var/www/html/macrobase-freshchat-api/.venv/bin/python -m uvicorn app.main:app --host 127.0.0.1 --port 8010
Restart=always
RestartSec=5

[Install]
WantedBy=multi-user.target
```

Activa el servicio:

```bash
sudo systemctl daemon-reload
sudo systemctl enable macrobase-freshchat-api
sudo systemctl start macrobase-freshchat-api
sudo systemctl status macrobase-freshchat-api
```

Logs:

```bash
sudo journalctl -u macrobase-freshchat-api -f
```

Comandos utiles:

```bash
sudo systemctl restart macrobase-freshchat-api
sudo systemctl stop macrobase-freshchat-api
sudo systemctl status macrobase-freshchat-api
sudo journalctl -u macrobase-freshchat-api -n 200 --no-pager
sudo journalctl -u macrobase-freshchat-api --since "10 minutes ago"
```

Usa `--host 127.0.0.1` si Apache/Nginx expone la API por HTTPS, por ejemplo `https://apifresh.sistemasmb.com`.
Usa `--host 0.0.0.0` solo si Freshchat va a llamar directamente el puerto `8010` por IP publica.

## 5. Exponer Por Apache

Freshchat necesita llamar una URL publica con HTTPS.

Primero habilita modulos de proxy si usas Apache:

```bash
sudo a2enmod proxy proxy_http headers ssl
sudo systemctl reload apache2
```

### Opcion A: Subdominio Recomendado

Ejemplo:

```text
https://api.tu-dominio.com
```

VirtualHost Apache:

```apache
<VirtualHost *:443>
    ServerName api.tu-dominio.com

    SSLEngine on
    SSLCertificateFile /ruta/a/fullchain.pem
    SSLCertificateKeyFile /ruta/a/privkey.pem

    ProxyPreserveHost On
    ProxyPass / http://127.0.0.1:8010/
    ProxyPassReverse / http://127.0.0.1:8010/

    RequestHeader set X-Forwarded-Proto "https"
</VirtualHost>
```

Endpoints externos:

```text
https://api.tu-dominio.com/health
https://api.tu-dominio.com/freshchat/workflow/start
https://api.tu-dominio.com/freshchat/mbia/bot
```

### Opcion B: Ruta Dentro De Un Dominio Existente

Ejemplo:

```text
https://tu-dominio.com/macrobase-freshchat-api
```

Config Apache:

```apache
ProxyPreserveHost On
ProxyPass /macrobase-freshchat-api/ http://127.0.0.1:8010/
ProxyPassReverse /macrobase-freshchat-api/ http://127.0.0.1:8010/
RequestHeader set X-Forwarded-Proto "https"
```

Endpoints externos:

```text
https://tu-dominio.com/macrobase-freshchat-api/health
https://tu-dominio.com/macrobase-freshchat-api/freshchat/workflow/start
https://tu-dominio.com/macrobase-freshchat-api/freshchat/mbia/bot
```

## 6. Probar Desde Fuera Del Servidor

Health:

```bash
curl https://tu-url-publica/health
```

Workflow start:

```bash
curl -X POST https://tu-url-publica/freshchat/workflow/start \
  -H "Authorization: Bearer TU_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "cliente": "123",
    "nombreCompleto": "Cliente Demo",
    "nombre": "Cliente",
    "telefono": "+50255555555",
    "email": "cliente@example.com",
    "canal": "whatsapp",
    "supports_interactive": true
  }'
```

Si usas ruta con prefijo, cambia la URL:

```text
https://tu-dominio.com/macrobase-freshchat-api/freshchat/workflow/start
```

## 7. Configurar Freshchat API Library

En Freshchat:

```text
Request type: POST
Encoding: JSON
Authentication: Custom headers
```

Headers:

```http
Authorization: Bearer TU_TOKEN
Content-Type: application/json
```

URL ejemplo:

```text
https://tu-url-publica/freshchat/workflow/start
```

Body:

```json
{
  "cliente": "{{contact.id}}",
  "nombreCompleto": "{{contact.name}}",
  "nombre": "{{contact.firstname}}",
  "telefono": "{{contact.phone}}",
  "email": "{{contact.email}}",
  "canal": "whatsapp",
  "supports_interactive": true
}
```

## 8. Checklist De Produccion

- Usar HTTPS valido.
- Usar token largo generado con `openssl rand -hex 32`.
- No dejar `FRESHCHAT_API_TOKEN=change-me`.
- Mantener Uvicorn en `127.0.0.1`, no expuesto directamente.
- Revisar logs con `journalctl`.
- Probar endpoint desde una red externa antes de configurarlo en Freshchat.
- Configurar `APP_ENV=production`.
