- Add Flask-Login browser session auth (separate from device X-Api-Key auth)
- modules/user_auth.py: User model, require_login decorator, bcrypt helpers
- /login with CSRF token, /logout
- scripts/create_user.py to provision admin user
- Add server-side trip computation from tracking_points
- db.compute_trips_for_device(): gap > 5 min = new trip, haversine distance,
upserts into trips table, auto-triggered in bg thread after each upload batch
- db.list_trips(), db.get_trip_route(): same JSON shape as Pi API
- db.get_overview_stats(): aggregated totals for overview page
- db.list_dashcam_files(), db.get_dashcam_file(): browse/stream helpers
- Add web portal to server/app.py
- Overview page (/): stat cards + recent trips + recent clips
- Trip history (/history): reuses Pi history.js + data-list.js unchanged
via /api/trips + /api/trip/<id> compatibility aliases
- Dashcam archive (/dashcam): file list + inline video player
- /api/v1/portal/dashcam/stream/<id>: Range-request streaming, path traversal guard
- /api/geocode: same Nominatim→reverse_geocoder offline fallback as Pi
- Add server templates (server/templates/)
- base.html: shared shell with 'Remote server' badge in sidebar + mobile topbar
- login.html, index.html, history.html, dashcam.html, components.html
- DB schema: users + trips tables added to init.sql (fresh deploys) +
migrate_phase24.sql (existing deployments)
- Infrastructure: Dockerfile uses repo-root build context to copy shared
static/ assets; docker-compose updated; SECRET_KEY + DEVICE_NAME in .env;
requirements: Flask-Login, bcrypt, reverse_geocoder
Co-authored-by: Copilot <[email protected]>
30 lines
1.1 KiB
Bash
30 lines
1.1 KiB
Bash
# Copy this file to .env and fill in real values before running
|
|
# `docker compose up -d`. .env itself is gitignored - never commit real
|
|
# credentials.
|
|
|
|
# Postgres credentials (internal to the compose network only, never exposed
|
|
# to the LAN/internet - pick any strong password).
|
|
POSTGRES_DB=yarisobd
|
|
POSTGRES_USER=yarisobd
|
|
POSTGRES_PASSWORD=changeme
|
|
|
|
# Host port the Flask API is published on (this is what you point the
|
|
# Cloudflare Tunnel / router port-forward at).
|
|
API_PORT=8098
|
|
|
|
# Where Postgres data + uploaded dashcam files are stored on the unraid host.
|
|
# Recommended: a path on the array, e.g. /mnt/user/appdata/yaris-obd-server
|
|
DATA_DIR=./data
|
|
|
|
# Reject dashcam uploads larger than this (MB). Bump if your dashcam
|
|
# produces very large individual clips.
|
|
MAX_DASHCAM_UPLOAD_MB=2048
|
|
|
|
# Secret key for browser sessions (login cookies). Generate with:
|
|
# python -c "import secrets; print(secrets.token_hex(32))"
|
|
SECRET_KEY=changeme_generate_a_real_secret_key
|
|
|
|
# The device name registered in the devices table - used by the portal to
|
|
# scope all queries to the right Pi.
|
|
DEVICE_NAME=yaris-2013
|