# Instalação na Napoleon cPanel

Esta distribuição usa o **Setup Node.js App** do cPanel. Painel, API, webhook, MySQL e WiFi Agent executam no mesmo aplicativo Node.js da Napoleon.

O Agent embutido precisa alcançar diretamente a API SSL do MikroTik pela internet. Antes da instalação, confirme com a Napoleon que a conta permite processo Node.js contínuo e saída TCP na porta 8729. Confirme também o IP fixo de saída do servidor para restringi-lo no firewall do RouterOS. Se o MikroTik estiver atrás de CGNAT, esta topologia não funciona sem uma VPN externa.

## Requisito obrigatório

Selecione Node.js 22, 20 ou 18. O SDK de pagamentos exige Node.js 18 ou superior. Se o seletor da conta terminar no Node 16, abra um ticket com a Napoleon pedindo Node 18+ ou use uma VPS; não há configuração segura deste projeto para Node 16.

## 1. Criar o banco

No cPanel, abra **MySQL Databases**:

1. crie um banco, por exemplo `conta_wifi`;
2. crie um usuário MySQL com senha forte;
3. associe o usuário ao banco com **ALL PRIVILEGES**;
4. anote o nome completo que o cPanel mostrar, incluindo o prefixo da conta.

Selecione o banco criado no phpMyAdmin e importe `cpanel-database.sql`. O arquivo cria todas as tabelas, configurações, perfis e o superadministrador solicitado. Ele não contém a senha em texto aberto.

## 2. Enviar a aplicação

1. Envie `wifi-mikrotik-cpanel.zip` pelo File Manager.
2. Entre na pasta configurada como **Application root** e extraia o ZIP nela. O ZIP coloca `package.json` e `app.js` diretamente nessa pasta, sem criar outra subpasta.
3. Copie `.env.production.example` para `.env.production`. O ZIP já contém esse modelo com o nome correto.
4. Preencha todos os valores `TROCAR_*`. Em `DATABASE_URL`, use o banco e usuário completos do cPanel.
5. Mantenha `RUN_EMBEDDED_AGENT=false` durante o primeiro acesso.
6. Proteja `.env.production` com permissão somente para o usuário da conta (`600`, quando o painel permitir).

## 3. Criar o Node.js App

Em **Setup Node.js App**, use:

- Node.js version: 22, 20 ou 18;
- Application mode: `Production`;
- Application root: a pasta onde o ZIP foi extraído;
- Application URL: `https://wifi.ideartcloud.com.br`;
- Application startup file: `app.js`.

Adicione as variáveis `NODE_ENV=production`, `APP_ENV=production` e `DEPLOYMENT_TARGET=cpanel` na tela do aplicativo. O Passenger fornece a variável `PORT`; não crie uma porta pública manualmente.

Entre no ambiente virtual indicado pelo próprio cPanel. Antes de instalar, confirme que o terminal está exatamente na raiz da aplicação (ajuste o caminho para o mostrado no seu cPanel):

```bash
cd /home/idea1240/wifi.ideartcloud.com.br/ideart-wifi
pwd
ls -la package.json app.js .env.production
```

Os três arquivos precisam aparecer. Se `package.json` estiver dentro de uma subpasta, o ZIP foi extraído no lugar errado: extraia o pacote novamente diretamente na **Application root** ou altere a raiz do aplicativo para a pasta que realmente contém `package.json`.

Execute o instalador incluído no pacote. Ele localiza automaticamente o Node/NPM do CloudLinux, inclusive quando `npm` não está inicialmente no `PATH` do terminal:

```bash
bash cpanel-install.sh
```

Se `.env.production` ainda não existir, o instalador criará uma cópia do modelo e pedirá que você preencha os valores `TROCAR_*`. Depois de salvar o arquivo, execute `bash cpanel-install.sh` novamente.

Como alternativa, quando o ambiente virtual já estiver ativado, execute cada comando separadamente:

```bash
npm install --omit=dev
npm run production:check -- .env.production
npm run cpanel:migrate
```

O `.env.production` real deve ficar na raiz privada da aplicação e nunca dentro de `public_html`. Ele não acompanha o ZIP para evitar vazamento de senha do banco e tokens de pagamento.

Volte ao **Setup Node.js App** e clique em **Restart**. Abra `/api/health`; a resposta deve informar `status: ok`, ambiente `production` e banco `mysql`.

## 4. Preparar o acesso remoto ao MikroTik

Use somente a API SSL do RouterOS (`api-ssl`, porta 8729), com certificado válido. Desative a API sem TLS na interface WAN e aceite a porta 8729 exclusivamente quando a origem for o IP fixo de saída informado pela Napoleon. Se existir um modem antes do MikroTik, encaminhe somente essa porta para o roteador.

Não publique a porta 8728 e não crie uma regra aberta para `0.0.0.0/0`. Um IP dinâmico pode usar MikroTik Cloud DDNS, mas o link ainda precisa possuir IPv4 público sem CGNAT.

## 5. Configuração inicial

1. Abra o domínio e entre com o superadministrador criado pelo SQL.
2. Cadastre o MikroTik usando `connection_mode=local`, DDNS/IP público, porta `8729`, TLS habilitado e credenciais RouterOS.
3. Use **Testar conexão**. Prossiga somente se o cPanel confirmar a API SSL e o HotSpot.
4. Cadastre os planos e preços.
5. Clique em **Provisionar Agent** e salve o ID e token exibidos.

## 6. Ativar o Agent dentro do cPanel

Edite `.env.production` na aplicação do cPanel:

```dotenv
RUN_EMBEDDED_AGENT=true
AGENT_ID=ID_COPIADO_DO_PAINEL
AGENT_TOKEN=TOKEN_COPIADO_DO_PAINEL
AGENT_SERVER_URL=https://wifi.ideartcloud.com.br
AGENT_SERVER_WS=
MIKROTIK_HOST=DDNS_OU_IP_PUBLICO
MIKROTIK_PORT=8729
MIKROTIK_TLS=true
MIKROTIK_TLS_REJECT_UNAUTHORIZED=true
```

Execute novamente `npm run production:check -- .env.production` e reinicie o Node.js App. O sistema usa um bloqueio no MySQL para garantir que apenas uma instância do Agent embutido processe comandos, mesmo se o Passenger iniciar mais de um processo.

Se WebSocket não estiver disponível, deixe `AGENT_SERVER_WS=` vazio; o polling HTTPS continuará processando comandos a cada cinco segundos e ajudará a manter o aplicativo ativo. Depois que o Agent aparecer online, abra **Diagnóstico** e use **Testar MikroTik** e **Sincronizar agora**.

## 7. Mercado Pago e HotSpot

Configure no Mercado Pago:

`https://wifi.ideartcloud.com.br/api/webhooks/mercado-pago`

Instale `ideart-hotspot-production.zip` no MikroTik e permita `wifi.ideartcloud.com.br` no Walled Garden. Faça um PIX real de baixo valor antes da liberação pública.

## Atualizações

Faça backup do MySQL e de `.env.production`. Envie o novo ZIP mantendo o arquivo de ambiente, execute novamente `npm install --omit=dev` e `npm run cpanel:migrate`, e reinicie o Node.js App.
