78 lines
3.2 KiB
Bash
78 lines
3.2 KiB
Bash
|
|
#!/bin/bash
|
|||
|
|
# Database Health Check Script
|
|||
|
|
# Quick verification of database status
|
|||
|
|
|
|||
|
|
echo "🏥 SkyArtShop Database Health Check"
|
|||
|
|
echo "====================================="
|
|||
|
|
echo ""
|
|||
|
|
|
|||
|
|
# Check PostgreSQL is running
|
|||
|
|
echo "1️⃣ PostgreSQL Status:"
|
|||
|
|
if sudo systemctl is-active --quiet postgresql; then
|
|||
|
|
echo " ✅ PostgreSQL is running"
|
|||
|
|
else
|
|||
|
|
echo " ❌ PostgreSQL is not running"
|
|||
|
|
exit 1
|
|||
|
|
fi
|
|||
|
|
echo ""
|
|||
|
|
|
|||
|
|
# Check backend server
|
|||
|
|
echo "2️⃣ Backend Server:"
|
|||
|
|
if pm2 list | grep -q "skyartshop-backend.*online"; then
|
|||
|
|
echo " ✅ Backend server is online"
|
|||
|
|
else
|
|||
|
|
echo " ⚠️ Backend server status unknown"
|
|||
|
|
fi
|
|||
|
|
echo ""
|
|||
|
|
|
|||
|
|
# Test database connection
|
|||
|
|
echo "3️⃣ Database Connection:"
|
|||
|
|
if node -e "const {pool}=require('./config/database');pool.query('SELECT 1').then(()=>{console.log(' ✅ Connection successful');pool.end();process.exit(0);}).catch(e=>{console.log(' ❌ Connection failed:',e.message);pool.end();process.exit(1);});" 2>/dev/null; then
|
|||
|
|
true
|
|||
|
|
else
|
|||
|
|
echo " ❌ Cannot connect to database"
|
|||
|
|
exit 1
|
|||
|
|
fi
|
|||
|
|
echo ""
|
|||
|
|
|
|||
|
|
# Check row counts
|
|||
|
|
echo "4️⃣ Data Status:"
|
|||
|
|
node -e "const {query,pool}=require('./config/database');(async()=>{try{const r=await query('SELECT (SELECT COUNT(*) FROM products) as products, (SELECT COUNT(*) FROM portfolioprojects) as portfolio, (SELECT COUNT(*) FROM blogposts) as blog, (SELECT COUNT(*) FROM pages) as pages');const d=r.rows[0];console.log(' Products:',d.products);console.log(' Portfolio:',d.portfolio);console.log(' Blog:',d.blog);console.log(' Pages:',d.pages);}catch(e){console.log(' ❌',e.message);}finally{await pool.end();}})()" 2>/dev/null
|
|||
|
|
echo ""
|
|||
|
|
|
|||
|
|
# Check indexes
|
|||
|
|
echo "5️⃣ Database Indexes:"
|
|||
|
|
node -e "const {query,pool}=require('./config/database');(async()=>{try{const r=await query(\"SELECT COUNT(*) as count FROM pg_indexes WHERE schemaname='public' AND tablename IN ('products','product_images','portfolioprojects','blogposts','pages')\");console.log(' Total indexes:',r.rows[0].count);}catch(e){console.log(' ❌',e.message);}finally{await pool.end();}})()" 2>/dev/null
|
|||
|
|
echo ""
|
|||
|
|
|
|||
|
|
# Test API endpoints
|
|||
|
|
echo "6️⃣ API Endpoints:"
|
|||
|
|
if curl -s http://localhost:5000/api/products > /dev/null 2>&1; then
|
|||
|
|
echo " ✅ /api/products"
|
|||
|
|
else
|
|||
|
|
echo " ❌ /api/products"
|
|||
|
|
fi
|
|||
|
|
|
|||
|
|
if curl -s http://localhost:5000/api/portfolio/projects > /dev/null 2>&1; then
|
|||
|
|
echo " ✅ /api/portfolio/projects"
|
|||
|
|
else
|
|||
|
|
echo " ❌ /api/portfolio/projects"
|
|||
|
|
fi
|
|||
|
|
|
|||
|
|
if curl -s http://localhost:5000/api/categories > /dev/null 2>&1; then
|
|||
|
|
echo " ✅ /api/categories"
|
|||
|
|
else
|
|||
|
|
echo " ❌ /api/categories"
|
|||
|
|
fi
|
|||
|
|
echo ""
|
|||
|
|
|
|||
|
|
# Cache performance
|
|||
|
|
echo "7️⃣ Cache Performance:"
|
|||
|
|
node -e "const {query,pool}=require('./config/database');(async()=>{try{const r=await query(\"SELECT CASE WHEN sum(heap_blks_hit)+sum(heap_blks_read)>0 THEN round(100.0*sum(heap_blks_hit)/(sum(heap_blks_hit)+sum(heap_blks_read)),2) ELSE 0 END as ratio FROM pg_statio_user_tables WHERE schemaname='public'\");const ratio=r.rows[0].ratio;const status=ratio>99?'✅':ratio>95?'⚠️':'❌';console.log(' ',status,'Cache hit ratio:',ratio+'%','(target: >99%)');}catch(e){console.log(' ❌',e.message);}finally{await pool.end();}})()" 2>/dev/null
|
|||
|
|
echo ""
|
|||
|
|
|
|||
|
|
echo "✅ Health check complete!"
|
|||
|
|
echo ""
|
|||
|
|
echo "To see detailed analysis, run:"
|
|||
|
|
echo " node analyze-queries.js"
|