From 6035c93289894d9f49e568ff285908d1531631bd Mon Sep 17 00:00:00 2001 From: Dorian Date: Sat, 14 Feb 2026 16:44:20 +0000 Subject: [PATCH] Enhance ISO build process and documentation for Archipelago - Updated BUILD-GUIDE.md to clarify instructions for building the Archipelago Auto-Installer ISO, emphasizing the recommended method of building directly on the target server. - Added auto-installation of missing dependencies (xorriso, podman) when running the build script with sudo. - Enhanced the build-auto-installer-iso.sh script to capture container images from the live server, ensuring the ISO includes the same set of applications as the dev server. - Revised deployment documentation to stress the importance of building the Rust backend on the Linux dev server and included new instructions for capturing system-level changes for ISO builds. - Improved UI components and added new bundled applications (BTCPay Server, Mempool Explorer, Nostr Relay, Strfry Relay, Tailscale) to enhance user experience. --- .cursor/rules/Development-Workflow.md | 47 +- .cursor/rules/Development-Workflow.mdc | 33 ++ .cursor/rules/coding-rules.mdc | 38 +- BUILD-GUIDE.md | 42 +- build-iso-complete.sh | 20 +- core/Cargo.lock | 1 + core/archipelago/Cargo.toml | 3 + core/archipelago/src/api/handler.rs | 88 +++ core/archipelago/src/api/rpc.rs | 19 + docker/lnd-ui/index.html | 534 ++++++++++--------- image-recipe/build-auto-installer-iso.sh | 199 ++++++- neode-ui/src/router/index.ts | 9 + neode-ui/src/stores/container.ts | 50 ++ neode-ui/src/views/Apps.vue | 9 +- neode-ui/src/views/ContainerAppDetails.vue | 2 +- neode-ui/src/views/ContainerApps.vue | 48 +- neode-ui/src/views/Marketplace.vue | 10 - neode-ui/src/views/MarketplaceAppDetails.vue | 42 +- scripts/deploy-to-target.sh | 36 +- 19 files changed, 824 insertions(+), 406 deletions(-) diff --git a/.cursor/rules/Development-Workflow.md b/.cursor/rules/Development-Workflow.md index 3a99d994..564cd43e 100644 --- a/.cursor/rules/Development-Workflow.md +++ b/.cursor/rules/Development-Workflow.md @@ -38,6 +38,7 @@ This is where ALL development happens: 1. **Snapshot the dev server** (192.168.1.228): - Capture current backend binary (`/usr/local/bin/archipelago`) - Capture current frontend files (`/opt/archipelago/web-ui`) + - When `DEV_SERVER` is set: capture container images from the live server so the ISO prepackages current apps - Capture system configs (Nginx, systemd, etc.) - Capture app manifests and configs @@ -120,6 +121,12 @@ Creates a live system ISO (boots into a live environment, doesn't install). ## Deployment to Dev Server +### Dev server access + +- **Host:** `archipelago@192.168.1.228` +- **Password:** `archipelago` β€” use this for deployment. For non-interactive sync/deploy from scripts or the agent, use: `sshpass -p "archipelago"` (e.g. `sshpass -p "archipelago" rsync ...` or prepend it to ssh/rsync when running `./scripts/deploy-to-target.sh` or equivalent). +- **Build approach:** We build **directly on the server** by SSHing in and running `cargo build --release` there. Do not build the backend on macOS and copy the binary. + ### ⚠️ CRITICAL: Backend Compilation Architecture **NEVER compile the Rust backend on macOS and deploy to Linux!** @@ -133,23 +140,20 @@ The dev server (`192.168.1.228`) is **x86_64 Linux (Debian 12)**. Binaries compi ### Deployment Procedures -1. **Backend** (MUST build on Linux): +1. **Backend** (MUST build on Linux β€” use rsync then build on server): ```bash - # Option 1: SSH and build directly on server - ssh archipelago@192.168.1.228 - cd ~/archy/core/archipelago - source ~/.cargo/env # Load Rust environment - cargo build --release --bin archipelago - sudo systemctl stop archipelago - sudo cp ../target/release/archipelago /usr/local/bin/ - sudo systemctl start archipelago - - # Option 2: Update source and build remotely - # From local machine: - scp core/archipelago/src/**/*.rs archipelago@192.168.1.228:~/archy/core/archipelago/src/ - ssh archipelago@192.168.1.228 'source ~/.cargo/env && cd ~/archy/core/archipelago && cargo build --release' - ssh archipelago@192.168.1.228 'sudo systemctl stop archipelago && sudo cp ~/archy/core/target/release/archipelago /usr/local/bin/ && sudo systemctl start archipelago' + # From project root. Sync source to server (exclude local target/.git). + sshpass -p "archipelago" rsync -avz --exclude target --exclude .git -e "ssh -o StrictHostKeyChecking=no" \ + core/ archipelago@192.168.1.228:~/archy/core/ + + # Build on server and deploy binary + sshpass -p "archipelago" ssh -o StrictHostKeyChecking=no archipelago@192.168.1.228 \ + 'source ~/.cargo/env && cd ~/archy/core/archipelago && cargo build --release && \ + sudo systemctl stop archipelago && \ + sudo cp ~/archy/core/target/release/archipelago /usr/local/bin/ && \ + sudo systemctl start archipelago' ``` + **Do not** build the binary on macOS and copy it; always rsync source and build on the server. 2. **Frontend** (can build locally): ```bash @@ -175,16 +179,17 @@ The dev server (`192.168.1.228`) is **x86_64 Linux (Debian 12)**. Binaries compi ### 🚨 NEVER VIOLATE THESE 1. **ALWAYS deploy to the live development server (192.168.1.228)** for testing -2. **πŸ”΄ NEVER EVER compile the Rust backend on macOS and deploy to Linux** +2. **After every change: sync and build on the live server.** When you finish implementing a feature or fix, run the deploy script so the live server has the latest code. Command: `./scripts/deploy-to-target.sh --live` (from project root). If SSH is not available in the current environment, tell the user to run it locally. Do not skip this step. **App UIs** (e.g. `docker/lnd-ui/`, `docker/bitcoin-ui/`) are served by their own containers; the deploy script rebuilds the LND UI image and restarts its container so changes to the LND UI are visible after deploy. +3. **πŸ”΄ NEVER EVER compile the Rust backend on macOS and deploy to Linux** - Dev server is `x86_64 Linux (Debian 12)` - Always build backend **ON the Linux server** using `source ~/.cargo/env && cargo build --release` - macOS binaries will cause "Exec format error" and break the system - Frontend (Vue.js) CAN be built on macOS - it's just HTML/CSS/JS -3. **The ISO must capture the CURRENT STATE of the dev server**, not build from source -4. **Frontend build output is in `web/dist/neode-ui/`**, NOT `neode-ui/dist/` -5. **Nginx serves on port 80** and proxies backend on `localhost:5678` -6. **App icons are in `neode-ui/public/assets/img/app-icons/`** -7. **The auto-installer ISO is the ONLY way to deploy** - no live systems +4. **The ISO must capture the CURRENT STATE of the dev server**, not build from source +5. **Frontend build output is in `web/dist/neode-ui/`**, NOT `neode-ui/dist/` +6. **Nginx serves on port 80** and proxies backend on `localhost:5678` +7. **App icons are in `neode-ui/public/assets/img/app-icons/`** +8. **The auto-installer ISO is the ONLY way to deploy** - no live systems ## Testing Checklist diff --git a/.cursor/rules/Development-Workflow.mdc b/.cursor/rules/Development-Workflow.mdc index 1581538d..1fbaade1 100644 --- a/.cursor/rules/Development-Workflow.mdc +++ b/.cursor/rules/Development-Workflow.mdc @@ -9,6 +9,10 @@ alwaysApply: true **Always deploy to live system for testing** - The target device (192.168.1.228) is a development machine, so deploy changes directly to the live system rather than using dev servers. +### Backend: build on server via rsync (never on macOS) +- **Always** deploy backend by: (1) rsync `core/` to `archipelago@192.168.1.228:~/archy/core/`, then (2) SSH and run `cargo build --release` on the server, then copy binary to `/usr/local/bin/` and restart `archipelago.service`. +- Use `sshpass -p "archipelago"` for non-interactive rsync/SSH. **Action these builds** when making backend changes; do not build the Rust binary on macOS and copy it (causes Exec format error on Linux). + ### Standard Deployment Command ```bash @@ -82,6 +86,35 @@ Common containers: **CRITICAL**: After testing on the live server, always update the ISO build to include your changes. +### Building the ISO + +**Recommended**: Build on the target server (has all dependencies): + +```bash +# SSH to target server +ssh archipelago@192.168.1.228 + +# Navigate to project +cd ~/archy/image-recipe + +# Run build with sudo (auto-installs missing deps like xorriso) +sudo ./build-auto-installer-iso.sh + +# The ISO will be at: results/archipelago-auto-installer-*.iso + +# Copy back to Mac +# On your Mac: +scp archipelago@192.168.1.228:~/archy/image-recipe/results/archipelago-auto-installer-*.iso . +``` + +**Alternative**: Build from Mac (requires Docker Desktop installed). + +### Common ISO Build Issues + +- **Missing xorriso**: Run with `sudo` to auto-install, or: `sudo apt install -y xorriso` +- **Missing podman**: Run with `sudo` to auto-install, or: `sudo apt install -y podman` +- **No Docker on Mac**: Either install Docker Desktop or build on target server (recommended) + ### System Configuration Files to Sync When you make system-level changes on the live server, capture them for the ISO build: diff --git a/.cursor/rules/coding-rules.mdc b/.cursor/rules/coding-rules.mdc index d0e4d890..7bf67f5b 100644 --- a/.cursor/rules/coding-rules.mdc +++ b/.cursor/rules/coding-rules.mdc @@ -439,6 +439,13 @@ ## Development Workflow +### Backend: always build on the dev server (never on macOS) +- **CRITICAL**: The Rust backend **must** be built **on the Linux dev server**, not on macOS. Deploy by **rsync then build**: + 1. **Rsync** source to server: `sshpass -p "archipelago" rsync -avz --exclude target --exclude .git -e "ssh -o StrictHostKeyChecking=no" core/ archipelago@192.168.1.228:~/archy/core/` + 2. **Build and deploy on server**: `sshpass -p "archipelago" ssh -o StrictHostKeyChecking=no archipelago@192.168.1.228 'source ~/.cargo/env && cd ~/archy/core/archipelago && cargo build --release && sudo systemctl stop archipelago && sudo cp ~/archy/core/target/release/archipelago /usr/local/bin/ && sudo systemctl start archipelago'` +- When making backend changes, **action the build**: run the rsync + SSH build/deploy steps above. Do not build the binary locally and copy it (causes Exec format error on Linux). +- Dev server: `archipelago@192.168.1.228`, password: `archipelago`. + ### Scripts & Automation - βœ… All scripts in `scripts/` directory - βœ… Use `#!/usr/bin/env bash` for portability @@ -507,21 +514,22 @@ 15. **Depend on external registries** - Host our own or use Docker Hub ### βœ… ALWAYS DO: -1. **Use workspace-relative paths** - Portable code -2. **Create global Tailwind classes** - Consistent styling -3. **Build Archipelago-native solutions** - Clean architecture -4. **Include security in all containers** - Security first -5. **Use environment variables** - Configurable deployments -6. **Add modules to Cargo.toml** - Workspace coherence -7. **Create reusable components** - DRY principle -8. **Use Docker (dev) or Podman (prod)** - Standard containers -9. **Handle all errors gracefully** - User-friendly messages -10. **Follow the architecture plan** - Consistency -11. **Write tests** - Prevent regressions -12. **Document code** - Help future contributors -13. **Review your own code** - Catch issues early -14. **Run CI checks locally** - Before pushing -15. **Think production first** - Build it right +1. **Build backend on the dev server** - Rsync `core/` to `archipelago@192.168.1.228:~/archy/core/`, then SSH in and run `cargo build --release` and deploy the binary. Never build the Rust binary on macOS for deployment. +2. **Use workspace-relative paths** - Portable code +3. **Create global Tailwind classes** - Consistent styling +4. **Build Archipelago-native solutions** - Clean architecture +5. **Include security in all containers** - Security first +6. **Use environment variables** - Configurable deployments +7. **Add modules to Cargo.toml** - Workspace coherence +8. **Create reusable components** - DRY principle +9. **Use Docker (dev) or Podman (prod)** - Standard containers +10. **Handle all errors gracefully** - User-friendly messages +11. **Follow the architecture plan** - Consistency +12. **Write tests** - Prevent regressions +13. **Document code** - Help future contributors +14. **Review your own code** - Catch issues early +15. **Run CI checks locally** - Before pushing +16. **Think production first** - Build it right ## Architecture Adherence diff --git a/BUILD-GUIDE.md b/BUILD-GUIDE.md index 0706b92f..f29c3a54 100644 --- a/BUILD-GUIDE.md +++ b/BUILD-GUIDE.md @@ -4,11 +4,34 @@ Make sure you have: - Docker or Podman installed -- `xorriso` installed +- `xorriso` installed (for ISO creation) - Access to dev server: archipelago@192.168.1.228 +**Note**: When building on the target server with `sudo`, the script will automatically install missing dependencies (`xorriso`, `podman`). + ## Build Auto-Installer ISO +### Option 1: Build on Target Server (Recommended) + +```bash +# SSH to target server +ssh archipelago@192.168.1.228 + +# Navigate to project +cd ~/archy/image-recipe + +# Run build (auto-installs missing deps) +sudo ./build-auto-installer-iso.sh + +# Copy ISO back to your Mac +# On your Mac: +scp archipelago@192.168.1.228:~/archy/image-recipe/results/archipelago-auto-installer-*.iso . +``` + +### Option 2: Build from Mac (requires Docker) + +**Important**: This requires Docker Desktop installed on macOS. + ```bash cd /Users/dorian/Projects/archy/image-recipe @@ -23,6 +46,7 @@ DEV_SERVER=archipelago@192.168.1.228 ./build-auto-installer-iso.sh βœ… Complete Debian 12 root filesystem βœ… Pre-built Archipelago backend βœ… Pre-built frontend (web UI) +βœ… **Prepackaged container images** (Bitcoin Knots, LND, UIs, and other bundled apps), loaded on first boot βœ… Nginx configuration (HTTPS ready) βœ… Auto-installer that: - Detects internal disk @@ -33,21 +57,9 @@ DEV_SERVER=archipelago@192.168.1.228 ./build-auto-installer-iso.sh ## What Users Need to Do Post-Install -1. **Deploy Containers** - The ISO doesn't include containers (too large) - - Example - Bitcoin Knots: - ```bash - sudo podman run -d --name bitcoin-knots \ - -p 8332:8332 -p 8333:8333 \ - -v /var/lib/archipelago/bitcoin:/home/bitcoin/.bitcoin \ - --label "com.archipelago.app=bitcoin-knots" \ - --label "com.archipelago.title=Bitcoin Knots" \ - docker.io/bitcoinknots/bitcoin:latest \ - -server=1 -txindex=1 -rpcallowip=0.0.0.0/0 \ - -rpcbind=0.0.0.0:8332 -dbcache=4096 - ``` +1. **Start apps from the Web UI** – Container images are prepackaged and loaded on first boot. Bitcoin Knots + UI, LND + UI, and other bundled apps are ready to start from the Web UI without manual `podman run`. No need to pull or deploy core containers. -2. **Access Web UI** - Navigate to `http://[server-ip]` +2. **Access Web UI** – Navigate to `http://[server-ip]` ## Testing the ISO diff --git a/build-iso-complete.sh b/build-iso-complete.sh index 76da6754..3d8c0399 100755 --- a/build-iso-complete.sh +++ b/build-iso-complete.sh @@ -21,6 +21,12 @@ # ./build-iso-complete.sh --remote archipelago@192.168.1.228 # ./build-iso-complete.sh --local --clean # +# Auto-installer from live server: when using --remote HOST, the ISO script +# (build-auto-installer-iso.sh) is run with DEV_SERVER=HOST so it captures +# backend, frontend, and container images from that host. Alternatively run +# DEV_SERVER=archipelago@192.168.1.228 ./image-recipe/build-auto-installer-iso.sh +# to build the auto-installer ISO with live capture only (no backend/frontend build). +# set -e # Exit on error @@ -32,7 +38,7 @@ SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" BUILD_DIR="$SCRIPT_DIR/image-recipe/build" BACKEND_SRC="$SCRIPT_DIR/core/archipelago" FRONTEND_SRC="$SCRIPT_DIR/neode-ui" -ISO_SCRIPT="$SCRIPT_DIR/image-recipe/build-debian-iso.sh" +ISO_SCRIPT="$SCRIPT_DIR/image-recipe/build-auto-installer-iso.sh" # Colors for output RED='\033[0;31m' @@ -315,8 +321,8 @@ if [[ "$BUILD_MODE" == "remote" ]]; then print_success "Files synced to remote" - print_info "Running ISO build on remote server..." - ssh -t "$REMOTE_HOST" "cd ~/archy/image-recipe && sudo bash build-debian-iso.sh" || { + print_info "Running ISO build on remote server (auto-installer, DEV_SERVER=$REMOTE_HOST)..." + ssh -t "$REMOTE_HOST" "cd ~/archy/image-recipe && DEV_SERVER=$REMOTE_HOST sudo -E bash build-auto-installer-iso.sh" || { print_error "ISO build failed on remote server" exit 1 } @@ -324,7 +330,7 @@ if [[ "$BUILD_MODE" == "remote" ]]; then print_success "ISO built on remote server" # Copy ISO back to local - ISO_NAME="archipelago-debian-12-x86_64.iso" + ISO_NAME="archipelago-installer-x86_64.iso" print_info "Copying ISO back to local machine..." mkdir -p "$SCRIPT_DIR/image-recipe/results" scp "$REMOTE_HOST:~/archy/image-recipe/results/$ISO_NAME" "$SCRIPT_DIR/image-recipe/results/" @@ -333,11 +339,11 @@ if [[ "$BUILD_MODE" == "remote" ]]; then else # Local build - print_info "Running ISO build locally..." + print_info "Running ISO build locally (auto-installer)..." cd "$SCRIPT_DIR/image-recipe" - sudo bash build-debian-iso.sh + sudo bash build-auto-installer-iso.sh - ISO_PATH="$SCRIPT_DIR/image-recipe/results/archipelago-debian-12-x86_64.iso" + ISO_PATH="$SCRIPT_DIR/image-recipe/results/archipelago-installer-x86_64.iso" fi # ============================================================================= diff --git a/core/Cargo.lock b/core/Cargo.lock index bfb9b3d3..f7081de5 100644 --- a/core/Cargo.lock +++ b/core/Cargo.lock @@ -42,6 +42,7 @@ dependencies = [ "hyper 0.14.32", "hyper-util", "hyper-ws-listener", + "reqwest", "serde", "serde_json", "serde_yaml", diff --git a/core/archipelago/Cargo.toml b/core/archipelago/Cargo.toml index ee17b120..9c070b34 100644 --- a/core/archipelago/Cargo.toml +++ b/core/archipelago/Cargo.toml @@ -47,5 +47,8 @@ uuid = { version = "1.0", features = ["v4"] } toml = "0.8" serde_yaml = "0.9" +# HTTP client (for LND REST proxy) +reqwest = { version = "0.11", features = ["json"] } + [dev-dependencies] tokio-test = "0.4" diff --git a/core/archipelago/src/api/handler.rs b/core/archipelago/src/api/handler.rs index 0f19902d..1b52c0a9 100644 --- a/core/archipelago/src/api/handler.rs +++ b/core/archipelago/src/api/handler.rs @@ -10,6 +10,8 @@ use tokio::sync::broadcast; use tokio_tungstenite::tungstenite::Message; use tracing::{debug, info}; +const CORS_ANY: &str = "*"; + pub struct ApiHandler { _config: Config, rpc_handler: Arc, @@ -53,6 +55,12 @@ impl ApiHandler { .status(StatusCode::OK) .body(hyper::Body::from("OK")) .unwrap()), + (Method::GET, path) if path.starts_with("/api/container/logs") => { + Self::handle_container_logs_http(self.rpc_handler.clone(), path).await + } + (Method::GET, path) if path.starts_with("/proxy/lnd/") => { + Self::handle_lnd_proxy(path).await + } _ => Ok(Response::builder() .status(StatusCode::NOT_FOUND) .body(hyper::Body::from("Not Found")) @@ -60,6 +68,86 @@ impl ApiHandler { } } + async fn handle_container_logs_http( + rpc: Arc, + path: &str, + ) -> Result> { + let query = path + .strip_prefix("/api/container/logs") + .and_then(|s| s.strip_prefix('?')) + .unwrap_or(""); + let params: std::collections::HashMap = + query + .split('&') + .filter_map(|p| { + let mut it = p.splitn(2, '='); + let k = it.next()?.to_string(); + let v = it.next()?.to_string(); + Some((k, v)) + }) + .collect(); + let app_id = params.get("app_id").map(|s| s.as_str()).unwrap_or("lnd"); + let lines = params + .get("lines") + .and_then(|s| s.parse::().ok()) + .unwrap_or(200); + + match rpc.get_container_logs_value(app_id, lines).await { + Ok(value) => { + let body = serde_json::json!({ "result": value }); + let body_bytes = serde_json::to_vec(&body).unwrap_or_default(); + Ok(Response::builder() + .status(StatusCode::OK) + .header("Content-Type", "application/json") + .header("Access-Control-Allow-Origin", CORS_ANY) + .body(hyper::Body::from(body_bytes)) + .unwrap()) + } + Err(e) => { + let body = serde_json::json!({ "error": e.to_string() }); + let body_bytes = serde_json::to_vec(&body).unwrap_or_default(); + Ok(Response::builder() + .status(StatusCode::INTERNAL_SERVER_ERROR) + .header("Content-Type", "application/json") + .header("Access-Control-Allow-Origin", CORS_ANY) + .body(hyper::Body::from(body_bytes)) + .unwrap()) + } + } + } + + async fn handle_lnd_proxy(path: &str) -> Result> { + let suffix = path.strip_prefix("/proxy/lnd").unwrap_or("/"); + let url = format!("http://127.0.0.1:8080{}", suffix); + match reqwest::get(&url).await { + Ok(resp) => { + let status = resp.status().as_u16(); + let headers = resp.headers().clone(); + let body = resp.bytes().await.unwrap_or_default(); + let mut builder = Response::builder().status(status); + if let Some(ct) = headers.get("content-type") { + if let Ok(s) = ct.to_str() { + builder = builder.header("Content-Type", s); + } + } + builder + .header("Access-Control-Allow-Origin", CORS_ANY) + .body(hyper::Body::from(body)) + .map_err(|e| anyhow::anyhow!("response build: {}", e)) + } + Err(e) => { + let body = serde_json::json!({ "error": e.to_string() }); + let body_bytes = serde_json::to_vec(&body).unwrap_or_default(); + Ok(Response::builder() + .status(StatusCode::BAD_GATEWAY) + .header("Content-Type", "application/json") + .header("Access-Control-Allow-Origin", CORS_ANY) + .body(hyper::Body::from(body_bytes)) + .unwrap()) + } + } + } + async fn handle_websocket( req: Request, state_manager: Arc, diff --git a/core/archipelago/src/api/rpc.rs b/core/archipelago/src/api/rpc.rs index 92587966..fea888c4 100644 --- a/core/archipelago/src/api/rpc.rs +++ b/core/archipelago/src/api/rpc.rs @@ -399,6 +399,25 @@ impl RpcHandler { Ok(serde_json::to_value(logs)?) } + /// Used by HTTP GET /api/container/logs (same logic as container-logs RPC). + pub async fn get_container_logs_value( + &self, + app_id: &str, + lines: u32, + ) -> Result { + let orchestrator = self + .orchestrator + .as_ref() + .ok_or_else(|| anyhow::anyhow!("Container orchestrator not available (dev mode required)"))?; + + let logs = orchestrator + .get_container_logs(app_id, lines) + .await + .context("Failed to get container logs")?; + + Ok(serde_json::to_value(logs)?) + } + async fn handle_container_health( &self, params: Option, diff --git a/docker/lnd-ui/index.html b/docker/lnd-ui/index.html index c45b127f..e9308103 100644 --- a/docker/lnd-ui/index.html +++ b/docker/lnd-ui/index.html @@ -225,6 +225,13 @@ .animate-ping { animation: ping 1s cubic-bezier(0, 0, 0.2, 1) infinite; } + + .modal-tab { transition: all 0.2s ease; } + .modal-tab.active { background: rgba(255,255,255,0.2); color: white; } + .modal-tab:not(.active) { color: rgba(255,255,255,0.6); } + .modal-tab:not(.active):hover { color: rgba(255,255,255,0.9); } + .tab-panel { display: none; } + .tab-panel.active { display: block; } @@ -234,295 +241,260 @@
- +
-
- -
-
- LND +
+
+
+
+ LND +
+
+
+

LND

+

Lightning Network Daemon for instant Bitcoin payments

+

β€”

- - -
-

LND

-

Lightning Network Daemon for instant Bitcoin payments

-

Regtest mode - Development environment

-
+
+
-
-
+
+

Node Status

-

Running

+

β€”

-
-
- ⚑ -
+

Channels

0

-
-
-
+

REST API

-

Active

+

β€”

- +
-
-
-
+

gRPC

-

Connected

+

β€”

- +
-
-
-
-
- - - -
-
-

Node Status

-

Lightning node information

-
+ +
+

Wallet

+

Balance, Receive, and Send will appear here when connected to your node.

+
+
+

Spendable

+

β€”

- -
-
-
- - - - Node Status -
- Running -
- -
-
- - - - Network -
- Regtest -
- -
-
- - - - Version -
- 0.17.4-beta -
+
+

Lightning

+

β€”

+
+
+

Total

+

β€”

- -
- -
-
-
- - - -
-
-

REST API

-

HTTP REST API access

-
-
- -
-
-
- - - - REST Endpoint -
- localhost:8080 -
- -
-
- - - - API Status -
- Active -
- -
-
- - - - API Version -
- v1 -
-
- - -
- -
-
-
- - - -
-
-

gRPC Connection

-

High-performance gRPC API

-
-
- -
-
-
- - - - gRPC Host -
- localhost:10009 -
- -
-
- - - - gRPC Status -
- Connected -
- -
-
- - - - P2P Port -
- 9735 -
-
- - +
+ +
+

Recent activity will be listed here.

+