Files
claude-plugins/infraestrutura/skills/server-health/SKILL.md
Emanuel Almeida 9404af7ac9 feat: sync all plugins, skills, agents updates
New plugins: core-tools
New skills: auto-expense, ticket-triage, design, security-check,
  aiktop-tasks, daily-digest, imap-triage, index-update, mindmap,
  notebooklm, proc-creator, tasks-overview, validate-component,
  perfex-module, report, calendar-manager
New agents: design-critic, design-generator, design-lead,
  design-prompt-architect, design-researcher, compliance-auditor,
  metabase-analyst, gitea-integration-specialist
Updated: all plugin configs, knowledge datasets, existing skills

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-05 17:16:32 +00:00

16 KiB
Raw Blame History

name, description, author, version, quality_score, user_invocable, desk_task
name description author version quality_score user_invocable desk_task
server-health Server health monitoring and diagnostics. Checks system resources, services status, and identifies issues. Use when user mentions "server health", "system check", "server status", "resource monitoring", "server diagnostics". Descomplicar® Crescimento Digital 2.0.0 75 true 1484

/server-health - Diagnóstico Completo de Servidor

Checklist sistemático para diagnosticar problemas de performance ou auditar estado do servidor CWP.


Servidor Alvo

Servidor IP MCP User
CWP Principal 176.9.3.158 ssh-unified root

Acesso:

mcp__ssh-unified__ssh_execute({
  server: "server",
  command: "<comando>"
})

Modos de Execução

Comando Descrição
/server-health Diagnóstico completo (todos os checks)
/server-health quick Apenas métricas críticas (load, RAM, disco)
/server-health mysql Focus em MySQL e bases de dados
/server-health ssl Verificação de todos os certificados SSL
/server-health sites Status de todos os sites WordPress

Workflow Completo

Passo 1: Sistema (Paralelo)

Executar em paralelo:

# Load average (3 valores: 1min, 5min, 15min)
uptime

# RAM e Swap
free -h

# Espaço em disco
df -h

# Top processos CPU
top -bn1 | head -20

# Load numérico
cat /proc/loadavg

# CPU/IO statistics
vmstat 1 3

# Processos específicos (Apache, MySQL, Nginx)
ps aux | grep -E 'httpd|mysql|nginx' | grep -v grep

Validação:

  • Load 1min <2 → OK
  • ⚠️ Load 1min 2-5 → Warning
  • Load 1min >5 → Critical
  • RAM <70% → OK
  • Swap >10% → Investigar causa

Passo 2: MySQL

# Status geral MySQL
mysqladmin status

# Processos activos
mysqladmin processlist | head -20

# Threads conectadas
mysql -e "SHOW GLOBAL STATUS LIKE 'Threads%';"

# Slow queries
mysql -e "SHOW GLOBAL STATUS LIKE 'Slow_queries';"

# Tamanho das BDs
mysql -e "SELECT table_schema AS 'Database',
           ROUND(SUM(data_length + index_length) / 1024 / 1024, 2) AS 'Size (MB)'
           FROM information_schema.TABLES
           GROUP BY table_schema
           ORDER BY SUM(data_length + index_length) DESC
           LIMIT 10;"

# Verificar se há tabelas corrompidas
mysqlcheck --all-databases --check

Queries Críticas:

-- Ver queries lentas em execução
SELECT id, user, host, db, command, time, state, LEFT(info, 100) as query
FROM information_schema.PROCESSLIST
WHERE command != 'Sleep'
  AND time > 5
ORDER BY time DESC;

-- BDs maiores que 500MB
SELECT table_schema,
       ROUND(SUM(data_length + index_length) / 1024 / 1024, 2) AS size_mb
FROM information_schema.TABLES
GROUP BY table_schema
HAVING size_mb > 500
ORDER BY size_mb DESC;

Passo 3: Web Servers

# Status Apache
systemctl status httpd --no-pager | head -15

# Status Nginx
systemctl status nginx --no-pager | head -15

# Testar localhost
curl -sI localhost | head -10

