Set up
Terminal and networks
The terminal
The board makes the SSH connection with its own key and passes it to the app over a WebSocket. The phone holds no SSH key and needs no route to your hosts. You pick the hosts with a Proxmox tag.
You need the Proxmox connection first.
1. Name the admins and the tag
Only members of oidc.groups.admins may open a terminal; without that group the terminal stays off.
oidc:
groups:
admins: admins
connections:
proxmox:
url: https://pve.example.com:8006
token_file: /secrets/proxmox_token
terminal_tag: terminal
2. Get the board's public key
Restart the board. On its first start with the terminal on, it makes an ed25519 key in data/alertboard/ssh_key and logs the public half:
docker compose restart alertboard
docker compose logs alertboard | grep public_key
The app shows it too, under More › Terminal, with a Copy button. The key stays the same across restarts and updates.
3. Let the board in on each host
Create the user the board logs in as, pidashboard, and allow the board's key, from the board's address only:
useradd -m -s /bin/bash pidashboard
install -d -m 700 -o pidashboard -g pidashboard ~pidashboard/.ssh
echo 'restrict,pty,from="<board address>" ssh-ed25519 AAAA… pidashboard' > ~pidashboard/.ssh/authorized_keys
chown pidashboard: ~pidashboard/.ssh/authorized_keys && chmod 600 ~pidashboard/.ssh/authorized_keys
Give pidashboard only the rights an admin's shell should have there. sudo, if any, is your choice per host.
4. Tag the guest in Proxmox
Give the VM or container the tag (any existing tag works). Within 10 minutes the app lists it by its Proxmox name, at:
- a VM: the address its QEMU guest agent reports, when the board may read it (below); else its cloud-init
ipconfigNaddress; - a container: its configured
ip=, else the address it has now.
An address counts only inside a network the board knows (below), so a guest can't point the board somewhere else. A host listed as “no address in a scanned network” reported an address outside them: add its network under scan.networks or in the app.
Guest agent addresses on Proxmox 9 (optional): a role with only VM.GuestAgent.Audit, per tagged VM, lets the board use the address the agent reports. The board never asks for rights that can read files or run commands in a guest.
pveum role add PidashboardAgent --privs VM.GuestAgent.Audit
pveum acl modify /vms/<vmid> --users pidashboard@pve --roles PidashboardAgent
5. Confirm the host's key
The first time, the app shows the SHA256 fingerprint of the host key the board scanned. Compare it on the host's own console:
ssh-keygen -lf /etc/ssh/ssh_host_ed25519_key.pub # a VM
pct exec <vmid> -- ssh-keygen -lf /etc/ssh/ssh_host_ed25519_key.pub # a container, on its node
If they match, tap Confirm key (Face ID). The host is refused until then, and refused again if its key changes later, until an admin confirms the new one.
Using it
More › Terminal, pick a host and pass Face ID. You get a full terminal with xterm colours and a key row with Esc, Tab, Ctrl, the arrows, Paste and Copy. A session ends when the app goes to the background, after 15 idle minutes or after 2 hours. Opening one needs a login of at most 5 minutes.
The tag is a trust decision. Whoever may set tags in Proxmox (VM.Config.Options) decides which hosts appear in the admins' list. The board connects only where authorized_keys holds its key, and only after a key is confirmed.
Networks
The board finds what is on your networks and the app lists the devices under More › Networks: address, name, open ports (SSH, web UI, Proxmox, Home Assistant, a NAS, …) and whether the last scan saw them. Tap a web port to open it. It scans, in this order:
- the networks under
scan.networksinconfig.yaml; - the networks an admin added in the app (More › Networks, +);
- with a Proxmox connection, the IPv4 subnets of the nodes' bridges and SDN vnets, plus the guests' own.
scan:
networks: # scanned besides the ones from Proxmox
- name: servers
cidr: 192.168.50.0/24 # IPv4, /22 or smaller, the network address
exclude: # found in Proxmox, but not scanned
- 192.168.99.0/24
- Each network is
/22or smaller, and at most sixteen/24s' worth are scanned. Past that the last ones in the order above are skipped, so a network you added by hand is never the one left out. - Each is scanned every 10 minutes on 12 common homelab ports. Pull down in the app to scan again.
- A VLAN on a trunk bridge without an address of its own is not found in Proxmox: add it under
scan.networksor in the app. - In the app, admins may add private ranges only; list any other in
config.yaml. Networks fromconfig.yamlcan't be changed in the app. - A device that drops every connection (a strict firewall) stays unseen. A device unseen for 7 days is dropped.