Files
DeskcommCRM/docs/deploy-hostgator
Rafael MelgaçoandClaude Opus 5 0750e10010 fix(docs): a doc afirmava o mundo de ontem — 11 documentos medidos contra a fonte
Varredura de "afirmações de estado": toda frase que afirma como o mundo ESTÁ e
que portanto pode ter envelhecido. 393 afirmações medidas contra a fonte em 11
grupos de documento, cada uma com o comando que a responde. 166 confirmadas, 227
com problema, 4 vereditos VERDADEIRA derrubados por um passe adversarial.

E a primeira coisa que a varredura derrubou foi uma frase que EU escrevi hoje.

## O pior achado, e é meu

O runbook dizia "**Desde a 1.3.0**, o agente completa o pin sozinho — em até 5
minutos". Falso. O `completar_pin_ausente` entrou em `81b3bd5d` (2026-08-14),
POSTERIOR à v1.3.0 (2026-08-13), e a v1.3.0 continua sendo a tag mais recente:

    $ git show v1.3.0:hostgator-setup-kit/_common.sh | grep -c completar_pin_ausente
    0

Nenhuma instalação existente tem esse comportamento. E o `update.sh` faz
`git checkout "$TARGET_TAG"` — o kit que roda na VPS é o da TAG, não o da `main`.
Quem atendesse um cliente lendo aquela linha diria "espere cinco minutos que se
resolve", e nada aconteceria, para sempre.

O erro é exatamente o que esta sessão passou o dia caçando: **provei presença na
main e afirmei comportamento na versão publicada.** A mesma frase estava no
CHANGELOG, e pior — dentro da seção `## [1.3.0]`, não em `[Não lançado]`. As duas
corrigidas, e a entrada foi para onde pertence.

## O segundo: o aviso que declarava não-provado o que o documento prova

O topo do runbook dizia "ainda não coberto: app contra Supabase real, sessão de
WhatsApp pareada". O §P4 do MESMO arquivo, 340 linhas abaixo, documenta as duas
coisas na produção. Faltava uma palavra — "pelo ENSAIO" — e sem ela o primeiro
parágrafo que qualquer leitor vê mandava refazer trabalho já feito.

## Três documentos mandavam o leitor agir errado

- **`triagem/TRIAGEM.md`**: "Obrigatórios no merge: verify, build-and-size,
  invariants" — três de cinco, faltando `e2e` e `imagens-ok`. É o arquivo que
  DEFINE a triagem, e o CLAUDE.md registra que medir contra a régua errada é o
  modo de falha número um dela. Agora traz o comando, não a lista.
- **`docs/deploy-hostgator/README.md`**: mandava o comprador leigo instalar um
  autenticador e esperar um QR de MFA "no primeiro login". Com o MFA opcional, o
  `bootstrap-owner.ts` grava `mfa_required: false` e essa tela não aparece — o
  leigo concluiria que a instalação falhou. É o guia P0 de primeira impressão.
- **`ARCHITECTURE.md`**: "MFA TOTP forçado pra admin/super-admin", a regra antiga.
  O CLAUDE.md já tinha a nova; a porta de entrada linkada pelo README, não.

## A régua de RAM: duas parcelas medidas, uma herdada

"~150 MB por número de WhatsApp" aparece em SETE documentos que se citam entre si
e **nunca foi medido neste projeto** — vem da síntese do curso WAHA (2026-05). Fui
medir na produção: o contêiner `waha` inteiro em **304,5 MiB com uma sessão
pareada**, contra `mem_limit` de 1280. Um ponto não decompõe baseline e sessão.

A parcela agora está marcada como herdada, com o comando para quem quiser medir.
**O tier recomendado não muda** — a régua dos 4 GB é a soma da stack em operação,
não o WAHA isolado, e os materiais comerciais não foram tocados.

## Segurança: corrigi o fato, não rebaixei o risco

