version: "3.9" services: # ─── DATABASES ─────────────────────────────────────────── postgres: image: postgres:16-alpine container_name: iap-postgres environment: POSTGRES_USER: admin POSTGRES_PASSWORD: admin123 POSTGRES_DB: industrial_ai ports: - "5432:5432" volumes: - pgdata:/var/lib/postgresql/data networks: - backend healthcheck: test: ["CMD-SHELL", "pg_isready -U admin"] interval: 10s timeout: 5s retries: 5 influxdb: image: influxdb:2.7 container_name: iap-influxdb environment: DOCKER_INFLUXDB_INIT_MODE: setup DOCKER_INFLUXDB_INIT_USERNAME: admin DOCKER_INFLUXDB_INIT_PASSWORD: admin12345 DOCKER_INFLUXDB_INIT_ORG: industrial DOCKER_INFLUXDB_INIT_BUCKET: sensors DOCKER_INFLUXDB_INIT_ADMIN_TOKEN: my-super-secret-token ports: - "8086:8086" volumes: - influxdata:/var/lib/influxdb2 networks: - backend redis: image: redis:7-alpine container_name: iap-redis ports: - "6379:6379" volumes: - redisdata:/data networks: - backend command: redis-server --appendonly yes # ─── OBJECT STORAGE ────────────────────────────────────── minio: image: minio/minio:latest container_name: iap-minio environment: MINIO_ROOT_USER: admin MINIO_ROOT_PASSWORD: admin12345 ports: - "9000:9000" - "9001:9001" volumes: - miniodata:/data networks: - backend command: server /data --console-address ":9001" # ─── MESSAGE BROKER ────────────────────────────────────── zookeeper: image: confluentinc/cp-zookeeper:7.6.0 container_name: iap-zookeeper environment: ZOOKEEPER_CLIENT_PORT: 2181 ZOOKEEPER_TICK_TIME: 2000 networks: - backend kafka: image: confluentinc/cp-kafka:7.6.0 container_name: iap-kafka depends_on: - zookeeper environment: KAFKA_BROKER_ID: 1 KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181 KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://kafka:9092,PLAINTEXT_HOST://localhost:29092 KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: PLAINTEXT:PLAINTEXT,PLAINTEXT_HOST:PLAINTEXT KAFKA_INTER_BROKER_LISTENER_NAME: PLAINTEXT KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 1 ports: - "29092:29092" networks: - backend # ─── MONITORING & DASHBOARDS ───────────────────────────── grafana: image: grafana/grafana:11.0.0 container_name: iap-grafana environment: GF_SECURITY_ADMIN_USER: admin GF_SECURITY_ADMIN_PASSWORD: admin123 ports: - "3000:3000" volumes: - grafanadata:/var/lib/grafana networks: - backend depends_on: - influxdb - postgres prometheus: image: prom/prometheus:v2.51.0 container_name: iap-prometheus ports: - "9090:9090" volumes: - ./prometheus.yml:/etc/prometheus/prometheus.yml - promdata:/prometheus networks: - backend # ─── ORCHESTRATION & AUTOMATION ────────────────────────── n8n: image: n8nio/n8n:latest container_name: iap-n8n environment: N8N_BASIC_AUTH_ACTIVE: "true" N8N_BASIC_AUTH_USER: admin N8N_BASIC_AUTH_PASSWORD: admin123 WEBHOOK_URL: http://localhost:5678/ ports: - "5678:5678" volumes: - n8ndata:/home/node/.n8n networks: - backend # ─── LLM & AI ──────────────────────────────────────────── ollama: image: ollama/ollama:latest container_name: iap-ollama ports: - "11434:11434" volumes: - ollamadata:/root/.ollama networks: - backend deploy: resources: reservations: devices: - driver: nvidia count: all capabilities: [gpu] # ─── ML OPS ────────────────────────────────────────────── mlflow: image: ghcr.io/mlflow/mlflow:v2.12.0 container_name: iap-mlflow ports: - "5000:5000" environment: MLFLOW_BACKEND_STORE_URI: postgresql://admin:admin123@postgres:5432/industrial_ai MLFLOW_DEFAULT_ARTIFACT_ROOT: /mlflow/artifacts volumes: - mlflowdata:/mlflow/artifacts networks: - backend depends_on: - postgres command: > mlflow server --host 0.0.0.0 --port 5000 # ─── ANNOTATION ────────────────────────────────────────── label-studio: image: heartexlabs/label-studio:latest container_name: iap-label-studio environment: LABEL_STUDIO_LOCAL_FILES_SERVING_ENABLED: "true" LABEL_STUDIO_USERNAME: admin@admin.com LABEL_STUDIO_PASSWORD: admin123 ports: - "8080:8080" volumes: - labeldata:/label-studio/data networks: - backend # ─── MANAGEMENT ────────────────────────────────────────── portainer: image: portainer/portainer-ce:latest container_name: iap-portainer ports: - "9443:9443" volumes: - /var/run/docker.sock:/var/run/docker.sock - portainerdata:/data networks: - backend restart: always volumes: pgdata: influxdata: redisdata: miniodata: grafanadata: promdata: n8ndata: ollamadata: mlflowdata: labeldata: portainerdata: networks: backend: driver: bridge