← back to Cypress Awards

backend/check_server_status.sh

114 lines

#!/bin/bash
# Server Status Check - Runs daily at 6 AM
# Emails steve@designerwallcoverings.com with server status

cd /root/WebsitesMisc/cypresawards/backend

EMAIL="steve@designerwallcoverings.com"
LOG_FILE="/var/log/cypresawards_server_check.log"

# Start logging
echo "$(date): Starting server status check..." >> ${LOG_FILE}

# Initialize status details
STATUS_DETAILS=""

# 1. Check if server is reachable (ping)
if ping -c 3 45.61.58.125 &> /dev/null; then
    STATUS_DETAILS="${STATUS_DETAILS}✅ Server Ping: SUCCESS (3/3 packets received)\n"
else
    STATUS_DETAILS="${STATUS_DETAILS}❌ Server Ping: FAILED\n"
fi

# 2. Check web server (nginx port 80)
if curl -s -o /dev/null -w "%{http_code}" http://45.61.58.125/ | grep -q "200\|301\|302"; then
    STATUS_DETAILS="${STATUS_DETAILS}✅ Web Server (Port 80): UP\n"
else
    STATUS_DETAILS="${STATUS_DETAILS}❌ Web Server (Port 80): DOWN\n"
fi

# 3. Check frontend server (port 3500)
if curl -s -o /dev/null -w "%{http_code}" http://localhost:3500/ | grep -q "200"; then
    STATUS_DETAILS="${STATUS_DETAILS}✅ Frontend Server (Port 3500): UP\n"
else
    STATUS_DETAILS="${STATUS_DETAILS}❌ Frontend Server (Port 3500): DOWN\n"
fi

# 4. Check API server (port 3010)
if curl -s http://localhost:3010/api/stats | grep -q "success"; then
    STATUS_DETAILS="${STATUS_DETAILS}✅ API Server (Port 3010): UP\n"
else
    STATUS_DETAILS="${STATUS_DETAILS}❌ API Server (Port 3010): DOWN\n"
fi

# 5. Check database connectivity
DB_CHECK=$(node -e "
const { query } = require('./src/models/database');
(async () => {
  try {
    const result = await query('SELECT COUNT(*) FROM organizations LIMIT 1');
    console.log('OK');
  } catch (error) {
    console.log('ERROR');
  }
  process.exit(0);
})();
" 2>&1 | tail -1)

if echo "$DB_CHECK" | grep -q "OK"; then
    STATUS_DETAILS="${STATUS_DETAILS}✅ Database: CONNECTED\n"
else
    STATUS_DETAILS="${STATUS_DETAILS}❌ Database: CONNECTION FAILED\n"
fi

# 6. Get database stats
DB_STATS=$(node -e "
const { query } = require('./src/models/database');
(async () => {
  try {
    const orgs = await query('SELECT COUNT(*) as count FROM organizations');
    const cases = await query('SELECT COUNT(*) as count FROM legal_cases');
    const news = await query('SELECT COUNT(*) as count FROM news_articles');
    console.log('  - Organizations: ' + orgs.rows[0].count);
    console.log('  - Legal Cases: ' + cases.rows[0].count);
    console.log('  - News Articles: ' + news.rows[0].count);
  } catch (error) {
    console.log('  - Error getting stats');
  }
  process.exit(0);
})();
" 2>&1 | grep -E "  -")

STATUS_DETAILS="${STATUS_DETAILS}\nDatabase Statistics:\n${DB_STATS}\n"

# 7. Check disk usage
DISK_USAGE=$(df -h / | awk 'NR==2 {print $5}' | sed 's/%//')
STATUS_DETAILS="${STATUS_DETAILS}\nSystem Resources:\n"
STATUS_DETAILS="${STATUS_DETAILS}  - Disk Usage: ${DISK_USAGE}%\n"

if [ "$DISK_USAGE" -gt 80 ]; then
    STATUS_DETAILS="${STATUS_DETAILS}  ⚠️  WARNING: Disk usage above 80%\n"
fi

# 8. Check memory usage
MEMORY_USAGE=$(free | grep Mem | awk '{printf "%.0f", $3/$2 * 100}')
STATUS_DETAILS="${STATUS_DETAILS}  - Memory Usage: ${MEMORY_USAGE}%\n"

# 9. Check running processes
NODE_PROCESSES=$(ps aux | grep -E "node.*server.js" | grep -v grep | wc -l)
STATUS_DETAILS="${STATUS_DETAILS}  - Node.js Processes: ${NODE_PROCESSES}\n"

# Determine overall status
if echo -e "${STATUS_DETAILS}" | grep -q "❌"; then
    OVERALL_STATUS="⚠️ ISSUES DETECTED"
else
    OVERALL_STATUS="✅ ALL SYSTEMS OPERATIONAL"
fi

# Send email using Node.js script
echo "$(date): Sending status email..." >> ${LOG_FILE}
node send_status_email.js "${OVERALL_STATUS}" "$(echo -e ${STATUS_DETAILS})" >> ${LOG_FILE} 2>&1

echo "$(date): Server status check completed." >> ${LOG_FILE}
echo "" >> ${LOG_FILE}