DeskcommCRM README

The project's README from github.com/melgarafael/DeskcommCRM. As one markdown file: README.md.

🇧🇷 Português · 🇺🇸 English · 🇪🇸 Español

Deskcomm CRM

🛠️ DeskcommCRM — o Sistema Operacional de Vendas com IA, open source, pro WhatsApp

Agentes de IA que atendem, qualificam e vendem no WhatsApp — dentro de um CRM open source rodando no seu servidor. Sem mensalidade, sem feature travada, seus dados com você. A alternativa aberta a Kommo, Octadesk e Intercom.

Next.js 16 TypeScript Supabase Self-hosted CI License: MIT

⚡ Instalar · 🔄 Atualizar · 🧭 Visão · 🏗️ Arquitetura · 🤝 Contribuir · 🗺️ Roadmap


☁️ Rode este CRM em produção com 1 comando

O DeskcommCRM foi desenvolvido em parceria com a HostGator: o hostgator-setup-kit/ instala o CRM completo (app + WhatsApp + banco) numa VPS com um único comando, e o runbook de produção já assume esse ambiente.

👉 Assinar a VPS HostGator com desconto da parceria — datacenter em São Paulo, ideal pro WhatsApp rodando 24/7. (link de parceiro — assinar por ele apoia o projeto e sai mais barato)

Ainda não tem servidor? Rode isto no seu computador (macOS, Linux ou WSL). Ele diz qual plano contratar — com os números do runbook, não um "depende" — e te devolve o comando certo pro seu caso:

curl -fsSL https://raw.githubusercontent.com/melgarafael/DeskcommCRM/main/hostgator-setup-kit/comecar.sh | bash

(prefere ler antes de executar? clone o repo e rode bash hostgator-setup-kit/comecar.sh — ele não instala nada sem você confirmar.)


⚡ Instalar na sua VPS (o caminho principal)

1. Entre na sua VPS

Abra o Terminal no seu computador (no Windows, o PowerShell; no Mac ou Linux, o Terminal) e conecte com o IP e a porta que a hospedagem te mandou por e-mail:

ssh -p PORTA root@SEU_IP

Troque PORTA e SEU_IP pelos seus. Se a hospedagem não mencionou porta nenhuma, é a padrão (22) e você pode omitir: ssh root@SEU_IP.

Ele pede a senha. Ao digitar, não aparece nada na tela — nem asteriscos. Isso não é travamento: é o terminal escondendo a senha. Digite (ou cole) e dê Enter.

Na primeira conexão ele pergunta Are you sure you want to continue connecting? — responda yes. É o servidor se apresentando pela primeira vez.

2. Rode o instalador

Já dentro da VPS:

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

É isso. Você não instala Node, nem pnpm, nem compila nada — a imagem do app já vem pronta. Se faltar Docker, o instalador pergunta e instala sozinho.

O que você precisa ter em mãos

Item Onde conseguir
VPS com Docker HostGator (parceria) — ou qualquer VPS com Docker. 4 GB de RAM recomendados
Domínio Um registro A apontando pro IP da VPS (ex.: crm.suaempresa.com.br)
Banco Conta grátis no supabase.com — 3 chaves + connection string do Session pooler
IA Uma chave de OpenRouter, Anthropic ou OpenAI — o instalador pergunta qual você quer
WhatsApp Seu número, conectado por QR code no onboarding (ou o canal oficial da Meta)

💡 O Supabase pode ser criado pelo próprio instalador. Exporte um SUPABASE_ACCESS_TOKEN antes de rodar e ele cria o projeto, espera o banco ficar saudável, busca as 4 credenciais e descobre o host do pooler testando conexão real — sem copiar e colar.

O que o instalador faz por você

Ele pergunta só o que é seu (domínio, chaves, senha do admin), valida cada resposta antes de seguir — chave errada ele recusa na hora, não três passos depois — e cuida do resto:

  1. Gera todos os segredos técnicos sozinho (você não inventa senha nenhuma).
  2. Cria as extensões do Postgres e aplica o schema completo (supabase/baseline.sql).
  3. Cria o primeiro admin com o e-mail e a senha que você escolheu.
  4. Sobe a stack inteira com HTTPS automático e confere a saúde no fim.
  5. Instala o cron das automações (sem ele, as regras QUANDO/SE/ENTÃO ficam paradas na fila) e o agente de atualização, que é o que faz o botão "Atualizar agora" existir na tela.

