services: postgres: image: postgres:16-alpine container_name: abletonmcp-postgres restart: unless-stopped environment: POSTGRES_USER: ${POSTGRES_USER:-postgres} POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:-changeme} POSTGRES_DB: ${POSTGRES_BOOTSTRAP_DB:-postgres} PGDATA: /var/lib/postgresql/data/pgdata GITEA_DB_NAME: ${GITEA_DB_NAME:-gitea} N8N_DB_NAME: ${N8N_DB_NAME:-n8n} volumes: - postgres-data:/var/lib/postgresql/data - ./initdb:/docker-entrypoint-initdb.d:ro ports: - "${POSTGRES_PORT:-5432}:5432" healthcheck: test: ["CMD-SHELL", "pg_isready -U ${POSTGRES_USER:-postgres} -d ${POSTGRES_BOOTSTRAP_DB:-postgres}"] interval: 10s timeout: 5s retries: 5 start_period: 20s networks: - internal redis: image: redis:7-alpine container_name: abletonmcp-redis restart: unless-stopped command: - redis-server - --requirepass - ${REDIS_PASSWORD:-changeme} - --appendonly - "yes" - --save - "60" - "1000" volumes: - redis-data:/data ports: - "${REDIS_PORT:-6379}:6379" healthcheck: test: ["CMD-SHELL", "redis-cli -a ${REDIS_PASSWORD:-changeme} ping | grep -q PONG"] interval: 10s timeout: 5s retries: 5 start_period: 10s networks: - internal gitea: image: gitea/gitea:1.21-rootless container_name: abletonmcp-gitea restart: unless-stopped environment: USER_UID: 1000 USER_GID: 1000 GITEA__database__DB_TYPE: postgres GITEA__database__HOST: postgres:5432 GITEA__database__NAME: ${GITEA_DB_NAME:-gitea} GITEA__database__USER: ${POSTGRES_USER:-postgres} GITEA__database__PASSWD: ${POSTGRES_PASSWORD:-changeme} GITEA__server__DOMAIN: ${GITEA_DOMAIN:-localhost} GITEA__server__ROOT_URL: ${GITEA_ROOT_URL:-http://localhost:3000} GITEA__server__HTTP_PORT: 3000 GITEA__server__SSH_DOMAIN: ${GITEA_SSH_DOMAIN:-localhost} GITEA__server__SSH_PORT: ${GITEA_SSH_PORT:-222} GITEA__server__START_SSH_SERVER: "true" GITEA__server__SSH_LISTEN_PORT: 222 GITEA__security__INSTALL_LOCK: ${GITEA_SECURITY_INSTALL_LOCK:-true} GITEA__service__DISABLE_REGISTRATION: "true" GITEA__server__OFFLINE_MODE: ${GITEA_OFFLINE_MODE:-true} volumes: - gitea-data:/var/lib/gitea - gitea-config:/etc/gitea - gitea-logs:/var/log/gitea ports: - "${GITEA_HTTP_PORT:-3000}:3000" - "${GITEA_SSH_PORT:-222}:222" healthcheck: test: ["CMD-SHELL", "wget -q --spider http://localhost:3000/api/healthz || exit 1"] interval: 15s timeout: 5s retries: 10 start_period: 45s depends_on: postgres: condition: service_healthy networks: - internal n8n: image: n8nio/n8n:latest container_name: abletonmcp-n8n restart: unless-stopped environment: DB_TYPE: postgresdb DB_POSTGRESDB_HOST: postgres DB_POSTGRESDB_PORT: 5432 DB_POSTGRESDB_DATABASE: ${N8N_DB_NAME:-n8n} DB_POSTGRESDB_USER: ${POSTGRES_USER:-postgres} DB_POSTGRESDB_PASSWORD: ${POSTGRES_PASSWORD:-changeme} N8N_PORT: 5678 N8N_PROTOCOL: http N8N_HOST: ${N8N_HOST:-localhost} N8N_PATH: ${N8N_PATH:-/} N8N_ENCRYPTION_KEY: ${N8N_ENCRYPTION_KEY:-changeme-change-this} N8N_LOG_LEVEL: ${N8N_LOG_LEVEL:-info} N8N_EXECUTIONS_MODE: ${N8N_EXECUTIONS_MODE:-regular} N8N_BASIC_AUTH_ACTIVE: ${N8N_BASIC_AUTH_ACTIVE:-true} N8N_BASIC_AUTH_USER: ${N8N_BASIC_AUTH_USER:-admin} N8N_BASIC_AUTH_PASSWORD: ${N8N_BASIC_AUTH_PASSWORD:-changeme} N8N_COOKIE_POLICY: ${N8N_COOKIE_POLICY:-lax} N8N_HOST_ALLOW_LIST: ${N8N_HOST_ALLOW_LIST:-localhost,127.0.0.1} N8N_WEBHOOK_URL: ${N8N_WEBHOOK_URL:-http://localhost:5678/} N8N_EDITOR_BASE_URL: ${N8N_EDITOR_BASE_URL:-http://localhost:5678} GENERIC_TIMEZONE: ${TZ:-UTC} TZ: ${TZ:-UTC} N8N_DIAGNOSTICS_ENABLED: ${N8N_DIAGNOSTICS_ENABLED:-false} N8N_VERSION_NOTIFICATIONS_ENABLED: ${N8N_VERSION_NOTIFICATIONS_ENABLED:-false} volumes: - n8n-data:/home/node/.n8n - n8n-logs:/home/node/.npm/_logs - ${PROJECT_PATH:-/mnt/c/ProgramData/Ableton/Live 12 Suite/Resources/MIDI Remote Scripts/AbletonMCP_AI}:/project:rw - ${PROJECT_PATH:-/mnt/c/ProgramData/Ableton/Live 12 Suite/Resources/MIDI Remote Scripts/AbletonMCP_AI}/automation/workflows:/workflows:ro ports: - "${N8N_PORT:-5678}:5678" healthcheck: test: ["CMD-SHELL", "wget -q --spider http://localhost:5678/healthz || exit 1"] interval: 15s timeout: 5s retries: 10 start_period: 45s depends_on: postgres: condition: service_healthy redis: condition: service_healthy networks: - internal networks: internal: name: abletonmcp-network driver: bridge volumes: postgres-data: name: abletonmcp-postgres-data gitea-data: name: abletonmcp-gitea-data gitea-config: name: abletonmcp-gitea-config gitea-logs: name: abletonmcp-gitea-logs redis-data: name: abletonmcp-redis-data n8n-data: name: abletonmcp-n8n-data n8n-logs: name: abletonmcp-n8n-logs