name: Deploy to Hugging Face Spaces on: push: branches: [main] workflow_dispatch: jobs: deploy-to-hf-spaces: name: Deploy Backend to HF Spaces runs-on: ubuntu-latest steps: - name: Checkout code uses: actions/checkout@v4 with: fetch-depth: 0 lfs: true - name: Set up Python uses: actions/setup-python@v5 with: python-version: '3.x' - name: Install huggingface_hub run: pip install huggingface_hub - name: Login to HuggingFace run: hf auth login --token $HF_TOKEN env: HF_TOKEN: ${{ secrets.HF_TOKEN }} - name: Prepare deployment files env: HF_SPACE_NAME: ${{ secrets.HF_SPACE_NAME }} run: | set -e echo "Creating deployment directory..." mkdir -p hf-deploy # Copy backend and required packages echo "Copying backend files..." mkdir -p hf-deploy/apps/backend cp -r apps/backend/src hf-deploy/apps/backend/ cp -r apps/backend/prisma hf-deploy/apps/backend/ cp apps/backend/package.json hf-deploy/apps/backend/ cp apps/backend/package-lock.json hf-deploy/apps/backend/ 2>/dev/null || true cp apps/backend/tsconfig.json hf-deploy/apps/backend/ # Copy shared packages echo "Copying shared packages..." mkdir -p hf-deploy/packages/domain-types cp -r packages/domain-types/src hf-deploy/packages/domain-types/ cp packages/domain-types/package.json hf-deploy/packages/domain-types/ cp packages/domain-types/tsconfig.json hf-deploy/packages/domain-types/ mkdir -p hf-deploy/packages/mcp-types cp -r packages/mcp-types/src hf-deploy/packages/mcp-types/ cp packages/mcp-types/package.json hf-deploy/packages/mcp-types/ cp packages/mcp-types/tsconfig.json hf-deploy/packages/mcp-types/ # Copy root config echo "Copying root config..." cp package.json hf-deploy/ cp package-lock.json hf-deploy/ 2>/dev/null || true cp tsconfig.json hf-deploy/ 2>/dev/null || true # Copy Dockerfile echo "Copying Dockerfile..." if [ -f scripts/hf-backend.dockerfile ]; then cp scripts/hf-backend.dockerfile hf-deploy/Dockerfile elif [ -f Dockerfile ]; then cp Dockerfile hf-deploy/ fi # Clean unwanted files echo "Cleaning unwanted files..." find hf-deploy -name "*.pdf" -delete 2>/dev/null || true find hf-deploy -name "*.db*" -delete 2>/dev/null || true find hf-deploy -name "*.sqlite" -delete 2>/dev/null || true find hf-deploy -name "*.log" -delete 2>/dev/null || true find hf-deploy -name "node_modules" -type d -exec rm -rf {} + 2>/dev/null || true find hf-deploy -name "dist" -type d -exec rm -rf {} + 2>/dev/null || true # Create README.md echo "Creating README..." echo "---" > hf-deploy/README.md echo "title: WidgeTDC Cortex" >> hf-deploy/README.md echo "emoji: 🧠" >> hf-deploy/README.md echo "colorFrom: blue" >> hf-deploy/README.md echo "colorTo: purple" >> hf-deploy/README.md echo "sdk: docker" >> hf-deploy/README.md echo "app_port: 7860" >> hf-deploy/README.md echo "hardware: t4-small" >> hf-deploy/README.md echo "---" >> hf-deploy/README.md echo "" >> hf-deploy/README.md echo "# WidgeTDC Cortex - Neural Backend" >> hf-deploy/README.md echo "" >> hf-deploy/README.md echo "Enterprise AI backend with GPU-accelerated embeddings and MCP agents." >> hf-deploy/README.md echo "" >> hf-deploy/README.md echo "## Features" >> hf-deploy/README.md echo "- GPU-accelerated embeddings via sentence-transformers" >> hf-deploy/README.md echo "- MCP (Model Context Protocol) tool execution" >> hf-deploy/README.md echo "- Real-time WebSocket communication" >> hf-deploy/README.md echo "- Health monitoring at /health endpoint" >> hf-deploy/README.md # Verify structure echo "Verifying structure..." ls -la hf-deploy/ ls -la hf-deploy/apps/backend/ || echo "Backend missing!" - name: Create HuggingFace Space (if not exists) env: HF_SPACE_NAME: ${{ secrets.HF_SPACE_NAME }} run: | echo "Creating/verifying Space: $HF_SPACE_NAME" # Try to create Space (will fail if exists, which is OK) hf repo create $HF_SPACE_NAME --type space --space_sdk docker || echo "Space already exists or creation failed - continuing..." echo "✅ Space ready" - name: Upload to HuggingFace Space env: HF_SPACE_NAME: ${{ secrets.HF_SPACE_NAME }} run: | set -e echo "Uploading to HuggingFace Space: $HF_SPACE_NAME" # Use HF CLI to upload entire folder hf upload \ "$HF_SPACE_NAME" \ ./hf-deploy \ . \ --repo-type=space \ --commit-message="Deploy from GitHub Actions $(date +%Y-%m-%d_%H-%M-%S)" \ || { echo "::error::Upload failed - check HF_TOKEN permissions and Space name" exit 1 } echo "✅ Deployment successful!" echo "Space URL: https://huggingface.co/spaces/$HF_SPACE_NAME" echo "::notice::Deployment complete - Space will build Docker image (5-10 min)"