Rodar de novo não quebra nada — o install.sh é idempotente: não duplica cron, não recria usuário, retoma de onde parou.

Modo não-interativo: copie .env.hostgator.example para .env, preencha e rode bash hostgator-setup-kit/install.sh --yes.

Outra hospedagem? (Hostinger, Coolify, Dokploy, CapRover…)

Funciona. Se a sua VPS já vem com um proxy reverso próprio ocupando as portas 80/443, o instalador detecta isso sozinho e publica o CRM através dele, em vez de tentar subir um Caddy que não caberia. Num caso específico — proxy em --network host, como faz a Hostinger — ele pergunta em vez de adivinhar, porque publicar atrás do proxy errado instala "com sucesso" um site mudo. Detalhes em hostgator-setup-kit/README.md.

Primeiro acesso

Abra https://<seu-domínio> (o cadeado leva ~1 min pra aparecer), entre com o admin, e tenha o Google Authenticator ou Authy à mão se você quiser ligar a verificação em duas etapas — ela é opcional e fica em Configurações › Segurança; o primeiro login não a exige. No onboarding, escaneie o QR code com o WhatsApp do seu número.

🤖 Prefere que uma IA instale pra você?

O repositório traz guias do assistente que carregam sozinhos no Claude Code, Codex, Cursor, OpenCode ou Antigravity: instalar, montar um cliente por nicho, analisar métricas, afinar o prompt do agente e contribuir. Para tê-los em qualquer pasta — inclusive antes de clonar, no seu computador —, rode uma vez:

curl -fsSL https://raw.githubusercontent.com/melgarafael/DeskcommCRM/main/scripts/instalar-guias.sh | bash

Depois abra uma sessão nova do seu assistente e diga "quero instalar o CRM na minha VPS": pedir o assunto em português aciona o guia certo em qualquer um dos cinco. Para chamar um guia pelo nome, cada um tem o seu jeito — /deskcomm-instalar no Claude Code, no Cursor e no Antigravity; $deskcomm-instalar no Codex; no OpenCode, peça pelo nome, em linguagem natural.

Os guias não se atualizam sozinhos: rodar o mesmo comando de novo traz a versão nova. Para desfazer:

curl -fsSL https://raw.githubusercontent.com/melgarafael/DeskcommCRM/main/scripts/instalar-guias.sh | bash -s -- --remover

Com o repositório já clonado, os guias vêm dentro dele (.agents/skills/) e nem isso é preciso. Se você rodou o comando mesmo assim, saiba que no Claude Code o guia instalado vale mais que o do clone — e fica na versão do dia em que rodou, até rodar de novo (ou desfazer). Também funciona o jeito antigo: jogar só a pasta hostgator-setup-kit/ no chat do Claude Code dentro da VPS — ele lê o CLAUDE.md do kit e conduz tudo em português.


🔄 Atualizar

Saiu versão nova? Há dois caminhos, e o primeiro não exige terminal.

Pela tela (recomendado)

Quando existe versão nova, o rodapé do menu lateral acende "Nova versão" — só pro dono do servidor, porque avisar quem não pode atualizar é ruído. Clique e você cai em Configurações → Atualização, que mostra o que muda, faz backup do banco sozinha e acompanha cada fase (backup → código → banco → no ar) até terminar. Nada de SSH.

Se a versão nova subir quebrada, o agente volta pra imagem anterior sozinho e grava essa volta no .env — sem isso, o próximo restart traria o app quebrado de novo, em silêncio.

Por baixo: o app só registra o pedido; quem executa é o agente que o install.sh deixou na sua VPS, num cron que confere a cada 5 minutos — então a atualização começa em até 5 minutos depois do clique. Se esse agente estiver fora do ar, a tela avisa "Atualização automática indisponível" e mostra o comando abaixo — ela não finge que deu certo.

Pelo terminal

cd /caminho/do/DeskcommCRM
bash hostgator-setup-kit/update.sh

