Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
28 changes: 26 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -17,11 +17,29 @@ O formulário consulta o time na FACEIT, preenche o nome oficial e salva um snap
- Sincronização manual do elenco FACEIT pelo painel administrativo.
- Gerenciamento de campeonatos FACEIT com vínculos, snapshots e sincronização automática independente por edição.
- Histórico da última sincronização automática e da última falha no painel administrativo.
- Classificação suíça baseada somente em partidas finalizadas na FACEIT; partidas canceladas não alteram campanhas ou resultados.
- Publicação automática do snapshot em páginas integradas, atualmente na Copa ACE 10.
- Publicação automática das equipes aprovadas na página da Copa ACE 10.
- Carregamento público otimizado com imagens responsivas, CSS por rota, React Compiler, renderização adiada e cache com revalidação.
- Autenticação administrativa com bcrypt e JWT em cookie `httpOnly`.
- Rate limit persistente por e-mail e, atrás do proxy confiável, também por IP.
- Validação de campos, arquivos, assinaturas binárias e caminhos de armazenamento.

## Segurança e integridade

- A API de inscrição permanece fechada por padrão e só aceita envios quando `REGISTRATIONS_OPEN=true`.
- Inscrições ativas reservam separadamente o ID FACEIT e o nome normalizado da equipe; uma rejeição libera as duas reservas para um novo envio corrigido.
- Campos públicos possuem limites no servidor. Imagens são decodificadas, limitadas a 25 milhões de pixels e reprocessadas sem metadados ou conteúdo excedente antes do armazenamento; imagens animadas são rejeitadas.
- Alterações administrativas exigem origem válida, usam sessão `__Host-` em produção e respostas privadas não podem ser armazenadas em cache.
- Login administrativo possui limites persistentes por origem, combinação de e-mail/origem e conta. Inscrições são limitadas por e-mail e, quando o proxy é confiável, também por IP.
- A Política de Segurança de Conteúdo opera em modo de relatório. O coletor aceita somente relatórios CSP limitados, higienizados e enviados pela mesma origem.

## Funcionalidades em avaliação

Estas propostas estão em pull requests e ainda não fazem parte da versão atual:

- [#19 — sincronização acionada por webhook da FACEIT](https://github.com/cespedesdan/ace-prod/pull/19): rascunho que mantém a reconciliação agendada como segurança; aguarda validação com um evento real da FACEIT e correção da auditoria Lighthouse.
- [#11 — confirmação do líder do time pela FACEIT](https://github.com/cespedesdan/ace-prod/pull/11): fluxo OAuth que ainda precisa ser atualizado contra a `main`, ter os conflitos resolvidos e ser integrado à interface antes da reabertura das inscrições.

Não configure webhooks ou credenciais OAuth em produção antes de essas propostas serem aprovadas e integradas.

## Rotas

Expand All @@ -38,6 +56,7 @@ O formulário consulta o time na FACEIT, preenche o nome oficial e salva um snap
| `/admin/inscricoes` | Aprovação e rejeição de inscrições |
| `/admin/faceit` | Vínculo, sincronização e desvinculação de campeonatos FACEIT |
| `/admin/noticias` | Criação, edição e exclusão de notícias |
| `/api/security/csp-report` | Coletor interno de relatórios da política de segurança |

## Desenvolvimento local

Expand All @@ -59,6 +78,8 @@ Em desenvolvimento, `TRUST_PROXY` deve permanecer `false`.

Defina `FACEIT_API_KEY` no `.env.local` para habilitar a consulta de times. A chave é usada somente pelo servidor: não use prefixo `NEXT_PUBLIC_` e nunca a envie ao Git.

Mantenha `REGISTRATIONS_OPEN=false` fora da janela de inscrições. Alterar somente a interface não abre nem fecha a API; reinicie o servidor depois de mudar esse valor.

## Primeiro administrador

Defina `ADMIN_EMAIL` no `.env.local`. Para criar o administrador ou redefinir sua senha no PowerShell:
Expand All @@ -83,7 +104,10 @@ O banco e os uploads são privados e estão ignorados pelo Git. Os dois precisam
| --- | --- |
| `npm run dev` | Desenvolvimento em `0.0.0.0:8001` |
| `npm run build` | Build otimizado de produção |
| `npm run analyze` | Gera o build com análise dos pacotes |
| `npm run start` | Produção interna em `127.0.0.1:8001` |
| `npm run perf:seed` | Prepara dados determinísticos quando `PERFORMANCE_FIXTURES=true` |
| `npm run perf:audit` | Mede as rotas públicas com Lighthouse |
| `npm run db:generate` | Gera o Prisma Client |
| `npm run db:migrate` | Aplica migrations pendentes |
| `npm run db:migrate:status` | Verifica o estado das migrations |
Expand Down