562 lines
9.3 KiB
Markdown
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! 🎯**
|
|
|