# Live-code overlay. Mounts the source folders into the running containers, so what # executes is what is on disk on the host — edit, save, uvicorn reloads. # # docker compose -f docker-compose.yml -f docker-compose.dev.yml up # # The CV attachments mount from the base file still applies: compose merges volumes # by target path, and /app/inbox/decoded_attachments is nested under the /app mount, # so the daemon mounts the parent first and the attachments folder on top. # # Two mounts per Python service, not one: /app is the backend tree and /app/app is the # bulk-ats engine that backend/job/candidate imports. Mounting only ./backend over # /app would hide the engine baked into the image and every worker would fail on # import. # # The frontend stays as the built nginx image — a Vite dev server wants node_modules # on the mount, which is slow and fragile across a Windows bind mount. Run # `npm run dev` on the host for the frontend loop. services: backend-api: command: ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "8000", "--reload"] volumes: - ./backend:/app - ./app:/app/app ats-engine: command: [ "uvicorn", "app.main:create_app", "--factory", "--host", "0.0.0.0", "--port", "8100", "--reload", ] volumes: - ./app:/srv/app taskiq-worker: volumes: - ./backend:/app - ./app:/app/app taskiq-scheduler: volumes: - ./backend:/app - ./app:/app/app taskiq-cv-worker: volumes: - ./backend:/app - ./app:/app/app taskiq-cv-scheduler: volumes: - ./backend:/app - ./app:/app/app