# Verificar GZIP
curl -sI -H 'Accept-Encoding: gzip' localhost | grep -i encoding

# Conexões activas
netstat -an | grep :80 | wc -l
netstat -an | grep :443 | wc -l

# Workers Apache
ps aux | grep httpd | wc -l

# Virtual hosts configurados
httpd -S 2>&1 | grep -E 'port|namevhost' | head -20

Passo 4: PHP

# Versão PHP
php -v | head -1

# Memory limit
php -i | grep memory_limit

# OPcache status
php -i | grep -E 'opcache.enable|opcache.memory_consumption'

# Processos PHP-FPM
ps aux | grep php-fpm | wc -l

# Configuração PHP-FPM (se existir)
php-fpm -tt 2>&1 | head -30

Passo 5: SSL/Certificados

# Listar todos os certificados instalados
ls -lh /root/.acme.sh/cwp_certs/

# Verificar próximas renovações (todos os domínios)
for d in $(ls /root/.acme.sh/cwp_certs/); do
  echo "=== $d ==="
  grep -E 'Le_NextRenewTimeStr|Le_Alt' /root/.acme.sh/cwp_certs/$d/*.conf 2>/dev/null | head -3
done

# Verificar certificados activos em Nginx
for conf in /etc/nginx/vhosts/*.conf; do
  domain=$(basename $conf .conf)
  echo "=== $domain ==="
  grep -E 'ssl_certificate|server_name' $conf | head -3
done

# Testar um domínio específico
echo | openssl s_client -connect DOMINIO:443 2>/dev/null | openssl x509 -noout -dates -subject

# Log de renovações recentes
tail -100 /root/.acme.sh/acme.sh.log | grep -E 'Renew|error|success'

Validação SSL:

  • Renovação >30 dias → OK
  • ⚠️ Renovação 15-30 dias → Avisar
  • Renovação <15 dias → Urgente

Passo 6: Segurança

# Fail2ban status
systemctl status fail2ban --no-pager 2>/dev/null || echo 'fail2ban não instalado'

# Jails activos
fail2ban-client status 2>/dev/null | head -10

# IPs banidos
fail2ban-client status sshd 2>/dev/null | grep "Banned IP"

# Portas abertas
netstat -tlnp | grep LISTEN | head -20

# Últimos logins SSH
last -10

# Tentativas SSH falhadas
grep "Failed password" /var/log/secure | tail -20

# Firewall activo?
systemctl status firewalld --no-pager || iptables -L -n | head -20

Passo 7: Sites WordPress

# Verificar todos os sites WordPress
for dir in /home/*/public_html; do
  if [ -f "$dir/wp-config.php" ]; then
    domain=$(basename $(dirname $dir))
    echo "=== $domain ==="

    # Versão WordPress
    grep "wp_version = " $dir/wp-includes/version.php | head -1

    # Tamanho wp-content
    du -sh $dir/wp-content

    # Plugins activos (via BD se possível)
    # Testar acesso HTTP
    curl -sI "http://$domain" | head -3
  fi
done

# Script de verificação completo
/root/scripts/check-wp-sites.sh 2>/dev/null || echo "Script não existe"

Template de Output

# 🔍 Server Health Report - YYYY-MM-DD HH:MM

## ⚡ Resumo Executivo

| Métrica | Valor | Status | Limite |
|---------|-------|--------|--------|
| Load (1m) | X.XX | ✅/⚠️/❌ | <2 |
| RAM Usada | XX% | ✅/⚠️/❌ | <70% |
| Swap Usado | XX% | ✅/⚠️/❌ | <10% |
| Disco / | XX% | ✅/⚠️/❌ | <70% |
| MySQL Threads | XX | ✅/⚠️/❌ | <50 |
| Slow Queries | XX | ✅/⚠️/❌ | <10 |
| Sites WP OK | XX/YY | ✅/⚠️/❌ | 100% |
| SSL Expiring | XX | ✅/⚠️/❌ | 0 |

**Health Score:** XX/100

---

