From b30f41f3d7074ac910203d468c8e62fe0cb60c63 Mon Sep 17 00:00:00 2001 From: Dorian Date: Wed, 8 Apr 2026 20:27:38 +0200 Subject: [PATCH] feat: standalone WireGuard from first install, fix networking stack MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Standalone WireGuard (wg0:51820): - New archipelago-wg.service creates wg0 independent of NostrVPN - Keypair generated on first-boot, persisted on LUKS partition - vpn.create-peer uses wg genkey/pubkey (no nvpn dependency) - wg-address service depends on archipelago-wg, not nostr-vpn Networking fixes: - Remove nos.lol from default relays (requires PoW, events rejected) - Add Tor hidden service for private relay (port 7777) — NAT'd peers can reach relay over Tor for NostrVPN signaling - Fix Tor hostname sync race: wait loop before copying hostname files - Add tor-hostnames + wireguard dirs to LUKS partition setup - Include relay in hostname sync loops (setup-tor.sh + first-boot) Co-Authored-By: Claude Opus 4.6 --- CLAUDE.md | 95 +++---------------- core/archipelago/src/api/rpc/vpn.rs | 71 ++++++++------ core/archipelago/src/nostr_relays.rs | 4 +- image-recipe/build-auto-installer-iso.sh | 17 +++- .../configs/archipelago-wg-address.service | 4 +- image-recipe/configs/archipelago-wg.service | 14 +++ neode-ui/dev-dist/sw.js | 2 +- scripts/first-boot-containers.sh | 34 +++++-- 8 files changed, 112 insertions(+), 129 deletions(-) create mode 100644 image-recipe/configs/archipelago-wg.service diff --git a/CLAUDE.md b/CLAUDE.md index 5ccd0fa8..4aa53e77 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -1,25 +1,16 @@ # CLAUDE.md — Archipelago (Archy) -## Overview - Archipelago is a **Bitcoin Node OS** — bootable, self-sovereign personal server. Flash to USB, install on hardware, manage via web UI. **Stack**: Rust backend + Vue 3 + TypeScript (strict) + Vite 7 + Tailwind + Pinia + Podman on Debian 12 **Version**: 1.3.0 | **Target**: x86_64 and ARM64 ---- - ## Beta Freeze (2026-03-18) -**Phase 1: Feature Testing (internal) — WE ARE HERE** - -Feature set is LOCKED. Only: bug fixes, security hardening, ISO build fixes, UI polish, testing. -No new features, no new apps, no new deps, no scope creep. - +Phase 1: Feature Testing (internal). Feature set is locked. +Only: bug fixes, security hardening, ISO build fixes, UI polish, testing. Track: `docs/BETA-PROGRESS.md` | Checklist: `docs/BETA-RELEASE-CHECKLIST.md` ---- - ## Quick Reference ```bash @@ -28,19 +19,6 @@ cd neode-ui && npm run build # Build (outputs to web/dist/neode-ui/) ./scripts/deploy-to-target.sh --live # Deploy to live server (.228) ``` -## Infrastructure - -| What | Where | -|------|-------| -| Dev server | `192.168.1.228` (SSH key: `~/.ssh/archipelago-deploy`) | -| Secondary | `192.168.1.198` | -| Git remote | `git.tx1138.com` (remote name: `tx1138`) | -| App registry | `80.71.235.15:3000/archipelago/` (HTTP, insecure) | -| CI runner | act_runner on .228, workflow: `.gitea/workflows/build-iso.yml` | -| ISO builds | FileBrowser at `http://192.168.1.228:8083` → Builds/ | -| SSH creds | Gitignored `scripts/deploy-config.sh` | -| Web password | `password123` | - ## Architecture ``` @@ -48,75 +26,22 @@ Debian 12 ├── Podman (rootless, user archipelago) ├── Nginx (80/443 → backend, app proxies) ├── Rust Backend (core/) on 127.0.0.1:5678 - │ ├── core/archipelago/ — Binary, RPC, auth, sessions - │ └── core/container/ — PodmanClient, manifests, health └── Vue.js UI (neode-ui/) - ├── src/api/rpc-client.ts — All backend communication - ├── src/stores/ — Pinia state - ├── src/views/ — Pages - └── src/style.css — ALL styling (global classes only) ``` **Data paths**: `/var/lib/archipelago/{app-id}/` (data), `/opt/archipelago/web-ui/` (frontend), `/usr/local/bin/archipelago` (binary) ## Critical Rules -1. **Never build Rust on macOS** — deploy script handles cross-compilation via rsync + remote build -2. **Always deploy after changes** — `./scripts/deploy-to-target.sh --live` -3. **Frontend builds to `web/dist/neode-ui/`** — not `neode-ui/dist/` -4. **Container images**: `scripts/image-versions.sh` is the single source of truth. All scripts use `$*_IMAGE` variables, never hardcoded registry paths. -5. **Type-check before committing** — `cd neode-ui && npx vue-tsc -b --noEmit` - -## Frontend - -- `