# Despliegue en producción — Control Ganadero

## Requisitos del servidor

- PHP 8.1+ (extensiones: `pdo`, `mbstring`, `openssl`, `tokenizer`, `xml`, `ctype`, `json`, `bcmath`, `fileinfo`, `gd` o `imagick` si sube logos)
- Composer 2.x
- Node.js 18+ y npm (solo en fase de build)
- MySQL 8+ o MariaDB 10.3+
- Nginx o Apache con `public/` como document root
- Cron para el programador de Laravel
- SMTP para correos de alertas (opcional)

## 1. Variables de entorno (producción)

Copie `.env.example` a `.env` y ajuste:

```env
APP_NAME="Control Ganadero"
APP_ENV=production
APP_DEBUG=false
APP_URL=https://su-dominio.com

DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_DATABASE=ganaderia
DB_USERNAME=...
DB_PASSWORD=...

# Frontend llama al API (misma origen suele bastar con /api)
VITE_API_URL=/api

# Seguridad
ALLOW_DEV_SETUP_ROUTES=false
RANCH_SEED_DEMO_DATA=false
RANCH_LEGACY_LAUNDRY_ROUTES=false

# Alertas GDP por correo
RANCH_ALERT_EMAILS=dueno@rancho.com
RANCH_SCHEDULE_WEIGHT_ALERTS=true
RANCH_MIN_GDP_ALERT=0.5
RANCH_DAYS_WITHOUT_WEIGH_ALERT=30

MAIL_MAILER=smtp
MAIL_HOST=...
MAIL_PORT=587
MAIL_USERNAME=...
MAIL_PASSWORD=...
MAIL_FROM_ADDRESS=noreply@su-dominio.com
MAIL_FROM_NAME="${APP_NAME}"
```

Genere clave:

```bash
php artisan key:generate
```

## 2. Instalación en el servidor

```bash
composer install --no-dev --optimize-autoloader
npm ci
npm run build
php artisan ranch:install-production
```

El comando `ranch:install-production` ejecuta:

- `migrate --force`
- `db:seed` (config empresa, materiales, usuario caporal; **sin** datos demo)
- `storage:link`
- `config:cache`, `route:cache`, `view:cache`
- Limpieza de cachés de permisos (Spatie)

### Primera vez sin el comando todo-en-uno

```bash
php artisan migrate --force
php artisan db:seed --force
php artisan storage:link
php artisan config:cache
php artisan route:cache
php artisan view:cache
```

## 3. Permisos de carpetas

El usuario del servidor web debe poder escribir en:

- `storage/`
- `bootstrap/cache/`

```bash
chown -R www-data:www-data storage bootstrap/cache
chmod -R ug+rwx storage bootstrap/cache
```

## 4. Servidor web (Nginx)

Ejemplo mínimo:

```nginx
server {
    listen 80;
    server_name su-dominio.com;
    root /var/www/ganaderia/public;

    index index.php;
    charset utf-8;

    location / {
        try_files $uri $uri/ /index.php?$query_string;
    }

    location ~ \.php$ {
        fastcgi_pass unix:/run/php/php8.2-fpm.sock;
        fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
        include fastcgi_params;
    }

    location ~ /\.(?!well-known).* {
        deny all;
    }
}
```

Active HTTPS (Let's Encrypt) en producción.

## 5. Cron (alertas GDP y tareas programadas)

```cron
* * * * * cd /var/www/ganaderia && php artisan schedule:run >> /dev/null 2>&1
```

Esto dispara diariamente `ranch:notify-weight-alerts` a las 07:00 si `RANCH_SCHEDULE_WEIGHT_ALERTS=true`.

## 6. Verificación

```bash
curl -s https://su-dominio.com/api/health
# {"status":"ok","app":"Control Ganadero",...}
```

Inicie sesión, cargue logo en **Datos del rancho**, registre un animal de prueba.

## 7. Actualizar versión

```bash
git pull
composer install --no-dev --optimize-autoloader
npm ci && npm run build
php artisan migrate --force
php artisan config:cache
php artisan route:cache
php artisan view:cache
```

## 8. Checklist pre-go-live

- [ ] `APP_DEBUG=false`
- [ ] `RANCH_SEED_DEMO_DATA=false`
- [ ] HTTPS activo
- [ ] Credenciales admin cambiadas (no dejar `password` por defecto)
- [ ] `RANCH_ALERT_EMAILS` configurado
- [ ] Cron `schedule:run` activo
- [ ] Backup de base de datos programado
- [ ] Logo y datos del rancho en `/admin/configuracion-empresa`

## Usuarios por defecto (tras migraciones + seed)

| Rol | Email | Notas |
|-----|-------|--------|
| Administrador | `admin@gmail.com` | Cambiar contraseña en producción |
| Caporal | `caporal@rancho.local` | Operación de campo; sin balance financiero |

## 9. Respaldo de base de datos

Requiere `mysqldump` en el servidor:

```bash
php artisan ranch:backup-database
```

Archivos en `storage/app/backups/` (`.sql.gz` por defecto). Retención: 14 días (`RANCH_DB_BACKUP_RETENTION_DAYS`).

Automático diario a las 02:30:

```env
RANCH_SCHEDULE_DB_BACKUP=true
```

## Soporte

Lógica de negocio y API: `config/ranch.php`, `routes/ranch.php`, `docs/RANCH_SETUP.md`.

