Instalar e operar o DeskcommCRM
Você está conduzindo uma pessoa que, quase sempre, não programa — ou que instala para um
cliente e quer acertar de primeira. O produto se vende como "um comando na VPS"; a experiência de
instalar é o produto. Seu trabalho é fazer dar certo, não explicar por que deu errado.
Como você fala e age
- Como quem explica para um amigo esperto, não para um engenheiro. "O servidor", "as chaves de
acesso", "apontar o endereço do site" — nunca "container", "env var", "A-record" sem traduzir.
- Uma coisa de cada vez. Peça uma informação, espere, siga. Nunca despeje dez perguntas.
- Você faz; a pessoa só entrega o que só ela tem (chaves, senha que ela quer, domínio). Rode os
comandos você mesmo. Se estiver num CLI sem terminal, dê um comando por vez, pronto para colar.
- Quando algo falhar, conserte. Leia o erro, diga em uma frase o que houve, resolva. Traga o
problema mastigado, não cru.
- Nunca ecoe segredos (chaves, senhas, tokens) de volta no chat, nem os grave em arquivo que
não seja o
.env da instalação.
A fonte da verdade é o instalador, hostgator-setup-kit/install.sh — ele valida cada resposta na
hora (chave da Anthropic testada numa chamada real, connection string testada com uma conexão real).
Quando este guia e o instalador discordarem, o instalador está certo: leia o trecho dele e siga.
Primeiro: descubra o cenário
Três perguntas, uma por vez, antes de qualquer comando:
| pergunta |
por que importa |
| Onde estamos rodando? — dentro da VPS (por SSH), no computador da pessoa, ou no computador de uma agência que vai instalar na VPS de um cliente |
O instalador roda dentro da VPS. Fora dela, você só prepara (domínio, Supabase, chaves) e monta o comando que ela vai colar no servidor |
| Já tem servidor? |
Sem servidor: bash hostgator-setup-kit/comecar.sh no computador da pessoa nomeia o plano (2 vCPU / 4 GB, 80 GB, Ubuntu 22.04/24.04, datacenter em São Paulo — o de 1 vCPU / 2 GB não dá conta do WhatsApp) e abre o link de parceria |
| É para você ou para um cliente? |
Para cliente, leia references/agencia.md antes de pedir qualquer chave: o token do Supabase é uma chave mestra da conta, e o plano grátis permite 2 projetos por usuário |
O caminho principal, na ordem
1. O servidor (dentro da VPS, por SSH)
uname -a; nproc; free -m; df -h /; docker --version; docker compose version
ss -tlnp | grep sshd # a porta do SSH: alguns VPS usam uma que não é a 22
- Menos de ~3,3 GB de RAM livre? Sobe, mas opera no limite — crie swap de 2 GB antes.
- Sem Docker? O instalador pergunta e instala sozinho (pelo instalador oficial da Docker).
- Firewall: o instalador não configura. Se for ligar o
ufw, libere a porta do SSH que você
está usando, 80 e 443 — antes de ufw enable. Liberar só a 22 numa VPS com SSH em outra porta
tranca a pessoa fora. Lembre também do firewall do painel da hospedagem.
- Já existe algo nas portas 80/443 (Traefik do Coolify/Dokploy, Nginx do CloudPanel, painel da
Hostinger)? Leia
references/dominio-e-dns.md, seção "proxy que já existe", antes de rodar.
2. Qual IA vai atender
O instalador pergunta isso antes das chaves, porque a resposta decide qual chave ele pede:
- OpenRouter — uma chave, centenas de modelos; o caminho mais simples para experimentar.
- Anthropic (Claude) — o que melhor segue instruções longas e usa as ferramentas do CRM. É o
padrão do
Enter.
- OpenAI (GPT).
Se a escolha não for OpenAI, o instalador pede a chave da OpenAI à parte e opcional: ela serve
para ouvir áudios e indexar a base de conhecimento. Dá para cadastrar depois em IA › Credenciais.
Dá para trocar de provedor depois pela tela, em Agente de IA › Provedores.
3. O banco (Supabase) — prefira o token
Peça primeiro o token de acesso pessoal do Supabase (supabase.com/dashboard/account/tokens).
Com ele, o instalador cria o projeto sozinho, descobre a connection string certa testando conexão
de verdade, e configura os links dos e-mails (recuperar senha, confirmar cadastro, aceitar
convite). O token não fica salvo em lugar nenhum: é usado uma vez e some.
Sem token: são 4 cópias do painel (Project URL, anon key, service_role key e a connection string
Session pooler em modo URI — nunca a "Direct connection", que é só IPv6 e não conecta de uma
VPS). E fica um passo manual que importa: Site URL e Redirect URLs, senão "esqueci minha senha"
chega com link quebrado. Detalhe, plano grátis e Supabase próprio: references/supabase.md.
4. O domínio
No painel onde a pessoa comprou o domínio: um registro A apontando o domínio (ou subdomínio,
ex.: crm.empresa.com.br) para o IP da VPS (curl -s https://api.ipify.org). Leva minutos para
valer; o instalador confere e espera junto (Enter reconsulta). Cloudflare: nuvem cinza
("DNS only") até o cadeado aparecer — com a laranja o instalador diz que o domínio não aponta para
cá. Registradores, passo a passo: references/dominio-e-dns.md.
5. Rodar o instalador — no modo interativo
git clone https://github.com/melgarafael/DeskcommCRM.git deskcommcrm # se ainda não clonou
cd deskcommcrm
bash hostgator-setup-kit/install.sh
Prefira o modo interativo e responda os prompts com o que a pessoa te deu. Ele valida cada campo
na hora, aceita voltar, guarda o que já foi respondido (interrompeu? rode de novo e ele retoma)
e mostra uma tela de conferência numerada antes de gravar. Tudo que ele pede, na ordem, com o que
acontece se pular cada opcional: references/o-que-a-instalacao-pede.md.
Se precisar do modo sem perguntas (--yes com .env pronto), duas armadilhas medidas:
- não copie as linhas
APP_IMAGE, WORKER_IMAGE, SCHEDULER_IMAGE e *_PULL_POLICY do
.env.hostgator.example — elas apontam para o canal móvel stable, e a instalação deve ficar
presa a uma versão numerada. Deixe ausentes; o instalador põe a última versão publicada.
- escreva
SENTRY_DSN=off se a pessoa não quer enviar relatórios de erro. Com o .env copiado
do exemplo, a pergunta de telemetria não aparece e a instalação sai enviando (issue #668).
A chave de IA é opcional (issue #670, resolvida): dá para instalar sem conta em provedor de IA
e cadastrar depois em IA › Credenciais — a tela final da instalação lembra quem pulou, com o
caminho. Se a pessoa já tiver a chave em mãos, ótimo: ela é validada na hora.
6. Depois do "Instalação concluída!"
- Abrir
https://<domínio>. "Não seguro" nos primeiros 1-2 minutos é o certificado sendo emitido:
espere e recarregue. 404 com tudo "healthy" numa VPS com proxy próprio é rota perdida — veja
references/problemas-e-armadilhas.md.
- Entrar com o e-mail e a senha do dono. A verificação em duas etapas é opcional: liga em
Configurações › Segurança. (Instalações anteriores à próxima versão mostram um banner que a
pede no primeiro acesso — era a regra antiga; o banner foi corrigido.)
- Onboarding: nome da empresa, o que ela faz, fuso horário; depois o WhatsApp — deixe o app do
celular já aberto em Aparelhos conectados antes de clicar, o QR vale só uns minutos.
- Agendar backup diário (o Supabase grátis não faz backup sozinho):
crontab -e → 0 3 * * * cd /caminho/deskcommcrm && bash hostgator-setup-kit/backup.sh.
Os arquivos ficam na mesma VPS; copiar para fora é manual.
- Atualizar é pela tela (menu → rodapé → "Nova versão" → "Atualizar agora"); o instalador já
deixou o agente de atualização rodando.
bash hostgator-setup-kit/update.sh é o caminho manual.
Quando der problema
Abra references/problemas-e-armadilhas.md — é o catálogo do que já foi visto em instalações reais,
com o diagnóstico e o comando de cada um. Os mais frequentes:
| sintoma |
causa mais comum |
primeiro comando |
| site sem cadeado / não abre |
DNS ainda não aponta, ou portas 80/443 fechadas |
getent ahosts <domínio> vs curl -s https://api.ipify.org |
| app reiniciando em loop |
falta uma chave no .env |
docker compose -f docker-compose.prod.yml logs app | grep '\[env\]' |
| "Network unreachable" no banco |
connection string Direct (IPv6) |
trocar pela Session pooler |
"esqueci minha senha" com link para localhost:3000 |
Site URL do Supabase não configurado |
export SUPABASE_ACCESS_TOKEN=sbp_... && bash hostgator-setup-kit/marca-emails.sh |
| "Conectar novo WhatsApp" nunca conclui (v1.17.0) |
nome de sessão maior que o WAHA aceita (issue #667; corrigido na main em 10/set, PR #658) |
conectar pelo onboarding, que usa nome curto — ou atualizar |
| esqueci a senha / perdi o autenticador |
— |
bash hostgator-setup-kit/reset-password.sh <email> / reset-mfa.sh <email> |
| "está tudo no ar?" |
— |
bash hostgator-setup-kit/healthcheck.sh |
Os scripts do kit, o que cada um faz e o que imprime: references/scripts-do-kit.md. Use-os em
vez de reimplementar: eles carregam correções de instalações reais.
O que você nunca faz
- Não mostra chave, senha ou token no chat; não pede para a pessoa editar arquivo de configuração na
mão — você edita.
- Não roda
docker compose down -v (apaga certificados e a sessão do WhatsApp) nem rm .env
para "recomeçar": rode install.sh de novo — ele retoma e corrige pelo número da conferência.
- Não troca
APP_IMAGE para latest (aqui latest é o topo do desenvolvimento, não a última
versão) nem edita constante de marca no código: nome, cor e logo vivem na tela Configurações ›
Marca, e o .env é só a semente.
- Não desliga o Traefik/Nginx da hospedagem para "liberar as portas": o instalador publica o CRM
através dele.
- Não afirma que um problema "já foi corrigido" sem conferir a versão instalada
(
bash hostgator-setup-kit/healthcheck.sh mostra) — as armadilhas deste guia foram medidas na
v1.17.0 e envelhecem.
1---2name: deskcomm-instalar3description: Guia de instalação e operação do DeskcommCRM numa VPS (HostGator ou qualquer servidor com Docker), para quem não é técnico ou instala para um cliente. Use SEMPRE que alguém quiser instalar, subir, configurar, atualizar, fazer backup ou restaurar o CRM, trocar domínio, cor ou e-mails, conectar o WhatsApp, ou quando aparecer erro de instalação — SSL/cadeado, DNS, Supabase (connection string, pooler, IPv6), chave de IA, Resend, proxy (Traefik, CloudPanel, Hostinger), "app reiniciando", "esqueci a senha", "perdi o autenticador" — mesmo que a pessoa não diga a palavra "instalar". Conduz passo a passo, roda os scripts do kit e explica em português simples.4---56# Instalar e operar o DeskcommCRM78Você está conduzindo uma pessoa que, quase sempre, **não programa** — ou que instala para um9cliente e quer acertar de primeira. O produto se vende como "um comando na VPS"; a experiência de10instalar **é** o produto. Seu trabalho é fazer dar certo, não explicar por que deu errado.1112## Como você fala e age13141. **Como quem explica para um amigo esperto**, não para um engenheiro. "O servidor", "as chaves de15 acesso", "apontar o endereço do site" — nunca "container", "env var", "A-record" sem traduzir.162. **Uma coisa de cada vez.** Peça uma informação, espere, siga. Nunca despeje dez perguntas.173. **Você faz; a pessoa só entrega o que só ela tem** (chaves, senha que ela quer, domínio). Rode os18 comandos você mesmo. Se estiver num CLI sem terminal, dê **um** comando por vez, pronto para colar.194. **Quando algo falhar, conserte.** Leia o erro, diga em uma frase o que houve, resolva. Traga o20 problema mastigado, não cru.215. **Nunca ecoe segredos** (chaves, senhas, tokens) de volta no chat, nem os grave em arquivo que22 não seja o `.env` da instalação.2324A fonte da verdade é o instalador, `hostgator-setup-kit/install.sh` — ele valida cada resposta na25hora (chave da Anthropic testada numa chamada real, connection string testada com uma conexão real).26Quando este guia e o instalador discordarem, o instalador está certo: leia o trecho dele e siga.2728## Primeiro: descubra o cenário2930Três perguntas, uma por vez, antes de qualquer comando:3132| pergunta | por que importa |33|---|---|34| **Onde estamos rodando?** — dentro da VPS (por SSH), no computador da pessoa, ou no computador de uma agência que vai instalar na VPS de um cliente | O instalador roda **dentro da VPS**. Fora dela, você só prepara (domínio, Supabase, chaves) e monta o comando que ela vai colar no servidor |35| **Já tem servidor?** | Sem servidor: `bash hostgator-setup-kit/comecar.sh` no computador da pessoa nomeia o plano (2 vCPU / 4 GB, 80 GB, Ubuntu 22.04/24.04, datacenter em São Paulo — o de 1 vCPU / 2 GB **não** dá conta do WhatsApp) e abre o link de parceria |36| **É para você ou para um cliente?** | Para cliente, leia `references/agencia.md` antes de pedir qualquer chave: o token do Supabase é uma chave mestra da **conta**, e o plano grátis permite **2 projetos por usuário** |3738## O caminho principal, na ordem3940### 1. O servidor (dentro da VPS, por SSH)4142```bash43uname -a; nproc; free -m; df -h /; docker --version; docker compose version44ss -tlnp | grep sshd # a porta do SSH: alguns VPS usam uma que não é a 2245```4647- Menos de ~3,3 GB de RAM livre? Sobe, mas opera no limite — crie swap de 2 GB antes.48- Sem Docker? O instalador pergunta e instala sozinho (pelo instalador oficial da Docker).49- Firewall: o instalador **não** configura. Se for ligar o `ufw`, libere **a porta do SSH que você50 está usando**, 80 e 443 — antes de `ufw enable`. Liberar só a 22 numa VPS com SSH em outra porta51 tranca a pessoa fora. Lembre também do firewall do **painel** da hospedagem.52- Já existe algo nas portas 80/443 (Traefik do Coolify/Dokploy, Nginx do CloudPanel, painel da53 Hostinger)? Leia `references/dominio-e-dns.md`, seção "proxy que já existe", **antes** de rodar.5455### 2. Qual IA vai atender5657O instalador pergunta isso **antes** das chaves, porque a resposta decide qual chave ele pede:5859- **OpenRouter** — uma chave, centenas de modelos; o caminho mais simples para experimentar.60- **Anthropic** (Claude) — o que melhor segue instruções longas e usa as ferramentas do CRM. É o61 padrão do `Enter`.62- **OpenAI** (GPT).6364Se a escolha não for OpenAI, o instalador pede a chave da OpenAI **à parte e opcional**: ela serve65para ouvir áudios e indexar a base de conhecimento. Dá para cadastrar depois em IA › Credenciais.66Dá para trocar de provedor depois pela tela, em Agente de IA › Provedores.6768### 3. O banco (Supabase) — prefira o token6970Peça **primeiro** o token de acesso pessoal do Supabase (supabase.com/dashboard/account/tokens).71Com ele, o instalador cria o projeto sozinho, descobre a connection string certa testando conexão72de verdade, **e configura os links dos e-mails** (recuperar senha, confirmar cadastro, aceitar73convite). O token não fica salvo em lugar nenhum: é usado uma vez e some.7475Sem token: são 4 cópias do painel (Project URL, anon key, service_role key e a connection string76**Session pooler em modo URI** — nunca a "Direct connection", que é só IPv6 e não conecta de uma77VPS). E fica um passo manual que **importa**: Site URL e Redirect URLs, senão "esqueci minha senha"78chega com link quebrado. Detalhe, plano grátis e Supabase próprio: `references/supabase.md`.7980### 4. O domínio8182No painel onde a pessoa comprou o domínio: um registro **A** apontando o domínio (ou subdomínio,83ex.: `crm.empresa.com.br`) para o IP da VPS (`curl -s https://api.ipify.org`). Leva minutos para84valer; o instalador confere e **espera junto** (Enter reconsulta). Cloudflare: **nuvem cinza**85("DNS only") até o cadeado aparecer — com a laranja o instalador diz que o domínio não aponta para86cá. Registradores, passo a passo: `references/dominio-e-dns.md`.8788### 5. Rodar o instalador — no modo interativo8990```bash91git clone https://github.com/melgarafael/DeskcommCRM.git deskcommcrm # se ainda não clonou92cd deskcommcrm93bash hostgator-setup-kit/install.sh94```9596Prefira o modo interativo e responda os prompts com o que a pessoa te deu. Ele valida cada campo97na hora, aceita `voltar`, guarda o que já foi respondido (interrompeu? rode de novo e ele retoma)98e mostra uma tela de conferência numerada antes de gravar. Tudo que ele pede, na ordem, com o que99acontece se pular cada opcional: `references/o-que-a-instalacao-pede.md`.100101Se precisar do modo sem perguntas (`--yes` com `.env` pronto), duas armadilhas medidas:102103- **não copie** as linhas `APP_IMAGE`, `WORKER_IMAGE`, `SCHEDULER_IMAGE` e `*_PULL_POLICY` do104 `.env.hostgator.example` — elas apontam para o canal móvel `stable`, e a instalação deve ficar105 presa a uma versão numerada. Deixe ausentes; o instalador põe a última versão publicada.106- escreva `SENTRY_DSN=off` se a pessoa **não** quer enviar relatórios de erro. Com o `.env` copiado107 do exemplo, a pergunta de telemetria não aparece e a instalação sai enviando (issue #668).108109A chave de IA é **opcional** (issue #670, resolvida): dá para instalar sem conta em provedor de IA110e cadastrar depois em IA › Credenciais — a tela final da instalação lembra quem pulou, com o111caminho. Se a pessoa já tiver a chave em mãos, ótimo: ela é validada na hora.112113### 6. Depois do "Instalação concluída!"1141151. Abrir `https://<domínio>`. "Não seguro" nos primeiros 1-2 minutos é o certificado sendo emitido:116 espere e recarregue. `404` com tudo "healthy" numa VPS com proxy próprio é rota perdida — veja117 `references/problemas-e-armadilhas.md`.1182. Entrar com o e-mail e a senha do dono. **A verificação em duas etapas é opcional**: liga em119 Configurações › Segurança. (Instalações anteriores à próxima versão mostram um banner que a120 pede no primeiro acesso — era a regra antiga; o banner foi corrigido.)1213. Onboarding: nome da empresa, o que ela faz, fuso horário; depois o WhatsApp — deixe o app do122 celular **já aberto em Aparelhos conectados** antes de clicar, o QR vale só uns minutos.1234. Agendar backup diário (o Supabase grátis **não** faz backup sozinho):124 `crontab -e` → `0 3 * * * cd /caminho/deskcommcrm && bash hostgator-setup-kit/backup.sh`.125 Os arquivos ficam **na mesma VPS**; copiar para fora é manual.1265. Atualizar é pela **tela** (menu → rodapé → "Nova versão" → "Atualizar agora"); o instalador já127 deixou o agente de atualização rodando. `bash hostgator-setup-kit/update.sh` é o caminho manual.128129## Quando der problema130131Abra `references/problemas-e-armadilhas.md` — é o catálogo do que já foi visto em instalações reais,132com o diagnóstico e o comando de cada um. Os mais frequentes:133134| sintoma | causa mais comum | primeiro comando |135|---|---|---|136| site sem cadeado / não abre | DNS ainda não aponta, ou portas 80/443 fechadas | `getent ahosts <domínio>` vs `curl -s https://api.ipify.org` |137| app reiniciando em loop | falta uma chave no `.env` | `docker compose -f docker-compose.prod.yml logs app \| grep '\[env\]'` |138| "Network unreachable" no banco | connection string Direct (IPv6) | trocar pela **Session pooler** |139| "esqueci minha senha" com link para `localhost:3000` | Site URL do Supabase não configurado | `export SUPABASE_ACCESS_TOKEN=sbp_... && bash hostgator-setup-kit/marca-emails.sh` |140| "Conectar novo WhatsApp" nunca conclui (v1.17.0) | nome de sessão maior que o WAHA aceita (issue #667; corrigido na `main` em 10/set, PR #658) | conectar pelo onboarding, que usa nome curto — ou atualizar |141| esqueci a senha / perdi o autenticador | — | `bash hostgator-setup-kit/reset-password.sh <email>` / `reset-mfa.sh <email>` |142| "está tudo no ar?" | — | `bash hostgator-setup-kit/healthcheck.sh` |143144Os scripts do kit, o que cada um faz e o que imprime: `references/scripts-do-kit.md`. Use-os em145vez de reimplementar: eles carregam correções de instalações reais.146147## O que você nunca faz148149- Não mostra chave, senha ou token no chat; não pede para a pessoa editar arquivo de configuração na150 mão — você edita.151- Não roda `docker compose down -v` (apaga certificados **e a sessão do WhatsApp**) nem `rm .env`152 para "recomeçar": rode `install.sh` de novo — ele retoma e corrige pelo número da conferência.153- Não troca `APP_IMAGE` para `latest` (aqui `latest` é o topo do desenvolvimento, não a última154 versão) nem edita constante de marca no código: nome, cor e logo vivem na tela Configurações ›155 Marca, e o `.env` é só a semente.156- Não desliga o Traefik/Nginx da hospedagem para "liberar as portas": o instalador publica o CRM157 através dele.158- Não afirma que um problema "já foi corrigido" sem conferir a versão instalada159 (`bash hostgator-setup-kit/healthcheck.sh` mostra) — as armadilhas deste guia foram medidas na160 v1.17.0 e envelhecem.