services: clickhouse: image: clickhouse/clickhouse-server:26.8.1.2041 container_name: clickhouse restart: unless-stopped mem_limit: 2g environment: - TZ=Europe/Tallinn - CLICKHOUSE_USER=default - CLICKHOUSE_PASSWORD=dev_clickhouse_2026 - CLICKHOUSE_DB=default - CLICKHOUSE_DEFAULT_ACCESS_MANAGEMENT=1 ports: - "100.87.1.24:8125:8123" # ClickHouse HTTP (ainult Tailscale) - "100.87.1.24:9004:9000" # native TCP (ainult Tailscale) volumes: - ./data/clickhouse:/var/lib/clickhouse - ./config:/etc/clickhouse-server/config.d - /etc/localtime:/etc/localtime:ro - /usr/share/zoneinfo:/usr/share/zoneinfo:ro ulimits: nofile: soft: 262144 hard: 262144 # Healthcheck native TCP 9000 vastu (collector kasutab just seda, mitte HTTP 8123). healthcheck: test: ["CMD-SHELL", "clickhouse-client --password \"$$CLICKHOUSE_PASSWORD\" --query 'SELECT 1'"] interval: 10s timeout: 5s retries: 12 start_period: 30s networks: - main_ai_network # Zigbee andurite koguja: tellib valvuri MQTT-d ja kirjutab tunniaegregaadid ClickHouse'i. # Töötab püsivalt; tunniaegregaat arvutatakse mälus ja flush'itakse iga täistunni järel. zigbee-collector: build: ./zigbee-collector container_name: zigbee-collector restart: unless-stopped mem_limit: 128m env_file: - .env environment: - TZ=Europe/Tallinn - MQTT_HOST=${MQTT_HOST:-100.80.254.54} - MQTT_PORT=${MQTT_PORT:-1883} - MQTT_TOPIC=${MQTT_TOPIC:-zigbee2mqtt/Temperatuur} - DOOR_TOPICS=${DOOR_TOPICS:-} - CH_URL=${CH_URL:-http://clickhouse:8123} - CH_DB=${CH_DB:-uus67} - CH_TABLE=${CH_TABLE:-temperatuur} - CH_DOOR_TABLE=${CH_DOOR_TABLE:-ukseandur} - CH_FAULT_TABLE=${CH_FAULT_TABLE:-vead} - OTEL_SERVICE_NAME=zigbee-collector - OTEL_TRACES_EXPORTER=otlp - OTEL_METRICS_EXPORTER=none - OTEL_LOGS_EXPORTER=none - OTEL_EXPORTER_OTLP_ENDPOINT=http://otel-collector:4317 - OTEL_EXPORTER_OTLP_PROTOCOL=grpc - OTEL_RESOURCE_ATTRIBUTES=deployment.environment.name=ohmu depends_on: - clickhouse networks: - main_ai_network # Välistemperatuuri koguja (Open-Meteo): backfill + tunnipoll -> uus67.valisilm. weather-collector: build: ./weather-collector container_name: weather-collector restart: unless-stopped mem_limit: 128m env_file: - .env environment: - TZ=Europe/Tallinn - CH_URL=${CH_URL:-http://clickhouse:8123} - CH_DB=${CH_DB:-uus67} - CH_USER=${CH_USER:-zigbee} - CH_WEATHER_TABLE=${CH_WEATHER_TABLE:-valisilm} - BACKFILL_FROM=${BACKFILL_FROM:-2026-09-17} - OTEL_SERVICE_NAME=weather-collector - OTEL_TRACES_EXPORTER=otlp - OTEL_METRICS_EXPORTER=none - OTEL_LOGS_EXPORTER=none - OTEL_EXPORTER_OTLP_ENDPOINT=http://otel-collector:4317 - OTEL_EXPORTER_OTLP_PROTOCOL=grpc - OTEL_RESOURCE_ATTRIBUTES=deployment.environment.name=ohmu depends_on: - clickhouse networks: - main_ai_network # Nutikodu veebiliides: uus67 zigbee andmete interaktiivne ajatelg (FastAPI + ECharts). # Ligipääs ainult Tailscale'ist: http://100.87.1.24:8095 nutikodu-web: build: ./nutikodu-web container_name: nutikodu-web restart: unless-stopped mem_limit: 512m env_file: - .env environment: - TZ=Europe/Tallinn - CH_URL=${CH_URL:-http://clickhouse:8123} - CH_DB=${CH_DB:-uus67} - CH_USER=${CH_USER:-zigbee} - WEB_ACCESS_TOKEN=${WEB_ACCESS_TOKEN:-} - OTEL_SERVICE_NAME=nutikodu-web - OTEL_TRACES_EXPORTER=otlp - OTEL_METRICS_EXPORTER=none - OTEL_LOGS_EXPORTER=none - OTEL_EXPORTER_OTLP_ENDPOINT=http://otel-collector:4317 - OTEL_EXPORTER_OTLP_PROTOCOL=grpc - OTEL_RESOURCE_ATTRIBUTES=deployment.environment.name=ohmu ports: - "100.87.1.24:8095:8095" depends_on: - clickhouse networks: - main_ai_network - prod_net # ClickStack (ametlik "Docker Compose" arhitektuur): HyperDX app-only + eraldi Mongo. # (Varem: all-in-one, mis dubleeris ClickHouse'i + Mongo.) NB: hostil port 8123 = Home Assistant, # ClickHouse HTTP = 8125 (vt LOEMIND). UI = 18080. clickstack: image: docker.hyperdx.io/hyperdx/hyperdx:2.37.0 container_name: clickstack restart: unless-stopped environment: - TZ=Europe/Tallinn - FRONTEND_URL=http://100.87.1.24:18080 - SERVER_URL=http://127.0.0.1:8000 - HYPERDX_APP_URL=http://100.87.1.24:18080 - HYPERDX_APP_PORT=8080 - HYPERDX_API_PORT=8000 - HYPERDX_API_KEY=02a19ecf-f62e-4e17-819f-3ee1498d69f3 - MONGO_URI=mongodb://clickstack-db:27017/hyperdx - OPAMP_PORT=4320 - OTEL_EXPORTER_OTLP_ENDPOINT=http://otel-collector:4318 - OTEL_SERVICE_NAME=hdx-oss-app - NEXT_PUBLIC_IS_LOCAL_MODE=false # Brauseri (session replay) collector-URL peab olema kliendist kättesaadav (mitte localhost). - NEXT_PUBLIC_OTEL_EXPORTER_OTLP_ENDPOINT=http://100.87.1.24:4318 - EXPRESS_SESSION_SECRET=dev_session_secret_2026 - 'DEFAULT_CONNECTIONS=[{"name":"Local ClickHouse","host":"http://clickhouse:8123","username":"default","password":"dev_clickhouse_2026"}]' ports: - "127.0.0.1:18080:8080" - "100.87.1.24:18080:8080" # HyperDX UI volumes: - ./patches/4719-70b065addcfc053d.js:/app/packages/app/packages/app/.next/static/chunks/4719-70b065addcfc053d.js:ro - ./patches/pages/clickhouse-46029ebbad38b40a.js:/app/packages/app/packages/app/.next/static/chunks/pages/clickhouse-46029ebbad38b40a.js:ro - ./patches/4751-53b929fca5a575a9.js:/app/packages/app/packages/app/.next/static/chunks/4751-53b929fca5a575a9.js:ro - ./patches/1021-40ca2f669b13138d.js:/app/packages/app/packages/app/.next/static/chunks/1021-40ca2f669b13138d.js:ro # ClickHouse peab olema terve (native 9000), muidu collector'i seed ebaõnnestub. depends_on: clickstack-db: condition: service_started clickhouse: condition: service_healthy networks: - main_ai_network # Mongo: HyperDX rakenduse olek (sources/dashboards/alerts/users). Migreeritud all-in-one'ist. clickstack-db: image: mongo:5.0.32-focal container_name: clickstack-db restart: unless-stopped mem_limit: 512m environment: - TZ=Europe/Tallinn volumes: - ./data/mongo:/data/db networks: - main_ai_network # Reverse-proxy pordil 8124: /clickstack/ -> 302 -> :18080 (ühtlustatud UI), # backendi teed ('/api/', /__ENV.js) -> HyperDX app, kõik muu -> ClickHouse (8124 jääb DBeaver-ile). clickstack-proxy: image: nginx:alpine container_name: clickstack-proxy restart: unless-stopped ports: - "127.0.0.1:8124:8124" - "100.87.1.24:8124:8124" volumes: - ./config/clickstack-proxy/nginx.conf:/etc/nginx/conf.d/clickstack.conf:ro depends_on: - clickhouse - clickstack networks: - main_ai_network # Hosti metrikad (node-exporter) — Prometheus endpoint :9100 node-exporter: image: prom/node-exporter:latest container_name: node-exporter restart: unless-stopped mem_limit: 128m command: - "--path.rootfs=/host" - "--path.procfs=/host/proc" - "--path.sysfs=/host/sys" volumes: - /proc:/host/proc:ro - /sys:/host/sys:ro - /:/host:ro,rslave networks: - main_ai_network # Konteinerite metrikad (cadvisor) — Prometheus endpoint :8080 cadvisor: image: gcr.io/cadvisor/cadvisor:latest container_name: cadvisor restart: unless-stopped mem_limit: 256m privileged: true command: - "--docker_only=true" - "--disable_metrics=advtcp,cpu_topology,cpuset,hugetlb,memory_numa,process,referenced_memory,resctrl,sched,tcp,udp,percpu" devices: - /dev/kmsg volumes: - /:/rootfs:ro - /var/run:/var/run:ro - /sys:/sys:ro - /var/lib/docker/:/var/lib/docker:ro - /dev/disk/:/dev/disk:ro networks: - main_ai_network # ClickStack ametlik OTel-collector (OpAMP -> clickstack app). Base config app'ist (skeem/rollupid); # custom.config.yaml lisab hosti-meetrikad (node/cadvisor/llamacpp) + konteinerilogid. otel-collector: image: docker.clickhouse.com/clickhouse/clickstack-otel-collector:2 container_name: otel-collector restart: unless-stopped mem_limit: 512m user: "0:0" # root: vaja lugeda /var/lib/docker/containers/*-json.log (710 root:root) environment: - TZ=Europe/Tallinn - CLICKHOUSE_ENDPOINT=tcp://clickhouse:9000?dial_timeout=10s - CLICKHOUSE_USER=default - CLICKHOUSE_PASSWORD=dev_clickhouse_2026 - HYPERDX_OTEL_EXPORTER_CLICKHOUSE_DATABASE=default - OPAMP_SERVER_URL=http://clickstack:4320 - CUSTOM_OTELCOL_CONFIG_FILE=/etc/otelcol-contrib/custom.config.yaml extra_hosts: - "host.docker.internal:host-gateway" volumes: - ./config/otel-collector/custom.config.yaml:/etc/otelcol-contrib/custom.config.yaml:ro - /var/lib/docker/containers:/var/lib/docker/containers:ro ports: - "127.0.0.1:4317:4317" - "100.87.1.24:4317:4317" - "127.0.0.1:4318:4318" - "100.87.1.24:4318:4318" depends_on: - clickstack - clickhouse - node-exporter - cadvisor networks: - main_ai_network # HyperDX alert-webhook → Telegram relay (generic webhook vastuvõtja) alert-relay: image: python:3.12-slim container_name: alert-relay restart: unless-stopped mem_limit: 64m command: ["python", "/app/alert_relay.py"] environment: - TZ=Europe/Tallinn - TELEGRAM_BOT_TOKEN=${TELEGRAM_BOT_TOKEN} - TELEGRAM_CHAT_ID=5036685258 volumes: - ./config/alert-relay/alert_relay.py:/app/alert_relay.py:ro networks: - main_ai_network # Rate-limiter HyperDX OTLP ingest'ile (otel.odamus.com). Edge Caddy -> see -> otel-collector:4318. # nginx limit_req (Caddy standardbuildis rate_limit plugin't pole). otel-ratelimit: image: nginx:alpine container_name: otel-ratelimit restart: unless-stopped mem_limit: 32m environment: - TZ=Europe/Tallinn volumes: - ./config/otel-ratelimit/nginx.conf:/etc/nginx/nginx.conf:ro ports: - "100.87.1.24:4319:4319" depends_on: - otel-collector networks: - main_ai_network networks: main_ai_network: external: true name: main_ai_network prod_net: external: true name: prod_net