overxyz
OverXYZ é uma plataforma open source desenvolvida em Next.js para estudar autenticação, assinaturas, pagamentos via PIX, controle de acesso por planos, integração com Discord e painel administrativo. O projeto inclui boas práticas de segurança, privacidade e documentação para aprendizado e contribuição da comunidade.
OverXYZ
Projeto educacional em Next.js que demonstra uma landing page, catálogo por planos,
autenticação local e via Discord, checkout PIX e um painel administrativo.
Este repositório é uma base de estudo. O armazenamento em JSON, o rate limit em
memória e a confirmação manual de pagamentos não são adequados para produção
distribuída sem as adaptações descritas abaixo.
Requisitos
- Node.js 20 ou superior
- npm 10 ou superior
Rodando localmente
npm ci
cp .env.example .env.local
npm run dev
No PowerShell, use Copy-Item .env.example .env.local no lugar de cp.
Em desenvolvimento, SESSION_PASSWORD pode ficar vazia e será gerada uma chave
temporária a cada processo. Em produção, ela é obrigatória e precisa ter pelo
menos 32 caracteres:
openssl rand -base64 48
Validação completa:
npm run check
Variáveis de ambiente
Copie .env.example e preencha somente as integrações que usar.
| Variável | Necessidade | Finalidade |
|---|---|---|
SESSION_PASSWORD |
produção | Criptografia e autenticação da sessão. |
TRUST_PROXY |
opcional | Use true somente se o proxy sobrescrever os headers de IP. |
LEGAL_ENTITY_NAME |
produção pública | Nome do responsável pela implantação. |
LEGAL_CONTACT_EMAIL |
produção pública | Contato dos Termos de Uso. |
PRIVACY_CONTACT_EMAIL |
produção pública | Canal para solicitações de privacidade. |
ADMIN_EMAILS |
painel admin | E-mails autorizados, separados por vírgula. |
DISCORD_INVITE_URL |
opcional | Convite público da comunidade. |
DISCORD_WIDGET_SERVER_ID |
opcional | ID público usado pelo widget. |
DISCORD_CLIENT_ID |
Discord OAuth | Identificador público do aplicativo. |
DISCORD_CLIENT_SECRET |
Discord OAuth | Credencial secreta do aplicativo. |
DISCORD_WEBHOOK_URL |
opcional | Webhook secreto de notificações. |
MISTICPAY_CLIENT_ID |
checkout PIX | Credencial da API. |
MISTICPAY_CLIENT_SECRET |
checkout PIX | Credencial secreta da API. |
MISTICPAY_WEBHOOK_URL |
opcional | URL pública de callback do projeto. |
Nunca use valores reais em .env.example, documentação, screenshots ou HTMLs
promocionais. Todos os arquivos .env*, exceto o exemplo, são ignorados pelo Git.
Dados e privacidade
O estado local é criado em data/ e pode conter e-mails, hashes de senha, IDs do
Discord, transações e executáveis enviados pelo administrador. O conteúdo da pasta
é ignorado pelo Git; somente data/.gitkeep deve ser versionado.
O checkout envia nome e CPF diretamente à MisticPay, mas não os persiste no JSON
local. As notificações de compra enviam apenas o handle ao Discord.
Antes de publicar uma instância real, revise os Termos e a Política de Privacidade
com aconselhamento jurídico e configure os três campos legais do ambiente.
Limitações importantes
- O banco JSON não oferece transações nem segurança para múltiplos processos.
- O rate limit em memória não funciona de forma global em múltiplas instâncias.
- Sem um proxy confiável, o rate limit usa um bucket compartilhado e ignora headers
de IP enviados pelo cliente. ConfigureTRUST_PROXY=truesomente atrás de um proxy
que sobrescrevaX-Forwarded-ForeX-Real-IP. - Uploads e dados exigem disco persistente; plataformas serverless precisam de banco
e object storage externos. - O pagamento é confirmado manualmente no admin. Não libere acesso baseado apenas
no corpo de um webhook: valide assinatura, valor, moeda, status e idempotência. - Não existe fluxo automático de recuperação de senha ou exclusão de conta.
- Executáveis enviados pelo administrador devem ser assinados e verificados contra
malware antes de serem oferecidos para download.
Publicação segura
- Gere credenciais novas para a implantação; nunca reutilize segredos de dev.
- Confirme que
git status --ignoredmostra.env.localedata/como ignorados. - Rode
npm auditenpm run check. - Revise imagens, vídeos e documentos para metadados ou dados pessoais.
- Se um segredo já entrou em algum commit, rotacione-o primeiro e depois remova-o
de todo o histórico com uma ferramenta comogit filter-repo.
Consulte SECURITY.md para reportar vulnerabilidades e
CONTRIBUTING.md antes de contribuir.
Licença
Código e assets incluídos neste repositório são distribuídos sob a licença MIT.
Veja LICENSE.
