version: '3'

services:
  # Dashboard für Metriken
  grafana:
    image: grafana/grafana-oss:latest
    container_name: grafana
    ports:
      - "127.0.0.1:3000:3000"
    volumes:
      - ./monitoring/grafana-data:/var/lib/grafana

  # TSDB zum Speichern der Metriken
  prometheus:
    image: prom/prometheus:v2.37.9
    container_name: prometheus
    ports:
      - 127.0.0.1:9090:9090
    command: 
      - "--config.file=/etc/prometheus/prometheus.yml"
      - '--web.enable-admin-api'  
      - '--storage.tsdb.retention.time=1y'
    volumes:
      - ./monitoring/prometheus/config:/etc/prometheus
      - ./monitoring/prometheus/data:/prometheus
    
  # Container Advisor - Docker Compose Metriken zu scrapen
  cadvisor:
    image: gcr.io/cadvisor/cadvisor:v0.47.0     
    container_name: cadvisor
    ports:
      - 8080:8080
    volumes:
      - /:/rootfs:ro
      - /var/run:/var/run:ro
      - /sys:/sys:ro
      - /var/lib/docker/:/var/lib/docker:rob 
      - /dev/disk/:/dev/disk:ro
    devices:
      - /dev/kmsg
    privileged: true
  
  # Exporter für Postgres Statistiken/Metriken 
  postgres_exporter:
    image: bitnami/postgres-exporter:latest
    ports:
      - 9187:9187
    environment:
      - DATA_SOURCE_NAME=postgresql://postgres:postgres@postgres:5432/postgres?sslmode=disable
    depends_on:
      - postgres

  # DB Container ongDB
  ongdb:
    image: graphfoundation/ongdb-enterprise:1.0.5
    container_name: ongdb
    environment:
      - ONGDB_AUTH=none
    volumes:
      - "./ongdb/container/data:/data"
    ports:
      - "9474:7474"
      - "9687:7687"
    healthcheck:
      test: ["CMD", "wget", "http://ongdb:7474"]
      interval: 30s
      timeout: 20s
      retries: 5
      start_period: 30s  

  # DB Container memgraph (testweise)
  memgraph:
    image: memgraph/memgraph-platform
    container_name: memgraph
    ports:
      - "8687:7687"
      - "8444:7444"
      - "3001:3000"
      - "9091:9091"
    environment: 
      - MEMGRAPH="--query-modules-directory=/usr/lib/memgraph/query_modules --monitoring-address=0.0.0.0 --monitoring-port=7444 --log-file=/var/log/memgraph/memgraph.log --log-level=TRACE "
    volumes:
      - ./memgraph/mg_lib:/var/lib/memgraph
      - ./memgraph/mg_log:/var/log/memgraph:rw
      - ./memgraph/mg_etc:/etc/memgraph
    entrypoint: ["/usr/bin/supervisord"]
    healthcheck:
      test: ["CMD", "mgconsole"]
      interval: 30s
      timeout: 10s
      retries: 5
      start_period: 30s  

  #mem_exporter:
  #  image: mem_exporter
  #  container_name: mem_exporter
  #  ports: 
  #    - "9115:9115"

  # Datenbank Container - Neo4j
  neo4j:
    image: neo4j:enterprise
    container_name: neo4j
    volumes:
      - ./neo4j/container_e/data:/data:rw
      - ./neo4j/container_e/logs:/logs:rw
      #- ./neo4j/container_e/import:/var/lib/neo4j/import:rw
      #- ./neo4j/container_e/conf:/var/lib/neo4j/conf:rw
    ports:
      - 7474:7474
      - 7687:7687 
      - 2004:2004
    environment:
      - NEO4J_AUTH=none 
      - NEO4J_server_metrics_prometheus_enabled=true
      - NEO4J_ACCEPT_LICENSE_AGREEMENT=yes
      - NEO4J_server_metrics_prometheus_endpoint=0.0.0.0:2004
    healthcheck:
      test: ["CMD", "wget", "http://neo4j:7474"]
      interval: 30s
      timeout: 20s
      retries: 5
      start_period: 30s  

  # Datenbank Container - Postgres
  postgres:
    image: postgres:latest
    container_name: postgres
    #user: "sven:postgres" 
    environment:
      - PGUSER=postgres
      - POSTGRES_DB=postgres
      - POSTGRES_USER=postgres
      - POSTGRES_PASSWORD=postgres
    healthcheck:
      test: ["CMD-SHELL", "pg_isready","-U postgres"]
      interval: 30s
      timeout: 10s
      retries: 5
      start_period: 10s  
    logging:
      options:
        max-size: 10m
        max-file: "3"
    ports:
      - 5432:5432
    volumes: 
      - ./sql/docker/data:/var/lib/postgresql/data:rw
      - ./sql/docker/postgres_logs:/var/log/postgresql:rw
      # copy the sql script to create tables
      # - ./sql/skript/import_cadets:/opt/import_cadets:rw

  # Admin GUI Postgres
  pgadmin:
    image: dpage/pgadmin4:latest
    container_name: pgadmin4_container
    ports:
      - "8888:80"
    environment:
      PGADMIN_DEFAULT_EMAIL: admin@abc.de
      PGADMIN_DEFAULT_PASSWORD: admin
    volumes:
      - ./sql/pgadmin-data:/var/lib/pgadmin

  # Infrakstruktur zum Publishen und Streamen von CDM Daten
  sub_ongdb:
    container_name: sub_ongdb
    image: lab.it.hs-hannover.de:4567/cwy-p8d-u1/ma_code/sub_ongdb
    environment:
      - abort_time_limit=999999
      - db_host=bolt://ongdb:7687 
      - mos_host=mos1
      - mos_port=1883
    healthcheck:
      test: ["CMD","ls"]
      interval: 30s
      timeout: 10s
      retries: 5
      start_period: 10s
    depends_on:
      ongdb:
        condition: service_healthy
        #restart: true

  mosquitto:
    container_name: mos1
    image: eclipse-mosquitto
    ports:
      - 1883:1883
      - 9001:9001
      - 8883:8883
    volumes:
      - ./streaming/mosquitto.conf:/mosquitto/config/mosquitto.conf
      - ./streaming/log/mosquitto.log:/mosquitto/log/mosquitto.log     

  sub_pg:
    container_name: sub_pg
    image: lab.it.hs-hannover.de:4567/cwy-p8d-u1/ma_code/sub_pg
    volumes:
      - ./streaming/clients/sub/postgres/:/var/lib/import/
    environment:
      - path_sql_script=/var/lib/import/
    depends_on:
      postgres:
        condition: service_healthy
        #restart: true

  sub_neo4j:
    container_name: sub_neo4j
    image: lab.it.hs-hannover.de:4567/cwy-p8d-u1/ma_code/sub_neo4j
    environment:
      - abort_time_limit=999999
      - neo4j_host=bolt://neo4j:7687 
      - mos_host=mos1
      - mos_port=1883
    healthcheck:
      test: ["CMD","ls"]
      interval: 30s
      timeout: 10s
      retries: 5
      start_period: 10s
    depends_on:
      neo4j:
        condition: service_healthy
        #restart: true

  sub_mem:
    container_name: sub_mem
    image: lab.it.hs-hannover.de:4567/cwy-p8d-u1/ma_code/sub_mem
    environment:
      - abort_time_limit=999999
      - mem_host=bolt://memgraph:7687 
      - mos_host=mos1
      - mos_port=1883
    depends_on:
      memgraph:
        condition: service_healthy
        #restart: true

  pub: 
    container_name: pub_cdm
    image: lab.it.hs-hannover.de:4567/cwy-p8d-u1/ma_code/pub_cdm
    environment:
      - lines_per_window=1000
      - path_to_firstK=/var/lib/import/first1k.json
      - path_data=/var/lib/import/
      - sleep_time=1
    volumes: 
      - ./streaming/clients/pub/data:/var/lib/import
    depends_on: 
      sub_neo4j:
        condition: service_healthy
      sub_ongdb: 
        condition: service_healthy
      sub_pg:
        condition: service_started    
      sub_mem:
        condition: service_started

    # infrastructure for testing
  query_pg:
    container_name: query_pg
    image: lab.it.hs-hannover.de:4567/cwy-p8d-u1/ma_code/sql_queries
    environment:
      - PGHOST=postgres
      - PGDATABASE=postgres
      - PGUSER=postgres
      - PGPASSWORD=postgres
      - PGPORT=5432
      - interval=5
      - query_file_path=/app/queries/queries.txt
    volumes:
      - ./eval/query/pg/log:/app/log
      - ./eval/query/pg/queries:/app/queries
    depends_on:
      - pub

  query_neo4j:
    container_name: query_neo4j
    image: lab.it.hs-hannover.de:4567/cwy-p8d-u1/ma_code/cypher_queries
    environment:
      - interval=5
      - db_host=neo4j 
      - db_port=7687
      - query_file_path=/app/queries/queries.txt
    volumes:
      - ./eval/query/neo4j/log:/app/log
      - ./eval/query/neo4j/queries:/app/queries
    depends_on:
      - pub

  query_ongdb:
    container_name: query_ongdb
    image: lab.it.hs-hannover.de:4567/cwy-p8d-u1/ma_code/ongdb_queries
    environment:
      - interval=5
      - db_host=ongdb 
      - db_port=7687
      - query_file_path=/app/queries/queries.txt
    volumes:
      - ./eval/query/ongdb/log:/app/log
      - ./eval/query/ongdb/queries:/app/queries
    depends_on:
      - pub
  
  query_memgraph:
    container_name: query_memgraph
    image: lab.it.hs-hannover.de:4567/cwy-p8d-u1/ma_code/cypher_queries
    environment:
      - interval=5
      - db_host=memgraph 
      - db_port=7687
      - query_file_path=/app/queries/queries.txt
    volumes:
      - ./eval/query/memgraph/log:/app/log
      - ./eval/query/memgraph/queries:/app/queries
    depends_on:
      - pub  


    

volumes:
  postgres:
  pgadmin:
  prometheus-data:
    driver: local
  neo4j:
  mg_lib:
  mg_log:
  mg_etc:

networks:
  postgres:
    external: true