Command Line¶
Everything the admin panel does, the bambuddy-appliance command does too — the panel is a thin layer over this CLI, so there is exactly one code path that touches the appliance's state.
SSH is enabled by default:
Most subcommands need root. Prefix them with sudo.
Status and restart¶
bambuddy-appliance status # docker compose ps
bambuddy-appliance restart # restart the Bambuddy stack
Upgrades¶
# Health-checked, with automatic rollback if it doesn't come up
sudo bambuddy-appliance upgrade-bambuddy v0.2.5
# The appliance layer: wizard, panel, CLI, units. Also health-checked.
sudo bambuddy-appliance upgrade-check-appliance # is there one? (JSON)
sudo bambuddy-appliance upgrade-appliance
# Debian packages. No rollback.
sudo bambuddy-appliance upgrade-os
# The current job's phase, as JSON
bambuddy-appliance upgrade-status
Only one upgrade may run at a time; a second one exits rather than racing the first. Jobs run detached, so an SSH disconnect mid-upgrade doesn't kill them — reconnect and poll upgrade-status.
See Updates & Backups for what each lane can and cannot undo.
Network aliases¶
Extra addresses on the LAN interface, one per virtual printer that needs its own.
bambuddy-appliance net-aliases # list, as JSON
sudo bambuddy-appliance net-alias-add 192.168.1.50/24
sudo bambuddy-appliance net-alias-remove 192.168.1.50/24
Aliases are additive and persist across reboots. The primary DHCP address, the gateway, and the interface's own configuration are never modified — by design, so this command cannot strand the appliance off its network.
Addresses in reserved ranges are rejected before anything is applied.
Tailscale¶
sudo bambuddy-appliance tailscale up # prints a sign-in URL
bambuddy-appliance tailscale status # tailnet IP, as JSON
sudo bambuddy-appliance tailscale down # disconnect, stay logged in
sudo bambuddy-appliance tailscale logout # forget the tailnet entirely
tailscale up prints a URL to open in a browser. Tailscale's own page handles first-time sign-up, so no console access or API key is needed. Once connected, status reports the 100.x address to paste into a slicer.
The admin password¶
Reads the new password from standard input rather than an argument, so it never lands in ps, your shell history, or a process listing. On a terminal it prompts; in a script, pipe it:
Only the hash is stored, in /etc/bambuddy/admin-auth. This is the same password the setup wizard sets, and it secures the admin panel, the console, and SSH.
Licence and registration¶
bambuddy-appliance license # key set? entitled until when? refused why?
sudo bambuddy-appliance license XXXXX-XXXXX-XXXXX-XXXXX
Setting a key stores it and asks the registrar straight away, so a mistyped key is answered now rather than on a timer. The key itself is never printed back — this output ends up in support bundles.
Claims the unit with the fleet registrar, or sends a heartbeat if it is already claimed. An hourly timer does this in the background; you should not normally need to call it by hand.
On a self-built image the command does nothing at all: with no batch identifier and no licence key there is nothing to present, so it exits without contacting anything.
Files it owns¶
| Path | What |
|---|---|
/etc/bambuddy/bambuddy.env | Runtime environment for the Bambuddy container |
/etc/bambuddy/docker-compose.yml | The pinned container tag |
/etc/bambuddy/docker-compose.override.yml | Yours to write — e.g. bind-mounting extra file-manager roots |
/etc/bambuddy/admin-auth | Admin panel password hash |
/etc/bambuddy/provisioning.json | The batch identifier the image was built with, if any |
/var/lib/bambuddy/ | Bambuddy's database and uploads |
/var/lib/bambuddy/registrar/ | Identity, credential, licence key and the registrar's last answers — see Registration |
Don't hand-edit the compose file's image tag
upgrade-bambuddy rewrites it, and it is how the appliance knows what to roll back to.