rag-python-rag / DEPLOYMENT.md
viktor-hirenko
Initial commit: RAG system with local LLM
40e5eae
|
Raw
History Blame Contribute Delete
7.24 kB
# Deployment Guide
## Overview
This RAG system is a **Python backend application** that requires:
- Python runtime (3.9+)
- Ollama service running locally or remotely
- Persistent storage for ChromaDB
- 4GB+ RAM
It **cannot** be deployed as a static site.
## Why GitHub Pages Doesn't Work
GitHub Pages serves static HTML/CSS/JS files only. This project requires:
- Python interpreter
- Long-running processes (Ollama, ChromaDB)
- Server-side document processing
- Dynamic request handling
**Verdict**: GitHub Pages is incompatible with this architecture.
## Supported Deployment Options
### 1. Local Development (Recommended for Testing)
**Pros**:
- Full control
- No cost
- Fast iteration
- Privacy (documents stay local)
**Cons**:
- Not accessible remotely
- Requires manual setup
**Setup**:
```bash
# Install Ollama
curl -fsSL https://ollama.com/install.sh | sh
ollama pull llama3.2
# Run application
python main.py
```
Access at: `http://localhost:7860`
---
### 2. Hugging Face Spaces (Best for Demos)
**Pros**:
- Free tier available
- Gradio native support
- Public URL
- No server management
**Cons**:
- CPU-only (slow inference)
- Limited RAM (7GB max on free tier)
- Ephemeral storage (documents reset on restart)
- Cold start delays
**Requirements**:
- Create `app.py` (rename `main.py`)
- Add `requirements.txt`
- Configure Spaces to use Gradio SDK
- **Important**: Ollama must run in same container or use external endpoint
**Limitations**:
- Ollama models are large (~4GB for llama3.2)
- May exceed free tier storage
- Consider using smaller models (e.g., `llama3.2:1b`)
**Example `README.md` for Spaces**:
```yaml
---
title: RAG Document QA
emoji: 📚
colorFrom: blue
colorTo: green
sdk: gradio
sdk_version: 4.44.1
app_file: app.py
pinned: false
---
```
---
### 3. Cloud Platforms (Production-Ready)
#### Render
**Pros**:
- Persistent storage
- Custom Docker support
- Automatic deployments from Git
**Cons**:
- Paid plans required for sufficient resources
- ~$7/month minimum for 1GB RAM
**Setup**:
1. Create `render.yaml`:
```yaml
services:
- type: web
name: rag-system
runtime: python3
buildCommand: pip install -r requirements.txt
startCommand: python main.py
envVars:
- key: OLLAMA_HOST
value: http://localhost:11434
```
2. Add Ollama as separate service or use external endpoint
---
#### Fly.io
**Pros**:
- Generous free tier
- Global edge deployment
- Docker-based
**Cons**:
- Requires Dockerfile
- Complex setup for multi-service apps
**Setup**:
```dockerfile
FROM python:3.9-slim
# Install Ollama
RUN curl -fsSL https://ollama.com/install.sh | sh
# Copy application
COPY . /app
WORKDIR /app
RUN pip install -r requirements.txt
# Start Ollama and app
CMD ollama serve & python main.py
```
---
#### Railway
**Pros**:
- Simple Git integration
- Automatic HTTPS
- Database support
**Cons**:
- Free tier limited to 500 hours/month
- Resource constraints on free tier
**Setup**:
- Connect GitHub repository
- Set environment variables
- Deploy from `main` branch
---
### 4. Docker (Self-Hosted)
**Best for**: VPS, home server, enterprise deployment
**Dockerfile**:
```dockerfile
FROM python:3.9-slim
# Install Ollama
RUN curl -fsSL https://ollama.com/install.sh | sh
# Install dependencies
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
# Copy application
COPY . /app
WORKDIR /app
# Expose Gradio port
EXPOSE 7860
# Start services
CMD ["sh", "-c", "ollama serve & sleep 5 && ollama pull llama3.2 && python main.py"]
```
**Docker Compose**:
```yaml
version: '3.8'
services:
rag-system:
build: .
ports:
- "7860:7860"
volumes:
- ./documents:/app/documents
- ./chroma_db:/app/chroma_db
environment:
- OLLAMA_HOST=http://localhost:11434
```
---
## Deployment Checklist
Before deploying, ensure:
- [ ] Ollama is accessible (local or remote endpoint)
- [ ] Required model is pulled (`llama3.2` or alternative)
- [ ] Environment variables are set (see `.env.example`)
- [ ] Sufficient RAM available (4GB minimum, 8GB recommended)
- [ ] Persistent storage configured for `chroma_db/`
- [ ] Documents directory is populated or upload mechanism exists
- [ ] Security considerations addressed (see below)
## Security Considerations
This application is **not production-hardened**. Before public deployment:
1. **Add Authentication**
- Gradio supports basic auth: `demo.launch(auth=("username", "password"))`
- Consider OAuth for multi-user scenarios
2. **Rate Limiting**
- Implement request throttling
- Prevent abuse of LLM inference
3. **Input Validation**
- Sanitize uploaded documents
- Limit file sizes and types
4. **Network Security**
- Use HTTPS (reverse proxy with nginx/Caddy)
- Restrict Ollama endpoint access
5. **Resource Limits**
- Set memory limits in Docker
- Implement query timeouts
## Performance Optimization
For production deployments:
1. **Use GPU Acceleration**
- Ollama supports CUDA/ROCm
- 10-50x faster inference
2. **Caching**
- Cache embeddings for frequently accessed documents
- Implement query result caching
3. **Model Selection**
- Smaller models (1B-3B params) for faster responses
- Quantized models (Q4, Q5) for reduced memory
4. **Horizontal Scaling**
- Run multiple Ollama instances
- Load balance with nginx
## Cost Estimates
| Platform | Free Tier | Paid (Minimum) | Notes |
|----------|-----------|----------------|-------|
| Local | $0 | $0 | Electricity costs only |
| HF Spaces | Limited | $0 | CPU-only, slow |
| Render | No | ~$7/month | 1GB RAM insufficient |
| Fly.io | 500hrs | ~$5/month | Requires optimization |
| Railway | 500hrs | ~$5/month | Good for demos |
| VPS (Hetzner) | No | ~$5/month | Full control |
## Monitoring
Recommended monitoring for production:
- **Application Logs**: Track query latency, errors
- **Resource Usage**: RAM, CPU, disk I/O
- **Ollama Metrics**: Model load time, inference speed
- **ChromaDB Stats**: Collection size, query performance
## Backup Strategy
Critical data to backup:
- `chroma_db/` - Vector database
- `documents/` - Source documents
- `config.py` - Configuration
- `.env` - Environment variables (encrypted)
## Troubleshooting Deployments
### Issue: Ollama connection refused
**Solution**: Ensure Ollama is running before application starts
```bash
# Add to startup script
ollama serve &
sleep 5 # Wait for Ollama to initialize
python main.py
```
### Issue: Out of memory
**Solution**: Reduce model size or increase RAM
```python
# Use smaller model
OLLAMA_MODEL_NAME = "llama3.2:1b"
# Reduce chunk retrieval
DEFAULT_N_RESULTS = 3
```
### Issue: Slow cold starts
**Solution**: Keep models pre-loaded
```bash
# In Dockerfile
RUN ollama pull llama3.2
```
## Alternative: API-Only Deployment
For advanced users, deploy as REST API instead of Gradio:
1. Replace Gradio with FastAPI
2. Create separate frontend (Vue.js, React)
3. Deploy frontend to Vercel/Netlify
4. Deploy backend to Render/Fly.io
See `ARCHITECTURE.md` for API design considerations.
---
**Recommendation**: Start with local deployment, then move to Hugging Face Spaces for demos, and finally to Render/Fly.io for production.