# Guía de Deployment a Producción - Ticketera

## ✅ Pre-requisitos

### Servidor
- PHP >= 8.2
- Composer
- MySQL >= 8.0
- Redis (opcional pero recomendado)
- Nginx o Apache
- Node.js y NPM (para compilar assets)

### Extensiones PHP Requeridas
```bash
php -m | grep -E "pdo|mysql|mbstring|xml|bcmath|json|tokenizer|ctype|fileinfo|openssl|gd|zip"
```

## 📋 Checklist de Deployment

### 1. Preparación del Servidor

- [ ] Crear base de datos MySQL
- [ ] Crear usuario de base de datos con permisos adecuados
- [ ] Configurar PHP (aumentar `memory_limit`, `upload_max_filesize`, etc.)
- [ ] Instalar y configurar Redis (opcional)
- [ ] Configurar servidor web (Nginx/Apache)

### 2. Clonar y Configurar el Proyecto

```bash
# Clonar repositorio
git clone <tu-repositorio> /var/www/ticketera
cd /var/www/ticketera

# Instalar dependencias de PHP
composer install --optimize-autoloader --no-dev

# Instalar dependencias de Node
npm install
npm run build
```

### 3. Configuración del Archivo .env

- [ ] Copiar `.env.example` a `.env`
- [ ] Generar application key: `php artisan key:generate`
- [ ] Configurar variables de entorno:

```bash
APP_NAME=Ticketera
APP_COMPANY_NAME="Tu Empresa"
APP_ENV=production
APP_DEBUG=false
APP_URL=https://tu-dominio.com

LOG_LEVEL=error

DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=ticketera_prod
DB_USERNAME=ticketera_user
DB_PASSWORD=tu_password_seguro

# Redis (recomendado para producción)
CACHE_DRIVER=redis
SESSION_DRIVER=redis
QUEUE_CONNECTION=database

REDIS_HOST=127.0.0.1
REDIS_PASSWORD=
REDIS_PORT=6379

# Configuración de correo
MAIL_MAILER=smtp
MAIL_HOST=smtp.gmail.com
MAIL_PORT=587
MAIL_USERNAME=tu-correo@gmail.com
MAIL_PASSWORD=tu-app-password
MAIL_ENCRYPTION=tls
MAIL_FROM_ADDRESS="noreply@tu-dominio.com"
MAIL_FROM_NAME="${APP_NAME}"
```

### 4. Permisos de Archivos

```bash
# Establecer propietario correcto
sudo chown -R www-data:www-data /var/www/ticketera

# Permisos de directorios
sudo find /var/www/ticketera -type d -exec chmod 755 {} \;
sudo find /var/www/ticketera -type f -exec chmod 644 {} \;

# Permisos especiales para storage y bootstrap/cache
sudo chmod -R 775 storage bootstrap/cache
sudo chown -R www-data:www-data storage bootstrap/cache
```

### 5. Base de Datos

```bash
# Ejecutar migraciones
php artisan migrate --force

# (Opcional) Ejecutar seeders si necesitas datos iniciales
php artisan db:seed --force
```

### 6. Optimizaciones de Laravel

```bash
# Limpiar caches anteriores
php artisan optimize:clear

# Cachear configuración
php artisan config:cache

# Cachear rutas
php artisan route:cache

# Cachear vistas
php artisan view:cache

# Cachear eventos
php artisan event:cache
```

### 7. Storage Link

```bash
# Crear enlace simbólico para archivos públicos
php artisan storage:link
```

### 8. Configuración del Servidor Web

#### Nginx (Recomendado)

Crear archivo `/etc/nginx/sites-available/ticketera`:

```nginx
server {
    listen 80;
    listen [::]:80;
    server_name tu-dominio.com www.tu-dominio.com;
    root /var/www/ticketera/public;

    add_header X-Frame-Options "SAMEORIGIN";
    add_header X-Content-Type-Options "nosniff";

    index index.php;

    charset utf-8;

    location / {
        try_files $uri $uri/ /index.php?$query_string;
    }

    location = /favicon.ico { access_log off; log_not_found off; }
    location = /robots.txt  { access_log off; log_not_found off; }

    error_page 404 /index.php;

    location ~ \.php$ {
        fastcgi_pass unix:/var/run/php/php8.2-fpm.sock;
        fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
        include fastcgi_params;
    }

    location ~ /\.(?!well-known).* {
        deny all;
    }
}
```

Activar sitio:
```bash
sudo ln -s /etc/nginx/sites-available/ticketera /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl reload nginx
```

### 9. SSL/HTTPS con Let's Encrypt

