vaha-m commited on
Commit
fddf55f
Β·
verified Β·
1 Parent(s): 64fd91f

Update docker/entrypoint-hf.sh

Browse files
Files changed (1) hide show
  1. docker/entrypoint-hf.sh +85 -130
docker/entrypoint-hf.sh CHANGED
@@ -1,130 +1,85 @@
1
- #!/bin/bash
2
- # Entrypoint script for Hugging Face Spaces deployment
3
- # Launches MCP Toolbox and Gradio multi-agent assistant
4
-
5
- set -e
6
-
7
- echo "=================================================="
8
- echo "πŸš€ Starting PortfolioMind Multi-Agent Assistant"
9
- echo "=================================================="
10
-
11
- # Validate required environment variables
12
- echo "πŸ“‹ Validating configuration..."
13
-
14
- REQUIRED_VARS=(
15
- "GOOGLE_API_KEY"
16
- "CHROMA_API_KEY"
17
- "CHROMA_TENANT"
18
- "CHROMA_DATABASE"
19
- "ALPHA_VANTAGE_API_KEY"
20
- )
21
-
22
- MISSING_VARS=()
23
- for var in "${REQUIRED_VARS[@]}"; do
24
- if [ -z "${!var}" ]; then
25
- MISSING_VARS+=("$var")
26
- fi
27
- done
28
-
29
- if [ ${#MISSING_VARS[@]} -gt 0 ]; then
30
- echo "❌ Missing required environment variables:"
31
- for var in "${MISSING_VARS[@]}"; do
32
- echo " - $var"
33
- done
34
- echo ""
35
- echo "Please configure these in Hugging Face Space Settings > Variables and Secrets"
36
- exit 1
37
- fi
38
-
39
- echo "βœ… All required environment variables are set"
40
- echo ""
41
-
42
- # Optional variables (log if present)
43
- echo "πŸ“Š Optional services status:"
44
- [ -n "$COINGECKO_API_KEY" ] && echo " βœ“ CoinGecko API configured" || echo " ⚠ CoinGecko API not configured (using free tier)"
45
- [ -n "$GCP_PROJECT_ID" ] && echo " βœ“ Google Cloud SQL configured" || echo " ⚠ Google Cloud SQL not configured"
46
- [ -n "$MCP_TOOLBOX_SERVER_URL" ] && echo " βœ“ MCP Toolbox URL: $MCP_TOOLBOX_SERVER_URL" || echo " ⚠ MCP Toolbox not configured"
47
-
48
- # Start MCP Toolbox if Cloud SQL is configured
49
- if [ -n "$GCP_PROJECT_ID" ] && [ -n "$CLOUD_SQL_INSTANCE" ]; then
50
- echo ""
51
- echo "πŸš€ Starting MCP Toolbox (Cloud SQL) on port 5000..."
52
- echo "=================================================="
53
-
54
- # Configure GCP credentials if provided as JSON string
55
- if [ -n "$GCP_SERVICE_ACCOUNT_JSON" ]; then
56
- echo " βœ“ Configuring GCP credentials from environment variable..."
57
- mkdir -p /app/credentials
58
- echo "$GCP_SERVICE_ACCOUNT_JSON" > /app/credentials/gcp-key.json
59
- export GOOGLE_APPLICATION_CREDENTIALS=/app/credentials/gcp-key.json
60
- echo " βœ“ GCP credentials configured"
61
- fi
62
-
63
- # Substitute environment variables in tools.yaml
64
- echo " β†’ Preparing tools.yaml with environment variables..."
65
- envsubst < /app/tools.yaml > /tmp/tools.yaml
66
-
67
- # Start MCP Toolbox server in background
68
- echo " β†’ Starting MCP Toolbox server..."
69
- /usr/local/bin/toolbox \
70
- --tools-file /tmp/tools.yaml \
71
- --address 0.0.0.0 \
72
- --port 5000 > /tmp/toolbox.log 2>&1 &
73
-
74
- TOOLBOX_PID=$!
75
- echo " βœ“ MCP Toolbox started (PID: $TOOLBOX_PID)"
76
-
77
- # Wait for toolbox to be ready
78
- echo " ⏳ Waiting for MCP Toolbox to be ready..."
79
- TIMEOUT=30
80
- ELAPSED=0
81
- while [ $ELAPSED -lt $TIMEOUT ]; do
82
- if curl -sf http://localhost:5000/health > /dev/null 2>&1; then
83
- echo " βœ… MCP Toolbox is ready!"
84
- break
85
- fi
86
- sleep 2
87
- ELAPSED=$((ELAPSED + 2))
88
- done
89
-
90
- if [ $ELAPSED -ge $TIMEOUT ]; then
91
- echo " ⚠ MCP Toolbox health check timeout (this is OK if no Cloud SQL configured)"
92
- fi
93
-
94
- # Show toolbox logs for debugging
95
- echo " β„Ή Check logs: tail /tmp/toolbox.log"
96
- if [ -f /tmp/toolbox.log ]; then
97
- echo ""
98
- echo "πŸ“‹ MCP Toolbox startup logs:"
99
- echo "----------------------------"
100
- cat /tmp/toolbox.log
101
- echo "----------------------------"
102
- echo ""
103
- fi
104
- else
105
- echo ""
106
- echo "⚠ Skipping MCP Toolbox - Cloud SQL not configured"
107
- echo " Set GCP_PROJECT_ID and CLOUD_SQL_INSTANCE to enable Finance Tracker"
108
- fi
109
-
110
- echo ""
111
- echo "🎯 Starting Gradio application on port 7860..."
112
- echo "=================================================="
113
- echo ""
114
-
115
- # Set Python path to include /app
116
- export PYTHONPATH=/app:$PYTHONPATH
117
-
118
- # Debug: Show Python path and verify modules
119
- echo "πŸ” Debug Info:"
120
- echo " Working directory: $(pwd)"
121
- echo " PYTHONPATH: $PYTHONPATH"
122
- echo " Python version: $(python --version)"
123
- if [ -n "$TOOLBOX_PID" ]; then
124
- echo " MCP Toolbox PID: $TOOLBOX_PID"
125
- fi
126
- echo ""
127
-
128
- # Launch Gradio app with native MCP support
129
- cd /app
130
- exec python -u ui/gradio_app.py
 
1
+ # Dockerfile for Hugging Face Spaces - Gradio Multi-Agent Assistant with MCP Toolbox
2
+ # This deploys the complete multi-agent system with Cloud SQL access via MCP Toolbox
3
+
4
+ FROM python:3.11-slim
5
+
6
+ # Install system dependencies including Node.js
7
+ RUN apt-get update && apt-get install -y \
8
+ ca-certificates \
9
+ curl \
10
+ git \
11
+ build-essential \
12
+ gettext-base \
13
+ && curl -fsSL https://deb.nodesource.com/setup_20.x | bash - \
14
+ && apt-get install -y nodejs \
15
+ && rm -rf /var/lib/apt/lists/*
16
+
17
+ # Install MCP Toolbox binary (v0.18.0)
18
+ ARG TOOLBOX_VERSION=v0.18.0
19
+ RUN ARCH=$(dpkg --print-architecture) && \
20
+ if [ "$ARCH" = "amd64" ]; then \
21
+ TOOLBOX_ARCH="amd64"; \
22
+ elif [ "$ARCH" = "arm64" ]; then \
23
+ TOOLBOX_ARCH="arm64"; \
24
+ else \
25
+ echo "Unsupported architecture: $ARCH" && exit 1; \
26
+ fi && \
27
+ curl -L "https://storage.googleapis.com/genai-toolbox/${TOOLBOX_VERSION}/linux/${TOOLBOX_ARCH}/toolbox" \
28
+ -o /usr/local/bin/toolbox && \
29
+ chmod +x /usr/local/bin/toolbox
30
+
31
+ # Verify installations
32
+ RUN python --version && node --version && npm --version && toolbox --version
33
+
34
+ # Set working directory
35
+ WORKDIR /app
36
+
37
+ # Copy requirements first (for layer caching)
38
+ COPY requirements.txt .
39
+
40
+ # Install Python dependencies
41
+ RUN pip install --no-cache-dir --upgrade pip && \
42
+ pip install --no-cache-dir -r requirements.txt
43
+
44
+ # Install npx-based MCP servers globally
45
+ # CoinGecko MCP server for crypto data
46
+ RUN npm install -g @coingecko/coingecko-mcp
47
+
48
+ # Install uvx for Python-based MCP servers
49
+ RUN pip install --no-cache-dir uv
50
+
51
+ # Copy application code
52
+ COPY src/ ./src/
53
+ COPY ui/ ./ui/
54
+
55
+ # Make src a proper Python package
56
+ RUN find /app/src -type d -exec touch {}/__init__.py \;
57
+
58
+ # Copy MCP Toolbox configuration
59
+ COPY tools.yaml /app/tools.yaml
60
+
61
+ # Create directory for temporary file uploads
62
+ RUN mkdir -p /tmp/uploads && chmod 777 /tmp/uploads
63
+
64
+ # Copy entrypoint script
65
+ COPY docker/entrypoint-hf.sh /app/entrypoint.sh
66
+ RUN chmod +x /app/entrypoint.sh
67
+
68
+ # Set environment variables for Hugging Face Spaces
69
+ ENV GRADIO_SERVER_NAME="0.0.0.0" \
70
+ GRADIO_SERVER_PORT="7860" \
71
+ PYTHONUNBUFFERED=1 \
72
+ PYTHONPATH=/app
73
+
74
+ # Expose Gradio port (HF Spaces expects 7860)
75
+ EXPOSE 7860
76
+
77
+ # Expose MCP Toolbox port (internal - for communication between services)
78
+ EXPOSE 5000
79
+
80
+ # Health check
81
+ HEALTHCHECK --interval=30s --timeout=10s --start-period=90s --retries=3 \
82
+ CMD curl -f http://localhost:7860/ || exit 1
83
+
84
+ # Run Gradio app via entrypoint
85
+ CMD ["/app/entrypoint.sh"]