# Guia de configuração — host4 (produção)

Passo a passo para colocar o Painel P2P no ar em um servidor dedicado com
WHM/cPanel, Node 24 (NVM no usuário `mzdigital`), MySQL 8, Redis e PM2.

Cenário deste guia: código via **chave SSH**, rodando **direto no host4**,
acesso por **subdomínio com SSL** (proxy reverso do Apache).

> ⚠️ **Guarde o `MASTER_KEY` em local seguro (fora do servidor também).** Ele
> descriptografa TODOS os segredos (chaves de API, senha de proxy, token do
> Telegram, CPF/PIX dos clientes). Se você perder o `MASTER_KEY`, esses dados
> ficam **irrecuperáveis**.

---

## 1. Acesso ao GitHub via chave SSH

No servidor, logado como `mzdigital` (o app roda nesse usuário, que tem o NVM):

```sh
# 1.1 Gerar a chave (Enter nas perguntas; -N "" = sem passphrase)
ssh-keygen -t ed25519 -C "host4-painel-p2p" -f ~/.ssh/id_ed25519 -N ""

# 1.2 Mostrar a chave pública para copiar
cat ~/.ssh/id_ed25519.pub
```

No GitHub, adicione essa chave pública. Recomendado: como **Deploy Key**
(escopo só deste repo, somente leitura):
`github.com/wsserve-creator/painel-p2p` → **Settings** → **Deploy keys** →
**Add deploy key** → cole a chave → **NÃO** marque "Allow write access".
(Alternativa: adicionar em **Settings → SSH and GPG keys** da sua conta.)

```sh
# 1.3 Testar
ssh -T git@github.com        # deve cumprimentar com seu usuário

# 1.4 Clonar PARA DENTRO do docroot do subdomínio
cd /home/mzdigital/mzz.mezzor.com.br
ls -la                        # veja se há arquivos default do cPanel
# Método robusto (funciona mesmo se a pasta já existir com arquivos default):
git init -b main
git remote add origin git@github.com:wsserve-creator/painel-p2p.git
git fetch origin
git checkout -f claude/bold-newton-w910A   # após o PR #1 mergear, use: main
```

> Os arquivos default do cPanel (ex.: `index.html`, `cgi-bin/`) podem ficar —
> com o proxy reverso ativo o Apache não os serve. Se quiser, remova-os.

---

## 2. Pré-requisitos no servidor

```sh
# Node 24 (CLAUDE.md: via NVM no mzdigital)
node -v                       # precisa ser v24.x
# se não for:  nvm install 24 && nvm use 24 && nvm alias default 24

# PM2 (gerenciador de processos)
npm install -g pm2

# Redis precisa responder
redis-cli ping                # => PONG

# MySQL: confirme que é MySQL 8.0+ (o schema usa JSON/VARBINARY/utf8mb4)
mysql --version               # MariaDB serve só se for 10.5+; prefira MySQL 8
```

---

## 3. Banco de dados

Como `root` (você tem root no servidor). Se preferir criar pelo cPanel, lembre
que ele **prefixa** o nome do banco/usuário — neste guia criamos direto:

```sh
mysql -u root -p
```
```sql
CREATE DATABASE p2p_painel CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
CREATE USER 'p2p_user'@'localhost' IDENTIFIED BY 'TROQUE_POR_SENHA_FORTE';
GRANT ALL PRIVILEGES ON p2p_painel.* TO 'p2p_user'@'localhost';
FLUSH PRIVILEGES;
EXIT;
```

---

## 4. Arquivo `.env`

```sh
cd /home/mzdigital/mzz.mezzor.com.br
cp .env.example .env

# Gerar os segredos:
node -e "console.log('MASTER_KEY='+require('crypto').randomBytes(32).toString('hex'))"
node -e "console.log('JWT_SECRET='+require('crypto').randomBytes(48).toString('hex'))"

nano .env
```

Preencha (exemplo de produção atrás de proxy):

```ini
MASTER_KEY=<cole o gerado>           # GUARDE UM BACKUP DISTO
DB_HOST=127.0.0.1
DB_PORT=3306
DB_USER=p2p_user
DB_PASSWORD=<a senha do passo 3>
DB_NAME=p2p_painel
REDIS_URL=redis://127.0.0.1:6379
PORT=3000
HOST=127.0.0.1                       # atrás do proxy: não expõe a porta
NODE_ENV=production
JWT_SECRET=<cole o gerado>
PRICING_APPLY=false                  # DRY-RUN: não mexe em preço até você ligar
```

---

## 5. Build, schema e usuário admin

