Compare commits

...

8 Commits

9 changed files with 159 additions and 9 deletions

View File

@ -0,0 +1,36 @@
name: Deploy Dev
on:
push:
branches:
- dev
jobs:
deploy:
runs-on: omnichannel-uat
steps:
- name: Atualizar deploy
run: |
cd /opt/omnichannel
git pull origin dev
- name: Atualizar backend
run: |
cd /opt/omnichannel/backend
git pull origin dev
- name: Atualizar frontend
run: |
cd /opt/omnichannel/frontend
git pull origin dev
- name: Copiar envs
run: |
cp /home/desenvolvimento/.envs/omnichannel/deploy.env.development /opt/omnichannel/.env.development
cp /home/desenvolvimento/.envs/omnichannel/backend.env.development /opt/omnichannel/backend/.env.development
cp /home/desenvolvimento/.envs/omnichannel/frontend.env.development /opt/omnichannel/frontend/.env.development
- name: Rebuild todos containers
run: |
cd /opt/omnichannel
docker compose up -d --build

View File

@ -0,0 +1,57 @@
name: Diagnose SSH
on:
push:
branches:
- master
jobs:
diagnose:
name: Diagnostico SSH no servidor
runs-on: omnichannel-uat
steps:
- name: Status do sshd
shell: bash
run: |
echo "=== systemctl status sshd ==="
sudo systemctl status sshd --no-pager || true
- name: Logs recentes do sshd
shell: bash
run: |
echo "=== journalctl sshd (ultimas 50 linhas) ==="
sudo journalctl -u sshd -n 50 --no-pager || true
- name: Fail2ban status
shell: bash
run: |
echo "=== fail2ban-client status ==="
sudo fail2ban-client status 2>/dev/null || echo "fail2ban nao instalado ou sem permissao"
echo ""
echo "=== fail2ban jail sshd ==="
sudo fail2ban-client status sshd 2>/dev/null || echo "jail sshd nao encontrado"
- name: IPs banidos no fail2ban
shell: bash
run: |
echo "=== IPs banidos (iptables) ==="
sudo iptables -L f2b-sshd -n 2>/dev/null || sudo iptables -L -n 2>/dev/null | grep -A5 "f2b" || echo "Sem regras f2b encontradas"
- name: Conexoes SSH ativas e MaxStartups
shell: bash
run: |
echo "=== Conexoes na porta 60000 ==="
ss -tnp | grep ':60000' || echo "Nenhuma conexao ativa"
echo ""
echo "=== MaxStartups configurado ==="
sudo sshd -T 2>/dev/null | grep -i maxstartups || grep -i maxstartups /etc/ssh/sshd_config || echo "Configuracao padrao (10:30:100)"
- name: Quem esta logado
shell: bash
run: |
echo "=== Sessoes ativas ==="
who || true
echo ""
echo "=== Ultimos logins ==="
last -n 10 || true

6
.gitignore vendored
View File

@ -4,6 +4,10 @@ dist
*.log *.log
.DS_Store .DS_Store
# Repos clonados separadamente dentro do deploy
/backend/
/frontend/
# Backend Specific Ignore # Backend Specific Ignore
backend/node_modules backend/node_modules
backend/dist backend/dist
@ -14,4 +18,4 @@ backend/test-api-out.json
# Frontend Specific Ignore # Frontend Specific Ignore
frontend/node_modules frontend/node_modules
frontend/dist frontend/dist

View File

