version: "3.3"

services:
  proxy: 
    ports:
      - "80:80"
      - "8090:8080"
    command:
      # Enable Docker in Traefik, so that it reads labels from Docker services
      - --providers.docker
      # Add a constraint to only use services with the label for this stack
      # from the env var TRAEFIK_TAG
      - --providers.docker.constraints=Label(`traefik.constraint-label-stack`, `${TRAEFIK_TAG?Variable not set}`)
      # Do not expose all Docker services, only the ones explicitly exposed
      - --providers.docker.exposedbydefault=false
      # Disable Docker Swarm mode for local development
      # - --providers.docker.swarmmode
      # Enable the access log, with HTTP requests
      - --accesslog
      # Enable the Traefik log, for configurations and errors
      - --log
      # Enable the Dashboard and API
      - --api
      # Enable the Dashboard and API in insecure mode for local development
      - --api.insecure=true
    labels:
      - traefik.enable=true
      - traefik.http.routers.${STACK_NAME?Variable not set}-traefik-public-http.rule=Host(`${DOMAIN?Variable not set}`)
      - traefik.http.services.${STACK_NAME?Variable not set}-traefik-public.loadbalancer.server.port=80

  postgres:
    environment:
      POSTGRES_HOST_AUTH_METHOD: trust # for postgres user access w/o password. Obvioulsy not safe but allows easy elevated debugging.  
    ports:
      - ${DEV_POSTGRES_PORT:-63432}:5432

  pgadmin:
    ports:
      - "5050:5050"
        #    depends_on:
        #      - postgres 
        #
  flower:
    ports:
      - "5555:5555"

  eth:
    restart: unless-stopped
    ports:
      - ${DEV_ETH_PORT_HTTP:-63545}:8545
      - ${DEV_ETH_PORT_WS:-63546}:8546
      - 30303
    labels:
      - traefik.enable=true
      - traefik.constraint-label-stack=${TRAEFIK_TAG?Variable not set}
      - traefik.http.routers.${STACK_NAME?Variable not set}-bloxberg-http.rule=PathPrefix(`/`)
      - traefik.http.services.${STACK_NAME?Variable not set}-bloxberg.loadbalancer.server.port=8545

  redis:
    ports:
      - ${DEV_REDIS_PORT:-63379}:6379
    command: "--loglevel verbose"

  cicada:
    build:
      args:
        BUILD_ENV: dev
    labels:
      - traefik.enable=true
      - traefik.constraint-label-stack=${TRAEFIK_TAG?Variable not set}
      - traefik.http.routers.${STACK_NAME?Variable not set}-frontend-http.rule=PathPrefix(`/`)
      - traefik.http.services.${STACK_NAME?Variable not set}-frontend.loadbalancer.server.port=80
        
        #contract-migration:
        #  depends_on:
        #    - eth
        #    - postgres
        #    - redis
        #    - cic-eth-tasker

        #cic-cache-tracker:
        #  depends_on:
        #    - redis
        #    - postgres
        #    - eth

        #cic-cache-tasker:
        #  depends_on:
        #    - redis
        #    - postgres
        #    - eth

  cic-cache-server:
    ports:
      - "63313:8000"
        #depends_on:
        #  - postgres
    labels:
      - traefik.enable=true
      - traefik.constraint-label-stack=${TRAEFIK_TAG?Variable not set}
      - traefik.http.routers.${STACK_NAME?Variable not set}-cache-http.rule=PathPrefix(`/`)
      - traefik.http.services.${STACK_NAME?Variable not set}-cache.loadbalancer.server.port=63313

        #cic-eth-tasker:
        #  depends_on:
        #    - eth
        #    - postgres
        #    - redis

        #cic-eth-tracker:
        #  depends_on:
        #    - eth
        #    - postgres
        #    - redis

        #cic-eth-dispatcher:
        #  depends_on:
        #    - eth
        #    - postgres
        #    - redis

        #cic-eth-retrier:
        #  depends_on:
        #    - eth
        #    - postgres
        #    - redis

        #cic-notify-tasker:
        #  depends_on:
        #    - postgres
        #    - redis

  cic-meta-server:
    ports:
      - ${HTTP_PORT_CIC_META:-63380}:8000
        #depends_on:
        #  - postgres
    labels:
      - traefik.enable=true
      - traefik.constraint-label-stack=${TRAEFIK_TAG?Variable not set}
      - traefik.http.routers.${STACK_NAME?Variable not set}-meta-http.rule=PathPrefix(`/`)
      - traefik.http.services.${STACK_NAME?Variable not set}-meta.loadbalancer.server.port=63380

  cic-user-ussd-server:
    ports:
      - ${HTTP_PORT_CIC_USER_USSD_SERVER:-63315}:9000
        #depends_on:
        #  - postgres
        #  - redis
    labels:
      - traefik.enable=true
      - traefik.constraint-label-stack=${TRAEFIK_TAG?Variable not set}
      - traefik.http.routers.${STACK_NAME?Variable not set}-ussd-http.rule=PathPrefix(`/`)
      - traefik.http.services.${STACK_NAME?Variable not set}-ussd.loadbalancer.server.port=63315

  cic-user-server:
    ports:
      - ${HTTP_PORT_CIC_USER_SERVER:-63415}:9500
        #depends_on:
        #  - postgres
    labels:
      - traefik.enable=true
      - traefik.constraint-label-stack=${TRAEFIK_TAG?Variable not set}
      - traefik.http.routers.${STACK_NAME?Variable not set}-user-http.rule=PathPrefix(`/`)
      - traefik.http.services.${STACK_NAME?Variable not set}-user.loadbalancer.server.port=63415

        # cic-user-tasker:
        #   depends_on:
        #     - postgres
        #     - redis

networks:
  traefik-public:
    # For local dev, don't expect an external Traefik network
    external: false
