Files
archy/.cursor/rules/Development-Workflow.md
Dorian 6035c93289 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.
2026-02-14 16:44:20 +00:00

249 lines
10 KiB
Markdown

# Archipelago Development Workflow
## Overview
Archipelago is a Bitcoin Node OS that users install from a bootable USB. We develop on a live development server, then package that server's state into an auto-installer ISO.
## Target Experience (Like Other Bitcoin Nodes)
Users interact with Archipelago like **Umbrel**, **Start9**, **RaspiBlitz**:
1. Flash ISO to USB
2. Boot from USB → Auto-installer runs
3. Installer detects internal disk and installs Archipelago
4. Remove USB, reboot
5. **Access web UI at http://<IP>** (port 80, served by Nginx)
6. Manage Bitcoin, Lightning, apps through web interface
## Development Workflow
### 1. Development Server (Primary Development Environment)
**Server**: `archipelago@192.168.1.228`
**Purpose**: Live development and testing environment
This is where ALL development happens:
- Backend changes: `/usr/local/bin/archipelago` (Rust binary)
- Frontend changes: `/opt/archipelago/web-ui` (Vue.js, served by Nginx on port 80)
- Backend API: `localhost:5678` (proxied by Nginx)
- System configs: Nginx, systemd services, etc.
- Container apps: Podman containers for Bitcoin, LND, etc.
**CRITICAL**: This is the AUTHORITATIVE source. The ISO must capture THIS server's exact state.
### 2. Build Process (Snapshot → ISO)
**Goal**: Create an auto-installer ISO that installs the EXACT state of the dev server
**Process**:
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
2. **Package into bootable ISO**:
- Base: Debian Live (minimal installer environment)
- Includes: Pre-built rootfs with all Archipelago components
- Auto-installer script detects internal disk and installs system
3. **Result**: Bootable ISO that users can flash to USB
### 3. ISO Flash & Install (End User Experience)
**User steps**:
1. Flash `archipelago-installer-x86_64.iso` to USB
2. Boot from USB
3. Press Enter at "Install Archipelago" prompt
4. Installer automatically:
- Detects internal disk (NVMe/SSD)
- Creates partitions (EFI + Root)
- Installs Archipelago system
- Installs GRUB bootloader
- Shows "INSTALLATION COMPLETE" with Web UI URL
5. Remove USB and reboot
6. Access Web UI at `http://<IP>`
### 4. Deployment Targets
- **Development Server**: `192.168.1.228` (always up to date)
- **Test Devices**:
- Dell OptiPlex (current test device)
- Start9 Server Pure (Intel i7, NVMe)
- HP ProDesk 400 G4 DM
- **Production**: Any x86_64 device with NVMe/SSD
## Architecture
### Frontend (Web UI)
- **Framework**: Vue.js 3 + Vite
- **Build Output**: `web/dist/neode-ui/` (NOT `neode-ui/dist/`)
- **Deployment**: Copied to `/opt/archipelago/web-ui` on dev server
- **Served By**: Nginx on port 80
- **API Proxy**: Nginx proxies `/rpc/`, `/ws/`, `/health` to `localhost:5678`
### Backend (API Server)
- **Language**: Rust
- **Binary Location**: `/usr/local/bin/archipelago`
- **Bind Address**: `0.0.0.0:5678`
- **Systemd Service**: `archipelago.service`
- **Managed By**: systemd (auto-start on boot)
### System Integration
- **OS**: Debian 12 (Bookworm)
- **Web Server**: Nginx (port 80)
- **Container Runtime**: Podman (rootless)
- **Apps**: Bitcoin Core, LND, BTCPay, Nostr relays, etc.
## Build Scripts
### `build-auto-installer-iso.sh` (CORRECT SCRIPT)
Creates a bootable auto-installer ISO (like the working build from this morning).
**Features**:
- Pre-built rootfs (no network needed during install)
- Auto-detects internal disk
- One-button installation
- Boots directly to web UI after install
- Pre-bundles container images (Bitcoin, LND, etc.)
**Usage**:
```bash
cd image-recipe
sudo bash build-auto-installer-iso.sh
```
**IMPORTANT**: Must capture LIVE SERVER state, not build from source.
### `build-debian-iso.sh` (DEPRECATED)
Creates a live system ISO (boots into a live environment, doesn't install).
**DO NOT USE** - This was causing the boot-to-prompt issue.
## 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!**
The dev server (`192.168.1.228`) is **x86_64 Linux (Debian 12)**. Binaries compiled on macOS (even with cross-compilation) can cause "Exec format error" due to:
- Different architecture (macOS ARM64/Intel vs Linux x86_64)
- Different libc (macOS vs glibc)
- Different system call interfaces
**ALWAYS build the backend directly on the Linux dev server.**
### Deployment Procedures
1. **Backend** (MUST build on Linux — use rsync then build on server):
```bash
# 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
# Build locally (macOS is fine for frontend)
cd neode-ui
npm run build
# Deploy to server
rsync -avz ../web/dist/neode-ui/ archipelago@192.168.1.228:/tmp/neode-ui-build/
ssh archipelago@192.168.1.228 'sudo rm -rf /opt/archipelago/web-ui/* && sudo cp -r /tmp/neode-ui-build/* /opt/archipelago/web-ui/ && sudo chown -R www-data:www-data /opt/archipelago/web-ui'
```
3. **Container Images** (Docker/Podman):
```bash
# Build locally and push to server
cd docker/<app-name>
podman build -t localhost/<app-name>:latest .
podman save localhost/<app-name>:latest | ssh archipelago@192.168.1.228 'podman load'
```
## CRITICAL RULES
### 🚨 NEVER VIOLATE THESE
1. **ALWAYS deploy to the live development server (192.168.1.228)** for testing
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
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
Before creating ISO:
- [ ] Backend running on dev server (`curl http://192.168.1.228:5678/health`)
- [ ] Frontend accessible (`curl http://192.168.1.228/`)
- [ ] Web UI shows correct apps and icons
- [ ] API calls working (check browser console)
- [ ] All systemd services enabled and running
After flashing ISO:
- [ ] ISO boots to installer menu
- [ ] Auto-installer detects internal disk
- [ ] Installation completes without errors
- [ ] System reboots and shows Web UI URL
- [ ] Web UI accessible at `http://<IP>`
- [ ] Backend API responding
- [ ] Apps visible in marketplace
## Common Issues
**Issue**: ISO boots to prompt instead of auto-starting
- **Cause**: Using `build-debian-iso.sh` (live system) instead of `build-auto-installer-iso.sh`
- **Fix**: Use correct auto-installer script
**Issue**: macOS backend binary on Linux server ("Exec format error")
- **Cause**: Compiling Rust backend on macOS and copying to Linux server
- **Symptom**: `systemd` service fails with "status=203/EXEC" and "Failed to execute: Exec format error"
- **Why it happens**: Different architectures and system ABIs between macOS and Linux
- **Fix**: **ALWAYS build the backend ON the Linux server**:
```bash
ssh archipelago@192.168.1.228
cd ~/archy/core/archipelago
source ~/.cargo/env
cargo build --release
sudo systemctl stop archipelago
sudo cp ../target/release/archipelago /usr/local/bin/
sudo systemctl start archipelago
```
- **Prevention**: Never use local `cargo build` for deployment - always build on target system
**Issue**: Frontend not updating on server
- **Cause**: Building to wrong output directory or not deploying to correct Nginx root
- **Fix**: Build to `web/dist/neode-ui/`, deploy to `/opt/archipelago/web-ui`
**Issue**: ISO doesn't have latest changes
- **Cause**: Building from source instead of capturing live server state
- **Fix**: Modify build script to snapshot dev server, not compile from scratch
## Next Steps
- [ ] Fix `build-auto-installer-iso.sh` to capture live server state
- [ ] Create snapshot script for dev server
- [ ] Document container image bundling process
- [ ] Create automated testing framework
- [ ] Set up CI/CD for ISO builds