## 🚨 Alertas Críticos

> [!danger] CRÍTICO
> - Load >5 há 10 minutos (possível loop infinito)
> - Swap 45% usado (memória insuficiente)

> [!warning] ATENÇÃO
> - 3 sites WordPress com erros HTTP 500
> - Certificado SSL solarfv360.pt expira em 12 dias

---

## 📊 Detalhes

### Sistema

Uptime: 45 days, 12:34 Load Average: 2.15, 1.89, 1.56 RAM: 12.5 GB / 16 GB (78%) ⚠️ Swap: 1.2 GB / 4 GB (30%) Disco /: 85 GB / 200 GB (42%)


**Top Processos CPU:**

PID USER %CPU %MEM COMMAND 1234 mysql 45.2 12.3 mysqld 5678 apache 8.5 2.1 httpd


### MySQL

**Status:**
- Uptime: 1,234,567 seconds
- Threads conectadas: 23 / 151 ✅
- Slow queries: 145 (total) ⚠️
- Queries/segundo: ~150

**BDs Grandes (>500MB):**
| Base de Dados | Tamanho |
|---------------|---------|
| ealmeida_desk24 | 1,234 MB |
| carstuff_prod | 856 MB |

**Queries Lentas Activas:**

id: 12345 | user: wp_user | time: 45s query: SELECT * FROM wp_posts WHERE...


### Web

**Apache:** ✅ Activo (145 workers)
**Nginx:** ✅ Activo (proxy reverso)
**Conexões:**
- HTTP (80): 23 conexões
- HTTPS (443): 67 conexões

**GZIP:** ✅ Activo

### PHP

**Versão:** PHP 8.1.27
**Memory Limit:** 256M
**OPcache:** ✅ Activo (128MB)
**PHP-FPM Workers:** 12

### SSL

**Certificados Instalados:** 34

**Renovações Próximas (<30 dias):**
| Domínio | Expira em | Status |
|---------|-----------|--------|
| solarfv360.pt | 12 dias | ⚠️ Renovar |
| emanuelalmeida.pt | 28 dias | ⚠️ Avisar |

**Problemas:**
- ❌ certificado_antigo.pt - Expirado há 5 dias

### Segurança

**Fail2ban:** ✅ Activo
**Jails:** sshd, apache-auth, nginx-limit
**IPs Banidos:** 45 (último: 123.45.67.89)

**Portas Abertas:**
- 22 (SSH) ✅
- 80 (HTTP) ✅
- 443 (HTTPS) ✅
- 3306 (MySQL) ⚠️ Público (deveria ser localhost only)

**Últimas Tentativas SSH Falhadas:**

2026-02-03 10:15 - Invalid user admin from 192.168.1.100 2026-02-03 09:45 - Failed password for root from 45.67.89.10


### Sites WordPress

**Total:** 15 sites
**OK:** 12 (80%) ✅
**Erros:** 3 (20%) ❌

**Sites com Erro:**
| Domínio | Erro | Acção |
|---------|------|-------|
| site-antigo.pt | HTTP 500 | Verificar error_log |
| teste.descomplicar.pt | HTTP 404 | Site desactivado? |

---

## 📋 Recomendações Prioritárias

### 🔴 URGENTE (Hoje)
1. ⚠️ Reduzir uso de Swap (45%) - Investigar processos
2. ❌ Renovar SSL solarfv360.pt (12 dias restantes)
3. ❌ Corrigir sites com HTTP 500 (3 sites)

### 🟡 IMPORTANTE (Esta Semana)
4. ⚠️ Optimizar queries lentas MySQL (145 total)
5. ⚠️ Limpar BDs grandes (ealmeida_desk24 1.2GB)
6. ⚠️ Fechar porta MySQL 3306 ao público

### 🟢 MELHORIAS (Mês)
7. ✅ Configurar alertas automáticos para Swap >20%
8. ✅ Criar backup automático de certificados SSL
9. ✅ Actualizar PHP para 8.2 (actualmente 8.1)

---

