home_plate/
│
├── backend/ # Django backend
│ ├── manage.py
│ ├── requirements.txt
│ ├── Dockerfile
│ ├── docker-compose.yml
│ ├── env.
│ ├── __init__.py
│ ├── settings.py
│ ├── urls.py
│ │─ wsgi.py
│ │
│ ├── api/ # API app
│ │ ├── models.py
│ │ ├── views.py
│ │ ├── serializers.py
│ │ ├── urls.py
│ │ ├── tasks.py # Celery async tasks
│ │ └── recommender_service.py # Calls ML service or loads model
│ │
│ ├── recommender/ # ML model training + serving
│ │ ├── __init__.py
│ │ ├── data/
│ │ │ └── sample_events.csv
│ │ ├── models/
│ │ │ ├── lightfm_model.pkl
│ │ │ └── metadata.json
│ │ ├── train/
│ │ │ ├── train_lightfm.py
│ │ │ └── preprocess.py
│ │ └── serving/
│ │ ├── predict.py
│ │ ├── vector_index.faiss
│ │ └── fastapi_server.py
│ │
│ ├── scripts/ # Utility scripts
│ │ ├── load_sample_data.py
│ │ ├── cron_generate_recs.sh
│ │ └── build_faiss_index.py
│ │
│ └── static/
│
├── frontend/ # React frontend
│ ├── package.json
│ ├── vite.config.js
│ ├── Dockerfile
│ ├── public/
│ └── src/
│ ├── App.jsx
│ ├── components/
│ │ ├── RecommendationList.jsx
│ │ ├── FoodCard.jsx
│ │ └── Loader.jsx
│ ├── pages/
│ │ ├── Home.jsx
│ │ ├── FoodDetail.jsx
│ │ └── Profile.jsx
│ ├── hooks/
│ │ └── useRecommendations.js
│ └── api/
│ ├── axiosClient.js
│ └── recommenderApi.js
│
├── ml_service/ # Optional FastAPI ML microservice
│ ├── main.py
│ ├── requirements.txt
│ └── Dockerfile
│
├── docs/
│ ├── architecture-diagram.png
│ └── recommender-design.md
│
└── README.md- Python 3.9+
- Node.js 16+
- PostgreSQL 12+
- Redis (for Celery)
- Docker & Docker Compose (recommended)
cd backendpython -m venv venv
# On Windows
venv\Scripts\activate
# On macOS/Linux
source venv/bin/activatepip install -r requirements.txtKey packages:
Django==4.2
djangorestframework==3.14.0
django-cors-headers==4.0.0
psycopg2-binary==2.9.6
celery==5.3.0
lightfm==1.16
scikit-learn==1.3.0
faiss-cpu==1.7.4
pandas==2.0.0
numpy==1.24.0
Create .env file from env.example:
cp env.example .envEdit .env:
DEBUG=True
SECRET_KEY=your-super-secret-key-change-in-production
# Database
DATABASE_ENGINE=django.db.backends.postgresql
DATABASE_NAME=food_recommender_db
DATABASE_USER=postgres
DATABASE_PASSWORD=your_password
DATABASE_HOST=localhost
DATABASE_PORT=5432
# Redis (for Celery)
REDIS_URL=redis://localhost:6379/0
# CORS
CORS_ALLOWED_ORIGINS=http://localhost:3000,http://localhost:5173
# ML Settings
MODEL_PATH=recommender/models/lightfm_model.pkl
ENABLE_FAISS_INDEX=True
FAISS_INDEX_PATH=recommender/models/vector_index.faiss
# Recommendation Engine
RECOMMENDATIONS_BATCH_SIZE=10
MAX_RECOMMENDATIONS=20
python manage.py makemigrations
python manage.py migratepython manage.py createsuperuserpython manage.py shell < scripts/load_sample_data.pypython recommender/train/train_lightfm.pyThis will:
- Load data from
recommender/data/sample_events.csv - Train LightFM model
- Save to
recommender/models/lightfm_model.pkl - Create metadata.json
python scripts/build_faiss_index.pyIn a separate terminal:
celery -A config worker -l infopython manage.py runserverBackend available at: http://localhost:8000
Admin panel: http://localhost:8000/admin/
cd frontendnpm installCreate .env:
VITE_API_URL=http://localhost:8000/api
VITE_ENVIRONMENT=development
npm run devFrontend available at: http://localhost:5173
npm run buildDeploy the recommender as a separate microservice for scalability.
cd ml_servicepip install -r requirements.txtMODEL_PATH=../backend/recommender/models/lightfm_model.pkl
FAISS_INDEX_PATH=../backend/recommender/models/vector_index.faiss
PORT=8001
WORKERS=4
uvicorn main:app --host 0.0.0.0 --port 8001 --reloadML Service available at: http://localhost:8001
Update Django to call this service:
In backend/api/recommender_service.py:
import requests
ML_SERVICE_URL = os.getenv('ML_SERVICE_URL', 'http://localhost:8001')
def get_recommendations(user_id, n=10):
response = requests.post(
f'{ML_SERVICE_URL}/recommend',
json={'user_id': user_id, 'n_recommendations': n}
)
return response.json()Create docker-compose.yml in backend directory or root:
version: '3.9'
services:
db:
image: postgres:15
environment:
POSTGRES_DB: food_recommender_db
POSTGRES_USER: postgres
POSTGRES_PASSWORD: postgres
volumes:
- postgres_data:/var/lib/postgresql/data
ports:
- "5432:5432"
redis:
image: redis:7-alpine
ports:
- "6379:6379"
backend:
build: ./backend
command: python manage.py runserver 0.0.0.0:8000
environment:
DEBUG: "False"
SECRET_KEY: your-secret-key
DATABASE_HOST: db
REDIS_URL: redis://redis:6379/0
ports:
- "8000:8000"
depends_on:
- db
- redis
volumes:
- ./backend:/app
celery_worker:
build: ./backend
command: celery -A config worker -l info
environment:
DEBUG: "False"
DATABASE_HOST: db
REDIS_URL: redis://redis:6379/0
depends_on:
- db
- redis
volumes:
- ./backend:/app
frontend:
build: ./frontend
ports:
- "3000:3000"
environment:
VITE_API_URL: http://localhost:8000/api
depends_on:
- backend
volumes:
- ./frontend:/app
ml_service:
build: ./ml_service
ports:
- "8001:8001"
depends_on:
- backend
volumes:
- ./backend/recommender/models:/app/models
volumes:
postgres_data:Run everything:
docker-compose up --buildPOST /api/auth/register/
POST /api/auth/login/
POST /api/auth/logout/
GET /api/auth/user/
GET /api/foods/ # List all foods
GET /api/foods/<id>/ # Food details
GET /api/foods/search/?q=keyword # Search foods
POST /api/foods/ # Create food (admin)
GET /api/recommendations/ # Get personalized recommendations
GET /api/recommendations/similar/<food_id>/
POST /api/recommendations/feedback/ # Submit user feedback (like/dislike)
GET /api/recommendations/history/ # View recommendation history
GET /api/users/profile/
PUT /api/users/profile/
GET /api/users/preferences/
PUT /api/users/preferences/
Terminal 1 - Database (if not using Docker):
# Ensure PostgreSQL is running
# macOS: brew services start postgresql
# Linux: sudo service postgresql startTerminal 2 - Redis (if not using Docker):
redis-serverTerminal 3 - Backend:
cd backend
source venv/bin/activate
python manage.py runserverTerminal 4 - Celery Worker:
cd backend
source venv/bin/activate
celery -A config worker -l infoTerminal 5 - Frontend:
cd frontend
npm run devTerminal 6 - ML Service (Optional):
cd ml_service
source venv/bin/activate
uvicorn main:app --reload --port 8001docker-compose up --buildcd backend
python recommender/train/train_lightfm.pyConfigure in backend/config/settings.py:
from celery.schedules import crontab
CELERY_BEAT_SCHEDULE = {
'retrain-recommender': {
'task': 'api.tasks.retrain_model',
'schedule': crontab(hour=2, minute=0), # Daily at 2 AM
},
}Run Celery Beat:
celery -A config beat -l info- User interacts with food items (view, like, dislike)
- Frontend sends events to Django API
- Django stores user interactions in database
- Celery tasks aggregate data periodically
- LightFM model trained on interaction data
- FAISS index built for fast similarity search
- Recommendations generated via API endpoint
- Frontend displays personalized recommendations
Update CORS_ALLOWED_ORIGINS in .env:
CORS_ALLOWED_ORIGINS=http://localhost:3000,http://localhost:5173
# macOS/Linux - Find and kill process on port 8000
lsof -ti:8000 | xargs kill -9
# Windows
netstat -ano | findstr :8000
taskkill /PID <PID> /F# Check PostgreSQL is running
psql -U postgres -h localhost
# Or with Docker:
docker-compose exec db psql -U postgres- Ensure Redis is running:
redis-cli ping→ should returnPONG - Check Celery worker logs for errors
- Verify
REDIS_URLin.env
# Retrain model
python recommender/train/train_lightfm.py
# Check file exists
ls -la recommender/models/- Check
VITE_API_URLin.env - Ensure backend is running on port 8000
- Check browser console for CORS errors
- Verify firewall settings
# Create Procfile
web: gunicorn config.wsgi:application
worker: celery -A config worker
beat: celery -A config beat
# Deploy
git push heroku main
heroku run python manage.py migratenpm run build
# Deploy the dist/ folderdocker build -t food-recommender-ml ./ml_service
docker tag food-recommender-ml:latest <your-registry>/food-recommender-ml:latest
docker push <your-registry>/food-recommender-ml:latestTrains collaborative filtering model using user-food interactions.
Service layer that loads model and generates recommendations.
Inference logic for getting recommendations and similar items.
React hook for fetching and managing recommendations.
FastAPI microservice for model serving with REST endpoints.
git checkout -b feature/your-feature
git commit -m "Add your feature"
git push origin feature/your-featureMIT