fhirflame / docker-compose.modal.yml
leksval
initial commit
a963d65
services:
# FhirFlame with Modal L4 GPU integration + A2A API
fhirflame-modal:
build:
context: .
dockerfile: Dockerfile
image: fhirflame-modal:latest
container_name: fhirflame-modal
ports:
- "${GRADIO_PORT:-7860}:7860" # Gradio UI
environment:
- PYTHONPATH=/app
- GRADIO_SERVER_NAME=0.0.0.0
- DEPLOYMENT_TARGET=modal
# Modal Configuration
- ENABLE_MODAL_SCALING=${ENABLE_MODAL_SCALING:-true}
- MODAL_TOKEN_ID=${MODAL_TOKEN_ID}
- MODAL_TOKEN_SECRET=${MODAL_TOKEN_SECRET}
- MODAL_ENDPOINT_URL=${MODAL_ENDPOINT_URL}
- MODAL_L4_HOURLY_RATE=${MODAL_L4_HOURLY_RATE:-0.73}
- MODAL_PLATFORM_FEE=${MODAL_PLATFORM_FEE:-15}
# Environment
- FHIRFLAME_DEV_MODE=${FHIRFLAME_DEV_MODE:-false}
- FHIR_VERSION=${FHIR_VERSION:-R4}
- ENABLE_HIPAA_LOGGING=${ENABLE_HIPAA_LOGGING:-true}
# API Keys (from .env)
- HF_TOKEN=${HF_TOKEN}
- MISTRAL_API_KEY=${MISTRAL_API_KEY}
# Fallback Configuration
- USE_MISTRAL_FALLBACK=${USE_MISTRAL_FALLBACK:-true}
- USE_MULTIMODAL_FALLBACK=${USE_MULTIMODAL_FALLBACK:-true}
# Auth0 for production (optional)
- AUTH0_DOMAIN=${AUTH0_DOMAIN:-}
- AUTH0_AUDIENCE=${AUTH0_AUDIENCE:-}
volumes:
- ./src:/app/src
- ./tests:/app/tests
- ./logs:/app/logs
- ./.env:/app/.env
networks:
- fhirflame-modal
command: python frontend_ui.py
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:7860"]
interval: 30s
timeout: 10s
retries: 3
# A2A API Server with Modal integration
fhirflame-a2a-modal:
build:
context: .
dockerfile: Dockerfile
image: fhirflame-modal:latest
container_name: fhirflame-a2a-modal
ports:
- "${A2A_API_PORT:-8000}:8000" # A2A API
environment:
- PYTHONPATH=/app
- FHIRFLAME_DEV_MODE=${FHIRFLAME_DEV_MODE:-false}
- FHIRFLAME_API_KEY=${FHIRFLAME_API_KEY:-fhirflame-modal-key}
- PORT=8000
# Auth0 Configuration for production
- AUTH0_DOMAIN=${AUTH0_DOMAIN:-}
- AUTH0_AUDIENCE=${AUTH0_AUDIENCE:-}
# Modal Integration
- MODAL_TOKEN_ID=${MODAL_TOKEN_ID}
- MODAL_TOKEN_SECRET=${MODAL_TOKEN_SECRET}
- MODAL_ENDPOINT_URL=${MODAL_ENDPOINT_URL}
volumes:
- ./src:/app/src
- ./.env:/app/.env
networks:
- fhirflame-modal
command: python -c "from src.mcp_a2a_api import app; import uvicorn; uvicorn.run(app, host='0.0.0.0', port=8000)"
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:8000/health"]
interval: 30s
timeout: 10s
retries: 3
# Modal deployment service
modal-deployer:
build:
context: .
dockerfile: Dockerfile
image: fhirflame-modal:latest
container_name: modal-deployer
environment:
- PYTHONPATH=/app
- MODAL_TOKEN_ID=${MODAL_TOKEN_ID}
- MODAL_TOKEN_SECRET=${MODAL_TOKEN_SECRET}
volumes:
- ./modal:/app/modal
- ./.env:/app/.env
networks:
- fhirflame-modal
working_dir: /app
command: >
sh -c "
echo '🚀 Deploying Modal L4 GPU functions...' &&
python modal/deploy.py --a2a &&
echo '✅ Modal deployment complete!'
"
profiles:
- deploy
# HuggingFace fallback service (local backup)
hf-fallback:
build:
context: .
dockerfile: Dockerfile
image: fhirflame-modal:latest
container_name: hf-fallback
environment:
- PYTHONPATH=/app
- HF_TOKEN=${HF_TOKEN}
- DEPLOYMENT_TARGET=huggingface
volumes:
- ./src:/app/src
- ./.env:/app/.env
networks:
- fhirflame-modal
command: python -c "print('HuggingFace fallback ready')"
profiles:
- fallback
# Test runner for Modal integration
test-modal:
build:
context: .
dockerfile: Dockerfile
image: fhirflame-modal:latest
container_name: fhirflame-modal-tests
environment:
- PYTHONPATH=/app
- MODAL_TOKEN_ID=${MODAL_TOKEN_ID}
- MODAL_TOKEN_SECRET=${MODAL_TOKEN_SECRET}
- FHIRFLAME_DEV_MODE=true
volumes:
- ./src:/app/src
- ./tests:/app/tests
- ./test_results:/app/test_results
- ./.env:/app/.env
networks:
- fhirflame-modal
depends_on:
- fhirflame-a2a-modal
command: python tests/test_modal_scaling.py
profiles:
- test
# Langfuse Database for monitoring
langfuse-db:
image: postgres:15
container_name: langfuse-db-modal
environment:
- POSTGRES_DB=langfuse
- POSTGRES_USER=langfuse
- POSTGRES_PASSWORD=langfuse
volumes:
- langfuse_db_data:/var/lib/postgresql/data
networks:
- fhirflame-modal
healthcheck:
test: ["CMD-SHELL", "pg_isready -U langfuse -d langfuse"]
interval: 10s
timeout: 5s
retries: 5
start_period: 10s
# Langfuse for comprehensive monitoring
langfuse:
image: langfuse/langfuse:latest
container_name: langfuse-modal
depends_on:
langfuse-db:
condition: service_healthy
ports:
- "${LANGFUSE_PORT:-3000}:3000"
environment:
- DATABASE_URL=postgresql://langfuse:langfuse@langfuse-db:5432/langfuse
- NEXTAUTH_SECRET=mysecret
- SALT=mysalt
- NEXTAUTH_URL=http://localhost:3000
- TELEMETRY_ENABLED=${TELEMETRY_ENABLED:-true}
- NEXT_PUBLIC_SIGN_UP_DISABLED=${NEXT_PUBLIC_SIGN_UP_DISABLED:-false}
- LANGFUSE_ENABLE_EXPERIMENTAL_FEATURES=${LANGFUSE_ENABLE_EXPERIMENTAL_FEATURES:-false}
networks:
- fhirflame-modal
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:3000/api/public/health"]
interval: 30s
timeout: 10s
retries: 3
start_period: 60s
networks:
fhirflame-modal:
driver: bridge
volumes:
langfuse_db_data: