649 Commits

Author SHA1 Message Date
Will Anderson 7e5ba1a288 Fix ProtonVPN server names: US-TX#179 and US-TX#220 (not #253/#34) 2026-04-15 01:53:56 -05:00
Will Anderson 942b398a53 Switch workers back to protonvpn provider — custom WireGuard IP assignment mismatch
Custom provider hardcodes 10.2.0.2/32 but ProtonVPN assigns a different
IP per session via their API. WireGuard handshake succeeds but ProtonVPN
doesn't route traffic for the wrong IP. Native protonvpn provider fetches
the correct IP assignment automatically and enables port forwarding.
2026-04-15 01:51:17 -05:00
Will Anderson 0b3f2d38a8 Remove standalone qbittorrent — superseded by fornax workers 2026-04-15 01:41:42 -05:00
Will Anderson 59353c68dc Scale down standalone qbittorrent — replaced by fornax workers 2026-04-15 01:40:43 -05:00
Will Anderson e12fd9781a Fix VPN routing: give portforward-helper NET_ADMIN to delete gluetun rule 100
gluetun adds 'ip rule priority 100 from <pod-IP> lookup 200' which routes
all pod traffic via eth0. The iptables OUTPUT DROP policy then blocks it.
Rule 101 (not fwmark 0xca6c -> tun0) never fires because rule 100 matches
first. Result: qBittorrent has no internet access through the VPN.

Fix: portforward-helper waits for gluetun to be ready (polls :9999), then
deletes rule 100. Application traffic then falls through to rule 101 and
routes correctly via tun0.
2026-04-15 01:40:02 -05:00
Will Anderson 87367d4387 Add Gitea SSH tunnel via ssh.git.neuralplatform.ai 2026-04-14 23:53:18 -05:00
Will Anderson ad2a1db3e2 Remove conflicting fornax-worker Argo CD apps — media app is sole owner
The fornax-worker-tx253 and fornax-worker-tx34 Argo CD apps were fighting
the media app (which also manages the same Deployments, Services, PVCs,
and ExternalSecrets via fornax-workers.yaml). This caused 73+ rolling
restarts per 2 hours. Since neither app had a cascade-delete finalizer,
removing these Application CRDs leaves existing resources intact and
transfers ownership to the media app.
2026-04-14 22:25:25 -05:00
Will Anderson ef8dc293e5 Set HEALTH_ICMP_TARGET_IPS to WireGuard gateway for periodic health check
ProtonVPN does not NAT ICMP to external IPs (1.1.1.1, 8.8.8.8), causing
the periodic small health check to always fail and restart the VPN loop.
10.2.0.1 (WireGuard gateway) responds to ICMP at ~28ms and remains
reachable as long as the WireGuard tunnel itself is up.
2026-04-14 22:08:40 -05:00
Will Anderson 214afed0a2 Set DNS_UPSTREAM_RESOLVER_TYPE=plain to actually disable DoT in gluetun
DOT=off alone does not override DNS_UPSTREAM_RESOLVER_TYPE in this version
of gluetun — it defaults to DoT regardless, causing DNS failures through
ProtonVPN (port 853 connection reset). Setting the resolver type directly
fixes plain DNS routing to k8s CoreDNS.
2026-04-14 22:04:36 -05:00
Will Anderson 41ab2eaf0e Fix DNS_UPSTREAM_PLAIN_ADDRESSES format: requires ip:port not bare ip 2026-04-14 22:01:50 -05:00
Will Anderson 10dd561ec0 Fix gluetun healthcheck targets and DNS env var on fornax workers
Change HEALTH_TARGET_ADDRESS to ProtonVPN API endpoints so TLS startup
check doesn't fail against cloudflare.com/github.com (rejected from
ProtonVPN exit IPs). Rename deprecated DNS_ADDRESS to
DNS_UPSTREAM_PLAIN_ADDRESSES in fornax-workers.yaml.
2026-04-14 21:58:52 -05:00
Will Anderson a1623eda39 Fix gluetun DNS: disable DoT, use k8s coredns as plaintext resolver
DoT (port 853) to 1.1.1.1 through ProtonVPN VPN tunnel gets TCP RST,
causing gluetun healthcheck to fail (can't resolve github.com /
cloudflare.com). k8s coredns at 10.43.0.10 is reachable via eth0
within FIREWALL_OUTBOUND_SUBNETS, bypassing the VPN for DNS while
letting all other traffic tunnel correctly.

Also rename VPN_ENDPOINT_IP/PORT to WIREGUARD_ENDPOINT_IP/PORT to
suppress gluetun deprecation warnings.
2026-04-14 21:32:57 -05:00
Will Anderson 741191a7e6 Switch workers to custom WireGuard provider with correct endpoint IPs
gluetun's bundled protonvpn server list has stale IPs for US-TX#179
(37.19.200.26) and US-TX#220 (95.173.217.2). The WIREGUARD_ENDPOINT_IP
env var is a filter not an override, so there's no way to redirect
protonvpn provider to a new IP.