O `docs/threat-model.md` afirma que não há limite de tentativa em login, signup e
aceite de convite. `lib/auth/rate-limit.ts` existe desde 13/08 e cobre os quatro
pontos, com limites nomeados. **Não rebaixei o T1**: isso pede reauditoria com
teste contra instância viva, que o próprio `confidence` do documento diz nunca ter
havido. Corrigi os fatos e marquei a reauditoria como devida.

Uma sub-afirmação sobrevive à letra e morre no espírito, e ficou registrada: a
sonda do doc (`grep lockout|failed_attempts`) devolve ZERO ainda hoje — mas
`rate-limit.ts:158` conta falha de login POR CONTA. A sonda é cega para a defesa
que existe.

## O gate novo, e ele nasceu vermelho pelo motivo certo

`documentacao-aponta-para-o-que-existe.test.ts` vigia a classe inteira nos 36
documentos de AUTORIDADE: link relativo morto, path em crase que não existe, e
frase de pendência que sobreviveu à pendência.

Escopo deliberado: `docs/stories/`, `docs/handoffs/` e `docs/specs/` ficam de fora
— são planejamento, e incluí-los faria o gate nascer com 384 violações e ser
desligado na primeira semana. Nos 36 de autoridade havia UMA, e ela é honesta (o
runbook cita o script e declara que ele não existe): congelada com justificativa.

Ele nasceu vermelho e estava certo — pegou sozinho duas notas de pendência que a
varredura tinha achado e eu ainda não corrigira, em CONTRIBUTING.md e na doutrina.

Quatro sabotagens, cada uma derrubando exatamente 1 dos 4 — inclusive a do escopo
vazio, porque um gate que varre zero arquivo passa verde. Sabotei DEPOIS de deixar
o controle verde: na primeira tentativa o controle já falhava, e as sabotagens não
provavam nada. E `git add -N` antes, porque `git checkout` não restaura arquivo
que o git ainda não conhece — a sabotagem do escopo ficou aplicada e só apareceu
no run seguinte.

## O que NÃO entra aqui

227 achados; apliquei os de gravidade alta cuja consequência é alguém agir errado.
Os de gravidade média e baixa — sobretudo contagens que envelheceram em
`docs/current-state.md` e `docs/harness-audit.md` — ficam listados no relatório,
não corrigidos. Aplicar 227 correções de texto num commit seria trocar prosa velha
por prosa não verificada.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01RKm2XcTcfgi1vdMcDYSRWa
2026-08-14 16:23:47 -03:00
..

Como subir o seu DeskcommCRM na HostGator (passo a passo, sem enrolação)

Este guia leva você do zero — sem servidor, sem nada — até o seu CRM no ar, com WhatsApp conectado e IA respondendo. Não precisa saber programar. Se travar em algum passo, o assistente do Claude Code faz por você (veja o Caminho fácil).

⏱️ Tempo estimado: 20 a 40 minutos, a maior parte esperando o domínio "propagar". 💰 Custo: o software é grátis. Você paga só a hospedagem (VPS) e, se quiser, a IA por uso.


Visão geral (o que vamos montar)

Seu domínio  →  Servidor VPS (HostGator)  →  DeskcommCRM rodando
                        │
                        ├─ o CRM (site + painel)
                        ├─ o WhatsApp (conectado por QR)
                        └─ os robôs de IA
Banco de dados: Supabase (grátis)   ·   IA: Anthropic (paga por uso)

Antes de começar, você vai precisar de 3 contas

O quê Onde Custo
Servidor VPS HostGator (links abaixo) pago (mensal)
Banco de dados supabase.com grátis
IA console.anthropic.com pago por uso

Crie a conta do Supabase e da Anthropic agora (leva 2 min cada). O VPS a gente contrata no passo 1.


Passo 1 — Contrate o servidor (VPS) na HostGator

O DeskcommCRM roda num VPS com Docker. A opção mais fácil é um VPS que já vem com Docker instalado:

Plano recomendado: VPS NVMe 4 (2 vCPU / 4 GB / 100 GB NVMe) — é exatamente o mínimo que o runbook de produção declara. A stack sobe num NVMe 2, mas opera no limite. (Não precisa dos planos grandes — o CRM vem "pré-montado", o servidor não fica compilando nada).

