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

Update docker/entrypoint-hf.sh

Browse files
Files changed (1) hide show
  1. docker/entrypoint-hf.sh +130 -85
docker/entrypoint-hf.sh CHANGED
@@ -1,85 +1,130 @@
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"]
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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