@ -4,6 +4,29 @@ Plataforma omnichannel para atendimento com foco inicial em WhatsApp. O sistema
O projeto foi construído para validar e evoluir um MVP de atendimento corporativo, com perfis de agente, supervisor e administrador. O projeto foi construído para validar e evoluir um MVP de atendimento corporativo, com perfis de agente, supervisor e administrador.
## Clonando o Projeto
Este repositório funciona como o repositório de deploy/orquestração. O backend e o frontend ficam em repositórios separados e devem ser clonados dentro das pastas esperadas pelo `docker-compose.yml`.
Em uma pasta vazia:
```bash
git clone https://chaleiradev.sothistelecom.com/Sothis/omnichannel-deploy.git .
git clone https://chaleiradev.sothistelecom.com/Sothis/omnichannel-backend.git backend
git clone https://chaleiradev.sothistelecom.com/Sothis/omnichannel-frontend.git frontend
```
Ao final, a estrutura deve ficar assim:
```txt
omnichannel/
├── backend/
├── frontend/
├── database/
├── docker-compose.yml
└── README.md
```
## Principais Recursos ## Principais Recursos
- Login corporativo via LDAP/Active Directory. - Login corporativo via LDAP/Active Directory.
@ -11,7 +34,7 @@ O projeto foi construído para validar e evoluir um MVP de atendimento corporati
- JWT próprio da aplicação com perfis e especialidades. - JWT próprio da aplicação com perfis e especialidades.
- Atendimento WhatsApp em tempo real via `whatsapp-web.js`. - Atendimento WhatsApp em tempo real via `whatsapp-web.js`.
- Socket.IO para atualização de chats/mensagens. - Socket.IO para atualização de chats/mensagens.
- Agente Virtual Sothis para triagem e roteamento. - Agente Virtual para triagem e roteamento.
- Fila por especialidade. - Fila por especialidade.
- Assumir, liberar, transferir e fechar atendimento. - Assumir, liberar, transferir e fechar atendimento.
- Abertura ativa com templates aprovados. - Abertura ativa com templates aprovados.
@ -31,10 +54,10 @@ O projeto foi construído para validar e evoluir um MVP de atendimento corporati
- TypeScript `^6.0`. - TypeScript `^6.0`.
- PostgreSQL via `pg`. - PostgreSQL via `pg`.
- Socket.IO `^4.8`. - Socket.IO `^4.8`.
- `whatsapp-web.js` `^1.34`. - `whatsapp-web.js` `^1.34`, usando Puppeteer/Chrome para controlar o WhatsApp Web.
- LDAP via `ldapts`. - LDAP via `ldapts`.
- JWT via `jsonwebtoken`. - JWT via `jsonwebtoken`.
- Logs com `winston`. - Logs com `NestJS`.
### Frontend ### Frontend
@ -74,7 +97,8 @@ omnichannel/
1. Configure `.env.development` na raiz com os dados do banco externo. 1. Configure `.env.development` na raiz com os dados do banco externo.
2. Garanta que o PostgreSQL externo esteja acessível a partir do container backend. 2. Garanta que o PostgreSQL externo esteja acessível a partir do container backend.
3. Suba backend e frontend: 3. Garanta que o backend consiga iniciar Chrome/Chromium para o Puppeteer usado pelo `whatsapp-web.js`.
4. Suba backend e frontend:
```bash ```bash
docker compose up -d --build docker compose up -d --build
@ -91,6 +115,19 @@ Health:
curl http://localhost:4001/health curl http://localhost:4001/health
``` ```
## Deploy Automatizado
O deploy deve seguir pelo Gitea Actions. O antigo fluxo manual via arquivo `.bat` não faz mais parte do processo recomendado.
Responsabilidades esperadas da pipeline:
- baixar/clonar os repositórios necessários;
- configurar variáveis de ambiente do ambiente alvo;
- buildar backend e frontend;
- subir os serviços com Docker Compose;
- executar validações pós-deploy;
- não gerenciar o banco dentro do compose.
## Como Rodar em Desenvolvimento ## Como Rodar em Desenvolvimento
Backend: Backend:
@ -130,7 +167,8 @@ Para ambiente novo, antes de subir backend para uso real:
2. aplicar as migrations em ordem; 2. aplicar as migrations em ordem;
3. validar tabelas principais; 3. validar tabelas principais;
4. criar/atribuir usuário admin; 4. criar/atribuir usuário admin;
5. subir backend e frontend. 5. validar Chrome/Chromium e volume de sessao WhatsApp para Puppeteer;
6. subir backend e frontend.
Detalhes em: Detalhes em:

@ -1 +0,0 @@
Subproject commit 8790ce70d05d0256ded89ea8fb9335afad41bfa8

View File

@ -0,0 +1,16 @@
-- Migration 024: Persistência de mensagens WhatsApp (Meta API)
CREATE TABLE mensagens (
id SERIAL PRIMARY KEY,
wamid VARCHAR(255) UNIQUE NOT NULL,
chat_id VARCHAR(50) NOT NULL,
from_me BOOLEAN NOT NULL DEFAULT FALSE,
type VARCHAR(50) NOT NULL DEFAULT 'text',
body TEXT,
sender_name VARCHAR(255),
status VARCHAR(20),
timestamp BIGINT NOT NULL,
created_at TIMESTAMP NOT NULL DEFAULT NOW()
);
CREATE INDEX idx_mensagens_chat_id ON mensagens(chat_id);
CREATE INDEX idx_mensagens_timestamp ON mensagens(timestamp);

View File

@ -1 +0,0 @@
ssh desenvolvimento@10.0.120.75 -p 60000 "/home/desenvolvimento/scripts/deploy-omnichannel-dev.sh"

View File

@ -3,6 +3,7 @@ services:
build: build:
context: ./frontend context: ./frontend
dockerfile: Dockerfile dockerfile: Dockerfile
restart: unless-stopped
ports: ports:
- "4000:3000" - "4000:3000"
@ -10,6 +11,7 @@ services:
build: build:
context: ./backend context: ./backend
dockerfile: Dockerfile dockerfile: Dockerfile
restart: unless-stopped
ports: ports:
- "4001:3001" - "4001:3001"
env_file: env_file:

@ -1 +0,0 @@
Subproject commit 7dc07c2a806d6352d2a84c333f09974d997918b0