services: mosquitto: restart: unless-stopped image: eclipse-mosquitto ports: - 1883:1883 volumes: - ${REPO_DIR}/configurations/mosquitto/config:/mosquitto/config:rw - mosquitto-data:/mosquitto traefik: restart: unless-stopped image: traefik:v3.6.24 labels: - traefik.http.routers.dashboard.rule=Host(`traefik.pladijs`) - traefik.http.services.dashboard.loadbalancer.server.port=8080 volumes: - ${REPO_DIR}/configurations/traefik/traefik.yml:/etc/traefik/traefik.yml:ro - traefik-data:/var/lib/certificates - /var/run/docker.sock:/var/run/docker.sock extra_hosts: - host.docker.internal:host-gateway ports: - 80:80 - 443:443 whoami: restart: unless-stopped image: traefik/whoami labels: - traefik.http.routers.whoami.rule=Host(`whoami.pladijs`) - traefik.http.services.whoami.loadbalancer.server.port=2001 command: - --port=2001 homeassistant: build: context: . dockerfile: ./dockerfiles/home-assistant.Dockerfile network_mode: host labels: - traefik.http.routers.homeassistant.rule=Host(`homeassistant.pladijs`) - traefik.http.services.homeassistant.loadbalancer.server.url=http://host.docker.internal:8123 volumes: - homeassistant-data:/config - /run/dbus:/run/dbus:ro cap_add: - NET_ADMIN - NET_RAW restart: unless-stopped env_file: - environment-variables/local.env - environment-variables/production.env syncthing: image: syncthing/syncthing labels: - traefik.http.routers.syncthing.rule=Host(`syncthing.pladijs`) - traefik.http.services.syncthing.loadbalancer.server.port=8384 environment: - PUID=1000 - PGID=1000 - TZ=Europe/London volumes: - syncthing-data:/var/syncthing node-exporter: image: prom/node-exporter:latest container_name: node-exporter restart: unless-stopped volumes: - /proc:/host/proc:ro - /sys:/host/sys:ro - /:/rootfs:ro command: - '--path.procfs=/host/proc' - '--path.rootfs=/rootfs' - '--path.sysfs=/host/sys' - '--collector.filesystem.mount-points-exclude=^/(sys|proc|dev|host|etc)($$|/)' labels: - traefik.http.routers.node-exporter.rule=Host(`node-exporter.pladijs`) - traefik.http.services.node-exporter.loadbalancer.server.port=9100 prometheus: image: prom/prometheus:latest container_name: prometheus restart: unless-stopped labels: - traefik.http.routers.prometheus.rule=Host(`prometheus.pladijs`) - traefik.http.services.prometheus.loadbalancer.server.port=9090 volumes: - ${REPO_DIR}/configurations/prometheus/prometheus.yml:/etc/prometheus/prometheus.yml:ro - prometheus-data:/prometheus:rw command: - '--config.file=/etc/prometheus/prometheus.yml' - '--storage.tsdb.path=/prometheus' - '--web.console.libraries=/etc/prometheus/console_libraries' - '--web.console.templates=/etc/prometheus/consoles' - '--web.enable-lifecycle' grafana: restart: unless-stopped image: grafana/grafana:latest volumes: - grafana-data:/var/lib/grafana env_file: - environment-variables/local.env - environment-variables/production.env labels: - traefik.http.routers.grafana.rule=Host(`grafana.pladijs`) - traefik.http.services.grafana.loadbalancer.server.port=3000 influxdb: container_name: influxdb labels: - traefik.http.routers.influxdb.rule=Host(`influxdb.pladijs`) - traefik.http.services.influxdb.loadbalancer.server.port=8086 image: influxdb restart: unless-stopped environment: - TZ=Europe/Brussels - DOCKER_INFLUXDB_INIT_MODE=setup env_file: - environment-variables/local.env - environment-variables/production.env volumes: - ${STORAGE_DIR}/influxdb/data:/var/lib/influxdb2 - influxdb-data:/etc/influxdb2 ulimits: nofile: soft: 32768 hard: 32768 otel-collector: container_name: otel-collector image: otel/opentelemetry-collector-contrib:0.111.0 restart: unless-stopped volumes: - ${REPO_DIR}/configurations/otel/collector-config.yaml:/etc/otelcol-contrib/config.yaml # Only enable if external services present # ports: # - 4317:4317 # OTLP gRPC receiver smappee-api: build: ./smappee-api env_file: - .env.smappee labels: - traefik.http.routers.smappee.rule=Host(`smappee.pladijs`) - traefik.http.services.smappee.loadbalancer.server.port=8080 restart: unless-stopped energy-management: build: context: ./energy-management labels: - traefik.http.routers.energymanagement.rule=Host(`energymanagement.pladijs`) - traefik.http.services.energymanagement.loadbalancer.server.port=3000 environment: DB_PATH: /app/data/energy.db # InfluxDB 2.x INFLUX_URL: http://influxdb.pladijs INFLUX_TOKEN: f9YTt1XmjUwtYuM1JXKyHaXU3D1NH3aRxf3jcP2cEyD0IfPmM-_Im35VpIAPct7oWKjk261rX5uzrQ4ue4tJFw== INFLUX_ORG: homeassistant INFLUX_BUCKET: homeassistant # Measurement/field that holds live power draw for the whole house INFLUX_FIELD: value # Unit of INFLUX_FIELD as stored in Influx: W or kW INFLUX_FIELD_UNIT: W INFLUX_DOMAIN: sensor INFLUX_ENTITY_ID: p1_meter_power # Home Assistant HA_URL: http://homeassistant.pladijs HA_TOKEN: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiIxZjlhYzBjYjlkZDE0YWEzYWFhMzVjMzU2Y2VkM2U5MCIsImlhdCI6MTc4NzA4MjEyNywiZXhwIjoyMTAyNDQyMTI3fQ.W6MF78ZPiXF-__GmlFK2D-3vwYGEI3eEgouxw007D64 # Capacity tariff target: keep every 15-minute block's average under this many kW TARGET_KW: 4 # Optional PORT: 3000 CONTROL_LOOP_INTERVAL_MS: 10000 SOLAR_INFLUX_MEASUREMENT: power SOLAR_INFLUX_DOMAIN: sensor SOLAR_INFLUX_ENTITY_ID: sb4_0_1av_41_812_pv_power SOLAR_INFLUX_FIELD: value SOLAR_INFLUX_FIELD_UNIT: W SOLAR_PRODUCTION_THRESHOLD_W: 400 volumes: - energy-management-data:/app/data - /run/dbus:/run/dbus:ro cap_add: - NET_ADMIN - NET_RAW restart: unless-stopped volumes: prometheus-data: influxdb-data: grafana-data: homeassistant-data: mosquitto-data: traefik-data: syncthing-data: energy-management-data: