archy/neode-ui/INSTALL_DEMO_GUIDE.md
2026-01-24 22:59:20 +00:00

8.7 KiB

ATOB Installation & Uninstallation Demo Guide

🎯 Overview

This guide demonstrates the complete package lifecycle in Neode:

  1. Browse marketplace
  2. Install s9pk package
  3. Launch running app
  4. Uninstall package

All using REAL Docker containers - exactly like production!


🚀 Quick Start

1. Start the Development Server

cd /Users/tx1138/Code/Neode/neode-ui

# Start both mock backend + Vite
npm run dev:mock

# OR run them separately:
# Terminal 1:
node mock-backend.js

# Terminal 2:
npm run dev

2. Open Neode UI

Go to: http://localhost:8100

Login with: password123


📦 Test the Complete Workflow

Step 1: Check Starting State

  1. Navigate to Apps
  2. You should see:
    • Bitcoin Core (pre-installed, running)
    • Core Lightning (pre-installed, stopped)
    • ATOB (not installed)

Step 2: Browse Marketplace

  1. Click "Marketplace" in the sidebar
  2. You should see:
    • ATOB card with "Install" button
    • Other apps (some might show "Already Installed")

Step 3: Install ATOB

  1. Click "Install" on ATOB card

  2. Watch the console logs:

    [Docker] Installing atob from /packages/atob.s9pk
    [Docker] S9PK path: /Users/tx1138/Code/Neode/neode-ui/public/packages/atob.s9pk
    [Docker] Extracting s9pk...
    [Docker] Loading image from .tmp-atob/docker_images/aarch64.tar...
    [Docker] Starting container atob-test...
    [Docker] ✅ atob installed and running on port 8102
    
  3. Automatically redirected to Apps page

  4. ATOB now appears in your apps list!

