# Guide 05 — Sysadmin Panel (React + Vite, Cloud-hosted) ## Overview A simple web app hosted on your VPS alongside the cloud backend. Used exclusively by you (sysadmin) to manage all registered restaurant sites. Not used in day-to-day restaurant operations. --- ## Project Structure ``` sysadmin_panel/ ├── src/ │ ├── main.jsx │ ├── App.jsx │ ├── api/client.js # Points to CLOUD backend URL │ ├── store/authStore.js │ ├── pages/ │ │ ├── LoginPage.jsx │ │ ├── SitesPage.jsx # Home — list of all sites │ │ ├── SiteDetailPage.jsx │ │ └── RegisterSitePage.jsx │ └── components/ │ ├── SiteCard.jsx │ ├── LicenseStatus.jsx │ └── ConfirmModal.jsx └── package.json ``` --- ## Pages ### LoginPage - Username + password (full password, not PIN — this is your personal admin tool) - Redirects to SitesPage on success ### SitesPage - Cards or table of all registered sites - Each shows: name, owner, license expiry, last heartbeat, status (active/locked) - Color indicator: green (active, recent heartbeat) | yellow (no heartbeat >12h) | red (locked/expired) - "Register New Site" button - Click site → SiteDetailPage ### SiteDetailPage - Site info: name, owner, contact, site ID - License section: expiry date, "Extend License" button (date picker) - Status section: last heartbeat timestamp + IP, current lock status - Actions: - Lock Site (with reason input) → calls `POST /api/sites/:id/lock` - Unlock Site → calls `POST /api/sites/:id/unlock` - Delete/Deregister site (with confirmation) - Heartbeat history (last 10 check-ins): timestamp + IP ### RegisterSitePage - Form: restaurant name, owner name, contact email - On submit: calls `POST /api/sites` → displays the generated `site_id` and `secret_key` - **One-time display warning**: "Copy this secret key now. It will not be shown again." - These credentials are then configured in the local backend's environment --- ## UI Design Direction - **Theme**: Dark, utilitarian. This is your ops tool, not a customer-facing product. - **Accent**: Cyan or electric blue. Clear status colors (green/yellow/red) for site health. - **Density**: Compact. You want to see all sites at a glance. - No over-design needed — functional and clear is the goal. --- ## Deployment - Build with `vite build`, serve static files via nginx on your VPS - Or run as a separate Vite dev server proxied through nginx - Protect with nginx basic auth as an extra layer (optional but recommended)