Switch to custom WireGuard provider with hardcoded endpoint IPs from
fresh ProtonVPN configs (95.173.217.29 / 146.70.58.130). Add
DNS_KEEP_NAMESERVER=on so gluetun leaves k8s DNS intact instead of
routing DNS through its own proxy (which breaks in-cluster).

Port forwarding is not available with custom provider; will restore
once gluetun releases an updated server list image.
2026-04-14 21:29:29 -05:00
Will Anderson 0688700ebc Fix gluetun endpoint env var: use WIREGUARD_ENDPOINT_IP, drop port
gluetun rejects VPN_ENDPOINT_PORT when SERVER_NAMES is used (server
selection mode), and warns that VPN_ENDPOINT_IP is deprecated in
favour of WIREGUARD_ENDPOINT_IP. Use only WIREGUARD_ENDPOINT_IP;
port 51820 is ProtonVPN's default and doesn't need to be set.
2026-04-14 21:25:55 -05:00
Will Anderson 87934e9284 Override stale gluetun endpoint IPs for ProtonVPN servers
ProtonVPN migrated US-TX#179 (37.19.200.26 → 95.173.217.29) and
US-TX#220 (95.173.217.2 → 146.70.58.130). gluetun's bundled server
list still has the old dead IPs. Override via VPN_ENDPOINT_IP and
VPN_ENDPOINT_PORT so gluetun uses the correct endpoints while keeping
the protonvpn provider (and port forwarding) intact.
2026-04-14 21:24:19 -05:00
Will Anderson 008df2b584 Fix server names: US-TX#179 for tx253, US-TX#220 for tx34 (gluetun protonvpn format) 2026-04-14 21:19:02 -05:00
Will Anderson a2239ab89e Switch back to protonvpn provider with US-TX#253 and US-TX#34 2026-04-14 21:17:20 -05:00
Will Anderson 88c4d795e7 Switch DNS to 8.8.8.8 — ProtonVPN internal DNS returning errors 2026-04-14 21:12:33 -05:00
Will Anderson 027667e7f7 Remove custom health target — use ProtonVPN internal DNS for resolution 2026-04-14 21:10:42 -05:00
Will Anderson e6d1350ca8 Use ProtonVPN internal DNS and direct IP healthcheck to diagnose VPN 2026-04-14 21:08:55 -05:00
Will Anderson 0c238e9e7e Update worker VPN endpoints: tx253→US-TX#253, tx34→US-TX#34 2026-04-14 21:04:37 -05:00
Will Anderson 9778f79845 Configure per-worker VPN endpoints: tx253→US-TX#253, tx34→US-TX#34 2026-04-14 21:02:01 -05:00
Will Anderson fcff5f62e5 Switch worker base to custom WireGuard provider for US-IL#267 2026-04-14 20:31:03 -05:00
Will Anderson 7893fdc1d3 Remove VPN_PORT_FORWARDING from tx34 — not supported with custom provider 2026-04-14 20:27:16 -05:00
Will Anderson 59f551663b Switch gluetun to custom provider — use explicit WireGuard config for US-IL#267
Avoids gluetun's ProtonVPN server name lookup entirely. All WireGuard
parameters (endpoint, peer key, client address, keepalive) come directly
from the downloaded ProtonVPN config.
2026-04-14 20:22:31 -05:00
Will Anderson 9a523da831 Use SERVER_COUNTRIES=US with explicit endpoint — gluetun has no US-IL naming 2026-04-14 20:20:47 -05:00
Will Anderson c283110e70 Switch workers to US-IL#267 with explicit WireGuard endpoint and peer key
US-TX#179 and US-TX#220 were failing — WireGuard handshake completing
but no traffic passing (silent drop). Switching both workers to US-IL#267
and pinning the endpoint IP and peer public key directly to avoid relying
on gluetun's built-in server list lookup.
2026-04-14 20:18:57 -05:00
Will Anderson 7f7e2e26da Force coordinator rollout to pick up new image with downloadSpeedBps 2026-04-14 20:10:08 -05:00
Will Anderson b5f481d9a4 Fix qbt-config-patch for Python 3.14: use lambda in re.sub replacements
Python 3.14 raises PatternError for backslash sequences like \P in
re.sub replacement strings. Switch to lambda replacements which bypass
that interpretation. Also pin to python:3.13-alpine to avoid future
surprises from pulling :3-alpine.
2026-04-14 20:00:24 -05:00
Will Anderson 07f75c7dc8 Force UI pod rollout to pick up new nginx image 2026-04-14 19:57:32 -05:00
Will Anderson 87c4b63cca Route /api/ui through nginx to bypass Cloudflare Access; bump restartedAt
The /api/ui path is now routed to the fornax-ui nginx pod (which proxies
internally to the coordinator) rather than directly to the coordinator.
This fixes the browser fetch being blocked by Cloudflare Access.

