# Deployment & Migration Guide Complete guide for deploying the new React frontend and updated Flask backend. ## Overview This project has been upgraded with: - **Modern React 18 Frontend** with Framer Motion animations - **Updated Flask Backend** with REST API endpoints - **Improved State Management** with Zustand - **Professional SaaS Design** with black & emerald colors ## Quick Migration Path ### For Current Users If you're already running the project with the old HTML interface: 1. **Backup your current setup** ```bash cp job_apply_ai/ui/app.py job_apply_ai/ui/app_legacy.py ``` 2. **Switch to new Flask app** ```bash # Rename the new app to be the main file mv job_apply_ai/ui/app_new.py job_apply_ai/ui/app.py ``` 3. **Install frontend dependencies** ```bash cd frontend npm install cd .. ``` 4. **Start both servers** ```bash # Terminal 1: Backend python -m job_apply_ai.ui.app # Terminal 2: Frontend (for development) cd frontend npm run dev ``` ## Development Setup ### Local Development with Hot Reload ```bash # Terminal 1: Start Flask backend source venv/bin/activate # or venv\Scripts\activate.bat on Windows python -m job_apply_ai.ui.app # Terminal 2: Start React dev server cd frontend npm install # if first time npm run dev ``` Visit: `http://localhost:3000` ### Build Frontend for Production ```bash cd frontend npm run build ``` Output: `frontend/dist/` → copied to `job_apply_ai/ui/static/dist/` ## Deployment Options ### Option 1: Standalone Flask Server (Recommended) Serves both the React frontend and API from a single Flask server. #### Steps 1. **Build Frontend** ```bash cd frontend npm run build ``` 2. **Install Dependencies** ```bash pip install -r requirements.txt pip install flask-cors # New dependency for API ``` 3. **Run the Server** ```bash python -m job_apply_ai.ui.app ``` 4. **Access the App** - Main app: `http://localhost:5050` - API endpoints: `http://localhost:5050/api/*` #### Environment Variables ```bash # Core FLASK_ENV=production FLASK_DEBUG=False SECRET_KEY=your_random_secret_key_here PORT=5050 # Storage JOB_APPLY_AI_DATA_DIR=/path/to/data # Tailoring CV_TAILORING_MODE=local # or 'api' CV_ENABLE_SUMMARY_TAILORING=1 # For API mode LLM_PROVIDER=groq GROQ_API_KEY=your_key_here GROQ_MODEL=llama-3.3-70b-versatile ``` ### Option 2: Docker Deployment Create a `Dockerfile`: ```dockerfile FROM node:18-alpine as frontend WORKDIR /app/frontend COPY frontend/package*.json ./ RUN npm install COPY frontend/ . RUN npm run build FROM python:3.11-slim WORKDIR /app COPY requirements.txt . RUN pip install -r requirements.txt && pip install flask-cors gunicorn COPY . . COPY --from=frontend /app/frontend/dist ./job_apply_ai/ui/static/dist ENV FLASK_ENV=production ENV PYTHONUNBUFFERED=1 EXPOSE 5050 CMD ["gunicorn", "--bind", "0.0.0.0:5050", "job_apply_ai.ui.app:app"] ``` Build and run: ```bash docker build -t job-apply-ai . docker run -p 5050:5050 job-apply-ai ``` ### Option 3: Separate Frontend & Backend Run React and Flask on different servers (useful for separate scaling). #### Backend (Flask) ```bash FLASK_ENV=production python -m job_apply_ai.ui.app ``` #### Frontend (Nginx/Vercel/etc) ```bash # Build cd frontend npm run build # Deploy to Vercel, Netlify, or your own server npm install -g vercel vercel deploy dist ``` In `vite.config.ts`, update API URL: ```typescript server: { proxy: { '/api': { target: 'https://your-backend.com', // Change to production backend changeOrigin: true, rewrite: (path) => path.replace(/^\/api/, '') } } } ``` ## Production Checklist - [ ] Set `FLASK_DEBUG=False` - [ ] Use `sqlite` or `postgresql` for sessions (not default) - [ ] Set strong `SECRET_KEY` - [ ] Configure CORS properly for your domain - [ ] Enable HTTPS in production - [ ] Set appropriate resource limits - [ ] Configure backup for generated CVs - [ ] Set up monitoring/logging - [ ] Test file uploads with various CV formats - [ ] Verify batch processing stability with many jobs ## Performance Optimization ### Frontend ```bash # Analyze bundle npm install -g vite-plugin-visualizer npm run build -- --analyze ``` ### Backend ```python # Use production-grade WSGI server pip install gunicorn gunicorn -w 4 -b 0.0.0.0:5050 job_apply_ai.ui.app:app ``` ### Caching - Enable browser caching for static assets - Use Redis for session storage (optional) - Implement job result caching ## Scaling Considerations ### Horizontal Scaling - Use reverse proxy (Nginx) to load balance - Store sessions in Redis or database - Use shared storage for generated CVs ### Vertical Scaling - Increase worker processes for Flask/Gunicorn - Allocate more memory for CV processing - Use distributed task queue for batch jobs ## Troubleshooting ### Frontend won't load ```bash # Check if Flask is running curl http://localhost:5050 # Check if React build exists ls job_apply_ai/ui/static/dist/index.html # Verify CORS is enabled npm run dev # Use dev server instead ``` ### API endpoints returning 404 - Ensure `app_new.py` is being used (not legacy `app.py`) - Check Flask logs for errors - Verify API routes match frontend expectations ### File upload fails - Check upload folder permissions - Verify disk space available - Check file size limits in Flask config ### Memory issues - Reduce max job batch size - Implement streaming for large CVs - Use separate worker processes ## Rollback Procedure If issues occur: ```bash # Restore old Flask app mv job_apply_ai/ui/app.py job_apply_ai/ui/app_new.py mv job_apply_ai/ui/app_legacy.py job_apply_ai/ui/app.py # Restart server python -m job_apply_ai.ui.app ``` ## Support For issues or questions: 1. Check frontend logs in browser DevTools 2. Check Flask logs in terminal 3. Review specific error messages 4. Contact project maintainers ## Next Steps - [ ] Test the new React frontend thoroughly - [ ] Migrate user data if needed - [ ] Train users on new interface - [ ] Monitor performance and stability - [ ] Gather feedback for improvements