FairRelay / DEPLOYMENT.md
MouleeswaranM's picture
docs: Add DEPLOYMENT.md - complete production deployment guide for LoRRI integration (#18)
aeec417
|
raw
history blame
10.3 kB
# FairRelay β€” Production Deployment Guide
## Architecture Overview
```
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ LoRRI Production (logisticsnow.in) β”‚
β”‚ Embeds FairRelay via iframe/API integration β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
β”‚ HTTPS
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β–Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ Ops Dashboard (Vercel) β”‚
β”‚ React + Vite + TailwindCSS β”‚
β”‚ Pages: FairDispatch, LoadConsolidation, AssignTasks, Analytics β”‚
β”‚ URL: https://fairrelay.vercel.app β”‚
β”‚ Root: ops/AIsupplychain/aisupply/ β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
β”‚ HTTPS (axios β†’ /api/*)
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β–Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ Node.js API Gateway (Render) β”‚
β”‚ Express + Prisma + Socket.IO β”‚
β”‚ Auth, Drivers CRUD, Packages, E-Way Bills, Carbon, Wellness β”‚
β”‚ Proxies /api/dispatch/* β†’ Brain β”‚
β”‚ URL: https://fairrelay-backend.onrender.com β”‚
β”‚ Root: ops/backend-dm/ β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
β”‚ HTTPS (proxy)
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β–Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ AI Brain (Render - Docker) β”‚
β”‚ FastAPI + LangGraph + SQLAlchemy β”‚
β”‚ 8 AI Agents: ML Effort β†’ Route Planner β†’ Fairness Manager β†’ β”‚
β”‚ Driver Liaison β†’ Final Resolution β†’ Explainability β†’ Learning β”‚
β”‚ + 5-Agent Consolidation Pipeline β”‚
β”‚ URL: https://fairrelay-brain.onrender.com β”‚
β”‚ Root: brain/ β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
β”‚
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β–Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ Databases β”‚
β”‚ β€’ PostgreSQL (Render/Supabase) β€” primary production β”‚
β”‚ β€’ SQLite fallback (auto-created if no DATABASE_URL) β”‚
β”‚ β€’ LangSmith (optional tracing) β”‚
β”‚ β€’ Gemini 2.5 Flash (optional LLM explanations) β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
```
---
## Deployment Steps
### 1. AI Brain (FastAPI) β†’ Render
```bash
# From the brain/ directory
cd brain
# Deploy to Render:
# 1. Create New Web Service β†’ Docker
# 2. Root Directory: brain
# 3. Dockerfile Path: ./Dockerfile
# 4. Environment Variables:
# APP_ENV=production
# PORT=8000
# DATABASE_URL= (leave empty for SQLite fallback)
# CORS_ORIGINS=https://fairrelay-backend.onrender.com,https://fairrelay.vercel.app,https://logisticsnow.in
# GOOGLE_API_KEY=<your-key> (optional, for Gemini explanations)
# GEMINI_MODEL=gemini-2.5-flash
# ENABLE_GEMINI_EXPLAIN=true
# LANGCHAIN_TRACING_V2=false
```
**Health check URL:** `/health`
**API Docs:** `https://fairrelay-brain.onrender.com/docs`
### 2. Node.js Backend β†’ Render
```bash
cd ops/backend-dm
# Deploy to Render:
# 1. Create New Web Service β†’ Node
# 2. Root Directory: ops/backend-dm
# 3. Build Command: npm install
# 4. Start Command: node index.js
# 5. Environment Variables:
# NODE_ENV=production
# PORT=3000
# BRAIN_URL=https://fairrelay-brain.onrender.com
# DATABASE_URL=<your-postgres-url>
# JWT_SECRET=<random-secure-string>
# CORS_ORIGINS=https://fairrelay.vercel.app,https://logisticsnow.in
```
**Health check URL:** `/health`
### 3. Ops Dashboard β†’ Vercel
```bash
cd ops/AIsupplychain/aisupply
# Deploy to Vercel:
# 1. Import from GitHub
# 2. Root Directory: ops/AIsupplychain/aisupply
# 3. Framework: Vite
# 4. Environment Variables:
# VITE_API_URL=https://fairrelay-backend.onrender.com
```
### 4. Landing Page β†’ Vercel
```bash
cd landing
# Deploy to Vercel:
# 1. Import from GitHub
# 2. Root Directory: landing
# 3. Framework: Vite
# 4. Environment Variables:
# VITE_API_URL=https://fairrelay-backend.onrender.com
```
---
## LoRRI Integration
FairRelay integrates into LoRRI (logisticsnow.in) via:
### Option A: API Integration (Recommended)
LoRRI calls FairRelay's allocation API directly:
```bash
POST https://fairrelay-backend.onrender.com/api/dispatch/allocate
Authorization: Bearer <jwt-token>
Content-Type: application/json
{
"drivers": [...],
"routes": [...],
"packages": [...]
}
```
### Option B: Embedded Dashboard
Embed the FairDispatch page in an iframe:
```html
<iframe src="https://fairrelay.vercel.app/fair-dispatch"
width="100%" height="800px"
frameborder="0" allow="clipboard-read">
</iframe>
```
### Option C: Webhook Integration
LoRRI sends webhook events β†’ FairRelay processes β†’ returns results:
```
LoRRI β†’ POST /api/v1/allocate (with drivers + packages)
← Response with fair assignments + explanations
β†’ POST /api/v1/consolidate/optimize (with shipments + trucks)
← Response with consolidated groups + carbon savings
```
---
## AI Agent Pipeline (What runs on each allocation)
| Phase | Agent | What it does | Latency |
|-------|-------|-------------|---------|
| 1 | ML Effort Agent | Builds [drivers Γ— routes] effort matrix | ~50ms |
| 2 | Route Planner | OR-Tools linear assignment (proposal 1) | ~100ms |
| 3a | Fairness Manager | Evaluates Gini/stddev/max_gap | ~20ms |
| 3b | Route Planner (re-opt) | Penalized assignment if unfair | ~80ms |
| 4 | Driver Liaison | Per-driver comfort band negotiation | ~30ms |
| 5 | Final Resolution | Resolves counter-proposals via swaps | ~50ms |
| 6 | Explainability | Generates natural language explanations | ~100ms |
| 6b | Gemini LLM (optional) | Rich multilingual explanations | ~2s |
| 7 | Learning Agent | Creates episode for config auto-tuning | ~10ms |
**Total pipeline:** ~450ms (without Gemini) / ~2.5s (with Gemini)
---
## Environment Variables Reference
### Brain (FastAPI)
| Variable | Required | Default | Description |
|----------|----------|---------|-------------|
| `DATABASE_URL` | No | SQLite | PostgreSQL URL or empty for SQLite |
| `APP_ENV` | No | production | `development` or `production` |
| `GOOGLE_API_KEY` | No | β€” | Gemini API key for LLM explanations |
| `GEMINI_MODEL` | No | gemini-2.5-flash | Model for explanations |
| `ENABLE_GEMINI_EXPLAIN` | No | false | Enable Gemini agent |
| `LANGCHAIN_API_KEY` | No | β€” | LangSmith tracing key |
| `CORS_ORIGINS` | No | * | Comma-separated allowed origins |
### Backend (Node.js)
| Variable | Required | Default | Description |
|----------|----------|---------|-------------|
| `DATABASE_URL` | Yes* | β€” | PostgreSQL for auth/drivers/packages |
| `BRAIN_URL` | Yes | localhost:8000 | URL of the AI brain service |
| `JWT_SECRET` | Yes | β€” | Secret for JWT token signing |
| `CORS_ORIGINS` | No | localhost | Allowed CORS origins |
| `PORT` | No | 3000 | Server port |
### Dashboard (React)
| Variable | Required | Default | Description |
|----------|----------|---------|-------------|
| `VITE_API_URL` | Yes | /api | Backend URL (Render) |
---
## Local Development
```bash
# Terminal 1: AI Brain
cd brain
pip install -r requirements.txt
uvicorn app.main:app --reload --port 8000
# Terminal 2: Node.js Backend
cd ops/backend-dm
npm install
echo "BRAIN_URL=http://localhost:8000" > .env
node index.js
# Terminal 3: Ops Dashboard
cd ops/AIsupplychain/aisupply
npm install
echo "VITE_API_URL=http://localhost:3000" > .env
npm run dev
```
Open http://localhost:5173 β†’ FairDispatch page β†’ Run Fair Allocation
---
## Production Checklist
- [ ] Brain deployed on Render (Docker) βœ“ Health check passes
- [ ] Node.js backend on Render βœ“ `/health` returns healthy
- [ ] Dashboard on Vercel βœ“ Connects to backend
- [ ] PostgreSQL database provisioned (Render/Supabase)
- [ ] `BRAIN_URL` in backend points to brain service
- [ ] `VITE_API_URL` in dashboard points to backend
- [ ] CORS origins include `logisticsnow.in`
- [ ] Gemini API key configured (optional but recommended)
- [ ] SSL/HTTPS on all services (automatic on Render/Vercel)
- [ ] Rate limiting active on auth endpoints
- [ ] Socket.IO CORS configured for real-time updates