Spaces:
Paused
Paused
| # Deployment Guide - DanceDynamics | |
| ## 🚀 Deployment Options | |
| This guide covers multiple deployment strategies for the DanceDynamics. | |
| --- | |
| ## Option 1: Docker Deployment (Recommended) | |
| ### Prerequisites | |
| - Docker 20.10+ | |
| - Docker Compose 1.29+ | |
| - 4GB RAM minimum | |
| - 10GB disk space | |
| ### Quick Start | |
| ```bash | |
| # 1. Clone repository | |
| git clone https://github.com/Prathameshv07/DanceDynamics | |
| cd DanceDynamics | |
| # 2. Build Docker image | |
| docker-compose build | |
| # 3. Run container | |
| docker-compose up -d | |
| # 4. Check status | |
| docker-compose ps | |
| docker-compose logs -f | |
| ``` | |
| ### Access Application | |
| - **Frontend**: http://localhost:7860 | |
| - **API Docs**: http://localhost:7860/api/docs | |
| - **Health Check**: http://localhost:7860/health | |
| ### Docker Commands | |
| ```bash | |
| # Start services | |
| docker-compose up -d | |
| # Stop services | |
| docker-compose down | |
| # View logs | |
| docker-compose logs -f dance-analyzer | |
| # Restart service | |
| docker-compose restart | |
| # Rebuild after code changes | |
| docker-compose build --no-cache | |
| docker-compose up -d | |
| # Clean up | |
| docker-compose down -v # Removes volumes | |
| docker system prune -a # Clean unused images | |
| ``` | |
| --- | |
| ## Option 2: Hugging Face Spaces | |
| ### Setup | |
| 1. **Create Space** | |
| - Go to https://huggingface.co/spaces | |
| - Click "Create new Space" | |
| - Choose Docker SDK | |
| - Name: DanceDynamics | |
| 2. **Prepare Files** | |
| Create `Dockerfile` in root: | |
| ```dockerfile | |
| FROM python:3.10-slim | |
| WORKDIR /app | |
| # Install system dependencies | |
| RUN apt-get update && apt-get install -y \ | |
| libgl1-mesa-glx libglib2.0-0 libsm6 \ | |
| libxext6 libxrender-dev libgomp1 ffmpeg \ | |
| && rm -rf /var/lib/apt/lists/* | |
| # Copy and install Python dependencies | |
| COPY backend/requirements.txt . | |
| RUN pip install --no-cache-dir -r requirements.txt | |
| # Copy application | |
| COPY backend/app /app/app | |
| COPY frontend /app/frontend | |
| # Create directories | |
| RUN mkdir -p /app/uploads /app/outputs | |
| EXPOSE 7860 | |
| CMD ["uvicorn", "app.main:app", "--host", "0.0.0.0", "--port", "7860"] | |
| ``` | |
| 3. **Push to Space** | |
| ```bash | |
| git init | |
| git remote add space https://huggingface.co/spaces/prathameshv07/DanceDynamics | |
| git add . | |
| git commit -m "Initial deployment" | |
| git push --force space main | |
| ``` | |
| 4. **Configure Space** | |
| - Set visibility (Public/Private) | |
| - Add README with usage instructions | |
| - Configure hardware (CPU/GPU) | |
| --- | |
| ## Option 3: AWS EC2 | |
| ### Launch Instance | |
| 1. **Choose AMI**: Ubuntu 22.04 LTS | |
| 2. **Instance Type**: t3.medium (2 vCPU, 4GB RAM) minimum | |
| 3. **Storage**: 20GB EBS volume | |
| 4. **Security Group**: | |
| - SSH (22) from your IP | |
| - HTTP (80) from anywhere | |
| - Custom TCP (7860) from anywhere | |
| ### Setup Script | |
| SSH into instance and run: | |
| ```bash | |
| #!/bin/bash | |
| # Update system | |
| sudo apt-get update && sudo apt-get upgrade -y | |
| # Install Docker | |
| curl -fsSL https://get.docker.com -o get-docker.sh | |
| sudo sh get-docker.sh | |
| sudo usermod -aG docker ubuntu | |
| # Install Docker Compose | |
| sudo curl -L "https://github.com/docker/compose/releases/latest/download/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose | |
| sudo chmod +x /usr/local/bin/docker-compose | |
| # Clone repository | |
| git clone https://github.com/Prathameshv07/DanceDynamics | |
| cd DanceDynamics | |
| # Start services | |
| docker-compose up -d | |
| # Setup nginx reverse proxy (optional) | |
| sudo apt-get install -y nginx | |
| sudo tee /etc/nginx/sites-available/dance-analyzer << EOF | |
| server { | |
| listen 80; | |
| server_name _; | |
| location / { | |
| proxy_pass http://localhost:7860; | |
| proxy_set_header Host \$host; | |
| proxy_set_header X-Real-IP \$remote_addr; | |
| proxy_set_header X-Forwarded-For \$proxy_add_x_forwarded_for; | |
| proxy_set_header X-Forwarded-Proto \$scheme; | |
| } | |
| location /ws { | |
| proxy_pass http://localhost:7860; | |
| proxy_http_version 1.1; | |
| proxy_set_header Upgrade \$http_upgrade; | |
| proxy_set_header Connection "upgrade"; | |
| } | |
| } | |
| EOF | |
| sudo ln -s /etc/nginx/sites-available/dance-analyzer /etc/nginx/sites-enabled/ | |
| sudo nginx -t | |
| sudo systemctl restart nginx | |
| ``` | |
| ### SSL Certificate (Let's Encrypt) | |
| ```bash | |
| sudo apt-get install -y certbot python3-certbot-nginx | |
| sudo certbot --nginx -d yourdomain.com | |
| ``` | |
| --- | |
| ## Option 4: Google Cloud Run | |
| ### Prerequisites | |
| - Google Cloud account | |
| - gcloud CLI installed | |
| ### Deployment | |
| ```bash | |
| # 1. Set project | |
| gcloud config set project YOUR_PROJECT_ID | |
| # 2. Build and push image | |
| gcloud builds submit --tag gcr.io/YOUR_PROJECT_ID/dance-analyzer | |
| # 3. Deploy to Cloud Run | |
| gcloud run deploy dance-analyzer \ | |
| --image gcr.io/YOUR_PROJECT_ID/dance-analyzer \ | |
| --platform managed \ | |
| --region us-central1 \ | |
| --allow-unauthenticated \ | |
| --memory 2Gi \ | |
| --timeout 300s \ | |
| --max-instances 10 | |
| ``` | |
| --- | |
| ## Option 5: DigitalOcean App Platform | |
| ### Setup | |
| 1. **Create App** | |
| - Go to DigitalOcean App Platform | |
| - Connect GitHub repository | |
| - Select branch | |
| 2. **Configure Build** | |
| - Build Command: `docker build -t dance-analyzer .` | |
| - Run Command: `uvicorn app.main:app --host 0.0.0.0 --port 8080` | |
| 3. **Environment Variables** | |
| ``` | |
| API_HOST=0.0.0.0 | |
| API_PORT=8080 | |
| MAX_FILE_SIZE=104857600 | |
| ``` | |
| 4. **Resources** | |
| - Basic: 1 GB RAM, 1 vCPU | |
| - Pro: 2 GB RAM, 2 vCPU (recommended) | |
| --- | |
| ## Environment Variables | |
| ### Production Configuration | |
| ```bash | |
| # API Settings | |
| API_HOST=0.0.0.0 | |
| API_PORT=7860 | |
| DEBUG=false | |
| # Security | |
| CORS_ORIGINS=https://yourdomain.com,https://www.yourdomain.com | |
| # File Limits | |
| MAX_FILE_SIZE=104857600 | |
| MAX_VIDEO_DURATION=60 | |
| # Processing | |
| MEDIAPIPE_MODEL_COMPLEXITY=1 | |
| MEDIAPIPE_MIN_DETECTION_CONFIDENCE=0.5 | |
| MAX_WORKERS=2 | |
| # Storage | |
| UPLOAD_DIR=/app/uploads | |
| OUTPUT_DIR=/app/outputs | |
| LOG_DIR=/app/logs | |
| # Session Management | |
| SESSION_CLEANUP_INTERVAL=3600 | |
| MAX_SESSIONS=50 | |
| ``` | |
| --- | |
| ## Performance Optimization | |
| ### 1. Increase Workers | |
| ```yaml | |
| # docker-compose.yml | |
| environment: | |
| - MAX_WORKERS=4 # Increase for more concurrent processing | |
| ``` | |
| ### 2. Use GPU (if available) | |
| ```dockerfile | |
| # Dockerfile | |
| FROM nvidia/cuda:11.8.0-cudnn8-runtime-ubuntu22.04 | |
| # Install TensorFlow GPU | |
| RUN pip install tensorflow-gpu mediapipe-gpu | |
| ``` | |
| ### 3. Enable Caching | |
| ```python | |
| # app/config.py | |
| CACHE_ENABLED = True | |
| CACHE_DIR = "/app/cache" | |
| CACHE_MAX_SIZE = 10737418240 # 10GB | |
| ``` | |
| ### 4. CDN for Static Files | |
| ```nginx | |
| # nginx.conf | |
| location /static/ { | |
| alias /app/frontend/; | |
| expires 30d; | |
| add_header Cache-Control "public, immutable"; | |
| } | |
| ``` | |
| --- | |
| ## Monitoring & Logging | |
| ### 1. Health Checks | |
| ```bash | |
| # Check application health | |
| curl http://localhost:7860/health | |
| # Monitor logs | |
| docker-compose logs -f --tail=100 | |
| ``` | |
| ### 2. Prometheus Metrics | |
| Add to `main.py`: | |
| ```python | |
| from prometheus_fastapi_instrumentator import Instrumentator | |
| Instrumentator().instrument(app).expose(app) | |
| ``` | |
| ### 3. Log Aggregation | |
| ```yaml | |
| # docker-compose.yml | |
| logging: | |
| driver: "json-file" | |
| options: | |
| max-size: "10m" | |
| max-file: "3" | |
| ``` | |
| --- | |
| ## Backup & Recovery | |
| ### Backup Data | |
| ```bash | |
| # Backup uploads and outputs | |
| docker run --rm \ | |
| -v DanceDynamics_uploads:/uploads \ | |
| -v DanceDynamics_outputs:/outputs \ | |
| -v $(pwd)/backup:/backup \ | |
| alpine \ | |
| tar czf /backup/data-$(date +%Y%m%d).tar.gz /uploads /outputs | |
| ``` | |
| ### Restore Data | |
| ```bash | |
| # Restore from backup | |
| docker run --rm \ | |
| -v DanceDynamics_uploads:/uploads \ | |
| -v DanceDynamics_outputs:/outputs \ | |
| -v $(pwd)/backup:/backup \ | |
| alpine \ | |
| tar xzf /backup/data-YYYYMMDD.tar.gz -C / | |
| ``` | |
| --- | |
| ## Security Best Practices | |
| ### 1. Use Secrets | |
| ```yaml | |
| # docker-compose.yml | |
| secrets: | |
| api_key: | |
| file: ./secrets/api_key.txt | |
| services: | |
| dance-analyzer: | |
| secrets: | |
| - api_key | |
| ``` | |
| ### 2. Enable HTTPS | |
| ```python | |
| # main.py | |
| from fastapi.middleware.httpsredirect import HTTPSRedirectMiddleware | |
| app.add_middleware(HTTPSRedirectMiddleware) | |
| ``` | |
| ### 3. Rate Limiting | |
| ```python | |
| from slowapi import Limiter | |
| from slowapi.util import get_remote_address | |
| limiter = Limiter(key_func=get_remote_address) | |
| app.state.limiter = limiter | |
| @app.post("/api/upload") | |
| @limiter.limit("5/minute") | |
| async def upload_video(): | |
| pass | |
| ``` | |
| ### 4. Input Validation | |
| All inputs are validated. Ensure: | |
| - File size limits enforced | |
| - File types restricted | |
| - Path traversal prevented | |
| - SQL injection not applicable (no DB) | |
| --- | |
| ## Troubleshooting | |
| ### Container Won't Start | |
| ```bash | |
| # Check logs | |
| docker-compose logs dance-analyzer | |
| # Common issues: | |
| # 1. Port already in use | |
| docker ps -a | |
| sudo lsof -i :7860 | |
| # 2. Permission denied | |
| sudo chown -R 1000:1000 uploads outputs logs | |
| # 3. Out of memory | |
| docker stats | |
| # Increase memory limit in docker-compose.yml | |
| ``` | |
| ### High CPU Usage | |
| ```bash | |
| # Check resource usage | |
| docker stats dance-analyzer | |
| # Reduce model complexity | |
| # Edit docker-compose.yml | |
| environment: | |
| - MEDIAPIPE_MODEL_COMPLEXITY=0 | |
| ``` | |
| ### Slow Processing | |
| ```bash | |
| # Increase workers | |
| environment: | |
| - MAX_WORKERS=4 | |
| # Use GPU if available | |
| # Requires nvidia-docker | |
| ``` | |
| --- | |
| ## Scaling | |
| ### Horizontal Scaling | |
| ```yaml | |
| # docker-compose.yml | |
| services: | |
| dance-analyzer: | |
| deploy: | |
| replicas: 3 | |
| nginx: | |
| image: nginx:alpine | |
| ports: | |
| - "80:80" | |
| depends_on: | |
| - dance-analyzer | |
| volumes: | |
| - ./nginx.conf:/etc/nginx/nginx.conf | |
| ``` | |
| ### Load Balancer Configuration | |
| ```nginx | |
| upstream dance_analyzer { | |
| least_conn; | |
| server dance-analyzer-1:7860; | |
| server dance-analyzer-2:7860; | |
| server dance-analyzer-3:7860; | |
| } | |
| server { | |
| listen 80; | |
| location / { | |
| proxy_pass http://dance_analyzer; | |
| } | |
| } | |
| ``` | |
| --- | |
| ## Cost Optimization | |
| ### Cloud Costs | |
| | Platform | Cost/Month | Notes | | |
| |----------|-----------|-------| | |
| | Hugging Face Spaces | Free - $15 | Good for demos | | |
| | AWS EC2 t3.medium | $30 - $35 | Pay for compute | | |
| | Google Cloud Run | $10 - $50 | Pay per use | | |
| | DigitalOcean App | $12 - $24 | Fixed pricing | | |
| ### Optimization Tips | |
| 1. **Use spot instances** (AWS, GCP) | |
| 2. **Auto-scaling** based on demand | |
| 3. **Session cleanup** to free resources | |
| 4. **Caching** to reduce processing | |
| 5. **CDN** for static files | |
| --- | |
| ## CI/CD Pipeline | |
| ### GitHub Actions | |
| Create `.github/workflows/deploy.yml`: | |
| ```yaml | |
| name: Deploy | |
| on: | |
| push: | |
| branches: [main] | |
| jobs: | |
| deploy: | |
| runs-on: ubuntu-latest | |
| steps: | |
| - uses: actions/checkout@v3 | |
| - name: Build and push Docker image | |
| run: | | |
| docker build -t dance-analyzer . | |
| echo ${{ secrets.DOCKER_PASSWORD }} | docker login -u ${{ secrets.DOCKER_USERNAME }} --password-stdin | |
| docker tag dance-analyzer ${{ secrets.DOCKER_USERNAME }}/dance-analyzer:latest | |
| docker push ${{ secrets.DOCKER_USERNAME }}/dance-analyzer:latest | |
| - name: Deploy to server | |
| uses: appleboy/ssh-action@master | |
| with: | |
| host: ${{ secrets.SERVER_HOST }} | |
| username: ${{ secrets.SERVER_USER }} | |
| key: ${{ secrets.SSH_KEY }} | |
| script: | | |
| cd /app/DanceDynamics | |
| docker-compose pull | |
| docker-compose up -d | |
| ``` | |
| --- | |
| ## Maintenance | |
| ### Regular Tasks | |
| ```bash | |
| # Weekly: Clean old sessions | |
| docker exec dance-analyzer python -c " | |
| from app.utils import cleanup_old_sessions | |
| cleanup_old_sessions(max_age_hours=168) | |
| " | |
| # Monthly: Update dependencies | |
| docker-compose build --no-cache | |
| docker-compose up -d | |
| # As needed: Backup data | |
| ./scripts/backup.sh | |
| ``` | |
| --- | |
| ## Support & Monitoring | |
| ### Set Up Alerts | |
| ```yaml | |
| # docker-compose.yml | |
| services: | |
| dance-analyzer: | |
| healthcheck: | |
| test: ["CMD", "curl", "-f", "http://localhost:7860/health"] | |
| interval: 30s | |
| timeout: 10s | |
| retries: 3 | |
| ``` | |
| ### Monitor Metrics | |
| - Response time | |
| - Error rate | |
| - Active sessions | |
| - Memory usage | |
| - Disk space | |
| --- | |
| ## Success Checklist | |
| - [ ] Application builds successfully | |
| - [ ] Docker container runs | |
| - [ ] Health check passes | |
| - [ ] Can upload video | |
| - [ ] Processing works | |
| - [ ] Can download result | |
| - [ ] HTTPS configured (production) | |
| - [ ] Monitoring set up | |
| - [ ] Backups configured | |
| - [ ] Documentation updated | |
| --- | |
| ## Next Steps | |
| 1. **Test deployment** thoroughly | |
| 2. **Set up monitoring** | |
| 3. **Configure backups** | |
| 4. **Optimize performance** | |
| 5. **Scale as needed** | |
| --- |