diff --git a/.dockerignore b/.dockerignore index 37fa8d33..32d336cb 100644 --- a/.dockerignore +++ b/.dockerignore @@ -7,10 +7,11 @@ # Allow demo assets (AIUI pre-built dist) !demo/ -# Allow the Bitcoin UI mock shell (backend serves it from /docker/bitcoin-ui) +# Allow the Bitcoin UI + ElectrumX UI mock shells (served from /docker/*) !docker/ docker/* !docker/bitcoin-ui/ +!docker/electrs-ui/ # Allow backend source for ISO source builds !core/ diff --git a/neode-ui/Dockerfile.backend b/neode-ui/Dockerfile.backend index fde87eb3..3b4af25b 100644 --- a/neode-ui/Dockerfile.backend +++ b/neode-ui/Dockerfile.backend @@ -17,6 +17,7 @@ COPY neode-ui/ ./ # Sibling assets the mock backend reads relative to /app (../docker, ../demo): # the Bitcoin UI mock shell and any curated cloud files dropped into demo/files. COPY docker/bitcoin-ui /docker/bitcoin-ui +COPY docker/electrs-ui /docker/electrs-ui COPY demo/files /demo/files # Expose port diff --git a/neode-ui/docker/nginx-demo.conf b/neode-ui/docker/nginx-demo.conf index f8ec0819..ba042f16 100644 --- a/neode-ui/docker/nginx-demo.conf +++ b/neode-ui/docker/nginx-demo.conf @@ -62,6 +62,14 @@ http { proxy_set_header X-Real-IP $remote_addr; } + # ElectrumX UI status (polled by the electrs-ui shell) + location /electrs-status { + proxy_pass http://neode-backend:5959; + proxy_http_version 1.1; + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + } + # Proxy FileBrowser API to mock backend (demo mode) location /app/filebrowser/ { client_max_body_size 10G; diff --git a/neode-ui/mock-backend.js b/neode-ui/mock-backend.js index 2a4a58a7..06e8bd45 100755 --- a/neode-ui/mock-backend.js +++ b/neode-ui/mock-backend.js @@ -150,7 +150,7 @@ const SEED_BTCRELAY = { allow_tor: true, selected_peer_pubkey: '03d9b8a8db6b4f4d8b8d04c7a467c101f04c0ecbabc0e29e4dcb812a3b1c5f8f04', http_endpoint: '', - https_endpoint: 'https://shard.tx1138.com/', + https_endpoint: 'https://relay-' + randomHex(5) + '.example.net/', tor_endpoint: 'http://btc-relay-demoabcdefghijklmnop.onion/', }, trusted_nodes: [ @@ -758,19 +758,27 @@ function staticApp({ id, title, version, shortDesc, longDesc, license, state, la } // Static dev apps (always shown in My Apps when using mock backend). -// Only one Bitcoin implementation is pre-installed (Bitcoin Core); Bitcoin Knots -// remains installable from the marketplace. const staticDevApps = { bitcoin: staticApp({ id: 'bitcoin', title: 'Bitcoin Core', - version: '27.1', + version: '28.4.0', shortDesc: 'Full Bitcoin node', longDesc: 'Validate every transaction and block. Full consensus enforcement — the bedrock of sovereignty.', state: 'running', lanPort: 8332, icon: '/assets/img/app-icons/bitcoin-core.png', }), + 'bitcoin-knots': staticApp({ + id: 'bitcoin-knots', + title: 'Bitcoin Knots', + version: '28.1.0', + shortDesc: 'Full Bitcoin node', + longDesc: 'Validate and relay Bitcoin blocks and transactions with the Archipelago custom node UI.', + state: 'running', + lanPort: 8334, + icon: '/assets/img/app-icons/bitcoin-knots.webp', + }), lnd: staticApp({ id: 'lnd', title: 'LND', @@ -779,15 +787,17 @@ const staticDevApps = { longDesc: 'Instant Bitcoin payments with near-zero fees. Open channels, route payments, earn sats.', state: 'running', lanPort: 8080, + icon: '/assets/img/app-icons/lnd.svg', }), - electrs: staticApp({ - id: 'electrs', - title: 'Electrs', - version: '0.10.6', - shortDesc: 'Electrum Server in Rust', + electrumx: staticApp({ + id: 'electrumx', + title: 'ElectrumX', + version: '1.18.0', + shortDesc: 'Electrum server', longDesc: 'Private blockchain indexing for wallet lookups. Connect Sparrow, BlueWallet, or any Electrum-compatible wallet.', state: 'running', - lanPort: 50001, + lanPort: 50002, + icon: '/assets/img/app-icons/electrumx.webp', }), mempool: staticApp({ id: 'mempool', @@ -829,15 +839,6 @@ const staticDevApps = { lanPort: 8083, icon: '/assets/img/app-icons/file-browser.webp', }), - thunderhub: staticApp({ - id: 'thunderhub', - title: 'ThunderHub', - version: '0.13.31', - shortDesc: 'Lightning node management UI', - longDesc: 'Full Lightning node management — channels, payments, routing fees, and node health. Connect to your LND and manage everything from one dashboard.', - state: 'running', - lanPort: 3010, - }), fedimint: staticApp({ id: 'fedimint', title: 'Fedimint', @@ -979,31 +980,38 @@ app.get('/app/bitcoin-ui/', async (_req, res) => { }) // ── Mock app UIs served in the in-app iframe (DEMO) ───────────────────────── -function demoAppShell(title, accent, bodyHtml) { +function demoAppShell(title, sub, iconPath, bodyHtml) { + const accent = '#f7931a' // Archipelago orange return `