54 lines
2.9 KiB
Markdown
54 lines
2.9 KiB
Markdown
# CM4 Provisioning Dashboard
|
||
|
||
Flask web UI for CM4 eMMC provisioning: **public home** (deploy only) and **admin** (login required) for images, cloud-init, portal files, and users.
|
||
|
||
## Public home (`/`)
|
||
|
||
- **No login.** Anyone can:
|
||
- See current status (idle / connecting / flashing / backup / done / error).
|
||
- **Deploy** or **Backup** when a device is connected (USB boot or network).
|
||
- See which image is set as **golden** (used for Deploy).
|
||
- View recent log and “How to connect” steps.
|
||
|
||
Layout: compact two columns (status + deploy on the left; golden info, log, and connect on the right).
|
||
|
||
## Admin (`/admin`)
|
||
|
||
**Login required.** First user: open `/login`, enter any username and a password (min 6 characters) to create the first admin account.
|
||
|
||
Admin can:
|
||
|
||
- **Backup images** (in `backups/`): upload, rename, delete, shrink/compress, **set as golden**, download.
|
||
- **Cloud-init images** (in `cloudinit-images/`): list, set as golden, rename, delete, download.
|
||
- **Build cloud-init image**: download latest Raspberry Pi OS (arm64), inject cloud-init, edit user-data/meta-data/network-config, use templates. Output goes to cloud-init images; optionally set as golden after build.
|
||
- **Portal files** (in `portal-files/`): upload files that are served at `/files/<name>` so cloud-init can `wget` or `curl` them on first boot (e.g. `curl -fsSL "http://SERVER/files/bootstrap.sh" -o /tmp/bootstrap.sh`).
|
||
- **Golden image**: any backup or cloud-init image can be set as golden (no single “golden file”; choose from either list).
|
||
- **Admin users**: add users, change password.
|
||
- **Activity logs**: view recent admin actions.
|
||
|
||
Backup images and cloud-init images live in **separate folders** (`backups/` and `cloudinit-images/`).
|
||
|
||
## Run locally (development)
|
||
|
||
```bash
|
||
cd dashboard
|
||
pip install -r requirements.txt # Flask, werkzeug
|
||
python3 app.py
|
||
# Open http://localhost:5000 (home), http://localhost:5000/admin (login first)
|
||
```
|
||
|
||
## Run in LXC (Proxmox)
|
||
|
||
Deploy with `scripts/deploy-to-proxmox.sh`; it installs the dashboard and pushes `home.html`, `login.html`, `admin.html`. Optional: create `/opt/cm4-provisioning/dashboard.env` with `CM4_DASHBOARD_SECRET_KEY=<random>` so session logins persist across restarts (deploy script can create this automatically).
|
||
|
||
## Environment (optional)
|
||
|
||
- `CM4_PROVISIONING_DIR` – base path (default: `/var/lib/cm4-provisioning`).
|
||
- `CM4_BACKUPS_DIR` – backups directory (default: `…/backups`).
|
||
- `CM4_CLOUDINIT_IMAGES_DIR` – cloud-init built images (default: `…/cloudinit-images`).
|
||
- `CM4_PORTAL_FILES_DIR` – files served at `/files/` (default: `…/portal-files`).
|
||
- `CM4_GOLDEN_IMAGE` – path to golden image (symlink to chosen backup or cloud-init image).
|
||
- `CM4_DASHBOARD_SECRET_KEY` – secret for session cookies (set in production).
|
||
- `CM4_DASHBOARD_DB` – SQLite path for admin users and logs (default: `…/dashboard.db`).
|
||
- `CM4_STATUS_FILE`, `CM4_LOG_FILE`, etc. – as before for status and build.
|