# docker-compose.full.yml
# 전체 스택 설정 (모든 서비스 포함)
version: "3.8"

services:
  # 기존 서비스들은 base 설정을 상속

  # 추가 서비스들
  timescaledb:
    image: timescale/timescaledb:latest-pg15
    restart: unless-stopped
    expose:
      - "5432"
    environment:
      POSTGRES_DB: ${TIMESCALEDB_DB}
      POSTGRES_USER: ${TIMESCALEDB_USER}
      POSTGRES_PASSWORD: ${TIMESCALEDB_PASSWORD}
    volumes:
      - timescaledb_data:/var/lib/postgresql/data
    healthcheck:
      test:
        ["CMD-SHELL", "pg_isready -U ${TIMESCALEDB_USER} -d ${TIMESCALEDB_DB}"]
    networks:
      - internal

  mosquitto:
    image: eclipse-mosquitto:latest
    restart: unless-stopped
    expose:
      - "1883"
      - "9001"
    labels:
      - "traefik.enable=true"
      - "traefik.http.routers.mqtt-ws.rule=Host(`${MQTT_SUBDOMAIN}`)"
      - "traefik.http.routers.mqtt-ws.entrypoints=websecure"
      - "traefik.http.routers.mqtt-ws.tls=true"
    volumes:
      - ./config/mosquitto:/mosquitto/config
      - mosquitto_data:/mosquitto/data
    security_opt:
      - no-new-privileges:true
    networks:
      - ${TRAEFIK_NETWORK}
      - internal

  node-red:
    image: nodered/node-red:latest
    restart: unless-stopped
    expose:
      - "1880"
    labels:
      - "traefik.enable=true"
      - "traefik.http.routers.node-red.rule=Host(`${NODERED_SUBDOMAIN}`)"
      - "traefik.http.routers.node-red.entrypoints=websecure"
      - "traefik.http.routers.node-red.tls=true"
    volumes:
      - node_red_data:/data
    networks:
      - ${TRAEFIK_NETWORK}
      - internal

  # 백업 서비스 추가
  backup-service:
    image: backup-image
    volumes:
      - postgres_data:/backup/postgres:ro
      - timescaledb_data:/backup/timescale:ro
    environment:
      - BACKUP_SCHEDULE=0 0 * * *
    networks:
      - internal

  # Monitoring Stack
  prometheus:
    image: prom/prometheus:latest
    restart: unless-stopped
    expose:
      - "9090"
    labels:
      - "traefik.enable=true"
      - "traefik.http.routers.prometheus.rule=Host(`${PROMETHEUS_SUBDOMAIN}`)"
      - "traefik.http.routers.prometheus.entrypoints=websecure"
      - "traefik.http.routers.prometheus.tls=true"
      - "traefik.http.services.prometheus.loadbalancer.server.port=9090"
    volumes:
      - ./config/prometheus:/etc/prometheus
      - prometheus_data:/prometheus
    depends_on:
      - fems-admin
      - fems-app
      - fems-api
    networks:
      - ${TRAEFIK_NETWORK}
      - internal

  grafana:
    image: grafana/grafana:latest
    restart: unless-stopped
    expose:
      - "3000"
    labels:
      - "traefik.enable=true"
      - "traefik.http.routers.grafana.rule=Host(`${GRAFANA_SUBDOMAIN}`)"
      - "traefik.http.routers.grafana.entrypoints=websecure"
      - "traefik.http.routers.grafana.tls=true"
      - "traefik.http.services.grafana.loadbalancer.server.port=3000"
    volumes:
      - ./config/grafana:/etc/grafana/provisioning
      - grafana_data:/var/lib/grafana
    networks:
      - ${TRAEFIK_NETWORK}
      - internal

  # Logging Stack
  elasticsearch:
    image: docker.elastic.co/elasticsearch/elasticsearch:8.8.0
    restart: unless-stopped
    environment:
      - discovery.type=single-node
      - ES_JAVA_OPTS=-Xms512m -Xmx512m
    ports:
      - "${ELASTICSEARCH_PORT:-9200}:9200"
    volumes:
      - elasticsearch_data:/usr/share/elasticsearch/data
    networks:
      - internal

  # Kibana
  kibana:
    image: docker.elastic.co/kibana/kibana:8.8.0
    restart: unless-stopped
    expose:
      - "5601"
    labels:
      - "traefik.enable=true"
      - "traefik.http.routers.kibana.rule=Host(`${KIBANA_SUBDOMAIN}`)"
      - "traefik.http.routers.kibana.entrypoints=websecure"
      - "traefik.http.routers.kibana.tls=true"
      - "traefik.http.services.kibana.loadbalancer.server.port=5601"
    environment:
      - ELASTICSEARCH_HOSTS=http://elasticsearch:9200
    networks:
      - ${TRAEFIK_NETWORK}
      - internal
    depends_on:
      - elasticsearch

volumes:
  timescaledb_data:
  mosquitto_data:
  node_red_data:
  prometheus_data:
  grafana_data:
  elasticsearch_data:

networks:
  ${TRAEFIK_NETWORK}:
    external: true
  internal:
    driver: bridge