Spaces:
Paused
Paused
| # 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 | |