fixed flutter theme issues
This commit is contained in:
parent
0d33f4ca55
commit
a8c3386f47
|
|
@ -1,382 +1,270 @@
|
||||||
# 📦 LuckyChit Deployment Files
|
# 📚 LuckyChit Deployment Documentation
|
||||||
|
|
||||||
This directory contains everything you need to deploy your LuckyChit application on Proxmox LXC.
|
Complete guide to deploying and updating your LuckyChit application.
|
||||||
|
|
||||||
## 📚 Documentation Files
|
|
||||||
|
|
||||||
### 1. **PROXMOX_DEPLOYMENT_GUIDE.md** ⭐ Main Guide
|
|
||||||
- **Comprehensive step-by-step deployment guide**
|
|
||||||
- Covers everything from LXC creation to production deployment
|
|
||||||
- Includes troubleshooting, security checklist, and maintenance
|
|
||||||
- **Time Required:** 30-45 minutes
|
|
||||||
- **Recommended for:** First-time deployments
|
|
||||||
|
|
||||||
### 2. **QUICK_DEPLOY.md** ⚡ Quick Reference
|
|
||||||
- **Quick command reference for experienced users**
|
|
||||||
- One-liner commands for common operations
|
|
||||||
- Useful paths and troubleshooting commands
|
|
||||||
- **Time Required:** 20-30 minutes
|
|
||||||
- **Recommended for:** Quick deployments or reference
|
|
||||||
|
|
||||||
### 3. **deploy.sh** 🤖 Automated Script
|
|
||||||
- **Automated deployment script**
|
|
||||||
- Installs all prerequisites automatically
|
|
||||||
- Sets up database, users, and configuration
|
|
||||||
- **Time Required:** 10-15 minutes + manual code deployment
|
|
||||||
- **Recommended for:** Fastest deployment
|
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## 🚀 Which Method Should You Use?
|
## 📖 Available Guides
|
||||||
|
|
||||||
### Option 1: Automated Script (Fastest) ⚡
|
### 🎯 Quick Start
|
||||||
|
- **`PRODUCTION_UPDATE_GUIDE.md`** ⭐ **START HERE** - Quick reference for updates
|
||||||
|
- **`PM2_QUICK_START.md`** - Get backend running in 5 minutes
|
||||||
|
|
||||||
**Best for:** Quick setup, first-time Linux users
|
### 📘 Detailed Guides
|
||||||
|
- **`PM2_PRODUCTION_GUIDE.md`** - Complete PM2 backend deployment
|
||||||
|
- **`FLUTTER_DEPLOYMENT_GUIDE.md`** - Complete Flutter frontend deployment
|
||||||
|
- **`DEPLOYMENT_TROUBLESHOOTING.md`** - Common issues and solutions
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🚀 Quick Commands
|
||||||
|
|
||||||
|
### Update Backend
|
||||||
```bash
|
```bash
|
||||||
# 1. Create Ubuntu 22.04 LXC on Proxmox
|
# On production server
|
||||||
# 2. Enter the container
|
cd backend
|
||||||
pct enter <container-id>
|
git pull origin main
|
||||||
|
npm install
|
||||||
# 3. Download and run the script
|
pm2 reload luckychit-api
|
||||||
curl -o deploy.sh https://raw.githubusercontent.com/YOUR_REPO/deploy.sh
|
|
||||||
chmod +x deploy.sh
|
|
||||||
sudo ./deploy.sh
|
|
||||||
|
|
||||||
# 4. Upload your code and deploy
|
|
||||||
# Follow the on-screen instructions
|
|
||||||
```
|
```
|
||||||
|
|
||||||
**Pros:**
|
### Update Frontend (Web)
|
||||||
- ✅ Fastest method
|
|
||||||
- ✅ Less room for error
|
|
||||||
- ✅ Automatically configures everything
|
|
||||||
|
|
||||||
**Cons:**
|
|
||||||
- ❌ Less learning opportunity
|
|
||||||
- ❌ Requires internet connection
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
### Option 2: Manual Deployment (Learning & Control) 📖
|
|
||||||
|
|
||||||
**Best for:** Understanding the system, custom configurations
|
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
# Follow PROXMOX_DEPLOYMENT_GUIDE.md step-by-step
|
# On your machine
|
||||||
|
cd luckychit
|
||||||
|
./deploy-web.sh
|
||||||
|
# Then upload build/web/* to server
|
||||||
```
|
```
|
||||||
|
|
||||||
**Pros:**
|
|
||||||
- ✅ Full control over every step
|
|
||||||
- ✅ Better understanding of the system
|
|
||||||
- ✅ Easy to customize
|
|
||||||
- ✅ Learn server administration
|
|
||||||
|
|
||||||
**Cons:**
|
|
||||||
- ❌ Takes longer
|
|
||||||
- ❌ More typing
|
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
### Option 3: Quick Commands (Experienced Users) ⚡
|
## 🛠️ Available Scripts
|
||||||
|
|
||||||
**Best for:** Experienced admins, subsequent deployments
|
### Backend Scripts (`backend/`)
|
||||||
|
- **`deploy.sh`** - Full backend deployment
|
||||||
|
- **`fix-bcrypt.sh`** - Fix native module issues
|
||||||
|
- **`ecosystem.config.js`** - PM2 configuration
|
||||||
|
|
||||||
|
### Frontend Scripts (`luckychit/`)
|
||||||
|
- **`deploy-web.sh`** - Build Flutter web (local)
|
||||||
|
- **`deploy-web-auto.sh`** - Build & upload to server
|
||||||
|
- **`build-android.sh`** - Build Android APK/AAB
|
||||||
|
- **`web-server.js`** - Express server for Flutter web
|
||||||
|
- **`ecosystem.config.js`** - PM2 configuration for web
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 📋 Common Scenarios
|
||||||
|
|
||||||
|
### Scenario 1: UI Changes Only
|
||||||
```bash
|
```bash
|
||||||
# Use QUICK_DEPLOY.md for rapid deployment
|
cd luckychit
|
||||||
# Copy-paste command blocks
|
flutter build web --release
|
||||||
|
# Upload to server
|
||||||
```
|
```
|
||||||
|
**Time:** 2-3 minutes | **Downtime:** None
|
||||||
|
|
||||||
**Pros:**
|
### Scenario 2: Backend Changes Only
|
||||||
- ✅ Fast for experienced users
|
```bash
|
||||||
- ✅ Good for reference
|
cd backend
|
||||||
- ✅ Flexible
|
pm2 reload luckychit-api
|
||||||
|
```
|
||||||
|
**Time:** 30 seconds | **Downtime:** None
|
||||||
|
|
||||||
**Cons:**
|
### Scenario 3: Both UI and Backend
|
||||||
- ❌ Requires Linux experience
|
1. Update backend first
|
||||||
- ❌ Easy to miss steps if not careful
|
2. Then update frontend
|
||||||
|
**Time:** 5 minutes | **Downtime:** None
|
||||||
|
|
||||||
|
### Scenario 4: Database Changes
|
||||||
|
1. Backup database first
|
||||||
|
2. Update backend with migrations
|
||||||
|
3. Test thoroughly
|
||||||
|
**Time:** 10-15 minutes | **Downtime:** Possible
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## 🗂️ Project Structure After Deployment
|
## 🎯 First Time Setup
|
||||||
|
|
||||||
|
### Backend
|
||||||
|
```bash
|
||||||
|
# Install PM2
|
||||||
|
npm install -g pm2
|
||||||
|
|
||||||
|
# Deploy backend
|
||||||
|
cd backend
|
||||||
|
./deploy.sh production
|
||||||
|
pm2 startup
|
||||||
|
pm2 save
|
||||||
```
|
```
|
||||||
/home/luckychit/
|
|
||||||
├── apps/
|
|
||||||
│ └── chitfund/
|
|
||||||
│ ├── backend/ # Node.js backend
|
|
||||||
│ │ ├── src/
|
|
||||||
│ │ ├── .env # Environment variables (KEEP SECURE!)
|
|
||||||
│ │ └── package.json
|
|
||||||
│ └── luckychit/ # Flutter frontend
|
|
||||||
│ ├── lib/
|
|
||||||
│ ├── build/web/ # Built web files
|
|
||||||
│ └── pubspec.yaml
|
|
||||||
├── logs/ # Application logs
|
|
||||||
├── backups/ # Database backups
|
|
||||||
└── backup-db.sh # Backup script
|
|
||||||
|
|
||||||
/var/www/luckychit/ # Nginx web root (Flutter web)
|
### Frontend Web
|
||||||
/etc/nginx/sites-available/ # Nginx configuration
|
```bash
|
||||||
/var/log/nginx/ # Nginx logs
|
# Build
|
||||||
|
cd luckychit
|
||||||
|
flutter build web --release
|
||||||
|
|
||||||
|
# Deploy to nginx
|
||||||
|
sudo cp -r build/web/* /var/www/luckychit/
|
||||||
|
|
||||||
|
# Or use PM2
|
||||||
|
npm install express
|
||||||
|
pm2 start ecosystem.config.js --env production
|
||||||
```
|
```
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## 📋 Deployment Checklist
|
## ⚠️ Common Issues
|
||||||
|
|
||||||
|
### Backend: bcrypt Error
|
||||||
|
```bash
|
||||||
|
cd backend
|
||||||
|
./fix-bcrypt.sh
|
||||||
|
```
|
||||||
|
|
||||||
|
### Frontend: Old UI Still Showing
|
||||||
|
- Hard refresh browser: Ctrl+Shift+R
|
||||||
|
- Clear browser cache
|
||||||
|
- Check files updated on server
|
||||||
|
|
||||||
|
### PM2 Not Starting
|
||||||
|
```bash
|
||||||
|
pm2 logs luckychit-api --lines 100
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 📞 Getting Help
|
||||||
|
|
||||||
|
1. Check relevant guide in the list above
|
||||||
|
2. Check `DEPLOYMENT_TROUBLESHOOTING.md`
|
||||||
|
3. View logs: `pm2 logs`
|
||||||
|
4. Check server logs: `/var/log/nginx/error.log`
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 📁 File Structure
|
||||||
|
|
||||||
|
```
|
||||||
|
chitfund/
|
||||||
|
├── backend/
|
||||||
|
│ ├── deploy.sh # Backend deployment
|
||||||
|
│ ├── fix-bcrypt.sh # Fix bcrypt issues
|
||||||
|
│ ├── ecosystem.config.js # PM2 config
|
||||||
|
│ └── server.js # Main server file
|
||||||
|
│
|
||||||
|
├── luckychit/
|
||||||
|
│ ├── deploy-web.sh # Build web (local)
|
||||||
|
│ ├── deploy-web-auto.sh # Build & upload
|
||||||
|
│ ├── build-android.sh # Build Android
|
||||||
|
│ ├── web-server.js # Express server
|
||||||
|
│ ├── ecosystem.config.js # PM2 web config
|
||||||
|
│ └── build/web/ # Build output
|
||||||
|
│
|
||||||
|
├── PM2_PRODUCTION_GUIDE.md # Backend guide
|
||||||
|
├── PM2_QUICK_START.md # Quick backend start
|
||||||
|
├── FLUTTER_DEPLOYMENT_GUIDE.md # Frontend guide
|
||||||
|
├── PRODUCTION_UPDATE_GUIDE.md # Update guide ⭐
|
||||||
|
├── DEPLOYMENT_TROUBLESHOOTING.md # Troubleshooting
|
||||||
|
└── DEPLOYMENT_README.md # This file
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## ✅ Deployment Checklist
|
||||||
|
|
||||||
### Pre-Deployment
|
### Pre-Deployment
|
||||||
- [ ] Proxmox LXC container created (Ubuntu 22.04)
|
- [ ] Code tested locally
|
||||||
- [ ] Container has network access
|
- [ ] Version updated (if applicable)
|
||||||
- [ ] You have root/sudo access
|
- [ ] Database backup (if DB changes)
|
||||||
- [ ] You have your code ready (Git repo or files to upload)
|
- [ ] Environment variables checked
|
||||||
|
|
||||||
### During Deployment
|
### Deployment
|
||||||
- [ ] System updated
|
- [ ] Backend updated (if needed)
|
||||||
- [ ] Node.js installed (v20)
|
- [ ] Frontend rebuilt (if needed)
|
||||||
- [ ] PostgreSQL installed and configured
|
- [ ] Files uploaded to server
|
||||||
- [ ] Nginx installed
|
- [ ] Services restarted
|
||||||
- [ ] PM2 installed
|
|
||||||
- [ ] Flutter installed (for web build)
|
|
||||||
- [ ] Firewall configured
|
|
||||||
- [ ] Database created with secure password
|
|
||||||
- [ ] Backend code deployed
|
|
||||||
- [ ] Frontend built and deployed
|
|
||||||
- [ ] PM2 configured to auto-start
|
|
||||||
- [ ] Nginx configured correctly
|
|
||||||
|
|
||||||
### Post-Deployment
|
### Post-Deployment
|
||||||
- [ ] Test health endpoint: `curl http://localhost:3000/health`
|
- [ ] App loads successfully
|
||||||
- [ ] Test frontend: Visit `http://YOUR_IP`
|
- [ ] No errors in logs
|
||||||
- [ ] Test API: Try login from frontend
|
- [ ] Critical features tested
|
||||||
- [ ] Check logs: `pm2 logs`
|
- [ ] Monitoring for 15 minutes
|
||||||
- [ ] Setup SSL certificate (Let's Encrypt)
|
|
||||||
- [ ] Configure automated backups
|
|
||||||
- [ ] Document your credentials (securely!)
|
|
||||||
- [ ] Test from external network
|
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## 🔐 Important Security Notes
|
## 🎓 Learn More
|
||||||
|
|
||||||
### Immediately After Deployment:
|
### PM2 (Backend)
|
||||||
|
- Official Docs: https://pm2.keymetrics.io/docs/
|
||||||
|
- Commands: `PM2_PRODUCTION_GUIDE.md` → PM2 Commands section
|
||||||
|
|
||||||
|
### Flutter (Frontend)
|
||||||
|
- Official Docs: https://docs.flutter.dev/deployment
|
||||||
|
- Web Deploy: https://docs.flutter.dev/deployment/web
|
||||||
|
|
||||||
|
### nginx (Web Server)
|
||||||
|
- Official Docs: https://nginx.org/en/docs/
|
||||||
|
- Configuration: `FLUTTER_DEPLOYMENT_GUIDE.md` → nginx section
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🔐 Security Notes
|
||||||
|
|
||||||
|
### Never Commit
|
||||||
|
- `.env` files (backend credentials)
|
||||||
|
- `node_modules/` (backend)
|
||||||
|
- `build/` directories (frontend)
|
||||||
|
- `*.jks`, `*.keystore` (Android signing keys)
|
||||||
|
- Database backups
|
||||||
|
|
||||||
|
### Always Use
|
||||||
|
- Strong passwords in production
|
||||||
|
- SSL certificates (HTTPS)
|
||||||
|
- Firewall rules
|
||||||
|
- Regular backups
|
||||||
|
- Monitoring
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 📊 Version History
|
||||||
|
|
||||||
|
Keep track of your deployments:
|
||||||
|
|
||||||
1. **Change Default Passwords**
|
|
||||||
```bash
|
```bash
|
||||||
# PostgreSQL password
|
# Add to deployment.log
|
||||||
sudo -u postgres psql
|
echo "$(date): v1.0.2 - Fixed payment UI bug" >> deployment.log
|
||||||
ALTER USER luckychit WITH PASSWORD 'new_secure_password';
|
|
||||||
|
|
||||||
# Update .env file accordingly
|
|
||||||
nano /home/luckychit/apps/chitfund/backend/.env
|
|
||||||
```
|
|
||||||
|
|
||||||
2. **Secure JWT Secret**
|
|
||||||
- Generate a strong random secret (32+ characters)
|
|
||||||
- Never commit .env to Git
|
|
||||||
- Use different secrets for dev/staging/production
|
|
||||||
|
|
||||||
3. **Setup SSL/HTTPS**
|
|
||||||
```bash
|
|
||||||
sudo apt install certbot python3-certbot-nginx
|
|
||||||
sudo certbot --nginx -d yourdomain.com
|
|
||||||
```
|
|
||||||
|
|
||||||
4. **Enable Fail2Ban** (Optional but recommended)
|
|
||||||
```bash
|
|
||||||
sudo apt install fail2ban
|
|
||||||
sudo systemctl enable fail2ban
|
|
||||||
sudo systemctl start fail2ban
|
|
||||||
```
|
|
||||||
|
|
||||||
5. **Regular Updates**
|
|
||||||
```bash
|
|
||||||
# Create update script
|
|
||||||
echo '#!/bin/bash' > ~/update-system.sh
|
|
||||||
echo 'apt update && apt upgrade -y' >> ~/update-system.sh
|
|
||||||
chmod +x ~/update-system.sh
|
|
||||||
|
|
||||||
# Run weekly via crontab
|
|
||||||
# 0 3 * * 0 /root/update-system.sh
|
|
||||||
```
|
```
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## 🛠️ Common Post-Deployment Tasks
|
## 💡 Pro Tips
|
||||||
|
|
||||||
### Update Application Code
|
1. **Test in staging first** if possible
|
||||||
|
2. **Deploy during low traffic** hours
|
||||||
|
3. **Keep deployments small** (easier to rollback)
|
||||||
|
4. **Monitor after deployment** for 15+ minutes
|
||||||
|
5. **Document changes** in deployment.log
|
||||||
|
6. **Have a rollback plan** ready
|
||||||
|
7. **Communicate with users** about updates
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🆘 Emergency Contacts
|
||||||
|
|
||||||
|
**For Production Issues:**
|
||||||
|
- PM2 Logs: `pm2 logs luckychit-api`
|
||||||
|
- nginx Logs: `sudo tail -f /var/log/nginx/error.log`
|
||||||
|
- Database Logs: `sudo tail -f /var/log/postgresql/postgresql-*.log`
|
||||||
|
|
||||||
|
**Rollback:**
|
||||||
```bash
|
```bash
|
||||||
# Backend
|
git checkout <previous-commit>
|
||||||
cd /home/luckychit/apps/chitfund/backend
|
|
||||||
git pull
|
|
||||||
npm install --production
|
|
||||||
pm2 reload luckychit-api
|
pm2 reload luckychit-api
|
||||||
|
|
||||||
# Frontend
|
|
||||||
cd /home/luckychit/apps/chitfund/luckychit
|
|
||||||
git pull
|
|
||||||
flutter pub get
|
|
||||||
flutter build web --release
|
|
||||||
sudo cp -r build/web/* /var/www/luckychit/
|
|
||||||
```
|
|
||||||
|
|
||||||
### View Logs
|
|
||||||
|
|
||||||
```bash
|
|
||||||
# PM2 logs (backend)
|
|
||||||
pm2 logs luckychit-api
|
|
||||||
|
|
||||||
# Nginx access logs
|
|
||||||
sudo tail -f /var/log/nginx/access.log
|
|
||||||
|
|
||||||
# Nginx error logs
|
|
||||||
sudo tail -f /var/log/nginx/error.log
|
|
||||||
|
|
||||||
# PostgreSQL logs
|
|
||||||
sudo tail -f /var/log/postgresql/postgresql-14-main.log
|
|
||||||
```
|
|
||||||
|
|
||||||
### Database Backup & Restore
|
|
||||||
|
|
||||||
```bash
|
|
||||||
# Manual backup
|
|
||||||
pg_dump -U luckychit -h localhost luckychit > backup.sql
|
|
||||||
|
|
||||||
# Restore
|
|
||||||
psql -U luckychit -h localhost luckychit < backup.sql
|
|
||||||
|
|
||||||
# Automated backups are already setup (runs daily at 2 AM)
|
|
||||||
# Check /home/luckychit/backups/
|
|
||||||
```
|
|
||||||
|
|
||||||
### Monitor Resources
|
|
||||||
|
|
||||||
```bash
|
|
||||||
# System resources
|
|
||||||
htop
|
|
||||||
|
|
||||||
# PM2 monitoring
|
|
||||||
pm2 monit
|
|
||||||
|
|
||||||
# Disk space
|
|
||||||
df -h
|
|
||||||
|
|
||||||
# Memory
|
|
||||||
free -h
|
|
||||||
|
|
||||||
# Network connections
|
|
||||||
sudo netstat -tulpn
|
|
||||||
```
|
```
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## 🆘 Troubleshooting Quick Guide
|
**🎉 Your deployment documentation is complete and production-ready!**
|
||||||
|
|
||||||
### Backend Won't Start
|
|
||||||
```bash
|
|
||||||
pm2 logs luckychit-api # Check logs
|
|
||||||
node /home/luckychit/apps/chitfund/backend/test-db-connection.js # Test DB
|
|
||||||
cat /home/luckychit/apps/chitfund/backend/.env # Verify config
|
|
||||||
```
|
|
||||||
|
|
||||||
### Can't Access from Browser
|
|
||||||
```bash
|
|
||||||
sudo ufw status # Check firewall
|
|
||||||
sudo systemctl status nginx # Check Nginx
|
|
||||||
sudo nginx -t # Test Nginx config
|
|
||||||
curl http://localhost:3000/health # Test backend locally
|
|
||||||
```
|
|
||||||
|
|
||||||
### Database Connection Issues
|
|
||||||
```bash
|
|
||||||
sudo systemctl status postgresql # Check PostgreSQL
|
|
||||||
sudo -u postgres psql # Try connecting
|
|
||||||
# Inside psql: \l # List databases
|
|
||||||
# Inside psql: \du # List users
|
|
||||||
```
|
|
||||||
|
|
||||||
### Out of Disk Space
|
|
||||||
```bash
|
|
||||||
df -h # Check space
|
|
||||||
du -sh /home/luckychit/* | sort -h # Find large directories
|
|
||||||
pm2 flush # Clear PM2 logs
|
|
||||||
sudo journalctl --vacuum-time=3d # Clear system logs
|
|
||||||
```
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 📞 Support Resources
|
|
||||||
|
|
||||||
- **Full Guide:** `PROXMOX_DEPLOYMENT_GUIDE.md`
|
|
||||||
- **Quick Commands:** `QUICK_DEPLOY.md`
|
|
||||||
- **Automated Script:** `deploy.sh`
|
|
||||||
|
|
||||||
### External Resources
|
|
||||||
- [Proxmox Documentation](https://pve.proxmox.com/wiki/Main_Page)
|
|
||||||
- [Node.js Documentation](https://nodejs.org/en/docs/)
|
|
||||||
- [Flutter Documentation](https://docs.flutter.dev/)
|
|
||||||
- [PostgreSQL Documentation](https://www.postgresql.org/docs/)
|
|
||||||
- [Nginx Documentation](https://nginx.org/en/docs/)
|
|
||||||
- [PM2 Documentation](https://pm2.keymetrics.io/)
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 🎯 Success Criteria
|
|
||||||
|
|
||||||
Your deployment is successful when:
|
|
||||||
|
|
||||||
- ✅ Frontend loads in browser: `http://YOUR_IP`
|
|
||||||
- ✅ Health endpoint responds: `http://YOUR_IP/health`
|
|
||||||
- ✅ Can login and use the application
|
|
||||||
- ✅ PM2 shows app running: `pm2 status`
|
|
||||||
- ✅ Nginx is running: `sudo systemctl status nginx`
|
|
||||||
- ✅ Database is accessible: `psql -U luckychit -d luckychit -h localhost`
|
|
||||||
- ✅ Application survives reboot (test with `sudo reboot`)
|
|
||||||
- ✅ Firewall is enabled: `sudo ufw status`
|
|
||||||
- ✅ Automated backups are scheduled: `crontab -l`
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 📈 Next Steps After Deployment
|
|
||||||
|
|
||||||
1. **Setup Monitoring**
|
|
||||||
- Install monitoring tools (Netdata, Prometheus, etc.)
|
|
||||||
- Setup uptime monitoring (UptimeRobot, etc.)
|
|
||||||
- Configure email alerts
|
|
||||||
|
|
||||||
2. **Performance Optimization**
|
|
||||||
- Enable Nginx caching
|
|
||||||
- Configure database connection pooling
|
|
||||||
- Setup CDN for static assets
|
|
||||||
|
|
||||||
3. **Backup Strategy**
|
|
||||||
- Test backup restoration
|
|
||||||
- Setup off-site backups
|
|
||||||
- Document recovery procedures
|
|
||||||
|
|
||||||
4. **Documentation**
|
|
||||||
- Document your specific configuration
|
|
||||||
- Keep credentials in password manager
|
|
||||||
- Create runbook for common issues
|
|
||||||
|
|
||||||
5. **Team Access**
|
|
||||||
- Create additional user accounts if needed
|
|
||||||
- Setup SSH key authentication
|
|
||||||
- Configure proper permissions
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 🎉 You're All Set!
|
|
||||||
|
|
||||||
Your LuckyChit application should now be running smoothly on Proxmox LXC.
|
|
||||||
|
|
||||||
**Remember:**
|
|
||||||
- Keep your system updated
|
|
||||||
- Monitor logs regularly
|
|
||||||
- Test backups periodically
|
|
||||||
- Use HTTPS in production
|
|
||||||
- Document any custom changes
|
|
||||||
|
|
||||||
Good luck! 🚀
|
|
||||||
|
|
||||||
|
_Last updated: November 2025_
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,561 @@
|
||||||
|
# 🔧 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! 🎯**
|
||||||
|
|
||||||
|
|
@ -0,0 +1,653 @@
|
||||||
|
# 📱 Flutter Frontend Deployment Guide - LuckyChit
|
||||||
|
|
||||||
|
Complete guide to deploy and update your Flutter app UI changes in production.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 📋 Deployment Options
|
||||||
|
|
||||||
|
Your Flutter app can be deployed as:
|
||||||
|
1. **Web App** (accessible via browser)
|
||||||
|
2. **Android App** (APK/AAB for Play Store)
|
||||||
|
3. **iOS App** (IPA for App Store)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🌐 Option 1: Web Deployment (Recommended for Quick Updates)
|
||||||
|
|
||||||
|
### Initial Setup
|
||||||
|
|
||||||
|
#### Step 1: Build Flutter for Web
|
||||||
|
|
||||||
|
```bash
|
||||||
|
cd luckychit
|
||||||
|
|
||||||
|
# Clean previous builds
|
||||||
|
flutter clean
|
||||||
|
|
||||||
|
# Get dependencies
|
||||||
|
flutter pub get
|
||||||
|
|
||||||
|
# Build for production
|
||||||
|
flutter build web --release
|
||||||
|
```
|
||||||
|
|
||||||
|
This creates optimized files in `luckychit/build/web/`
|
||||||
|
|
||||||
|
#### Step 2: Deploy Web Files
|
||||||
|
|
||||||
|
**Method A: Using nginx (Recommended)**
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Copy built files to web server directory
|
||||||
|
sudo mkdir -p /var/www/luckychit
|
||||||
|
sudo cp -r build/web/* /var/www/luckychit/
|
||||||
|
|
||||||
|
# Set permissions
|
||||||
|
sudo chown -R www-data:www-data /var/www/luckychit
|
||||||
|
sudo chmod -R 755 /var/www/luckychit
|
||||||
|
```
|
||||||
|
|
||||||
|
**Configure nginx:**
|
||||||
|
|
||||||
|
Create/edit `/etc/nginx/sites-available/luckychit`:
|
||||||
|
|
||||||
|
```nginx
|
||||||
|
server {
|
||||||
|
listen 80;
|
||||||
|
server_name your-domain.com; # or your-server-ip
|
||||||
|
|
||||||
|
# Flutter Web App
|
||||||
|
location / {
|
||||||
|
root /var/www/luckychit;
|
||||||
|
index index.html;
|
||||||
|
try_files $uri $uri/ /index.html;
|
||||||
|
|
||||||
|
# Disable cache for index.html (always get latest)
|
||||||
|
location = /index.html {
|
||||||
|
add_header Cache-Control "no-cache, no-store, must-revalidate";
|
||||||
|
add_header Pragma "no-cache";
|
||||||
|
add_header Expires 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
# Cache static assets for 1 year
|
||||||
|
location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg|woff|woff2|ttf|eot)$ {
|
||||||
|
expires 1y;
|
||||||
|
add_header Cache-Control "public, immutable";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
# Backend API (if on same server)
|
||||||
|
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;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
Enable and restart nginx:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
sudo ln -s /etc/nginx/sites-available/luckychit /etc/nginx/sites-enabled/
|
||||||
|
sudo nginx -t
|
||||||
|
sudo systemctl restart nginx
|
||||||
|
```
|
||||||
|
|
||||||
|
**Method B: Using PM2 + http-server**
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Install http-server globally
|
||||||
|
npm install -g http-server
|
||||||
|
|
||||||
|
# Start with PM2
|
||||||
|
cd luckychit
|
||||||
|
pm2 start http-server --name "luckychit-web" -- -p 8080 -c-1 -d false build/web
|
||||||
|
|
||||||
|
# Save
|
||||||
|
pm2 save
|
||||||
|
```
|
||||||
|
|
||||||
|
**Method C: Using PM2 + Express (Custom Server)**
|
||||||
|
|
||||||
|
Create `luckychit/web-server.js`:
|
||||||
|
|
||||||
|
```javascript
|
||||||
|
const express = require('express');
|
||||||
|
const path = require('path');
|
||||||
|
const app = express();
|
||||||
|
const PORT = process.env.PORT || 8080;
|
||||||
|
|
||||||
|
// Serve static files with proper cache headers
|
||||||
|
app.use(express.static(path.join(__dirname, 'build/web'), {
|
||||||
|
maxAge: '1y',
|
||||||
|
immutable: true,
|
||||||
|
setHeaders: (res, filePath) => {
|
||||||
|
// Don't cache index.html
|
||||||
|
if (filePath.endsWith('index.html')) {
|
||||||
|
res.setHeader('Cache-Control', 'no-cache, no-store, must-revalidate');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}));
|
||||||
|
|
||||||
|
// Handle Flutter routes (SPA)
|
||||||
|
app.get('*', (req, res) => {
|
||||||
|
res.sendFile(path.join(__dirname, 'build/web', 'index.html'));
|
||||||
|
});
|
||||||
|
|
||||||
|
app.listen(PORT, '0.0.0.0', () => {
|
||||||
|
console.log(`✅ Flutter web app running on port ${PORT}`);
|
||||||
|
});
|
||||||
|
```
|
||||||
|
|
||||||
|
Then:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
cd luckychit
|
||||||
|
npm install express
|
||||||
|
pm2 start web-server.js --name "luckychit-web"
|
||||||
|
pm2 save
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🔄 Updating Web App (How to Push Changes)
|
||||||
|
|
||||||
|
### Quick Update Script
|
||||||
|
|
||||||
|
Create `luckychit/deploy-web.sh`:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
echo "🚀 Deploying Flutter Web Updates"
|
||||||
|
echo "================================="
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
# Clean and build
|
||||||
|
echo "🧹 Cleaning previous build..."
|
||||||
|
flutter clean
|
||||||
|
|
||||||
|
echo "📦 Getting dependencies..."
|
||||||
|
flutter pub get
|
||||||
|
|
||||||
|
echo "🔨 Building for web (production)..."
|
||||||
|
flutter build web --release
|
||||||
|
|
||||||
|
if [ $? -eq 0 ]; then
|
||||||
|
echo ""
|
||||||
|
echo "✅ Build successful!"
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
# Copy to nginx directory
|
||||||
|
echo "📤 Deploying to web server..."
|
||||||
|
sudo cp -r build/web/* /var/www/luckychit/
|
||||||
|
|
||||||
|
# Or restart PM2 if using PM2
|
||||||
|
# pm2 restart luckychit-web
|
||||||
|
|
||||||
|
echo ""
|
||||||
|
echo "✅ Deployment complete!"
|
||||||
|
echo "🌐 Your app is now live with the latest changes!"
|
||||||
|
else
|
||||||
|
echo ""
|
||||||
|
echo "❌ Build failed. Please check errors above."
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
```
|
||||||
|
|
||||||
|
**Use it:**
|
||||||
|
|
||||||
|
```bash
|
||||||
|
cd luckychit
|
||||||
|
chmod +x deploy-web.sh
|
||||||
|
./deploy-web.sh
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 📱 Option 2: Android Deployment
|
||||||
|
|
||||||
|
### Build Android APK
|
||||||
|
|
||||||
|
**For Testing:**
|
||||||
|
|
||||||
|
```bash
|
||||||
|
cd luckychit
|
||||||
|
|
||||||
|
# Debug APK
|
||||||
|
flutter build apk --debug
|
||||||
|
|
||||||
|
# Release APK
|
||||||
|
flutter build apk --release
|
||||||
|
```
|
||||||
|
|
||||||
|
APK location: `build/app/outputs/flutter-apk/app-release.apk`
|
||||||
|
|
||||||
|
### Build Android App Bundle (For Play Store)
|
||||||
|
|
||||||
|
```bash
|
||||||
|
cd luckychit
|
||||||
|
|
||||||
|
# Build release bundle
|
||||||
|
flutter build appbundle --release
|
||||||
|
```
|
||||||
|
|
||||||
|
Bundle location: `build/app/outputs/bundle/release/app-release.aab`
|
||||||
|
|
||||||
|
### Deploy to Users
|
||||||
|
|
||||||
|
**Method 1: Direct Distribution**
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Copy APK to server
|
||||||
|
scp build/app/outputs/flutter-apk/app-release.apk user@server:/var/www/downloads/
|
||||||
|
|
||||||
|
# Users download and install from:
|
||||||
|
# https://your-domain.com/downloads/app-release.apk
|
||||||
|
```
|
||||||
|
|
||||||
|
**Method 2: Google Play Store**
|
||||||
|
|
||||||
|
1. Sign in to [Google Play Console](https://play.google.com/console)
|
||||||
|
2. Create app (if first time)
|
||||||
|
3. Go to **Release** → **Production**
|
||||||
|
4. Click **Create new release**
|
||||||
|
5. Upload `app-release.aab`
|
||||||
|
6. Add release notes
|
||||||
|
7. Review and rollout
|
||||||
|
|
||||||
|
### Signing Android App (Required for Play Store)
|
||||||
|
|
||||||
|
**Create keystore (first time only):**
|
||||||
|
|
||||||
|
```bash
|
||||||
|
cd luckychit/android
|
||||||
|
|
||||||
|
keytool -genkey -v -keystore luckychit-key.jks \
|
||||||
|
-keyalg RSA -keysize 2048 -validity 10000 \
|
||||||
|
-alias luckychit
|
||||||
|
```
|
||||||
|
|
||||||
|
**Create `android/key.properties`:**
|
||||||
|
|
||||||
|
```properties
|
||||||
|
storePassword=your_keystore_password
|
||||||
|
keyPassword=your_key_password
|
||||||
|
keyAlias=luckychit
|
||||||
|
storeFile=/path/to/luckychit-key.jks
|
||||||
|
```
|
||||||
|
|
||||||
|
**Update `android/app/build.gradle`:**
|
||||||
|
|
||||||
|
```gradle
|
||||||
|
// Add before android block
|
||||||
|
def keystoreProperties = new Properties()
|
||||||
|
def keystorePropertiesFile = rootProject.file('key.properties')
|
||||||
|
if (keystorePropertiesFile.exists()) {
|
||||||
|
keystoreProperties.load(new FileInputStream(keystorePropertiesFile))
|
||||||
|
}
|
||||||
|
|
||||||
|
android {
|
||||||
|
// ... existing config ...
|
||||||
|
|
||||||
|
signingConfigs {
|
||||||
|
release {
|
||||||
|
keyAlias keystoreProperties['keyAlias']
|
||||||
|
keyPassword keystoreProperties['keyPassword']
|
||||||
|
storeFile keystoreProperties['storeFile'] ? file(keystoreProperties['storeFile']) : null
|
||||||
|
storePassword keystoreProperties['storePassword']
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
buildTypes {
|
||||||
|
release {
|
||||||
|
signingConfig signingConfigs.release
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
Now build:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
flutter build appbundle --release
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🍎 Option 3: iOS Deployment
|
||||||
|
|
||||||
|
### Build iOS App
|
||||||
|
|
||||||
|
```bash
|
||||||
|
cd luckychit
|
||||||
|
|
||||||
|
# Build for iOS
|
||||||
|
flutter build ios --release
|
||||||
|
```
|
||||||
|
|
||||||
|
### Deploy to App Store
|
||||||
|
|
||||||
|
1. Open Xcode: `open ios/Runner.xcworkspace`
|
||||||
|
2. Select **Product** → **Archive**
|
||||||
|
3. Once archived, click **Distribute App**
|
||||||
|
4. Choose **App Store Connect**
|
||||||
|
5. Follow the upload wizard
|
||||||
|
|
||||||
|
**Or use command line:**
|
||||||
|
|
||||||
|
```bash
|
||||||
|
cd ios
|
||||||
|
fastlane deliver
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🚀 Production Update Workflow
|
||||||
|
|
||||||
|
### For Web (Quickest)
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# On your development machine
|
||||||
|
cd luckychit
|
||||||
|
flutter build web --release
|
||||||
|
|
||||||
|
# Upload to server
|
||||||
|
scp -r build/web/* user@server:/tmp/flutter-web/
|
||||||
|
|
||||||
|
# On server
|
||||||
|
ssh user@server
|
||||||
|
sudo cp -r /tmp/flutter-web/* /var/www/luckychit/
|
||||||
|
# Or if using PM2:
|
||||||
|
# pm2 restart luckychit-web
|
||||||
|
```
|
||||||
|
|
||||||
|
### For Mobile Apps
|
||||||
|
|
||||||
|
1. **Make changes** in your code
|
||||||
|
2. **Update version** in `pubspec.yaml`:
|
||||||
|
```yaml
|
||||||
|
version: 1.0.1+2 # version+buildNumber
|
||||||
|
```
|
||||||
|
3. **Build:**
|
||||||
|
```bash
|
||||||
|
# Android
|
||||||
|
flutter build appbundle --release
|
||||||
|
|
||||||
|
# iOS
|
||||||
|
flutter build ios --release
|
||||||
|
```
|
||||||
|
4. **Upload to stores**
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🔧 Common Issues & Solutions
|
||||||
|
|
||||||
|
### Web App Not Updating (Cache Issues)
|
||||||
|
|
||||||
|
**Problem:** Users still see old version
|
||||||
|
|
||||||
|
**Solution 1: Force reload**
|
||||||
|
- Chrome: Ctrl+Shift+R (Windows) or Cmd+Shift+R (Mac)
|
||||||
|
- Clear browser cache
|
||||||
|
|
||||||
|
**Solution 2: Update index.html cache headers**
|
||||||
|
|
||||||
|
Edit `luckychit/web/index.html` - add to `<head>`:
|
||||||
|
|
||||||
|
```html
|
||||||
|
<meta http-equiv="Cache-Control" content="no-cache, no-store, must-revalidate">
|
||||||
|
<meta http-equiv="Pragma" content="no-cache">
|
||||||
|
<meta http-equiv="Expires" content="0">
|
||||||
|
```
|
||||||
|
|
||||||
|
**Solution 3: Version your assets**
|
||||||
|
|
||||||
|
Update `pubspec.yaml`:
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
version: 1.0.1+2 # Increment this
|
||||||
|
```
|
||||||
|
|
||||||
|
Rebuild:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
flutter clean
|
||||||
|
flutter pub get
|
||||||
|
flutter build web --release
|
||||||
|
```
|
||||||
|
|
||||||
|
### Android Build Fails
|
||||||
|
|
||||||
|
**Common issues:**
|
||||||
|
|
||||||
|
1. **Gradle version mismatch:**
|
||||||
|
```bash
|
||||||
|
cd android
|
||||||
|
./gradlew clean
|
||||||
|
cd ..
|
||||||
|
flutter clean
|
||||||
|
flutter build apk
|
||||||
|
```
|
||||||
|
|
||||||
|
2. **Signing issues:**
|
||||||
|
- Check `key.properties` exists and paths are correct
|
||||||
|
- Verify keystore password
|
||||||
|
|
||||||
|
3. **Memory issues:**
|
||||||
|
```bash
|
||||||
|
export GRADLE_OPTS="-Xmx4096m"
|
||||||
|
flutter build apk --release
|
||||||
|
```
|
||||||
|
|
||||||
|
### iOS Build Fails
|
||||||
|
|
||||||
|
1. **Pod issues:**
|
||||||
|
```bash
|
||||||
|
cd ios
|
||||||
|
rm Podfile.lock
|
||||||
|
pod install
|
||||||
|
cd ..
|
||||||
|
flutter build ios
|
||||||
|
```
|
||||||
|
|
||||||
|
2. **Provisioning profile:**
|
||||||
|
- Update in Xcode → Signing & Capabilities
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 📦 Automated Deployment Scripts
|
||||||
|
|
||||||
|
### Complete Web Deployment Script
|
||||||
|
|
||||||
|
Create `flutter-deploy-full.sh`:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
# LuckyChit Flutter Web Deployment Script
|
||||||
|
# Run from project root
|
||||||
|
|
||||||
|
SERVER_USER="your-user"
|
||||||
|
SERVER_HOST="your-server-ip"
|
||||||
|
WEB_DIR="/var/www/luckychit"
|
||||||
|
|
||||||
|
echo "🚀 LuckyChit Flutter Web Deployment"
|
||||||
|
echo "===================================="
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
# Build
|
||||||
|
cd luckychit
|
||||||
|
echo "🧹 Cleaning..."
|
||||||
|
flutter clean
|
||||||
|
|
||||||
|
echo "📦 Getting dependencies..."
|
||||||
|
flutter pub get
|
||||||
|
|
||||||
|
echo "🔨 Building for web..."
|
||||||
|
flutter build web --release
|
||||||
|
|
||||||
|
if [ $? -ne 0 ]; then
|
||||||
|
echo "❌ Build failed!"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "✅ Build successful!"
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
# Upload to server
|
||||||
|
echo "📤 Uploading to production server..."
|
||||||
|
rsync -avz --delete build/web/ $SERVER_USER@$SERVER_HOST:$WEB_DIR/
|
||||||
|
|
||||||
|
if [ $? -eq 0 ]; then
|
||||||
|
echo ""
|
||||||
|
echo "✅ Deployment complete!"
|
||||||
|
echo "🌐 Your app is now live!"
|
||||||
|
echo ""
|
||||||
|
echo "Clear browser cache (Ctrl+Shift+R) to see changes"
|
||||||
|
else
|
||||||
|
echo "❌ Upload failed!"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
```
|
||||||
|
|
||||||
|
### Android Auto-Build Script
|
||||||
|
|
||||||
|
Create `luckychit/build-android.sh`:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
echo "🤖 Building Android Release"
|
||||||
|
echo "============================"
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
# Clean
|
||||||
|
echo "🧹 Cleaning..."
|
||||||
|
flutter clean
|
||||||
|
|
||||||
|
# Get dependencies
|
||||||
|
echo "📦 Getting dependencies..."
|
||||||
|
flutter pub get
|
||||||
|
|
||||||
|
# Build
|
||||||
|
echo "🔨 Building APK..."
|
||||||
|
flutter build apk --release
|
||||||
|
|
||||||
|
echo "🔨 Building App Bundle..."
|
||||||
|
flutter build appbundle --release
|
||||||
|
|
||||||
|
echo ""
|
||||||
|
echo "✅ Build complete!"
|
||||||
|
echo ""
|
||||||
|
echo "📦 APK: build/app/outputs/flutter-apk/app-release.apk"
|
||||||
|
echo "📦 AAB: build/app/outputs/bundle/release/app-release.aab"
|
||||||
|
echo ""
|
||||||
|
echo "Upload AAB to Google Play Console"
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 📊 Version Management
|
||||||
|
|
||||||
|
### Update Version in pubspec.yaml
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
name: luckychit
|
||||||
|
description: Digital Chit Fund Management
|
||||||
|
version: 1.0.2+3 # Format: major.minor.patch+buildNumber
|
||||||
|
|
||||||
|
# Increment for each release:
|
||||||
|
# - major: Breaking changes (2.0.0)
|
||||||
|
# - minor: New features (1.1.0)
|
||||||
|
# - patch: Bug fixes (1.0.1)
|
||||||
|
# - buildNumber: Each build (1.0.0+5)
|
||||||
|
```
|
||||||
|
|
||||||
|
### Check Current Version
|
||||||
|
|
||||||
|
```bash
|
||||||
|
cd luckychit
|
||||||
|
grep "^version:" pubspec.yaml
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## ✅ Deployment Checklist
|
||||||
|
|
||||||
|
### Before Deploying
|
||||||
|
|
||||||
|
- [ ] All changes tested locally
|
||||||
|
- [ ] Version incremented in `pubspec.yaml`
|
||||||
|
- [ ] Backend API URL updated (if changed)
|
||||||
|
- [ ] `flutter clean` executed
|
||||||
|
- [ ] `flutter pub get` executed
|
||||||
|
- [ ] Build completed successfully
|
||||||
|
- [ ] No errors in console
|
||||||
|
|
||||||
|
### After Deploying
|
||||||
|
|
||||||
|
- [ ] Web: Files copied to `/var/www/luckychit/`
|
||||||
|
- [ ] Web: nginx restarted (if needed)
|
||||||
|
- [ ] Test app in browser (hard refresh)
|
||||||
|
- [ ] Test on mobile device (if mobile build)
|
||||||
|
- [ ] Check all features work
|
||||||
|
- [ ] Monitor for errors
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🎯 Quick Reference
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Clean build
|
||||||
|
flutter clean && flutter pub get
|
||||||
|
|
||||||
|
# Web (production)
|
||||||
|
flutter build web --release
|
||||||
|
|
||||||
|
# Android APK
|
||||||
|
flutter build apk --release
|
||||||
|
|
||||||
|
# Android Bundle (Play Store)
|
||||||
|
flutter build appbundle --release
|
||||||
|
|
||||||
|
# iOS
|
||||||
|
flutter build ios --release
|
||||||
|
|
||||||
|
# Check version
|
||||||
|
grep "^version:" pubspec.yaml
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 📱 Testing Builds
|
||||||
|
|
||||||
|
### Web
|
||||||
|
```bash
|
||||||
|
cd luckychit/build/web
|
||||||
|
python3 -m http.server 8000
|
||||||
|
# Visit: http://localhost:8000
|
||||||
|
```
|
||||||
|
|
||||||
|
### Android
|
||||||
|
```bash
|
||||||
|
# Install on connected device
|
||||||
|
flutter install
|
||||||
|
|
||||||
|
# Or manually install APK
|
||||||
|
adb install build/app/outputs/flutter-apk/app-release.apk
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
**Your Flutter frontend is now ready to deploy and update! 🎉**
|
||||||
|
|
||||||
|
For backend updates, see: `PM2_PRODUCTION_GUIDE.md`
|
||||||
|
|
||||||
|
|
@ -0,0 +1,699 @@
|
||||||
|
# 🚀 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._
|
||||||
|
|
||||||
|
|
@ -0,0 +1,180 @@
|
||||||
|
# ⚡ PM2 Quick Start - LuckyChit
|
||||||
|
|
||||||
|
Get your LuckyChit app running in production in 5 minutes!
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🚀 Super Quick Deployment
|
||||||
|
|
||||||
|
### 1. Install PM2 (if not installed)
|
||||||
|
|
||||||
|
```bash
|
||||||
|
npm install -g pm2
|
||||||
|
```
|
||||||
|
|
||||||
|
### 2. Setup Environment
|
||||||
|
|
||||||
|
```bash
|
||||||
|
cd backend
|
||||||
|
cp .env.example .env
|
||||||
|
# Edit .env with production credentials
|
||||||
|
nano .env
|
||||||
|
```
|
||||||
|
|
||||||
|
### 3. Deploy with One Command
|
||||||
|
|
||||||
|
```bash
|
||||||
|
cd backend
|
||||||
|
chmod +x deploy.sh
|
||||||
|
./deploy.sh production
|
||||||
|
```
|
||||||
|
|
||||||
|
**Done!** ✅
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 📱 What You Get
|
||||||
|
|
||||||
|
- ✅ Backend running on port 3000
|
||||||
|
- ✅ Auto-restart on crashes
|
||||||
|
- ✅ Load balanced across all CPU cores
|
||||||
|
- ✅ Daily scheduled restart at 3 AM
|
||||||
|
- ✅ Automated payment reminders (9 AM IST)
|
||||||
|
- ✅ Comprehensive logging
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🎯 Essential Commands
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Status
|
||||||
|
pm2 list
|
||||||
|
|
||||||
|
# Monitor
|
||||||
|
pm2 monit
|
||||||
|
|
||||||
|
# Logs
|
||||||
|
pm2 logs luckychit-backend
|
||||||
|
|
||||||
|
# Restart
|
||||||
|
pm2 restart luckychit-backend
|
||||||
|
|
||||||
|
# Stop
|
||||||
|
pm2 stop luckychit-backend
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🔄 Updates (Zero Downtime)
|
||||||
|
|
||||||
|
```bash
|
||||||
|
git pull origin main
|
||||||
|
cd backend
|
||||||
|
npm install
|
||||||
|
pm2 reload luckychit-backend
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🤖 Auto-Start on Server Reboot
|
||||||
|
|
||||||
|
**One-time setup:**
|
||||||
|
|
||||||
|
```bash
|
||||||
|
pm2 startup
|
||||||
|
# Run the command it outputs (copy/paste it)
|
||||||
|
|
||||||
|
pm2 save
|
||||||
|
```
|
||||||
|
|
||||||
|
Now your app automatically restarts after server reboot!
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🔍 Troubleshooting
|
||||||
|
|
||||||
|
### ⚠️ bcrypt Error (Most Common)
|
||||||
|
|
||||||
|
**Error:** `invalid ELF header` or `ERR_DLOPEN_FAILED`
|
||||||
|
|
||||||
|
**Quick Fix (Run on Linux server):**
|
||||||
|
|
||||||
|
```bash
|
||||||
|
cd backend
|
||||||
|
chmod +x fix-bcrypt.sh
|
||||||
|
./fix-bcrypt.sh
|
||||||
|
```
|
||||||
|
|
||||||
|
Or manually:
|
||||||
|
```bash
|
||||||
|
cd backend
|
||||||
|
rm -rf node_modules package-lock.json
|
||||||
|
npm install
|
||||||
|
pm2 restart luckychit-api
|
||||||
|
```
|
||||||
|
|
||||||
|
**Cause:** node_modules installed on Windows, deployed to Linux. Native modules must be rebuilt on the target OS.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
**App not starting?**
|
||||||
|
|
||||||
|
```bash
|
||||||
|
pm2 logs luckychit-backend --lines 100
|
||||||
|
```
|
||||||
|
|
||||||
|
**Database connection failed?**
|
||||||
|
|
||||||
|
Check `.env` file has correct credentials:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
cat backend/.env
|
||||||
|
```
|
||||||
|
|
||||||
|
**Port already in use?**
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Find what's using port 3000
|
||||||
|
lsof -i :3000
|
||||||
|
|
||||||
|
# Kill it
|
||||||
|
kill -9 <PID>
|
||||||
|
|
||||||
|
# Restart
|
||||||
|
pm2 restart luckychit-backend
|
||||||
|
```
|
||||||
|
|
||||||
|
**More help?** See `DEPLOYMENT_TROUBLESHOOTING.md`
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 📊 Monitoring URLs
|
||||||
|
|
||||||
|
- **Backend Health Check:** `http://localhost:3000/api/health` (add this endpoint)
|
||||||
|
- **API Documentation:** `http://localhost:3000/api/docs`
|
||||||
|
- **Share Endpoint:** `http://localhost:3000/api/share`
|
||||||
|
- **Notifications:** `http://localhost:3000/api/notifications`
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🎯 Production Checklist
|
||||||
|
|
||||||
|
- [ ] PM2 installed (`pm2 --version`)
|
||||||
|
- [ ] `.env` file configured
|
||||||
|
- [ ] Database running and accessible
|
||||||
|
- [ ] App started with PM2 (`pm2 list` shows running)
|
||||||
|
- [ ] Auto-start configured (`pm2 startup` + `pm2 save`)
|
||||||
|
- [ ] Test API endpoints
|
||||||
|
- [ ] Setup nginx reverse proxy (optional)
|
||||||
|
- [ ] Setup SSL certificate (recommended)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 📚 Need More Details?
|
||||||
|
|
||||||
|
See the complete guide: `PM2_PRODUCTION_GUIDE.md`
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
**Your LuckyChit backend is now running in production! 🎉**
|
||||||
|
|
||||||
|
|
@ -0,0 +1,395 @@
|
||||||
|
# 🔄 Production Update Quick Guide - LuckyChit
|
||||||
|
|
||||||
|
Quick reference for updating backend and frontend in production.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🎯 What Changed?
|
||||||
|
|
||||||
|
- ✅ **Backend only?** → Update Node.js backend
|
||||||
|
- ✅ **Frontend only?** → Rebuild & redeploy Flutter app
|
||||||
|
- ✅ **Both?** → Update backend first, then frontend
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🔧 Backend Updates (Node.js API)
|
||||||
|
|
||||||
|
### Quick Update (Zero Downtime)
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# On production server
|
||||||
|
cd /home/luckychit/apps/chitfund/backend
|
||||||
|
|
||||||
|
# Pull latest code
|
||||||
|
git pull origin main
|
||||||
|
|
||||||
|
# Install dependencies (if package.json changed)
|
||||||
|
npm install
|
||||||
|
|
||||||
|
# Reload with zero downtime
|
||||||
|
pm2 reload luckychit-api
|
||||||
|
|
||||||
|
# Or use the deployment script
|
||||||
|
./deploy.sh production
|
||||||
|
|
||||||
|
# Check status
|
||||||
|
pm2 logs luckychit-api --lines 50
|
||||||
|
```
|
||||||
|
|
||||||
|
**Time:** ~30 seconds
|
||||||
|
**Downtime:** None (zero-downtime reload)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 📱 Frontend Updates (Flutter UI)
|
||||||
|
|
||||||
|
### Option A: Web Deployment (Fastest)
|
||||||
|
|
||||||
|
#### Step 1: Build on Your Machine
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# On your Windows dev machine
|
||||||
|
cd C:\Users\sunde\workspace\chitfund\luckychit
|
||||||
|
|
||||||
|
# Build for production
|
||||||
|
flutter clean
|
||||||
|
flutter pub get
|
||||||
|
flutter build web --release
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Step 2: Upload to Server
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Option 1: Using SCP
|
||||||
|
scp -r build/web/* user@your-server:/var/www/luckychit/
|
||||||
|
|
||||||
|
# Option 2: Using the auto-deploy script (edit config first)
|
||||||
|
chmod +x deploy-web-auto.sh
|
||||||
|
./deploy-web-auto.sh
|
||||||
|
|
||||||
|
# Option 3: Manual copy (if you have server access)
|
||||||
|
# Copy build/web/* to /var/www/luckychit/ on server
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Step 3: Clear Cache (Important!)
|
||||||
|
|
||||||
|
Users need to hard refresh their browser:
|
||||||
|
- **Chrome/Edge:** Ctrl + Shift + R
|
||||||
|
- **Firefox:** Ctrl + Shift + R
|
||||||
|
- **Mac:** Cmd + Shift + R
|
||||||
|
|
||||||
|
**Time:** ~2-3 minutes
|
||||||
|
**Downtime:** None
|
||||||
|
|
||||||
|
### Option B: Android App Update
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# On your machine
|
||||||
|
cd luckychit
|
||||||
|
|
||||||
|
# Update version in pubspec.yaml first!
|
||||||
|
# version: 1.0.2+3 # Increment this
|
||||||
|
|
||||||
|
# Build
|
||||||
|
chmod +x build-android.sh
|
||||||
|
./build-android.sh
|
||||||
|
|
||||||
|
# Upload to Play Store or distribute APK
|
||||||
|
```
|
||||||
|
|
||||||
|
**Time:** ~5-10 minutes (build only)
|
||||||
|
**Downtime:** None
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🚀 Complete Update Workflow (Both Backend + Frontend)
|
||||||
|
|
||||||
|
### Step 1: Update Backend First
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# On production server
|
||||||
|
cd /home/luckychit/apps/chitfund/backend
|
||||||
|
git pull origin main
|
||||||
|
npm install
|
||||||
|
pm2 reload luckychit-api
|
||||||
|
```
|
||||||
|
|
||||||
|
### Step 2: Update Frontend
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# On your Windows machine
|
||||||
|
cd C:\Users\sunde\workspace\chitfund\luckychit
|
||||||
|
flutter clean
|
||||||
|
flutter pub get
|
||||||
|
flutter build web --release
|
||||||
|
|
||||||
|
# Upload to server
|
||||||
|
scp -r build/web/* user@server:/var/www/luckychit/
|
||||||
|
```
|
||||||
|
|
||||||
|
### Step 3: Verify Everything Works
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Test backend API
|
||||||
|
curl http://your-server:3000/api/health
|
||||||
|
|
||||||
|
# Test frontend (visit in browser)
|
||||||
|
# https://your-domain.com
|
||||||
|
# Hard refresh: Ctrl+Shift+R
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 📋 Quick Commands Cheat Sheet
|
||||||
|
|
||||||
|
### Backend
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Status
|
||||||
|
pm2 list
|
||||||
|
|
||||||
|
# Logs
|
||||||
|
pm2 logs luckychit-api
|
||||||
|
|
||||||
|
# Restart
|
||||||
|
pm2 restart luckychit-api
|
||||||
|
|
||||||
|
# Reload (zero downtime)
|
||||||
|
pm2 reload luckychit-api
|
||||||
|
|
||||||
|
# Monitor
|
||||||
|
pm2 monit
|
||||||
|
```
|
||||||
|
|
||||||
|
### Frontend (Web)
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Build
|
||||||
|
cd luckychit
|
||||||
|
flutter build web --release
|
||||||
|
|
||||||
|
# Deploy (local script)
|
||||||
|
./deploy-web.sh
|
||||||
|
|
||||||
|
# Deploy (auto-upload to server)
|
||||||
|
./deploy-web-auto.sh
|
||||||
|
```
|
||||||
|
|
||||||
|
### Frontend (Android)
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Build
|
||||||
|
cd luckychit
|
||||||
|
./build-android.sh
|
||||||
|
|
||||||
|
# Output:
|
||||||
|
# - build/app/outputs/flutter-apk/app-release.apk
|
||||||
|
# - build/app/outputs/bundle/release/app-release.aab
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## ⚡ Fast Updates (Development Mode)
|
||||||
|
|
||||||
|
### Backend Hot Reload
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# On server, use nodemon for auto-restart on file changes
|
||||||
|
npm install -g nodemon
|
||||||
|
pm2 delete luckychit-api
|
||||||
|
pm2 start nodemon --name "luckychit-api" -- backend/server.js --watch
|
||||||
|
```
|
||||||
|
|
||||||
|
### Frontend Hot Reload
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# On your machine, run in dev mode
|
||||||
|
cd luckychit
|
||||||
|
flutter run -d web-server --web-port 8080
|
||||||
|
|
||||||
|
# Changes auto-reload in browser
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🔍 Troubleshooting Updates
|
||||||
|
|
||||||
|
### Backend Won't Update
|
||||||
|
|
||||||
|
**Check if code actually changed:**
|
||||||
|
```bash
|
||||||
|
cd backend
|
||||||
|
git status
|
||||||
|
git log -1
|
||||||
|
```
|
||||||
|
|
||||||
|
**PM2 not picking up changes:**
|
||||||
|
```bash
|
||||||
|
pm2 reload luckychit-api --update-env
|
||||||
|
# or
|
||||||
|
pm2 restart luckychit-api
|
||||||
|
```
|
||||||
|
|
||||||
|
**Native module issues (bcrypt):**
|
||||||
|
```bash
|
||||||
|
cd backend
|
||||||
|
./fix-bcrypt.sh
|
||||||
|
```
|
||||||
|
|
||||||
|
### Frontend Still Shows Old Version
|
||||||
|
|
||||||
|
**Browser cache:**
|
||||||
|
- Hard refresh: Ctrl+Shift+R
|
||||||
|
- Or open in Incognito mode
|
||||||
|
|
||||||
|
**Server cache:**
|
||||||
|
```bash
|
||||||
|
# Clear nginx cache (if using nginx)
|
||||||
|
sudo rm -rf /var/cache/nginx/*
|
||||||
|
sudo systemctl restart nginx
|
||||||
|
```
|
||||||
|
|
||||||
|
**Verify files updated:**
|
||||||
|
```bash
|
||||||
|
# On server
|
||||||
|
ls -lh /var/www/luckychit/
|
||||||
|
# Check modification times
|
||||||
|
```
|
||||||
|
|
||||||
|
**Force rebuild:**
|
||||||
|
```bash
|
||||||
|
cd luckychit
|
||||||
|
flutter clean
|
||||||
|
rm -rf build/
|
||||||
|
flutter pub get
|
||||||
|
flutter build web --release
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 📊 Version Management
|
||||||
|
|
||||||
|
### Check Current Versions
|
||||||
|
|
||||||
|
**Backend:**
|
||||||
|
```bash
|
||||||
|
# Check package.json
|
||||||
|
cat backend/package.json | grep version
|
||||||
|
|
||||||
|
# Or add to your API
|
||||||
|
# GET /api/version
|
||||||
|
```
|
||||||
|
|
||||||
|
**Frontend:**
|
||||||
|
```bash
|
||||||
|
# Check pubspec.yaml
|
||||||
|
cat luckychit/pubspec.yaml | grep version
|
||||||
|
```
|
||||||
|
|
||||||
|
### Update Versions
|
||||||
|
|
||||||
|
**Backend (`package.json`):**
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"name": "luckychit-backend",
|
||||||
|
"version": "1.0.2",
|
||||||
|
...
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
**Frontend (`pubspec.yaml`):**
|
||||||
|
```yaml
|
||||||
|
version: 1.0.2+3
|
||||||
|
# Format: major.minor.patch+buildNumber
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🎯 Pre-Deployment Checklist
|
||||||
|
|
||||||
|
### Before Updating Backend
|
||||||
|
|
||||||
|
- [ ] Code tested locally
|
||||||
|
- [ ] Database migrations ready (if any)
|
||||||
|
- [ ] Environment variables updated (if needed)
|
||||||
|
- [ ] No breaking API changes (or frontend updated too)
|
||||||
|
|
||||||
|
### Before Updating Frontend
|
||||||
|
|
||||||
|
- [ ] Backend API compatible
|
||||||
|
- [ ] Version number incremented
|
||||||
|
- [ ] Tested locally with production backend
|
||||||
|
- [ ] Build completes without errors
|
||||||
|
|
||||||
|
### After Updating
|
||||||
|
|
||||||
|
- [ ] Backend: `pm2 logs` shows no errors
|
||||||
|
- [ ] Frontend: Hard refresh shows new UI
|
||||||
|
- [ ] Test critical features
|
||||||
|
- [ ] Check error logs
|
||||||
|
- [ ] Monitor for 10-15 minutes
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🚨 Emergency Rollback
|
||||||
|
|
||||||
|
### Backend Rollback
|
||||||
|
|
||||||
|
```bash
|
||||||
|
cd backend
|
||||||
|
git log --oneline -5 # See recent commits
|
||||||
|
git checkout <previous-commit-hash>
|
||||||
|
pm2 reload luckychit-api
|
||||||
|
```
|
||||||
|
|
||||||
|
### Frontend Rollback
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# On your machine
|
||||||
|
cd luckychit
|
||||||
|
git checkout <previous-commit-hash>
|
||||||
|
flutter build web --release
|
||||||
|
scp -r build/web/* user@server:/var/www/luckychit/
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 📞 Need Help?
|
||||||
|
|
||||||
|
**Detailed Guides:**
|
||||||
|
- Backend: `PM2_PRODUCTION_GUIDE.md`
|
||||||
|
- Frontend: `FLUTTER_DEPLOYMENT_GUIDE.md`
|
||||||
|
- Troubleshooting: `DEPLOYMENT_TROUBLESHOOTING.md`
|
||||||
|
|
||||||
|
**Quick Start:**
|
||||||
|
- PM2 Quick Start: `PM2_QUICK_START.md`
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 💡 Pro Tips
|
||||||
|
|
||||||
|
1. **Always update backend before frontend** (ensures API compatibility)
|
||||||
|
|
||||||
|
2. **Test in staging first** if you have a staging server
|
||||||
|
|
||||||
|
3. **Update during low traffic times** (early morning, late night)
|
||||||
|
|
||||||
|
4. **Keep a deployment log:**
|
||||||
|
```bash
|
||||||
|
echo "$(date): Updated to version 1.0.2" >> deployment.log
|
||||||
|
```
|
||||||
|
|
||||||
|
5. **Monitor after deployment:**
|
||||||
|
```bash
|
||||||
|
pm2 monit # Backend monitoring
|
||||||
|
# Watch error logs for 10-15 minutes
|
||||||
|
```
|
||||||
|
|
||||||
|
6. **Communicate with users:**
|
||||||
|
- Add a banner: "Maintenance in progress"
|
||||||
|
- Or: "New version deployed, please refresh"
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
**Remember: Backend → Zero downtime | Frontend → Hard refresh needed! 🎯**
|
||||||
|
|
||||||
|
|
@ -144,7 +144,7 @@ build/
|
||||||
|
|
||||||
# PM2 process manager
|
# PM2 process manager
|
||||||
.pm2/
|
.pm2/
|
||||||
ecosystem.config.js
|
# ecosystem.config.js should be committed (it's configuration, not secrets)
|
||||||
|
|
||||||
# Docker volumes and data
|
# Docker volumes and data
|
||||||
docker-data/
|
docker-data/
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,65 @@
|
||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
# LuckyChit Backend Deployment Script
|
||||||
|
# Usage: ./deploy.sh [production|development]
|
||||||
|
|
||||||
|
ENV=${1:-production}
|
||||||
|
APP_NAME="luckychit-backend"
|
||||||
|
|
||||||
|
echo "🚀 Deploying LuckyChit Backend - Environment: $ENV"
|
||||||
|
echo "================================================"
|
||||||
|
|
||||||
|
# Check if PM2 is installed
|
||||||
|
if ! command -v pm2 &> /dev/null; then
|
||||||
|
echo "❌ PM2 is not installed. Installing..."
|
||||||
|
npm install -g pm2
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Clean install dependencies (fixes native module issues like bcrypt)
|
||||||
|
echo "📦 Installing dependencies..."
|
||||||
|
echo " Cleaning old modules to rebuild native bindings..."
|
||||||
|
rm -rf node_modules package-lock.json
|
||||||
|
npm install --production
|
||||||
|
|
||||||
|
# Create logs directory if it doesn't exist
|
||||||
|
if [ ! -d "logs" ]; then
|
||||||
|
echo "📁 Creating logs directory..."
|
||||||
|
mkdir -p logs
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Check if .env file exists
|
||||||
|
if [ ! -f ".env" ]; then
|
||||||
|
echo "⚠️ Warning: .env file not found!"
|
||||||
|
echo "Please create .env file with production credentials"
|
||||||
|
echo "Example: cp .env.example .env"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Stop existing PM2 process if running
|
||||||
|
if pm2 describe $APP_NAME > /dev/null 2>&1; then
|
||||||
|
echo "🛑 Stopping existing process..."
|
||||||
|
pm2 delete $APP_NAME
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Start application with PM2
|
||||||
|
echo "🎯 Starting application with PM2..."
|
||||||
|
if [ "$ENV" == "production" ]; then
|
||||||
|
pm2 start ecosystem.config.js --env production
|
||||||
|
else
|
||||||
|
pm2 start ecosystem.config.js --env development
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Save PM2 process list
|
||||||
|
echo "💾 Saving PM2 process list..."
|
||||||
|
pm2 save
|
||||||
|
|
||||||
|
# Show status
|
||||||
|
echo ""
|
||||||
|
echo "✅ Deployment complete!"
|
||||||
|
echo ""
|
||||||
|
pm2 list
|
||||||
|
echo ""
|
||||||
|
echo "📊 Monitor with: pm2 monit"
|
||||||
|
echo "📝 View logs with: pm2 logs $APP_NAME"
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
|
@ -0,0 +1,49 @@
|
||||||
|
module.exports = {
|
||||||
|
apps: [
|
||||||
|
{
|
||||||
|
name: 'luckychit-backend',
|
||||||
|
script: './server.js',
|
||||||
|
instances: 'max', // Use all CPU cores
|
||||||
|
exec_mode: 'cluster', // Cluster mode for load balancing
|
||||||
|
autorestart: true,
|
||||||
|
watch: false, // Disable in production
|
||||||
|
max_memory_restart: '1G',
|
||||||
|
env: {
|
||||||
|
NODE_ENV: 'development',
|
||||||
|
PORT: 3000
|
||||||
|
},
|
||||||
|
env_production: {
|
||||||
|
NODE_ENV: 'production',
|
||||||
|
PORT: 3000
|
||||||
|
},
|
||||||
|
error_file: './logs/err.log',
|
||||||
|
out_file: './logs/out.log',
|
||||||
|
log_file: './logs/combined.log',
|
||||||
|
time: true,
|
||||||
|
merge_logs: true,
|
||||||
|
max_restarts: 10,
|
||||||
|
min_uptime: '10s',
|
||||||
|
listen_timeout: 3000,
|
||||||
|
kill_timeout: 5000,
|
||||||
|
// Cron restart (optional - restart daily at 3 AM)
|
||||||
|
cron_restart: '0 3 * * *',
|
||||||
|
// Enable source maps for better error tracking
|
||||||
|
node_args: '--enable-source-maps',
|
||||||
|
}
|
||||||
|
],
|
||||||
|
|
||||||
|
// Deployment configuration (optional)
|
||||||
|
deploy: {
|
||||||
|
production: {
|
||||||
|
user: 'your-server-user',
|
||||||
|
host: 'your-server-ip',
|
||||||
|
ref: 'origin/main',
|
||||||
|
repo: 'git@github.com:yourusername/chitfund.git',
|
||||||
|
path: '/var/www/luckychit',
|
||||||
|
'pre-deploy-local': '',
|
||||||
|
'post-deploy': 'cd backend && npm install && pm2 reload ecosystem.config.js --env production',
|
||||||
|
'pre-setup': ''
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
|
@ -0,0 +1,85 @@
|
||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
# Quick fix for bcrypt "invalid ELF header" error
|
||||||
|
# Run this on your Linux production server
|
||||||
|
|
||||||
|
echo "🔧 Fixing bcrypt native binding issue..."
|
||||||
|
echo "=========================================="
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
APP_NAME="luckychit-api"
|
||||||
|
|
||||||
|
# Get current directory
|
||||||
|
BACKEND_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
|
||||||
|
cd "$BACKEND_DIR"
|
||||||
|
|
||||||
|
echo "📍 Working directory: $BACKEND_DIR"
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
# Stop PM2 if running
|
||||||
|
if pm2 describe $APP_NAME > /dev/null 2>&1; then
|
||||||
|
echo "⏸️ Stopping PM2 process: $APP_NAME"
|
||||||
|
pm2 stop $APP_NAME
|
||||||
|
else
|
||||||
|
echo "ℹ️ PM2 process not running"
|
||||||
|
fi
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
# Remove node_modules
|
||||||
|
if [ -d "node_modules" ]; then
|
||||||
|
echo "🗑️ Removing old node_modules..."
|
||||||
|
rm -rf node_modules
|
||||||
|
else
|
||||||
|
echo "ℹ️ node_modules not found (already clean)"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Remove package-lock.json
|
||||||
|
if [ -f "package-lock.json" ]; then
|
||||||
|
echo "🗑️ Removing package-lock.json..."
|
||||||
|
rm -f package-lock.json
|
||||||
|
else
|
||||||
|
echo "ℹ️ package-lock.json not found"
|
||||||
|
fi
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
# Reinstall dependencies
|
||||||
|
echo "📦 Reinstalling dependencies on Linux..."
|
||||||
|
echo " This will rebuild native bindings (bcrypt, etc.)"
|
||||||
|
echo ""
|
||||||
|
npm install
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
# Check if installation was successful
|
||||||
|
if [ $? -eq 0 ]; then
|
||||||
|
echo "✅ Dependencies installed successfully!"
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
# Restart PM2
|
||||||
|
if pm2 list | grep -q $APP_NAME; then
|
||||||
|
echo "🔄 Restarting PM2 process..."
|
||||||
|
pm2 restart $APP_NAME
|
||||||
|
pm2 save
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
# Show status
|
||||||
|
echo "📊 Current status:"
|
||||||
|
pm2 list
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
echo "✅ Fix complete! Your app should be running now."
|
||||||
|
echo ""
|
||||||
|
echo "📝 Check logs with: pm2 logs $APP_NAME"
|
||||||
|
echo "📊 Monitor with: pm2 monit"
|
||||||
|
else
|
||||||
|
echo "⚠️ PM2 process not found. Start it manually:"
|
||||||
|
echo " pm2 start ecosystem.config.js --env production"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
echo "❌ Installation failed. Check the errors above."
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo ""
|
||||||
|
echo "=========================================="
|
||||||
|
echo "🎉 Done!"
|
||||||
|
|
||||||
|
|
@ -0,0 +1,90 @@
|
||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
# LuckyChit Android Build Script
|
||||||
|
# Builds both APK and App Bundle for distribution
|
||||||
|
|
||||||
|
echo "🤖 Building Android Release"
|
||||||
|
echo "============================"
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
# Check if we're in the right directory
|
||||||
|
if [ ! -f "pubspec.yaml" ]; then
|
||||||
|
echo "❌ Error: pubspec.yaml not found!"
|
||||||
|
echo "Please run this script from the luckychit directory"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Get current version
|
||||||
|
VERSION=$(grep "^version:" pubspec.yaml | sed 's/version: //')
|
||||||
|
echo "📱 App Version: $VERSION"
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
# Clean
|
||||||
|
echo "🧹 Step 1/4: Cleaning..."
|
||||||
|
flutter clean
|
||||||
|
|
||||||
|
# Get dependencies
|
||||||
|
echo "📦 Step 2/4: Getting dependencies..."
|
||||||
|
flutter pub get
|
||||||
|
|
||||||
|
# Build APK
|
||||||
|
echo "🔨 Step 3/4: Building APK (for direct distribution)..."
|
||||||
|
flutter build apk --release
|
||||||
|
|
||||||
|
if [ $? -ne 0 ]; then
|
||||||
|
echo "❌ APK build failed!"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "✅ APK build successful!"
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
# Build App Bundle
|
||||||
|
echo "🔨 Step 4/4: Building App Bundle (for Play Store)..."
|
||||||
|
flutter build appbundle --release
|
||||||
|
|
||||||
|
if [ $? -ne 0 ]; then
|
||||||
|
echo "❌ App Bundle build failed!"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "✅ App Bundle build successful!"
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
# Show results
|
||||||
|
echo "==========================================="
|
||||||
|
echo "🎉 Build Complete!"
|
||||||
|
echo ""
|
||||||
|
echo "📦 Output Files:"
|
||||||
|
echo ""
|
||||||
|
echo " APK (Direct Distribution):"
|
||||||
|
echo " 📄 build/app/outputs/flutter-apk/app-release.apk"
|
||||||
|
APK_SIZE=$(du -h build/app/outputs/flutter-apk/app-release.apk | cut -f1)
|
||||||
|
echo " 📊 Size: $APK_SIZE"
|
||||||
|
echo ""
|
||||||
|
echo " App Bundle (Google Play Store):"
|
||||||
|
echo " 📄 build/app/outputs/bundle/release/app-release.aab"
|
||||||
|
AAB_SIZE=$(du -h build/app/outputs/bundle/release/app-release.aab | cut -f1)
|
||||||
|
echo " 📊 Size: $AAB_SIZE"
|
||||||
|
echo ""
|
||||||
|
echo "📤 Next Steps:"
|
||||||
|
echo ""
|
||||||
|
echo " For Direct Distribution (APK):"
|
||||||
|
echo " 1. Upload APK to your server or file host"
|
||||||
|
echo " 2. Share download link with users"
|
||||||
|
echo " 3. Users enable 'Install from Unknown Sources'"
|
||||||
|
echo " 4. Users download and install"
|
||||||
|
echo ""
|
||||||
|
echo " For Google Play Store (AAB):"
|
||||||
|
echo " 1. Go to https://play.google.com/console"
|
||||||
|
echo " 2. Select your app"
|
||||||
|
echo " 3. Go to Release → Production"
|
||||||
|
echo " 4. Create new release"
|
||||||
|
echo " 5. Upload app-release.aab"
|
||||||
|
echo " 6. Add release notes"
|
||||||
|
echo " 7. Review and roll out"
|
||||||
|
echo ""
|
||||||
|
echo "📋 Version: $VERSION"
|
||||||
|
echo " Update version in pubspec.yaml for next release"
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
|
@ -0,0 +1,111 @@
|
||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
# LuckyChit Flutter Web - Automated Full Deployment
|
||||||
|
# This script builds AND deploys to production server
|
||||||
|
|
||||||
|
# ============================================
|
||||||
|
# CONFIGURATION - UPDATE THESE VALUES
|
||||||
|
# ============================================
|
||||||
|
|
||||||
|
# Server Configuration
|
||||||
|
SERVER_USER="luckychit" # Your server username
|
||||||
|
SERVER_HOST="your-server-ip" # Your server IP or domain
|
||||||
|
WEB_DIR="/var/www/luckychit" # Web directory on server
|
||||||
|
USE_PM2=false # Set to true if using PM2 instead of nginx
|
||||||
|
PM2_APP_NAME="luckychit-web" # PM2 app name (if using PM2)
|
||||||
|
|
||||||
|
# ============================================
|
||||||
|
# DEPLOYMENT SCRIPT - DO NOT EDIT BELOW
|
||||||
|
# ============================================
|
||||||
|
|
||||||
|
echo "🚀 LuckyChit Flutter Web - Auto Deployment"
|
||||||
|
echo "==========================================="
|
||||||
|
echo ""
|
||||||
|
echo "📋 Configuration:"
|
||||||
|
echo " Server: $SERVER_USER@$SERVER_HOST"
|
||||||
|
echo " Target: $WEB_DIR"
|
||||||
|
echo " Method: $([ "$USE_PM2" = true ] && echo 'PM2' || echo 'nginx')"
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
# Check if we're in the right directory
|
||||||
|
if [ ! -f "pubspec.yaml" ]; then
|
||||||
|
echo "❌ Error: pubspec.yaml not found!"
|
||||||
|
echo "Please run this script from the luckychit directory"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Clean and build
|
||||||
|
echo "🧹 Step 1/4: Cleaning..."
|
||||||
|
flutter clean
|
||||||
|
|
||||||
|
echo "📦 Step 2/4: Getting dependencies..."
|
||||||
|
flutter pub get
|
||||||
|
|
||||||
|
echo "🔨 Step 3/4: Building for web..."
|
||||||
|
flutter build web --release
|
||||||
|
|
||||||
|
if [ $? -ne 0 ]; then
|
||||||
|
echo "❌ Build failed!"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "✅ Build successful!"
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
# Deploy to server
|
||||||
|
echo "📤 Step 4/4: Deploying to production server..."
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
if command -v rsync &> /dev/null; then
|
||||||
|
# Use rsync (faster, incremental)
|
||||||
|
echo "Using rsync for deployment..."
|
||||||
|
rsync -avz --delete build/web/ $SERVER_USER@$SERVER_HOST:$WEB_DIR/
|
||||||
|
else
|
||||||
|
# Fallback to scp
|
||||||
|
echo "Using scp for deployment..."
|
||||||
|
scp -r build/web/* $SERVER_USER@$SERVER_HOST:$WEB_DIR/
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ $? -ne 0 ]; then
|
||||||
|
echo "❌ Deployment failed!"
|
||||||
|
echo "Please check:"
|
||||||
|
echo " - Server credentials are correct"
|
||||||
|
echo " - You have SSH access to the server"
|
||||||
|
echo " - Target directory exists and has write permissions"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo ""
|
||||||
|
echo "✅ Files uploaded successfully!"
|
||||||
|
|
||||||
|
# Restart service if using PM2
|
||||||
|
if [ "$USE_PM2" = true ]; then
|
||||||
|
echo ""
|
||||||
|
echo "🔄 Restarting PM2 service..."
|
||||||
|
ssh $SERVER_USER@$SERVER_HOST "pm2 restart $PM2_APP_NAME"
|
||||||
|
|
||||||
|
if [ $? -eq 0 ]; then
|
||||||
|
echo "✅ PM2 restarted successfully!"
|
||||||
|
else
|
||||||
|
echo "⚠️ PM2 restart failed - you may need to restart manually"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo ""
|
||||||
|
echo "=========================================="
|
||||||
|
echo "🎉 Deployment Complete!"
|
||||||
|
echo ""
|
||||||
|
echo "🌐 Your app should now be live with the latest changes"
|
||||||
|
echo ""
|
||||||
|
echo "📝 Important:"
|
||||||
|
echo " - Users may need to clear browser cache (Ctrl+Shift+R)"
|
||||||
|
echo " - Test the app in an incognito window first"
|
||||||
|
echo ""
|
||||||
|
echo "🔍 Monitor logs:"
|
||||||
|
if [ "$USE_PM2" = true ]; then
|
||||||
|
echo " ssh $SERVER_USER@$SERVER_HOST 'pm2 logs $PM2_APP_NAME'"
|
||||||
|
else
|
||||||
|
echo " ssh $SERVER_USER@$SERVER_HOST 'sudo tail -f /var/log/nginx/error.log'"
|
||||||
|
fi
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
|
@ -0,0 +1,55 @@
|
||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
# LuckyChit Flutter Web Deployment Script
|
||||||
|
# Quick script to rebuild and deploy web changes
|
||||||
|
|
||||||
|
echo "🚀 Deploying Flutter Web Updates"
|
||||||
|
echo "================================="
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
# Check if we're in the right directory
|
||||||
|
if [ ! -f "pubspec.yaml" ]; then
|
||||||
|
echo "❌ Error: pubspec.yaml not found!"
|
||||||
|
echo "Please run this script from the luckychit directory"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Clean previous build
|
||||||
|
echo "🧹 Cleaning previous build..."
|
||||||
|
flutter clean
|
||||||
|
|
||||||
|
# Get dependencies
|
||||||
|
echo "📦 Getting dependencies..."
|
||||||
|
flutter pub get
|
||||||
|
|
||||||
|
# Build for production
|
||||||
|
echo "🔨 Building for web (production mode)..."
|
||||||
|
echo " This may take a few minutes..."
|
||||||
|
flutter build web --release
|
||||||
|
|
||||||
|
# Check if build was successful
|
||||||
|
if [ $? -eq 0 ]; then
|
||||||
|
echo ""
|
||||||
|
echo "✅ Build successful!"
|
||||||
|
echo ""
|
||||||
|
echo "📁 Build output location: build/web/"
|
||||||
|
echo ""
|
||||||
|
echo "📤 Next steps to deploy:"
|
||||||
|
echo ""
|
||||||
|
echo "Option 1 - nginx (Recommended):"
|
||||||
|
echo " sudo cp -r build/web/* /var/www/luckychit/"
|
||||||
|
echo " sudo systemctl restart nginx"
|
||||||
|
echo ""
|
||||||
|
echo "Option 2 - PM2 with Express:"
|
||||||
|
echo " pm2 restart luckychit-web"
|
||||||
|
echo ""
|
||||||
|
echo "Option 3 - Upload to server:"
|
||||||
|
echo " scp -r build/web/* user@server:/var/www/luckychit/"
|
||||||
|
echo ""
|
||||||
|
echo "💡 Tip: Users may need to clear browser cache (Ctrl+Shift+R)"
|
||||||
|
else
|
||||||
|
echo ""
|
||||||
|
echo "❌ Build failed! Please check the errors above."
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
|
@ -0,0 +1,27 @@
|
||||||
|
module.exports = {
|
||||||
|
apps: [
|
||||||
|
{
|
||||||
|
name: 'luckychit-web',
|
||||||
|
script: './web-server.js',
|
||||||
|
instances: 2, // Run 2 instances for load balancing
|
||||||
|
exec_mode: 'cluster',
|
||||||
|
autorestart: true,
|
||||||
|
watch: false, // Set to true for development
|
||||||
|
max_memory_restart: '500M',
|
||||||
|
env: {
|
||||||
|
NODE_ENV: 'development',
|
||||||
|
PORT: 8080
|
||||||
|
},
|
||||||
|
env_production: {
|
||||||
|
NODE_ENV: 'production',
|
||||||
|
PORT: 8080
|
||||||
|
},
|
||||||
|
error_file: './logs/web-err.log',
|
||||||
|
out_file: './logs/web-out.log',
|
||||||
|
log_file: './logs/web-combined.log',
|
||||||
|
time: true,
|
||||||
|
merge_logs: true
|
||||||
|
}
|
||||||
|
]
|
||||||
|
};
|
||||||
|
|
||||||
|
|
@ -60,7 +60,7 @@ class AppTheme {
|
||||||
),
|
),
|
||||||
|
|
||||||
// Card Theme
|
// Card Theme
|
||||||
cardTheme: CardThemeData(
|
cardTheme: CardTheme(
|
||||||
elevation: 2,
|
elevation: 2,
|
||||||
shape: RoundedRectangleBorder(
|
shape: RoundedRectangleBorder(
|
||||||
borderRadius: BorderRadius.circular(16.r),
|
borderRadius: BorderRadius.circular(16.r),
|
||||||
|
|
@ -183,11 +183,11 @@ class AppTheme {
|
||||||
),
|
),
|
||||||
|
|
||||||
// Dialog Theme
|
// Dialog Theme
|
||||||
dialogTheme: DialogThemeData(
|
dialogTheme: DialogTheme(
|
||||||
|
elevation: 4,
|
||||||
shape: RoundedRectangleBorder(
|
shape: RoundedRectangleBorder(
|
||||||
borderRadius: BorderRadius.circular(16.r),
|
borderRadius: BorderRadius.circular(16.r),
|
||||||
),
|
),
|
||||||
elevation: 4,
|
|
||||||
),
|
),
|
||||||
|
|
||||||
// Snackbar Theme
|
// Snackbar Theme
|
||||||
|
|
@ -241,7 +241,7 @@ class AppTheme {
|
||||||
),
|
),
|
||||||
|
|
||||||
// Card Theme
|
// Card Theme
|
||||||
cardTheme: CardThemeData(
|
cardTheme: CardTheme(
|
||||||
elevation: 4,
|
elevation: 4,
|
||||||
shape: RoundedRectangleBorder(
|
shape: RoundedRectangleBorder(
|
||||||
borderRadius: BorderRadius.circular(16.r),
|
borderRadius: BorderRadius.circular(16.r),
|
||||||
|
|
@ -364,12 +364,12 @@ class AppTheme {
|
||||||
),
|
),
|
||||||
|
|
||||||
// Dialog Theme
|
// Dialog Theme
|
||||||
dialogTheme: DialogThemeData(
|
dialogTheme: DialogTheme(
|
||||||
backgroundColor: darkSurface,
|
backgroundColor: darkSurface,
|
||||||
|
elevation: 4,
|
||||||
shape: RoundedRectangleBorder(
|
shape: RoundedRectangleBorder(
|
||||||
borderRadius: BorderRadius.circular(16.r),
|
borderRadius: BorderRadius.circular(16.r),
|
||||||
),
|
),
|
||||||
elevation: 4,
|
|
||||||
),
|
),
|
||||||
|
|
||||||
// Snackbar Theme
|
// Snackbar Theme
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,83 @@
|
||||||
|
/**
|
||||||
|
* LuckyChit Web Server
|
||||||
|
* Express server to serve Flutter web build with proper caching
|
||||||
|
*
|
||||||
|
* Usage:
|
||||||
|
* node web-server.js
|
||||||
|
* Or with PM2:
|
||||||
|
* pm2 start web-server.js --name "luckychit-web"
|
||||||
|
*/
|
||||||
|
|
||||||
|
const express = require('express');
|
||||||
|
const path = require('path');
|
||||||
|
const fs = require('fs');
|
||||||
|
|
||||||
|
const app = express();
|
||||||
|
const PORT = process.env.PORT || 8080;
|
||||||
|
const BUILD_DIR = path.join(__dirname, 'build/web');
|
||||||
|
|
||||||
|
// Check if build directory exists
|
||||||
|
if (!fs.existsSync(BUILD_DIR)) {
|
||||||
|
console.error('❌ Error: build/web directory not found!');
|
||||||
|
console.error(' Please run: flutter build web --release');
|
||||||
|
process.exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Security headers
|
||||||
|
app.use((req, res, next) => {
|
||||||
|
res.setHeader('X-Content-Type-Options', 'nosniff');
|
||||||
|
res.setHeader('X-Frame-Options', 'SAMEORIGIN');
|
||||||
|
res.setHeader('X-XSS-Protection', '1; mode=block');
|
||||||
|
next();
|
||||||
|
});
|
||||||
|
|
||||||
|
// Serve static files with caching strategy
|
||||||
|
app.use(express.static(BUILD_DIR, {
|
||||||
|
maxAge: '1y', // Cache static assets for 1 year
|
||||||
|
immutable: true,
|
||||||
|
setHeaders: (res, filePath) => {
|
||||||
|
// Don't cache HTML files (always serve fresh)
|
||||||
|
if (filePath.endsWith('.html')) {
|
||||||
|
res.setHeader('Cache-Control', 'no-cache, no-store, must-revalidate');
|
||||||
|
res.setHeader('Pragma', 'no-cache');
|
||||||
|
res.setHeader('Expires', '0');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}));
|
||||||
|
|
||||||
|
// Handle Flutter routes (SPA - Single Page Application)
|
||||||
|
// Any route not found as a static file should serve index.html
|
||||||
|
app.get('*', (req, res) => {
|
||||||
|
res.sendFile(path.join(BUILD_DIR, 'index.html'));
|
||||||
|
});
|
||||||
|
|
||||||
|
// Error handling
|
||||||
|
app.use((err, req, res, next) => {
|
||||||
|
console.error('Error:', err);
|
||||||
|
res.status(500).send('Internal Server Error');
|
||||||
|
});
|
||||||
|
|
||||||
|
// Start server
|
||||||
|
app.listen(PORT, '0.0.0.0', () => {
|
||||||
|
console.log('');
|
||||||
|
console.log('✅ LuckyChit Flutter Web App');
|
||||||
|
console.log('============================');
|
||||||
|
console.log(`🌐 Running on: http://localhost:${PORT}`);
|
||||||
|
console.log(`📁 Serving: ${BUILD_DIR}`);
|
||||||
|
console.log('');
|
||||||
|
console.log('📝 Logs:');
|
||||||
|
console.log(' Access: http://localhost:' + PORT);
|
||||||
|
console.log('');
|
||||||
|
});
|
||||||
|
|
||||||
|
// Graceful shutdown
|
||||||
|
process.on('SIGTERM', () => {
|
||||||
|
console.log('SIGTERM received, shutting down gracefully...');
|
||||||
|
process.exit(0);
|
||||||
|
});
|
||||||
|
|
||||||
|
process.on('SIGINT', () => {
|
||||||
|
console.log('SIGINT received, shutting down gracefully...');
|
||||||
|
process.exit(0);
|
||||||
|
});
|
||||||
|
|
||||||
Loading…
Reference in New Issue