Ao contratar, a HostGator te envia por e-mail o IP do servidor, um usuário (geralmente root) e uma senha. Guarde isso.

Não tem domínio ainda? Você pode registrar um junto com a HostGator na contratação.


Passo 2 — Entre no servidor

No seu computador, abra o Terminal (no Windows: "PowerShell"; no Mac: "Terminal") e digite, trocando pelo IP que a HostGator te mandou:

ssh root@SEU-IP-AQUI

Ele vai pedir a senha (ao digitar, não aparece nada na tela — é normal). Deu certo? Você está "dentro" do servidor.

Se aparecer "Docker não encontrado" mais pra frente, instale com: curl -fsSL https://get.docker.com | sh

Agora libere as portas do site (sem isso o cadeado de segurança/SSL não funciona).

⚠️ Antes de ativar o firewall, confira em que porta você está conectado por SSH. Se for a padrão (22), use o comando abaixo como está. Se a HostGator te deu uma porta diferente (ex.: 2222, 22022), troque o 22 pela sua porta — senão o firewall te tranca pra fora do servidor.

ufw allow 22,80,443/tcp && ufw --force enable

Se a HostGator tiver um firewall no painel dela, libere as portas 80 e 443 lá também. Este é o motivo nº 1 de o site não abrir depois de instalar.


