Sistema de gestão empresarial com ERP, CRM, financeiro, assistência técnica e WhatsApp em uma stack Dockerizada e white-label.
O projeto foi organizado para subir uma instância completa por cliente, com backend Node.js + Express, frontend React + Vite, PostgreSQL, Redis, Evolution API e Nginx.
- ERP com produtos, estoque, pedidos, devoluções e créditos
- CRM com pipelines, leads, atividades, propostas e agenda
- Financeiro com contas, categorias, recorrências e projeção de fluxo de caixa
- Assistência técnica com ordens de serviço, checklist, peças e portal público
- Integração com WhatsApp via Evolution API
- Controle de acesso por permissões e identidade visual white-label
| Camada | Tecnologia |
|---|---|
| Frontend | React 18 + Vite + Axios + Recharts |
| Backend | Node.js + Express + WebSocket |
| Banco | PostgreSQL 16 |
| Cache / suporte WhatsApp | Redis 7 |
| Evolution API | |
| Proxy | Nginx |
Navegador
-> Nginx
-> /api -> Backend Express
-> /ws -> WebSocket
-> / -> Frontend React
Backend
-> PostgreSQL
-> Redis
-> Evolution API
O fluxo web atual usa sessão por cookie, não token salvo em localStorage.
- login em
POST /api/auth/login access_tokenevrx_refreshem cookiesHttpOnly- refresh automático em
401viaPOST /api/auth/refresh - redirecionamento para troca de senha quando
force_password_change = true
A senha precisa ter:
- no mínimo 8 caracteres
- pelo menos 1 letra minúscula
- pelo menos 1 letra maiúscula
- pelo menos 1 número
vortexys/
├── README.md
├── DOCS.md
├── deploy.sh
├── docker-compose.yml
├── .env.example
├── nginx/
├── backend/
└── frontend/
- Docker
- Docker Compose (
docker composeoudocker-compose) - Porta HTTP livre no host, por padrão
80
cp .env.example .env
nano .envDB_PASSWORD=troque_esta_senha
JWT_SECRET=gere_um_segredo_forte_com_32_bytes_ou_mais
DATA_ENCRYPTION_KEY=gere_outro_segredo_forte_com_32_bytes_ou_mais
ADMIN_NAME=Administrador
ADMIN_USERNAME=administrador
ADMIN_EMAIL=admin@seudominio.com
ADMIN_PASSWORD=SenhaForte2026!
EVOLUTION_API_KEY=troque_esta_chave
WA_WEBHOOK_SECRET=gere_um_hex_aleatorio
ALLOWED_ORIGIN=http://localhost
APP_URL=http://SEU_DOMINIO_OU_IP./deploy.sh./deploy.sh --cliente acme
./deploy.sh --porta 8080
./deploy.sh --no-cacheO docker-compose.yml sobe estes serviços:
postgres(vrx-db)redis(vrx-redis)evolution-api(vrx-evolution)backend(vrx-api)frontend(vrx-app)nginx(vrx-nginx)
O backend tenta criar o administrador inicial no boot usando ADMIN_NAME, ADMIN_USERNAME, ADMIN_EMAIL e ADMIN_PASSWORD.
Regras importantes:
- o admin só é criado se ainda não existir usuário com o mesmo email ou username
- a senha precisa atender a política atual
- no primeiro login, o usuário pode ser forçado a trocar a senha
Você pode customizar a identidade visual de duas formas.
Use Configurações -> Identidade visual para alterar nome, cores e logo sem rebuild.
Valores iniciais do frontend buildado:
VITE_COMPANY_NAMEVITE_PRIMARY_COLORVITE_SECONDARY_COLORVITE_LOGO_URLVITE_API_URL
docker compose logs -f
docker compose logs -f backend
docker compose logs -f nginxdocker compose up -d --build
docker compose restart backend
docker compose restart nginxdocker exec -it vrx-db psql -U vortexys vortexys
docker exec vrx-db pg_dump -U vortexys vortexys > backup_$(date +%Y%m%d).sqlcurl http://localhost/api/healthSe você quiser trabalhar fora do Docker:
cd backend
npm install
npm startcd frontend
npm install
npm run devObservações:
- o frontend usa Vite
- o backend expõe a API e o WebSocket na mesma aplicação Express
- em produção, o caminho recomendado continua sendo Docker + Nginx
- DOCS.md para a documentação técnica completa
- docker-compose.yml para a topologia da stack
- deploy.sh para o fluxo de deploy
- backend/src/server.js para o boot da API
- frontend/src/App.jsx para o mapa de rotas da SPA
- Dashboard e BI
- Produtos e estoque
- Pedidos, devoluções e créditos
- Clientes e vendedores
- CRM, agenda e propostas
- Financeiro e projeções
- Assistência técnica e portal público de OS
- WhatsApp e automações de atendimento
- Configurações, usuários e permissões
- o portal público de OS usa token dedicado e rate limit próprio
- dados sensíveis da assistência técnica usam proteção adicional no backend
- o WebSocket depende da sessão autenticada
- em produção, revise sempre
ALLOWED_ORIGIN,APP_URL,JWT_SECRET,DATA_ENCRYPTION_KEYe as credenciais do admin
Repositório interno do projeto Vortexys. Se este ambiente for distribuído por cliente, mantenha as credenciais, branding e segredos separados por instância.