# CI isolation overrides — layered on top of compose.yml + compose.dev.yml by # the Playwright shards and the compose smoke job in .gitea/workflows/. # # A self-hosted runner can put several jobs on the same host. A per-job # COMPOSE_PROJECT_NAME keeps their containers, networks and volumes apart, but # it does not cover the two things that are global to the Docker daemon: # # 1. `container_name` ignores the project name, so a second job fails with # "the container name /fluksio-db is already in use". # 2. Published host ports are first come, first served. # # Neither is needed in CI: everything reaches everything else by compose # service name on the project network. services: proxy: ports: !reset [] db: container_name: !reset null redis: container_name: !reset null adminer: container_name: !reset null ports: !reset [] mailcatcher: ports: !reset [] backend: container_name: !reset null ports: !reset [] # compose.dev.yml mounts the source over the image's own copy, so `--reload` # means something in a detached local stack. Here the daemon is a sibling of # the job rather than its host: it resolves that path against its own # filesystem, finds nothing, and mounts an empty directory over the package. # That is how the container came to report "Path does not exist # fluksio/main.py" for a file the image plainly ships. Back to what # compose.yml declares — CI wants the built image anyway. volumes: !override - app-flow-data:/data frontend: container_name: !reset null ports: !reset [] # Baked at build time. compose.dev.yml bakes http://localhost:8000, which # resolves to the playwright container itself; the browser has to reach the # API by service name on the project network instead. build: args: - VITE_API_URL=http://backend:8000 # Image tags are daemon-global too, and this one no longer holds the same # bytes as the smoke job's: without a per-job tag the two jobs overwrite # each other's `fluksio-frontend:latest` and the SPA calls the wrong API. image: '${DOCKER_IMAGE_FRONTEND?Variable not set}:${COMPOSE_PROJECT_NAME:-ci}' playwright: ports: !reset [] # Same reason as backend above. These two exist so a local run leaves its # report on the host; under a sibling daemon they are empty directories the # report is written into and never seen again, which is what "No files were # found with the provided path: frontend/blob-report" was. The job copies # the report out of the container instead. volumes: !reset [] # frontend/playwright.config.ts defaults baseURL to http://app.localhost, # which is right for a local run against the integrated stack but resolves # to 127.0.0.1 in here. In CI the nginx `frontend` service serves the SPA. # This origin must stay in BACKEND_CORS_ORIGINS (.env.example). environment: - PLAYWRIGHT_BASE_URL=http://frontend