Both coordinator and UI deployments get a restartedAt bump to pull the
new images after CI builds.
2026-04-14 19:44:23 -05:00
Will Anderson 3110903c81 Force rollout to pick up new images with real qBT wiring 2026-04-14 19:30:23 -05:00
Will Anderson a1615df3e9 Fix overseerr.yaml YAML indentation error blocking media app sync 2026-04-14 19:18:13 -05:00
Will Anderson 2a21c9d57e Fix fornax service port and add qBittorrent worker env vars
- fornax service: targetPort 8080→3000 (Express listens on 3000, not 8080)
  This was silently dropping all Radarr/Sonarr requests
- coordinator deployment: add QBT_WORKER_ADDRS, QBT_USER, QBT_PASS
  so /api/ui/state can query real worker qBittorrent instances
- remove Python coordinator ConfigMap and Deployment (superseded)
2026-04-14 19:17:00 -05:00
Will Anderson 788f103c0e Force UI rollout to pick up new image with CSS stylesheet 2026-04-14 19:02:48 -05:00
Will Anderson 7e2a7c7126 Force coordinator rollout to pick up new image with crash fix 2026-04-14 19:02:18 -05:00
Will Anderson 4f406e13c9 add fornax-ui Argo CD application
Deploys fornax/ui:latest (nginx serving React SPA) to the media
namespace. Image is now pushed by the fornax CI pipeline.
2026-04-14 12:48:42 -05:00
Will Anderson 27d9d9c436 fornax: fix crash-looping coordinator, add UI deployment
- Fix liveness/readiness probe paths from /api/v2/app/version (qBittorrent)
  to /health and /health/ready (Fornax Express server). Pod was restarting
  every ~30s due to probe failures against wrong endpoint.
- Add fornax-ui deployment and service for React dashboard
  (image: fornax/ui:latest, nginx on port 80)
- Split ingress: /api and /health → coordinator:3000, / → ui:80
- Update kustomization to include UI resources
2026-04-14 08:45:21 -05:00
Will Anderson bdba692db2 Fornax: COORDINATOR_URL env, port-lease webhook, Grafana dashboard
- Worker deployment: add COORDINATOR_URL and WORKER_ID env vars to
  portforward-helper; webhook calls coordinator /api/v2/workers/:id/port-lease
  after each NAT-PMP renewal so coordinator tracks current forwarded port
- Worker overlays: patch WORKER_ID env var to actual worker ID (tx253/tx34)
- Grafana: fornax-grafana Argo CD app pointing to k8s/fornax/grafana/
  ConfigMap with grafana_dashboard=1 label for auto-discovery by sidecar;
  7 panels covering bandwidth, active torrents, worker health, request rate,
  and error rate
2026-04-14 05:30:01 +00:00
Will Anderson d75d1b62d8 Add fornax.neuralplatform.ai to Cloudflare tunnel ingress rules 2026-04-14 04:43:25 +00:00
Will Anderson 4a0ebededf fix: revert to protonvpn provider, use server name from secret 2026-04-14 00:07:11 +00:00
Will Anderson 1cc783e704 fix: use custom gluetun provider with endpoint IP for ProtonVPN workers 2026-04-14 00:04:50 +00:00
Will Anderson eebd0226de fix: worker gluetun endpoint IP approach, add VPN key secrets 2026-04-14 00:01:43 +00:00
Will Anderson 180fb91c95 add fornax coordinator and worker k8s manifests 2026-04-13 23:57:22 +00:00
Gitea CI 0aa1f4333c chore(neuron): deploy e102af6f86599361b911a2e7e5aa0ec737b54527 2026-04-12 19:58:46 +00:00
Gitea CI e1c15205e3 chore(neuron): deploy 61e9d262595be44c6d7956e41f8a9f275c482678 2026-04-12 16:27:34 +00:00
Gitea CI f91a25fd83 chore(neuron): deploy 0091ebfaa13ef4c58d3a88b3bb3be144ea0a2d9c 2026-04-12 16:18:28 +00:00
Will Anderson 354950a75d Remove voidstash adult media stack (DNS records, tunnel routes) 2026-04-12 04:37:18 -05:00
Will Anderson 538bba323d feat: add prowlarr.voidstash.xyz DNS + tunnel rule 2026-04-12 02:34:35 -05:00
Will Anderson db980af27a monitoring: add WireGuard key expiry reminders for voidstash GL.iNet
Posts to #infrastructure-alerts via Slack bot on escalating schedule:
- 2027-03-11: 1 month out
- 2027-03-25, 04-01, 04-04: weekly
- 2027-04-05 through 04-10: daily

Key: neural_net-US-IL-267, expires 2027-04-11
2026-04-11 13:29:38 -05:00