feat: WordPress Monitor API + Site Availability Checker
- Add POST /api/wp-monitor endpoint for WP plugin data - Add GET /api/wp-monitor for listing monitored sites - Add checkSiteAvailability() function for HTTP health checks - Add checkAllSitesAvailability() for batch checking - Add /api/scripts/check-sites.ts for cron execution - Add POST /api/monitor/check-sites for manual trigger DeskCRM Task: #1556 Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
50
api/scripts/check-sites.ts
Normal file
50
api/scripts/check-sites.ts
Normal file
@@ -0,0 +1,50 @@
|
||||
#!/usr/bin/env npx tsx
|
||||
/**
|
||||
* Site Availability Checker Script
|
||||
* Run via cron every 5-15 minutes to check if sites are online
|
||||
*
|
||||
* Usage:
|
||||
* npx tsx api/scripts/check-sites.ts
|
||||
*
|
||||
* Cron example (every 10 minutes):
|
||||
* */10 * * * * cd /path/to/DashDescomplicar && npx tsx api/scripts/check-sites.ts >> /var/log/check-sites.log 2>&1
|
||||
*
|
||||
* @author Descomplicar® | @link descomplicar.pt | @copyright 2026
|
||||
*/
|
||||
import 'dotenv/config'
|
||||
import { checkAllSitesAvailability } from '../services/monitoring.js'
|
||||
|
||||
async function main() {
|
||||
const startTime = Date.now()
|
||||
console.log(`[${new Date().toISOString()}] Starting site availability check...`)
|
||||
|
||||
try {
|
||||
const result = await checkAllSitesAvailability()
|
||||
|
||||
console.log(`[${new Date().toISOString()}] Check completed:`)
|
||||
console.log(` - Sites checked: ${result.checked}`)
|
||||
console.log(` - Up: ${result.up}`)
|
||||
console.log(` - Down: ${result.down}`)
|
||||
|
||||
// Log any down sites
|
||||
const downSites = result.results.filter(r => !r.available)
|
||||
if (downSites.length > 0) {
|
||||
console.log(` - Down sites:`)
|
||||
for (const site of downSites) {
|
||||
console.log(` - ${site.name}: ${site.error || 'No response'}`)
|
||||
}
|
||||
}
|
||||
|
||||
const elapsed = Date.now() - startTime
|
||||
console.log(`[${new Date().toISOString()}] Done in ${elapsed}ms`)
|
||||
|
||||
// Exit with code 1 if any sites are down (useful for alerting)
|
||||
process.exit(downSites.length > 0 ? 1 : 0)
|
||||
|
||||
} catch (error) {
|
||||
console.error(`[${new Date().toISOString()}] Error:`, error)
|
||||
process.exit(2)
|
||||
}
|
||||
}
|
||||
|
||||
main()
|
||||
63
api/scripts/hetzner-collector.ts
Normal file
63
api/scripts/hetzner-collector.ts
Normal file
@@ -0,0 +1,63 @@
|
||||
#!/usr/bin/env npx tsx
|
||||
/**
|
||||
* Hetzner Metrics Collector - Standalone Script
|
||||
* Pode ser executado via cron para recolha periódica de métricas
|
||||
*
|
||||
* Uso:
|
||||
* npx tsx api/scripts/hetzner-collector.ts
|
||||
* npx tsx api/scripts/hetzner-collector.ts --sync # Sync + Collect
|
||||
* npx tsx api/scripts/hetzner-collector.ts --cleanup # Collect + Cleanup
|
||||
* npx tsx api/scripts/hetzner-collector.ts --all # Sync + Collect + Cleanup
|
||||
*
|
||||
* Cron example (a cada 5 minutos):
|
||||
* */5 * * * * cd /path/to/DashDescomplicar && npx tsx api/scripts/hetzner-collector.ts >> /var/log/hetzner-collector.log 2>&1
|
||||
*
|
||||
* @author Descomplicar® | @link descomplicar.pt | @copyright 2026
|
||||
*/
|
||||
import 'dotenv/config'
|
||||
import {
|
||||
syncServers,
|
||||
collectAllMetrics,
|
||||
cleanupOldMetrics
|
||||
} from '../services/hetzner.js'
|
||||
|
||||
const args = process.argv.slice(2)
|
||||
const doSync = args.includes('--sync') || args.includes('--all')
|
||||
const doCleanup = args.includes('--cleanup') || args.includes('--all')
|
||||
|
||||
async function main() {
|
||||
const timestamp = new Date().toISOString()
|
||||
console.log(`[${timestamp}] Hetzner Collector Started`)
|
||||
console.log('='.repeat(50))
|
||||
|
||||
try {
|
||||
// 1. Sync servers (optional)
|
||||
if (doSync) {
|
||||
console.log('[SYNC] Sincronizando lista de servidores...')
|
||||
const synced = await syncServers()
|
||||
console.log(`[SYNC] ✅ ${synced} servidores sincronizados`)
|
||||
}
|
||||
|
||||
// 2. Collect metrics (always)
|
||||
console.log('[COLLECT] Recolhendo métricas...')
|
||||
const result = await collectAllMetrics()
|
||||
console.log(`[COLLECT] ✅ ${result.success} OK, ${result.failed} falharam`)
|
||||
|
||||
// 3. Cleanup old data (optional)
|
||||
if (doCleanup) {
|
||||
console.log('[CLEANUP] Limpando métricas antigas (>7 dias)...')
|
||||
const deleted = await cleanupOldMetrics(7)
|
||||
console.log(`[CLEANUP] ✅ ${deleted} entradas eliminadas`)
|
||||
}
|
||||
|
||||
console.log('='.repeat(50))
|
||||
console.log(`[${new Date().toISOString()}] Collector Finished Successfully`)
|
||||
process.exit(0)
|
||||
|
||||
} catch (error) {
|
||||
console.error('[ERROR] Collector failed:', error)
|
||||
process.exit(1)
|
||||
}
|
||||
}
|
||||
|
||||
main()
|
||||
Reference in New Issue
Block a user