version: '3.8' # ╔═══════════════════════════════════════════════════════╗ # ║ FarmBox — локальный стек ║ # ║ Разворачивается на Mini PC / RPi на ферме ║ # ║ Работает полностью без интернета ║ # ╚═══════════════════════════════════════════════════════╝ services: # ─── MQTT брокер — принимает данные от всех датчиков ─── mosquitto: image: eclipse-mosquitto:2.0 container_name: farmbox-mqtt restart: unless-stopped ports: - "1883:1883" # MQTT (датчики) - "9001:9001" # WebSocket (браузер) volumes: - ./mosquitto/mosquitto.conf:/mosquitto/config/mosquitto.conf - mosquitto-data:/mosquitto/data - mosquitto-logs:/mosquitto/log networks: - farmbox-net # ─── InfluxDB — хранение временных рядов датчиков ─── influxdb: image: influxdb:2.7 container_name: farmbox-influx restart: unless-stopped ports: - "8086:8086" environment: - DOCKER_INFLUXDB_INIT_MODE=setup - DOCKER_INFLUXDB_INIT_USERNAME=farmbox - DOCKER_INFLUXDB_INIT_PASSWORD=farmbox2024 - DOCKER_INFLUXDB_INIT_ORG=farm - DOCKER_INFLUXDB_INIT_BUCKET=sensors - DOCKER_INFLUXDB_INIT_ADMIN_TOKEN=farmbox-super-secret-token volumes: - influxdb-data:/var/lib/influxdb2 networks: - farmbox-net # ─── Node-RED — автоматизация и логика правил ─── nodered: image: nodered/node-red:3.1 container_name: farmbox-nodered restart: unless-stopped ports: - "1880:1880" environment: - TZ=Europe/Moscow volumes: - nodered-data:/data - ./nodered/flows.json:/data/flows.json depends_on: - mosquitto - influxdb networks: - farmbox-net # ─── Grafana — дашборды и графики ─── grafana: image: grafana/grafana:10.3.0 container_name: farmbox-grafana restart: unless-stopped ports: - "3001:3000" environment: - GF_SECURITY_ADMIN_USER=admin - GF_SECURITY_ADMIN_PASSWORD=farm2024 - GF_SERVER_ROOT_URL=http://localhost:3001 - GF_USERS_ALLOW_SIGN_UP=false volumes: - grafana-data:/var/lib/grafana - ./grafana/provisioning:/etc/grafana/provisioning depends_on: - influxdb networks: - farmbox-net # ─── IoT Bridge — мост MQTT → PostgreSQL + farm-cmms ─── iot-bridge: image: node:20-alpine container_name: farmbox-iot-bridge restart: unless-stopped working_dir: /app command: node bridge.js volumes: - ./iot-bridge:/app environment: - MQTT_HOST=mosquitto - MQTT_PORT=1883 - INFLUX_URL=http://influxdb:8086 - INFLUX_TOKEN=farmbox-super-secret-token - INFLUX_ORG=farm - INFLUX_BUCKET=sensors - FARM_CMMS_URL=http://host.docker.internal:3005 - FARM_CMMS_TOKEN=farmbox-iot-internal-token - TZ=Europe/Moscow depends_on: - mosquitto - influxdb extra_hosts: - "host.docker.internal:host-gateway" networks: - farmbox-net # ─── Sync Agent — синхронизация с облаком ─── sync-agent: image: node:20-alpine container_name: farmbox-sync restart: unless-stopped working_dir: /app command: node sync.js volumes: - ./sync-agent:/app - sync-queue:/app/queue environment: - LOCAL_CMMS_URL=http://host.docker.internal:3005 - CLOUD_CMMS_URL=https://to.zeroday.su - SYNC_INTERVAL_SEC=30 - FARM_ID=${FARM_ID:-farm_001} - FARM_NAME=${FARM_NAME:-Ферма 1} - SYNC_TOKEN=${SYNC_TOKEN:-changeme} - TZ=Europe/Moscow extra_hosts: - "host.docker.internal:host-gateway" networks: - farmbox-net # ─── Тома для хранения данных ─── volumes: mosquitto-data: mosquitto-logs: influxdb-data: nodered-data: grafana-data: sync-queue: # ─── Внутренняя сеть ─── networks: farmbox-net: driver: bridge