# 🔧 Correção - Backup Automático Não Rodando

## 📊 Problema Identificado

**Sintoma:** Backup automático configurado para rodar diariamente às 02:00 não executa, mas funciona quando executado manualmente.

**Causa:** Bug crítico na lógica de verificação de horário no scheduler. A verificação comparava strings de tempo (`"02:00" === "02:00"`), mas falhava se o scheduler executasse em qualquer segundo diferente de `:00`.

**Status:** ✅ **CORRIGIDO**

---

## 🔧 Correções Aplicadas

### 1. Kernel.php - Lógica de Agendamento

**Arquivo:** `backend/app/Console/Kernel.php`

**Mudança:**
- **Antes:** Comparava strings de tempo completas (`$currentTime === $scheduledTime`)
- **Depois:** Compara apenas hora e minuto como inteiros, ignorando segundos

**Resultado:** O backup agora executará corretamente mesmo que o scheduler não rode exatamente no segundo 00.

### 2. Logs de Diagnóstico

Adicionados logs detalhados no comando `database:auto-backup` para facilitar diagnóstico:
- Hora de início da execução
- Configurações de backup (retenção, upload, etc.)
- Sucesso/falha do backup
- Detalhes do upload para MinIO

---

## ✅ Verificar no Servidor de Produção

### 1. Verificar se o Cron Está Configurado

O scheduler do Laravel precisa de uma entrada no crontab do servidor:

```bash
# Ver o crontab atual
crontab -l

# Deve ter esta linha (ou similar):
* * * * * cd /var/www/gestorstream/backend && /usr/bin/php artisan schedule:run >> /dev/null 2>&1
```

**Se não tiver:**

```bash
# Editar crontab
crontab -e

# Adicionar esta linha:
* * * * * cd /var/www/gestorstream/backend && /usr/bin/php artisan schedule:run >> /var/www/gestorstream/backend/storage/logs/scheduler.log 2>&1
```

### 2. Verificar Configurações de Backup

```bash
cd /var/www/gestorstream/backend

# Ver configurações atuais
php artisan tinker
>>> \App\Models\SystemSetting::get('auto_backup_enabled')
>>> \App\Models\SystemSetting::get('auto_backup_time')
>>> \App\Models\SystemSetting::get('auto_backup_frequency')
>>> \App\Models\SystemSetting::get('auto_backup_retention_days')
>>> \App\Models\SystemSetting::get('auto_backup_upload_to_storage')
>>> \App\Models\SystemSetting::get('auto_backup_keep_local')
>>> exit
```

### 3. Testar Backup Manual

```bash
cd /var/www/gestorstream/backend

# Executar backup manualmente
php artisan database:auto-backup

# Ver resultado
ls -lh storage/app/backups/
```

### 4. Verificar Logs

```bash
cd /var/www/gestorstream/backend

# Ver logs do scheduler
tail -50 storage/logs/laravel.log | grep AutoDatabaseBackup

# Ou monitorar em tempo real (deixar rodando)
tail -f storage/logs/laravel.log | grep AutoDatabaseBackup
```

**O que você deve ver nos logs:**

Às 02:00, deve aparecer:
```
[2026-01-12 02:00:XX] local.INFO: AutoDatabaseBackup: Executando backup automático agendado {"frequency":"daily","scheduled_time":"02:00","current_time":"02:00:15","timezone":"America/Sao_Paulo"...}
[2026-01-12 02:00:XX] local.INFO: AutoDatabaseBackup: Comando iniciado {"time":"2026-01-12 02:00:15","timezone":"America/Sao_Paulo"}
[2026-01-12 02:00:XX] local.INFO: AutoDatabaseBackup: Criando backup {"upload_to_storage":true,"retention_days":30...}
[2026-01-12 02:00:XX] local.INFO: AutoDatabaseBackup: Backup created successfully {"file":"backup-2026-01-12-020015.sql.gz"...}
```

### 5. Verificar Scheduler Está Rodando

```bash
# Ver se o scheduler está executando (a cada minuto)
grep "schedule:run" /var/log/syslog | tail -20

# Ou
grep CRON /var/log/syslog | grep schedule:run | tail -20
```

### 6. Forçar Execução Imediata (para teste)

Para testar se o sistema funciona, você pode temporariamente mudar o horário:

1. No painel do sistema, vá em **Configurações > Backup**
2. Mude o horário para **daqui 2 minutos** (ex: se são 14:35, configure para 14:37)
3. Aguarde 2 minutos
4. Verifique os logs:

```bash
tail -f storage/logs/laravel.log | grep AutoDatabaseBackup
```

