rotate egress over a larger WG pool, with graceful drain and live status

Keep the N always-on tunnel slots fixed but let each slot's WireGuard config
rotate through a larger pool, so a 10-concurrent provider cap (e.g. Proton) can
still cycle 50-100 profiles.

- lxc/rotate.sh + weircon-rotate.{service,timer}: round-robin one slot at a
  time through wg-pool/, repointing a symlink and restarting only that slot.
- service: proxyManager tracks per-slot in-flight + drain/undrain state; a
  localhost admin server (WEIRCON_ADMIN_LISTEN) lets rotate.sh drain a slot
  before teardown and warm it back in after, so no request is routed to a
  tunnel mid-rotation. Slots self-heal if undrain never arrives.
- GET /status: poll-friendly JSON of per-slot egress IP/state plus inferred
  next-rotation slot + ETA, fed by a background egress-IP prober.
- docs + env examples for all new knobs.
This commit is contained in:
Asger Weirsøe
2026-06-01 19:17:15 +02:00
parent 9c6334cc60
commit 0aa56fc67c
13 changed files with 993 additions and 16 deletions
+25
View File
@@ -7,3 +7,28 @@ WEIRCON_PROXY_ADDRS=10.99.0.10:1080,10.99.0.11:1080,10.99.0.12:1080,10.99.0.13:1
# Maks tid pr. upstream-fetch (sekunder).
WEIRCON_REQUEST_TIMEOUT_SEC=30
# Admin-endpoint til rotation (drain/undrain). Kun localhost — må ALDRIG
# eksponeres via reverse-proxy. Tom streng slår admin-serveren helt fra.
WEIRCON_ADMIN_LISTEN=127.0.0.1:8081
# Rotation-drænings-tuning (sekunder):
# TIMEOUT = maks ventetid på at in-flight requests på en slot tømmes
# SETTLE = ekstra ro-periode efter in-flight = 0 ("et par sek. før")
# WARMUP = slot holdes ude af rotation efter undrain, så WG-handshaket
# kan sætte sig ("et par sek. efter")
# MAX_HOLD= sikkerhed: slot self-healer og kommer tilbage selv hvis
# rotate.sh dør mellem drain og undrain
WEIRCON_DRAIN_TIMEOUT_SEC=25
WEIRCON_DRAIN_SETTLE_SEC=2
WEIRCON_DRAIN_WARMUP_SEC=3
WEIRCON_DRAIN_MAX_HOLD_SEC=60
# Egress-IP prober: henter den aktuelle udgangs-IP gennem hver tunnel og cacher
# den, så /status kan vise hvilken IP der sidder på hver slot (og hvilken der
# snart roteres ud). INTERVAL=0 slår probing helt fra (så er egress_ip tom i
# /status, og klienten må selv probe). URL skal returnere klientens IP som ren
# tekst (ipify, ifconfig.me/ip, egen endpoint, …).
WEIRCON_PROBE_URL=https://api.ipify.org
WEIRCON_PROBE_INTERVAL_SEC=60
WEIRCON_PROBE_TIMEOUT_SEC=10