Skip to content

Commit 94a013b

Browse files
committed
release: v1.6.0-beta.3
What a reboot found. beta.2 had run on hardware but had never been switched off and on again; it did not survive. The box came back claiming to be a router while behaving as a gateway, with both sidecars resurrected by Docker's restart policy into a network that no longer matched them. Boot now waits for hardware that is still arriving, tears the dataplane down rather than leaving half a router when it cannot restore one, and keeps retrying while the settings say router and the dataplane is absent — a LAN cable plugged in a minute after boot is no longer ignored. Also: publishing the panel on the uplink turned out to open SSH and not the panel, because one is a host service reaching INPUT and the other is a container reached through FORWARD — which meant the operator who enabled it in order to confirm after the switch could not, and the watchdog reverted a working router. And the LAN address ended up on both the bridge and its member, because NetworkManager restores the persistent address the bridge had just taken. Verified on hardware: a reboot with the cable in restores router mode unattended, a client on the LAN resolves, pings and pulls 1 MB through NAT, and the update path preserves the database and brings the router back on its own.
1 parent b7ffb3e commit 94a013b

3 files changed

Lines changed: 61 additions & 2 deletions

File tree

CHANGELOG.md

Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,65 @@ All notable user-facing changes to PiTun. Full per-release detail lives in the
44
[GitHub Releases](https://github.com/DaveBugg/PiTun/releases); this file is the
55
committed summary.
66

7+
## v1.6.0-beta.3 — 2026-08-14
8+
9+
**Beta — what a reboot found.** beta.2 had run on hardware but had never been
10+
switched off and on again. It did not survive: the box came back claiming to
11+
be a router while behaving as a gateway. That, and publishing the panel on the
12+
uplink turning out to work for SSH and not for the panel, are what this fixes.
13+
14+
### Fixed
15+
16+
- **A reboot left the box claiming router and behaving as gateway.** Three
17+
causes, all of them about boot differing from an operator pressing Save.
18+
The reconcile ran before the hardware had finished arriving — a wifi adapter
19+
appears only once its firmware has loaded, and the backend is up in seconds —
20+
so it asked, got "port is not present", and gave up. It gave up *without
21+
cleaning up*, leaving both sidecars resurrected by Docker's own restart
22+
policy: dnsmasq serving DHCP for a bridge that no longer existed, hostapd
23+
crash-looping on a missing radio. And it was a single attempt, so a LAN cable
24+
plugged in a minute later changed nothing. Boot now waits for the configured
25+
ports, tears the dataplane down if it cannot restore it, and the watchdog
26+
retries once a minute while the settings say router and the dataplane is
27+
absent.
28+
- **Publishing the panel on the uplink only opened half the path.** With both
29+
toggles on, SSH answered from the WAN and the panel did not: SSH is a host
30+
service and reaches INPUT, while the panel is a container with published
31+
ports, so the request is DNAT'd and *forwarded* — a chain whose policy is
32+
drop. Worse than a missing feature, because the operator turns that toggle on
33+
precisely so they can confirm after the switch, and could not, so the
34+
watchdog reverted a working router.
35+
- **The LAN address ended up on both the bridge and the member.** The port
36+
needs a persistent address — without one there is nothing for the next apply
37+
to read after a reboot — and NetworkManager puts that address straight back
38+
the moment the bridge takes it. Members are now taken out of its hands while
39+
enslaved and handed back on teardown.
40+
- **TCP MSS is clamped to the route MTU**, without which a PPPoE uplink hangs
41+
on large transfers while small requests work.
42+
- The ICMP counter is read before conntrack, where it can actually see the
43+
PMTU messages it exists to detect, and zero is no longer reported as a
44+
warning on an uplink that has an address.
45+
- Diagnosis reports when traffic is leaving by a port that isn't the uplink —
46+
NAT and a firewall on a link nothing uses, with every other check healthy.
47+
48+
### Added
49+
50+
- **A network card present but unusable is now named as such.** "No wireless
51+
adapters found" is the wrong thing to say about a card sitting on the PCI
52+
bus. The inventory reports controllers that produced no interface and
53+
separates the two readings — nothing bound the device, or a driver is bound
54+
and produced no interface anyway, which in practice means firmware it could
55+
not load. Found the hard way: a purged firmware package cost an evening.
56+
57+
### Notes
58+
59+
- No new migrations; head remains 025.
60+
- Verified on hardware: reboot with a LAN cable restores router mode
61+
unattended; a client on the LAN resolves DNS, pings out and pulls 1 MB
62+
through NAT; the update path preserves the database and brings the router
63+
back by itself.
64+
- 5 commits. Tests: 188 router-mode, 96 frontend.
65+
766
## v1.6.0-beta.2 — 2026-08-14
867

968
**Beta — router mode, first hardware run.** beta.1 had never been switched on

backend/app/config.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
# OpenAPI metadata, `/health` response, and `/system/status` so the
66
# frontend can display it next to the xray version. Bump this on each
77
# release — frontend keeps its own version in `frontend/package.json`.
8-
APP_VERSION = "1.6.0-beta.2"
8+
APP_VERSION = "1.6.0-beta.3"
99

1010

1111
class Settings(BaseSettings):

frontend/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
{
22
"name": "pitun-frontend",
33
"private": true,
4-
"version": "1.6.0-beta.2",
4+
"version": "1.6.0-beta.3",
55
"license": "BSD-3-Clause",
66
"type": "module",
77
"scripts": {

0 commit comments

Comments
 (0)