diff --git a/README.md b/README.md index 978ac06..18f61f0 100644 --- a/README.md +++ b/README.md @@ -52,25 +52,43 @@ Everything is driven from the web UI, organized into **General**, **Meshtastic** ## Quick start -```bash -git clone https://github.com/zvx-echo6/meshai.git -cd meshai/work -pip install -e . -cp config.example.yaml config.yaml # then edit config.yaml (or use the dashboard) -meshai -``` +The dashboard is the primary way to configure MeshAI — connection, LLM backend, both transports, feeds, and routing. You shouldn't need to hand-edit YAML for a normal setup. -Or with Docker: +### Docker (recommended) ```bash mkdir -p meshai/data && cd meshai curl -O https://raw.githubusercontent.com/zvx-echo6/meshai/main/work/docker-compose.yml -curl -o data/config.yaml https://raw.githubusercontent.com/zvx-echo6/meshai/main/work/config.example.yaml -# edit data/config.yaml, then: docker compose up -d ``` -The dashboard comes up on `http://localhost:8080`. +On first boot MeshAI writes a minimal starter config into the `meshai_data` volume (`/data/config.yaml`, plus an empty `/data/secrets/.env`) and starts the dashboard — nothing to pre-seed. Open **`http://localhost:8080`** and configure everything from there. + +As you save settings, MeshAI persists them back into `/data` as focused per-domain YAML files (`llm.yaml`, `meshtastic.yaml`, `notifications.yaml`, `env_feeds.yaml`, …) alongside `config.yaml` — the same multi-file config system MeshAI uses in production; the dashboard is the intended way to drive it. API keys and other secrets you enter in the dashboard are written only to `/data/secrets/.env`, never into the YAML. + +### From source (pip) + +```bash +git clone https://github.com/zvx-echo6/meshai.git +cd meshai/work +pip install -e . +cp config.example.yaml config.yaml # minimal starting point, not exhaustive — see note below +meshai +``` + +Unlike Docker, `meshai` won't create a config file for you — it needs one to exist before it will start. `config.example.yaml` bootstraps the basics (connection, LLM backend, bot behavior); once it's running, open `http://localhost:8080` and use the dashboard for everything else. + +> **Note on `config.example.yaml`:** it documents the legacy single-file schema and is no longer complete — it predates `coverage`, `danger_zones`, `generic_sources`, `meshcore_context`, `commands`, and the current 8-family notification-routing model (`notifications.toggles` / `destinations` / `region_routes`). The legacy single-file loader still works and is fully supported, but the dashboard — backed by the full config schema — is the authoritative way to reach every setting. Don't treat this file as a complete reference. + +### Advanced: the split `/data/config/` layout + +Production and multi-operator deployments typically move to a fully split config directory — `/data/config/config.yaml` plus one file per domain, `local.yaml` for operator-identifying values, and `!include` orchestration — instead of the single flat file above. MeshAI loads this layout automatically whenever it's present. To convert an existing single-file install: + +```bash +docker compose exec meshai python -m meshai.scripts.migrate_config_v03 +``` + +This backs up the original `config.yaml`, splits it into `/data/config/`, extracts secrets to `/data/secrets/.env`, and verifies the new layout loads identically before finishing — restart the container afterward to pick it up. It's optional: the dashboard is fully functional against either layout. (Templates for building a split layout from scratch also ship in the repo's `work/config/` directory: `local.yaml.example`, `.env.example`.) --- diff --git a/work/Dockerfile b/work/Dockerfile index a2f5e48..b359201 100644 --- a/work/Dockerfile +++ b/work/Dockerfile @@ -72,6 +72,10 @@ COPY --chown=meshai:meshai meshai/ ./meshai/ COPY --from=frontend --chown=meshai:meshai /build/meshai/dashboard/static/ ./meshai/dashboard/static/ COPY --chown=meshai:meshai pyproject.toml . COPY --chown=meshai:meshai README.md . +# Reference only: docker-entrypoint.sh writes its own minimal default to +# /data/config.yaml on first boot and does NOT read this file. It's shipped +# for local/pip installs and anyone who wants the legacy single-file schema +# on hand inside the container (e.g. via `docker compose exec`). COPY --chown=meshai:meshai config.example.yaml . COPY --chown=meshai:meshai docker-entrypoint.sh . diff --git a/work/docker-compose.yml b/work/docker-compose.yml index ffcead4..e2b1e3a 100644 --- a/work/docker-compose.yml +++ b/work/docker-compose.yml @@ -6,10 +6,17 @@ # # Dashboard: http://localhost:8080 # -# Config is stored in the meshai_data volume at /data/config.yaml +# 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, edit config.yaml or use the dashboard +# For TCP connection, use the dashboard (or edit the YAML directly) services: meshai: diff --git a/work/docker-entrypoint.sh b/work/docker-entrypoint.sh index 979db11..74f311b 100755 --- a/work/docker-entrypoint.sh +++ b/work/docker-entrypoint.sh @@ -34,9 +34,6 @@ history: database: /data/conversations.db max_messages_per_user: 50 conversation_timeout: 86400 - auto_cleanup: true - cleanup_interval_hours: 24 - max_age_days: 30 memory: enabled: true