App 2.16.0, server 2.6.0: over-the-air updates from our own repository
The car updates itself again, from this fork's own releases, while the repository stays private: - publish-car (flake) creates the pre-release car-<version> on the forge and attaches the APK and its .sha256. It needs a forge token that may write releases, from ~/.config/nilsmg4/forge-token or $FORGE_TOKEN; it is sent in a header and never printed. - The server relays releases and attachments (/v1/app/releases, /v1/app/assets/...), read with a read-only FORGE_TOKEN from its Secret, GitHub-shaped with download URLs back at itself. Redirects away from the forge are not followed; off (404) without a token. - The app asks its server with its own paired token, allows exactly the server's host, downloads the APK itself instead of through the DownloadManager (so the token stays in the app), verifies SHA-256 and package name, and tries a PackageInstaller session (it may install silently as the system user) before falling back to Downloads. OTA.md is rewritten for this flow; the k8s and server READMEs explain the new token. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01QLJfZQZeAKAwSqViTmLzki
This commit is contained in:
@@ -70,12 +70,6 @@ tyre pressures, GPS (lat, lon, elevation, heading) and the is_* flags. It does *
|
||||
|
||||
## To do
|
||||
|
||||
- [ ] **Re-enable OTA updates against our own releases.** `RELEASES_API` in
|
||||
`app/src/unstable/java/com/evsuite/abrp/OtaUpdater.java` points at `updates.invalid` on purpose,
|
||||
so checks fail. The updater speaks the GitHub releases API and only allows GitHub hosts
|
||||
(`ALLOWED_HOSTS`). For git.stinnesbeck.com it needs the host on the allowlist, and the
|
||||
response parsing checked against that server's releases API. Release assets must be named
|
||||
`NilsMG4-unstable-<version>.apk` with a `.sha256` sidecar (`build-car` writes both).
|
||||
- [ ] **Grafana high availability needs another database.** Grafana keeps its own state (users,
|
||||
sessions, preferences, provisioned-dashboard records, alerting state) in SQLite at
|
||||
`/var/lib/grafana/grafana.db` on the `grafana-data` PVC. That is fine for one replica, and is
|
||||
@@ -115,6 +109,13 @@ tyre pressures, GPS (lat, lon, elevation, heading) and the is_* flags. It does *
|
||||
INGEST_TOKEN) into git and pushed it. Commit amended and force-pushed; both values regenerated in
|
||||
the now gitignored `k8s/secrets.yaml` (since moved to `k8s/secrets/secrets.yaml`, outside
|
||||
`kubectl apply -f k8s/`). Filled-in secrets live only there from now on.
|
||||
- 2026-10-18 — App 2.16.0, server 2.6.0: over-the-air updates from this repository. `publish-car`
|
||||
creates the pre-release `car-<version>` on the private forge with the APK and its `.sha256`;
|
||||
the server relays releases and attachments to the car (`/v1/app/…`, read with a read-only
|
||||
`FORGE_TOKEN`); the app checks them through its server with its own token, allows exactly the
|
||||
server's host, downloads itself (no DownloadManager, so the token stays in the app), verifies
|
||||
SHA-256 and package, and tries a PackageInstaller session before falling back to Downloads.
|
||||
`OTA.md` rewritten for this flow. Not yet tried on the car.
|
||||
- 2026-10-18 — App 2.15.0: unsent live samples survive a restart. The queue is saved to
|
||||
`files/telemetry_queue.json` (AtomicFile) at most every 5 minutes and only after a change, and
|
||||
at once when the service stops; it is restored, in order and within its 2000-sample cap, when
|
||||
|
||||
Reference in New Issue
Block a user