🎨 Sloth Runner Web UI - Complete Guide¶
Uma interface web moderna e completa para gerenciar e monitorar o Sloth Runner em tempo real.
📸 Screenshots¶
Dashboard - Real-time Metrics¶
Dashboard principal com métricas do sistema em tempo real
Agent Dashboard - Detailed Monitoring¶
Monitoramento detalhado de agentes com filtros e estatísticas
Agent Control Center¶
Centro de controle com ações em massa e operações bulk
Stack Management¶
Gerenciamento completo de stacks e variáveis de ambiente
Agent Details - Complete Information¶
Detalhes completos do agente com 6 tabs (Overview, Processes, Network, Disk, Logs, Execute)
Live Metrics Charts¶
Gráficos de métricas atualizados em tempo real via WebSocket
📋 Índice¶
- Screenshots
- Visão Geral
- Iniciando
- Páginas da Interface
- Funcionalidades Principais
- API REST
- WebSocket Real-time
- Arquitetura
- Desenvolvimento
🌟 Visão Geral¶
A Web UI do Sloth Runner oferece uma interface moderna e responsiva para gerenciar todo o ecossistema de automação:
✨ Características Principais¶
- 🎯 Dashboard em Tempo Real - Métricas do sistema atualizadas automaticamente
- 🖥️ Gerenciamento de Agentes - Controle completo dos agentes distribuídos
- 📊 Monitoramento de Sistema - CPU, memória, disco e rede em tempo real
- 📦 Gerenciamento de Stacks - CRUD completo para ambientes e configurações
- 📋 Workflows (Sloths) - Gestão de workflows com estatísticas de execução
- ⚡ Hooks & Eventos - Sistema de automação baseado em eventos
- 🔐 Secrets & SSH - Gestão segura de credenciais e perfis de conexão
- 🎨 Tema Sloth - Interface moderna com paleta de cores temática
🚀 Iniciando¶
Instalação¶
A Web UI vem integrada com o binário principal do Sloth Runner. Nenhuma instalação adicional é necessária.
Iniciar o Servidor UI¶
# Porta padrão (8080)
sloth-runner ui
# Porta personalizada
sloth-runner ui --port 3000
# Com bind address específico
sloth-runner ui --bind-address 0.0.0.0 --port 8080
# Modo debug com logs detalhados
sloth-runner ui --debug
# Com autenticação (futuro)
sloth-runner ui --auth --username admin --password secure123
Acessar a Interface¶
Abra seu navegador em: http://localhost:8080
📄 Páginas da Interface¶
1. 🎯 Dashboard (Home)¶
URL: http://localhost:8080/
Página principal com visão geral completa do sistema.
Estatísticas Principais¶
- Total de Agentes - Número de agentes registrados
- Agentes Online - Agentes ativos no momento
- Total de Workflows - Workflows cadastrados no sistema
- Workflows Ativos - Workflows habilitados
- Total de Hooks - Hooks de eventos configurados
- Hooks Habilitados - Hooks ativos
- Eventos Pendentes - Eventos na fila de processamento
- Eventos Hoje - Eventos processados nas últimas 24h
Gráficos de Sistema (Tempo Real)¶
- CPU Usage - Uso de CPU do servidor master
- Memory Usage - Consumo de memória RAM
- Disk Usage - Espaço em disco utilizado
- Network I/O - Tráfego de rede (bytes sent/received)
Todos os gráficos são atualizados automaticamente via WebSocket a cada 5 segundos.
Feed de Atividades¶
Mostra as últimas ações do sistema: - Registro/desregistro de agentes - Execuções de workflows - Ativação/desativação de hooks - Eventos disparados
Tabela de Eventos Recentes¶
Lista os últimos 10 eventos processados com: - ID do evento - Tipo de evento - Status (pending, processing, completed, failed) - Timestamp - Ação rápida para visualizar detalhes
2. 🖥️ Agent Dashboard¶
URL: http://localhost:8080/agent-dashboard
Dashboard avançado para monitoramento detalhado de agentes.
Overview Cards¶
- Total Agents - Contagem total
- Online - Agentes conectados
- Average CPU - Uso médio de CPU
- Average Memory - Uso médio de memória
Sistema de Filtros¶
- All Agents - Mostrar todos
- Online - Somente online
- Offline - Somente offline
- Warning - Agentes com alertas (>80% recursos)
- Error - Agentes com problemas
Agent Cards¶
Cada agente exibe: - Status Indicator - Bolinha verde/vermelha pulsante - Nome do Agente - Identificador único - Endereço - IP:Port - Last Heartbeat - Tempo desde último heartbeat - CPU Gauge - Barra de progresso com uso de CPU - Memory Gauge - Barra de progresso com uso de memória - Uptime - Tempo desde inicialização - Botões de Ação: - 📊 Details - Visualizar detalhes completos - 🔄 Restart - Reiniciar agente - ❌ Remove - Remover agente
Agent Details Modal¶
Modal com 6 tabs para análise detalhada:
1. Overview Tab - Informações gerais do agente - Estatísticas de sistema - Histórico de heartbeats
2. Processes Tab
3. Network Tab
4. Disk Tab
5. Logs Tab
// Stream de logs em tempo real via SSE
- Timestamp
- Log Level (INFO, WARN, ERROR, DEBUG)
- Message
- Auto-scroll para novos logs
6. Execute Tab
# Executar comandos remotamente
Command: systemctl status nginx
[Execute Button]
# Output aparece em console formatado
3. 🎛️ Agent Control Center¶
URL: http://localhost:8080/agent-control
Centro de controle avançado para operações em massa.
Funcionalidades¶
Seleção em Massa - Checkbox em cada agente - Bulk Action Bar aparece ao selecionar
Ações em Massa: - ⚡ Execute Command - Executar comando em múltiplos agentes - 📁 Add to Group - Adicionar a um grupo - 🔄 Restart - Reiniciar agentes selecionados - ❌ Clear - Limpar seleção
Comandos em Bulk
# Modal permite executar em todos selecionados
Command: apt update && apt upgrade -y
☑ Execute in parallel
[Execute]
Criar Grupos
// Agrupar agentes para gestão
Group Name: production-servers
Description: Production web servers
[Create Group]
4. 📦 Stack Management¶
URL: http://localhost:8080/stacks
Gerenciamento completo de stacks (ambientes).
Estatísticas¶
- Total Stacks - Total de stacks criados
- Active - Stacks ativos
- Total Variables - Variáveis configuradas
- Total Secrets - Secrets armazenados
Stack Cards¶
Cada stack exibe: - Nome da Stack - Descrição - Environment Type (production, staging, development) - Status Badge (Active/Inactive) - Variáveis Count - Secrets Count - Última Execução - Botões: - 👁️ View - Visualizar detalhes - ✏️ Edit - Editar configuração - ❌ Delete - Remover stack
Criar Nova Stack¶
Stack Name: production
Description: Production environment
Environment Type: production
☑ Active
[Create Stack]
Gerenciar Variáveis¶
# Adicionar variável à stack
Stack: production
Key: DATABASE_URL
Value: postgres://...
[Add Variable]
# Variáveis aparecem na lista
DATABASE_URL = postgres://... [Delete]
API_KEY = xxxxxx [Delete]
5. 📋 Workflows (Sloths)¶
URL: http://localhost:8080/sloths
Gestão de workflows .sloth files.
Funcionalidades¶
- Lista de Workflows - Todos workflows registrados
- Busca e Filtro - Filtrar por nome ou status
- Estatísticas:
- Total de execuções
- Taxa de sucesso
- Última execução
- Tempo médio
Ações por Workflow: - ▶️ Run - Executar workflow - 👁️ View - Ver detalhes - ✏️ Edit - Editar código - 📊 Stats - Estatísticas detalhadas - 🔄 Activate/Deactivate - Alterar status - ❌ Delete - Remover
6. ⚡ Hooks & Events¶
URL: http://localhost:8080/hooks
Sistema de automação baseado em eventos.
Hooks Management¶
Lista de Hooks:
{
name: "slack-notify-failures",
event_type: "task.failed",
stack: "production",
enabled: true,
executions: 45,
success_rate: 98.2%
}
Ações: - ✅ Enable/Disable - Alternar status - 📊 History - Ver execuções - ✏️ Edit - Editar código Lua - ❌ Delete - Remover hook
Event Queue¶
Eventos em Tempo Real: - ID único - Tipo de evento - Status (pending, processing, completed, failed) - Timestamp - Dados do evento
Ações: - 🔄 Retry - Reprocessar evento falho - 👁️ View - Detalhes completos - 📋 Copy - Copiar payload
7. 🔐 Secrets Management¶
URL: http://localhost:8080/secrets
Gestão segura de credenciais (view-only na UI).
Funcionalidades¶
Listar Secrets: - Mostra apenas NOMES (não valores) - Organizado por stack - Última atualização - Usado por (workflows que usam)
Comandos CLI Integrados:
# Adicionar secret
sloth-runner secret add production DB_PASSWORD mysecret
# Listar secrets
sloth-runner secret list production
# Remover secret
sloth-runner secret remove production DB_PASSWORD
⚠️ Segurança: Valores de secrets NÃO são exibidos na UI por segurança.
8. 🔌 SSH Profiles¶
URL: http://localhost:8080/ssh
Gerenciamento de perfis SSH para conexões remotas.
Funcionalidades¶
Profile Cards:
Name: production-server
Host: 192.168.1.100
User: deploy
Port: 22
Auth Type: key
Last Used: 2 hours ago
Connection Count: 145
Ações: - ✏️ Edit - Atualizar configurações - 🧪 Test - Testar conexão - 📊 Audit - Ver logs de uso - ❌ Delete - Remover perfil
Criar Novo Perfil:
Name: staging-server
Host: staging.example.com
Port: 22
Username: admin
Auth Type: [Key / Password]
Private Key Path: ~/.ssh/id_rsa
[Save Profile]
Audit Log:
2025-01-06 14:30:15 - Connection established
2025-01-06 14:30:18 - Command executed: systemctl status nginx
2025-01-06 14:30:25 - File uploaded: app.tar.gz
2025-01-06 14:30:30 - Connection closed
🔌 API REST¶
A Web UI é construída sobre uma API REST completa.
Base URL¶
Endpoints¶
Dashboard¶
Agents¶
GET /api/v1/agents # Listar todos agentes
GET /api/v1/agents/:name # Detalhes de um agente
DELETE /api/v1/agents/:name # Remover agente
GET /api/v1/agents/:name/metrics # Métricas em tempo real
GET /api/v1/agents/:name/processes # Processos do agente
GET /api/v1/agents/:name/network # Estatísticas de rede
GET /api/v1/agents/:name/disk # Informações de disco
GET /api/v1/agents/:name/logs/stream # SSE stream de logs
POST /api/v1/agents/:name/exec # Executar comando remoto
POST /api/v1/agents/:name/restart # Reiniciar agente
Stacks¶
GET /api/v1/stacks # Listar stacks
GET /api/v1/stacks/:name # Detalhes da stack
POST /api/v1/stacks # Criar stack
PUT /api/v1/stacks/:name # Atualizar stack
DELETE /api/v1/stacks/:name # Deletar stack
POST /api/v1/stacks/:name/variables # Adicionar variável
DELETE /api/v1/stacks/:name/variables/:key # Remover variável
Workflows (Sloths)¶
GET /api/v1/sloths # Listar workflows
GET /api/v1/sloths/:name # Detalhes do workflow
POST /api/v1/sloths # Criar workflow
PUT /api/v1/sloths/:name # Atualizar workflow
DELETE /api/v1/sloths/:name # Deletar workflow
POST /api/v1/sloths/:name/activate # Ativar
POST /api/v1/sloths/:name/deactivate # Desativar
POST /api/v1/sloths/:name/run # Executar (futuro)
Hooks¶
GET /api/v1/hooks # Listar hooks
GET /api/v1/hooks/:id # Detalhes do hook
POST /api/v1/hooks # Criar hook
PUT /api/v1/hooks/:id # Atualizar hook
DELETE /api/v1/hooks/:id # Deletar hook
POST /api/v1/hooks/:id/enable # Habilitar
POST /api/v1/hooks/:id/disable # Desabilitar
GET /api/v1/hooks/:id/history # Histórico execuções
Events¶
GET /api/v1/events # Listar eventos
GET /api/v1/events/pending # Eventos pendentes
GET /api/v1/events/:id # Detalhes do evento
POST /api/v1/events/:id/retry # Reprocessar evento
System Metrics¶
Exemplo de Resposta¶
{
"agents": [
{
"name": "agent-01",
"address": "192.168.1.16:50051",
"status": "active",
"last_heartbeat": "2025-01-06T14:30:25Z",
"cpu_usage": 25.5,
"memory_usage": 42.3,
"uptime": 86400
}
],
"total": 1
}
🔄 WebSocket Real-time¶
A UI usa WebSocket para atualizações em tempo real.
Conexão¶
const ws = new WebSocket('ws://localhost:8080/api/v1/ws');
ws.onmessage = (event) => {
const data = JSON.parse(event.data);
console.log('Received:', data);
};
Tipos de Mensagens¶
1. System Metrics¶
{
"type": "system_metrics",
"timestamp": 1704548425,
"data": {
"cpu": {
"usage_percent": 45.2,
"cores": 8
},
"memory": {
"used": 8589934592,
"total": 17179869184,
"used_percent": 50.0
},
"disk": {
"used": 536870912000,
"total": 1099511627776,
"used_percent": 48.8
},
"network": {
"bytes_sent": 123456789,
"bytes_recv": 987654321
}
}
}
2. Agent Update¶
{
"type": "agent_update",
"timestamp": 1704548425,
"data": {
"name": "agent-01",
"status": "active",
"cpu_usage": 25.5,
"memory_usage": 42.3
}
}
3. Event Update¶
{
"type": "event_update",
"timestamp": 1704548425,
"data": {
"id": "evt-12345",
"event_type": "task.completed",
"status": "completed",
"data": {...}
}
}
4. Hook Execution¶
{
"type": "hook_execution",
"timestamp": 1704548425,
"data": {
"hook_id": 123,
"hook_name": "slack-notify",
"success": true,
"duration_ms": 125
}
}
🏗️ Arquitetura¶
Stack Tecnológico¶
Backend¶
- Framework: Gin (Go)
- WebSocket: gorilla/websocket
- Database: SQLite
- Metrics: gopsutil (CPU, memory, disk, network)
- Architecture: Clean Architecture / Hexagonal
Frontend¶
- HTML5/CSS3/JavaScript - Vanilla JS (sem frameworks pesados)
- Bootstrap 5.3.0 - UI responsiva
- Bootstrap Icons 1.11.0 - Ícones
- Chart.js 4.4.0 - Gráficos
- EventSource API - Server-Sent Events para logs
Estrutura de Diretórios¶
internal/webui/
├── server.go # Servidor HTTP principal
├── handlers/ # Request handlers
│ ├── agent.go # Endpoints de agentes
│ ├── dashboard.go # Dashboard
│ ├── event.go # Eventos
│ ├── hook.go # Hooks
│ ├── metrics.go # Métricas de sistema
│ ├── secret.go # Secrets
│ ├── sloth.go # Workflows
│ ├── ssh.go # SSH profiles
│ ├── stack.go # Stack management
│ ├── websocket.go # WebSocket hub
│ └── wrappers.go # Database wrappers
├── services/ # Business logic
│ └── agent_client.go # gRPC client para agentes
├── static/ # Assets estáticos
│ ├── css/
│ │ ├── main.css # Estilos principais
│ │ └── sloth-theme.css # Tema Sloth
│ └── js/
│ ├── navbar.js # Navigation
│ ├── dashboard.js # Dashboard logic
│ ├── agent-dashboard.js # Agent dashboard
│ ├── agent-control.js # Agent control
│ ├── stacks.js # Stack management
│ └── websocket.js # WebSocket client
└── templates/ # HTML templates
├── index.html # Dashboard
├── agent-dashboard.html # Agent monitoring
├── agent-control.html # Agent control
├── stacks.html # Stack management
├── workflows.html # Workflows
├── hooks.html # Hooks
├── events.html # Events
├── secrets.html # Secrets
└── ssh.html # SSH profiles
Databases Utilizadas¶
# Agent registry
.sloth-cache/agents.db
# Workflows
/etc/sloth-runner/sloths.db
# Hooks & Events
.sloth-cache/hooks.db
.sloth-cache/events.db
# Stacks
.sloth-cache/stacks.db
# Secrets (encrypted)
~/.sloth-runner/secrets.db
# SSH Profiles
~/.sloth-runner/ssh_profiles.db
Design Patterns¶
- Repository Pattern - Acesso a dados
- Service Layer - Lógica de negócio
- Dependency Injection - Handlers recebem dependências
- Observer Pattern - WebSocket para updates em tempo real
- Strategy Pattern - Diferentes tipos de métricas
🎨 Tema Sloth¶
A interface utiliza um tema customizado com paleta de cores dedicada:
:root {
/* Primary Colors */
--primary-color: #7C3AED; /* Roxo vibrante */
--primary-light: #A78BFA;
--primary-dark: #5B21B6;
/* Secondary Colors */
--secondary-color: #10B981; /* Verde sucesso */
--secondary-light: #6EE7B7;
--secondary-dark: #059669;
/* Accent Colors */
--accent-color: #F59E0B; /* Laranja destaque */
--accent-hover: #FBBF24;
/* Status Colors */
--success-color: #10B981;
--warning-color: #F59E0B;
--danger-color: #EF4444;
--info-color: #3B82F6;
/* Background */
--bg-primary: #FFFFFF;
--bg-secondary: #F9FAFB;
--bg-tertiary: #F3F4F6;
--bg-card: #FFFFFF;
/* Text */
--text-primary: #111827;
--text-secondary: #6B7280;
--text-muted: #9CA3AF;
/* Borders & Shadows */
--border-color: #E5E7EB;
--shadow-sm: 0 1px 2px 0 rgba(0, 0, 0, 0.05);
--shadow-md: 0 4px 6px -1px rgba(0, 0, 0, 0.1);
--shadow-lg: 0 10px 15px -3px rgba(0, 0, 0, 0.1);
--shadow-xl: 0 20px 25px -5px rgba(0, 0, 0, 0.1);
}
Componentes Reutilizáveis¶
Cards:
<div class="sloth-card">
<div class="sloth-card-header">
<h3>Title</h3>
</div>
<div class="sloth-card-body">
Content
</div>
</div>
Botões:
<button class="btn-sloth-primary">Primary Action</button>
<button class="btn-sloth-secondary">Secondary</button>
<button class="btn-sloth-danger">Delete</button>
Badges:
<span class="badge-sloth-success">Active</span>
<span class="badge-sloth-warning">Pending</span>
<span class="badge-sloth-danger">Failed</span>
🛠️ Desenvolvimento¶
Adicionar Nova Página¶
-
Criar Template HTML:
# internal/webui/templates/my-page.html <!DOCTYPE html> <html> <head> <link rel="stylesheet" href="/static/css/sloth-theme.css"> </head> <body> <div id="sloth-navbar"></div> <div class="container"> <!-- Seu conteúdo --> </div> <script src="/static/js/navbar.js"></script> <script src="/static/js/my-page.js"></script> </body> </html>
-
Criar Handler:
-
Registrar Rota:
-
Criar JavaScript:
// internal/webui/static/js/my-page.js async function loadData() { const response = await fetch('/api/v1/my-feature'); const data = await response.json(); displayData(data); } function displayData(data) { // Renderizar dados } // Carregar ao iniciar document.addEventListener('DOMContentLoaded', loadData);
Adicionar Métrica WebSocket¶
// internal/webui/handlers/metrics.go
func (h *MetricsHandler) collectMetrics() *SystemMetrics {
metrics := &SystemMetrics{
// ... métricas existentes
// Adicionar nova métrica
MyNewMetric: collectMyMetric(),
}
return metrics
}
// Broadcast automático a cada 5 segundos
func (h *MetricsHandler) collectMetricsPeriodically() {
ticker := time.NewTicker(5 * time.Second)
for range ticker.C {
metrics := h.collectMetrics()
h.wsHub.Broadcast("system_metrics", metrics)
}
}
// No frontend
function setupWebSocket() {
const ws = new WebSocket('ws://localhost:8080/api/v1/ws');
ws.onmessage = (event) => {
const msg = JSON.parse(event.data);
if (msg.type === 'system_metrics') {
updateMyMetric(msg.data.my_new_metric);
}
};
}
Hot Reload para Desenvolvimento¶
# Install air para hot reload
go install github.com/cosmtrek/air@latest
# Criar .air.toml
cat > .air.toml <<EOF
[build]
cmd = "go build -o tmp/sloth-runner ./cmd/sloth-runner"
bin = "tmp/sloth-runner ui"
exclude_dir = ["tmp", "vendor"]
include_ext = ["go", "html", "css", "js"]
EOF
# Executar com hot reload
air
🔒 Segurança¶
Autenticação (Planejado)¶
# Habilitar autenticação
sloth-runner ui --auth \
--username admin \
--password $(cat /dev/urandom | tr -dc 'a-zA-Z0-9' | fold -w 32 | head -n 1)
HTTPS (Planejado)¶
CORS¶
CORS está habilitado por padrão para desenvolvimento. Em produção, configure domínios permitidos:
// internal/webui/server.go
config := cors.DefaultConfig()
config.AllowOrigins = []string{"https://sloth.example.com"}
Rate Limiting (Planejado)¶
📊 Performance¶
Métricas de Performance¶
- Page Load: < 1s
- API Response: < 100ms (média)
- WebSocket Latency: < 50ms
- Chart Update: 60 FPS
- Concurrent Users: 100+ suportados
Otimizações¶
- Lazy Loading - Tabs carregam apenas quando clicados
- Debouncing - Filtros têm delay de 300ms
- Pagination - Listas grandes são paginadas
- Caching - Métricas cacheadas por 5s
- Compression - Gzip habilitado
🐛 Troubleshooting¶
Porta em uso¶
# Verificar processo
lsof -i :8080
# Matar processo
kill -9 <PID>
# Ou usar outra porta
sloth-runner ui --port 8081
WebSocket não conecta¶
# Verificar firewall
sudo ufw allow 8080/tcp
# Verificar se servidor está rodando
curl http://localhost:8080/api/v1/dashboard
Métricas não atualizam¶
# Verificar logs do servidor
sloth-runner ui --debug
# Verificar console do navegador (F12)
# Procurar por erros WebSocket
Agentes não aparecem¶
# Verificar banco de dados
sqlite3 .sloth-cache/agents.db "SELECT * FROM agents;"
# Verificar se master está rodando
sloth-runner agent list
🚀 Roadmap¶
Próximas Funcionalidades¶
- Autenticação Multi-usuário - Login e permissões
- Dark Mode - Tema escuro
- Execução de Workflows - Rodar workflows pela UI
- Editor de Código - Syntax highlighting para .sloth
- Logs Centralizados - Ver logs de todos agentes
- Notificações Push - Alertas em tempo real
- Dashboard Customizável - Widgets arrastáveis
- Exportação de Dados - CSV, JSON, PDF
- Mobile App - App nativo iOS/Android
- Multi-idioma - i18n support
- Grafana Integration - Dashboards externos
- Prometheus Metrics - Métricas exportadas
Melhorias de UI/UX¶
- Keyboard Shortcuts - Atalhos de teclado
- Search Global - Busca em toda interface
- Command Palette - Cmd+K para ações rápidas
- Drag & Drop - Upload de workflows
- Copy to Clipboard - Botões de copiar
- Tooltips Avançados - Mais informações ao hover
- Animated Transitions - Animações suaves
📚 Recursos Adicionais¶
💬 Suporte¶
🦥 Sloth Runner Web UI - Monitoramento e gestão simplificados para sua infraestrutura de automação.