## 🔧 Troubleshooting Sugerido

### Swap Alto (>30%)
```bash
# Ver o que está a usar memória
ps aux --sort=-%mem | head -10

# Limpar swap (CUIDADO!)
swapoff -a && swapon -a

Load Alto (>5)

# Ver processos por CPU
ps aux --sort=-%cpu | head -10

# Ver I/O wait
iostat -x 1 5

# Identificar processo problemático
top -bn1 | head -20

MySQL Lento

# Ver queries activas
mysqladmin processlist

# Ver slow query log
tail -50 /var/log/mysql/slow.log

# Optimizar tabelas
mysqlcheck --optimize --all-databases

Sites WordPress com Erro

# Ver error log
tail -100 /home/USER/logs/error.log

# Verificar permissões
ls -lh /home/USER/public_html/wp-content

# Corrigir permissões
chown -R USER:USER /home/USER/public_html/wp-content

Gerado via /server-health v2.0 | Descomplicar®


**Instruções de Implementação:**
1. Executar comandos em paralelo quando possível (mcp__ssh-unified__ssh_execute)
2. Calcular health score: (checks OK / total checks) × 100
3. Gerar alertas baseados em thresholds
4. Agrupar recomendações por urgência
5. Incluir troubleshooting específico para cada problema detectado

---

## Thresholds de Alertas

| Métrica | ✅ OK | ⚠️ Warning | ❌ Critical |
|---------|-------|------------|-------------|
| **Load (1m)** | <2 | 2-5 | >5 |
| **RAM** | <70% | 70-85% | >85% |
| **Swap** | <10% | 10-30% | >30% |
| **Disco** | <70% | 70-85% | >85% |
| **MySQL Threads** | <50 | 50-100 | >100 |
| **Slow Queries** | 0 | 1-10 | >10 |
| **Sites WP OK** | 100% | 90-99% | <90% |
| **SSL Expiring** | >30d | 15-30d | <15d |

---

## Comandos SSH Específicos

### Verificação Rápida (Quick Mode)
```bash
# Uma linha com todas as métricas críticas
echo "=== QUICK HEALTH ===" && \
uptime && \
free -h | grep Mem && \
df -h | grep -E '^/dev/vda|Filesystem' && \
mysqladmin status 2>&1 | head -1 && \
systemctl is-active httpd nginx mysql

MySQL Deep Dive

# Optimizar todas as BDs
mysqlcheck --optimize --all-databases

# Limpar logs binários antigos (>7 dias)
mysql -e "PURGE BINARY LOGS BEFORE DATE_SUB(NOW(), INTERVAL 7 DAY);"

# Verificar fragmentação de tabelas
mysql -e "SELECT table_schema, table_name,
           ROUND(data_length/1024/1024,2) as data_mb,
           ROUND(data_free/1024/1024,2) as free_mb
           FROM information_schema.TABLES
           WHERE data_free > 0
           ORDER BY data_free DESC
           LIMIT 10;"

Limpeza de Cache/Temp

# Limpar cache WordPress (todos os sites)
find /home/*/public_html/wp-content/cache -type f -delete

# Limpar sessions PHP antigas
find /var/lib/php/session -type f -mtime +7 -delete

# Limpar logs Apache/Nginx >30 dias
find /home/*/logs -name "*.log" -mtime +30 -delete

Integração com MCPs

// Executar diagnóstico completo
async function serverHealthCheck() {
  // 1. Sistema (paralelo)
  const systemChecks = await Promise.all([
    mcp__ssh-unified__ssh_execute({server: "server", command: "uptime"}),
    mcp__ssh-unified__ssh_execute({server: "server", command: "free -h"}),
    mcp__ssh-unified__ssh_execute({server: "server", command: "df -h"}),
    mcp__ssh-unified__ssh_execute({server: "server", command: "top -bn1 | head -20"})
  ]);

  // 2. MySQL
  const mysqlStatus = await mcp__ssh-unified__ssh_execute({
    server: "server",
    command: "mysqladmin status && mysql -e \"SHOW GLOBAL STATUS LIKE 'Threads%';\""
  });

  // 3. SSL
  const sslCheck = await mcp__ssh-unified__ssh_execute({
    server: "server",
    command: "for d in $(ls /root/.acme.sh/cwp_certs/); do echo \"=== $d ===\"; grep Le_NextRenewTimeStr /root/.acme.sh/cwp_certs/$d/*.conf 2>/dev/null; done"
  });

  // Processar e gerar report
  return processHealthData(systemChecks, mysqlStatus, sslCheck);
}

