- Podman runs the gateway container.
- Your host
fluffbuzzCLI is the control plane. - Persistent state lives on the host under
~/.fluffbuzzby default. - Day-to-day management uses
fluffbuzz --container <name> ...instead ofsudo -u fluffbuzz,podman exec, or a separate service user.
Prerequisites
- Podman in rootless mode
- FluffBuzz CLI installed on the host
- Optional:
systemd --userif you want Quadlet-managed auto-start - Optional:
sudoonly if you wantloginctl enable-linger "$(whoami)"for boot persistence on a headless host
Quick start
Run onboarding inside the container
Run
./scripts/run-fluffbuzz-podman.sh launch setup, then open http://127.0.0.1:18789/../scripts/podman/setup.shbuildsfluffbuzz:localin your rootless Podman store by default, or usesFLUFFBUZZ_IMAGE/FLUFFBUZZ_PODMAN_IMAGEif you set one.- It creates
~/.fluffbuzz/fluffbuzz.jsonwithgateway.mode: "local"if missing. - It creates
~/.fluffbuzz/.envwithFLUFFBUZZ_GATEWAY_TOKENif missing. - For manual launches, the helper reads only a small allowlist of Podman-related keys from
~/.fluffbuzz/.envand passes explicit runtime env vars to the container; it does not hand the full env file to Podman.
FLUFFBUZZ_PODMAN_QUADLET=1.
Optional build/setup env vars:
FLUFFBUZZ_IMAGEorFLUFFBUZZ_PODMAN_IMAGE— use an existing/pulled image instead of buildingfluffbuzz:localFLUFFBUZZ_DOCKER_APT_PACKAGES— install extra apt packages during image buildFLUFFBUZZ_EXTENSIONS— pre-install plugin dependencies at build time
--userns=keep-id and bind-mounts your FluffBuzz state into the container.
Onboarding:
http://127.0.0.1:18789/ and use the token from ~/.fluffbuzz/.env.
Host CLI default:
Podman + Tailscale
For HTTPS or remote browser access, follow the main Tailscale docs. Podman-specific note:- Keep the Podman publish host at
127.0.0.1. - Prefer host-managed
tailscale serveoverfluffbuzz gateway --tailscale serve. - On macOS, if local browser device-auth context is unreliable, use Tailscale access instead of ad hoc local tunnel workarounds.
Systemd (Quadlet, optional)
If you ran./scripts/podman/setup.sh --quadlet, setup installs a Quadlet file at:
- Start:
systemctl --user start fluffbuzz.service - Stop:
systemctl --user stop fluffbuzz.service - Status:
systemctl --user status fluffbuzz.service - Logs:
journalctl --user -u fluffbuzz.service -f
Config, env, and storage
- Config dir:
~/.fluffbuzz - Workspace dir:
~/.fluffbuzz/workspace - Token file:
~/.fluffbuzz/.env - Launch helper:
./scripts/run-fluffbuzz-podman.sh
FLUFFBUZZ_CONFIG_DIR->/home/node/.fluffbuzzFLUFFBUZZ_WORKSPACE_DIR->/home/node/.fluffbuzz/workspace
fluffbuzz.json, per-agent auth-profiles.json, channel/provider state,
sessions, and workspace survive container replacement.
The Podman setup also seeds gateway.controlUi.allowedOrigins for 127.0.0.1 and localhost on the published gateway port so the local dashboard works with the container’s non-loopback bind.
Useful env vars for the manual launcher:
FLUFFBUZZ_PODMAN_CONTAINER— container name (fluffbuzzby default)FLUFFBUZZ_PODMAN_IMAGE/FLUFFBUZZ_IMAGE— image to runFLUFFBUZZ_PODMAN_GATEWAY_HOST_PORT— host port mapped to container18789FLUFFBUZZ_PODMAN_BRIDGE_HOST_PORT— host port mapped to container18790FLUFFBUZZ_PODMAN_PUBLISH_HOST— host interface for published ports; default is127.0.0.1FLUFFBUZZ_GATEWAY_BIND— gateway bind mode inside the container; default islanFLUFFBUZZ_PODMAN_USERNS—keep-id(default),auto, orhost
~/.fluffbuzz/.env before finalizing container/image defaults, so you can persist these there.
If you use a non-default FLUFFBUZZ_CONFIG_DIR or FLUFFBUZZ_WORKSPACE_DIR, set the same variables for both ./scripts/podman/setup.sh and later ./scripts/run-fluffbuzz-podman.sh launch commands. The repo-local launcher does not persist custom path overrides across shells.
Quadlet note:
- The generated Quadlet service intentionally keeps a fixed, hardened default shape:
127.0.0.1published ports,--bind laninside the container, andkeep-iduser namespace. - It pins
FLUFFBUZZ_NO_RESPAWN=1,Restart=on-failure, andTimeoutStartSec=300. - It publishes both
127.0.0.1:18789:18789(gateway) and127.0.0.1:18790:18790(bridge). - It reads
~/.fluffbuzz/.envas a runtimeEnvironmentFilefor values such asFLUFFBUZZ_GATEWAY_TOKEN, but it does not consume the manual launcher’s Podman-specific override allowlist. - If you need custom publish ports, publish host, or other container-run flags, use the manual launcher or edit
~/.config/containers/systemd/fluffbuzz.containerdirectly, then reload and restart the service.
Useful commands
- Container logs:
podman logs -f fluffbuzz - Stop container:
podman stop fluffbuzz - Remove container:
podman rm -f fluffbuzz - Open dashboard URL from host CLI:
fluffbuzz dashboard --no-open - Health/status via host CLI:
fluffbuzz gateway status --deep(RPC probe + extra service scan)
Troubleshooting
- Permission denied (EACCES) on config or workspace: The container runs with
--userns=keep-idand--user <your uid>:<your gid>by default. Ensure the host config/workspace paths are owned by your current user. - Gateway start blocked (missing
gateway.mode=local): Ensure~/.fluffbuzz/fluffbuzz.jsonexists and setsgateway.mode="local".scripts/podman/setup.shcreates this if missing. - Container CLI commands hit the wrong target: Use
fluffbuzz --container <name> ...explicitly, or exportFLUFFBUZZ_CONTAINER=<name>in your shell. fluffbuzz updatefails with--container: Expected. Rebuild/pull the image, then restart the container or the Quadlet service.- Quadlet service does not start: Run
systemctl --user daemon-reload, thensystemctl --user start fluffbuzz.service. On headless systems you may also needsudo loginctl enable-linger "$(whoami)". - SELinux blocks bind mounts: Leave the default mount behavior alone; the launcher auto-adds
:Zon Linux when SELinux is enforcing or permissive.