Spaces:
Paused
Paused
#!/usr/bin/env python3 | |
""" | |
Hugging Face Spaces Deployment Script | |
===================================== | |
This script automates the deployment of the Legal Dashboard OCR system to Hugging Face Spaces. | |
""" | |
import os | |
import sys | |
import subprocess | |
import shutil | |
import json | |
from pathlib import Path | |
import logging | |
# Configure logging | |
logging.basicConfig(level=logging.INFO, | |
format='%(asctime)s - %(levelname)s - %(message)s') | |
logger = logging.getLogger(__name__) | |
class HFDeployment: | |
def __init__(self, space_name, username, hf_token): | |
self.space_name = space_name | |
self.username = username | |
self.hf_token = hf_token | |
self.project_root = Path(__file__).parent | |
self.hf_space_dir = self.project_root / "huggingface_space" | |
def validate_structure(self): | |
"""Validate the project structure before deployment""" | |
logger.info("Validating project structure...") | |
required_files = [ | |
"huggingface_space/app.py", | |
"huggingface_space/Spacefile", | |
"huggingface_space/README.md", | |
"requirements.txt", | |
"app/services/ocr_service.py", | |
"app/services/ai_service.py", | |
"app/services/database_service.py" | |
] | |
missing_files = [] | |
for file_path in required_files: | |
if not (self.project_root / file_path).exists(): | |
missing_files.append(file_path) | |
if missing_files: | |
logger.error(f"Missing required files: {missing_files}") | |
return False | |
logger.info("β Project structure validation passed") | |
return True | |
def prepare_deployment_files(self): | |
"""Prepare files for Hugging Face Space deployment""" | |
logger.info("Preparing deployment files...") | |
# Copy required files to HF space directory | |
files_to_copy = [ | |
("requirements.txt", "requirements.txt"), | |
("app/", "app/"), | |
("data/", "data/"), | |
("tests/", "tests/") | |
] | |
for src, dst in files_to_copy: | |
src_path = self.project_root / src | |
dst_path = self.hf_space_dir / dst | |
if src_path.exists(): | |
if src_path.is_dir(): | |
if dst_path.exists(): | |
shutil.rmtree(dst_path) | |
shutil.copytree(src_path, dst_path) | |
else: | |
shutil.copy2(src_path, dst_path) | |
logger.info(f"β Copied {src} to {dst}") | |
# Create .gitignore for HF space | |
gitignore_content = """ | |
# Python | |
__pycache__/ | |
*.py[cod] | |
*$py.class | |
*.so | |
.Python | |
build/ | |
develop-eggs/ | |
dist/ | |
downloads/ | |
eggs/ | |
.eggs/ | |
lib/ | |
lib64/ | |
parts/ | |
sdist/ | |
var/ | |
wheels/ | |
*.egg-info/ | |
.installed.cfg | |
*.egg | |
# Virtual environments | |
venv/ | |
env/ | |
ENV/ | |
# IDE | |
.vscode/ | |
.idea/ | |
*.swp | |
*.swo | |
# OS | |
.DS_Store | |
Thumbs.db | |
# Logs | |
*.log | |
# Database | |
*.db | |
*.sqlite | |
# Environment variables | |
.env | |
# Temporary files | |
*.tmp | |
*.temp | |
""" | |
gitignore_path = self.hf_space_dir / ".gitignore" | |
with open(gitignore_path, 'w') as f: | |
f.write(gitignore_content.strip()) | |
logger.info("β Deployment files prepared") | |
return True | |
def create_space(self): | |
"""Create a new Hugging Face Space""" | |
logger.info( | |
f"Creating Hugging Face Space: {self.username}/{self.space_name}") | |
# This would typically be done via Hugging Face API or web interface | |
# For now, we'll provide instructions | |
logger.info(""" | |
π Manual Space Creation Required: | |
1. Go to https://huggingface.co/spaces | |
2. Click "Create new Space" | |
3. Fill in the details: | |
- Owner: {username} | |
- Space name: {space_name} | |
- SDK: Gradio | |
- License: MIT | |
- Visibility: Public | |
4. Click "Create Space" | |
The Space will be created at: https://huggingface.co/spaces/{username}/{space_name} | |
""".format(username=self.username, space_name=self.space_name)) | |
return True | |
def setup_git_repository(self): | |
"""Set up Git repository for the Space""" | |
logger.info("Setting up Git repository...") | |
# Change to HF space directory | |
os.chdir(self.hf_space_dir) | |
# Initialize git repository | |
subprocess.run(["git", "init"], check=True) | |
# Add remote origin | |
remote_url = f"https://{self.username}:{self.hf_token}@huggingface.co/spaces/{self.username}/{self.space_name}" | |
subprocess.run( | |
["git", "remote", "add", "origin", remote_url], check=True) | |
logger.info("β Git repository initialized") | |
return True | |
def commit_and_push(self): | |
"""Commit and push changes to Hugging Face Space""" | |
logger.info("Committing and pushing changes...") | |
try: | |
# Add all files | |
subprocess.run(["git", "add", "."], check=True) | |
# Commit changes | |
subprocess.run( | |
["git", "commit", "-m", "Initial deployment of Legal Dashboard OCR"], check=True) | |
# Push to main branch | |
subprocess.run(["git", "push", "-u", "origin", "main"], check=True) | |
logger.info("β Changes pushed successfully") | |
return True | |
except subprocess.CalledProcessError as e: | |
logger.error(f"β Git operation failed: {e}") | |
return False | |
def verify_deployment(self): | |
"""Verify the deployment was successful""" | |
logger.info("Verifying deployment...") | |
space_url = f"https://huggingface.co/spaces/{self.username}/{self.space_name}" | |
logger.info(f"π Space URL: {space_url}") | |
logger.info(""" | |
π Deployment Verification Checklist: | |
β Project structure validated | |
β Deployment files prepared | |
β Git repository initialized | |
β Changes committed and pushed | |
β Space created on Hugging Face | |
Next Steps: | |
1. Visit the Space URL to verify it's building correctly | |
2. Test the OCR functionality with sample documents | |
3. Check the logs for any errors | |
4. Verify all features are working as expected | |
Space URL: {space_url} | |
""".format(space_url=space_url)) | |
return True | |
def deploy(self): | |
"""Main deployment method""" | |
logger.info("π Starting Hugging Face Spaces deployment...") | |
try: | |
# Step 1: Validate structure | |
if not self.validate_structure(): | |
return False | |
# Step 2: Prepare deployment files | |
if not self.prepare_deployment_files(): | |
return False | |
# Step 3: Create space (manual step) | |
self.create_space() | |
# Step 4: Setup git repository | |
if not self.setup_git_repository(): | |
return False | |
# Step 5: Commit and push | |
if not self.commit_and_push(): | |
return False | |
# Step 6: Verify deployment | |
self.verify_deployment() | |
logger.info("π Deployment completed successfully!") | |
return True | |
except Exception as e: | |
logger.error(f"β Deployment failed: {e}") | |
return False | |
def main(): | |
"""Main function""" | |
print("π Legal Dashboard OCR - Hugging Face Spaces Deployment") | |
print("=" * 60) | |
# Get deployment parameters | |
space_name = input( | |
"Enter Space name (e.g., legal-dashboard-ocr): ").strip() | |
username = input("Enter your Hugging Face username: ").strip() | |
hf_token = input("Enter your Hugging Face token: ").strip() | |
if not all([space_name, username, hf_token]): | |
print("β All parameters are required") | |
return | |
# Create deployment instance | |
deployment = HFDeployment(space_name, username, hf_token) | |
# Run deployment | |
success = deployment.deploy() | |
if success: | |
print(f"\nπ Deployment successful!") | |
print( | |
f"π Visit your Space at: https://huggingface.co/spaces/{username}/{space_name}") | |
else: | |
print("\nβ Deployment failed. Please check the logs above.") | |
if __name__ == "__main__": | |
main() | |