700 lines
12 KiB
Markdown
700 lines
12 KiB
Markdown
# 🚀 PM2 Production Deployment Guide - LuckyChit
|
|
|
|
Complete guide to deploy and manage your LuckyChit application using PM2 in production.
|
|
|
|
---
|
|
|
|
## 📋 Table of Contents
|
|
|
|
1. [Prerequisites](#prerequisites)
|
|
2. [Initial Setup](#initial-setup)
|
|
3. [Backend Deployment](#backend-deployment)
|
|
4. [Flutter App Deployment](#flutter-app-deployment)
|
|
5. [PM2 Commands](#pm2-commands)
|
|
6. [Monitoring & Logs](#monitoring--logs)
|
|
7. [Auto-Start on Server Reboot](#auto-start-on-server-reboot)
|
|
8. [Production Best Practices](#production-best-practices)
|
|
9. [Troubleshooting](#troubleshooting)
|
|
|
|
---
|
|
|
|
## Prerequisites
|
|
|
|
### System Requirements
|
|
- Node.js 16+ installed
|
|
- PostgreSQL database running
|
|
- PM2 installed globally
|
|
- nginx (optional, for reverse proxy)
|
|
|
|
### Install PM2 Globally
|
|
|
|
```bash
|
|
npm install -g pm2
|
|
```
|
|
|
|
Verify installation:
|
|
```bash
|
|
pm2 --version
|
|
```
|
|
|
|
---
|
|
|
|
## Initial Setup
|
|
|
|
### 1. Clone Repository (if not already done)
|
|
|
|
```bash
|
|
cd /var/www # or your preferred directory
|
|
git clone <your-repo-url> luckychit
|
|
cd luckychit
|
|
```
|
|
|
|
### 2. Setup Backend
|
|
|
|
```bash
|
|
cd backend
|
|
npm install --production
|
|
|
|
# Create .env file with production credentials
|
|
cp .env.example .env
|
|
nano .env # Edit with production values
|
|
```
|
|
|
|
**Important `.env` settings for production:**
|
|
|
|
```env
|
|
NODE_ENV=production
|
|
PORT=3000
|
|
DB_HOST=localhost
|
|
DB_PORT=5432
|
|
DB_NAME=chitfund_prod
|
|
DB_USER=your_db_user
|
|
DB_PASSWORD=your_secure_password
|
|
JWT_SECRET=your_very_secure_random_string_min_32_chars
|
|
```
|
|
|
|
### 3. Create Logs Directory
|
|
|
|
```bash
|
|
mkdir -p logs
|
|
```
|
|
|
|
### 4. Database Setup
|
|
|
|
```bash
|
|
# Create production database
|
|
createdb chitfund_prod
|
|
|
|
# Run migrations (if you have any)
|
|
# npm run migrate
|
|
```
|
|
|
|
---
|
|
|
|
## Backend Deployment
|
|
|
|
### Option 1: Using ecosystem.config.js (Recommended)
|
|
|
|
The `ecosystem.config.js` file is already configured in the backend directory.
|
|
|
|
**Start in Production Mode:**
|
|
|
|
```bash
|
|
cd backend
|
|
pm2 start ecosystem.config.js --env production
|
|
```
|
|
|
|
**Key Features Enabled:**
|
|
- ✅ Cluster mode (uses all CPU cores)
|
|
- ✅ Auto-restart on crashes
|
|
- ✅ Memory limit (1GB max)
|
|
- ✅ Log rotation
|
|
- ✅ Daily cron restart at 3 AM
|
|
- ✅ Error tracking with source maps
|
|
|
|
### Option 2: Simple Start Command
|
|
|
|
```bash
|
|
cd backend
|
|
pm2 start server.js --name "luckychit-backend" -i max --env production
|
|
```
|
|
|
|
### Verify Backend is Running
|
|
|
|
```bash
|
|
pm2 list
|
|
pm2 logs luckychit-backend
|
|
```
|
|
|
|
You should see:
|
|
```
|
|
✅ Database models synchronized
|
|
⏰ Starting payment reminder scheduler...
|
|
🚀 Server running on port 3000
|
|
```
|
|
|
|
---
|
|
|
|
## Flutter App Deployment
|
|
|
|
### Option 1: Deploy as Web App
|
|
|
|
**Build Flutter for Web:**
|
|
|
|
```bash
|
|
cd luckychit
|
|
flutter build web --release
|
|
```
|
|
|
|
**Serve with PM2 using http-server:**
|
|
|
|
```bash
|
|
# Install http-server globally
|
|
npm install -g http-server
|
|
|
|
# Start with PM2
|
|
pm2 start http-server --name "luckychit-web" -- -p 8080 -d false -c-1 build/web
|
|
```
|
|
|
|
**Or using a custom Node.js server:**
|
|
|
|
Create `luckychit/server.js`:
|
|
|
|
```javascript
|
|
const express = require('express');
|
|
const path = require('path');
|
|
const app = express();
|
|
const PORT = process.env.PORT || 8080;
|
|
|
|
app.use(express.static(path.join(__dirname, 'build/web')));
|
|
|
|
app.get('*', (req, res) => {
|
|
res.sendFile(path.join(__dirname, 'build/web', 'index.html'));
|
|
});
|
|
|
|
app.listen(PORT, () => {
|
|
console.log(`Flutter app running on port ${PORT}`);
|
|
});
|
|
```
|
|
|
|
Then start with PM2:
|
|
|
|
```bash
|
|
cd luckychit
|
|
npm install express
|
|
pm2 start server.js --name "luckychit-web"
|
|
```
|
|
|
|
### Option 2: Deploy as Mobile App
|
|
|
|
For Android/iOS, build and deploy to app stores:
|
|
|
|
```bash
|
|
# Android
|
|
cd luckychit
|
|
flutter build apk --release
|
|
flutter build appbundle --release
|
|
|
|
# iOS
|
|
flutter build ipa --release
|
|
```
|
|
|
|
Upload to Google Play Store / Apple App Store.
|
|
|
|
---
|
|
|
|
## PM2 Commands
|
|
|
|
### Basic Commands
|
|
|
|
```bash
|
|
# List all processes
|
|
pm2 list
|
|
pm2 ls
|
|
|
|
# Show detailed info
|
|
pm2 show luckychit-backend
|
|
|
|
# Monitor in real-time
|
|
pm2 monit
|
|
|
|
# Stop application
|
|
pm2 stop luckychit-backend
|
|
|
|
# Restart application
|
|
pm2 restart luckychit-backend
|
|
|
|
# Reload (zero-downtime restart)
|
|
pm2 reload luckychit-backend
|
|
|
|
# Delete from PM2
|
|
pm2 delete luckychit-backend
|
|
|
|
# Stop all
|
|
pm2 stop all
|
|
|
|
# Restart all
|
|
pm2 restart all
|
|
```
|
|
|
|
### Advanced Commands
|
|
|
|
```bash
|
|
# Restart with different env
|
|
pm2 restart luckychit-backend --env production
|
|
|
|
# Scale to 4 instances
|
|
pm2 scale luckychit-backend 4
|
|
|
|
# Reset restart counter
|
|
pm2 reset luckychit-backend
|
|
|
|
# Update PM2
|
|
pm2 update
|
|
```
|
|
|
|
---
|
|
|
|
## Monitoring & Logs
|
|
|
|
### View Logs
|
|
|
|
```bash
|
|
# View all logs (live)
|
|
pm2 logs
|
|
|
|
# View specific app logs
|
|
pm2 logs luckychit-backend
|
|
|
|
# View only errors
|
|
pm2 logs luckychit-backend --err
|
|
|
|
# View last 200 lines
|
|
pm2 logs luckychit-backend --lines 200
|
|
|
|
# Clear logs
|
|
pm2 flush
|
|
```
|
|
|
|
### Log Files Location
|
|
|
|
Logs are stored in:
|
|
```
|
|
backend/logs/
|
|
├── err.log # Error logs
|
|
├── out.log # Output logs
|
|
└── combined.log # Combined logs
|
|
```
|
|
|
|
### Real-time Monitoring
|
|
|
|
```bash
|
|
# CPU and Memory monitoring
|
|
pm2 monit
|
|
|
|
# Web-based monitoring (PM2 Plus - optional)
|
|
pm2 plus
|
|
```
|
|
|
|
### Install PM2 Log Rotate (Recommended)
|
|
|
|
```bash
|
|
pm2 install pm2-logrotate
|
|
|
|
# Configure log rotation
|
|
pm2 set pm2-logrotate:max_size 10M
|
|
pm2 set pm2-logrotate:retain 30
|
|
pm2 set pm2-logrotate:compress true
|
|
```
|
|
|
|
---
|
|
|
|
## Auto-Start on Server Reboot
|
|
|
|
### Generate Startup Script
|
|
|
|
```bash
|
|
# Generate startup script
|
|
pm2 startup
|
|
|
|
# This will output a command like:
|
|
# sudo env PATH=$PATH:/usr/bin pm2 startup systemd -u youruser --hp /home/youruser
|
|
|
|
# Copy and run the command it outputs
|
|
```
|
|
|
|
### Save Current Process List
|
|
|
|
```bash
|
|
pm2 save
|
|
```
|
|
|
|
Now PM2 will automatically restart your apps after server reboot!
|
|
|
|
### Test Auto-Start
|
|
|
|
```bash
|
|
# Reboot server
|
|
sudo reboot
|
|
|
|
# After reboot, check if apps are running
|
|
pm2 list
|
|
```
|
|
|
|
---
|
|
|
|
## Production Best Practices
|
|
|
|
### 1. Environment Variables
|
|
|
|
✅ **DO:**
|
|
- Use `.env` file for sensitive data
|
|
- Set `NODE_ENV=production`
|
|
- Use strong JWT secrets (min 32 characters)
|
|
- Use different credentials for production
|
|
|
|
❌ **DON'T:**
|
|
- Commit `.env` to Git
|
|
- Use development credentials in production
|
|
- Use weak or default passwords
|
|
|
|
### 2. Security
|
|
|
|
```bash
|
|
# Create limited user for PM2
|
|
sudo adduser pm2user
|
|
sudo -u pm2user pm2 start ecosystem.config.js
|
|
|
|
# Setup firewall
|
|
sudo ufw allow 3000/tcp # Backend port
|
|
sudo ufw allow 80/tcp # HTTP
|
|
sudo ufw allow 443/tcp # HTTPS
|
|
sudo ufw enable
|
|
```
|
|
|
|
### 3. Reverse Proxy with nginx (Recommended)
|
|
|
|
**Install nginx:**
|
|
|
|
```bash
|
|
sudo apt update
|
|
sudo apt install nginx
|
|
```
|
|
|
|
**Configure nginx:**
|
|
|
|
Create `/etc/nginx/sites-available/luckychit`:
|
|
|
|
```nginx
|
|
server {
|
|
listen 80;
|
|
server_name your-domain.com;
|
|
|
|
# Backend API
|
|
location /api {
|
|
proxy_pass http://localhost:3000;
|
|
proxy_http_version 1.1;
|
|
proxy_set_header Upgrade $http_upgrade;
|
|
proxy_set_header Connection 'upgrade';
|
|
proxy_set_header Host $host;
|
|
proxy_set_header X-Real-IP $remote_addr;
|
|
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
|
proxy_set_header X-Forwarded-Proto $scheme;
|
|
proxy_cache_bypass $http_upgrade;
|
|
}
|
|
|
|
# Flutter Web App
|
|
location / {
|
|
proxy_pass http://localhost:8080;
|
|
proxy_http_version 1.1;
|
|
proxy_set_header Upgrade $http_upgrade;
|
|
proxy_set_header Connection 'upgrade';
|
|
proxy_set_header Host $host;
|
|
proxy_cache_bypass $http_upgrade;
|
|
}
|
|
}
|
|
```
|
|
|
|
**Enable site:**
|
|
|
|
```bash
|
|
sudo ln -s /etc/nginx/sites-available/luckychit /etc/nginx/sites-enabled/
|
|
sudo nginx -t
|
|
sudo systemctl restart nginx
|
|
```
|
|
|
|
### 4. SSL Certificate (Let's Encrypt)
|
|
|
|
```bash
|
|
# Install certbot
|
|
sudo apt install certbot python3-certbot-nginx
|
|
|
|
# Get certificate
|
|
sudo certbot --nginx -d your-domain.com
|
|
|
|
# Auto-renewal is setup automatically
|
|
sudo certbot renew --dry-run
|
|
```
|
|
|
|
### 5. Database Backups
|
|
|
|
**Automated daily backup script:**
|
|
|
|
Create `backup.sh`:
|
|
|
|
```bash
|
|
#!/bin/bash
|
|
BACKUP_DIR="/var/backups/postgres"
|
|
DATE=$(date +%Y%m%d_%H%M%S)
|
|
mkdir -p $BACKUP_DIR
|
|
|
|
pg_dump -U your_db_user chitfund_prod > $BACKUP_DIR/backup_$DATE.sql
|
|
|
|
# Keep only last 7 days
|
|
find $BACKUP_DIR -name "backup_*.sql" -mtime +7 -delete
|
|
```
|
|
|
|
**Schedule with cron:**
|
|
|
|
```bash
|
|
crontab -e
|
|
|
|
# Add this line (runs daily at 2 AM):
|
|
0 2 * * * /path/to/backup.sh
|
|
```
|
|
|
|
### 6. Health Checks
|
|
|
|
Add health check endpoint in your backend:
|
|
|
|
```javascript
|
|
// In backend/server.js or routes
|
|
app.get('/health', (req, res) => {
|
|
res.status(200).json({
|
|
status: 'ok',
|
|
timestamp: new Date().toISOString(),
|
|
uptime: process.uptime()
|
|
});
|
|
});
|
|
```
|
|
|
|
Monitor with:
|
|
|
|
```bash
|
|
curl http://localhost:3000/health
|
|
```
|
|
|
|
---
|
|
|
|
## Troubleshooting
|
|
|
|
### ⚠️ CRITICAL: bcrypt "invalid ELF header" Error
|
|
|
|
**Symptoms:**
|
|
```
|
|
Error: /path/to/bcrypt_lib.node: invalid ELF header
|
|
code: 'ERR_DLOPEN_FAILED'
|
|
```
|
|
|
|
**Cause:** bcrypt was installed on Windows but running on Linux (native bindings are platform-specific)
|
|
|
|
**Solution:**
|
|
```bash
|
|
cd backend
|
|
|
|
# Remove all modules and rebuild for Linux
|
|
rm -rf node_modules package-lock.json
|
|
npm install
|
|
|
|
# Restart PM2
|
|
pm2 restart luckychit-backend
|
|
```
|
|
|
|
**Prevention:** Always run `npm install` on the target server, never copy `node_modules/` from another OS.
|
|
|
|
### App Crashes Immediately
|
|
|
|
```bash
|
|
# Check logs
|
|
pm2 logs luckychit-backend --lines 100
|
|
|
|
# Common issues:
|
|
# - Missing .env file
|
|
# - Database connection failed
|
|
# - Port already in use
|
|
# - Missing dependencies
|
|
# - Native module platform mismatch (bcrypt, etc.)
|
|
```
|
|
|
|
### Database Connection Issues
|
|
|
|
```bash
|
|
# Check PostgreSQL is running
|
|
sudo systemctl status postgresql
|
|
|
|
# Check connection
|
|
psql -U your_db_user -d chitfund_prod
|
|
|
|
# Check .env credentials
|
|
cat backend/.env
|
|
```
|
|
|
|
### Port Already in Use
|
|
|
|
```bash
|
|
# Find process using port 3000
|
|
lsof -i :3000
|
|
# or
|
|
netstat -tulpn | grep 3000
|
|
|
|
# Kill process
|
|
kill -9 <PID>
|
|
```
|
|
|
|
### High Memory Usage
|
|
|
|
```bash
|
|
# Check memory usage
|
|
pm2 monit
|
|
|
|
# Reduce instances if needed
|
|
pm2 scale luckychit-backend 2
|
|
|
|
# Or increase memory limit in ecosystem.config.js
|
|
max_memory_restart: '2G'
|
|
```
|
|
|
|
### Zero-Downtime Deployment
|
|
|
|
```bash
|
|
# Pull latest code
|
|
git pull origin main
|
|
|
|
# Install dependencies
|
|
cd backend && npm install
|
|
|
|
# Reload without downtime
|
|
pm2 reload luckychit-backend
|
|
|
|
# Or use deployment command
|
|
pm2 deploy production update
|
|
```
|
|
|
|
### Reset Everything
|
|
|
|
```bash
|
|
# Stop all PM2 processes
|
|
pm2 kill
|
|
|
|
# Remove saved process list
|
|
pm2 save --force
|
|
|
|
# Start fresh
|
|
cd backend
|
|
pm2 start ecosystem.config.js --env production
|
|
pm2 save
|
|
```
|
|
|
|
---
|
|
|
|
## Quick Reference Card
|
|
|
|
```bash
|
|
# Start
|
|
pm2 start ecosystem.config.js --env production
|
|
|
|
# Monitor
|
|
pm2 monit
|
|
|
|
# Logs
|
|
pm2 logs
|
|
|
|
# Restart
|
|
pm2 reload luckychit-backend
|
|
|
|
# Status
|
|
pm2 list
|
|
|
|
# Save
|
|
pm2 save
|
|
|
|
# Startup
|
|
pm2 startup
|
|
```
|
|
|
|
---
|
|
|
|
## 📊 Monitoring Dashboard (Optional)
|
|
|
|
### PM2 Plus (Free for 1 server)
|
|
|
|
```bash
|
|
# Register at https://pm2.io
|
|
pm2 plus
|
|
# Follow instructions to link
|
|
```
|
|
|
|
**Features:**
|
|
- Real-time monitoring
|
|
- Exception tracking
|
|
- Custom metrics
|
|
- Email alerts
|
|
- Transaction tracing
|
|
|
|
---
|
|
|
|
## 🎯 Production Checklist
|
|
|
|
Before going live:
|
|
|
|
- [ ] `.env` configured with production credentials
|
|
- [ ] Database setup and migrated
|
|
- [ ] PM2 installed and configured
|
|
- [ ] Logs directory created
|
|
- [ ] App starts successfully with PM2
|
|
- [ ] Auto-start on reboot configured (`pm2 startup` + `pm2 save`)
|
|
- [ ] nginx reverse proxy setup (optional but recommended)
|
|
- [ ] SSL certificate installed
|
|
- [ ] Database backups automated
|
|
- [ ] Monitoring setup (PM2 monit or PM2 Plus)
|
|
- [ ] Health check endpoint working
|
|
- [ ] Firewall configured
|
|
- [ ] Log rotation setup
|
|
- [ ] Test app functionality
|
|
- [ ] Load testing completed
|
|
|
|
---
|
|
|
|
## 🆘 Support
|
|
|
|
**PM2 Documentation:** https://pm2.keymetrics.io/docs/
|
|
**PM2 GitHub:** https://github.com/Unitech/pm2
|
|
|
|
---
|
|
|
|
## 📝 Example Production Workflow
|
|
|
|
```bash
|
|
# Initial deployment
|
|
cd /var/www/luckychit/backend
|
|
pm2 start ecosystem.config.js --env production
|
|
pm2 save
|
|
pm2 startup
|
|
|
|
# Updates (zero-downtime)
|
|
git pull origin main
|
|
npm install
|
|
pm2 reload luckychit-backend
|
|
|
|
# Daily monitoring
|
|
pm2 monit # Check performance
|
|
pm2 logs --lines 50 # Check recent logs
|
|
```
|
|
|
|
---
|
|
|
|
**Your LuckyChit app is now production-ready with PM2! 🚀**
|
|
|
|
_For additional support, refer to the PM2 documentation or your DevOps team._
|
|
|