Anti-Patterns

Anti-Pattern Problema Solução Correcta
Assumir SSH como root Pode falhar Verificar permissões primeiro
Executar comandos sequenciais Lento Paralelo quando possível
Ignorar exit codes Falhas silenciosas Validar cada comando
Não limpar recursos temp Consume espaço Limpeza em cada audit
Não documentar problemas Sem histórico Gravar em Desk/Obsidian

Checklist de Execução

  • SSH conecta (testar whoami)
  • Todas as métricas recolhidas (sistema, mysql, web, ssl)
  • Thresholds aplicados (calcular status)
  • Health score calculado
  • Alertas gerados (crítico/warning)
  • Recomendações priorizadas
  • Troubleshooting incluído
  • Report formatado (Markdown)
  • Opcional: Gravar em Desk ou Obsidian

Datasets Dify (Consulta Obrigatória)

Antes de executar diagnóstico complexo ou para troubleshooting específico:

Dataset ID Uso
TI (Tecnologia da Informação) 7f63ec0c-6321-488c-b107-980140199850 Diagnósticos gerais
Linux bde4eddd-4618-402c-8bfb-bb947ed9219d Comandos específicos
CWP Centos Web Panel b2a4d2c5-fe55-412c-bc28-74dbd611905d Configurações CWP

Consultar quando:

  • Problema não coberto por este guia
  • Optimização específica de serviço
  • Troubleshooting de erro desconhecido
  • Configuração avançada CWP/MySQL/Nginx
// Exemplo: pesquisar optimização MySQL
mcp__notebooklm__notebook_query, mcp__dify-kb__dify_kb_retrieve_segments({
  dataset_id: "7f63ec0c-6321-488c-b107-980140199850",
  query: "mysql slow query optimization innodb tuning",
  top_k: 3
})

Changelog

v2.0.0 (2026-02-03)

  • ENHANCED: Workflows detalhados para cada passo
  • Modos de execução (quick, mysql, ssl, sites)
  • Template de output completo com troubleshooting
  • Thresholds documentados
  • Comandos SSH específicos
  • Health score calculation
  • Integração MCPs documentada
  • Anti-patterns identificados
  • Checklist de execução

v1.0.0 (2026-01-30)

  • Versão inicial
  • Diagnóstico: Sistema, MySQL, Web, PHP, SSL, Segurança
  • Thresholds definidos
  • Output template markdown

Versão: 2.0.0 | Autor: Descomplicar® Última actualização: 2026-02-03 (Workflows completos + Troubleshooting)


Quando NÃO Usar

  • Para tarefas fora do domínio de especialização desta skill
  • Quando outra skill mais específica está disponível
  • Para operações que requerem aprovação manual obrigatória
  • Quando os requisitos não estão claramente definidos

Exemplos de Uso

Exemplo 1: Caso Básico

User: [requisição simples relacionada com server-health]
Skill: [execução directa com validação]
Output: [resultado conciso e accionável]

Exemplo 2: Caso Complexo

User: [requisição multi-passo ou complexa]
Skill:
  1. Análise dos requisitos
  2. Planeamento da abordagem
  3. Execução faseada
  4. Validação contínua
Output: [resultado detalhado com próximos passos]

Exemplo 3: Caso com Dependências

User: [requisição que depende de outros sistemas]
Skill:
  1. Verificar dependências disponíveis
  2. Coordenar com skills/MCPs necessários
  3. Executar workflow integrado
Output: [resultado completo com referências]