Files
Homelab-manager/ROLES.md
T
bobbanandClaude Sonnet 5 236b1da0dc Add a Network > Ports page: agent-reported ports plus manual openings
Summarizes every server's agent-reported listening ports in one
cross-server table (grouped by protocol+port, addresses merged,
loopback-only flagged) - previously this only existed per-server on
each server's own detail page.

Adds a second table for ports this app has no way to see on its own:
manually-recorded openings on a router, edge firewall, or cloud
security group, each with a label, external port/protocol, an optional
link to a tracked server (with its own internal port when NAT changes
it) or a freeform destination, a free-text source, and a comment.
Viewer-readable; adding/editing/deleting needs operator or admin.

The agent-port grouping logic (dedupe by protocol+port, detect
loopback-only sockets) was shared with the existing per-server Ports
card via a new agentPorts.ts service instead of duplicating it.

Verified with a real HTTP-level test: a genuine Express app with the
actual routers, a scratch SQLite DB, and forged admin/viewer sessions,
covering grouping correctness, the server-name join, input validation,
and role enforcement - the real dev DB was confirmed untouched.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-29 23:48:35 +02:00

85 lines
3.8 KiB
Markdown

# Roles & menu access
Homelab Manager has three roles, ranked lowest to highest: **viewer**,
**operator**, **admin**. The first person to sign in becomes admin;
everyone after that starts as viewer until an admin changes their role
under **Administration → Users**.
A role can do everything the roles below it can, plus what's listed for
it — operator includes everything viewer has, admin includes everything
operator has.
## Sidebar menu, by role
✅ = the menu item appears for that role · ❌ = it's hidden entirely (not
just disabled) — a group that would end up with zero visible items
disappears too, and a group left with exactly one just shows as that
page's own top-level link.
| Menu item | Path | Viewer | Operator | Admin |
|---|---|:---:|:---:|:---:|
| Dashboard | `/` | ✅ | ✅ | ✅ |
| **Infrastructure** | | | | |
| Servers | `/servers` | ✅ | ✅ | ✅ |
| Proxmox | `/proxmox` | ✅ | ✅ | ✅ |
| Synology | `/synology` | ✅ | ✅ | ✅ |
| Proxmox Backup | `/pbs` | ✅ | ✅ | ✅ |
| Docker | `/docker` | ✅ | ✅ | ✅ |
| Tailscale | `/tailscale` | ✅ | ✅ | ✅ |
| **Network** | | | | |
| DNS | `/dns` | ✅ | ✅ | ✅ |
| Domains | `/domains` | ✅ | ✅ | ✅ |
| IP Addresses | `/ipam` | ✅ | ✅ | ✅ |
| Ports | `/ports` | ✅ | ✅ | ✅ |
| Consistency | `/consistency` | ✅ | ✅ | ✅ |
| **Automation** | | | | |
| Semaphore | `/semaphore` | ✅ | ✅ | ✅ |
| Gitea | `/gitea` | ✅ | ✅ | ✅ |
| Secrets | `/secrets` | ✅ | ✅ | ✅ |
| **Operations** | | | | |
| Maintenance | `/maintenance` | ✅ | ✅ | ✅ |
| Uptime Kuma | `/uptime-kuma` | ✅ | ✅ | ✅ |
| osTicket | `/osticket` | ✅ | ✅ | ✅ |
| Generator | `/generator` | ✅ | ✅ | ✅ |
| **Administration** | | | | |
| Integrations | `/integrations` | ✅ | ✅ | ✅ |
| Users | `/users` | ❌ | ❌ | ✅ |
| Sessions | `/sessions` | ❌ | ❌ | ✅ |
| Audit Log | `/audit-log` | ❌ | ✅ | ✅ |
| Diagnostic Log | `/diag-log` | ❌ | ❌ | ✅ |
| Settings | `/settings` | ❌ | ❌ | ✅ |
| Privacy (footer link, not in a group) | `/privacy` | ✅ | ✅ | ✅ |
So in practice: **every page is visible to every role except the five
under Administration** — Users, Sessions, and Diagnostic Log need admin;
Audit Log needs operator or admin; Settings needs admin.
## Being able to see a page isn't the same as being able to change things
Almost every page above is visible to viewers, but most of the buttons
on them aren't — a viewer can look at everything but can't act on
anything. Operators can use the page's normal working actions (starting
a container, syncing DNS, adding a secret, opening a maintenance
window…). Some actions on otherwise-viewer-visible pages are held back
even further, to admin only:
- **Integrations & DNS providers**: any operator can use an integration
once it's configured (start/stop a guest, run a template, sync DNS
records, etc.), but adding, editing, testing, or deleting an
integration or DNS provider is admin-only.
- **Servers**: registering a new server, rotating its agent token, and
editing/deleting a server are admin-only; tagging a server and
linking/unlinking it to a Proxmox guest just need operator.
- **Tags**: creating, renaming, recoloring, or deleting a tag is
admin-only (applying an existing tag to a server needs operator).
- **Ports**: everyone can see both the agent-reported and manual tables;
adding, editing, or deleting a manual port opening needs operator.
- Everything under **Settings** (notification channels, badge colors,
display prefs, log retention, backup/restore) is admin-only, matching
the page itself being admin-only.
If you need the exact role for one specific button rather than this
summary, check the corresponding route in `server/src/routes/` — each
one that needs more than "signed in" calls `requireRole("operator")` or
`requireRole("admin")` right where that action is defined.