Compare commits
8 Commits
refactor/m
...
master
| Author | SHA1 | Date | |
|---|---|---|---|
| bff12b122e | |||
| 7e371a3c7e | |||
| dccbf2a1a2 | |||
| ba5d0c03a4 | |||
| 1b865fbb09 | |||
| 309c51b620 | |||
| f4e6dc9fb0 | |||
| 1a294d6f1c |
36
.gitea/workflows/deploy-dev.yml
Normal file
36
.gitea/workflows/deploy-dev.yml
Normal 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
|
||||||
57
.gitea/workflows/diagnose-ssh.yml
Normal file
57
.gitea/workflows/diagnose-ssh.yml
Normal 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
|
||||||
4
.gitignore
vendored
4
.gitignore
vendored
@ -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
|
||||||
|
|||||||
48
README.md
48
README.md
@ -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
backend
1
backend
@ -1 +0,0 @@
|
|||||||
Subproject commit 8790ce70d05d0256ded89ea8fb9335afad41bfa8
|
|
||||||
16
database/migrations/024_mensagens.sql
Normal file
16
database/migrations/024_mensagens.sql
Normal 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);
|
||||||
@ -1 +0,0 @@
|
|||||||
ssh desenvolvimento@10.0.120.75 -p 60000 "/home/desenvolvimento/scripts/deploy-omnichannel-dev.sh"
|
|
||||||
@ -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
frontend
1
frontend
@ -1 +0,0 @@
|
|||||||
Subproject commit 7dc07c2a806d6352d2a84c333f09974d997918b0
|
|
||||||
Loading…
Reference in New Issue
Block a user