Major Features: - ✅ AI chat with Azure OpenAI GPT-4o integration - ✅ Vector search across Bible versions (ASV English, RVA 1909 Spanish) - ✅ Multi-language support with automatic English fallback - ✅ Bible version citations in responses [ASV] [RVA 1909] - ✅ Random Bible-themed loading messages (5 variants) - ✅ Safe build script with memory guardrails - ✅ 8GB swap memory for build safety - ✅ Stripe donation integration (multiple payment methods) AI Chat Improvements: - Implement vector search with 1536-dim embeddings (Azure text-embedding-ada-002) - Search all Bible versions in user's language, fallback to English - Cite Bible versions properly in AI responses - Add 5 random loading messages: "Searching the Scriptures...", etc. - Fix Ollama conflict (disabled to use Azure OpenAI exclusively) - Optimize hybrid search queries for actual table schema Build & Infrastructure: - Create safe-build.sh script with memory monitoring (prevents server crashes) - Add 8GB swap memory for emergency relief - Document build process in BUILD_GUIDE.md - Set Node.js memory limits (4GB max during builds) Database: - Clean up 115 old vector tables with wrong dimensions - Keep only 2 tables with correct 1536-dim embeddings - Add Stripe schema for donations and subscriptions Documentation: - AI_CHAT_FINAL_STATUS.md - Complete implementation status - AI_CHAT_IMPLEMENTATION_COMPLETE.md - Technical details - BUILD_GUIDE.md - Safe building guide with guardrails - CHAT_LOADING_MESSAGES.md - Loading messages implementation - STRIPE_IMPLEMENTATION_COMPLETE.md - Stripe integration docs - STRIPE_SETUP_GUIDE.md - Stripe configuration guide 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
204 lines
4.4 KiB
Markdown
204 lines
4.4 KiB
Markdown
# Safe Build Guide
|
|
|
|
## ⚠️ IMPORTANT: Building Without Crashing the Server
|
|
|
|
The Next.js build process can consume **4-6 GB of RAM**. Without proper safeguards, this can crash the production server by triggering the Linux OOM (Out of Memory) killer.
|
|
|
|
## Problem
|
|
|
|
Your server has:
|
|
- **16 GB RAM** total
|
|
- **NO SWAP** configured (SwapTotal: 0 kB)
|
|
- Running production services (PM2, PostgreSQL, etc.)
|
|
|
|
When `next build` runs without limits, it can:
|
|
1. Consume all available memory
|
|
2. Trigger Linux OOM killer
|
|
3. Kill critical processes (PM2, database, SSH)
|
|
4. **Crash the entire server**
|
|
|
|
## Solution: Safe Build Script
|
|
|
|
### Use the Safe Build Script
|
|
|
|
```bash
|
|
# Always use this instead of 'npm run build'
|
|
bash scripts/safe-build.sh
|
|
```
|
|
|
|
### What the Safe Build Script Does
|
|
|
|
1. **✓ Checks available memory** (requires 4GB minimum)
|
|
2. **✓ Stops PM2 services** to free memory during build
|
|
3. **✓ Sets memory limits** (4GB max for Node.js)
|
|
4. **✓ Monitors memory** during build (kills if >90%)
|
|
5. **✓ Restarts services** after build completes
|
|
6. **✓ Verifies build** artifacts before finishing
|
|
|
|
### Build Process
|
|
|
|
```
|
|
Before Build: Check Memory (need 4GB+ free)
|
|
↓
|
|
Stop PM2: Free up 500MB-1GB
|
|
↓
|
|
Clear Cache: Free up 200MB-500MB
|
|
↓
|
|
Build with Limits: Max 4GB RAM
|
|
↓
|
|
Monitor: Kill if >90% memory used
|
|
↓
|
|
Verify: Check .next/BUILD_ID exists
|
|
↓
|
|
Restart PM2: Restore services
|
|
```
|
|
|
|
## Memory Limits Explained
|
|
|
|
```bash
|
|
# This limits Node.js to use maximum 4GB RAM
|
|
NODE_OPTIONS="--max-old-space-size=4096"
|
|
```
|
|
|
|
**Why 4GB?**
|
|
- Server has 16GB total
|
|
- System needs ~2GB
|
|
- PostgreSQL needs ~1GB
|
|
- PM2/services need ~500MB (when stopped)
|
|
- Leaves ~12GB available
|
|
- **4GB limit = Safe buffer of 8GB unused**
|
|
|
|
## Manual Build (NOT RECOMMENDED)
|
|
|
|
If you must build manually:
|
|
|
|
```bash
|
|
# 1. Stop PM2 first
|
|
pm2 stop all
|
|
|
|
# 2. Build with memory limit
|
|
NODE_OPTIONS="--max-old-space-size=4096" npx next build --no-lint
|
|
|
|
# 3. Restart PM2
|
|
pm2 restart all
|
|
```
|
|
|
|
**⚠️ WARNING:** This doesn't monitor memory - can still crash!
|
|
|
|
## Emergency: Server Crashed
|
|
|
|
If the server crashed during build:
|
|
|
|
1. **SSH may be dead** - Use console/VNC from hosting provider
|
|
2. **Reboot the server** if unresponsive
|
|
3. **After reboot:**
|
|
```bash
|
|
cd /root/biblical-guide
|
|
pm2 resurrect # Restore PM2 processes
|
|
pm2 save
|
|
```
|
|
|
|
## Add Swap (Recommended)
|
|
|
|
To prevent future crashes, add swap:
|
|
|
|
```bash
|
|
# Create 8GB swap file
|
|
sudo fallocate -l 8G /swapfile
|
|
sudo chmod 600 /swapfile
|
|
sudo mkswap /swapfile
|
|
sudo swapon /swapfile
|
|
|
|
# Make permanent
|
|
echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab
|
|
|
|
# Verify
|
|
free -h
|
|
```
|
|
|
|
## Build Optimization Tips
|
|
|
|
### 1. Use Build Cache (When Possible)
|
|
|
|
```bash
|
|
# Don't delete .next/cache unless necessary
|
|
# Speeds up builds and uses less memory
|
|
```
|
|
|
|
### 2. Disable Source Maps in Production
|
|
|
|
In `next.config.js`:
|
|
```javascript
|
|
productionBrowserSourceMaps: false,
|
|
```
|
|
|
|
### 3. Use TypeScript Without Type Checking
|
|
|
|
```bash
|
|
# Already using --no-lint flag
|
|
npx next build --no-lint
|
|
```
|
|
|
|
### 4. Increase Memory for Large Sites
|
|
|
|
If build fails with OOM even with safe-build.sh:
|
|
|
|
```bash
|
|
# Edit safe-build.sh line 70:
|
|
NODE_OPTIONS="--max-old-space-size=6144" # Use 6GB instead of 4GB
|
|
```
|
|
|
|
## Monitoring During Build
|
|
|
|
```bash
|
|
# In another terminal, monitor memory:
|
|
watch -n 2 'free -h && echo "---" && ps aux | grep next | grep -v grep'
|
|
```
|
|
|
|
## Common Build Errors
|
|
|
|
### Error: "JavaScript heap out of memory"
|
|
|
|
**Cause:** Node.js hit memory limit
|
|
**Fix:** Increase `--max-old-space-size` in safe-build.sh
|
|
|
|
### Error: "Killed" (exit code 137)
|
|
|
|
**Cause:** Linux OOM killer terminated the process
|
|
**Fix:** You need more free RAM - stop more services or add swap
|
|
|
|
### Error: "Could not find BUILD_ID"
|
|
|
|
**Cause:** Build was interrupted or failed
|
|
**Fix:** Run safe-build.sh again
|
|
|
|
## Production Deployment Checklist
|
|
|
|
Before running builds on production:
|
|
|
|
- [ ] Check free memory: `free -h` (need 4GB+ available)
|
|
- [ ] Use safe-build.sh script
|
|
- [ ] Monitor in separate terminal
|
|
- [ ] Have console access ready (in case SSH dies)
|
|
- [ ] Consider adding swap if not present
|
|
|
|
## Best Practice: Build Elsewhere
|
|
|
|
**Recommended Approach:**
|
|
|
|
1. Build on local machine or CI/CD
|
|
2. Commit `.next` folder to git (or use artifacts)
|
|
3. Deploy to server without building
|
|
4. Just run `pm2 restart all`
|
|
|
|
This avoids building on production entirely!
|
|
|
|
---
|
|
|
|
## Summary
|
|
|
|
✅ **ALWAYS** use `bash scripts/safe-build.sh`
|
|
❌ **NEVER** run `npm run build` directly
|
|
⚠️ **MONITOR** memory during builds
|
|
💾 **ADD SWAP** to prevent OOM kills
|