version: "3.4"

services:
  db:
    # use lowest supported version for dev to check compatibility
    image: postgres:${POSTGRES_IMAGE_VERSION:-12}
    ports:
      - "${HOST_PUBLISH_IP:-127.0.0.1}:${POSTGRES_PORT:-5432}:5432"
    command: "${POSTGRES_DEV_EXTRA_ARGS}"

  redis:
    ports:
      - "${HOST_PUBLISH_IP:-127.0.0.1}:${DEBUG_REDIS_PORT:-6379}:6379"

  # Override with the dev caddy file which switches Caddy to only be the media file
  # server in the dev env. Devs will instead directly connect to the backend and
  # web frontend services.
  caddy:
    volumes:
      - $PWD/Caddyfile.dev:/etc/caddy/Caddyfile

  backend:
    image: baserow_backend_dev:latest
    environment:
      - BASEROW_BACKEND_DEBUGGER_ENABLED=${BASEROW_BACKEND_DEBUGGER_ENABLED:-True}
      - BASEROW_BACKEND_DEBUGGER_PORT=${BASEROW_BACKEND_DEBUGGER_PORT:-5678}
      - BASEROW_DANGEROUS_SILKY_ANALYZE_QUERIES
      - OTEL_EXPORTER_OTLP_ENDPOINT=http://otel-collector:4318
    build:
      dockerfile: ./backend/Dockerfile
      context: .
      target: dev
      args:
        # We allow configuring the UID/GID here so you can run as the dev's actual user
        # reducing the chance the containers screw up the bind mounted folders.
        UID: $UID
        GID: $GID
    ports:
      - "${HOST_PUBLISH_IP:-127.0.0.1}:8000:8000"
      - "${HOST_PUBLISH_IP:-127.0.0.1}:${BASEROW_BACKEND_DEBUGGER_PORT:-5678}:${BASEROW_BACKEND_DEBUGGER_PORT:-5678}"
    volumes:
      - ./backend:/baserow/backend
      - ./premium/backend/:/baserow/premium/backend
      - ./enterprise/backend/:/baserow/enterprise/backend
      - ./deploy/plugins/install_plugin.sh:/baserow/plugins/install_plugin.sh
      - ./tests:/baserow/tests
    # Open stdin and tty so when attaching key input works as expected.
    stdin_open: true
    tty: true
    depends_on:
      - otel-collector

  web-frontend:
    image: baserow_web-frontend_dev:latest
    build:
      dockerfile: ./web-frontend/Dockerfile
      context: .
      target: dev
      args:
        # We allow configuring the UID/GID here so you can run as the dev's actual user
        # reducing the chance the containers screw up the bind mounted folders.
        UID: $UID
        GID: $GID
    ports:
      - "${HOST_PUBLISH_IP:-127.0.0.1}:3000:3000"
    volumes:
      - ./web-frontend:/baserow/web-frontend
      # Override the above mounts for node_modules so we use the node_modules built
      # directly into the image instead of whatever is on your local filesystem.
      - /baserow/web-frontend/node_modules
      - ./premium/web-frontend/:/baserow/premium/web-frontend
      - ./enterprise/web-frontend/:/baserow/enterprise/web-frontend
      - ./tests/:/baserow/tests
    # Open stdin and tty so when attaching key input works as expected.
    stdin_open: true
    tty: true

  web-frontend-storybook:
    image: baserow_web-frontend_dev:latest
    restart: unless-stopped
    environment:
      FEATURE_FLAGS:
    networks:
      local:
    build:
      dockerfile: ./web-frontend/Dockerfile
      context: .
      target: dev
      args:
        # We allow configuring the UID/GID here so you can run as the dev's actual user
        # reducing the chance the containers screw up the bind mounted folders.
        UID: $UID
        GID: $GID
    command: "storybook-dev"
    ports:
      - "${HOST_PUBLISH_IP:-127.0.0.1}:6006:6006"
    volumes:
      - ./web-frontend:/baserow/web-frontend
      # Override the above mounts for node_modules so we use the node_modules built
      # directly into the image instead of whatever is on your local filesystem.
      - /baserow/web-frontend/node_modules
      - ./premium/web-frontend/:/baserow/premium/web-frontend
      - ./enterprise/web-frontend/:/baserow/enterprise/web-frontend
      - ./tests/:/baserow/tests
    # Open stdin and tty so when attaching key input works as expected.
    stdin_open: true
    tty: true

  celery:
    image: baserow_backend_dev:latest
    build:
      dockerfile: ./backend/Dockerfile
      context: .
      target: dev
      args:
        # We allow configuring the UID/GID here so you can run as the dev's actual user
        # reducing the chance the containers screw up the bind mounted folders.
        UID: $UID
        GID: $GID
    command: "watch-py celery-worker"
    environment:
      - OTEL_EXPORTER_OTLP_ENDPOINT=http://otel-collector:4318
      - BASEROW_DANGEROUS_SILKY_ANALYZE_QUERIES
    volumes:
      - ./backend:/baserow/backend
      - ./premium/backend/:/baserow/premium/backend
      - ./enterprise/backend/:/baserow/enterprise/backend
    # Open stdin and tty so when attaching key input works as expected.
    stdin_open: true
    tty: true
    depends_on:
      - otel-collector

  celery-export-worker:
    image: baserow_backend_dev:latest
    environment:
      - OTEL_EXPORTER_OTLP_ENDPOINT=http://otel-collector:4318
      - BASEROW_DANGEROUS_SILKY_ANALYZE_QUERIES
    build:
      dockerfile: ./backend/Dockerfile
      context: .
      target: dev
      args:
        # We allow configuring the UID/GID here so you can run as the dev's actual user
        # reducing the chance the containers screw up the bind mounted folders.
        UID: $UID
        GID: $GID
    command: "watch-py celery-exportworker"
    volumes:
      - ./backend:/baserow/backend
      - ./premium/backend/:/baserow/premium/backend
      - ./enterprise/backend/:/baserow/enterprise/backend
    # Open stdin and tty so when attaching key input works as expected.
    stdin_open: true
    tty: true
    depends_on:
      - otel-collector

  celery-beat-worker:
    image: baserow_backend_dev:latest
    environment:
      - OTEL_EXPORTER_OTLP_ENDPOINT=http://otel-collector:4318
    build:
      dockerfile: ./backend/Dockerfile
      context: .
      target: dev
      args:
        # We allow configuring the UID/GID here so you can run as the dev's actual user
        # reducing the chance the containers screw up the bind mounted folders.
        UID: $UID
        GID: $GID
    command: "watch-py celery-beat"
    volumes:
      - ./backend:/baserow/backend
      - ./premium/backend/:/baserow/premium/backend
      - ./enterprise/backend/:/baserow/enterprise/backend
    # Open stdin and tty so when attaching key input works as expected.
    stdin_open: true
    tty: true

  celery-flower:
    image: baserow_backend_dev:latest
    build:
      dockerfile: ./backend/Dockerfile
      context: .
      target: dev
      args:
        # We allow configuring the UID/GID here so you can run as the dev's actual user
        # reducing the chance the containers screw up the bind mounted folders.
        UID: $UID
        GID: $GID
    restart: unless-stopped
    stop_signal: SIGQUIT
    environment:
      REDIS_HOST:
      REDIS_PORT:
      REDIS_PROTOCOL:
      REDIS_URL:
      REDIS_USER:
      REDIS_PASSWORD: ${REDIS_PASSWORD:?}
    depends_on:
      - backend
    volumes:
      - media:/baserow/media
    ports:
      - "5555:5555" # web ui
    command: "celery-flower"
    networks:
      local:
    # Open stdin and tty so when attaching key input works as expected.
    stdin_open: true
    tty: true

  mjml-email-compiler:
    build:
      target: dev
      args:
        # We allow configuring the UID/GID here so you can run as the dev's actual user
        # reducing the chance the containers screw up the bind mounted folders.
        UID: $UID
        GID: $GID
      context: .
      dockerfile: ./web-frontend/Dockerfile
    image: baserow_web-frontend:latest
    command: "bash -c 'cd /baserow/backend/email_compiler/ && yarn install && yarn run watch'"
    volumes:
      - ./backend:/baserow/backend
    # Open stdin and tty so when attaching key input works as expected.
    stdin_open: true
    tty: true

  mailhog:
    image: mailhog/mailhog
    logging:
      driver: "none" # disable saving logs
    ports:
      - "8025:8025" # web ui
    networks:
      local:

  # When switching between dev and local the media files in the media volume will be
  # owned by different users. Ensure that we chown them to the user appropriate for the
  # environment here.
  volume-permissions-fixer:
    image: bash:4.4
    command: chown ${UID:-1000}:${GID:-1000} -R /baserow/media
    volumes:
      - media:/baserow/media
      - caddy_config:/config
      - caddy_data:/data
    networks:
      local:

  otel-collector:
    image: otel/opentelemetry-collector:0.106.1
    command: ["--config=/etc/otel-collector-config.yaml"]
    environment:
      HONEYCOMB_API_KEY:
      HONEYCOMB_METRICS_DATASET: baserow-dev-metrics
    volumes:
      - $PWD/deploy/otel/otel-collector-config.yaml:/etc/otel-collector-config.yaml
    networks:
      local:
    ports:
      - "4318:4318"