5. **IMPORTANTE:** Depois do teste, volte o horário para 02:00

---

## 🔍 Diagnóstico de Problemas

### Problema: Backup não roda no horário configurado

**Verificar:**

1. **Cron está configurado?**
   ```bash
   crontab -l | grep schedule:run
   ```
   
2. **Backup está habilitado?**
   ```bash
   php artisan tinker
   >>> \App\Models\SystemSetting::get('auto_backup_enabled')
   ```

3. **Scheduler está rodando?**
   ```bash
   tail -f storage/logs/laravel.log
   # Aguardar 1 minuto e ver se há atividade
   ```

4. **Timezone está correto?**
   ```bash
   # No servidor
   date
   
   # No Laravel
   php artisan tinker
   >>> now(system_timezone())
   ```

### Problema: Backup roda mas falha no upload para MinIO

**Verificar:**

1. **Integração MinIO está ativa?**
   - Painel: Configurações > Integrações de Storage
   - Verificar se está marcada como "Ativa"

2. **Credenciais estão corretas?**
   ```bash
   php artisan tinker
   >>> $storage = \App\Models\StorageIntegration::getActive()
   >>> $storage->testConnection()
   ```

3. **Ver logs de erro:**
   ```bash
   tail -50 storage/logs/laravel.log | grep -A 5 "storage_error"
   ```

### Problema: Backups antigos não estão sendo limpos

O comando `database:clean-old-backups` roda automaticamente:
- Diariamente às 03:00
- Depois de criar um novo backup (se retenção configurada)

**Verificar:**

```bash
# Ver logs de limpeza
tail -50 storage/logs/laravel.log | grep CleanOldBackups

# Executar limpeza manualmente
php artisan database:clean-old-backups
```

---

## 📋 Checklist de Implementação

Execute no servidor de produção:

```bash
cd /var/www/gestorstream

# 1. Pull das correções
git pull origin main

# 2. Limpar cache do Laravel (importante!)
cd backend
php artisan config:clear
php artisan cache:clear

# 3. Verificar crontab
crontab -l | grep schedule:run
# Se não existir, adicionar:
# crontab -e
# * * * * * cd /var/www/gestorstream/backend && /usr/bin/php artisan schedule:run >> /var/www/gestorstream/backend/storage/logs/scheduler.log 2>&1

# 4. Testar backup manual
php artisan database:auto-backup

# 5. Verificar se funcionou
ls -lh storage/app/backups/

# 6. Ver logs
tail -20 storage/logs/laravel.log | grep AutoDatabaseBackup
```

---

## 🎯 Teste de Validação

Para confirmar que está funcionando:

1. Configure o horário para daqui 3 minutos
2. Aguarde e monitore os logs:
   ```bash
   tail -f storage/logs/laravel.log | grep -E "AutoDatabaseBackup|schedule"
   ```
3. Verifique se o backup foi criado:
   ```bash
   ls -lth storage/app/backups/ | head -5
   ```
4. Se configurado upload para MinIO, verifique no console MinIO
5. Restaure o horário para 02:00

---

## 🚨 Se Ainda Não Funcionar

### 1. Verificar permissões

```bash
# Permissões do storage
ls -la storage/app/backups/
sudo chown -R www-data:www-data storage/
sudo chmod -R 775 storage/

# Permissões do crontab
# Deve estar configurado para o usuário correto (root ou www-data)
```

### 2. Verificar se o Redis está rodando

```bash
# O scheduler usa Redis para locks
redis-cli ping
# Deve retornar: PONG
```

### 3. Verificar se há erros PHP

```bash
# Ver erros do PHP
tail -50 /var/log/php8.2-fpm.log
```

### 4. Executar scheduler manualmente

```bash
# Executar o scheduler manualmente para ver erros
cd /var/www/gestorstream/backend
php artisan schedule:run -v
```

### 5. Habilitar logs detalhados temporariamente

No arquivo `.env`:
```env
APP_DEBUG=true
LOG_LEVEL=debug
```

**IMPORTANTE:** Voltar para `APP_DEBUG=false` depois do diagnóstico!

---

## ✅ Resultado Esperado

Após as correções:

1. ✅ Cron configurado no servidor
2. ✅ Scheduler rodando a cada minuto
3. ✅ Backup executando no horário configurado
4. ✅ Upload para MinIO funcionando (se configurado)
5. ✅ Cópia local mantida (se configurado)
6. ✅ Backups antigos sendo limpos conforme retenção
7. ✅ Logs detalhados para diagnóstico

**Tempo estimado:** 5-10 minutos para aplicar e validar  
**Resultado:** Sistema de backup automático funcionando 100%
