2.6 KiB
2.6 KiB
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)
- Lock Site (with reason input) → calls
- Heartbeat history (last 10 check-ins): timestamp + IP
RegisterSitePage
- Form: restaurant name, owner name, contact email
- On submit: calls
POST /api/sites→ displays the generatedsite_idandsecret_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)