chore: dev environment — signet testnet stack, mock LND RPCs, faucet button
Switch docker-compose from regtest to signet, add standalone testnet stack (docker-compose.testnet.yml) with Bitcoin+LND+ThunderHub+Fedimint. Mock backend now auto-detects Podman/Docker sockets and includes full LND/Lightning RPC mocks. Dev scripts refactored with boot mode, testnet option, and macOS EAGAIN fix for port cleanup. Added dev faucet button to Home.vue. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -1,235 +1,223 @@
|
||||
#!/bin/bash
|
||||
set -euo pipefail
|
||||
# Archipelago Development Server Starter
|
||||
# Pure Archipelago implementation - NO StartOS
|
||||
|
||||
set +e
|
||||
|
||||
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
||||
PROJECT_ROOT="$(cd "$SCRIPT_DIR/.." && pwd)"
|
||||
|
||||
echo "🚀 Archipelago Development Server Starter"
|
||||
echo ""
|
||||
|
||||
# Use the workspace directory
|
||||
FRONTEND_DIR="$PROJECT_ROOT/neode-ui"
|
||||
BACKEND_DIR="$PROJECT_ROOT/core"
|
||||
|
||||
# Verify the frontend directory exists
|
||||
# Quietly kill a port — avoids EAGAIN by not piping through xargs
|
||||
kill_port() {
|
||||
local pids
|
||||
pids=$(lsof -ti:"$1" 2>/dev/null) || true
|
||||
if [ -n "$pids" ]; then
|
||||
echo "$pids" | while read -r pid; do
|
||||
kill -9 "$pid" 2>/dev/null || true
|
||||
done
|
||||
sleep 1
|
||||
fi
|
||||
}
|
||||
|
||||
cleanup_ports() {
|
||||
kill_port 5959
|
||||
kill_port 8100
|
||||
}
|
||||
|
||||
ensure_deps() {
|
||||
cd "$FRONTEND_DIR"
|
||||
if [ ! -d "node_modules" ]; then
|
||||
echo " Installing dependencies..."
|
||||
npm install
|
||||
fi
|
||||
}
|
||||
|
||||
if [ ! -d "$FRONTEND_DIR" ]; then
|
||||
echo "❌ Frontend directory not found: $FRONTEND_DIR"
|
||||
echo "Frontend directory not found: $FRONTEND_DIR"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
echo "Choose a development mode:"
|
||||
echo " 1) Mock backend (UI development only - fastest)"
|
||||
echo " 2) Full stack (Archipelago backend + frontend)"
|
||||
echo " 3) Setup mode (first-time user setup flow - mock)"
|
||||
echo " 4) Onboarding mode (onboarding flow - mock)"
|
||||
echo " 5) Existing user (login with password - mock)"
|
||||
echo " 6) Show manual instructions"
|
||||
echo ""
|
||||
read -p "Enter choice [1-6]: " choice
|
||||
echo "Archipelago Dev Server"
|
||||
echo ""
|
||||
echo " 1) Mock backend (UI dev — fastest, no Docker/Podman needed)"
|
||||
echo " 2) Full stack (Rust backend + frontend)"
|
||||
echo " 3) Setup mode (first-time password setup — mock)"
|
||||
echo " 4) Onboarding mode (onboarding flow — mock)"
|
||||
echo " 5) Existing user (login screen — mock)"
|
||||
echo " 6) Boot mode (simulated 25s startup — mock)"
|
||||
echo " 7) Testnet stack (signet Bitcoin + LND + ThunderHub via Podman)"
|
||||
echo " 8) Manual instructions"
|
||||
echo ""
|
||||
read -p "Enter choice [1-8]: " choice
|
||||
|
||||
case $choice in
|
||||
1)
|
||||
echo ""
|
||||
echo "🎨 Starting frontend with mock backend..."
|
||||
cd "$FRONTEND_DIR"
|
||||
|
||||
# Kill any existing processes
|
||||
echo " 🧹 Cleaning up ports 5959 and 8100..."
|
||||
lsof -ti:5959 | xargs kill -9 2>/dev/null || true
|
||||
lsof -ti:8100 | xargs kill -9 2>/dev/null || true
|
||||
sleep 1
|
||||
|
||||
# Check dependencies
|
||||
if [ ! -d "node_modules" ]; then
|
||||
echo "⚠️ Installing dependencies..."
|
||||
npm install
|
||||
fi
|
||||
|
||||
echo " Running: npm run dev:mock"
|
||||
echo " (Press Ctrl+C to stop)"
|
||||
echo ""
|
||||
npm run dev:mock
|
||||
echo "Starting frontend with mock backend..."
|
||||
cleanup_ports
|
||||
ensure_deps
|
||||
exec npm run dev:mock
|
||||
;;
|
||||
2)
|
||||
echo ""
|
||||
echo "🔧 Starting FULL STACK (Archipelago backend + frontend + Docker apps)..."
|
||||
|
||||
# Kill ports
|
||||
echo " 🧹 Cleaning up ports 5959 and 8100..."
|
||||
lsof -ti:5959 | xargs kill -9 2>/dev/null || true
|
||||
lsof -ti:8100 | xargs kill -9 2>/dev/null || true
|
||||
sleep 1
|
||||
|
||||
# Mock backend simulates apps — Docker containers optional
|
||||
echo ""
|
||||
echo " ℹ️ Mock backend will simulate apps (Docker containers optional)"
|
||||
|
||||
echo ""
|
||||
# Check if backend can build
|
||||
echo " 🔨 Checking backend build..."
|
||||
echo "Starting full stack (Rust backend + frontend)..."
|
||||
cleanup_ports
|
||||
|
||||
if [ ! -d "$BACKEND_DIR" ]; then
|
||||
echo "❌ Backend directory not found: $BACKEND_DIR"
|
||||
echo "Backend directory not found: $BACKEND_DIR"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
|
||||
cd "$BACKEND_DIR"
|
||||
if ! cargo check --bin archipelago > /tmp/archipelago-backend-check.log 2>&1; then
|
||||
echo "❌ Backend build check failed. See /tmp/archipelago-backend-check.log for details."
|
||||
echo " Falling back to mock backend for UI development."
|
||||
cd "$FRONTEND_DIR"
|
||||
if [ ! -d "node_modules" ]; then
|
||||
npm install
|
||||
fi
|
||||
npm run dev:mock
|
||||
exit 0
|
||||
echo "Backend build check failed. See /tmp/archipelago-backend-check.log"
|
||||
echo "Falling back to mock backend."
|
||||
ensure_deps
|
||||
exec npm run dev:mock
|
||||
fi
|
||||
|
||||
echo " 🚀 Starting Archipelago backend..."
|
||||
# Set development environment variables
|
||||
|
||||
echo " Starting Rust backend..."
|
||||
export ARCHIPELAGO_DATA_DIR=/tmp/archipelago-dev
|
||||
export ARCHIPELAGO_DEV_DATA_DIR=/tmp/archipelago-dev
|
||||
export ARCHIPELAGO_DEV_MODE=true
|
||||
export ARCHIPELAGO_BIND=127.0.0.1:5959
|
||||
export ARCHIPELAGO_LOG_LEVEL=debug
|
||||
export ARCHIPELAGO_PORT_OFFSET=10000
|
||||
export ARCHIPELAGO_BITCOIN_SIMULATION=mock
|
||||
export ARCHIPELAGO_CONTAINER_RUNTIME=docker
|
||||
|
||||
|
||||
cargo run --bin archipelago > /tmp/archipelago-backend.log 2>&1 &
|
||||
BACKEND_PID=$!
|
||||
echo " Backend PID: $BACKEND_PID"
|
||||
echo " Logs: tail -f /tmp/archipelago-backend.log"
|
||||
|
||||
# Wait for backend to start listening on port 5959
|
||||
echo " ⏳ Waiting for backend to start on port 5959..."
|
||||
timeout=60
|
||||
count=0
|
||||
while ! lsof -ti:5959 > /dev/null 2>&1 && [ $count -lt $timeout ]; do
|
||||
echo " Backend PID: $BACKEND_PID (logs: /tmp/archipelago-backend.log)"
|
||||
|
||||
echo " Waiting for backend on port 5959..."
|
||||
for i in $(seq 1 60); do
|
||||
if lsof -ti:5959 >/dev/null 2>&1; then break; fi
|
||||
sleep 1
|
||||
count=$((count + 1))
|
||||
done
|
||||
|
||||
if ! lsof -ti:5959 > /dev/null 2>&1; then
|
||||
echo "❌ Backend did not start on port 5959 within $timeout seconds."
|
||||
echo " Killing backend process $BACKEND_PID."
|
||||
kill $BACKEND_PID 2>/dev/null || true
|
||||
echo " Falling back to mock backend for UI development."
|
||||
cd "$FRONTEND_DIR"
|
||||
if [ ! -d "node_modules" ]; then
|
||||
npm install
|
||||
fi
|
||||
npm run dev:mock
|
||||
exit 0
|
||||
|
||||
if ! lsof -ti:5959 >/dev/null 2>&1; then
|
||||
echo "Backend did not start. Falling back to mock."
|
||||
kill "$BACKEND_PID" 2>/dev/null || true
|
||||
ensure_deps
|
||||
exec npm run dev:mock
|
||||
fi
|
||||
|
||||
echo " ✅ Backend is listening on port 5959"
|
||||
|
||||
# Start frontend
|
||||
echo " 🎨 Starting frontend..."
|
||||
cd "$FRONTEND_DIR"
|
||||
|
||||
if [ ! -d "node_modules" ]; then
|
||||
echo " Installing frontend dependencies..."
|
||||
npm install
|
||||
fi
|
||||
|
||||
# Trap to kill backend on exit (Docker containers keep running)
|
||||
|
||||
echo " Backend ready."
|
||||
trap "kill $BACKEND_PID 2>/dev/null" EXIT
|
||||
|
||||
echo ""
|
||||
echo " (Press Ctrl+C to stop servers)"
|
||||
echo " 💡 Docker containers will keep running. Use 'docker compose down' to stop them."
|
||||
echo ""
|
||||
npm run dev
|
||||
|
||||
ensure_deps
|
||||
exec npm run dev
|
||||
;;
|
||||
3)
|
||||
echo ""
|
||||
echo "🔧 Starting in SETUP mode (mock backend)..."
|
||||
cd "$FRONTEND_DIR"
|
||||
|
||||
# Kill ports
|
||||
lsof -ti:5959 | xargs kill -9 2>/dev/null || true
|
||||
lsof -ti:8100 | xargs kill -9 2>/dev/null || true
|
||||
sleep 1
|
||||
|
||||
if [ ! -d "node_modules" ]; then
|
||||
npm install
|
||||
fi
|
||||
|
||||
echo " Starting setup flow..."
|
||||
VITE_DEV_MODE=setup npm run dev:mock
|
||||
echo "Starting setup mode..."
|
||||
cleanup_ports
|
||||
ensure_deps
|
||||
VITE_DEV_MODE=setup exec npm run dev:mock
|
||||
;;
|
||||
4)
|
||||
echo ""
|
||||
echo "📚 Starting in ONBOARDING mode (mock backend)..."
|
||||
cd "$FRONTEND_DIR"
|
||||
|
||||
# Kill ports
|
||||
lsof -ti:5959 | xargs kill -9 2>/dev/null || true
|
||||
lsof -ti:8100 | xargs kill -9 2>/dev/null || true
|
||||
sleep 1
|
||||
|
||||
if [ ! -d "node_modules" ]; then
|
||||
npm install
|
||||
fi
|
||||
|
||||
echo " Starting onboarding flow..."
|
||||
VITE_DEV_MODE=onboarding npm run dev:mock
|
||||
echo "Starting onboarding mode..."
|
||||
cleanup_ports
|
||||
ensure_deps
|
||||
VITE_DEV_MODE=onboarding exec npm run dev:mock
|
||||
;;
|
||||
5)
|
||||
echo ""
|
||||
echo "👤 Starting as EXISTING USER (mock backend)..."
|
||||
cd "$FRONTEND_DIR"
|
||||
|
||||
# Kill ports
|
||||
lsof -ti:5959 | xargs kill -9 2>/dev/null || true
|
||||
lsof -ti:8100 | xargs kill -9 2>/dev/null || true
|
||||
sleep 1
|
||||
|
||||
if [ ! -d "node_modules" ]; then
|
||||
npm install
|
||||
fi
|
||||
|
||||
echo " Starting with login screen..."
|
||||
VITE_DEV_MODE=existing npm run dev:mock
|
||||
echo "Starting existing user mode..."
|
||||
cleanup_ports
|
||||
ensure_deps
|
||||
VITE_DEV_MODE=existing exec npm run dev:mock
|
||||
;;
|
||||
6)
|
||||
echo ""
|
||||
echo "📋 Manual Instructions:"
|
||||
echo "Starting boot mode (25s simulated startup)..."
|
||||
cleanup_ports
|
||||
ensure_deps
|
||||
VITE_DEV_MODE=boot exec npm run dev:mock
|
||||
;;
|
||||
7)
|
||||
echo ""
|
||||
echo "For UI development (mock backend):"
|
||||
echo "Starting testnet stack (signet) via Podman/Docker..."
|
||||
|
||||
# Check for a working container runtime (binary exists AND daemon responds)
|
||||
RUNTIME=""
|
||||
COMPOSE=""
|
||||
if command -v docker &>/dev/null && docker ps &>/dev/null; then
|
||||
RUNTIME="docker"
|
||||
COMPOSE="docker compose"
|
||||
elif command -v podman &>/dev/null && podman ps &>/dev/null; then
|
||||
if command -v podman-compose &>/dev/null; then
|
||||
RUNTIME="podman"
|
||||
COMPOSE="podman-compose"
|
||||
else
|
||||
RUNTIME="podman"
|
||||
COMPOSE="podman compose"
|
||||
fi
|
||||
fi
|
||||
|
||||
if [ -z "$RUNTIME" ]; then
|
||||
echo ""
|
||||
echo "No working container runtime detected."
|
||||
echo ""
|
||||
if command -v podman &>/dev/null; then
|
||||
echo "Podman is installed but the machine isn't running:"
|
||||
echo " podman machine start"
|
||||
elif command -v docker &>/dev/null; then
|
||||
echo "Docker is installed but the daemon isn't running."
|
||||
echo "Start Docker Desktop and try again."
|
||||
else
|
||||
echo "Install Docker Desktop or Podman:"
|
||||
echo " brew install --cask docker"
|
||||
echo " # or"
|
||||
echo " brew install podman podman-compose"
|
||||
echo " podman machine init && podman machine start"
|
||||
fi
|
||||
echo ""
|
||||
exit 1
|
||||
fi
|
||||
|
||||
echo " Using: $RUNTIME"
|
||||
cd "$PROJECT_ROOT"
|
||||
|
||||
echo " Starting signet Bitcoin + LND + ThunderHub + Fedimint..."
|
||||
$COMPOSE -f docker-compose.testnet.yml up -d
|
||||
|
||||
echo ""
|
||||
echo " Testnet stack starting. Services:"
|
||||
echo " ThunderHub: http://localhost:3010 (password: thunderhub)"
|
||||
echo " Fedimint Guardian: http://localhost:18175"
|
||||
echo " LND REST: http://localhost:8080"
|
||||
echo " Bitcoin RPC: localhost:38332"
|
||||
echo ""
|
||||
echo " Get signet coins: https://signetfaucet.com"
|
||||
echo ""
|
||||
echo " Also starting mock frontend..."
|
||||
cleanup_ports
|
||||
ensure_deps
|
||||
exec npm run dev:mock
|
||||
;;
|
||||
8)
|
||||
echo ""
|
||||
echo "Manual Instructions"
|
||||
echo ""
|
||||
echo "UI development (mock backend, no Docker):"
|
||||
echo " cd $FRONTEND_DIR"
|
||||
echo " npm run dev:mock"
|
||||
echo " npm install && npm run dev:mock"
|
||||
echo ""
|
||||
echo "For full stack (Docker apps + Archipelago backend + frontend):"
|
||||
echo " Terminal 1 (Docker Apps):"
|
||||
echo " cd $PROJECT_ROOT"
|
||||
echo " ./start-docker-apps.sh"
|
||||
echo "Dev modes (prepend to command):"
|
||||
echo " VITE_DEV_MODE=setup First-time setup flow"
|
||||
echo " VITE_DEV_MODE=onboarding Onboarding flow"
|
||||
echo " VITE_DEV_MODE=existing Login screen"
|
||||
echo " VITE_DEV_MODE=boot Boot sequence"
|
||||
echo ""
|
||||
echo " Terminal 2 (Backend):"
|
||||
echo " cd $BACKEND_DIR"
|
||||
echo " export ARCHIPELAGO_CONTAINER_RUNTIME=docker"
|
||||
echo " export ARCHIPELAGO_DEV_MODE=true"
|
||||
echo " cargo run --bin archipelago"
|
||||
echo "Testnet stack (requires Podman or Docker):"
|
||||
echo " podman compose -f docker-compose.testnet.yml up -d"
|
||||
echo ""
|
||||
echo " Terminal 3 (Frontend):"
|
||||
echo " cd $FRONTEND_DIR"
|
||||
echo " npm run dev"
|
||||
echo "Full stack (requires Rust toolchain):"
|
||||
echo " Terminal 1: cd $BACKEND_DIR && cargo run --bin archipelago"
|
||||
echo " Terminal 2: cd $FRONTEND_DIR && npm run dev"
|
||||
echo ""
|
||||
echo "Then open: http://localhost:8100"
|
||||
echo ""
|
||||
echo "To stop Docker apps:"
|
||||
echo " cd $PROJECT_ROOT"
|
||||
echo " ./stop-docker-apps.sh"
|
||||
echo ""
|
||||
echo "Mock backend dev modes:"
|
||||
echo " VITE_DEV_MODE=setup - First-time setup flow"
|
||||
echo " VITE_DEV_MODE=onboarding - Onboarding flow"
|
||||
echo " VITE_DEV_MODE=existing - Login screen"
|
||||
echo "Access: http://localhost:8100 (password: password123)"
|
||||
;;
|
||||
*)
|
||||
echo "Invalid choice"
|
||||
|
||||
Reference in New Issue
Block a user