# 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:
  # --- Observability Stack ---

  tempo-init:
    image: busybox:latest
    command: [ "sh", "-c", "chown -R 10001:10001 /var/tempo" ]
    volumes:
      - tempo-data:/var/tempo
    user: root
    networks:
      - rustfs-network
    restart: "no"

  tempo:
    image: grafana/tempo:latest
    user: "10001"
    command: [ "-config.file=/etc/tempo.yaml" ]
    volumes:
      - ../../.docker/observability/tempo.yaml:/etc/tempo.yaml:ro
      - tempo-data:/var/tempo
    ports:
      - "3200:3200" # tempo
      - "4317"      # otlp grpc
      - "4318"      # otlp http
    restart: unless-stopped
    networks:
      - rustfs-network

  otel-collector:
    image: otel/opentelemetry-collector-contrib:latest
    environment:
      - TZ=Asia/Shanghai
    volumes:
      - ../../.docker/observability/otel-collector-config.yaml:/etc/otelcol-contrib/config.yaml:ro
    ports:
      - "1888:1888"   # pprof
      - "8888:8888"   # Prometheus metrics for Collector
      - "8889:8889"   # Prometheus metrics for application indicators
      - "13133:13133" # health check
      - "4317:4317"   # OTLP gRPC
      - "4318:4318"   # OTLP HTTP
      - "55679:55679" # zpages
    networks:
      - rustfs-network
    depends_on:
      - tempo
      - jaeger
      - prometheus
      - loki

  jaeger:
    image: jaegertracing/jaeger:latest
    environment:
      - TZ=Asia/Shanghai
      - SPAN_STORAGE_TYPE=badger
      - BADGER_EPHEMERAL=false
      - BADGER_DIRECTORY_VALUE=/badger/data
      - BADGER_DIRECTORY_KEY=/badger/key
      - COLLECTOR_OTLP_ENABLED=true
    volumes:
      - jaeger-data:/badger
    ports:
      - "16686:16686" # Web UI
      - "14269:14269" # Admin/Metrics
    networks:
      - rustfs-network

  prometheus:
    image: prom/prometheus:latest
    environment:
      - TZ=Asia/Shanghai
    volumes:
      - ../../.docker/observability/prometheus.yml:/etc/prometheus/prometheus.yml:ro
      - prometheus-data:/prometheus
    ports:
      - "9090:9090"
    command:
      - '--config.file=/etc/prometheus/prometheus.yml'
      - '--web.enable-otlp-receiver'
      - '--web.enable-remote-write-receiver'
      - '--enable-feature=promql-experimental-functions'
      - '--storage.tsdb.path=/prometheus'
      - '--web.console.libraries=/usr/share/prometheus/console_libraries'
      - '--web.console.templates=/usr/share/prometheus/consoles'
    networks:
      - rustfs-network

  loki:
    image: grafana/loki:latest
    environment:
      - TZ=Asia/Shanghai
    volumes:
      - ../../.docker/observability/loki.yaml:/etc/loki/local-config.yaml:ro
      - loki-data:/loki
    ports:
      - "3100:3100"
    command: -config.file=/etc/loki/local-config.yaml
    networks:
      - rustfs-network

  grafana:
    image: grafana/grafana:latest
    ports:
      - "3000:3000" # Web UI
    environment:
      - GF_SECURITY_ADMIN_PASSWORD=admin
      - GF_SECURITY_ADMIN_USER=admin
      - TZ=Asia/Shanghai
      - GF_INSTALL_PLUGINS=grafana-pyroscope-datasource
      - GF_DASHBOARDS_DEFAULT_HOME_DASHBOARD_PATH=/var/lib/grafana/dashboards/home.json
    networks:
      - rustfs-network
    volumes:
      - ../../.docker/observability/grafana/provisioning:/etc/grafana/provisioning:ro
      - ../../.docker/observability/grafana/dashboards:/var/lib/grafana/dashboards:ro
    depends_on:
      - prometheus
      - tempo
      - loki

  # --- RustFS Cluster ---

  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:4318
      - RUSTFS_OBS_LOGGER_LEVEL=debug
    platform: linux/amd64
    ports:
      - "9001:9000"
    networks:
      - rustfs-network
    depends_on:
      - otel-collector

  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:4318
      - RUSTFS_OBS_LOGGER_LEVEL=debug
    platform: linux/amd64
    ports:
      - "9002:9000"
    networks:
      - rustfs-network
    depends_on:
      - otel-collector

  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:4318
      - RUSTFS_OBS_LOGGER_LEVEL=debug
    platform: linux/amd64
    ports:
      - "9003:9000"
    networks:
      - rustfs-network
    depends_on:
      - otel-collector

  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:4318
      - RUSTFS_OBS_LOGGER_LEVEL=debug
    platform: linux/amd64
    ports:
      - "9004:9000"
    networks:
      - rustfs-network
    depends_on:
      - otel-collector

volumes:
  prometheus-data:
  tempo-data:
  loki-data:
  jaeger-data:

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