Add ports mapping (api:3000, ml:8000, node_exporter:9100) bound to
TS_IP env var (default 0.0.0.0). Inject TS_IP via deploy GH Action.
Why: containers had no host port mapping → Prometheus on telemetry
VPS (imrnes) could not scrape metrics via Tailscale IP.
Co-Authored-By: Claude <noreply@anthropic.com>
- Add scripts/generate-icons.js using sharp to convert SVG to PNG
at all Android density buckets (mdpi 48→xxxhdpi 192)
- Add sharp as devDependency
- Update CI workflow to run icon generation after tauri android init
- Replaces Tauri's default icons with ZeaVis Edu logo
Co-Authored-By: Claude <noreply@anthropic.com>
Add GOOGLE_CLIENT_ID, GOOGLE_CLIENT_SECRET, and GOOGLE_REDIRECT_URI
to the deploy workflow so the API can use Google OAuth on production.
Co-Authored-By: Claude <noreply@anthropic.com>
Containers need time to start after docker compose up -d. Replaced
instant grep check with up-to-60s retry loop.
Co-Authored-By: Claude <noreply@anthropic.com>
Build and Deploy: workspace has 4 members (api/web/shared/tauri) but
Dockerfiles only copied 3 package.json files. Missing tauri workspace
member caused bun install --production to fail with frozen lockfile
error.
Build Android APK:
- Remove explicit NDK 28 install (runner has NDK 29 pre-installed, dual
NDK presence broke ANDROID_NDK_HOME resolution)
- Auto-pin NDK version from runner's SDK
- rm -rf gen/android before tauri android init (stale cache recovery)
- Remove gen/android/.gradle from Gradle cache (causes stale state)
- Use --apk flag for faster APK-only build
Co-Authored-By: Claude <noreply@anthropic.com>
Cache Bun dependencies (install cache + node_modules) and Gradle caches
(wrapper, dependencies, build artifacts) to dramatically speed up CI builds.
Gradle key uses Cargo.lock since gradle files don't exist at checkout time.
Co-Authored-By: Claude <noreply@anthropic.com>
Tag created by softprops/action-gh-release is the single source of truth.
Version bump in tauri.conf.json + Cargo.toml is local to the build only.
Co-Authored-By: Claude <noreply@anthropic.com>
- Compute version from latest git tag (bump patch)
- Update tauri.conf.json and Cargo.toml with new version
- Create GitHub Release with signed APK + AAB via softprops/action-gh-release
- Release name: v{version}, APK filename: zeavis-edu-v{version}.apk
Co-Authored-By: Claude <noreply@anthropic.com>
- Trigger on push to main (web/tauri/shared changes), PR, and manual
- Builds Vite frontend + Tauri Rust for 4 Android arches
- Signs APK with keystore from GitHub secrets
- Uploads signed APK + AAB as artifact
Co-Authored-By: Claude <noreply@anthropic.com>
Files on HF hub sit at repo root (model.onnx, etc.),
not in model/ subfolder. Fix download script to copy
each file to the correct subdirectory expected by Docker.
Co-Authored-By: Claude <noreply@anthropic.com>
- No need to install TensorFlow (3GB) — just pip install huggingface_hub
- Download pre-built model.onnx directly (saved from notebook export)
- Cuts CI time from ~10 min to ~30 seconds
Co-Authored-By: Claude <noreply@anthropic.com>
- Verify HF_TOKEN exists before attempting download
- Group CI log output for readability
- Use os.environ['HF_TOKEN'] instead of .get() to fail fast
Co-Authored-By: Claude <noreply@anthropic.com>
- Remove binary model artifacts tracked in repo (.tflite, saved_model, tfjs model.json)
- CI now downloads best_model.keras from Hugging Face Hub (MythEclipse2737/corn-leaf-disease-classifier)
- Add save_model.py step before convert_onnx.py in CI pipeline
- Remove LFS patterns from .gitattributes (no longer needed)
- Remove lfs:true from checkout action
The model is fetched at CI time using HF_TOKEN secret — no large
binary files stored in git.
Co-Authored-By: Claude <noreply@anthropic.com>
Transition telemetry dashboard integration from an external URL approach to a local reverse proxy via Nginx. This simplifies client-side connectivity by routing all telemetry requests through the existing web server's domain.
- Configure Nginx to proxy `/telemetry/` sub-paths to the internal telemetry service
- Implement `sub_filter` in Nginx to rewrite root-relative paths for the SPA
- Remove `VITE_TELEMETRY_URL` build arguments and environment variable dependencies
- Simplify `TelemetryPage` to use a relative `/telemetry` base path
- Clean up deployment workflows and Dockerfile by removing unused telemetry build args
Replace the hardcoded Nginx proxy configuration with a dynamic environment variable approach. This allows the telemetry dashboard to be loaded via a public URL instead of relying on a local Tailscale proxy.
- Add `VITE_TELEMETRY_URL` build argument to Dockerfile
- Pass `VITE_TELEMETRY_URL` through GitHub Actions deployment workflow
- Remove `/telemetry/` location block from nginx.conf
- Update `TelemetryPage` to use the new environment variable and improve iframe loading state management
App services reference telemetry-net as external, but telemetry runs
on a separate VPS. Creating the network as empty on the app VPS so
docker compose up doesn't fail.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Switches from git pull --ff-only to git fetch + git reset --hard
origin/main to avoid failing when VPS has uncommitted local changes
to tracked files (apps/ml-service/Dockerfile, docker-compose.yml).
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>