```bash
# Instalar certbot
sudo apt install certbot python3-certbot-nginx

# Obtener certificado SSL
sudo certbot --nginx -d tu-dominio.com -d www.tu-dominio.com

# Verificar renovación automática
sudo certbot renew --dry-run
```

### 10. Configurar Queue Workers (Opcional)

Si usas colas, crear supervisor config en `/etc/supervisor/conf.d/ticketera-worker.conf`:

```ini
[program:ticketera-worker]
process_name=%(program_name)s_%(process_num)02d
command=php /var/www/ticketera/artisan queue:work --sleep=3 --tries=3 --max-time=3600
autostart=true
autorestart=true
stopasgroup=true
killasgroup=true
user=www-data
numprocs=2
redirect_stderr=true
stdout_logfile=/var/www/ticketera/storage/logs/worker.log
stopwaitsecs=3600
```

Activar:
```bash
sudo supervisorctl reread
sudo supervisorctl update
sudo supervisorctl start ticketera-worker:*
```

### 11. Configurar Cron para Tareas Programadas

```bash
# Editar crontab
sudo crontab -e -u www-data

# Añadir línea:
* * * * * cd /var/www/ticketera && php artisan schedule:run >> /dev/null 2>&1
```

### 12. Seguridad Adicional

- [ ] Desactivar directory listing
- [ ] Configurar firewall (UFW)
- [ ] Configurar fail2ban
- [ ] Backup automático de base de datos
- [ ] Monitoreo de logs
- [ ] Rate limiting en Nginx
- [ ] Actualizar regularmente el sistema

### 13. Monitoreo y Logs

```bash
# Ver logs de Laravel
tail -f /var/www/ticketera/storage/logs/laravel.log

# Ver logs de Nginx
tail -f /var/log/nginx/error.log

# Ver logs de PHP-FPM
tail -f /var/log/php8.2-fpm.log
```

## 🔄 Proceso de Actualización

Cuando necesites actualizar la aplicación:

```bash
# 1. Modo de mantenimiento
php artisan down

# 2. Actualizar código
git pull origin main

# 3. Actualizar dependencias
composer install --optimize-autoloader --no-dev
npm install && npm run build

# 4. Ejecutar migraciones
php artisan migrate --force

# 5. Limpiar y cachear
php artisan optimize:clear
php artisan config:cache
php artisan route:cache
php artisan view:cache
php artisan event:cache

# 6. Salir del modo mantenimiento
php artisan up
```

## 🔒 Seguridad - Variables Sensibles

### NUNCA subir al repositorio:
- `.env` (archivo de producción)
- `composer.phar`
- Archivos en `/storage/logs/`
- Archivos en `/storage/app/` con datos reales
- `/vendor/` (se genera con composer install)
- `/node_modules/` (se genera con npm install)

### Verificar antes de deployment:
- `APP_DEBUG=false` en producción
- `APP_ENV=production` 
- Contraseñas seguras en DB y MAIL
- APP_KEY generada correctamente

## 📊 Optimizaciones de Performance

### Base de Datos
- Crear índices en columnas frecuentemente consultadas
- Usar conexión persistente a BD
- Configurar pool de conexiones

### Aplicación
- Usar Redis para cache y sesiones
- Implementar CDN para assets estáticos
- Configurar OPcache en PHP
- Minificar CSS y JS
- Optimizar imágenes

### Nginx
```nginx
# Configurar gzip
gzip on;
gzip_vary on;
gzip_proxied any;
gzip_comp_level 6;
gzip_types text/plain text/css text/xml text/javascript application/json application/javascript application/xml+rss;

# Cache de archivos estáticos
location ~* \.(jpg|jpeg|png|gif|ico|css|js|svg|woff|woff2|ttf|eot)$ {
    expires 1y;
    add_header Cache-Control "public, immutable";
}
```

## 🆘 Troubleshooting

### Error 500
- Revisar logs: `tail -f storage/logs/laravel.log`
- Verificar permisos de storage y bootstrap/cache
- Verificar configuración de .env

### No se muestran imágenes/archivos
- Verificar `php artisan storage:link`
- Verificar permisos de storage/app/public

### Problemas de sesión
- Verificar configuración de SESSION_DRIVER
- Si usa Redis, verificar que esté corriendo: `redis-cli ping`

### Base de datos
- Verificar credenciales en .env
- Verificar que el usuario tenga permisos
- Revisar logs de MySQL: `/var/log/mysql/error.log`

## 📞 Contacto y Soporte

Para soporte técnico o consultas sobre el deployment, contactar al equipo de desarrollo.

---

**Última actualización:** Noviembre 2025
**Versión del documento:** 1.0
