Bambuddy self-host on the tailnet — deployment plan

Self-host Bambuddy (open-source Bambu Lab control plane — monitoring, queue, archive, virtual-printer proxy) on telep-mainframe, exposed on the Tailscale tailnet, replacing Bambu’s cloud for the Bambu Lab H2S + AMS 2 Pro. Ref: bambuddy.cool · Tailscale blog. Related: 3d-printing · telep-mainframe-handover · telep-mainframe · telep-router.

What it is / why

Bambuddy is a Docker self-hosted control plane for Bambu Lab printers. It connects to the printer over the LAN via Developer/LAN Mode (MQTT + FTPS, using the printer’s access code — no firmware mod, no Bambu cloud). It presents virtual printers that OrcaSlicer discovers and prints to. The Tailscale angle: Bambuddy reads the host’s tailnet IP and advertises the virtual printers on it, so OrcaSlicer on the Mac connects over the tailnet, encrypted.

Slicer note: OrcaSlicer/Bambu Studio (the “slicer”) is a desktop app that turns 3D models into print files. It is NOT installed on the server — it runs on the Mac and talks to Bambuddy’s virtual printer over the tailnet. Only needed to prepare prints; already-sliced .3mf/.gcode can be sent straight through Bambuddy.

Deployment facts (from wiki.bambuddy.cool)

  • Image: ghcr.io/maziggy/bambuddy:latest (:daily for dev).
  • network_mode: host — required for SSDP printer discovery + camera + the virtual-printer ports.
  • Web UI: port 8000.
  • Data: SQLite (zero-config, default) in bambuddy_data:/app/data; logs in bambuddy_logs:/app/logs. Postgres optional via DATABASE_URL.
  • Env: TZ (set Europe/Budapest), PORT (8000), DATABASE_URL (unused), BAMBUDDY_EXTERNAL_ROOTS (mount allowlist, unused for now).
  • Virtual-printer ports (host mode): MQTT 8883, FTPS 990, detection 3000/3002, tunnel 6000, RTSP 322, FTP passive 50000–50029, A1/P1 2024–2026.
  • Quick start: curl -O https://raw.githubusercontent.com/maziggy/bambuddy/main/docker-compose.yml && docker compose up -d.

Host + network context (telep-mainframe)

  • Host: telep-mainframe (Debian 13, Docker 29.6.1 / Compose v5.3.1), ssh levander@telep-mainframe, 192.168.1.123 wired on enp5s0, on tailnet telep-mainframe.taild4189d.ts.net (100.115.209.87).
  • Printer goes on the main LAN 192.168.1.0/24 (wired or telep1 WiFi) — reachable from .123; LAN-mode ports not blocked intra-LAN. Do NOT put it on the camera VLAN 192.168.30.0/24.
  • App dirs convention: /home/levander/<service>/. Docker stacks like ~/nvr.

Exposure decision — dedicated node for the web UI (host-network exception for virtual printers)

Per tailnet-service-exposure-convention (dedicated node + hostname per service), the web UI gets its own node: a dedicated tailscaled (userspace networking, own --socket/--statedir) authed as bambuddyhttps://bambuddy.taild4189d.ts.net serving http://127.0.0.1:8000.

Host-network split

Bambuddy runs network_mode: host (SSDP + virtual-printer ports), so its virtual printers still advertise the HOST’s tailnet IP (telep-mainframe = 100.115.209.87), which is what the blog relies on and what OrcaSlicer connects to. Only the web UI rides the dedicated bambuddy node. This is the documented host-network exception in tailnet-service-exposure-convention. Mind the --statedir (not --state) gotcha.

Phase 1 — server (no printer needed)

  1. /home/levander/bambuddy/docker-compose.yml from the official compose (image ghcr.io/maziggy/bambuddy:latest, network_mode: host, volumes bambuddy_data/bambuddy_logs, TZ=Europe/Budapest, restart: unless-stopped).
  2. docker compose up -d; verify web UI on 127.0.0.1:8000.
  3. tailscale serve --bg --https=8000 http://127.0.0.1:8000; verify https://telep-mainframe.taild4189d.ts.net:8000.
  4. Add a Bambuddy tile to the home portal (/home/levander/home-portal/index.html, 2026-07-24-global-dashboard).

Phase 2 — printer (needs it powered + in LAN/Dev Mode)

  1. Power on the H2S; on its screen enable LAN Only / Developer Mode (Settings → Network); note IP, serial, access code.
  2. Give it a DHCP reservation on telep-router (same as the mainframe .123 fix — see telep-router DHCP section) so its IP is stable.
  3. Add the printer in Bambuddy (auto-discovered via SSDP in host mode, or by IP + access code).
  4. Test: monitoring/status live; send a test print from OrcaSlicer (Mac) to the virtual printer over the tailnet.

Prereqs / open (discover live — none documented yet)

  • Printer IP / wired-vs-telep1 / serial / access code / LAN-Dev-Mode state — all undocumented; capture once set.
  • DHCP reservation for the printer on telep-router.
  • OrcaSlicer installed on the Mac (desktop, for preparing prints).

Success criteria

  • Bambuddy web UI reachable at https://telep-mainframe.taild4189d.ts.net:8000, container healthy + starts on boot.
  • H2S added, LAN-mode connected (status/temps live), no Bambu cloud.
  • OrcaSlicer on the Mac prints to the virtual printer over the tailnet.
  • Bambuddy tile on the home portal.