# OpenProject MCP Companion - Local Development & Testing Stack # Target: OpenProject 17 # Usage: docker compose up -d networks: openproject-net: driver: bridge volumes: pgdata: opdata: x-op-restart-policy: &restart_policy restart: unless-stopped x-op-image: &image image: openproject/openproject:${TAG:-17-slim} x-op-app: &app <<: [*image, *restart_policy] environment: OPENPROJECT_HTTPS: "${OPENPROJECT_HTTPS:-false}" OPENPROJECT_HOST__NAME: "${OPENPROJECT_HOST__NAME:-localhost:8080}" OPENPROJECT_ADDITIONAL__HOST__NAMES: "${OPENPROJECT_ADDITIONAL__HOST__NAMES:-web}" OPENPROJECT_HSTS: "false" OPENPROJECT_RAILS__CACHE__STORE: "memcache" RAILS_CACHE_STORE: "memcache" OPENPROJECT_CACHE__MEMCACHE__SERVER: "cache:11211" DATABASE_URL: "${DATABASE_URL:-postgres://postgres:p4ssw0rd@db/openproject?pool=20&encoding=unicode&reconnect=true}" RAILS_MIN_THREADS: ${RAILS_MIN_THREADS:-4} RAILS_MAX_THREADS: ${RAILS_MAX_THREADS:-16} SECRET_KEY_BASE: "${SECRET_KEY_BASE:-openproject-secret-key-base-for-local-testing-at-least-64-characters-long}" IMAP_ENABLED: "false" OPENPROJECT_ENABLE__INTERNAL__ASSETS__SERVER: "true" volumes: - opdata:/var/openproject/assets - ./scripts:/scripts:ro networks: - openproject-net services: db: image: postgres:${POSTGRES_VERSION:-17} <<: *restart_policy stop_grace_period: "3s" volumes: - pgdata:/var/lib/postgresql/data environment: POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:-p4ssw0rd} POSTGRES_DB: openproject healthcheck: test: ["CMD-SHELL", "pg_isready -U postgres -d openproject"] interval: 5s timeout: 5s retries: 5 networks: - openproject-net cache: image: memcached:alpine <<: *restart_policy networks: - openproject-net seeder: <<: *app command: "./docker/prod/seeder" restart: on-failure depends_on: db: condition: service_healthy cache: condition: service_started web: <<: *app command: "./docker/prod/web" ports: - "${PORT:-8080}:8080" depends_on: db: condition: service_healthy cache: condition: service_started seeder: condition: service_completed_successfully healthcheck: test: ["CMD", "curl", "-f", "http://localhost:8080/health_checks/default"] interval: 10s timeout: 5s retries: 6 start_period: 45s worker: <<: *app command: "./docker/prod/worker" depends_on: db: condition: service_healthy cache: condition: service_started seeder: condition: service_completed_successfully