services: db: image: postgis/postgis:16-3.4 environment: POSTGRES_DB: ${POSTGRES_DB:-roadfare} POSTGRES_USER: ${POSTGRES_USER:-roadfare} POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:-roadfare} volumes: - pgdata:/var/lib/postgresql/data - ./infra/docker/postgres/init-postgis.sql:/docker-entrypoint-initdb.d/init-postgis.sql:ro ports: ["5432:5432"] healthcheck: # -h 127.0.0.1 forces a TCP probe — see .github/workflows/backend-ci.yml for why # (postgis/postgis's temporary init-script server only listens on the Unix # socket, so a bare pg_isready reports healthy before the real server, and # backend/worker/beat all start racing that same restart via depends_on). test: ["CMD-SHELL", "pg_isready -h 127.0.0.1 -U ${POSTGRES_USER:-roadfare}"] interval: 5s retries: 10 redis: image: redis:7-alpine ports: ["6379:6379"] healthcheck: test: ["CMD", "redis-cli", "ping"] interval: 5s retries: 10 backend: build: ./backend command: python manage.py runserver 0.0.0.0:8000 env_file: [.env] environment: POSTGRES_HOST: db DATABASE_URL: postgis://${POSTGRES_USER:-roadfare}:${POSTGRES_PASSWORD:-roadfare}@db:5432/${POSTGRES_DB:-roadfare} REDIS_URL: redis://redis:6379/0 CELERY_BROKER_URL: redis://redis:6379/0 CELERY_RESULT_BACKEND: redis://redis:6379/1 volumes: ["./backend:/app"] ports: ["8000:8000"] depends_on: db: {condition: service_healthy} redis: {condition: service_healthy} worker: build: ./backend command: celery -A config worker -l info env_file: [.env] environment: POSTGRES_HOST: db DATABASE_URL: postgis://${POSTGRES_USER:-roadfare}:${POSTGRES_PASSWORD:-roadfare}@db:5432/${POSTGRES_DB:-roadfare} REDIS_URL: redis://redis:6379/0 CELERY_BROKER_URL: redis://redis:6379/0 CELERY_RESULT_BACKEND: redis://redis:6379/1 volumes: ["./backend:/app"] depends_on: [backend] beat: build: ./backend command: celery -A config beat -l info env_file: [.env] environment: POSTGRES_HOST: db DATABASE_URL: postgis://${POSTGRES_USER:-roadfare}:${POSTGRES_PASSWORD:-roadfare}@db:5432/${POSTGRES_DB:-roadfare} REDIS_URL: redis://redis:6379/0 CELERY_BROKER_URL: redis://redis:6379/0 CELERY_RESULT_BACKEND: redis://redis:6379/1 volumes: ["./backend:/app"] depends_on: [backend] frontend: build: ./frontend command: npm run dev env_file: [.env] volumes: ["./frontend:/app", "/app/node_modules", "/app/.next"] ports: ["3000:3000"] depends_on: [backend] volumes: pgdata: