From e8251b5bad05b1bac66d3e06132e82454643dda4 Mon Sep 17 00:00:00 2001 From: Dorian Date: Fri, 10 Apr 2026 00:08:42 +0100 Subject: [PATCH] feat: add production build mode to dev-start.sh (option 10) Linux-only option that mirrors ISO install exactly: builds backend (release), frontend (with typecheck), syncs all configs, and restarts all system services (Tor, WireGuard, NostrVPN, nginx, backend). Co-Authored-By: Claude Opus 4.6 --- scripts/dev-start.sh | 109 ++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 108 insertions(+), 1 deletion(-) diff --git a/scripts/dev-start.sh b/scripts/dev-start.sh index 72709bb6..6a84a578 100755 --- a/scripts/dev-start.sh +++ b/scripts/dev-start.sh @@ -39,6 +39,13 @@ fi echo "" echo "Archipelago Dev Server" echo "" + +# Detect if running on a Linux dev machine (production-like mode available) +IS_LINUX=false +if [[ "$OSTYPE" == "linux"* ]]; then + IS_LINUX=true +fi + echo " 0) Boot branding dev (GRUB theme, Plymouth, installer — patch + QEMU)" echo " 1) Mock backend (UI dev — fastest, no Docker/Podman needed)" echo " 2) Full stack (Rust backend + frontend)" @@ -49,8 +56,12 @@ echo " 6) Boot mode (simulated 25s startup — mock)" echo " 7) Testnet stack (signet Bitcoin + LND + ThunderHub via Podman)" echo " 8) Manual instructions" echo " 9) Container orchestration dev (live testing on .228)" +if [ "$IS_LINUX" = true ]; then +echo " 10) Production build (Linux only — build, install, restart all services)" +echo " Mirrors ISO exactly: backend + frontend + Tor + WG + NostrVPN + nginx" +fi echo "" -read -p "Enter choice [0-9]: " choice +read -p "Enter choice [0-10]: " choice case $choice in 0) @@ -286,6 +297,102 @@ case $choice in echo "" exec "$SCRIPT_DIR/dev-container-test.sh" ;; + 10) + if [ "$IS_LINUX" != true ]; then + echo "Production build is only available on Linux dev machines." + exit 1 + fi + + echo "" + echo "Production Build — mirrors ISO install exactly" + echo "" + + FAILED=0 + + # Step 1: Build backend + echo "[1/5] Building Rust backend (release)..." + cd "$BACKEND_DIR/archipelago" + if cargo build --release 2>&1 | tail -3; then + RELEASE_BIN="$BACKEND_DIR/target/release/archipelago" + sudo cp "$RELEASE_BIN" /usr/local/bin/archipelago + sudo chmod +x /usr/local/bin/archipelago + echo " Backend installed: $(ls -lh /usr/local/bin/archipelago | awk '{print $5}')" + else + echo " FAILED: cargo build --release" + FAILED=1 + fi + + # Step 2: Type-check + build frontend + echo "[2/5] Building frontend..." + cd "$FRONTEND_DIR" + if [ ! -d "node_modules" ]; then + npm install + fi + if npx vue-tsc -b --noEmit 2>&1 | tail -3; then + npm run build 2>&1 | tail -3 + sudo cp -r "$PROJECT_ROOT/web/dist/neode-ui/"* /opt/archipelago/web-ui/ + echo " Frontend deployed to /opt/archipelago/web-ui/" + else + echo " FAILED: vue-tsc type check" + FAILED=1 + fi + + # Step 3: Sync configs from repo + echo "[3/5] Syncing configs..." + sudo cp "$PROJECT_ROOT/image-recipe/configs/archipelago.service" /etc/systemd/system/archipelago.service + sudo cp "$PROJECT_ROOT/image-recipe/configs/nginx-archipelago.conf" /etc/nginx/sites-available/archipelago + sudo cp "$PROJECT_ROOT/image-recipe/configs/snippets/"*.conf /etc/nginx/snippets/ 2>/dev/null + for unit in archipelago-tor-helper.service archipelago-tor-helper.path archipelago-wg.service archipelago-wg-address.service nostr-relay.service nostr-vpn.service; do + sudo cp "$PROJECT_ROOT/image-recipe/configs/$unit" "/etc/systemd/system/$unit" + done + sudo cp "$PROJECT_ROOT/scripts/tor-helper.sh" /opt/archipelago/scripts/tor-helper.sh + sudo chmod +x /opt/archipelago/scripts/tor-helper.sh + sudo cp "$PROJECT_ROOT/scripts/archipelago-wg" /usr/local/bin/archipelago-wg + sudo chmod +x /usr/local/bin/archipelago-wg + echo " Configs synced" + + # Step 4: Sync Tor hostnames + echo "[4/5] Syncing Tor hostnames..." + for svc in archipelago bitcoin electrumx lnd btcpay mempool fedimint; do + dir="/var/lib/archipelago/tor/hidden_service_$svc" + if [ -f "$dir/hostname" ]; then + sudo cp "$dir/hostname" "/var/lib/archipelago/tor-hostnames/$svc" + fi + done + sudo chown -R "$(whoami)":"$(whoami)" /var/lib/archipelago/tor-hostnames 2>/dev/null + + # Step 5: Reload and restart all services + echo "[5/5] Restarting services..." + sudo systemctl daemon-reload + sudo nginx -t 2>&1 && sudo systemctl reload nginx + sudo systemctl restart archipelago + + # Verify + echo "" + echo "Service Status:" + for svc in tor@default archipelago-wg archipelago-wg-address nostr-relay nostr-vpn archipelago-tor-helper.path archipelago nginx; do + STATUS=$(systemctl is-active "$svc" 2>/dev/null) + if [ "$STATUS" = "active" ]; then + printf " %-30s active\n" "$svc" + else + printf " %-30s FAILED\n" "$svc" + FAILED=1 + fi + done + + echo "" + if [ "$FAILED" -eq 0 ]; then + HOST_IP=$(hostname -I 2>/dev/null | awk '{print $1}') + ONION=$(cat /var/lib/archipelago/tor-hostnames/archipelago 2>/dev/null || echo "generating...") + echo "All services running. Access:" + echo " LAN: http://$HOST_IP" + echo " Tor: http://$ONION" + echo " WG: 10.44.0.1" + echo " RPC: http://127.0.0.1:5678/rpc/v1" + else + echo "Some services failed. Check: journalctl -u --no-pager -n 20" + fi + ;; *) echo "Invalid choice" exit 1