# MeshAI Docker Compose Configuration
#
# Usage:
#   docker compose up -d                  # Start the bot + dashboard
#   docker compose logs -f                # View logs
#
# Dashboard: http://localhost:8080
#
# Config lives in the meshai_data volume. On first boot MeshAI writes a
# starter single file at /data/config.yaml (that's the legacy fallback
# layout, not the primary one) plus an empty /data/secrets/.env; configure
# everything from the dashboard from there. MeshAI also supports a fully
# split /data/config/ directory (config.yaml + one file per domain) and
# prefers it automatically when present -- see README's "Advanced" section
# for the migration path. Secrets always live in /data/secrets/.env, never
# in the YAML.
#
# For serial connection (USB), uncomment the devices section below
# For TCP connection, use the dashboard (or edit the YAML directly)

services:
  meshai:
    # Pull from GitHub Container Registry
    # image: ghcr.io/zvx-echo6/meshai:latest

    # Uncomment to build locally instead of pulling
    build:
      context: .
      dockerfile: Dockerfile
    #   args:
    #     UID: ${UID:-1000}
    #     GID: ${GID:-1000}

    container_name: meshai
    restart: unless-stopped

    # Resolve external HTTP feeds via the LXC host's working resolver
    # (Tailscale MagicDNS, 100.100.100.100). The Docker daemon default
    # of 1.1.1.1/8.8.8.8 is unreachable from this container's NAT egress,
    # which silently broke NWS/SWPC/meshview hostname resolution.
    dns:
      - 100.100.100.100
      - 1.1.1.1

    # Uncomment for USB serial connection to Meshtastic device
    # devices:
    #   - /dev/ttyUSB0:/dev/ttyUSB0
    #   - /dev/ttyACM0:/dev/ttyACM0

    ports:
      # Dashboard API
      - "8080:8080"

    volumes:
      # Persistent data (database, config)
      - meshai_data:/data

    # Allocate a TTY for cleaner log output
    stdin_open: true
    tty: true

    environment:
      # API key can be set here or in config.yaml
      - LLM_API_KEY=${LLM_API_KEY:-}
      # Staged cutover: categories fully migrated to the new formatter+decider
      # pipeline.  Append new categories here as they clear shadow bake.
      - MESHAI_CUTOVER_CATEGORIES=earthquake_event,geomagnetic_storm,rf_propagation_alert,avalanche_warning,avalanche_watch,weather_warning,weather_statement,weather_watch,weather_advisory,work_zone,road_incident,road_closure,traffic_congestion,stream_flow,wildfire_declared,wildfire_incident,wildfire_closed

    # Limit resources
    deploy:
      resources:
        limits:
          memory: 3G
        reservations:
          memory: 64M

    healthcheck:
      test: ["CMD-SHELL", "curl -f -s -o /dev/null http://localhost:8080/ || exit 1"]
      interval: 30s
      timeout: 10s
      retries: 3
      start_period: 240s

    logging:
      driver: "json-file"
      options:
        max-size: "10m"
        max-file: "3"


volumes:
  meshai_data:
    name: meshai_data

networks:
  default:
    name: meshai_network