O comando faz, nesta ordem: (1) confere se há mesmo versão nova — se não houver, sai na hora; (2) faz backup do banco antes de tocar em qualquer coisa; (3) baixa o código novo; (4) atualiza o banco re-aplicando o baseline.sql, que é idempotente e auto-curativo (conserta sozinho dados bagunçados por versões antigas); (5) puxa a imagem nova do app; (6) confere a saúde no fim.

O alvo é a última versão publicada (v1.2.3), não o topo da main — atualizar leva sempre a uma versão marcada e descrita no CHANGELOG.md, nunca a um commit não testado. Ele recusa voltar pra uma versão anterior à instalada (isso desligaria coisas que você já tem); pra isso existe --force, de propósito.

Coisas normais que você vai ver: um monte de already exists / multiple primary keys na parte do banco — é esperado e inofensivo, são coisas que já existiam. O script filtra esse ruído e mostra ✓ banco atualizado. Se o banco estiver ocupado com o CRM atendendo, ele aplica de novo sozinho (até 3 passadas) e conta isso na tela — isso vale a partir da atualização seguinte à que instalar esta correção. Se aparecer ⚠ Apareceram avisos no banco que NÃO são os esperados, aí sim guarde a mensagem: o fim da saída diz o que fazer em cada caso (repetir com --force quando foi o banco ocupado, declarar SUPABASE_DB_ADMIN_URL quando foi permissão). Restaurar o backup é o último recurso.

Deu ruim? bash hostgator-setup-kit/restore.sh volta pro backup. Quer só diagnosticar? bash hostgator-setup-kit/healthcheck.sh.

⚠️ Numa instalação antiga que ainda não tem o agente da tela, rode update.sh duas vezes: a primeira execução ainda é a do script velho (que baixa o novo); a segunda instala o agente e liga o botão.

Passo a passo em linguagem simples: docs/ATUALIZANDO.md.

Outros comandos do kit

Script Função
install.sh Instala tudo (idempotente — pode rodar de novo)
update.sh Atualiza pra versão nova, com backup automático
backup.sh Backup do banco + sessões de WhatsApp
restore.sh Restaura um backup
reset-password.sh Redefine a senha de um usuário
reset-mfa.sh Remove o MFA de quem perdeu o celular
healthcheck.sh Diagnóstico de todos os serviços de uma vez

Backup importa: o plano grátis do Supabase não faz backup sozinho. Vale agendar backup.sh no cron diariamente. O update.sh já roda um backup antes de cada atualização.

🧹 Desinstalar (tirar esta aplicação do Docker)

Para parar e apagar somente os recursos Docker desta instalação, na raiz do repositório:

bash desinstalar_docker.sh

Ele descobre o projeto pelo label que o Docker Compose grava e remove apenas os containers, volumes e redes internas deste projeto. Outras aplicações do mesmo servidor, imagens, cache de build, a rede externa do proxy reverso, o código, o .env, os backups e um Supabase externo não são tocados.

O modo interativo mostra quantos recursos encontrou e exige a confirmação REMOVER-<nome-do-projeto> antes de remover qualquer coisa. Para uma rotina de descarte de ambiente, bash desinstalar_docker.sh --force pula a pergunta. Use --project-name NOME só quando a instalação tiver um COMPOSE_PROJECT_NAME personalizado que não esteja mais no .env.

Os volumes vão junto — inclusive as sessões locais do WhatsApp. Rode backup.sh antes se precisar preservá-las.


✨ O que é

Deskcomm vem de Desk (mesa) + comm (comércio): o comercial de mesa — toda a operação de vendas do seu negócio numa mesa só, operada por pessoas e agentes de IA juntos.

O projeto nasceu como CRM de e-commerce e a comunidade o levou muito além: hoje roda em clínicas, imobiliárias, infoprodutos, agências, lojas e prestadores de serviço — qualquer negócio que vende pelo WhatsApp. O produto acompanhou essa virada e virou um sistema operacional de vendas: agentes de IA com RAG por tenant atendem, qualificam, movem leads no funil, disparam automações e sabem a hora de passar pra um humano — com o CRM inteiro exposto via MCP pros agentes operarem de verdade. A história completa está em VISION.md.

Diferenciais

🔌 Webhooks & Automações

