[PR #1070] [MERGED] feat(virtual-printer): add Tailscale opt-out toggle (closes #701 point 3) #1153

Closed
opened 2026-05-06 12:35:23 +02:00 by BreizhHardware · 0 comments

📋 Pull Request Information

Original PR: https://github.com/maziggy/bambuddy/pull/1070
Author: @legend813
Created: 4/21/2026
Status: Merged
Merged: 4/24/2026
Merged by: @maziggy

Base: devHead: feat/tailscale-opt-out-toggle


📝 Commits (10+)

  • af90380 feat(virtual-printer): add Tailscale certificate provisioning
  • 9116f83 fix(virtual-printer): harden Tailscale cert provisioning
  • 01d35bf test(virtual-printer): extend Tailscale test coverage
  • 2243249 feat(virtual-printer): add Tailscale status UI to virtual printer settings
  • b2251dc fix(virtual-printer): harden Tailscale cert provisioning
  • 95ad6a0 test(virtual-printer): extend Tailscale test coverage to 33 tests
  • d66ca43 fix(virtual-printer): improve Tailscale fallback logging and error detection
  • cd18226 test(virtual-printer): cover HTTPS-disabled detection and readability check
  • 7eea60c feat(virtual-printer): add Tailscale opt-out toggle
  • 7fcbb31 Merge branch 'dev' into feat/tailscale-opt-out-toggle

📊 Changes

25 files changed (+10445 additions, -51 deletions)

View changed files

📝 backend/app/api/routes/settings.py (+18 -0)
📝 backend/app/api/routes/virtual_printers.py (+37 -0)
📝 backend/app/core/database.py (+3 -0)
📝 backend/app/models/virtual_printer.py (+3 -0)
📝 backend/app/services/virtual_printer/certificate.py (+35 -2)
📝 backend/app/services/virtual_printer/manager.py (+148 -4)
backend/app/services/virtual_printer/tailscale.py (+326 -0)
backend/tests/integration/test_tailscale_api.py (+61 -0)
backend/tests/unit/services/test_tailscale.py (+759 -0)
📝 backend/tests/unit/services/test_virtual_printer.py (+32 -0)
📝 frontend/src/__tests__/components/VirtualPrinterCard.test.tsx (+65 -0)
📝 frontend/src/api/client.ts (+19 -1)
📝 frontend/src/components/VirtualPrinterCard.tsx (+37 -1)
📝 frontend/src/components/VirtualPrinterList.tsx (+38 -3)
📝 frontend/src/i18n/locales/de.ts (+13 -0)
📝 frontend/src/i18n/locales/en.ts (+13 -0)
📝 frontend/src/i18n/locales/fr.ts (+9 -0)
📝 frontend/src/i18n/locales/it.ts (+9 -0)
📝 frontend/src/i18n/locales/ja.ts (+9 -0)
📝 frontend/src/i18n/locales/pt-BR.ts (+9 -0)

...and 5 more files

📄 Description

Summary

Closes the open point from #701 PR review — item 3: opt-in vs auto-detect.

Implements auto-detect with a user-facing toggle to disable Tailscale integration per virtual printer. The default behavior (auto-detect) is unchanged for all existing users.

  • Toggle OFF (yellow): Tailscale is never queried; VP starts immediately with the self-signed cert. Useful for users on company/school tailnets where HTTPS certs are disabled, or anyone who simply prefers the self-signed flow.
  • Toggle ON (green, default): Auto-detect as before — provisions a Let's Encrypt cert via tailscale cert when Tailscale is available, falls back to self-signed otherwise.

Toggling while the VP is running triggers an automatic restart via the existing sync_from_db() change detection.

Changes

Layer What changed
DB tailscale_disabled BOOLEAN DEFAULT 0 column on virtual_printers + runtime migration
Backend VirtualPrinterInstance.__init__ accepts tailscale_disabled; _resolve_cert_and_advertise() skips Tailscale entirely when set; change-detection loop triggers restart on toggle flip
API VirtualPrinterUpdate + _vp_to_dict expose tailscale_disabled; /settings/virtual-printer GET/PUT also handle it and propagate to the first VP row
Frontend VirtualPrinterSettings.tsx toggle (green=auto/yellow=disabled); VirtualPrinterSettings interface updated; updateSettings accepts tailscale_disabled
i18n disableTitle, enabledHint, disabledHint keys added to all 8 locales
Tests 2 new unit tests: disabled skips Tailscale query; enabled default queries Tailscale — 38 total passing

Test plan

  • With Tailscale installed and connected: toggle OFF → VP starts with self-signed cert; toggle ON → VP provisions LE cert
  • With Tailscale absent: toggle has no visible effect on cert (still self-signed either way), but log line differs
  • Toggle while VP is running → VP restarts automatically, picks up new cert path
  • Existing users on upgrade: tailscale_disabled defaults to false — no behavior change
  • Unit tests: python -m pytest unit/services/test_tailscale.py -q → 38 passed

🔄 This issue represents a GitHub Pull Request. It cannot be merged through Gitea due to API limitations.

## 📋 Pull Request Information **Original PR:** https://github.com/maziggy/bambuddy/pull/1070 **Author:** [@legend813](https://github.com/legend813) **Created:** 4/21/2026 **Status:** ✅ Merged **Merged:** 4/24/2026 **Merged by:** [@maziggy](https://github.com/maziggy) **Base:** `dev` ← **Head:** `feat/tailscale-opt-out-toggle` --- ### 📝 Commits (10+) - [`af90380`](https://github.com/maziggy/bambuddy/commit/af90380a0603361453f47009049c11cedc3f7814) feat(virtual-printer): add Tailscale certificate provisioning - [`9116f83`](https://github.com/maziggy/bambuddy/commit/9116f830126cf5b605b89aaa90f4ea573468f21c) fix(virtual-printer): harden Tailscale cert provisioning - [`01d35bf`](https://github.com/maziggy/bambuddy/commit/01d35bfe69f1a433eb6fac8cee87cf89ae25c9bc) test(virtual-printer): extend Tailscale test coverage - [`2243249`](https://github.com/maziggy/bambuddy/commit/2243249083314c46b00b6aa44a9097b0cebfde84) feat(virtual-printer): add Tailscale status UI to virtual printer settings - [`b2251dc`](https://github.com/maziggy/bambuddy/commit/b2251dcebfb132e2ca9b8d5adac2edd37ee5583c) fix(virtual-printer): harden Tailscale cert provisioning - [`95ad6a0`](https://github.com/maziggy/bambuddy/commit/95ad6a07bbc063d59dc8935d468d51109d7bd5fb) test(virtual-printer): extend Tailscale test coverage to 33 tests - [`d66ca43`](https://github.com/maziggy/bambuddy/commit/d66ca4321f3bf769d1929223a1478e1635ba5f3d) fix(virtual-printer): improve Tailscale fallback logging and error detection - [`cd18226`](https://github.com/maziggy/bambuddy/commit/cd1822676a482f557400e3626c2fb2fc12b2114d) test(virtual-printer): cover HTTPS-disabled detection and readability check - [`7eea60c`](https://github.com/maziggy/bambuddy/commit/7eea60c0e3b9de14668ab452cd537149a536a4ac) feat(virtual-printer): add Tailscale opt-out toggle - [`7fcbb31`](https://github.com/maziggy/bambuddy/commit/7fcbb31e6cf6a2d787ffe9007380cb69f9b90be9) Merge branch 'dev' into feat/tailscale-opt-out-toggle ### 📊 Changes **25 files changed** (+10445 additions, -51 deletions) <details> <summary>View changed files</summary> 📝 `backend/app/api/routes/settings.py` (+18 -0) 📝 `backend/app/api/routes/virtual_printers.py` (+37 -0) 📝 `backend/app/core/database.py` (+3 -0) 📝 `backend/app/models/virtual_printer.py` (+3 -0) 📝 `backend/app/services/virtual_printer/certificate.py` (+35 -2) 📝 `backend/app/services/virtual_printer/manager.py` (+148 -4) ➕ `backend/app/services/virtual_printer/tailscale.py` (+326 -0) ➕ `backend/tests/integration/test_tailscale_api.py` (+61 -0) ➕ `backend/tests/unit/services/test_tailscale.py` (+759 -0) 📝 `backend/tests/unit/services/test_virtual_printer.py` (+32 -0) 📝 `frontend/src/__tests__/components/VirtualPrinterCard.test.tsx` (+65 -0) 📝 `frontend/src/api/client.ts` (+19 -1) 📝 `frontend/src/components/VirtualPrinterCard.tsx` (+37 -1) 📝 `frontend/src/components/VirtualPrinterList.tsx` (+38 -3) 📝 `frontend/src/i18n/locales/de.ts` (+13 -0) 📝 `frontend/src/i18n/locales/en.ts` (+13 -0) 📝 `frontend/src/i18n/locales/fr.ts` (+9 -0) 📝 `frontend/src/i18n/locales/it.ts` (+9 -0) 📝 `frontend/src/i18n/locales/ja.ts` (+9 -0) 📝 `frontend/src/i18n/locales/pt-BR.ts` (+9 -0) _...and 5 more files_ </details> ### 📄 Description ## Summary Closes the open point from #701 PR review — item 3: **opt-in vs auto-detect**. Implements auto-detect with a user-facing toggle to disable Tailscale integration per virtual printer. The default behavior (auto-detect) is unchanged for all existing users. - **Toggle OFF (yellow):** Tailscale is never queried; VP starts immediately with the self-signed cert. Useful for users on company/school tailnets where HTTPS certs are disabled, or anyone who simply prefers the self-signed flow. - **Toggle ON (green, default):** Auto-detect as before — provisions a Let's Encrypt cert via `tailscale cert` when Tailscale is available, falls back to self-signed otherwise. Toggling while the VP is running triggers an automatic restart via the existing `sync_from_db()` change detection. ## Changes | Layer | What changed | |---|---| | DB | `tailscale_disabled BOOLEAN DEFAULT 0` column on `virtual_printers` + runtime migration | | Backend | `VirtualPrinterInstance.__init__` accepts `tailscale_disabled`; `_resolve_cert_and_advertise()` skips Tailscale entirely when set; change-detection loop triggers restart on toggle flip | | API | `VirtualPrinterUpdate` + `_vp_to_dict` expose `tailscale_disabled`; `/settings/virtual-printer` GET/PUT also handle it and propagate to the first VP row | | Frontend | `VirtualPrinterSettings.tsx` toggle (green=auto/yellow=disabled); `VirtualPrinterSettings` interface updated; `updateSettings` accepts `tailscale_disabled` | | i18n | `disableTitle`, `enabledHint`, `disabledHint` keys added to all 8 locales | | Tests | 2 new unit tests: disabled skips Tailscale query; enabled default queries Tailscale — 38 total passing | ## Test plan - [ ] With Tailscale installed and connected: toggle OFF → VP starts with self-signed cert; toggle ON → VP provisions LE cert - [ ] With Tailscale absent: toggle has no visible effect on cert (still self-signed either way), but log line differs - [ ] Toggle while VP is running → VP restarts automatically, picks up new cert path - [ ] Existing users on upgrade: `tailscale_disabled` defaults to `false` — no behavior change - [ ] Unit tests: `python -m pytest unit/services/test_tailscale.py -q` → 38 passed --- <sub>🔄 This issue represents a GitHub Pull Request. It cannot be merged through Gitea due to API limitations.</sub>
BreizhHardware 2026-05-06 12:35:23 +02:00
Sign in to join this conversation.
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
starred/bambuddy#1153
No description provided.