Files
farmbox/docker-compose.yml
T

146 lines
4.4 KiB
YAML

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