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)