Commit Β·
aeec417
1
Parent(s): c553567
docs: Add DEPLOYMENT.md - complete production deployment guide for LoRRI integration (#18)
Browse files- docs: Add DEPLOYMENT.md - complete production deployment guide for LoRRI integration (0c1769796e4d38b4e58d355a2e13c5f8b9a78cf1)
- DEPLOYMENT.md +210 -166
DEPLOYMENT.md
CHANGED
|
@@ -1,205 +1,249 @@
|
|
| 1 |
-
#
|
| 2 |
|
| 3 |
-
## Architecture Overview
|
| 4 |
|
| 5 |
```
|
| 6 |
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
|
| 7 |
-
β
|
| 8 |
-
β
|
| 9 |
-
|
| 10 |
-
β
|
| 11 |
-
|
| 12 |
-
β
|
| 13 |
-
β
|
| 14 |
-
β
|
| 15 |
-
β
|
| 16 |
-
β
|
| 17 |
-
|
| 18 |
-
β
|
| 19 |
-
|
| 20 |
-
|
| 21 |
-
|
| 22 |
-
|
| 23 |
-
|
| 24 |
-
β
|
| 25 |
-
β
|
| 26 |
-
|
| 27 |
-
β
|
| 28 |
-
|
| 29 |
-
β
|
| 30 |
-
β
|
| 31 |
-
β
|
| 32 |
-
β
|
| 33 |
-
β
|
| 34 |
-
β
|
| 35 |
-
|
| 36 |
-
β β
|
| 37 |
-
βΌ βΌ
|
| 38 |
-
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
|
| 39 |
-
β FairRelay AI Brain (brain/) β
|
| 40 |
-
β Render: https://fairrelay-brain.onrender.com β
|
| 41 |
-
β β
|
| 42 |
-
β ββββββββββββββββββββ LangGraph Workflow ββββββββββββββββββββββββ β
|
| 43 |
-
β β β β
|
| 44 |
-
β β ββββββββββββ ββββββββββββ ββββββββββββ ββββββββββββ β β
|
| 45 |
-
β β βML Effort ββ β Route ββ β Fairness ββ β Route β β β
|
| 46 |
-
β β β Agent β β Planner β β Manager β βPlanner v2β β β
|
| 47 |
-
β β ββββββββββββ ββββββββββββ ββββββββββββ ββββββββββββ β β
|
| 48 |
-
β β β β β β β
|
| 49 |
-
β β βΌ βΌ βΌ β β
|
| 50 |
-
β β ββββββββββββ ββββββββββββ ββββββββββββ ββββββββββββ β β
|
| 51 |
-
β β β Driver ββ β Final ββ βExplainab-ββ β Gemini β β β
|
| 52 |
-
β β β Liaison β βResolutionβ β ility β β(optional)β β β
|
| 53 |
-
β β ββββββββββββ ββββββββββββ ββββββββββββ ββββββββββββ β β
|
| 54 |
-
β β β β
|
| 55 |
-
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
|
| 56 |
-
β β
|
| 57 |
-
β Features: K-Means clustering, OR-Tools optimization, Gini index, β
|
| 58 |
-
β EV-first routing, night safety, recovery days, wellness scoring β
|
| 59 |
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
|
| 60 |
-
|
| 61 |
-
|
| 62 |
-
|
| 63 |
-
β
|
| 64 |
-
β
|
| 65 |
-
β
|
| 66 |
-
β
|
| 67 |
-
β β fairrelay.vercel β β fairrelay-ops. β β MyFairRelay β β
|
| 68 |
-
β β .app β β vercel.app β β (Android/iOS) β β
|
| 69 |
-
β βββββββββββββββββββββ βββββββββββββββββββββ ββββββββββββββββββ β
|
| 70 |
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
|
| 71 |
```
|
| 72 |
|
| 73 |
-
|
|
|
|
|
|
|
| 74 |
|
| 75 |
-
### 1. AI Brain (FastAPI
|
| 76 |
|
| 77 |
```bash
|
| 78 |
-
# From
|
| 79 |
-
|
| 80 |
-
|
| 81 |
-
#
|
| 82 |
-
|
| 83 |
-
|
| 84 |
-
|
| 85 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 86 |
```
|
| 87 |
|
| 88 |
-
**URL**
|
| 89 |
-
**
|
| 90 |
-
**Docs**: `GET /docs`
|
| 91 |
|
| 92 |
-
### 2.
|
| 93 |
|
| 94 |
```bash
|
| 95 |
-
|
| 96 |
-
|
| 97 |
-
|
| 98 |
-
#
|
| 99 |
-
|
| 100 |
-
|
| 101 |
-
|
| 102 |
-
|
| 103 |
-
NODE_ENV=production
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 104 |
```
|
| 105 |
|
| 106 |
-
**URL**
|
| 107 |
-
**Health**: `GET /v1/health`
|
| 108 |
-
**Docs**: `GET /api/docs`
|
| 109 |
|
| 110 |
-
### 3.
|
| 111 |
|
| 112 |
```bash
|
| 113 |
-
cd
|
| 114 |
-
vercel --prod
|
| 115 |
|
| 116 |
-
#
|
| 117 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
| 118 |
```
|
| 119 |
|
| 120 |
-
### 4.
|
| 121 |
|
| 122 |
```bash
|
| 123 |
-
cd
|
| 124 |
-
vercel --prod
|
| 125 |
|
| 126 |
-
#
|
| 127 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
| 128 |
```
|
| 129 |
|
| 130 |
-
|
| 131 |
|
| 132 |
-
##
|
| 133 |
-
|
| 134 |
-
|
| 135 |
-
```
|
| 136 |
|
| 137 |
-
###
|
| 138 |
-
|
| 139 |
-
|
|
|
|
|
|
|
|
|
|
| 140 |
Content-Type: application/json
|
| 141 |
-
x-api-key: fr_live_xxx
|
| 142 |
|
| 143 |
{
|
| 144 |
-
"drivers": [
|
| 145 |
-
|
| 146 |
-
|
| 147 |
-
],
|
| 148 |
-
"routes": [
|
| 149 |
-
{ "id": "rt_A", "distance_km": 142, "difficulty": "medium" },
|
| 150 |
-
{ "id": "rt_B", "distance_km": 48, "difficulty": "easy", "is_city_centre": true }
|
| 151 |
-
],
|
| 152 |
-
"options": { "ev_first": true, "night_safety": true }
|
| 153 |
}
|
| 154 |
```
|
| 155 |
|
| 156 |
-
|
| 157 |
-
|
| 158 |
-
|
| 159 |
-
|
| 160 |
-
|
| 161 |
-
|
| 162 |
-
|
| 163 |
-
|
| 164 |
-
|
| 165 |
-
|
| 166 |
-
|
| 167 |
-
|
| 168 |
-
|
| 169 |
-
|
| 170 |
-
|
| 171 |
-
|
| 172 |
-
|
| 173 |
-
|
| 174 |
-
|
| 175 |
-
|
| 176 |
-
|
| 177 |
-
|
| 178 |
-
|
| 179 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 180 |
```
|
| 181 |
|
| 182 |
-
|
| 183 |
-
|
| 184 |
-
|
| 185 |
-
|
| 186 |
-
|
| 187 |
-
|
| 188 |
-
|
| 189 |
-
|
| 190 |
-
|
| 191 |
-
|
| 192 |
-
|
| 193 |
-
|
| 194 |
-
|
| 195 |
-
|
| 196 |
-
|
| 197 |
-
|
| 198 |
-
|
| 199 |
-
4. **Production Architecture** β API gateway + microservice brain + SSE streaming
|
| 200 |
-
5. **Explainability** β Every allocation decision has a human-readable explanation
|
| 201 |
-
6. **Driver Wellness** β Fatigue scoring, recovery days, night safety for women
|
| 202 |
-
7. **EV-First Routing** β Prioritizes electric vehicles for city-centre routes
|
| 203 |
-
8. **Learning Agent** β Multi-armed bandit tunes fairness thresholds over time
|
| 204 |
-
9. **LoRRI Integration** β Single API call from existing TMS, zero disruption
|
| 205 |
-
10. **Scale** β K-Means + OR-Tools handles 1000+ packages in <5s
|
|
|
|
| 1 |
+
# FairRelay β Production Deployment Guide
|
| 2 |
|
| 3 |
+
## Architecture Overview
|
| 4 |
|
| 5 |
```
|
| 6 |
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
|
| 7 |
+
β LoRRI Production (logisticsnow.in) β
|
| 8 |
+
β Embeds FairRelay via iframe/API integration β
|
| 9 |
+
βββββββββββββββββββββββββββββββββ¬ββββββββββββββββββββββββββββββββββββββ
|
| 10 |
+
β HTTPS
|
| 11 |
+
βββββββββββββββββββββββββββββββββΌββββββββββββββββββββββββββββββββββββββ
|
| 12 |
+
β Ops Dashboard (Vercel) β
|
| 13 |
+
β React + Vite + TailwindCSS β
|
| 14 |
+
β Pages: FairDispatch, LoadConsolidation, AssignTasks, Analytics β
|
| 15 |
+
β URL: https://fairrelay.vercel.app β
|
| 16 |
+
β Root: ops/AIsupplychain/aisupply/ β
|
| 17 |
+
βββββββββββββββββββββββββββββββββ¬ββββββββββββββββββββββββββββββββββββββ
|
| 18 |
+
β HTTPS (axios β /api/*)
|
| 19 |
+
βββββββββββββββββββββββββββββββββΌββββββββββββββββββββββββββββββββββββββ
|
| 20 |
+
β Node.js API Gateway (Render) β
|
| 21 |
+
β Express + Prisma + Socket.IO β
|
| 22 |
+
β Auth, Drivers CRUD, Packages, E-Way Bills, Carbon, Wellness β
|
| 23 |
+
β Proxies /api/dispatch/* β Brain β
|
| 24 |
+
β URL: https://fairrelay-backend.onrender.com β
|
| 25 |
+
β Root: ops/backend-dm/ β
|
| 26 |
+
βββββββββββββββββββββββββββββββββ¬ββββββββββββββββββββββββββββββββββββββ
|
| 27 |
+
β HTTPS (proxy)
|
| 28 |
+
βββββββββββββββββββββββββββββββββΌββββββββββββββββββββββββββββββββββββββ
|
| 29 |
+
β AI Brain (Render - Docker) β
|
| 30 |
+
β FastAPI + LangGraph + SQLAlchemy β
|
| 31 |
+
β 8 AI Agents: ML Effort β Route Planner β Fairness Manager β β
|
| 32 |
+
β Driver Liaison β Final Resolution β Explainability β Learning β
|
| 33 |
+
β + 5-Agent Consolidation Pipeline β
|
| 34 |
+
β URL: https://fairrelay-brain.onrender.com β
|
| 35 |
+
β Root: brain/ β
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 36 |
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
|
| 37 |
+
β
|
| 38 |
+
βββββββββββββββββββββββββββββββββΌββββββββββββββββββββββββββββββββββββββ
|
| 39 |
+
β Databases β
|
| 40 |
+
β β’ PostgreSQL (Render/Supabase) β primary production β
|
| 41 |
+
β β’ SQLite fallback (auto-created if no DATABASE_URL) β
|
| 42 |
+
β β’ LangSmith (optional tracing) β
|
| 43 |
+
β β’ Gemini 2.5 Flash (optional LLM explanations) β
|
|
|
|
|
|
|
|
|
|
| 44 |
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
|
| 45 |
```
|
| 46 |
|
| 47 |
+
---
|
| 48 |
+
|
| 49 |
+
## Deployment Steps
|
| 50 |
|
| 51 |
+
### 1. AI Brain (FastAPI) β Render
|
| 52 |
|
| 53 |
```bash
|
| 54 |
+
# From the brain/ directory
|
| 55 |
+
cd brain
|
| 56 |
+
|
| 57 |
+
# Deploy to Render:
|
| 58 |
+
# 1. Create New Web Service β Docker
|
| 59 |
+
# 2. Root Directory: brain
|
| 60 |
+
# 3. Dockerfile Path: ./Dockerfile
|
| 61 |
+
# 4. Environment Variables:
|
| 62 |
+
# APP_ENV=production
|
| 63 |
+
# PORT=8000
|
| 64 |
+
# DATABASE_URL= (leave empty for SQLite fallback)
|
| 65 |
+
# CORS_ORIGINS=https://fairrelay-backend.onrender.com,https://fairrelay.vercel.app,https://logisticsnow.in
|
| 66 |
+
# GOOGLE_API_KEY=<your-key> (optional, for Gemini explanations)
|
| 67 |
+
# GEMINI_MODEL=gemini-2.5-flash
|
| 68 |
+
# ENABLE_GEMINI_EXPLAIN=true
|
| 69 |
+
# LANGCHAIN_TRACING_V2=false
|
| 70 |
```
|
| 71 |
|
| 72 |
+
**Health check URL:** `/health`
|
| 73 |
+
**API Docs:** `https://fairrelay-brain.onrender.com/docs`
|
|
|
|
| 74 |
|
| 75 |
+
### 2. Node.js Backend β Render
|
| 76 |
|
| 77 |
```bash
|
| 78 |
+
cd ops/backend-dm
|
| 79 |
+
|
| 80 |
+
# Deploy to Render:
|
| 81 |
+
# 1. Create New Web Service β Node
|
| 82 |
+
# 2. Root Directory: ops/backend-dm
|
| 83 |
+
# 3. Build Command: npm install
|
| 84 |
+
# 4. Start Command: node index.js
|
| 85 |
+
# 5. Environment Variables:
|
| 86 |
+
# NODE_ENV=production
|
| 87 |
+
# PORT=3000
|
| 88 |
+
# BRAIN_URL=https://fairrelay-brain.onrender.com
|
| 89 |
+
# DATABASE_URL=<your-postgres-url>
|
| 90 |
+
# JWT_SECRET=<random-secure-string>
|
| 91 |
+
# CORS_ORIGINS=https://fairrelay.vercel.app,https://logisticsnow.in
|
| 92 |
```
|
| 93 |
|
| 94 |
+
**Health check URL:** `/health`
|
|
|
|
|
|
|
| 95 |
|
| 96 |
+
### 3. Ops Dashboard β Vercel
|
| 97 |
|
| 98 |
```bash
|
| 99 |
+
cd ops/AIsupplychain/aisupply
|
|
|
|
| 100 |
|
| 101 |
+
# Deploy to Vercel:
|
| 102 |
+
# 1. Import from GitHub
|
| 103 |
+
# 2. Root Directory: ops/AIsupplychain/aisupply
|
| 104 |
+
# 3. Framework: Vite
|
| 105 |
+
# 4. Environment Variables:
|
| 106 |
+
# VITE_API_URL=https://fairrelay-backend.onrender.com
|
| 107 |
```
|
| 108 |
|
| 109 |
+
### 4. Landing Page β Vercel
|
| 110 |
|
| 111 |
```bash
|
| 112 |
+
cd landing
|
|
|
|
| 113 |
|
| 114 |
+
# Deploy to Vercel:
|
| 115 |
+
# 1. Import from GitHub
|
| 116 |
+
# 2. Root Directory: landing
|
| 117 |
+
# 3. Framework: Vite
|
| 118 |
+
# 4. Environment Variables:
|
| 119 |
+
# VITE_API_URL=https://fairrelay-backend.onrender.com
|
| 120 |
```
|
| 121 |
|
| 122 |
+
---
|
| 123 |
|
| 124 |
+
## LoRRI Integration
|
| 125 |
+
|
| 126 |
+
FairRelay integrates into LoRRI (logisticsnow.in) via:
|
|
|
|
| 127 |
|
| 128 |
+
### Option A: API Integration (Recommended)
|
| 129 |
+
LoRRI calls FairRelay's allocation API directly:
|
| 130 |
+
|
| 131 |
+
```bash
|
| 132 |
+
POST https://fairrelay-backend.onrender.com/api/dispatch/allocate
|
| 133 |
+
Authorization: Bearer <jwt-token>
|
| 134 |
Content-Type: application/json
|
|
|
|
| 135 |
|
| 136 |
{
|
| 137 |
+
"drivers": [...],
|
| 138 |
+
"routes": [...],
|
| 139 |
+
"packages": [...]
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 140 |
}
|
| 141 |
```
|
| 142 |
|
| 143 |
+
### Option B: Embedded Dashboard
|
| 144 |
+
Embed the FairDispatch page in an iframe:
|
| 145 |
+
|
| 146 |
+
```html
|
| 147 |
+
<iframe src="https://fairrelay.vercel.app/fair-dispatch"
|
| 148 |
+
width="100%" height="800px"
|
| 149 |
+
frameborder="0" allow="clipboard-read">
|
| 150 |
+
</iframe>
|
| 151 |
+
```
|
| 152 |
+
|
| 153 |
+
### Option C: Webhook Integration
|
| 154 |
+
LoRRI sends webhook events β FairRelay processes β returns results:
|
| 155 |
+
|
| 156 |
+
```
|
| 157 |
+
LoRRI β POST /api/v1/allocate (with drivers + packages)
|
| 158 |
+
β Response with fair assignments + explanations
|
| 159 |
+
β POST /api/v1/consolidate/optimize (with shipments + trucks)
|
| 160 |
+
β Response with consolidated groups + carbon savings
|
| 161 |
+
```
|
| 162 |
+
|
| 163 |
+
---
|
| 164 |
+
|
| 165 |
+
## AI Agent Pipeline (What runs on each allocation)
|
| 166 |
+
|
| 167 |
+
| Phase | Agent | What it does | Latency |
|
| 168 |
+
|-------|-------|-------------|---------|
|
| 169 |
+
| 1 | ML Effort Agent | Builds [drivers Γ routes] effort matrix | ~50ms |
|
| 170 |
+
| 2 | Route Planner | OR-Tools linear assignment (proposal 1) | ~100ms |
|
| 171 |
+
| 3a | Fairness Manager | Evaluates Gini/stddev/max_gap | ~20ms |
|
| 172 |
+
| 3b | Route Planner (re-opt) | Penalized assignment if unfair | ~80ms |
|
| 173 |
+
| 4 | Driver Liaison | Per-driver comfort band negotiation | ~30ms |
|
| 174 |
+
| 5 | Final Resolution | Resolves counter-proposals via swaps | ~50ms |
|
| 175 |
+
| 6 | Explainability | Generates natural language explanations | ~100ms |
|
| 176 |
+
| 6b | Gemini LLM (optional) | Rich multilingual explanations | ~2s |
|
| 177 |
+
| 7 | Learning Agent | Creates episode for config auto-tuning | ~10ms |
|
| 178 |
+
|
| 179 |
+
**Total pipeline:** ~450ms (without Gemini) / ~2.5s (with Gemini)
|
| 180 |
+
|
| 181 |
+
---
|
| 182 |
+
|
| 183 |
+
## Environment Variables Reference
|
| 184 |
+
|
| 185 |
+
### Brain (FastAPI)
|
| 186 |
+
| Variable | Required | Default | Description |
|
| 187 |
+
|----------|----------|---------|-------------|
|
| 188 |
+
| `DATABASE_URL` | No | SQLite | PostgreSQL URL or empty for SQLite |
|
| 189 |
+
| `APP_ENV` | No | production | `development` or `production` |
|
| 190 |
+
| `GOOGLE_API_KEY` | No | β | Gemini API key for LLM explanations |
|
| 191 |
+
| `GEMINI_MODEL` | No | gemini-2.5-flash | Model for explanations |
|
| 192 |
+
| `ENABLE_GEMINI_EXPLAIN` | No | false | Enable Gemini agent |
|
| 193 |
+
| `LANGCHAIN_API_KEY` | No | β | LangSmith tracing key |
|
| 194 |
+
| `CORS_ORIGINS` | No | * | Comma-separated allowed origins |
|
| 195 |
+
|
| 196 |
+
### Backend (Node.js)
|
| 197 |
+
| Variable | Required | Default | Description |
|
| 198 |
+
|----------|----------|---------|-------------|
|
| 199 |
+
| `DATABASE_URL` | Yes* | β | PostgreSQL for auth/drivers/packages |
|
| 200 |
+
| `BRAIN_URL` | Yes | localhost:8000 | URL of the AI brain service |
|
| 201 |
+
| `JWT_SECRET` | Yes | β | Secret for JWT token signing |
|
| 202 |
+
| `CORS_ORIGINS` | No | localhost | Allowed CORS origins |
|
| 203 |
+
| `PORT` | No | 3000 | Server port |
|
| 204 |
+
|
| 205 |
+
### Dashboard (React)
|
| 206 |
+
| Variable | Required | Default | Description |
|
| 207 |
+
|----------|----------|---------|-------------|
|
| 208 |
+
| `VITE_API_URL` | Yes | /api | Backend URL (Render) |
|
| 209 |
+
|
| 210 |
+
---
|
| 211 |
+
|
| 212 |
+
## Local Development
|
| 213 |
+
|
| 214 |
+
```bash
|
| 215 |
+
# Terminal 1: AI Brain
|
| 216 |
+
cd brain
|
| 217 |
+
pip install -r requirements.txt
|
| 218 |
+
uvicorn app.main:app --reload --port 8000
|
| 219 |
+
|
| 220 |
+
# Terminal 2: Node.js Backend
|
| 221 |
+
cd ops/backend-dm
|
| 222 |
+
npm install
|
| 223 |
+
echo "BRAIN_URL=http://localhost:8000" > .env
|
| 224 |
+
node index.js
|
| 225 |
+
|
| 226 |
+
# Terminal 3: Ops Dashboard
|
| 227 |
+
cd ops/AIsupplychain/aisupply
|
| 228 |
+
npm install
|
| 229 |
+
echo "VITE_API_URL=http://localhost:3000" > .env
|
| 230 |
+
npm run dev
|
| 231 |
```
|
| 232 |
|
| 233 |
+
Open http://localhost:5173 β FairDispatch page β Run Fair Allocation
|
| 234 |
+
|
| 235 |
+
---
|
| 236 |
+
|
| 237 |
+
## Production Checklist
|
| 238 |
+
|
| 239 |
+
- [ ] Brain deployed on Render (Docker) β Health check passes
|
| 240 |
+
- [ ] Node.js backend on Render β `/health` returns healthy
|
| 241 |
+
- [ ] Dashboard on Vercel β Connects to backend
|
| 242 |
+
- [ ] PostgreSQL database provisioned (Render/Supabase)
|
| 243 |
+
- [ ] `BRAIN_URL` in backend points to brain service
|
| 244 |
+
- [ ] `VITE_API_URL` in dashboard points to backend
|
| 245 |
+
- [ ] CORS origins include `logisticsnow.in`
|
| 246 |
+
- [ ] Gemini API key configured (optional but recommended)
|
| 247 |
+
- [ ] SSL/HTTPS on all services (automatic on Render/Vercel)
|
| 248 |
+
- [ ] Rate limiting active on auth endpoints
|
| 249 |
+
- [ ] Socket.IO CORS configured for real-time updates
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|