Todo tenant pode criar fontes de captação: um endereço público (/api/v1/webhooks/in/<token>) que recebe leads de landing pages, formulários próprios ou ferramentas como Zapier/n8n via POST (JSON ou application/x-www-form-urlencoded) e já entra direto no funil/estágio escolhido — sem código, sem integração customizada por tenant. Em cima dessas fontes (e dos outros eventos do CRM — lead mudou de etapa, ganhou tag, chegou mensagem no WhatsApp), o tenant monta automações: regras no formato QUANDO/SE/ENTÃO que disparam ações como adicionar tag, mover o lead no funil, atribuir a um atendente, mandar uma mensagem de WhatsApp ou avisar outro sistema via webhook de saída.

Na UI, tudo mora em Webhooks na sidebar (visível só pra quem tem papel manager/admin). A tela tem três abas: Receber dados (criar fonte, copiar o endereço/formulário pronto, disparar um lead de teste, ver os últimos recebimentos), Automações (montar a regra, que sempre nasce pausada até você revisar e ligar) e Atividade (timeline de cada execução, com o resultado de cada ação e reenvio manual quando uma chamada externa falha).

Por baixo, cada evento vira uma linha em event_log — nenhum trigger de banco faz chamada HTTP diretamente. Quem drena essa fila é a rota /api/v1/cron/event-log-drain, chamada a cada minuto. O install.sh/update.sh já configuram esse cron sozinhos — sem ele, as automações são criadas normalmente mas nunca rodam.


🖥️ O que você opera (as telas)

Grupo Telas
Atendimento Inbox (conversas de WhatsApp, você e a IA lado a lado) · Radar (quem esfriou e ainda está aberto) · Respostas rápidas
CRM Kanban (onde cada negócio está no funil) · Contatos · Funis (etapas, vocabulário do negócio e motivos de perda)
Agente de IA Agentes · Follow-ups · Roteadores · Provedores e Credenciais · Conhecimento (RAG) · Memória · Skills · Casos · Alertas · Propostas · Execuções · Uso e orçamento
Canais Conexões (QR ou canal oficial da Meta, com saúde, reconexão e templates) · Nuvemshop · Webhooks
Análise Desempenho (funil e performance por atendente) · Evolução da IA · Audit Log
Organização Equipe · Distribuição de atendimento · Organização · LGPD · API Tokens · Segurança (MFA, códigos de recuperação, sessões) · Perfil, Notificações, Billing

Toda tela tem porta na navegação — o CI reprova tela que existe mas em que só se chega digitando a URL.


🧱 Stack

Camada Escolha Por quê
Frontend Next.js 16 App Router (Turbopack) + React 19 + TypeScript 6 estrito Server Components + Route Handlers no mesmo repo
Estilo Tailwind + shadcn/ui (new-york, neutral) Customizável sem lock-in
DB Supabase (Postgres + RLS + vector) Multi-tenant nativo, embedding pra RAG
Auth Supabase Auth via @supabase/ssr Cookie SameSite=Strict, HttpOnly
Realtime Supabase Realtime postgres_changes + broadcast
Storage Supabase Storage (URLs assinadas) Bucket privado whatsapp-media
WhatsApp WAHA Plus (engine NOWEB) + Meta Cloud API QR pra começar rápido; canal oficial pra escala
Filas event_log table + workers (cron) Trigger de banco nunca faz HTTP
Rate limit Upstash Redis (sliding window) Serverless, free tier suficiente
AI Vercel AI SDK v7 — OpenRouter, Anthropic, OpenAI e Google Instalador pergunta qual; troca depois pela tela
Validação Zod Input externo, env, payloads
Observability Sentry (scrub em erro, transação, span e breadcrumb) Telemetria opt-in no install
Hospedagem VPS com Docker (HostGator/SP na parceria) App + WhatsApp + workers na sua máquina

Detalhes: ARCHITECTURE.md.


🧑‍💻 Desenvolvimento (só pra contribuir com o código)

⚠️ Se você quer USAR o CRM, não é aqui — use o instalador da VPS. Esta seção é pra quem vai mexer no código.

git clone https://github.com/melgarafael/DeskcommCRM.git
cd DeskcommCRM

nvm use                     # Node 22
npm install -g pnpm && pnpm install

cp .env.example .env.local  # guia completo em docs/SETUP.md

