Spaces:
Sleeping
Sleeping
| # ποΈ Hugging Face Spaces Deployment Architecture | |
| ## π High-Level Architecture | |
| ``` | |
| βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ | |
| β HUGGING FACE SPACES β | |
| β (16GB RAM - Free) β | |
| β β | |
| β βββββββββββββββββββββββββββββββββββββββββββββββββββββ β | |
| β β Docker Container β β | |
| β β (User ID: 1000) β β | |
| β β β β | |
| β β βββββββββββββββββββββββββββββββββββββββββββ β β | |
| β β β FastAPI Application β β β | |
| β β β (Port 7860) β β β | |
| β β β β β β | |
| β β β ββββββββββββββββ ββββββββββββββββ β β β | |
| β β β β Uvicorn β β PhoBERT β β β β | |
| β β β β Server β β Model β β β β | |
| β β β β β β (~500MB) β β β β | |
| β β β ββββββββββββββββ ββββββββββββββββ β β β | |
| β β β β β β | |
| β β β ββββββββββββββββ ββββββββββββββββ β β β | |
| β β β β Jinja2 β β WordCloud β β β β | |
| β β β β Templates β β Generator β β β β | |
| β β β ββββββββββββββββ ββββββββββββββββ β β β | |
| β β βββββββββββββββββββββββββββββββββββββββββββ β β | |
| β β β β | |
| β β Environment Variables (from HF Secrets): β β | |
| β β - DATABASE_URL β β | |
| β β - SECRET_KEY β β | |
| β βββββββββββββββββββββββββββββββββββββββββββββββββββββ β | |
| βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ | |
| β | |
| β HTTPS | |
| βΌ | |
| ββββββββββββββββββββββββββ | |
| β Users β | |
| β (Web Browsers) β | |
| ββββββββββββββββββββββββββ | |
| β | |
| β | |
| βΌ | |
| βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ | |
| β External PostgreSQL Database β | |
| β (Render / Neon / Other) β | |
| β β | |
| β ββββββββββββββββ ββββββββββββββββββββββββ β | |
| β β Users β β PredictionHistory β β | |
| β β Table ββββββββββΆβ Table β β | |
| β β β FK β β β | |
| β ββββββββββββββββ ββββββββββββββββββββββββ β | |
| βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ | |
| ``` | |
| --- | |
| ## π Request Flow | |
| ``` | |
| 1. User visits Space URL | |
| βββΆ https://huggingface.co/spaces/USERNAME/SPACE_NAME | |
| β | |
| βΌ | |
| 2. Hugging Face routes to Docker container (port 7860) | |
| β | |
| βΌ | |
| 3. Uvicorn receives HTTP request | |
| β | |
| βββΆ GET /docs β Swagger UI | |
| βββΆ GET /dashboard β Jinja2 Template + TailwindCSS | |
| βββΆ POST /api/auth/login β JWT Token | |
| βββΆ POST /api/predict/single β PhoBERT Model | |
| βββΆ POST /api/predict/batch β CSV Processing + WordCloud | |
| β | |
| βΌ | |
| 4. Database query (if needed) | |
| βββΆ PostgreSQL on Render/Neon (via DATABASE_URL) | |
| β | |
| βΌ | |
| 5. Response returned to user | |
| βββΆ JSON (API) or HTML (Pages) | |
| ``` | |
| --- | |
| ## π³ Docker Build Process | |
| ``` | |
| 1. Dockerfile Instructions | |
| β | |
| βββΆ FROM python:3.10-slim | |
| β ββ Base image (~150MB) | |
| β | |
| βββΆ RUN useradd -m -u 1000 user | |
| β ββ Create non-root user (HF requirement) | |
| β | |
| βββΆ COPY requirements.txt | |
| β ββ Copy dependencies first | |
| β | |
| βββΆ RUN pip install -r requirements.txt | |
| β ββ Install packages (~2GB with PyTorch) | |
| β | |
| βββΆ COPY --chown=user:user . . | |
| β ββ Copy application code | |
| β | |
| βββΆ RUN chmod -R 777 /app/app/static/uploads | |
| β ββ Set write permissions | |
| β | |
| βββΆ USER user | |
| β ββ Switch to non-root user | |
| β | |
| βββΆ CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "7860"] | |
| ββ Start application | |
| Total Build Time: 5-10 minutes | |
| Final Image Size: ~2.5GB | |
| ``` | |
| --- | |
| ## π Security Layer | |
| ``` | |
| βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ | |
| β Security Features β | |
| βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€ | |
| β β | |
| β 1. Authentication Layer β | |
| β ββ JWT Tokens (24h expiration) β | |
| β ββ Bcrypt password hashing β | |
| β ββ OAuth2 Bearer scheme β | |
| β β | |
| β 2. Network Security β | |
| β ββ HTTPS (provided by HF) β | |
| β ββ CORS configuration β | |
| β ββ PostgreSQL SSL (sslmode=require) β | |
| β β | |
| β 3. Secret Management β | |
| β ββ Environment variables (HF Secrets) β | |
| β ββ No hardcoded credentials β | |
| β ββ .dockerignore excludes .env β | |
| β β | |
| β 4. Container Security β | |
| β ββ Non-root user (UID 1000) β | |
| β ββ Read-only filesystem (except uploads) β | |
| β ββ Minimal base image β | |
| β β | |
| βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ | |
| ``` | |
| --- | |
| ## πΎ Storage Architecture | |
| ``` | |
| βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ | |
| β Storage Locations β | |
| βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€ | |
| β β | |
| β Container Storage (Ephemeral - Resets on rebuild) β | |
| β ββ /app/app/static/uploads/wordclouds/ β | |
| β β ββ Word cloud images (temporary) β | |
| β ββ /app/app/database/ β | |
| β ββ SQLite fallback (dev only) β | |
| β β | |
| β External Storage (Persistent) β | |
| β ββ PostgreSQL Database (Render/Neon) β | |
| β ββ users table β | |
| β ββ prediction_history table β | |
| β ββ All user data & predictions β | |
| β β | |
| β Future Enhancements (Optional) β | |
| β ββ S3 / Cloudinary for file uploads β | |
| β ββ Persistent word clouds & CSVs β | |
| β β | |
| βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ | |
| ``` | |
| --- | |
| ## π Connection Flow | |
| ``` | |
| ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ | |
| β Database Connection Logic β | |
| ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ | |
| β | |
| βΌ | |
| βββββββββββββββββββββββ | |
| β app/database.py β | |
| βββββββββββββββββββββββ | |
| β | |
| βΌ | |
| βββββββββββββββββββββββββββββββββββββββ | |
| β Check os.getenv("DATABASE_URL") β | |
| βββββββββββββββββββββββββββββββββββββββ | |
| β | |
| ββββββββ΄βββββββ | |
| β β | |
| βΌ βΌ | |
| β Found β Not Found | |
| β β | |
| β βΌ | |
| β ββββββββββββββββββββ | |
| β β Use SQLite β | |
| β β (Local Dev) β | |
| β ββββββββββββββββββββ | |
| β | |
| βΌ | |
| ββββββββββββββββββββββββββββ | |
| β Fix postgres:// URL β | |
| β (replace with β | |
| β postgresql://) β | |
| ββββββββββββββββββββββββββββ | |
| β | |
| βΌ | |
| ββββββββββββββββββββββββββββ | |
| β Connect to PostgreSQL β | |
| β (Production on HF) β | |
| ββββββββββββββββββββββββββββ | |
| ``` | |
| --- | |
| ## π Scalability Considerations | |
| ``` | |
| Current Setup (Free Tier): | |
| ββ 16GB RAM (sufficient for >500MB model) | |
| ββ Shared CPU (adequate for moderate traffic) | |
| ββ Unlimited uptime (99.9% availability) | |
| If Scaling Needed: | |
| ββ Upgrade to Pro Space ($9/month) | |
| β ββ Better CPU, more RAM, priority support | |
| ββ Database scaling | |
| β ββ Upgrade PostgreSQL plan on Render/Neon | |
| ββ Add caching layer | |
| β ββ Redis for frequent queries | |
| ββ Consider load balancing | |
| ββ Multiple Space instances (advanced) | |
| ``` | |
| --- | |
| ## π Deployment Workflow | |
| ``` | |
| ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ | |
| β Local Development β | |
| β ββ Edit code β | |
| β ββ Test with SQLite β | |
| β ββ Commit to Git β | |
| ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ | |
| β | |
| βΌ | |
| ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ | |
| β Push to Hugging Face β | |
| β git push origin main β | |
| ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ | |
| β | |
| βΌ | |
| ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ | |
| β HF Spaces Auto-Build β | |
| β ββ Pull latest code β | |
| β ββ Build Docker image (5-10 min) β | |
| β ββ Run container on port 7860 β | |
| β ββ Inject environment variables β | |
| ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ | |
| β | |
| βΌ | |
| ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ | |
| β Application Running β | |
| β ββ Connect to PostgreSQL β | |
| β ββ Load ML model into memory β | |
| β ββ Start Uvicorn server β | |
| β ββ Ready to serve requests β | |
| ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ | |
| ``` | |
| --- | |
| ## π Resource Usage | |
| ``` | |
| Component Memory CPU Disk | |
| βββββββββββββββββββββββββββββββββββββββββββββββββ | |
| Base Image ~150MB - ~150MB | |
| Python Dependencies ~2GB - ~2GB | |
| PhoBERT Model ~500MB High ~500MB | |
| Application Code ~50MB Low ~50MB | |
| Runtime Data ~100MB Medium ~100MB | |
| βββββββββββββββββββββββββββββββββββββββββββββββββ | |
| TOTAL (approx) ~2.8GB - ~2.8GB | |
| Hugging Face Provides: 16GB RAM (plenty of headroom) | |
| ``` | |
| --- | |
| ## π― Key Architectural Decisions | |
| ### Why Docker SDK? | |
| β Heavy ML model (>500MB) needs more than 512MB RAM | |
| β Full control over environment | |
| β 16GB RAM on free tier | |
| ### Why External Database? | |
| β Container is ephemeral (resets on rebuild) | |
| β PostgreSQL provides persistence | |
| β Easy to scale independently | |
| ### Why Port 7860? | |
| β Hugging Face Spaces requirement | |
| β Auto-routed by HF infrastructure | |
| β HTTPS provided automatically | |
| ### Why Non-Root User? | |
| β Security best practice | |
| β Hugging Face Spaces requirement | |
| β UID 1000 is standard | |
| --- | |
| **This architecture provides:** | |
| - β High availability (99.9% uptime) | |
| - β Sufficient resources (16GB RAM) | |
| - β Secure deployment (JWT, SSL, non-root) | |
| - β Persistent storage (external DB) | |
| - β Cost-effective (free tier) | |