# Deploy no cPanel (hospedagem compartilhada, sem root/Docker)

1. **PHP**: no cPanel (MultiPHP Manager) escolha PHP ≥ 8.3 e ative `pdo_pgsql`, `pgsql`, `mbstring`, `intl`, `gd`, `zip`, `bcmath`, `fileinfo`.
2. **Banco**: crie o banco PostgreSQL e o usuário em *PostgreSQL Databases*.
3. **Código**: envie o projeto para `~/matchedin` (fora do `public_html`). Assets já compilados: rode `npm run build` localmente e envie `public/build`. No servidor: `composer install --no-dev --optimize-autoloader`.
4. **Document root**: aponte o domínio para `~/matchedin/public` (ou, se não for possível, faça `public_html` um symlink para `~/matchedin/public`).
5. **.env**: copie `.env.production.example` para `.env`, preencha credenciais e rode `php artisan key:generate`.
6. **Migrations**: `php artisan migrate --force && php artisan storage:link` (se symlink for bloqueado, copie `storage/app/public` para `public/storage`).
7. **Cron** (único necessário, a cada minuto):
   `* * * * * /usr/local/bin/php ~/matchedin/artisan schedule:run >> /dev/null 2>&1`
   O scheduler já processa a fila (`queue:work --stop-when-empty`).
8. **Realtime**: crie um app no Pusher (ou Ably em modo Pusher) e preencha `PUSHER_*`.
9. **Cache**: `php artisan config:cache route:cache view:cache` após cada deploy.

## Rotinas agendadas (todas via o único cron do passo 7)
`schedule:run` dispara sozinho: fila (a cada minuto), lembretes de entrevista (5 min), expiração de vagas e candidaturas (diário),
rotinas da rede (diário), suspensões vencidas e exclusão de contas após 30 dias (diário) e o resumo semanal "Quem viu seu perfil" (segundas, 9h).

## Realtime e e-mail em hospedagem compartilhada
- Chat e notificações são enviados na hora (`ShouldBroadcastNow`) para o Pusher; não dependem do worker da fila.
- E-mails (alertas de vaga e resumo semanal) vão para a fila `database` e saem em até 1 minuto, pelo cron.
- Push é um stub (`App\Contracts\PushSender`): troque pelo provedor real (FCM/OneSignal/Web Push) quando houver.

## Moderação
Dê acesso ao painel `/moderacao` a uma conta: `php artisan moderation:grant email@dominio.com`.

## Cobrança (Premium e vagas patrocinadas)
- `billing:process` roda diariamente pelo scheduler: renova assinaturas, tenta de novo as recusadas (3 tentativas, carência de 3 dias) e, ao expirar, pausa as vagas excedentes.
- O gateway é um contrato (`App\Contracts\PaymentGateway`) com driver `fake` por padrão (`PAYMENT_DRIVER=fake`): **nenhuma cobrança real acontece** até um gateway ser implementado e escolhido.
- Preços em `config/billing.php` são **placeholders** (o documento deixa o preço em aberto): defina `PREMIUM_MONTHLY_CENTS`, `PREMIUM_ANNUAL_CENTS`, `SPONSOR_3D_CENTS`, `SPONSOR_7D_CENTS` e `BILLING_CURRENCY` no `.env`.