Passo 3 — Crie o banco de dados (Supabase, grátis)

  1. Entre em supabase.com → New project.
  2. Escolha a região South America (São Paulo) e uma senha forte para o banco (guarde).
  3. Espere o projeto ficar pronto (~2 min).
  4. No menu Settings → API, copie e guarde 3 coisas:
    • Project URL (algo como https://xxxx.supabase.co)
    • anon public key
    • service_role key (secreta!)
  5. Em Settings → Database, na seção Connection string, clique em Session pooler (⚠️ NÃO use a "Direct connection") e copie a URL no modo URI.

Por que Session pooler, e não a conexão direta? A conexão "direct" do Supabase é só IPv6 — e quase todo VPS (incluindo os da HostGator) tem só IPv4, então ela não conecta e a instalação trava. O Session pooler aceita IPv4 e é grátis (você não precisa do add-on pago "IPv4 dedicado"). A URL correta se parece com: postgresql://postgres.SEUPROJETO:SUASENHA@aws-1-<região>.pooler.supabase.com:5432/postgres

Se a senha do banco tiver caracteres especiais (@, #, etc.), o Supabase mostra um aviso pra "percent-encode" — o instalador já lida com isso; copie a URL como o painel mostra.

Pronto — você tem as 4 informações do banco.


Passo 4 — Aponte seu domínio para o servidor

⏳ Faça este passo primeiro, de preferência 1 dia antes. O domínio leva de minutos a horas pra "propagar", e o SSL só é emitido depois que ele apontar pra cá. Deixar isso pra última hora é o que mais atrasa a instalação.

No painel onde você comprou o domínio (HostGator ou outro), crie um registro A:

Campo Valor
Tipo A
Nome/Host crm (ou @ pra usar o domínio raiz)
Aponta para o IP do servidor (passo 1)

Isso faz crm.seudominio.com.br levar ao seu servidor. Pode levar de alguns minutos a algumas horas pra "valer" (propagar) — o instalador confere isso e te avisa.


Passo 5 — Instale o CRM

Agora escolha um dos dois caminhos:

Caminho fácil: o Claude Code faz por você

  1. Conecte no servidor por SSH e abra o Claude Code lá dentro (na VPS, não no seu PC).

  2. Escreva pra ele exatamente isto:

    "Clone https://github.com/melgarafael/DeskcommCRM e me instale o DeskcommCRM seguindo o hostgator-setup-kit/install.sh. Me pergunte as chaves uma por uma e resolva os erros você mesmo."

  3. Ele baixa o projeto sozinho, lê as instruções de instalação e conduz tudo — pedindo o domínio, as chaves do Supabase e da Anthropic, e o e-mail/senha do admin uma de cada vez, e resolvendo qualquer tropeço.

Não precisa baixar nem enviar nenhum arquivo .zip: o projeto é público e o Claude Code baixa direto do GitHub, sempre na versão mais recente.

Caminho manual: um comando

No servidor, baixe o projeto e rode o instalador:

git clone https://github.com/melgarafael/DeskcommCRM.git
cd DeskcommCRM
bash hostgator-setup-kit/install.sh

O instalador pergunta o que precisa e monta tudo: gera as senhas técnicas, cria o banco, cria o seu usuário admin, sobe o CRM e confere se ficou no ar.


Passo 6 — Primeiro acesso

  1. Abra https://crm.seudominio.com.br no navegador. O cadeado de segurança (SSL) leva cerca de 1 minuto pra aparecer no primeiro acesso — se der erro de segurança, espere um pouco e recarregue.
  2. Entre com o e-mail e senha que você definiu na instalação.
  3. Pronto — você já está dentro. Não há mais nenhum passo obrigatório antes de usar o sistema.

Segurança em 2 etapas (opcional, e recomendada). O CRM não pede isso no primeiro login — você liga quando quiser, em Configurações › Segurança. Vai precisar de um app como Google Authenticator ou Authy no celular: escaneia o QR e digita o código de 6 dígitos. Depois de ligado, o código passa a ser pedido em todo login.

Este guia já disse que o CRM pedia isso logo no primeiro acesso. Não pede — e quem esperasse a tela aparecer concluiria que a instalação deu errado. O QR que você vai ver a seguir é outro: é o do WhatsApp, no Passo 7.


Passo 7 — Conecte o WhatsApp

No onboarding, o CRM mostra um QR code. No celular:

  1. Abra o WhatsApp → Aparelhos conectados → Conectar um aparelho.
  2. Aponte a câmera pro QR na tela.

Pronto — as mensagens do seu número começam a cair no CRM.

Use o número que você quer atender pelo CRM. Recomendamos um número dedicado ao atendimento (não o seu pessoal).


Passo 8 — Coloque a IA pra trabalhar (opcional)

Na área de Agentes de IA, cole a sua chave da Anthropic e configure o robô (nome, tom de voz, base de conhecimento). A IA passa a sugerir e responder dentro das regras que você definir.


Deu tudo certo? Cuide do seu CRM

Quero... Comando (no servidor, dentro da pasta do projeto)
Ver se está tudo no ar bash hostgator-setup-kit/healthcheck.sh
Atualizar pra versão nova bash hostgator-setup-kit/update.sh
Fazer backup (faça sempre!) bash hostgator-setup-kit/backup.sh
Esqueci a senha bash hostgator-setup-kit/reset-password.sh seu@email.com
Perdi o app do autenticador bash hostgator-setup-kit/reset-mfa.sh seu@email.com

Backup é sério: o plano grátis do Supabase não faz backup sozinho. Rode o backup.sh de vez em quando (ou agende no servidor pra rodar todo dia).


Travou? Problemas comuns

Sintoma O que fazer
Site não abre / erro de segurança O domínio ainda não apontou pro servidor, ou faltou liberar as portas. Rode ufw allow 80,443,22/tcp e espere o domínio propagar.
A página fica recarregando/erro Faltou alguma chave. Rode docker compose -f docker-compose.prod.yml logs app e procure a linha que diz qual variável falta.
WhatsApp não conecta Veja docker compose -f docker-compose.prod.yml logs waha. Confirme que o número não está conectado em outro computador.

Em qualquer travamento, você pode voltar ao Claude Code e pedir ajuda — ele lê os erros do servidor e resolve.


Por que HostGator?

O DeskcommCRM foi desenhado pra rodar redondo na infraestrutura da HostGator. Além do VPS, você pode centralizar aí:

Todos os links deste guia são oficiais da HostGator.