docker compose up -d        # WAHA local (opcional em dev sem WhatsApp)

# Schema: aplique o baseline, NÃO as migrations.
# As migrations 0001-0009 e 0013 são stubs `SELECT 1;` — a cadeia não sobe do zero.
# O schema real vive no baseline.sql, o mesmo que o install.sh aplica na VPS.
# `supabase db push` "passa" e deixa o banco vazio.
supabase link --project-ref <seu-ref>

# Num projeto Supabase NOVO, habilite antes as extensões que o schema usa —
# sem elas o baseline para em `type public.vector does not exist`.
psql "$SUPABASE_DB_URL" -v ON_ERROR_STOP=1 -c \
  'create extension if not exists vector with schema public;
   create extension if not exists citext with schema public;
   create extension if not exists pg_trgm with schema public;'

psql "$SUPABASE_DB_URL" -v ON_ERROR_STOP=1 -f supabase/baseline.sql

pnpm dev

App: http://localhost:3000 · Health check: http://localhost:3000/api/v1/health

docs/SETUP.md é o tutorial completo de todas as integrações (Supabase, WAHA, provedores de IA, Upstash, Sentry, Resend, Nuvemshop) — ~60–90 min do zero ao app rodando.


📁 Estrutura

DeskcommCRM/
├── app/                    # Next.js App Router
│   ├── (admin)/            # Rotas super-admin (impersonate, tenants)
│   ├── (public)/           # Login, recovery
│   ├── app/                # Rotas autenticadas: inbox, radar, kanban, contacts,
│   │                       #   connections, ai/*, integrations, metrics, lgpd,
│   │                       #   audit, team, settings
│   └── api/v1/             # API REST canônica (196 route handlers)
├── components/             # React (ui/, inbox/, kanban/, shell/, ...)
├── lib/                    # supabase/, waha/, channels/, ai/, agent-engine/,
│                           #   api/, routing/, navigation/, env.ts
├── workers/                # consumers de event_log (IA, RAG, LGPD, mídia, rotinas)
├── supabase/migrations/    # SQL versionado (+ baseline.sql pro self-host)
├── tests/{e2e,unit,invariants,shell}/
├── scripts/                # seeds, qa-waves, manutenção
├── docs/                   # PRDs, specs, runbooks, SETUP.md, ATUALIZANDO.md
└── hostgator-setup-kit/    # instalação e atualização self-host

🧪 Testes

pnpm typecheck     # tsc --noEmit -p tsconfig.typecheck.json (inclui tests/)
pnpm lint          # eslint next/core-web-vitals
pnpm test:unit     # Vitest (NÃO inclui tests/invariants/**)
pnpm test:db       # Postgres efêmero + baseline install/update + invariantes
pnpm test:e2e      # Playwright (requer dev server)

Estes checks são obrigatórios pra mergear na main. A lista abaixo já disse "quatro" e depois "cinco" — meça, não confie nela:

gh api repos/melgarafael/DeskcommCRM/branches/main/protection \
  --jq '.required_status_checks.contexts|join(", ")'
# em 2026-08-14: verify, build-and-size, invariants, e2e, imagens-ok
Check O que faz
verify typecheck + lint + lint:channels + test:unit + test:shell
invariants sobe um Postgres limpo, aplica o baseline.sql em modo install e depois em modo update — as duas passadas com ON_ERROR_STOP=1, que é o que torna a segunda uma prova de idempotência e não só um "terminou" —, e roda os invariantes de RBAC, atribuição, escopo, roteamento, follow-up, webhooks e automações
build-and-size pnpm build em Node 22
e2e sobe Supabase local, aplica o baseline.sql e roda pelo frontend todas as specs Playwright menos as que FORA_DO_CI declara
imagens-ok reprova quando qualquer uma das três imagens Docker (app, worker, scheduler) não constrói — é o artefato que o self-hoster instala

Quais specs ficam de fora é pergunta de comando, não de leitura — esta linha já afirmou que a única era vps-fresh-onboarding, e desde o PR #983 ela roda no CI:

git show origin/main:.github/workflows/e2e.yml | python3 -c "import sys,re; y=sys.stdin.read(); print(sorted({s for _,c in re.findall(r'(FORA_DO_CI):\s*>-\n((?:[ ]{8,}.*\n)+)',y) for s in re.findall(r'[a-z0-9-]+\.spec\.ts',c)}))"

