Automate TP-Link Archer A20 config via Playwright (static port forwards for Tailscale) #107
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Goal
Drive the TP-Link Archer A20 web admin UI (http://192.168.0.1) via Playwright so router config is declarative and re-applicable. The immediate use case is static UDP port forwards for Tailscale on each device, to survive the router's UPnP table being saturated by a LAN BitTorrent client (see #106 for the root cause).
Why this approach
Scope - in
{device_name, internal_ip, external_port, internal_port, protocol}, idempotent apply.{hostname, mac, ip}. Needed because static port forwards bind to internal IP, and devices need pinned IPs to be reliable targets.Scope - out (for now)
tailscale set --port/tailscaled --porton each device end-to-end. That belongs in a separate Ansible-style role per AGENTS. This ticket is router-config only.SSM dependencies
Needs a new SecureString param (Kai will add after this issue is firmed up):
/coilysiren/home/tplink-admin-password- admin password for the router web UI.The LAN IP
192.168.0.1is fine to hardcode (RFC1918, not opaque, no leak risk).Implementation notes
playwright(matches existingcoilysiren/*tooling stack).--headedflag for debugging the brittle parts.infrastructure/router-state.yamlor similar. Diff-first, apply-last. Audit log via coily.Where it lives
Probably
infrastructure/scripts/playwright-tplink/since this repo is canonical homelab knowledge per AGENTS, and the router is homelab infra. Could also be a standalone repo if the surface grows beyond one router.Origin
Spawned from today's mobile-SSH debug session (#106). Kai wants the router automation tracked separately so the SSH-debug issue can stay focused.
Filed by Claude.