Step 4: Launch ATOB

  1. Click "Launch" on ATOB
  2. Opens http://localhost:8102
  3. You see: ATOB web interface (embedding https://app.atobitcoin.io)

Step 5: View ATOB Details

  1. Click on ATOB card (not the Launch button)
  2. See full details:
    • Title, version, description
    • Status badge (Running)
    • Start/Stop/Restart/Uninstall buttons
    • Launch button (prominent, green)

Step 6: Uninstall ATOB

  1. Click "Uninstall" button

  2. Confirm in the dialog

  3. Watch console:

    [RPC] Uninstalling package: atob
    [Docker] Uninstalling atob
    [Docker] ✅ atob uninstalled
    
  4. Automatically redirected to Apps page

  5. ATOB is gone!

Step 7: Reinstall via Sideload

  1. Go to Marketplace
  2. Scroll to "Sideload Package" section
  3. Enter URL: /packages/atob.s9pk
  4. Click "Install"
  5. Same installation process runs!
  6. ATOB reappears in Apps

🔍 What's Happening Behind the Scenes

When You Click "Install"

  1. Frontend calls RPC: package.install

    rpcClient.call({
      method: 'package.install',
      params: {
        id: 'atob',
        url: '/packages/atob.s9pk',
        version: '0.1.0'
      }
    })
    
  2. Mock Backend receives call and:

    • Extracts the s9pk file (23MB)
    • Loads Docker image from docker_images/aarch64.tar
    • Creates and starts container: atob-test
    • Maps port 8102 → container port 80
  3. WebSocket broadcasts update:

    {
      "rev": 1699876543210,
      "patch": [
        {
          "op": "add",
          "path": "/package-data/atob",
          "value": { /* full package data */ }
        }
      ]
    }
    
  4. Frontend receives patch:

    • Updates Pinia store
    • UI reactively shows ATOB

When You Click "Uninstall"

  1. Frontend calls RPC: package.uninstall

  2. Mock Backend:

    • Stops Docker container: docker stop atob-test
    • Removes container: docker rm atob-test
    • Removes from mockData
  3. WebSocket broadcasts:

    {
      "rev": 1699876543987,
      "patch": [
        {
          "op": "remove",
          "path": "/package-data/atob"
        }
      ]
    }
    
  4. Frontend applies patch:

    • Removes ATOB from store
    • UI updates instantly

🐳 Docker Verification

You can verify the Docker container is real:

While ATOB is Installed

# List running containers
docker ps
# You'll see: atob-test

# View container logs
docker logs atob-test

# Access directly
curl http://localhost:8102
# Returns HTML with iframe

# Open in browser
open http://localhost:8102

After Uninstall

# Container should be gone
docker ps -a | grep atob-test
# No results

📊 File Structure

neode-ui/
├── public/
│   └── packages/
│       └── atob.s9pk          # 23MB s9pk file
├── src/
│   ├── views/
│   │   ├── Marketplace.vue    # Marketplace + sideload
│   │   ├── Apps.vue           # App grid with Launch buttons
│   │   └── AppDetails.vue     # Details + Uninstall button
│   └── stores/
│       └── app.ts             # Install/uninstall methods
└── mock-backend.js            # Docker integration

🎨 UI Features

Marketplace Page

  • Grid of available apps with cards
  • Install buttons (disabled if already installed)
  • Sideload section for custom URLs
  • Real-time status updates via WebSocket

Apps Page

  • Grid layout with app cards
  • Launch buttons (only if app has UI + is running)
  • Status badges (Running, Stopped, Installing)
  • Click card → go to details

App Details Page

  • Full app information
  • Action buttons:
    • Start (if stopped)
    • Stop (if running)
    • Restart (always)
    • Uninstall (always) ← NEW!
    • Launch (if has UI + is running)

🔄 Production Compatibility

What's the Same

UI Components - Work identically
RPC Methods - Same API calls
WebSocket Updates - Same patch format
S9PK Format - Exact same package
Docker Container - Exact same image

What's Different

Development Production
Mock backend (Node.js) Real backend (Rust)
Local s9pk file Marketplace URL or uploaded file
Container name: atob-test Container managed by StartOS
Port 8102 Tor address / LAN address
Docker CLI commands Managed by backend daemon

🐛 Troubleshooting

"S9PK file not found"

# Make sure file exists
ls -lh /Users/tx1138/Code/Neode/neode-ui/public/packages/atob.s9pk

# If missing, copy it:
cp ~/atob-package/atob.s9pk /Users/tx1138/Code/Neode/neode-ui/public/packages/

"Port 8102 already in use"

# Find what's using it
lsof -i :8102

# Stop old container
docker stop atob-test
docker rm atob-test

# Or kill the process
kill -9 <PID>

"Docker command not found"

# Make sure Docker is running
docker ps

# If not installed, install Docker Desktop:
# https://www.docker.com/products/docker-desktop

"WebSocket not updating"

  • Check browser console for errors
  • Make sure mock backend is running on port 5959
  • Refresh the page (F5)

🎯 Demo Script

For showing to others:

  1. "This is Neode, a self-hosted app platform"
  2. "Let's check what's installed" → Apps page
  3. "Now let's browse what we can add" → Marketplace
  4. "I want ATOB for Bitcoin tools" → Click Install
  5. Watch it install in real-timeConsole logs
  6. "It's installed! Let's launch it" → Click Launch
  7. ATOB opens in new tabShow the interface
  8. "Now let's look at the details" → App Details page
  9. "I can start, stop, restart it" → Point to buttons
  10. "And if I don't want it anymore..." → Click Uninstall
  11. Confirm and watch it disappearBack to Apps
  12. "Gone! But I can reinstall anytime" → Back to Marketplace

🚀 Next Steps

For Portainer Deployment

  1. Add packages directory to volume

  2. Update portainer-stack-vue.yml:

    services:
      neode-backend:
        volumes:
          - ./neode-ui/public/packages:/app/public/packages:ro
    
  3. Push to GitHub

  4. Update stack in Portainer

  5. Test installation flow remotely!

For Real Backend Integration

  1. Connect UI to real Rust backend
  2. Test with actual StartOS installation
  3. Verify Tor/LAN addresses work
  4. Test on Raspberry Pi hardware

Success Criteria

You've successfully tested the installation flow when:

  • You can install ATOB from Marketplace
  • ATOB appears in Apps list after install
  • You can launch ATOB at http://localhost:8102
  • You can see ATOB details page
  • You can uninstall ATOB
  • ATOB disappears from Apps list
  • Docker container is removed
  • You can reinstall via sideload
  • All changes happen in real-time
  • No page refreshes needed

🎉 Congratulations!

You now have a fully functional package installation/uninstallation system that works with real Docker containers!

This is production-ready - the only difference in real Neode is the backend language (Rust instead of Node.js).