# Copyright 2024 RustFS Team
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

services:
  otel-collector:
    image: otel/opentelemetry-collector-contrib:0.129.1
    environment:
      - TZ=Asia/Shanghai
    volumes:
      - ../../.docker/observability/otel-collector-config.yaml:/etc/otelcol-contrib/config.yaml
    ports:
      - 1888:1888
      - 8888:8888
      - 8889:8889
      - 13133:13133
      - 4317:4317
      - 4318:4318
      - 55679:55679
    networks:
      - rustfs-network
  jaeger:
    image: jaegertracing/jaeger:2.8.0
    environment:
      - TZ=Asia/Shanghai
    ports:
      - "16686:16686"
      - "14317:4317"
      - "14318:4318"
    networks:
      - rustfs-network
  prometheus:
    image: prom/prometheus:v3.4.2
    environment:
      - TZ=Asia/Shanghai
    volumes:
      - ../../.docker/observability/prometheus.yml:/etc/prometheus/prometheus.yml
    ports:
      - "9090:9090"
    networks:
      - rustfs-network
  loki:
    image: grafana/loki:3.5.1
    environment:
      - TZ=Asia/Shanghai
    volumes:
      - ../../.docker/observability/loki-config.yaml:/etc/loki/local-config.yaml
    ports:
      - "3100:3100"
    command: -config.file=/etc/loki/local-config.yaml
    networks:
      - rustfs-network
  grafana:
    image: grafana/grafana:12.0.2
    ports:
      - "3000:3000" # Web UI
    environment:
      - GF_SECURITY_ADMIN_PASSWORD=admin
      - TZ=Asia/Shanghai
    networks:
      - rustfs-network

  node1:
    build:
      context: ../..
      dockerfile: Dockerfile.source
    container_name: node1
    environment:
      - RUSTFS_VOLUMES=http://node{1...4}:9000/root/data/target/volume/test{1...4}
      - RUSTFS_ADDRESS=:9000
      - RUSTFS_CONSOLE_ENABLE=true
      - RUSTFS_OBS_ENDPOINT=http://otel-collector:4317
      - RUSTFS_OBS_LOGGER_LEVEL=debug
    platform: linux/amd64
    ports:
      - "9001:9000" # Map port 9001 of the host to port 9000 of the container
    networks:
      - rustfs-network

  node2:
    build:
      context: ../..
      dockerfile: Dockerfile.source
    container_name: node2
    environment:
      - RUSTFS_VOLUMES=http://node{1...4}:9000/root/data/target/volume/test{1...4}
      - RUSTFS_ADDRESS=:9000
      - RUSTFS_CONSOLE_ENABLE=true
      - RUSTFS_OBS_ENDPOINT=http://otel-collector:4317
      - RUSTFS_OBS_LOGGER_LEVEL=debug
    platform: linux/amd64
    ports:
      - "9002:9000" # Map port 9002 of the host to port 9000 of the container
    networks:
      - rustfs-network

  node3:
    build:
      context: ../..
      dockerfile: Dockerfile.source
    container_name: node3
    environment:
      - RUSTFS_VOLUMES=http://node{1...4}:9000/root/data/target/volume/test{1...4}
      - RUSTFS_ADDRESS=:9000
      - RUSTFS_CONSOLE_ENABLE=true
      - RUSTFS_OBS_ENDPOINT=http://otel-collector:4317
      - RUSTFS_OBS_LOGGER_LEVEL=debug
    platform: linux/amd64
    ports:
      - "9003:9000" # Map port 9003 of the host to port 9000 of the container
    networks:
      - rustfs-network

  node4:
    build:
      context: ../..
      dockerfile: Dockerfile.source
    container_name: node4
    environment:
      - RUSTFS_VOLUMES=http://node{1...4}:9000/root/data/target/volume/test{1...4}
      - RUSTFS_ADDRESS=:9000
      - RUSTFS_CONSOLE_ENABLE=true
      - RUSTFS_OBS_ENDPOINT=http://otel-collector:4317
      - RUSTFS_OBS_LOGGER_LEVEL=debug
    platform: linux/amd64
    ports:
      - "9004:9000" # Map port 9004 of the host to port 9000 of the container
    networks:
      - rustfs-network

networks:
  rustfs-network:
    driver: bridge
    name: "network_rustfs_config"
    driver_opts:
      com.docker.network.enable_ipv6: "true"
