feat: add multi-device provisioning and local remote-config UI

- add multi-device portal device management, key rotation, and sync request APIs
- add Pi settings UI for remote server URL, device name, and API key
- add local test-connection and sync-now actions
- make upload and config sync reuse dynamic shared credentials
- add Phase 25.5c migration and docs updates

Co-authored-by: Copilot <[email protected]>
This commit is contained in:
Mathieu Moran
2026-08-10 18:02:09 -04:00
co-authored by Copilot
parent fbc41a5db5
commit ba682fbf3a
23 changed files with 1357 additions and 167 deletions
+13 -3
View File
@@ -68,7 +68,9 @@ so a permissive origin can't be used to steal a logged-in session.
5. Sign in to the remote portal and open `/settings/device` to edit the synced
owner/car/device/avatar values for the configured `DEVICE_NAME`. If the Pi
has local **Sync with server** enabled, those values hot-reload into the
running Pi UI after the next successful sync.
running Pi UI after the next successful sync. Phase 25.5c also adds a
multi-device list, one-time API-key reveal, key rotation, and a request-sync
action on that page.
### Upgrading an existing unraid deployment
@@ -79,6 +81,7 @@ again automatically. After pulling new code, apply the new migrations manually:
cd /mnt/user/app/git/yaris-obd/server
docker compose exec db psql -U yarisobd -d yarisobd -f /docker-entrypoint-initdb.d/migrate_phase24.sql
docker compose exec db psql -U yarisobd -d yarisobd -f /docker-entrypoint-initdb.d/migrate_phase25_5a.sql
docker compose exec db psql -U yarisobd -d yarisobd -f /docker-entrypoint-initdb.d/migrate_phase25_5c.sql
docker compose up -d --build
```
@@ -99,8 +102,15 @@ docker compose exec api python3 scripts/create_device.py yaris-2013
This prints a one-time API key — copy the `YARIS_DEVICE_NAME` /
`YARIS_API_KEY` values into the Pi's upload-client config. Only the
key's sha256 hash is stored server-side; the raw key is never shown again
(re-run the script with the same device name to rotate/replace the key).
key's sha256 hash is stored server-side; the raw key is never shown again.
The browser portal at `/settings/device` can now do the same workflow without
shell access:
- create a new device
- reveal a one-time API key
- rotate the API key later
- request a sync for the selected device
## Exposing it outside the LAN