chitfund/FIX_502_ERROR.md

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:

  1. Go to DNS settings
  2. Verify A record points to: 192.168.8.148
  3. Check "Proxy status":
    • 🟠 Proxied (through Cloudflare) - Recommended
    • DNS only (direct) - Bypass Cloudflare

Check Origin Rules

If using Cloudflare Tunnels or custom ports:

  1. Go to Network tab
  2. Check origin server settings
  3. Make sure it points to correct IP and port

SSL/TLS Settings

  1. Go to SSL/TLS tab
  2. Set to Flexible (if no SSL on origin) OR
  3. 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 status shows both processes online
  • curl http://localhost:3000/health returns JSON
  • curl http://localhost:8080 returns HTML
  • curl http://192.168.8.148:3000/health works
  • curl http://192.168.8.148:8080 works
  • Domain chitfund.deepteklabs.com loads in browser
  • No errors in pm2 logs
  • Login works
  • pm2 save executed (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:

  1. SSH into server
  2. Run pm2 status
  3. If down: pm2 restart all
  4. If missing: Recreate processes (see Fix 3)
  5. Test: curl http://localhost:3000/health
  6. 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!