# Dev stack = the production stack (docker-compose.yml) + this overlay: the same images, entrypoints, env contract, # volumes, Caddy routing and supervisor as a real install. This file only adds loopback-only ports and a debugger. # Always run it through docker/dev.env, which names the project mdmesh-dev, lists both compose files and holds the # dev-only values: # docker compose --env-file docker/dev.env up -d --build # build + start # scripts/dev-seed.sh # first run: seed the DB (login admin / admin) # Console http://localhost:8088 · API http://localhost:8080 · Postgres localhost:5432 · JDWP localhost:5005 # A port is taken? Export DEV_WEB_PORT / DEV_API_PORT / DEV_PG_PORT / DEV_DEBUG_PORT first. The full loop: docs/DEV.md. # Guard: without docker/dev.env, `up` and `config` stop here. That file pins the project name; without it, the .env # that setup.sh writes (COMPOSE_PROJECT_NAME=mdmesh) would point this overlay at a production stack's containers and # database volume. The guard does NOT stop `down -v`, `stop`, `rm`, `exec`, `logs` or `ps` (compose does not # interpolate this for them), so those act on whatever project .env names: always pass --env-file docker/dev.env. x-dev-env: ${MDMESH_DEV:?run the dev stack with --env-file docker/dev.env (see docs/DEV.md)} services: postgres: ports: - "127.0.0.1:${DEV_PG_PORT:-5432}:5432" server: environment: # IDE attach; suspend=n so boot never waits for a debugger. catalina.sh reads CATALINA_OPTS. CATALINA_OPTS: "-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=*:5005" ports: - "127.0.0.1:${DEV_API_PORT:-8080}:8080" # direct API: scripts/agent-v1-e2e.sh, the fast WAR loop - "127.0.0.1:${DEV_DEBUG_PORT:-5005}:5005" caddy: ports: - "127.0.0.1:${DEV_WEB_PORT:-8088}:80" # the console as users get it (SPA + /rest + /update + /recovery)