8.6 KiB
🚨 Fix 502 Bad Gateway Error - Cloudflare
Error Details
- Domain: chitfund.deepteklabs.com
- Error: 502 Bad Gateway
- Time: 2025-11-06 00:26:51 UTC
- Status: Browser ✅ | Cloudflare ✅ | Origin Server ❌
🎯 What This Means
✅ Your browser is working
✅ Cloudflare (CDN) is working
❌ Your origin server is NOT responding or PM2 processes are down
🔍 IMMEDIATE DIAGNOSIS
SSH into your server and run these checks:
ssh luckychit@192.168.8.148
# 1. Check if PM2 processes are running
pm2 status
# 2. Check if ports are listening
netstat -tulpn | grep -E '(3000|8080)'
# 3. Check if server is responding locally
curl http://localhost:3000/health
curl http://localhost:8080
# 4. Check PM2 logs for errors
pm2 logs --lines 50
🚀 QUICK FIXES (Try in Order)
Fix 1: Restart PM2 Processes
pm2 restart all
pm2 status
Fix 2: PM2 Processes Are Down - Start Them
pm2 start luckychit-api
pm2 start luckychit-frontend
pm2 status
Fix 3: PM2 Lost Configuration - Recreate
cd /home/luckychit/apps/chitfund
# Start backend
cd backend
pm2 start src/server.js --name luckychit-api
# Start frontend
cd ../luckychit
pm2 serve build/web 8080 --name luckychit-frontend --spa
# Save configuration
pm2 save
pm2 status
Fix 4: Server Rebooted - Restore PM2
pm2 resurrect
# or
pm2 startup
pm2 save
Fix 5: Firewall Blocking Cloudflare
sudo ufw status
sudo ufw allow 3000/tcp
sudo ufw allow 8080/tcp
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
sudo ufw reload
🔧 DETAILED TROUBLESHOOTING
Step 1: Check PM2 Status
pm2 status
Expected Output:
┌────────────────────┬────┬─────────┬──────┬────────┐
│ App name │ id │ status │ PID │ memory │
├────────────────────┼────┼─────────┼──────┼────────┤
│ luckychit-api │ 0 │ online │ 1234 │ 50 MB │
│ luckychit-frontend │ 1 │ online │ 5678 │ 30 MB │
└────────────────────┴────┴─────────┴──────┴────────┘
If status is "stopped" or "errored":
pm2 logs --lines 100 # Check for errors
pm2 restart all # Restart processes
If processes don't exist:
# Recreate them (see Fix 3 above)
Step 2: Check if Ports are Listening
netstat -tulpn | grep -E '(3000|8080)'
Expected Output:
tcp6 0 0 :::3000 :::* LISTEN 1234/node
tcp6 0 0 :::8080 :::* LISTEN 5678/node
If nothing shows up:
- Processes are not running
- Start them with Fix 3
Step 3: Test Local Connectivity
# Test backend
curl http://localhost:3000/health
# Expected: {"status":"ok"...}
# Test frontend
curl http://localhost:8080
# Expected: HTML content
# Test from server IP
curl http://192.168.8.148:3000/health
curl http://192.168.8.148:8080
If these work but domain doesn't:
- Issue is with Cloudflare configuration
- See Cloudflare section below
Step 4: Check PM2 Logs
pm2 logs luckychit-api --lines 50
pm2 logs luckychit-frontend --lines 50
Look for errors like:
- Database connection errors
- Port already in use
- Module not found
- Crash/exception messages
Step 5: Check Firewall
sudo ufw status numbered
You should see:
[1] 22/tcp ALLOW IN Anywhere
[2] 3000/tcp ALLOW IN Anywhere
[3] 8080/tcp ALLOW IN Anywhere
[4] 80/tcp ALLOW IN Anywhere
[5] 443/tcp ALLOW IN Anywhere
If ports are missing:
sudo ufw allow 3000/tcp
sudo ufw allow 8080/tcp
sudo ufw reload
Step 6: Check Server Resources
# Check disk space
df -h
# If disk is full (100%), clear logs
# Check memory
free -h
# If memory is full, restart processes
# Check CPU
top
# Press 'q' to quit
☁️ CLOUDFLARE CONFIGURATION
Check DNS Settings
In Cloudflare dashboard:
- Go to DNS settings
- Verify A record points to: 192.168.8.148
- Check "Proxy status":
- 🟠 Proxied (through Cloudflare) - Recommended
- ⚪ DNS only (direct) - Bypass Cloudflare
Check Origin Rules
If using Cloudflare Tunnels or custom ports:
- Go to Network tab
- Check origin server settings
- Make sure it points to correct IP and port
SSL/TLS Settings
- Go to SSL/TLS tab
- Set to Flexible (if no SSL on origin) OR
- Set to Full (if origin has SSL)
For your setup (no nginx), use "Flexible"
🆘 EMERGENCY RECOVERY
Complete PM2 Reset
# Kill all PM2 processes
pm2 kill
# Navigate to project
cd /home/luckychit/apps/chitfund
# Start backend
cd backend
pm2 start src/server.js --name luckychit-api
# Verify backend
curl http://localhost:3000/health
# Start frontend
cd ../luckychit
pm2 serve build/web 8080 --name luckychit-frontend --spa
# Verify frontend
curl http://localhost:8080
# Save configuration
pm2 save
# Setup auto-start
pm2 startup systemd -u luckychit --hp /home/luckychit
# (Run the command it outputs)
pm2 save
# Check status
pm2 status
Server Reboot (Last Resort)
# Save PM2 list first
pm2 save
# Reboot
sudo reboot
# After reboot, SSH back in
ssh luckychit@192.168.8.148
# Check if PM2 auto-started
pm2 status
# If not:
pm2 resurrect
🔍 COMMON CAUSES
1. Server Rebooted
Symptom: PM2 processes not running
Fix: pm2 resurrect or restart manually
2. Out of Memory
Symptom: Processes killed by system
Fix: free -h to check, restart processes
3. Database Down
Symptom: Backend crashes on startup
Fix: Check PostgreSQL: sudo systemctl status postgresql
4. Port Conflict
Symptom: "Port already in use" in logs
Fix: Kill process using port or change port
5. Firewall Rule Changed
Symptom: Can't connect to ports
Fix: Re-add firewall rules
6. Cloudflare Configuration Changed
Symptom: 502 only on domain, not IP
Fix: Check Cloudflare DNS and SSL settings
📋 POST-FIX CHECKLIST
After fixing, verify:
pm2 statusshows both processes onlinecurl http://localhost:3000/healthreturns JSONcurl http://localhost:8080returns HTMLcurl http://192.168.8.148:3000/healthworkscurl http://192.168.8.148:8080works- Domain
chitfund.deepteklabs.comloads in browser - No errors in
pm2 logs - Login works
pm2 saveexecuted (for persistence)
🎯 PREVENTION
Setup Monitoring
# Check PM2 status regularly
pm2 status
# Setup auto-restart on crash (already enabled)
pm2 start src/server.js --name luckychit-api --watch false --autorestart
# Setup uptime monitoring
# Consider using: UptimeRobot, Pingdom, or StatusCake
Setup Alerts
Consider PM2 Plus for monitoring:
pm2 plus
# Follow setup instructions
📞 DIAGNOSTIC SCRIPT
Save this as diagnose-502.sh:
#!/bin/bash
echo "🔍 Diagnosing 502 Error"
echo "======================="
echo ""
echo "1. PM2 Status:"
pm2 status
echo ""
echo "2. Listening Ports:"
netstat -tulpn | grep -E '(3000|8080)'
echo ""
echo "3. Test Backend (localhost):"
curl -s http://localhost:3000/health || echo "❌ Backend not responding"
echo ""
echo "4. Test Frontend (localhost):"
curl -s http://localhost:8080 | head -n 5 || echo "❌ Frontend not responding"
echo ""
echo "5. Test Backend (IP):"
curl -s http://192.168.8.148:3000/health || echo "❌ Backend not responding on IP"
echo ""
echo "6. Firewall Status:"
sudo ufw status | grep -E '(3000|8080)'
echo ""
echo "7. Disk Space:"
df -h | grep -E '(Filesystem|/$)'
echo ""
echo "8. Memory Usage:"
free -h
echo ""
echo "9. Recent PM2 Logs (Errors):"
pm2 logs --err --lines 20 --nostream
echo ""
echo "✅ Diagnosis complete!"
Run it:
chmod +x diagnose-502.sh
./diagnose-502.sh
🎉 SUMMARY
502 Bad Gateway = Origin server not responding
Quick Fix:
- SSH into server
- Run
pm2 status - If down:
pm2 restart all - If missing: Recreate processes (see Fix 3)
- Test:
curl http://localhost:3000/health - Save:
pm2 save
Most Common Cause: Server rebooted and PM2 didn't auto-start
Best Fix: Run pm2 resurrect or restart manually
Need help? Run the diagnostic script and share the output!