Este guia descreve o passo a passo para colocar a solução no ar, partindo de uma máquina nova e utilizando os repositórios oficiais da Squad.
Instale as ferramentas básicas para rodar o projeto:
- Git;
- Java 21 (JDK);
- Node.js (LTS);
- VS Code (melhor para o Front-End);
- IntelliJ (melhorar para o Back-End).
-
Crie uma pasta no seu computador (ex:
C:\Projetos\Deneasy). -
Abra o terminal nesta pasta e clone os repositórios:
# Clone o Backend git clone https://github.com/squad6-deneasybot/deneasy-bot.git # Clone o Frontend git clone https://github.com/squad6-deneasybot/deneasy-admin-hub.git
Antes de subir o sistema, você precisa obter as chaves de acesso do e-mail e do WhatsApp.
Usamos o Mailtrap para testar o envio de códigos de segurança sem precisar de um servidor de e-mail real.
- O que fazer: Criar uma conta e acessar a caixa de entrada de testes (Sandbox).
- Tutoriais: Como configurar o Mailtrap (Youtube) ou Documentação Oficial.
- O que você precisa copiar de lá:
-
Username
-
Password
(Procure por "SMTP Settings" ou "Show Credentials" dentro da Inbox).
-
Necessário para o Bot funcionar no WhatsApp.
- O que fazer: Criar um App do tipo "Empresa" na Meta e configurar o produto "WhatsApp".
- Tutoriais: Configurando WhatsApp Cloud API (Youtube) ou Guia Oficial da Meta.
- O que você precisa copiar de lá:
- Token de Acesso: (Pode ser o temporário de 24h para teste rápido ou o Permanente de Usuário do Sistema).
- Phone ID (Identificação do número de telefone): O ID do número de teste ou real.
- App Secret (Chave Secreta do Aplicativo): Fica nas configurações básicas do App (necessário para segurança).
- Crie uma conta no Render.com.
- Crie o Banco de Dados:
- New + > PostgreSQL.
- Nome:
deneasy-db. - Copie a Internal DB URL gerada.
- Crie a Aplicação:
-
New + > Web Service.
-
Conecte o repositório
deneasy-bot. -
Runtime: Docker.
-
Preencha as Environment Variables abaixo:
Chave Valor / Onde encontrar DB_URLA Internal DB URL do banco criado no passo anterior. DB_USERUsuário do banco (veja no painel do Render). DB_PASSWORDSenha do banco (veja no painel do Render). MAILTRAP_USERO Username copiado na Parte 3.1. MAILTRAP_PASSO Password copiado na Parte 3.1. WHATSAPP_API_URLhttps://graph.facebook.com/v21.0/SEU_PHONE_ID/messages(Coloque o Phone ID da Parte 3.2).WHATSAPP_API_TOKENO Token copiado na Parte 3.2. WHATSAPP_APP_SECRETO App Secret copiado na Parte 3.2. WHATSAPP_VERIFY_TOKENCrie uma senha simples (ex: deneasy123) para usar na configuração do Webhook.DENEASY_SECURITY_COOKIE_SECUREtrueDENEASY_ENCRYPTION_SECRETInvente uma senha forte aleatória. DENEASY_ENCRYPTION_SALTInvente outra senha aleatória. JWT_SECRETInvente uma senha longa aleatória. FRONTEND_URLhttps://<dominio_do_projeto>.vercel.app(URL padrão prevista para o Frontend).
-
- Clique em Deploy Web Service.
Importante: o Banco de Dados usado pela Squad foi o Supabase. Criamos diretamente no Supabase usando o SQL Editor. Aqui está o código para caso queira — e recomendamos — usá-lo:
-- WARNING: This schema is for context only and is not meant to be run.
-- Table order and constraints may not be valid for execution.
CREATE TABLE company_table (
id BIGINT GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY,
name TEXT NOT NULL,
app_key TEXT NOT NULL UNIQUE,
app_secret TEXT NOT NULL,
created_at TIMESTAMP WITH TIME ZONE DEFAULT now() NOT NULL
);
CREATE TABLE super_admin_table (
id BIGINT GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY,
name TEXT NOT NULL,
email TEXT NOT NULL UNIQUE,
password_hash TEXT NOT NULL,
created_at TIMESTAMP WITH TIME ZONE DEFAULT now() NOT NULL
);
CREATE TABLE public.company_table (
id bigint NOT NULL DEFAULT nextval('company_table_id_seq'::regclass),
name character varying NOT NULL,
app_key text NOT NULL UNIQUE,
app_secret text NOT NULL,
created_at timestamp with time zone NOT NULL DEFAULT now(),
CONSTRAINT company_table_pkey PRIMARY KEY (id)
);
CREATE TABLE public.evaluation_table (
id bigint NOT NULL DEFAULT nextval('evaluation_table_id_seq'::regclass),
user_id bigint NOT NULL,
content text NOT NULL,
rating integer NOT NULL CHECK (rating >= 1 AND rating <= 5),
created_at timestamp with time zone NOT NULL DEFAULT now(),
CONSTRAINT evaluation_table_pkey PRIMARY KEY (id),
CONSTRAINT evaluation_table_user_id_fkey FOREIGN KEY (user_id) REFERENCES public.user_table(id)
);
CREATE TABLE public.report_subscription_table (
id bigint GENERATED ALWAYS AS IDENTITY NOT NULL,
user_id bigint NOT NULL,
frequency character varying NOT NULL CHECK (frequency::text = ANY (ARRAY['WEEKLY'::character varying::text, 'BIWEEKLY'::character varying::text, 'MONTHLY'::character varying::text])),
last_sent_at date,
CONSTRAINT report_subscription_table_pkey PRIMARY KEY (id),
CONSTRAINT report_subscription_user_id_fkey FOREIGN KEY (user_id) REFERENCES public.user_table(id)
);
CREATE TABLE public.super_admin_table (
id bigint NOT NULL DEFAULT nextval('super_admin_table_id_seq'::regclass),
name character varying NOT NULL,
email USER-DEFINED NOT NULL UNIQUE,
password_hash text NOT NULL,
created_at timestamp with time zone NOT NULL DEFAULT now(),
CONSTRAINT super_admin_table_pkey PRIMARY KEY (id)
);
CREATE TABLE public.user_table (
id bigint NOT NULL DEFAULT nextval('user_table_id_seq'::regclass),
company_id bigint NOT NULL,
name character varying NOT NULL,
email USER-DEFINED NOT NULL,
phone character varying,
profile character varying NOT NULL,
created_at timestamp with time zone NOT NULL DEFAULT now(),
session_token character varying,
CONSTRAINT user_table_pkey PRIMARY KEY (id),
CONSTRAINT user_table_company_id_fkey FOREIGN KEY (company_id) REFERENCES public.company_table(id)
);
CREATE TABLE public.wishlist_table (
id bigint GENERATED ALWAYS AS IDENTITY NOT NULL,
content text NOT NULL,
created_at timestamp with time zone NOT NULL,
user_id bigint NOT NULL,
CONSTRAINT wishlist_table_pkey PRIMARY KEY (id),
CONSTRAINT fkobicikgtb5iqq2or04218115d FOREIGN KEY (user_id) REFERENCES public.user_table(id)
);Adendo Essencial: Criar o primeiro acesso; registro de Super Admin
-- Senha padrão: "admin123" (Hash BCrypt)
INSERT INTO super_admin_table (name, email, password_hash)
VALUES ('Admin Inicial', '[email protected]', '$2a$10$N9qo8uLOickgx2ZMRZoMyeIjZAgcfl7p92ldGxad68LJZdL17lhWy');- Crie uma conta na Vercel.com.
- Add New... > Project > Importe
deneasy-admin-hub. - Nas Environment Variables, adicione:
VITE_API_URL: A URL do seu backend no Render (ex:https://<dominio_do_projeto>.onrender.com). (Sem barra no final).
- Clique em Deploy.
- Ativar o Webhook na Meta:
- Volte ao painel do App na Meta > WhatsApp > Configuração.
- Edite o Webhook.
- URL: Cole a URL do seu backend +
/webhook(ex:https://<dominio_do_projeto>.onrender.com/webhook). - Token: Coloque a senha que você inventou (
WHATSAPP_VERIFY_TOKEN). - Salve e assine o evento
messages.
- Testar:
- Mande um "Oi" no WhatsApp para o número de teste. O bot deve responder.
- Mesmo que possua as chaves de uma empresa, é necessário que o e-mail enviado seja de um registro real de usuário nessa empresa no ERP Omie. Além disso, o telefone que estiver mandando a mensagem também deve ser o mesmo desse usuário que está registrado no ERP. É uma camada extra de segurança às informações financeiras.
- Acesse o site na Vercel e tente logar (deve adicionar um usuário diretamente no banco de dados antes).
- Mande um "Oi" no WhatsApp para o número de teste. O bot deve responder.