wg-setup-host.sh sets up the tunnel on the backend host: keys generated there and kept there, wg0.conf, wg-quick enabled, and the phone's config printed as a scannable QR. Split tunnel (AllowedIPs is only the backend subnet), single-address addressing per PLAN.md, and the three things it can't do for you -- router UDP forward, DDNS, hairpin check -- spelled out at the end. test-wg-tunnel.sh stands up a real WireGuard tunnel between two network namespaces inside one machine, so the production posture (bind wg0 and nothing else) is testable with no router, phone, or internet exposure. Verified: real handshake, server listening on 10.66.0.1:8443 only, and an authorized request from inside the tunnel answering 200 over pinned TLS -- the leaf's 10.66.0.1 SAN is what a phone will validate too. repo_root() now resolves from the running executable before falling back to the compiled-in path: the repo is shared host<->VM over virtiofs at different absolute paths with a shared target/, so a binary built on one side and run on the other looked for its config where nothing exists. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_017xn8nHw1tw1R6PtiY1eEtw
470 B
470 B
2026-08-25T06:18:57.533304Z INFO ai_server: config: /home/bob/host/repos/ai-app/config.json
2026-08-25T06:18:57.537682Z INFO ai_server: serving https://10.66.0.1:8443
2026-08-25T06:20:43.470080Z INFO ai_server: config: /home/bob/host/repos/ai-app/config.json
2026-08-25T06:20:43.474488Z INFO ai_server: serving https://10.66.0.1:8443
2026-08-25T06:18:57.537682Z INFO ai_server: serving https://10.66.0.1:8443
2026-08-25T06:20:43.470080Z INFO ai_server: config: /home/bob/host/repos/ai-app/config.json
2026-08-25T06:20:43.474488Z INFO ai_server: serving https://10.66.0.1:8443