146 lines
4.4 KiB
YAML
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
|