# Deploy de RifaSoft a VPS

## 1. Requisitos del VPS

- Ubuntu 22.04 / 24.04 (o similar Debian-based)
- PHP **8.2+** con extensiones: `mbstring`, `xml`, `bcmath`, `mysql`, `gd`, `curl`, `zip`, `intl`
- MySQL 8 / MariaDB 10.6+
- Nginx
- Composer 2.x
- Node.js 20+ (solo para `npm run build` durante deploy)
- Certbot (HTTPS gratis con Let's Encrypt)

### Instalación rápida (Ubuntu 24.04)

```bash
sudo apt update && sudo apt upgrade -y
sudo apt install -y nginx mysql-server php8.3-fpm php8.3-mysql php8.3-mbstring \
    php8.3-xml php8.3-bcmath php8.3-curl php8.3-zip php8.3-gd php8.3-intl \
    unzip git certbot python3-certbot-nginx

curl -sS https://getcomposer.org/installer | php
sudo mv composer.phar /usr/local/bin/composer

curl -fsSL https://deb.nodesource.com/setup_20.x | sudo -E bash -
sudo apt install -y nodejs
```

## 2. Crear la base de datos

```sql
CREATE DATABASE rifasoft CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
CREATE USER 'rifasoft'@'localhost' IDENTIFIED BY 'CAMBIA_ESTA_CLAVE';
GRANT ALL PRIVILEGES ON rifasoft.* TO 'rifasoft'@'localhost';
FLUSH PRIVILEGES;
```

## 3. Subir el código

```bash
sudo mkdir -p /var/www/rifasoft
sudo chown $USER:$USER /var/www/rifasoft
cd /var/www
git clone TU_REPO rifasoft
cd rifasoft
```

## 4. Instalar dependencias y configurar

```bash
composer install --no-dev --optimize-autoloader
npm ci && npm run build

cp .env.example .env
php artisan key:generate
nano .env   # ver sección de variables abajo
```

### Variables clave en `.env`

```env
APP_NAME=RifaSoft
APP_ENV=production
APP_DEBUG=false
APP_URL=https://tudominio.com

DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=rifasoft
DB_USERNAME=rifasoft
DB_PASSWORD=CAMBIA_ESTA_CLAVE

SESSION_DRIVER=database
CACHE_STORE=database
QUEUE_CONNECTION=database

FILESYSTEM_DISK=public
```

## 5. Migraciones y permisos

```bash
php artisan migrate --force
php artisan storage:link

sudo chown -R www-data:www-data /var/www/rifasoft
sudo chmod -R 775 /var/www/rifasoft/storage /var/www/rifasoft/bootstrap/cache
```

## 6. Optimización para producción

```bash
php artisan config:cache
php artisan route:cache
php artisan view:cache
php artisan event:cache
```

> **Tip:** ejecuta estos cuatro comandos cada vez que despliegues cambios.

## 7. Nginx — virtual host

Archivo: `/etc/nginx/sites-available/rifasoft`

```nginx
server {
    listen 80;
    server_name tudominio.com www.tudominio.com;
    root /var/www/rifasoft/public;
    index index.php;

    add_header X-Frame-Options "SAMEORIGIN";
    add_header X-Content-Type-Options "nosniff";
    client_max_body_size 10M;

    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.3-fpm.sock;
        fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
        include fastcgi_params;
    }

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

Activar y probar:

```bash
sudo ln -s /etc/nginx/sites-available/rifasoft /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl reload nginx
```

## 8. HTTPS con Let's Encrypt

```bash
sudo certbot --nginx -d tudominio.com -d www.tudominio.com
```

## 9. Cron de Laravel (opcional, recomendado)

Aunque hoy no usas tareas programadas críticas, deja el scheduler configurado para futuras (limpiar archivos temporales, generar reportes, etc.):

```bash
sudo crontab -e -u www-data
```

Agregar:

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

## 10. Script de deploy (opcional)

Crea `/var/www/rifasoft/deploy.sh`:

```bash
#!/bin/bash
set -e
cd /var/www/rifasoft

php artisan down --render="errors::503"

git pull origin main
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
php artisan event:cache

php artisan up
echo "Deploy completado: $(date)"
```

```bash
chmod +x deploy.sh
```

## 11. Backups

Cron diario en `/etc/cron.daily/rifasoft-backup`:

```bash
#!/bin/bash
DATE=$(date +%Y%m%d)
BACKUP_DIR=/var/backups/rifasoft
mkdir -p $BACKUP_DIR
mysqldump -u rifasoft -p'CAMBIA_ESTA_CLAVE' rifasoft | gzip > $BACKUP_DIR/db_$DATE.sql.gz
tar -czf $BACKUP_DIR/storage_$DATE.tar.gz -C /var/www/rifasoft storage/app/public
find $BACKUP_DIR -mtime +14 -delete
```

```bash
sudo chmod +x /etc/cron.daily/rifasoft-backup
```

## 12. Checklist de verificación post-deploy

- [ ] `https://tudominio.com/register` carga
- [ ] Registro crea organización + usuario
- [ ] Subida de imagen funciona (revisa permisos de `storage/app/public`)
- [ ] `https://tudominio.com/{org-slug}` muestra rifas activas
- [ ] Reservar un número desde la URL pública persiste y se ve en el panel admin
- [ ] `https://tudominio.com/{org-slug}/{rifa-slug}` carga la grilla
- [ ] Logs limpios: `tail -f storage/logs/laravel.log`
