Instalação da API de login, registro e keys na sua VPS
Passo a passo para aaPanel com Apache, MariaDB 10.11, Node.js e PM2. No fim, o aplicativo só funciona com e-mail e senha cadastrados, contas novas exigem token real e tudo fica registrado no banco.
Apague a instalação antiga
Remove os projetos Node e o site que estavam brigando pelo domínio.
- Website → Node project: pare e apague os projetos "api" e "apiapp" (marque para apagar os arquivos também).
- Website → PHP project: se existir um site api.dmhost.shop, apague também.
- Files: apague a pasta /www/wwwroot/apiapp se ainda existir.
Confira no Terminal que não sobrou nada rodando nas portas antigas (não pode aparecer nenhuma linha):
ss -ltnp | grep -E ":3100|:3210"Se ainda aparecer uma linha com node, pare ela com: kill NUMERO_DO_PID (o número depois de pid=).
Confira o Node.js
Precisa ser v18 ou mais novo (você já tem o v20).
node -vSe não aparecer v20.x: App Store → Node.js version manager → instale o v20 e clique em "Set as command line version".
Envie os arquivos da API
Em /www/wwwroot/ravokbot-api, pasta padrão de projetos do aaPanel.
- Files → vá em /www/wwwroot → New → Folder → nome: ravokbot-api.
- Entre na pasta e envie TODO o conteúdo da pasta server do projeto (não a pasta server em si).
A pasta tem que ficar exatamente assim:
src/
scripts/
.env.example
package.json
schema.sqlnpm install e .env
Instala as dependências e configura o banco.
cd /www/wwwroot/ravokbot-api
npm install --omit=dev
cp .env.example .env
npm run secretAbra /www/wwwroot/ravokbot-api/.env e preencha (APP_SECRET = o código que o npm run secret mostrou, sem espaço depois do =):
DB_USER=apiapp
DB_PASS=SENHA_DO_BANCO
DB_NAME=apiapp
APP_SECRET=CODIGO_GERADOCrie as tabelas (só uma vez):
npm run migrateCrie o processo no PM2
Não precisa de build: é JavaScript puro.
cd /www/wwwroot/ravokbot-api
pm2 start src/index.js --name ravokbot-api
pm2 saveTeste:
curl http://127.0.0.1:3210/health
→ {"ok":true,"service":"ravokbot-api"}Se não responder: pm2 logs ravokbot-api --lines 30 mostra o erro.
Ligue o domínio pelo Apache
Site comum com HTTPS fazendo proxy para a porta 3210.
- Website → PHP project → Add site → Domain: api.dmhost.shop | PHP: Static | Database: não criar.
- Abra o site → SSL → Let’s Encrypt → aplique e ative "Force HTTPS".
- Abra o site → Reverse proxy → Add → Name: api | Target URL: http://127.0.0.1:3210 | Sent domain: $host → Save.
Teste no navegador:
https://api.dmhost.shop/health
→ {"ok":true,"service":"ravokbot-api"}Qualquer outro endereço responde 404 de propósito: só o aplicativo (com o APP_SECRET) consegue usar a API.
Não abra a porta 3210 no Security do aaPanel. O acesso de fora é só pelo https://api.dmhost.shop.
Gere keys e defina o suporte
Tudo pelo Terminal até você fazer o seu painel.
cd /www/wwwroot/ravokbot-api
npm run key -- teste 5 --dias 2 # 5 keys de teste de 2 dias
npm run key -- diaria 10
npm run key -- semanal 10
npm run key -- mensal 10
npm run key -- trimensal 5
npm run key -- vitalicio 1 --nota "Cliente João"No aplicativo a key de teste aparece como "Teste", com os dias que você definiu. Renovar antes de vencer soma o tempo ao que resta.
npm run setting -- support_url https://wa.me/5511999999999Pode trocar quando quiser (também no phpMyAdmin, tabela settings). O botão Suporte do bot sempre busca o valor atual.
Conecte o aplicativo à API
O segredo fica dentro do app compilado, nunca na tela.
Pegue o APP_SECRET que está no /www/wwwroot/ravokbot-api/.env. Na pasta desktop do projeto, copie app-config.example.json para app-config.json e preencha:
{
"apiUrl": "https://api.dmhost.shop",
"appSecret": "O_MESMO_APP_SECRET_DO_.env"
}cd desktop
npm install
npm run distO instalador detecta restos de uma instalação antiga e pergunta se deve apagar tudo. Na desinstalação existe a caixinha "Apagar todos os dados e rastros do RavokBot".
Comandos do dia a dia
Sempre dentro de /www/wwwroot/ravokbot-api.
pm2 status # está rodando?
pm2 logs ravokbot-api --lines 30 # ver erros
pm2 restart ravokbot-api --update-env # depois de mudar o .env ou enviar arquivos novosSegurança incluída
- API roda no PM2 e escuta só em 127.0.0.1 — invisível para a internet sem o Apache.
- Toda requisição é assinada com HMAC + horário + nonce: sem o segredo do app, a API responde 404 como se não existisse.
- Senhas com bcrypt; sessões guardadas apenas como hash SHA-256.
- Rate limit: login 5 tentativas / 15 min por IP e por e-mail; registro e resgate de key 5 / hora.
- Bloqueio contra replay (nonce único) e consultas SQL parametrizadas.
- 1 PC logado por conta (MAX_SESSIONS) — logar em outro derruba o anterior.
- Sessão salva criptografada no Windows (safeStorage).
- Logs de tudo em activity_logs, com usuário, IP e dispositivo.
Tabelas no banco
- users
- Contas: e-mail, senha (hash), telefone, plano, expiração, status (ativo/bloqueado).
- license_keys
- Keys geradas: código, tipo, dias, quem usou e quando.
- sessions
- Logins ativos por PC. Para derrubar alguém: revoked = 1.
- activity_logs
- Tudo que acontece no app, por usuário, com IP e dispositivo.
- settings
- Configurações editáveis, como support_url.