Files
KNEL-AIMiddleware/docker-compose.yml
Charles N Wyble 338094fef0 refactor: standardize container names to lowercase kneldevstack-aimiddleware-*
- Update all 29 container_name fields from KNELDevStack-AIMiddleware-* to kneldevstack-aimiddleware-*
- Add explicit image: fields to all services for consistent image naming
- Fix ghost-mcp and discourse-mcp to use build context instead of direct npx calls
- Ensures consistent lowercase naming across all services

This resolves confusion between service names, image names, and container names.
All three tiers (service, image, container) now use the same lowercase naming convention.
2026-01-22 10:05:29 -05:00

475 lines
14 KiB
YAML

services:
# ==========================================
# Design & Engineering (3 servers)
# ==========================================
# KiCAD MCP - PCB design automation
# NOTE: Requires KiCAD to be installed on host machine
# The MCP server connects to an existing KiCAD instance via TCP
kicad-mcp:
image: kneldevstack-aimiddleware-kicad-mcp
build:
context: ./vendor/KiCAD-MCP-Server
dockerfile: Dockerfile
container_name: kneldevstack-aimiddleware-kicad-mcp
restart: unless-stopped
environment:
- NODE_ENV=production
- KICAD_HOST=${KICAD_HOST:-host.docker.internal}
- KICAD_PORT=${KICAD_PORT:-5555}
command: ["node", "dist/index.js"]
profiles:
- dev
# Blender MCP - 3D modeling and materials
blender-mcp:
image: kneldevstack-aimiddleware-blender-mcp
build:
context: ./vendor/blender-mcp
dockerfile: Dockerfile
container_name: kneldevstack-aimiddleware-blender-mcp
restart: unless-stopped
environment:
- PYTHONUNBUFFERED=1
command: ["uvx", "blender-mcp"]
profiles:
- dev
# FreeCAD MCP - CAD modeling
freecad-mcp:
image: kneldevstack-aimiddleware-freecad-mcp
build:
context: ./vendor/freecad-mcp
dockerfile: Dockerfile
container_name: kneldevstack-aimiddleware-freecad-mcp
restart: unless-stopped
environment:
- PYTHONUNBUFFERED=1
command: ["uvx", "freecad-mcp"]
profiles:
- dev
# ==========================================
# Hosting & Infrastructure (5 servers)
# ==========================================
# Kubernetes MCP - K8s/OpenShift management
kubernetes-mcp:
image: kneldevstack-aimiddleware-kubernetes-mcp
build:
context: ./vendor/kubernetes-mcp-server
dockerfile: Dockerfile
container_name: kneldevstack-aimiddleware-kubernetes-mcp
restart: unless-stopped
ports:
- "8081:8080"
volumes:
- ~/.kube/config:/root/.kube/config:ro
profiles:
- ops
# Docker MCP - Container and compose management
docker-mcp:
image: kneldevstack-aimiddleware-docker-mcp
build:
context: ./vendor/docker-mcp
dockerfile: Dockerfile
container_name: kneldevstack-aimiddleware-docker-mcp
restart: unless-stopped
volumes:
- /var/run/docker.sock:/var/run/docker.sock
- ~/.docker/config.json:/root/.docker/config.json:ro
environment:
- PYTHONUNBUFFERED=1
command: ["uvx", "docker-mcp"]
profiles:
- ops
# Proxmox MCP - Hypervisor management
proxmox-mcp:
image: kneldevstack-aimiddleware-proxmox-mcp
build:
context: ./vendor/ProxmoxMCP
dockerfile: Dockerfile
container_name: kneldevstack-aimiddleware-proxmox-mcp
restart: unless-stopped
environment:
- PYTHONUNBUFFERED=1
- PROXMOX_HOST=${PROXMOX_HOST}
- PROXMOX_USER=${PROXMOX_USER}
- PROXMOX_TOKEN=${PROXMOX_TOKEN}
- PROXMOX_NODE=${PROXMOX_NODE}
command: ["uvx", "proxmox-mcp"]
profiles:
- ops
# Terraform MCP - IaC automation
terraform-mcp:
image: kneldevstack-aimiddleware-terraform-mcp
build:
context: ./vendor/terraform-mcp-server
dockerfile: Dockerfile
target: dev
container_name: kneldevstack-aimiddleware-terraform-mcp
restart: unless-stopped
environment:
- HOME=/terraform
volumes:
- ~/.terraform.d:/terraform/.terraform.d:ro
- ./terraform-cache:/terraform/.terraform.cache
profiles:
- ops
# Cloudron MCP - Self-hosted app management
cloudron-mcp:
image: kneldevstack-aimiddleware-cloudron-mcp
build:
context: ./vendor/mcp-cloudron
dockerfile: Dockerfile
container_name: kneldevstack-aimiddleware-cloudron-mcp
restart: unless-stopped
environment:
- CLOUDRON_URL=${CLOUDRON_URL}
- CLOUDRON_TOKEN=${CLOUDRON_TOKEN}
profiles:
- ops
# ==========================================
# Development Tools (2 servers)
# ==========================================
# Bash Language Server - LSP for bash
bash-language-server:
image: kneldevstack-aimiddleware-bash-language-server
build:
context: ./vendor/bash-language-server
dockerfile: ../../dockerfiles/bash-language-server/Dockerfile
container_name: kneldevstack-aimiddleware-bash-language-server
restart: "no"
profiles:
- dev
# Context7 MCP - Documentation framework
context7-mcp:
image: kneldevstack-aimiddleware-context7-mcp
build:
context: ./vendor/context7
dockerfile: ../../dockerfiles/context7/Dockerfile
container_name: kneldevstack-aimiddleware-context7-mcp
restart: unless-stopped
environment:
- UPSTASH_REDIS_REST_URL=${UPSTASH_REDIS_REST_URL}
- UPSTASH_REDIS_REST_TOKEN=${UPSTASH_REDIS_REST_TOKEN}
profiles:
- dev
# ==========================================
# Content Management (4 servers)
# ==========================================
# Nextcloud MCP - 90+ tools across 8 apps
nextcloud-mcp:
image: kneldevstack-aimiddleware-nextcloud-mcp
build:
context: ./vendor/nextcloud-mcp-server
dockerfile: Dockerfile
container_name: kneldevstack-aimiddleware-nextcloud-mcp
restart: unless-stopped
environment:
- PYTHONUNBUFFERED=1
- NEXTCLOUD_HOST=${NEXTCLOUD_HOST}
- NEXTCLOUD_USERNAME=${NEXTCLOUD_USERNAME}
- NEXTCLOUD_APP_PASSWORD=${NEXTCLOUD_APP_PASSWORD}
ports:
- "8083:8080"
profiles:
- ops
# Ghost MCP - CMS integration
ghost-mcp:
image: kneldevstack-aimiddleware-ghost-mcp
build:
context: ./vendor/ghost-mcp
dockerfile: ../../dockerfiles/ghost-mcp/Dockerfile
container_name: kneldevstack-aimiddleware-ghost-mcp
restart: unless-stopped
environment:
- GHOST_API_URL=${GHOST_API_URL}
- GHOST_ADMIN_API_KEY=${GHOST_ADMIN_API_KEY}
profiles:
- ops
# ONLYOFFICE DocSpace MCP - Room and file management
docspace-mcp:
image: kneldevstack-aimiddleware-docspace-mcp
build:
context: ./vendor/docspace-mcp
dockerfile: Dockerfile
container_name: kneldevstack-aimiddleware-docspace-mcp
restart: unless-stopped
environment:
- DOCSPACE_HOST=${DOCSPACE_HOST}
- DOCSPACE_TOKEN=${DOCSPACE_TOKEN}
profiles:
- ops
# WordPress MCP Adapter
wordpress-mcp:
image: kneldevstack-aimiddleware-wordpress-mcp
build:
context: ./vendor/mcp-adapter
dockerfile: Dockerfile
container_name: kneldevstack-aimiddleware-wordpress-mcp
restart: unless-stopped
environment:
- WORDPRESS_URL=${WORDPRESS_URL}
- WORDPRESS_USERNAME=${WORDPRESS_USERNAME}
- WORDPRESS_APPLICATION_PASSWORD=${WORDPRESS_APPLICATION_PASSWORD}
command: ["npx", "-y", "@wordpress/mcp-adapter"]
profiles:
- ops
# ==========================================
# Communication & Collaboration (3 servers)
# ==========================================
# Discourse MCP - Forum integration
discourse-mcp:
image: kneldevstack-aimiddleware-discourse-mcp
build:
context: ./vendor/discourse-mcp
dockerfile: ../../dockerfiles/discourse-mcp/Dockerfile
container_name: kneldevstack-aimiddleware-discourse-mcp
restart: unless-stopped
environment:
- DISCOURSE_URL=${DISCOURSE_URL}
- DISCOURSE_API_KEY=${DISCOURSE_API_KEY}
- DISCOURSE_API_USERNAME=${DISCOURSE_API_USERNAME}
profiles:
- ops
# IMAP MCP - Email processing
imap-mcp:
image: kneldevstack-aimiddleware-imap-mcp
build:
context: ./vendor/imap-mcp
dockerfile: Dockerfile
container_name: kneldevstack-aimiddleware-imap-mcp
restart: unless-stopped
environment:
- PYTHONUNBUFFERED=1
- IMAP_SERVER=${IMAP_SERVER}
- IMAP_PORT=${IMAP_PORT:-993}
- IMAP_USERNAME=${IMAP_USERNAME}
- IMAP_PASSWORD=${IMAP_PASSWORD}
command: ["uvx", "imap-mcp"]
profiles:
- ops
# Postiz MCP - Social media management
postizz-mcp:
image: kneldevstack-aimiddleware-postizz-mcp
build:
context: ./vendor/postizz-MCP
dockerfile: Dockerfile
container_name: kneldevstack-aimiddleware-postizz-mcp
restart: unless-stopped
environment:
- POSTIZ_API_KEY=${POSTIZ_API_KEY}
- POSTIZ_URL=${POSTIZ_URL}
profiles:
- ops
# ==========================================
# Analytics & Security (2 servers)
# ==========================================
# Matomo MCP Client
matomo-mcp:
image: kneldevstack-aimiddleware-matomo-mcp
build:
context: ./vendor/matomo-mcp-client
dockerfile: Dockerfile
container_name: kneldevstack-aimiddleware-matomo-mcp
restart: unless-stopped
environment:
- MATOMO_URL=${MATOMO_URL}
- MATOMO_TOKEN=${MATOMO_TOKEN}
profiles:
- ops
# Bitwarden MCP - Password vault
bitwarden-mcp:
image: kneldevstack-aimiddleware-bitwarden-mcp
build:
context: ./vendor/mcp-server
dockerfile: Dockerfile
container_name: kneldevstack-aimiddleware-bitwarden-mcp
restart: unless-stopped
environment:
- BITWARDEN_CLIENT_ID=${BITWARDEN_CLIENT_ID}
- BITWARDEN_CLIENT_SECRET=${BITWARDEN_CLIENT_SECRET}
- BITWARDEN_PASSWORD=${BITWARDEN_PASSWORD}
- BITWARDEN_SERVER_URL=${BITWARDEN_SERVER_URL:-https://vault.bitwarden.com}
command: ["npx", "-y", "@bitwarden/mcp-server"]
profiles:
- ops
# ==========================================
# Productivity & Automation (6 servers)
# ==========================================
# GIMP MCP - Image editing
gimp-mcp:
image: kneldevstack-aimiddleware-gimp-mcp
build:
context: ./vendor/gimp-mcp
dockerfile: Dockerfile
container_name: kneldevstack-aimiddleware-gimp-mcp
restart: unless-stopped
environment:
- PYTHONUNBUFFERED=1
command: ["uvx", "gimp-mcp"]
profiles:
- dev
# Snipe-IT MCP - Asset inventory
snipeit-mcp:
image: kneldevstack-aimiddleware-snipeit-mcp
build:
context: ./vendor/snipeit-mcp
dockerfile: Dockerfile
container_name: kneldevstack-aimiddleware-snipeit-mcp
restart: unless-stopped
environment:
- PYTHONUNBUFFERED=1
- SNIPEIT_URL=${SNIPEIT_URL}
- SNIPEIT_TOKEN=${SNIPEIT_TOKEN}
command: ["uvx", "snipeit-mcp"]
profiles:
- ops
# Redmine MCP - Project management
mcp-redmine:
image: kneldevstack-aimiddleware-mcp-redmine
build:
context: ./vendor/mcp-redmine
dockerfile: Dockerfile
container_name: kneldevstack-aimiddleware-mcp-redmine
restart: unless-stopped
environment:
- PYTHONUNBUFFERED=1
- REDMINE_URL=${REDMINE_URL}
- REDMINE_API_KEY=${REDMINE_API_KEY}
command: ["uvx", "mcp-redmine"]
profiles:
- ops
# Ansible MCP - IT automation
mcp-ansible:
image: kneldevstack-aimiddleware-mcp-ansible
build:
context: ./vendor/mcp-ansible
dockerfile: Dockerfile
container_name: kneldevstack-aimiddleware-mcp-ansible
restart: unless-stopped
environment:
- PYTHONUNBUFFERED=1
volumes:
- ./ansible-playbooks:/playbooks:ro
- /var/run/docker.sock:/var/run/docker.sock
command: ["uvx", "mcp-ansible"]
profiles:
- ops
# Elasticsearch MCP
elasticsearch-mcp:
image: kneldevstack-aimiddleware-elasticsearch-mcp
build:
context: ./vendor/mcp-server-elasticsearch
dockerfile: Dockerfile
container_name: kneldevstack-aimiddleware-elasticsearch-mcp
restart: unless-stopped
environment:
- ELASTICSEARCH_URL=${ELASTICSEARCH_URL:-http://localhost:9200}
- ELASTICSEARCH_USERNAME=${ELASTICSEARCH_USERNAME}
- ELASTICSEARCH_PASSWORD=${ELASTICSEARCH_PASSWORD}
ports:
- "8084:8080"
profiles:
- ops
# Audiobook MCP Server
audiobook-mcp:
image: kneldevstack-aimiddleware-audiobook-mcp
build:
context: ./vendor/audiobook-mcp-server
dockerfile: Dockerfile
container_name: kneldevstack-aimiddleware-audiobook-mcp
restart: unless-stopped
environment:
- AUDIOBOOK_LIBRARY_PATH=${AUDIOBOOK_LIBRARY_PATH:-/audiobooks}
volumes:
- ${AUDIOBOOK_LIBRARY_PATH:-/audiobooks}:/audiobooks
command: ["npx", "-y", "audiobook-mcp-server"]
profiles:
- dev
# ==========================================
# Additional Tools (3 servers)
# ==========================================
# Draw.io MCP Server
drawio-mcp:
image: kneldevstack-aimiddleware-drawio-mcp
build:
context: ./vendor/drawio-mcp-server
dockerfile: Dockerfile
container_name: kneldevstack-aimiddleware-drawio-mcp
restart: unless-stopped
environment:
- DRAWIO_URL=${DRAWIO_URL:-https://app.diagrams.net}
command: ["npx", "-y", "drawio-mcp-server"]
profiles:
- dev
# Docker Language Server
docker-language-server:
image: kneldevstack-aimiddleware-docker-language-server
build:
context: ./vendor/docker-language-server
dockerfile: ../../dockerfiles/docker-language-server/Dockerfile
container_name: kneldevstack-aimiddleware-docker-language-server
restart: "no"
profiles:
- dev
# Marksman LSP - Markdown language server
marksman:
image: kneldevstack-aimiddleware-marksman
build:
context: ./vendor/marksman
dockerfile: ../../dockerfiles/marksman/Dockerfile
container_name: kneldevstack-aimiddleware-marksman
restart: "no"
profiles:
- dev
# ==========================================
# Design Tools (Added Later)
# ==========================================
# Penpot MCP - Design collaboration platform
penpot-mcp:
image: kneldevstack-aimiddleware-penpot-mcp
build:
context: ./vendor/penpot-mcp
dockerfile: Dockerfile
container_name: kneldevstack-aimiddleware-penpot-mcp
restart: unless-stopped
environment:
- PENPOT_URL=${PENPOT_URL:-https://design.penpot.app}
- PENPOT_TOKEN=${PENPOT_TOKEN}
profiles:
- dev