hydraneck is the last non-structural service still on its own Hetzner box
(hydraneck, 46.225.8.28, cx33 — renamed from hydraneckomada after Omada was
removed). It is a MikroTik-visibility service: it polls the venue MikroTik routers
via the RouterOS REST API over the WireGuard mesh. It monitors 3 routers today
(cloud-seven/mikrotik-cloud7, mobile-kit/mikrotik-mobile-kit,
rupelmonde/mikrotik-rupelmonde).
exec.Command shell-outs,serve --dev --listen, small state (/root/.hydraneck/secrets.yaml, routerThe box sits on the mesh as 10.10.100.14, and the MikroTik firewalls
allowlist that source IP (Citymesh-managed; the citymesh-venue runbook records
"please allowlist ..." as a request to them). If hydraneck moves to a Pi and its
API calls source from the Pi's mesh IP (e.g. 10.10.100.19 via NAT), the routers
firewall-block it until Citymesh re-allowlists — per venue.
Every other scale in the fleet reaches the mesh via the Pi's NAT (sourcing from the
Pi's IP). hydraneck is the FIRST that must source from its own specific IP. That is
what makes this not a drop-in.
Give the hydraneck scale its OWN hydraguard-air peer keyed to Address
10.10.100.14 (its own tunnel inside the container, or the Pi holding a second
peer .14 and source-NATing hydraneck's traffic as .14) — NOT the shared Pi NAT.
The MikroTik firewalls then see the same source IP they already allowlist: zero
Citymesh coordination. The peer slot is hydraneck's identity and travels with the
service, not the box.
Note 10.10.100.14 cannot live on two peers at once, so the cutover is a brief
hand-off: free .14 from the box, give it to the scale, without leaving the routers
unwatched in between.
This is the first scale that needs a WireGuard tunnel inside the container (or Pi
source-NAT). Neither is validated in this fleet. Recommend proving the in-container
mesh identity on a throwaway test scale first; if it snags, the fallback is asking
Citymesh to allowlist the Pi's IP (external dependency, but known). A botched
cutover leaves the fleet blind to the venue routers — worth care, not speed.
Retires the last non-structural Hetzner box. hydracluster's config references
hydraneck by DNS name (neck.url = https://hydraneck.experiencenet.com), so moving
the domain to a Pi is transparent to the control plane — no config change there.
Containerize (image likely already publishable), launch as a scale with its own
mesh peer .14, copy secrets.yaml, cut DNS. The novel 10% is the in-container mesh
identity. See the mesh-addressing model in
hydraskin/docs/runbooks/service-cutover.md and #444.