Implement dynamic daily verse system with rotating Biblical content
- Add daily-verse API endpoint with 7 rotating verses in Romanian and English - Replace static homepage verse with dynamic fetch from API - Ensure consistent daily rotation using day-of-year calculation - Support both ro and en locales for verse content 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
301
temp/production-deployment-plan.md
Normal file
301
temp/production-deployment-plan.md
Normal file
@@ -0,0 +1,301 @@
|
||||
# Biblical Guide - Production Deployment Plan
|
||||
|
||||
## Overview
|
||||
This guide covers deploying the Biblical Guide (ghidul-biblic) application in production mode without local nginx, assuming you'll use a separate nginx proxy manager server.
|
||||
|
||||
## Current Application Status
|
||||
- ✅ Next.js 15.5.3 application
|
||||
- ✅ Database configured and working
|
||||
- ✅ Running on port 3010 in development
|
||||
- ✅ Multi-language support (English/Romanian)
|
||||
- ✅ Docker configuration ready
|
||||
|
||||
## Production Deployment Options
|
||||
|
||||
### Option 1: Docker Compose Production (Recommended)
|
||||
|
||||
#### Prerequisites
|
||||
1. Docker and Docker Compose installed
|
||||
2. Environment variables configured
|
||||
3. External nginx proxy manager configured to route to your server
|
||||
|
||||
#### Step 1: Environment Configuration
|
||||
Create production environment file:
|
||||
```bash
|
||||
cp .env.example .env.production
|
||||
```
|
||||
|
||||
Edit `.env.production` with production values:
|
||||
```bash
|
||||
# Database - Use strong password in production
|
||||
DATABASE_URL=postgresql://bible_admin:STRONG_PASSWORD_HERE@postgres:5432/bible_chat
|
||||
DB_PASSWORD=STRONG_PASSWORD_HERE
|
||||
|
||||
# Authentication - Generate secure secrets
|
||||
NEXTAUTH_URL=https://yourdomain.com
|
||||
NEXTAUTH_SECRET=generate-long-random-secret-here
|
||||
JWT_SECRET=another-long-random-secret
|
||||
|
||||
# Azure OpenAI (if using AI features)
|
||||
AZURE_OPENAI_KEY=your-azure-key
|
||||
AZURE_OPENAI_ENDPOINT=https://your-resource.openai.azure.com
|
||||
AZURE_OPENAI_DEPLOYMENT=gpt-4
|
||||
|
||||
# Ollama (optional - if using local AI)
|
||||
OLLAMA_API_URL=http://your-ollama-server:11434
|
||||
```
|
||||
|
||||
#### Step 2: Create Production Docker Compose
|
||||
Create `docker-compose.prod.simple.yml`:
|
||||
```yaml
|
||||
version: '3.8'
|
||||
|
||||
services:
|
||||
postgres:
|
||||
image: pgvector/pgvector:pg16
|
||||
restart: always
|
||||
environment:
|
||||
POSTGRES_DB: bible_chat
|
||||
POSTGRES_USER: bible_admin
|
||||
POSTGRES_PASSWORD: ${DB_PASSWORD}
|
||||
volumes:
|
||||
- postgres_data:/var/lib/postgresql/data
|
||||
- ./scripts/init.sql:/docker-entrypoint-initdb.d/init.sql
|
||||
networks:
|
||||
- bible_network
|
||||
healthcheck:
|
||||
test: ["CMD-SHELL", "pg_isready -U bible_admin -d bible_chat"]
|
||||
interval: 30s
|
||||
timeout: 10s
|
||||
retries: 3
|
||||
|
||||
app:
|
||||
build:
|
||||
context: .
|
||||
dockerfile: docker/Dockerfile.prod
|
||||
restart: always
|
||||
ports:
|
||||
- "3010:3000" # Expose on port 3010 for external proxy
|
||||
environment:
|
||||
DATABASE_URL: postgresql://bible_admin:${DB_PASSWORD}@postgres:5432/bible_chat
|
||||
AZURE_OPENAI_KEY: ${AZURE_OPENAI_KEY}
|
||||
AZURE_OPENAI_ENDPOINT: ${AZURE_OPENAI_ENDPOINT}
|
||||
AZURE_OPENAI_DEPLOYMENT: ${AZURE_OPENAI_DEPLOYMENT}
|
||||
OLLAMA_API_URL: ${OLLAMA_API_URL}
|
||||
JWT_SECRET: ${JWT_SECRET}
|
||||
NEXTAUTH_URL: ${NEXTAUTH_URL}
|
||||
NEXTAUTH_SECRET: ${NEXTAUTH_SECRET}
|
||||
NODE_ENV: production
|
||||
depends_on:
|
||||
postgres:
|
||||
condition: service_healthy
|
||||
networks:
|
||||
- bible_network
|
||||
healthcheck:
|
||||
test: ["CMD-SHELL", "curl -f http://localhost:3000/api/health || exit 1"]
|
||||
interval: 30s
|
||||
timeout: 10s
|
||||
retries: 3
|
||||
|
||||
networks:
|
||||
bible_network:
|
||||
driver: bridge
|
||||
|
||||
volumes:
|
||||
postgres_data:
|
||||
```
|
||||
|
||||
#### Step 3: Deploy to Production
|
||||
```bash
|
||||
# Stop development server first
|
||||
pkill -f "next dev"
|
||||
|
||||
# Load production environment
|
||||
export $(cat .env.production | xargs)
|
||||
|
||||
# Build and start production services
|
||||
docker-compose -f docker-compose.prod.simple.yml up -d --build
|
||||
|
||||
# Check status
|
||||
docker-compose -f docker-compose.prod.simple.yml ps
|
||||
docker-compose -f docker-compose.prod.simple.yml logs app
|
||||
```
|
||||
|
||||
#### Step 4: Configure External Nginx Proxy Manager
|
||||
Point your nginx proxy manager to:
|
||||
- **Target**: `http://your-server-ip:3010`
|
||||
- **Health Check**: `http://your-server-ip:3010/api/health`
|
||||
|
||||
### Option 2: Direct Node.js Production (Alternative)
|
||||
|
||||
#### Step 1: Build the Application
|
||||
```bash
|
||||
# Install production dependencies
|
||||
npm ci --only=production
|
||||
|
||||
# Generate Prisma client
|
||||
npx prisma generate
|
||||
|
||||
# Build the application
|
||||
npm run build
|
||||
```
|
||||
|
||||
#### Step 2: Start Production Server
|
||||
```bash
|
||||
# Set production environment
|
||||
export NODE_ENV=production
|
||||
export PORT=3010
|
||||
export HOSTNAME=0.0.0.0
|
||||
|
||||
# Load environment variables
|
||||
export $(cat .env.production | xargs)
|
||||
|
||||
# Start the production server
|
||||
npm start
|
||||
```
|
||||
|
||||
#### Step 3: Process Management (Optional)
|
||||
Use PM2 for process management:
|
||||
```bash
|
||||
# Install PM2
|
||||
npm install -g pm2
|
||||
|
||||
# Create ecosystem file
|
||||
cat > ecosystem.config.js << 'EOF'
|
||||
module.exports = {
|
||||
apps: [{
|
||||
name: 'ghidul-biblic',
|
||||
script: 'npm',
|
||||
args: 'start',
|
||||
cwd: '/root/ghidul-biblic',
|
||||
env: {
|
||||
NODE_ENV: 'production',
|
||||
PORT: 3010,
|
||||
HOSTNAME: '0.0.0.0'
|
||||
},
|
||||
env_file: '.env.production'
|
||||
}]
|
||||
}
|
||||
EOF
|
||||
|
||||
# Start with PM2
|
||||
pm2 start ecosystem.config.js
|
||||
pm2 save
|
||||
pm2 startup
|
||||
```
|
||||
|
||||
## Production Checklist
|
||||
|
||||
### Security
|
||||
- [ ] Strong database passwords set
|
||||
- [ ] JWT secrets generated (min 32 characters)
|
||||
- [ ] NEXTAUTH_SECRET generated
|
||||
- [ ] Environment files secured (not in git)
|
||||
- [ ] Database not exposed to public internet
|
||||
|
||||
### Performance
|
||||
- [ ] Application built with `npm run build`
|
||||
- [ ] Database optimized for production
|
||||
- [ ] Proper caching headers configured in proxy
|
||||
- [ ] Health checks configured
|
||||
|
||||
### Monitoring
|
||||
- [ ] Health endpoint accessible: `/api/health`
|
||||
- [ ] Database connection monitoring
|
||||
- [ ] Application logs configured
|
||||
- [ ] Error tracking setup
|
||||
|
||||
### External Services
|
||||
- [ ] Azure OpenAI configured (if using AI features)
|
||||
- [ ] Ollama server configured (if using local AI)
|
||||
- [ ] External nginx proxy manager configured
|
||||
|
||||
## Nginx Proxy Manager Configuration
|
||||
|
||||
### Proxy Host Settings
|
||||
- **Domain Names**: `yourdomain.com`
|
||||
- **Scheme**: `http`
|
||||
- **Forward Hostname/IP**: `your-server-ip`
|
||||
- **Forward Port**: `3010`
|
||||
- **Cache Assets**: `Yes`
|
||||
- **Block Common Exploits**: `Yes`
|
||||
- **Websockets Support**: `Yes`
|
||||
|
||||
### SSL Configuration
|
||||
- Enable SSL with Let's Encrypt or your certificate
|
||||
- Force SSL redirect
|
||||
- HTTP/2 Support
|
||||
|
||||
### Custom Nginx Configuration (Advanced)
|
||||
```nginx
|
||||
# Add to Custom Nginx Configuration in Proxy Manager
|
||||
location /api/health {
|
||||
access_log off;
|
||||
}
|
||||
|
||||
location /_next/static {
|
||||
expires 1y;
|
||||
add_header Cache-Control "public, immutable";
|
||||
}
|
||||
|
||||
client_max_body_size 10M;
|
||||
```
|
||||
|
||||
## Troubleshooting
|
||||
|
||||
### Common Issues
|
||||
1. **Port conflicts**: Ensure port 3010 is available
|
||||
2. **Database connection**: Check DATABASE_URL format
|
||||
3. **Environment variables**: Verify all required vars are set
|
||||
4. **Build errors**: Check Node.js version compatibility
|
||||
|
||||
### Health Check Commands
|
||||
```bash
|
||||
# Check application health
|
||||
curl http://localhost:3010/api/health
|
||||
|
||||
# Check Docker services
|
||||
docker-compose -f docker-compose.prod.simple.yml ps
|
||||
|
||||
# View logs
|
||||
docker-compose -f docker-compose.prod.simple.yml logs -f app
|
||||
```
|
||||
|
||||
### Maintenance Commands
|
||||
```bash
|
||||
# Update application
|
||||
git pull
|
||||
docker-compose -f docker-compose.prod.simple.yml up -d --build
|
||||
|
||||
# Database backup
|
||||
docker-compose -f docker-compose.prod.simple.yml exec postgres pg_dump -U bible_admin bible_chat > backup.sql
|
||||
|
||||
# View resource usage
|
||||
docker stats
|
||||
```
|
||||
|
||||
## Next Steps After Deployment
|
||||
|
||||
1. **Configure DNS** to point to your server
|
||||
2. **Setup SSL certificate** in nginx proxy manager
|
||||
3. **Configure monitoring** and alerting
|
||||
4. **Setup automated backups** for database
|
||||
5. **Test all functionality** in production environment
|
||||
6. **Setup log rotation** and monitoring
|
||||
|
||||
## Performance Optimization
|
||||
|
||||
### Database
|
||||
- Regular VACUUM and ANALYZE
|
||||
- Monitor slow queries
|
||||
- Configure connection pooling if needed
|
||||
|
||||
### Application
|
||||
- Monitor memory usage
|
||||
- Setup proper logging levels
|
||||
- Configure rate limiting in proxy if needed
|
||||
|
||||
### Caching
|
||||
- Static assets cached by proxy
|
||||
- API responses cached where appropriate
|
||||
- Database query optimization
|
||||
Reference in New Issue
Block a user