services:
# Existing MCP Server
mcp-server:
build: ..
ports:
- "38000:8000"
environment:
- SCHEMA_REGISTRY_URL=http://schema-registry-mcp:8081
- SCHEMA_REGISTRY_USER=${SCHEMA_REGISTRY_USER:-}
- SCHEMA_REGISTRY_PASSWORD=${SCHEMA_REGISTRY_PASSWORD:-}
- MCP_HOST=0.0.0.0
- MCP_PORT=8000
- MCP_PATH=/mcp
- ENABLE_AUTH=false
- UVICORN_HOST=0.0.0.0
- UVICORN_PORT=8000
depends_on:
- schema-registry-mcp
networks:
- kafka-network-mcp
volumes:
- ./logs:/app/logs
restart: unless-stopped
command: ["python", "remote-mcp-server.py"]
healthcheck:
test: ["CMD", "python", "-c", "import urllib.request; urllib.request.urlopen('http://localhost:8000/health')"]
interval: 30s
timeout: 10s
retries: 5
start_period: 60s
# LLama via Ollama
ollama:
image: ollama/ollama:latest
container_name: ollama-mcp
ports:
- "11434:11434"
volumes:
- ollama_data:/root/.ollama
- ./models:/root/.ollama/models
environment:
- OLLAMA_HOST=0.0.0.0
- OLLAMA_ORIGINS=*
networks:
- kafka-network-mcp
restart: unless-stopped
# Uncomment the following section if you have an NVIDIA GPU for faster inference
# deploy:
# resources:
# reservations:
# devices:
# - driver: nvidia
# count: all
# capabilities: [gpu]
healthcheck:
test: ["CMD", "ollama", "list"]
interval: 30s
timeout: 10s
retries: 5
start_period: 60s
# MCP-LLama Bridge Service
mcp-bridge:
build:
context: .
dockerfile: Dockerfile.bridge
container_name: mcp-bridge
ports:
- "8080:8080"
environment:
- OLLAMA_HOST=http://ollama-mcp:11434
- MCP_SERVER_HOST=http://mcp-server:8000
- DEFAULT_MODEL=llama3.2:3b
depends_on:
ollama:
condition: service_healthy
mcp-server:
condition: service_started
networks:
- kafka-network-mcp
volumes:
- ./bridge:/app/bridge
- ./logs:/app/logs
restart: unless-stopped
# AKHQ UI for Kafka management
akhq-ui-mcp:
image: tchiotludo/akhq:0.25.1
depends_on:
- schema-registry-mcp
- kafka-mcp
ports:
- "38080:8080"
environment:
AKHQ_CONFIGURATION: |
akhq:
connections:
kafka-mcp-local:
properties:
bootstrap.servers: "kafka-mcp:9092"
schema-registry:
url: "http://schema-registry-mcp:8081"
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:8080/api/health"]
interval: 10s
timeout: 5s
retries: 10
start_period: 30s
networks:
- kafka-network-mcp
restart: unless-stopped
# Schema Registry
schema-registry-mcp:
image: confluentinc/cp-schema-registry:7.5.0
hostname: schema-registry-mcp
container_name: schema-registry-mcp
depends_on:
kafka-mcp:
condition: service_healthy
ports:
- "38081:8081"
environment:
SCHEMA_REGISTRY_HOST_NAME: schema-registry-mcp
SCHEMA_REGISTRY_KAFKASTORE_BOOTSTRAP_SERVERS: PLAINTEXT://kafka-mcp:9092
SCHEMA_REGISTRY_LISTENERS: http://0.0.0.0:8081
SCHEMA_REGISTRY_DELETE_SUBJECT_ENABLED: "true"
SCHEMA_REGISTRY_DELETE_VERSION_ENABLED: "true"
SCHEMA_REGISTRY_LOG4J_ROOT_LOGLEVEL: WARN
SCHEMA_REGISTRY_LOG4J_LOGGERS: "kafka.schema.registry=WARN"
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:8081/subjects"]
interval: 10s
timeout: 5s
retries: 10
start_period: 30s
networks:
- kafka-network-mcp
volumes:
- schema_registry_data:/var/lib/kafka-schema-registry
restart: unless-stopped
# Kafka Broker
kafka-mcp:
image: confluentinc/cp-kafka:7.5.0
hostname: kafka-mcp
container_name: kafka-mcp
user: root
ports:
- "39092:9092"
- "39094:9094"
environment:
KAFKA_NODE_ID: 1
KAFKA_PROCESS_ROLES: broker,controller
KAFKA_CONTROLLER_QUORUM_VOTERS: 1@kafka-mcp:9094
KAFKA_LISTENERS: PLAINTEXT://0.0.0.0:9092,CONTROLLER://0.0.0.0:9094
KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: PLAINTEXT:PLAINTEXT,CONTROLLER:PLAINTEXT
KAFKA_CONTROLLER_LISTENER_NAMES: CONTROLLER
KAFKA_INTER_BROKER_LISTENER_NAME: PLAINTEXT
KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://kafka-mcp:9092
KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 1
KAFKA_TRANSACTION_STATE_LOG_REPLICATION_FACTOR: 1
KAFKA_TRANSACTION_STATE_LOG_MIN_ISR: 1
KAFKA_LOG_DIRS: /tmp/kraft-combined-logs
KAFKA_AUTO_CREATE_TOPICS_ENABLE: 'true'
CLUSTER_ID: "v-qDsAQhRMOEe3xNzCmBuQ"
KAFKA_INITIAL_BROKER_REGISTRATION_TIMEOUT_MS: 60000
KAFKA_LOG4J_ROOT_LOGLEVEL: WARN
KAFKA_LOG4J_LOGGERS: "kafka=WARN,kafka.controller=WARN,kafka.log.LogCleaner=WARN,state.change.logger=WARN,kafka.producer.async.DefaultEventHandler=WARN"
command: >
bash -c "
echo 'Setting up Kafka directories...' &&
mkdir -p /tmp/kraft-combined-logs &&
chown -R appuser:appuser /tmp/kraft-combined-logs &&
echo 'Starting Kafka...' &&
/etc/confluent/docker/run"
healthcheck:
test: ["CMD", "kafka-topics", "--bootstrap-server", "localhost:9092", "--list"]
interval: 10s
timeout: 10s
retries: 10
start_period: 60s
networks:
- kafka-network-mcp
volumes:
- kafka_data:/tmp/kraft-combined-logs
restart: unless-stopped
volumes:
ollama_data:
driver: local
kafka_data:
driver: local
schema_registry_data:
driver: local
networks:
kafka-network-mcp:
driver: bridge
ipam:
config:
- subnet: 172.20.0.0/16