chitfund/DEPLOYMENT_TROUBLESHOOTING.md

562 lines
9.3 KiB
Markdown

# 🔧 Deployment Troubleshooting Guide - LuckyChit
Common deployment issues and their solutions.
---
## 🚨 Critical Issues
### 1. bcrypt "invalid ELF header" Error
**Error Message:**
```
Error: /home/luckychit/apps/chitfund/backend/node_modules/bcrypt/lib/binding/napi-v3/bcrypt_lib.node: invalid ELF header
code: 'ERR_DLOPEN_FAILED'
```
**Why This Happens:**
- You installed `node_modules` on Windows
- You deployed to a Linux server
- bcrypt has **native C++ bindings** that are platform-specific
- Windows binaries cannot run on Linux
**✅ Solution (Run on Production Server):**
```bash
cd /home/luckychit/apps/chitfund/backend
# Stop PM2 process
pm2 stop luckychit-api
# Remove all node modules
rm -rf node_modules package-lock.json
# Reinstall on Linux (this will compile native bindings for Linux)
npm install
# Restart PM2
pm2 restart luckychit-api
# Check logs
pm2 logs luckychit-api
```
**✅ Prevention:**
1. **Never copy `node_modules/` between different operating systems**
2. **Add to your `.gitignore`** (already done):
```
node_modules/
```
3. **Always run `npm install` on the target server**
4. **Use the deployment script** which handles this automatically:
```bash
./deploy.sh production
```
**Alternative: Use bcryptjs (Pure JavaScript)**
If you continue having issues, you can switch to `bcryptjs` (no native bindings):
```bash
npm uninstall bcrypt
npm install bcryptjs
```
Then update your code:
```javascript
// Change this:
const bcrypt = require('bcrypt');
// To this:
const bcrypt = require('bcryptjs');
// The API is identical, no other changes needed!
```
---
## 🔥 Other Native Module Issues
**Similar errors with other packages:**
- `node-sass`
- `sharp`
- `sqlite3`
- `canvas`
- `node-gyp` related errors
**Solution (Same as bcrypt):**
```bash
rm -rf node_modules package-lock.json
npm install
pm2 restart your-app
```
---
## 📦 Common PM2 Issues
### App Won't Start - Crashes Immediately
**Check logs first:**
```bash
pm2 logs luckychit-api --lines 200
```
**Common causes:**
#### 1. Missing `.env` File
```bash
# Check if .env exists
ls -la /home/luckychit/apps/chitfund/backend/.env
# If not, create it
cp .env.example .env
nano .env # Edit with production credentials
```
#### 2. Database Connection Failed
```bash
# Check PostgreSQL is running
sudo systemctl status postgresql
# Test connection
psql -U your_db_user -d chitfund_prod
# Check .env has correct credentials
cat backend/.env | grep DB_
```
#### 3. Port Already in Use
```bash
# Find what's using port 3000
lsof -i :3000
# or
sudo netstat -tulpn | grep 3000
# Kill the process
kill -9 <PID>
# Or change port in .env
echo "PORT=3001" >> .env
```
#### 4. Missing Dependencies
```bash
cd backend
npm install
pm2 restart luckychit-api
```
---
### PM2 Shows "errored" Status
```bash
# Check detailed error
pm2 describe luckychit-api
# View recent logs
pm2 logs luckychit-api --lines 100
# Try manual start to see error
cd backend
node server.js
```
---
### App Keeps Restarting (Crash Loop)
```bash
# Check restart count
pm2 list
# View error logs
pm2 logs luckychit-api --err
# Common causes:
# - Syntax error in code
# - Missing environment variable
# - Database not accessible
# - Port conflict
```
**Reset restart counter:**
```bash
pm2 reset luckychit-api
```
---
## 🗄️ Database Issues
### Connection Refused
**Symptoms:**
```
Error: connect ECONNREFUSED 127.0.0.1:5432
```
**Solutions:**
1. **Check PostgreSQL is running:**
```bash
sudo systemctl status postgresql
sudo systemctl start postgresql
```
2. **Check PostgreSQL is listening:**
```bash
sudo netstat -tulpn | grep 5432
```
3. **Check `pg_hba.conf` allows connection:**
```bash
sudo nano /etc/postgresql/*/main/pg_hba.conf
# Should have:
local all all md5
host all all 127.0.0.1/32 md5
```
4. **Restart PostgreSQL:**
```bash
sudo systemctl restart postgresql
```
### Authentication Failed
**Symptoms:**
```
Error: password authentication failed for user "postgres"
```
**Solution:**
```bash
# Reset password
sudo -u postgres psql
ALTER USER your_db_user WITH PASSWORD 'new_password';
\q
# Update .env file
nano backend/.env
# Change DB_PASSWORD=new_password
```
### Database Does Not Exist
**Symptoms:**
```
Error: database "chitfund_prod" does not exist
```
**Solution:**
```bash
# Create database
sudo -u postgres psql
CREATE DATABASE chitfund_prod;
GRANT ALL PRIVILEGES ON DATABASE chitfund_prod TO your_db_user;
\q
# Run migrations
cd backend
npm run migrate # If you have migrations
```
---
## 🌐 Network Issues
### Cannot Access from External IP
**Check firewall:**
```bash
# Allow port 3000
sudo ufw allow 3000/tcp
# Check status
sudo ufw status
# Or disable temporarily for testing
sudo ufw disable
```
**Check if app is listening on 0.0.0.0:**
```bash
sudo netstat -tulpn | grep 3000
# Should show 0.0.0.0:3000 not 127.0.0.1:3000
```
**Fix in code:**
```javascript
// In server.js, ensure:
app.listen(PORT, '0.0.0.0', () => {
console.log(`Server running on port ${PORT}`);
});
```
### nginx 502 Bad Gateway
**Symptoms:**
- nginx returns 502 error
- Backend is running but not accessible through nginx
**Solutions:**
1. **Check backend is running:**
```bash
pm2 list
curl http://localhost:3000/api/health
```
2. **Check nginx configuration:**
```bash
sudo nginx -t
sudo systemctl restart nginx
```
3. **Check nginx error logs:**
```bash
sudo tail -f /var/log/nginx/error.log
```
4. **Verify proxy_pass URL is correct:**
```bash
sudo nano /etc/nginx/sites-available/luckychit
# Should have: proxy_pass http://localhost:3000;
```
---
## 💾 Permission Issues
### EACCES: permission denied
**Symptoms:**
```
Error: EACCES: permission denied, open '/path/to/file'
```
**Solutions:**
1. **Fix ownership:**
```bash
sudo chown -R $USER:$USER /home/luckychit/apps/chitfund
```
2. **Fix log directory permissions:**
```bash
mkdir -p backend/logs
chmod 755 backend/logs
```
3. **Run PM2 as correct user:**
```bash
# Don't use sudo with PM2 unless necessary
pm2 kill
pm2 start ecosystem.config.js --env production
```
---
## 🔄 Auto-Start Issues
### PM2 Doesn't Start After Reboot
**Check if startup is configured:**
```bash
pm2 startup
# Run the command it outputs
pm2 save
```
**Verify startup script exists:**
```bash
# For systemd:
systemctl status pm2-$USER
# Check logs:
journalctl -u pm2-$USER -n 50
```
**Re-configure if needed:**
```bash
pm2 unstartup
pm2 startup
# Run the command it outputs
pm2 save
```
---
## 📊 Performance Issues
### High Memory Usage
**Check memory:**
```bash
pm2 monit
# or
pm2 list
```
**Solutions:**
1. **Reduce PM2 instances:**
```bash
pm2 scale luckychit-api 2 # Reduce to 2 instances
```
2. **Increase memory limit in ecosystem.config.js:**
```javascript
max_memory_restart: '2G' // Increase from 1G
```
3. **Check for memory leaks:**
```bash
pm2 logs luckychit-api
# Look for memory warnings
```
### High CPU Usage
**Check CPU:**
```bash
top
# or
htop
```
**Solutions:**
1. **Reduce instances:**
```bash
pm2 scale luckychit-api 2
```
2. **Check for infinite loops in code**
3. **Optimize database queries**
---
## 🔍 Debugging Tips
### Enable Debug Mode
**Temporary debugging:**
```bash
pm2 stop luckychit-api
cd backend
NODE_ENV=production DEBUG=* node server.js
```
### Check All Logs
```bash
# PM2 logs
pm2 logs --lines 500
# System logs
journalctl -xe
# nginx logs (if using)
sudo tail -f /var/log/nginx/error.log
sudo tail -f /var/log/nginx/access.log
# PostgreSQL logs
sudo tail -f /var/log/postgresql/postgresql-*.log
```
### Test API Manually
```bash
# Test from server
curl http://localhost:3000/api/health
# Test with verbose output
curl -v http://localhost:3000/api/auth/login \
-H "Content-Type: application/json" \
-d '{"mobile":"9999999999","password":"password123"}'
```
---
## 🆘 Emergency Reset
**If everything is broken, start fresh:**
```bash
# Stop and remove all PM2 processes
pm2 kill
# Remove node_modules
cd /home/luckychit/apps/chitfund/backend
rm -rf node_modules package-lock.json
# Fresh install
npm install
# Start fresh
pm2 start ecosystem.config.js --env production
pm2 save
# Check status
pm2 list
pm2 logs
```
---
## 📞 Getting Help
When asking for help, provide:
1. **Error logs:**
```bash
pm2 logs luckychit-api --lines 200 > error.log
```
2. **PM2 status:**
```bash
pm2 list
pm2 describe luckychit-api
```
3. **Environment info:**
```bash
node --version
pm2 --version
cat /etc/os-release
```
4. **Configuration:**
```bash
cat backend/ecosystem.config.js
# (Don't share .env - contains secrets!)
```
---
## ✅ Prevention Checklist
- [ ] Never commit `node_modules/` to Git
- [ ] Always run `npm install` on production server
- [ ] Use `.env` for environment-specific config
- [ ] Keep `.env` out of Git (in `.gitignore`)
- [ ] Use PM2 startup for auto-restart
- [ ] Setup log rotation
- [ ] Monitor memory/CPU usage
- [ ] Setup database backups
- [ ] Test deployment in staging first
- [ ] Keep dependencies updated
- [ ] Document your deployment process
---
**Most issues are solved by rebuilding native modules on the production server! 🎯**