```sh
npm ci                 # dependências do backend (exatas, do lockfile)
npm run build:all      # compila backend (dist/) e frontend (web/dist/)
npm run migrate        # cria as tabelas (1ª vez) + templates padrão

# Criar o primeiro admin:
npm run create-user -- "Seu Nome" voce@dominio.com "SuaSenhaForte" admin
```

(Opcional) sanidade da infra:
```sh
npm run smoke:infra    # valida config + cripto + ping MySQL/Redis
```

---

## 6. Subir com PM2

```sh
pm2 start ecosystem.config.cjs   # api + worker-pricing + worker-chat
pm2 save                         # salva a lista de processos
pm2 startup                      # imprime um comando 'sudo ...' — rode-o como root
pm2 logs                         # acompanhar; Ctrl+C sai do log
```

A API agora escuta em `127.0.0.1:3000` e já serve o painel web no mesmo host.

---

## 7. Subdomínio + SSL (proxy reverso no cPanel/WHM)

1. O subdomínio `mzz.mezzor.com.br` já existe, com docroot
   `/home/mzdigital/mzz.mezzor.com.br` (onde clonamos o código). O repo já traz
   um `.htaccess` que bloqueia o acesso direto a `.env`/`.git` (defesa em
   profundidade — com o proxy ativo o Apache nem serve esses arquivos).
2. **Proxy reverso** para a porta da API. Como cPanel reescreve os vhosts no
   rebuild, use o **Include Editor** (persiste):
   **WHM → Apache Configuration → Include Editor → SSL Virtual Host (do
   subdomínio `mzz.mezzor.com.br`)** e adicione:
   ```apache
   ProxyPreserveHost On
   ProxyPass        /.well-known !
   ProxyPass        / http://127.0.0.1:3000/
   ProxyPassReverse / http://127.0.0.1:3000/
   RequestHeader set X-Forwarded-Proto "https"
   ```
   (`/.well-known !` deixa o AutoSSL emitir o certificado direto do docroot.)
   Salve e reconstrua/reinicie o Apache (o WHM oferece o botão).
   > Se o servidor usa **Engintron (nginx na frente do Apache)**, faça o proxy
   > na config do nginx em vez do Apache.
   > Se o proxy retornar **503**, e o SELinux estiver `Enforcing`, libere a
   > conexão de saída do Apache: `setsebool -P httpd_can_network_connect 1`.
3. **SSL**: cPanel → **SSL/TLS Status** → rode o **AutoSSL** para o subdomínio
   (ou instale um Let's Encrypt). Garanta "Force HTTPS Redirect".
4. Acesse `https://mzz.mezzor.com.br` → tela de login do painel.

Como a própria API serve o frontend e o proxy mantém tudo no mesmo host, não há
CORS nem hospedagem estática separada para configurar.

---

## 8. Configurar contas e integrações (já dentro do painel)

Logado como admin:

1. **Contas** → *Nova conta*:
   - Binance: `apiKey`, `apiSecret`, `binance_user_id` (x-user-id) e o **proxy**
     da conta (protocolo/host/porta/usuário/senha).
   - 🔒 Na Binance, habilite **só C2C/trade** nos pares; **jamais saque**; e
     ponha o **IP do proxy** no whitelist da chave.
   - Clique **Testar** → deve voltar `ok` + total de anúncios. Depois
     **Sincronizar**.
   - Repita para a Bybit (a chave da Bybit usa as permissões de P2P advertiser).
2. **Configurações → Telegram**: crie um bot no **@BotFather**, pegue o token;
   adicione o bot ao seu grupo; descubra o `chat_id` do grupo; preencha
   `enabled`, `token`, `chatId` e use **Enviar teste**.
3. **Templates**: já vêm 2 padrão (validação e PIX) — ajuste os textos. Variáveis:
   `{nome} {valor} {ordem} {asset} {fiat} {amount}`.
4. **Anúncios → Pricing**: configure as travas por anúncio. Deixe
   `PRICING_APPLY=false` e use **Rodar agora (dry-run)** até conferir os ajustes
   em **Pricing**. Quando confiar, mude para `PRICING_APPLY=true` no `.env` e
   `pm2 restart p2p-worker-pricing`.

---

## 9. Atualizar o painel depois

```sh
cd /home/mzdigital/mzz.mezzor.com.br
git pull
npm ci
npm run build:all
npm run migrate              # idempotente
pm2 restart ecosystem.config.cjs
```

---

## 10. Comandos úteis

```sh
pm2 status                   # estado dos 3 processos
pm2 logs p2p-api             # logs da API
pm2 logs p2p-worker-pricing  # logs do pricing
pm2 restart p2p-api          # reiniciar um processo
npm run test:account -- <id> # chamada real read-only via proxy (debug de conta)
```
