doniramdani820 commited on
Commit
603a5b3
·
verified ·
1 Parent(s): 2781c6c

Upload 5 files

Browse files
Files changed (4) hide show
  1. Dockerfile +7 -17
  2. README.md +11 -0
  3. app.py +9 -24
  4. requirements.txt +16 -14
Dockerfile CHANGED
@@ -5,12 +5,12 @@ FROM python:3.11-slim as base
5
 
6
  # Install system dependencies yang diperlukan (minimal)
7
  RUN apt-get update && apt-get install -y \
8
- curl \
9
  libglib2.0-0 \
10
  libsm6 \
11
  libxext6 \
12
  libxrender-dev \
13
  libgomp1 \
 
14
  && rm -rf /var/lib/apt/lists/* \
15
  && apt-get clean
16
 
@@ -39,19 +39,9 @@ ENV NUMEXPR_NUM_THREADS=2
39
  # Expose port
40
  EXPOSE 7860
41
 
42
- # Create simple health check script
43
- RUN echo '#!/usr/bin/env python3\n\
44
- import requests\n\
45
- import sys\n\
46
- try:\n\
47
- response = requests.get("http://localhost:7860/health", timeout=5)\n\
48
- sys.exit(0 if response.status_code == 200 else 1)\n\
49
- except:\n\
50
- sys.exit(1)\n' > /app/healthcheck.py && chmod +x /app/healthcheck.py
51
-
52
- # Health check untuk monitoring (menggunakan Python instead of curl)
53
- HEALTHCHECK --interval=30s --timeout=10s --start-period=30s --retries=3 \
54
- CMD python /app/healthcheck.py || exit 1
55
-
56
- # Run aplikasi with better error handling
57
- CMD ["python", "-m", "uvicorn", "app:app", "--host", "0.0.0.0", "--port", "7860", "--workers", "1", "--timeout-keep-alive", "30"]
 
5
 
6
  # Install system dependencies yang diperlukan (minimal)
7
  RUN apt-get update && apt-get install -y \
 
8
  libglib2.0-0 \
9
  libsm6 \
10
  libxext6 \
11
  libxrender-dev \
12
  libgomp1 \
13
+ libglib2.0-0 \
14
  && rm -rf /var/lib/apt/lists/* \
15
  && apt-get clean
16
 
 
39
  # Expose port
40
  EXPOSE 7860
41
 
42
+ # Health check untuk monitoring
43
+ HEALTHCHECK --interval=30s --timeout=10s --start-period=5s --retries=3 \
44
+ CMD curl -f http://localhost:7860/health || exit 1
45
+
46
+ # Run aplikasi
47
+ CMD ["python", "-m", "uvicorn", "app:app", "--host", "0.0.0.0", "--port", "7860", "--workers", "1"]
 
 
 
 
 
 
 
 
 
 
README.md CHANGED
@@ -1,3 +1,14 @@
 
 
 
 
 
 
 
 
 
 
 
1
  # 🧩 FunCaptcha Solver API - Hugging Face Spaces
2
 
3
  > **High-performance FunCaptcha solver dengan fuzzy matching dan API key authentication**
 
1
+ ---
2
+ title: FunCaptcha Solver API
3
+ emoji: 🧩
4
+ colorFrom: blue
5
+ colorTo: purple
6
+ sdk: docker
7
+ pinned: false
8
+ suggested_hardware: cpu-basic
9
+ app_file: app.py
10
+ ---
11
+
12
  # 🧩 FunCaptcha Solver API - Hugging Face Spaces
13
 
14
  > **High-performance FunCaptcha solver dengan fuzzy matching dan API key authentication**
app.py CHANGED
@@ -72,22 +72,14 @@ def get_api_key_from_secrets() -> str:
72
 
73
  def verify_api_key(credentials: HTTPAuthorizationCredentials = Depends(security)) -> bool:
74
  """Verify API key dari request header"""
75
- try:
76
- expected_key = get_api_key_from_secrets()
77
- if credentials.credentials != expected_key:
78
- raise HTTPException(
79
- status_code=status.HTTP_401_UNAUTHORIZED,
80
- detail="Invalid API key",
81
- headers={"WWW-Authenticate": "Bearer"}
82
- )
83
- return True
84
- except ValueError:
85
- # API key not configured
86
  raise HTTPException(
87
- status_code=status.HTTP_503_SERVICE_UNAVAILABLE,
88
- detail="API key not configured - set FUNCAPTCHA_API_KEY in HF Secrets",
89
  headers={"WWW-Authenticate": "Bearer"}
90
  )
 
91
 
92
  # =================================================================
93
  # MODEL CONFIGURATION & MANAGEMENT
@@ -574,25 +566,18 @@ async def startup_event():
574
  """Initialize aplikasi saat startup"""
575
  logger.info("🚀 Starting FunCaptcha Solver API...")
576
 
577
- # Verify API key ada - WARNING instead of ERROR untuk startup
578
  try:
579
  api_key = get_api_key_from_secrets()
580
  logger.info("✅ API key loaded successfully")
581
  except ValueError as e:
582
- logger.warning(f"⚠️ API key not set: {e}")
583
- logger.warning("⚠️ API will start but authentication will fail until key is set")
584
- # Don't raise - let app start anyway
585
 
586
  # Preload default model jika ada
587
  if os.path.exists('best.onnx') and os.path.exists('data.yaml'):
588
  logger.info("Preloading default model...")
589
- try:
590
- await ModelManager.get_model('default')
591
- logger.info("✅ Default model preloaded successfully")
592
- except Exception as e:
593
- logger.warning(f"⚠️ Failed to preload default model: {e}")
594
- else:
595
- logger.warning("⚠️ Model files (best.onnx, data.yaml) not found - upload them to enable solving")
596
 
597
  logger.info("✅ FunCaptcha Solver API started successfully")
598
 
 
72
 
73
  def verify_api_key(credentials: HTTPAuthorizationCredentials = Depends(security)) -> bool:
74
  """Verify API key dari request header"""
75
+ expected_key = get_api_key_from_secrets()
76
+ if credentials.credentials != expected_key:
 
 
 
 
 
 
 
 
 
77
  raise HTTPException(
78
+ status_code=status.HTTP_401_UNAUTHORIZED,
79
+ detail="Invalid API key",
80
  headers={"WWW-Authenticate": "Bearer"}
81
  )
82
+ return True
83
 
84
  # =================================================================
85
  # MODEL CONFIGURATION & MANAGEMENT
 
566
  """Initialize aplikasi saat startup"""
567
  logger.info("🚀 Starting FunCaptcha Solver API...")
568
 
569
+ # Verify API key ada
570
  try:
571
  api_key = get_api_key_from_secrets()
572
  logger.info("✅ API key loaded successfully")
573
  except ValueError as e:
574
+ logger.error(f" API key error: {e}")
575
+ raise e
 
576
 
577
  # Preload default model jika ada
578
  if os.path.exists('best.onnx') and os.path.exists('data.yaml'):
579
  logger.info("Preloading default model...")
580
+ await ModelManager.get_model('default')
 
 
 
 
 
 
581
 
582
  logger.info("✅ FunCaptcha Solver API started successfully")
583
 
requirements.txt CHANGED
@@ -1,20 +1,22 @@
1
  # Optimized requirements for FunCaptcha HF Spaces Deployment
2
- # Compatible versions untuk HF Spaces environment
3
 
4
  # Core web framework - Async FastAPI untuk performa tinggi
5
- fastapi>=0.100.0,<0.105.0
6
- uvicorn[standard]>=0.23.0,<0.25.0
7
 
8
- # ML/AI dependencies - Compatible versions
9
- onnxruntime>=1.15.0,<1.17.0
10
- opencv-python-headless>=4.8.0,<4.9.0
11
- numpy>=1.24.0,<1.26.0
12
- pillow>=10.0.0,<11.0.0
13
 
14
- # Utility libraries - Essential untuk functionality
15
- pyyaml>=6.0
16
- python-multipart>=0.0.6
17
- requests>=2.28.0
18
 
19
- # Security & Authentication
20
- python-jose[cryptography]>=3.3.0
 
 
 
 
1
  # Optimized requirements for FunCaptcha HF Spaces Deployment
2
+ # Minimal dependencies untuk performa dan ukuran optimal
3
 
4
  # Core web framework - Async FastAPI untuk performa tinggi
5
+ fastapi==0.104.1
6
+ uvicorn[standard]==0.24.0
7
 
8
+ # ML/AI dependencies - Versi stabil dan ringan
9
+ onnxruntime==1.16.3
10
+ opencv-python-headless==4.8.1.78
11
+ numpy==1.24.4
12
+ pillow==10.1.0
13
 
14
+ # Utility libraries - Minimal yang diperlukan
15
+ pyyaml==6.0.1
16
+ python-multipart==0.0.6
 
17
 
18
+ # Security & Authentication
19
+ python-jose[cryptography]==3.3.0
20
+
21
+ # Optional: Logging dan monitoring (sangat ringan)
22
+ structlog==23.2.0