vps-fresh-onboarding segue sendo a P0 da nossa doutrina de QA visual, porque a instalação fresca é o produto que se vende. Ter gate não dispensa a prova pela tela: gate prova que não regrediu, não que a experiência ficou boa.

Entre os invariantes está o teste de isolamento RLS: cria 2 organizações, simula os claims JWT pelo mesmo caminho auth.uid() / fn_user_org_ids() que as policies de produção usam, e prova que um usuário da org A enxerga zero linhas da org B em conversations, messages, contacts e crm_leads. Antes disso, um caso de controle prova que as linhas da org B realmente existem — sem ele, o teste passaria com a tabela vazia.


📚 Documentação

Doc O que tem
hostgator-setup-kit/README.md Instalação self-host — o kit, os scripts, as hospedagens com proxy próprio
docs/ATUALIZANDO.md Como atualizar sua instalação, em linguagem simples
VISION.md Visão e posicionamento — o que o projeto é, no que acredita e pra onde vai
CHANGELOG.md O que mudou em cada versão — leia a seção da versão antes de atualizar
docs/SETUP.md Setup de desenvolvimento, passo a passo de todas as integrações
docs/white-label.md Instalar para clientes — trocar a marca, uma instalação por cliente vs compartilhada, revenda
docs/runbooks/waha-hostgator.md Runbook de WAHA em produção (dimensionamento, recuperação)
docs/runbooks/deploy.md Deploy em produção
CLAUDE.md Convenções não-negociáveis (leitura obrigatória pra contribuir)
ARCHITECTURE.md Visão de 1 página da arquitetura
docs/index.md Índice dos 157 documentos, com regra de precedência
docs/prd/ · docs/specs/ PRDs e specs técnicas (schema SQL, payloads, MCP, governança)

🤝 Contribuindo

Esse projeto é open source pra comunidade. Toda contribuição é bem-vinda — desde fix de typo em doc até feature nova.

Antes de abrir PR:

  1. Leia CLAUDE.md (~5 min) — convenções não-negociáveis (multi-tenancy, RLS, audit, LGPD).
  2. Leia CONTRIBUTING.md — fluxo de branches, commits, epic-executor.
  3. Siga o Código de Conduta.

Fluxo curto:

git checkout -b feat/short-slug
# implementa + testes
pnpm typecheck && pnpm lint && pnpm lint:channels && pnpm test:unit && pnpm test:shell && pnpm build
pnpm test:db   # precisa de Docker — é o job `invariants`, obrigatório no merge
git commit -m "feat(escopo): descrição"
# abre PR — o template já traz o checklist de Definition of Done

Essas duas linhas são tudo o que dá para rodar na sua máquina, de propósito: rodar só metade e descobrir o resto como surpresa vermelha depois de horas de espera é a pior primeira experiência que este repositório sabe entregar.

Dois gates obrigatórios não cabem aí e só rodam no CI: o e2e (precisa de Supabase local) e o imagens-ok (constrói as três imagens Docker). Verde na sua máquina não é verde no merge.

Definition of Done: typecheck zero, lint zero, testes relevantes verdes, RLS testada se toca tabela tenant-aware, audit log emitido em mutações, migration versionada + apêndice no baseline.sql se muda schema (senão a mudança não chega em quem se auto-hospeda). Detalhes em CLAUDE.md.


🐛 Reportando bugs

Abra uma issue — o template pede o que precisamos (ambiente, /api/v1/health, steps). Rodar bash hostgator-setup-kit/healthcheck.sh e colar a saída ajuda muito.

Pra vulnerabilidades de segurança, NÃO abra issue pública — use o relato privado de vulnerabilidades. Detalhes em SECURITY.md.


🗺️ Roadmap

✅ Entregue

🔮 Próximo


💬 Comunidade


📜 Licença

Distribuído sob a licença MIT — veja LICENSE. Você pode usar, modificar e distribuir livremente, inclusive comercialmente. O software é fornecido "como está", sem garantias (ver cláusula de isenção no LICENSE).


🛟 Suporte & responsabilidades (self-host)

