networks:
  app:
    driver: bridge
  monitoring:
    driver: bridge

services:
  frontend:
    build: ./frontend
    container_name: app-frontend
    restart: on-failure:3
    networks:
      - app
    volumes:
      - static-volume:/volumes/static
    logging:
      driver: gelf
      options:
        gelf-address: "udp://127.0.0.1:12201"
        tag: "{{.Name}}"

  nginx:
    build: ./nginx
    container_name: app-nginx
    restart: always
    networks:
      - app
      - monitoring
    ports:
      - '8888:443'
      - '9090:8443'
    volumes:
      # if you need to share files with nginx, you do it here.
      - static-volume:/volumes/static
    environment:
      # this can stay the same for developpement. This is an alias to `localhost`
      - NGINX_DOMAIN=local.maix.me
    logging:
      driver: gelf
      options:
        gelf-address: "udp://127.0.0.1:12201"
        tag: "{{.Name}}"

  ###############
  #   SERVICE   #
  ###############

  auth:
    build:
      context: ./src/
      args:
        - SERVICE=auth
        - EXTRA_FILES=auth/extra
    container_name: app-auth 
    restart: always
    networks:
      - app
    volumes:
      - sqlite-volume:/volumes/database
      - static-volume:/volumes/static
    environment:
      - JWT_SECRET=KRUGKIDROVUWG2ZAMJZG653OEBTG66BANJ2W24DTEBXXMZLSEB2GQZJANRQXU6JA
      - DATABASE_DIR=/volumes/database
      - PROVIDER_FILE=/extra/providers.toml
    logging:
      driver: gelf
      options:
        gelf-address: "udp://127.0.0.1:12201"
        tag: "{{.Name}}"

  ###############
  # TIC-TAC-TOE #
  ###############
  tic-tac-toe:
     build:
       context: ./src/
       args:
         - SERVICE=tic-tac-toe
         - EXTRA_FILES=tic-tac-toe/extra
     container_name: tic-tac-toe
     restart: unless-stopped
     networks:
       - app
     volumes:
       - sqlite-volume:/volumes/database
       - static-volume:/volumes/static
     environment:
       - JWT_SECRET=KRUGKIDROVUWG2ZAMJZG653OEBTG66BANJ2W24DTEBXXMZLSEB2GQZJANRQXU6JA
       - DATABASE_DIR=/volumes/database

  ###############
  #    CHAT     #
  ###############
  chat:
    build:
      context: ./src/
      args:
        - SERVICE=chat
    container_name: app-chat 
    restart: always
    networks:
      - app
    volumes:
      - sqlite-volume:/volumes/database
      - static-volume:/volumes/static
    environment:
      - JWT_SECRET=KRUGKIDROVUWG2ZAMJZG653OEBTG66BANJ2W24DTEBXXMZLSEB2GQZJANRQXU6JA
      - DATABASE_DIR=/volumes/database
      - PROVIDER_FILE=/extra/providers.toml
      - SESSION_MANAGER=${SESSION_MANAGER}
    logging:
      driver: gelf
      options:
        gelf-address: "udp://127.0.0.1:12201"
        tag: "{{.Name}}"

  user:
    build:
      context: ./src/
      args:
        - SERVICE=user
    container_name: app-user
    restart: always
    networks:
      - app
    volumes:
      - sqlite-volume:/volumes/database
      - static-volume:/volumes/static
    environment:
      - JWT_SECRET=KRUGKIDROVUWG2ZAMJZG653OEBTG66BANJ2W24DTEBXXMZLSEB2GQZJANRQXU6JA
      - DATABASE_DIR=/volumes/database
    logging:
      driver: gelf
      options:
        gelf-address: "udp://127.0.0.1:12201"
        tag: "{{.Name}}"


  ###############
  # MONITORING  #
  ###############

  grafana:
    container_name: mon-grafana
    image: grafana/grafana-enterprise
    restart: always
    networks:
      - app
      - monitoring
    depends_on:
      - prometheus
    volumes:
      - ./monitoring/grafana/alerting:/etc/grafana/provisioning/alerting
      - ./monitoring/grafana/datasources:/etc/grafana/provisioning/datasources
      - ./monitoring/grafana/dashboards-config:/etc/grafana/provisioning/dashboards
      - ./monitoring/grafana/dashboards:/var/lib/grafana/dashboards
      - grafana-data:/var/lib/grafana
    environment:
      # this can stay the same for developpement. This is an alias to `localhost`
      - NGINX_DOMAIN=local.maix.me
      - GF_LOG_LEVEL=warn
      - GF_SERVER_ROOT_URL=https://local.maix.me:9090/grafana/
      - GF_SECURITY_ADMIN_USER=${GRAFANA_ADMIN_USER}
      - GF_SECURITY_ADMIN_PASSWORD=${GRAFANA_ADMIN_PASS}
    logging:
      driver: gelf
      options:
        gelf-address: "udp://127.0.0.1:12201"
        tag: "{{.Name}}"
    healthcheck:
      test: ["CMD-SHELL", "curl -f -s http://localhost:3000/api/health || exit 1"]
      interval: 30s
      timeout: 10s
      retries: 3
      start_period: 30s

  prometheus:
    image: prom/prometheus:latest
    container_name: mon-prometheus
    networks:
      - app
      - monitoring
    volumes:
      - ./monitoring/prometheus:/etc/prometheus/
    restart: unless-stopped
    logging:
      driver: gelf
      options:
        gelf-address: "udp://127.0.0.1:12201"
        tag: "{{.Name}}"
    healthcheck:
      test: ["CMD", "wget", "--quiet", "--spider", "http://localhost:9090/-/healthy"]
      interval: 30s
      timeout: 5s
      retries: 3
      start_period: 30s

  cadvisor:
    image: gcr.io/cadvisor/cadvisor:latest
    networks:
      - monitoring
    container_name: mon-cadvisor
    command:
      - '-url_base_prefix=/cadvisor'
    environment:
      - CADVISOR_HEALTHCHECK_URL=http://localhost:8080/cadvisor/healthz
    volumes:
      - /:/rootfs:ro
      - /var/run:/var/run:ro
      - /sys:/sys:ro
      - /var/lib/docker/:/var/lib/docker:ro
    restart: unless-stopped
    logging:
      driver: gelf
      options:
        gelf-address: "udp://127.0.0.1:12201"
        tag: "{{.Name}}"

  blackbox:
    image: prom/blackbox-exporter:latest
    container_name: mon-blackbox
    networks:
      - app
    restart: unless-stopped
    logging:
      driver: gelf
      options:
        gelf-address: "udp://127.0.0.1:12201"
        tag: "{{.Name}}"
    healthcheck:
      test: ["CMD", "wget", "--quiet", "--spider", "http://localhost:9115/-/healthy"]
      interval: 30s
      timeout: 5s
      retries: 3
      start_period: 10s



  ###############
  #     LOGS    #
  ###############

  elasticsearch:
    image: docker.elastic.co/elasticsearch/elasticsearch:7.17.23
    container_name: log-elasticsearch
    networks:
      - monitoring
    environment:
      - discovery.type=single-node
      - ES_JAVA_OPTS=-Xms512m -Xmx512m
      - ELASTIC_PASSWORD=${ELASTIC_PASSWORD}
    volumes:
      - elastic-data:/usr/share/elasticsearch/data
      - ./logs/elasticsearch:/setup
    command: ["/setup/bootstrap.sh"]
    restart: unless-stopped
    healthcheck:
      test: ["CMD", "curl", "-f", "-s", "localhost:9200"]
      interval: 30s
      timeout: 10s
      retries: 3
      start_period: 10s

  logstash:
    image: docker.elastic.co/logstash/logstash:7.17.23
    container_name: log-logstash
    depends_on:
      - elasticsearch
    networks:
      - monitoring
    volumes:
      - ./logs/logstash/pipeline:/usr/share/logstash/pipeline
    ports:
      - "12201:12201/udp"
    restart: unless-stopped
    healthcheck:
      test: ["CMD", "curl", "-f", "-s", "localhost:9600"]
      interval: 30s
      timeout: 10s
      retries: 3
      start_period: 10s

  kibana:
    image: docker.elastic.co/kibana/kibana:7.17.23
    container_name: log-kibana
    depends_on:
      - elasticsearch
    networks:
      - monitoring
      - app
    environment:
      - ELASTICSEARCH_HOSTS=http://elasticsearch:9200
      - SERVER_PUBLICBASEURL=https://local.maix.me:9090/kibana
      - SERVER_BASEPATH=/kibana
      - SERVER_REWRITEBASEPATH=true
      - ELASTICSEARCH_USERNAME=elastic
      - ELASTIC_PASSWORD=${ELASTIC_PASSWORD}
    volumes:
      - ./logs/kibana:/setup
    command: ["/setup/bootstrap.sh"]
    restart: unless-stopped
    healthcheck:
      test: ["CMD", "curl", "-f", "-s", "localhost:5601/kibana/api/status"]
      interval: 30s
      timeout: 10s
      retries: 3
      start_period: 10s

volumes:
  sqlite-volume:
  static-volume:
  grafana-data:
  elastic-data:
