services:

  elasticsearch:
    image: "${ELASTICSEARCH_IMAGE:-docker.elastic.co/elasticsearch/elasticsearch:7.14.0}"
    environment:
      - discovery.type=single-node
      - "ES_JAVA_OPTS=-Xms512m -Xmx512m"
    healthcheck:
      test: ["CMD", "echo", "''", ">", "/dev/tcp/127.0.0.1/9200", "||", "exit", "1"]
      interval: 1s
      timeout: 2s
      retries: 300
  app:
    build:
      context: .
      target: development
      args:
        DOCKER_USER: ${DOCKER_USER:-1000}
    image: richie:development
    environment:
      - PYLINTHOME=./.pylint.d
    env_file:
      - env.d/development/common
      - env.d/development/localtunnel
      - env.d/development/${DEV_ENV_FILE:-dev}
      - env.d/development/${DB_HOST:-postgresql}
    networks:
      default:
        aliases:
          - app-service
    volumes:
      - .:/app
      - ./data/static:/data/static
      - ./data/media:/data/media
      - ./data/smedia:/data/smedia
    depends_on:
      elasticsearch:
        condition: service_started
      redis-sentinel:
        condition: service_started
    stdin_open: true
    tty: true
    healthcheck:
      test: ["CMD", "echo", "''", ">", "/dev/tcp/127.0.0.1/8000", "||", "exit", "1"]
      interval: 1s
      timeout: 2s
      retries: 3600
  nginx:
    image: nginx
    ports:
      - "8070:8070"
    networks:
      default:
        aliases:
          - nginx
      lms_outside:
        aliases:
          - richie
    volumes:
      - ./docker/files/etc/nginx/${NGINX_CONF:-conf.d}:/etc/nginx/conf.d:ro
    depends_on:
      - app

  storybook:
    image: node:20.19
    ports:
      - "8076:6006"
    working_dir: /app/src/frontend
    command: npm run storybook
    environment:
      - HOME=/tmp
      - BROWSER=true
    user: "${DOCKER_USER:-1000}"
    volumes:
      - .:/app

  frontend:
    image: node:20.19
    working_dir: /app/src/frontend
    user: "${DOCKER_USER:-1000}"
    volumes:
      - .:/app

  crowdin:
    image: crowdin/cli:4.0.0
    volumes:
      - ".:/app"
    env_file:
      - env.d/development/crowdin
    user: "${DOCKER_USER:-1000}"
    working_dir: /app

  redis-sentinel:
    image: docker.io/fundocker/redis-sentinel:6.2.9-debian-11-r0
    depends_on:
      - redis-primary
      - redis-replica1
      - redis-replica2
    environment:
      - REDIS_MASTER_HOST=redis-primary
    healthcheck:
      test: ["CMD-SHELL", "redis-cli -p 26379  ping | grep PONG"]
      interval: 1s
      timeout: 2s
      retries: 300

  redis-primary:
    image: docker.io/fundocker/redis:6.2.9-debian-11-r0
    environment:
      - ALLOW_EMPTY_PASSWORD=yes
      - REDIS_REPLICATION_MODE=master
    healthcheck:
      test: ["CMD-SHELL", "redis-cli -p 6379 ping | grep PONG"]
      interval: 1s
      timeout: 2s
      retries: 300

  redis-replica1:
    image: docker.io/fundocker/redis:6.2.9-debian-11-r0
    environment:
      - ALLOW_EMPTY_PASSWORD=yes
      - REDIS_REPLICATION_MODE=slave
      - REDIS_MASTER_HOST=redis-primary
    depends_on:
      - redis-primary
    healthcheck:
      test: ["CMD-SHELL", "redis-cli -p 6379 ping | grep PONG"]
      interval: 1s
      timeout: 2s
      retries: 300

  redis-replica2:
    image: docker.io/fundocker/redis:6.2.9-debian-11-r0
    environment:
      - ALLOW_EMPTY_PASSWORD=yes
      - REDIS_REPLICATION_MODE=slave
      - REDIS_MASTER_HOST=redis-primary
    depends_on:
      - redis-primary
    healthcheck:
      test: ["CMD-SHELL", "redis-cli -p 6379 ping | grep PONG"]
      interval: 1s
      timeout: 2s
      retries: 300

networks:
  lms_outside:
    driver: bridge
    name: "${RICHIE_LMS_NETWORK:-edx-lms-outside}"