Este é um projeto self-host: cada pessoa roda o CRM na própria infraestrutura (VPS, banco Supabase e chave de IA próprios). Isso implica:


🙏 Agradecimentos


Built with ☕ in Brasil · Made for the community

Siga o desenvolvimento: Instagram · YouTube

DeskcommCRM (melgarafael/DeskcommCRM)

Searching Database…

这是什么?一个开源的 AI 销售操作系统:一个自托管的 CRM,由原生 AI 智能体通过 WhatsApp 来接待客户、筛选意向并促成销售。它定位为 Kommo、Octadesk 和 Intercom 的开源替代品,适合任何靠聊天卖货的企业。
这是注册就能用的托管 SaaS,还是要自己装在服务器上?需要自己托管:应用通过 Docker 跑在你自己的 VPS 上,软件不收月费,数据也留在你自己手里。自带的一套安装包会把整个技术栈装好——应用、WhatsApp 连接和数据库。
我怎么把它跑起来?SSH 登录一台装有 Docker 的 VPS,然后运行 hostgator-setup-kit/ 里的安装脚本:它只会询问你的域名、密钥和管理员密码,所有密钥都自动生成,然后写入数据库结构、创建第一个管理员账号,并启动整套服务,HTTPS 自动配置。脚本是幂等的——重复运行也不会弄坏任何东西。
安装前我需要准备好什么?一台装了 Docker 的 VPS(建议 4 GB 内存)、一个已把 A 记录解析到该 VPS 的域名、一个免费的 Supabase 数据库(如果你导出 SUPABASEACCESSTOKEN,安装脚本可以帮你直接创建项目)、一个 AI 密钥——OpenRouter、Anthropic 或 OpenAI 任选其一——以及你的 WhatsApp 号码,注册引导时扫码连接即可。
它是怎么连接 WhatsApp 的——官方 API 还是别的非官方方式?两种方式都有:一种是在注册引导时扫描二维码连接你自己的号码(通过 WAHA),另一种是改用 Meta 的官方通道。
它最初是给电商做的 CRM——那诊所或代理公司能用吗?可以——核心设计就是跨行业通用的:销售流程里的用词可以自己配置,潜在客户可以改叫客户、患者或买家,“赢单”也可以改成已付款、已预约或已成交。目前它已经在诊所、房地产、知识付费、代理公司、网店和服务行业运行,电商方面还有原生的 Nuvemshop 集成。
我的客户数据存在哪里?存在你自己的 VPS 和你自己的 Supabase 项目里。有一点要提前规划:Supabase 免费套餐不会自动备份,所以 README 建议每天定时运行 backup.sh——update.sh 在每次更新前也会先做一次备份。
除了回复消息,这些 AI 智能体还能做什么?它们能直接操作 CRM:按租户隔离的 RAG、对话中途执行技能、情绪分析、自动跟进唤回快冷掉的对话、推进销售阶段,以及带审计记录的 AI 转人工交接。整个 CRM 都通过 MCP 开放,所以智能体可以像正式成员一样被分配任务——每个组织还设有消费上限。
这些智能体会随着时间越用越好吗?会——已解决的对话会转化成新的知识,还有一个 AI Evolution 页面,可以看到智能体是否在进步、错在哪里、还有哪些内容需要教它。智能体还会自己提出改进方案,以新版本的形式应用,但始终需要人来把关。
装好之后怎么更新?在界面里操作:菜单里会出现“新版本”提示,进入 Settings → Update 后会先备份数据库、再应用新版本,如果某个版本有问题会自动回滚。update.sh 在终端里做同样的事;两者都只针对打标签的正式版本(写 README 时是 v1.2.3),绝不更新到未经测试的 main 分支提交。
能让 AI 编程助手帮我完成安装吗?可以——仓库自带技能指南,可以加载到 Claude Code、Codex、Cursor、OpenCode 或 Antigravity 里,带着助手一步步完成安装、客户接入、指标分析或调整智能体提示词(比如在 Claude Code 里用 /deskcomm-instalar)。
What are similar projects?opendesk, LibreChat, ENZO, sim, lightspeed, hermes-agent, jevbox, os
Size
300.2 MB
Stars
4.7K
Age
5mo
Commits · 90 Days