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

394 lines
8.7 KiB
Markdown

# 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
```bash
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`
```javascript
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:
```json
{
"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:
```json
{
"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
```bash
# 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
```bash
# 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"
```bash
# 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"
```bash
# 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"
```bash
# 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-time* → **Console logs**
6. "It's installed! Let's launch it" → **Click Launch**
7. *ATOB opens in new tab* → **Show 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 disappear* → **Back 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`:
```yaml
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).