Compare commits
3 Commits
7a72a028f7
...
3ed285c9d1
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
3ed285c9d1 | ||
|
|
6a21a4d711 | ||
|
|
bbfb9864bd |
40
README.md
40
README.md
@@ -19,6 +19,13 @@ Painel administrativo web para orquestração de agentes [Claude Code](https://d
|
||||
- Ative, desative, edite, **duplique** ou exclua a qualquer momento
|
||||
- Exporte/importe configurações completas em JSON
|
||||
|
||||
### Catálogo de Tarefas
|
||||
- Crie e gerencie tarefas reutilizáveis com nome, categoria e descrição detalhada
|
||||
- Categorias: Code Review, Segurança, Refatoração, Testes, Documentação, Performance
|
||||
- Filtro por texto e categoria
|
||||
- Execute qualquer tarefa diretamente no agente escolhido
|
||||
- Cards com truncamento inteligente e tooltip com descrição completa
|
||||
|
||||
### Execução de Tarefas
|
||||
- Execute tarefas sob demanda em qualquer agente ativo
|
||||
- Templates rápidos incluídos (detecção de bugs, revisão OWASP, refatoração, testes, documentação, performance)
|
||||
@@ -27,6 +34,7 @@ Painel administrativo web para orquestração de agentes [Claude Code](https://d
|
||||
|
||||
### Terminal em Tempo Real
|
||||
- Streaming chunk-a-chunk via WebSocket com indicador de conexão
|
||||
- **Botão Interromper** para cancelar todas as execuções ativas
|
||||
- **Busca** no output do terminal com navegação entre ocorrências
|
||||
- **Download** da saída completa como `.txt`
|
||||
- **Copiar** saída para a área de transferência
|
||||
@@ -50,7 +58,9 @@ Painel administrativo web para orquestração de agentes [Claude Code](https://d
|
||||
### Pipelines
|
||||
- Encadeie múltiplos agentes em fluxos sequenciais
|
||||
- Saída de cada passo alimenta o próximo via template `{{input}}`
|
||||
- **Diretório de trabalho** configurável por pipeline (pré-preenchido com base path)
|
||||
- Portões de aprovação humana entre passos (human-in-the-loop)
|
||||
- **Retomar pipelines falhas** a partir do passo onde pararam
|
||||
- Ideal para fluxos como "analisar → corrigir → testar"
|
||||
|
||||
### Webhooks
|
||||
@@ -87,18 +97,29 @@ Painel administrativo web para orquestração de agentes [Claude Code](https://d
|
||||
|
||||
A aplicação roda em container Docker na infraestrutura Nitro Cloud com HTTPS automático via Caddy + Let's Encrypt.
|
||||
|
||||
### Atualizar o sistema em produção
|
||||
### Deploy automático (recomendado)
|
||||
|
||||
Um único comando faz push e deploy completo:
|
||||
|
||||
```bash
|
||||
# 1. Push das alterações para o Gitea
|
||||
git push nitro main
|
||||
git deploy
|
||||
```
|
||||
|
||||
# 2. Conectar no servidor
|
||||
ssh -p 2222 fred@192.168.1.151
|
||||
O script `scripts/deploy.sh` executa automaticamente:
|
||||
|
||||
# 3. Atualizar código e rebuild do container
|
||||
cd ~/vps/apps/agents-orchestrator && git pull
|
||||
cd ~/vps && docker compose up -d --build agents-orchestrator
|
||||
1. Push para GitHub (origin) e Gitea (nitro)
|
||||
2. Backup dos dados no VPS (`data-backup-YYYYMMDD-HHMMSS`)
|
||||
3. Sincronização via rsync (exclui `data/`, `.git`, `node_modules`)
|
||||
4. Correção de permissões do diretório de dados
|
||||
5. Rebuild do container Docker
|
||||
6. Verificação do container e integridade dos dados
|
||||
7. Limpeza de backups antigos (mantém os 3 mais recentes)
|
||||
|
||||
Opções:
|
||||
|
||||
```bash
|
||||
git deploy # Push + deploy completo
|
||||
bash scripts/deploy.sh --skip-push # Apenas deploy, sem push
|
||||
```
|
||||
|
||||
### Verificar status
|
||||
@@ -121,6 +142,7 @@ ssh -p 2222 fred@192.168.1.151 "cd ~/vps && docker compose restart agents-orches
|
||||
| `HOST` | Endereço de bind | `0.0.0.0` |
|
||||
| `AUTH_TOKEN` | Token Bearer para autenticação da API | _(desabilitado)_ |
|
||||
| `ALLOWED_ORIGIN` | Origin permitida para CORS | `https://agents.nitro-cloud.duckdns.org` |
|
||||
| `ALLOWED_DIRECTORIES` | Diretórios permitidos para working directory (CSV) | _(todos)_ |
|
||||
| `WEBHOOK_SECRET` | Segredo HMAC para assinatura de webhooks | _(desabilitado)_ |
|
||||
| `CLAUDE_BIN` | Caminho para o binário do Claude CLI | _(auto-detectado)_ |
|
||||
| `REDIS_URL` | URL do Redis para cache L2 (opcional) | _(somente memória)_ |
|
||||
@@ -252,6 +274,7 @@ O executor invoca o binário `claude` com `--output-format stream-json`, parseia
|
||||
| `POST` | `/api/pipelines/:id/cancel` | Cancelar pipeline |
|
||||
| `POST` | `/api/pipelines/:id/approve` | Aprovar passo pendente |
|
||||
| `POST` | `/api/pipelines/:id/reject` | Rejeitar passo pendente |
|
||||
| `POST` | `/api/pipelines/resume/:execId` | Retomar pipeline falha |
|
||||
|
||||
### Webhooks
|
||||
|
||||
@@ -274,6 +297,7 @@ O executor invoca o binário `claude` com `--output-format stream-json`, parseia
|
||||
| `GET` | `/api/executions/:id` | Detalhes de uma execução |
|
||||
| `DELETE` | `/api/executions/:id` | Excluir execução do histórico |
|
||||
| `POST` | `/api/executions/:id/retry` | Reexecutar execução falha |
|
||||
| `POST` | `/api/executions/cancel-all` | Cancelar todas as execuções ativas |
|
||||
| `DELETE` | `/api/executions` | Limpar histórico |
|
||||
|
||||
### Notificações
|
||||
|
||||
@@ -3371,12 +3371,13 @@ tbody tr:hover td {
|
||||
color: var(--text-secondary);
|
||||
line-height: 1.5;
|
||||
display: -webkit-box;
|
||||
-webkit-line-clamp: 2;
|
||||
-webkit-line-clamp: 4;
|
||||
-webkit-box-orient: vertical;
|
||||
overflow: hidden;
|
||||
}
|
||||
|
||||
.task-card-footer {
|
||||
margin-top: 12px;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: space-between;
|
||||
|
||||
@@ -68,7 +68,7 @@ const TasksUI = {
|
||||
<h4 class="task-card-name">${Utils.escapeHtml(task.name)}</h4>
|
||||
<span class="badge ${categoryClass}">${Utils.escapeHtml(categoryLabel)}</span>
|
||||
</div>
|
||||
${task.description ? `<p class="task-card-description">${Utils.escapeHtml(task.description)}</p>` : ''}
|
||||
${task.description ? `<p class="task-card-description" title="${Utils.escapeHtml(task.description)}">${Utils.escapeHtml(task.description.length > 240 ? task.description.slice(0, 240) + '…' : task.description)}</p>` : ''}
|
||||
<div class="task-card-footer">
|
||||
<span class="task-card-date">
|
||||
<i data-lucide="calendar"></i>
|
||||
|
||||
79
scripts/deploy.sh
Executable file
79
scripts/deploy.sh
Executable file
@@ -0,0 +1,79 @@
|
||||
#!/bin/bash
|
||||
set -e
|
||||
|
||||
VPS_HOST="fred@192.168.1.151"
|
||||
VPS_PORT=2222
|
||||
VPS_APP_DIR="/home/fred/vps/apps/agents-orchestrator"
|
||||
VPS_COMPOSE_DIR="/home/fred/vps"
|
||||
SSH="ssh -p $VPS_PORT $VPS_HOST"
|
||||
|
||||
RED='\033[0;31m'
|
||||
GREEN='\033[0;32m'
|
||||
YELLOW='\033[1;33m'
|
||||
NC='\033[0m'
|
||||
|
||||
info() { echo -e "${GREEN}[deploy]${NC} $1"; }
|
||||
warn() { echo -e "${YELLOW}[deploy]${NC} $1"; }
|
||||
error() { echo -e "${RED}[deploy]${NC} $1"; }
|
||||
|
||||
SKIP_PUSH=false
|
||||
for arg in "$@"; do
|
||||
case "$arg" in
|
||||
--skip-push) SKIP_PUSH=true ;;
|
||||
esac
|
||||
done
|
||||
|
||||
if [ "$SKIP_PUSH" = false ]; then
|
||||
info "Fazendo push para origin..."
|
||||
git push origin main
|
||||
info "Fazendo push para nitro..."
|
||||
git push nitro main 2>/dev/null || warn "Push para nitro falhou (não crítico)"
|
||||
fi
|
||||
|
||||
info "Verificando dados no VPS antes do deploy..."
|
||||
DATA_FILES=$($SSH "ls -1 $VPS_APP_DIR/data/*.json 2>/dev/null | wc -l")
|
||||
info "Arquivos de dados encontrados: $DATA_FILES"
|
||||
|
||||
if [ "$DATA_FILES" -gt 0 ]; then
|
||||
info "Criando backup dos dados..."
|
||||
$SSH "cp -r $VPS_APP_DIR/data $VPS_APP_DIR/data-backup-\$(date +%Y%m%d-%H%M%S)"
|
||||
fi
|
||||
|
||||
info "Sincronizando código com o VPS..."
|
||||
rsync -avz --delete \
|
||||
--exclude='node_modules' \
|
||||
--exclude='data' \
|
||||
--exclude='data-backup-*' \
|
||||
--exclude='.git' \
|
||||
--exclude='.env' \
|
||||
--exclude='*.log' \
|
||||
-e "ssh -p $VPS_PORT" \
|
||||
./ "$VPS_HOST:$VPS_APP_DIR/"
|
||||
|
||||
info "Corrigindo permissões do diretório data..."
|
||||
$SSH "sudo chown -R 1000:1000 $VPS_APP_DIR/data"
|
||||
|
||||
info "Rebuilding container..."
|
||||
$SSH "cd $VPS_COMPOSE_DIR && docker compose up -d --build agents-orchestrator 2>&1 | tail -5"
|
||||
|
||||
info "Verificando container..."
|
||||
sleep 2
|
||||
STATUS=$($SSH "docker ps --filter name=agents-orchestrator --format '{{.Status}}'")
|
||||
if echo "$STATUS" | grep -q "Up"; then
|
||||
info "Container rodando: $STATUS"
|
||||
else
|
||||
error "Container não está rodando! Status: $STATUS"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
DATA_AFTER=$($SSH "ls -1 $VPS_APP_DIR/data/*.json 2>/dev/null | wc -l")
|
||||
info "Arquivos de dados após deploy: $DATA_AFTER"
|
||||
|
||||
if [ "$DATA_AFTER" -lt "$DATA_FILES" ]; then
|
||||
error "ALERTA: Menos arquivos de dados após deploy! ($DATA_FILES -> $DATA_AFTER)"
|
||||
error "Backup disponível em data-backup-*"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
$SSH "ls -dt $VPS_APP_DIR/data-backup-* 2>/dev/null | tail -n +4 | xargs rm -rf 2>/dev/null" || true
|
||||
info "Deploy concluído com sucesso!"
|
||||
Reference in New Issue
Block a user