Enhance README and RPC for package management
- Added instructions to README.md for building an ISO from source and flashing it to USB. - Introduced a new RPC method for package installation, including security checks and container management. - Updated Docker and Podman integration in build scripts to support both container runtimes. - Enhanced Nginx configuration for improved timeout settings and WebSocket support. - Added new app metadata for additional applications in the Docker package scanner.
This commit is contained in:
@@ -14,10 +14,15 @@ OUTPUT_DIR="$SCRIPT_DIR/results"
|
||||
DEBIAN_VERSION="bookworm"
|
||||
ARCH="amd64"
|
||||
|
||||
# Start build timer
|
||||
BUILD_START=$(date +%s)
|
||||
|
||||
echo "╔════════════════════════════════════════════════════════╗"
|
||||
echo "║ Building Archipelago - Debian Live Edition ║"
|
||||
echo "╚════════════════════════════════════════════════════════╝"
|
||||
echo ""
|
||||
echo "⏱️ Build started: $(date '+%H:%M:%S')"
|
||||
echo ""
|
||||
|
||||
# Create directories
|
||||
mkdir -p "$WORK_DIR"
|
||||
@@ -25,15 +30,33 @@ mkdir -p "$OUTPUT_DIR"
|
||||
|
||||
# Download Debian Live ISO if not exists
|
||||
BASE_ISO="$WORK_DIR/debian-live-12-${ARCH}-standard.iso"
|
||||
if [ ! -f "$BASE_ISO" ] || [ $(stat -f%z "$BASE_ISO" 2>/dev/null || echo 0) -lt 100000000 ]; then
|
||||
BASE_ISO_SIZE=369131520 # Expected size: ~352MB
|
||||
|
||||
if [ ! -f "$BASE_ISO" ] || [ $(stat -f%z "$BASE_ISO" 2>/dev/null || stat -c%s "$BASE_ISO" 2>/dev/null || echo 0) -lt 100000000 ]; then
|
||||
echo "📥 Downloading Debian Live 12 (Bookworm) Standard ISO..."
|
||||
echo " Size: ~352MB | This is a one-time download (cached for future builds)"
|
||||
echo ""
|
||||
rm -f "$BASE_ISO"
|
||||
# Use SourceForge respin which has up-to-date Debian 12 Live
|
||||
curl -L -o "$BASE_ISO" \
|
||||
|
||||
# Download with progress bar
|
||||
curl -# -L -o "$BASE_ISO" \
|
||||
"https://sourceforge.net/projects/debian-live-respin-iso/files/standard/live-image-debian12.11-standard-20250522-amd64.hybrid.iso/download"
|
||||
echo "✅ Downloaded Debian Live ISO"
|
||||
|
||||
# Verify download succeeded
|
||||
if [ -f "$BASE_ISO" ] && [ $(stat -f%z "$BASE_ISO" 2>/dev/null || stat -c%s "$BASE_ISO" 2>/dev/null) -gt 300000000 ]; then
|
||||
ISO_SIZE=$(du -h "$BASE_ISO" | awk '{print $1}')
|
||||
echo ""
|
||||
echo "✅ Downloaded Debian Live ISO ($ISO_SIZE)"
|
||||
echo " 📝 Cached at: $BASE_ISO"
|
||||
else
|
||||
echo ""
|
||||
echo "❌ Download failed or incomplete"
|
||||
exit 1
|
||||
fi
|
||||
else
|
||||
echo "✅ Using cached Debian Live ISO"
|
||||
ISO_SIZE=$(du -h "$BASE_ISO" | awk '{print $1}')
|
||||
echo "✅ Using cached Debian Live ISO ($ISO_SIZE)"
|
||||
echo " 📁 Location: $BASE_ISO"
|
||||
fi
|
||||
|
||||
# Extract ISO
|
||||
@@ -58,17 +81,25 @@ mkdir -p "$ARCHIPELAGO_DIR/bin"
|
||||
mkdir -p "$ARCHIPELAGO_DIR/scripts"
|
||||
|
||||
# Copy the pre-built backend if it exists
|
||||
if [ -d "$SCRIPT_DIR/../core/target/release" ]; then
|
||||
echo "🦀 Including Archipelago backend..."
|
||||
if [ -f "$SCRIPT_DIR/build/backend/archipelago" ]; then
|
||||
echo "🦀 Including Archipelago backend from build/backend..."
|
||||
cp "$SCRIPT_DIR/build/backend/archipelago" "$ARCHIPELAGO_DIR/bin/"
|
||||
chmod +x "$ARCHIPELAGO_DIR/bin/archipelago"
|
||||
elif [ -d "$SCRIPT_DIR/../core/target/release" ]; then
|
||||
echo "🦀 Including Archipelago backend from target/release..."
|
||||
cp "$SCRIPT_DIR/../core/target/release/archipelago" "$ARCHIPELAGO_DIR/bin/" 2>/dev/null || true
|
||||
chmod +x "$ARCHIPELAGO_DIR/bin/archipelago" 2>/dev/null || true
|
||||
fi
|
||||
|
||||
# Copy the frontend build if it exists
|
||||
if [ -d "$SCRIPT_DIR/../web/dist/neode-ui" ]; then
|
||||
echo "🎨 Including Archipelago Web UI..."
|
||||
if [ -d "$SCRIPT_DIR/build/frontend" ]; then
|
||||
echo "🎨 Including Archipelago Web UI from build/frontend..."
|
||||
cp -r "$SCRIPT_DIR/build/frontend" "$ARCHIPELAGO_DIR/web-ui"
|
||||
elif [ -d "$SCRIPT_DIR/../web/dist/neode-ui" ]; then
|
||||
echo "🎨 Including Archipelago Web UI from web/dist..."
|
||||
cp -r "$SCRIPT_DIR/../web/dist/neode-ui" "$ARCHIPELAGO_DIR/web-ui"
|
||||
elif [ -d "$SCRIPT_DIR/../neode-ui/dist" ]; then
|
||||
echo "🎨 Including Archipelago frontend..."
|
||||
echo "🎨 Including Archipelago frontend from neode-ui/dist..."
|
||||
cp -r "$SCRIPT_DIR/../neode-ui/dist" "$ARCHIPELAGO_DIR/web-ui" 2>/dev/null || true
|
||||
fi
|
||||
|
||||
@@ -318,8 +349,8 @@ cat > "$ISO_CUSTOM/etc/profile.d/z99-archipelago.sh" <<'PROFILE_EOF'
|
||||
#!/bin/bash
|
||||
# Archipelago auto-start - runs on login (z99 = runs last)
|
||||
|
||||
# Only run once per session and only in interactive shells
|
||||
if [ -n "$ARCHIPELAGO_STARTED" ] || [ ! -t 0 ]; then
|
||||
# Only run once per session
|
||||
if [ -n "$ARCHIPELAGO_STARTED" ]; then
|
||||
return 0 2>/dev/null || exit 0
|
||||
fi
|
||||
export ARCHIPELAGO_STARTED=1
|
||||
@@ -403,9 +434,9 @@ echo " Commands:"
|
||||
echo " archipelago-menu - Open interactive setup menu"
|
||||
echo " archipelago - Start/restart backend server"
|
||||
echo ""
|
||||
read -p " Press Enter to open the setup menu (or Ctrl+C to skip)... "
|
||||
sleep 1
|
||||
|
||||
# Launch the menu
|
||||
# Launch the menu automatically
|
||||
if [ -f /opt/archipelago/scripts/archipelago-menu.sh ]; then
|
||||
exec bash /opt/archipelago/scripts/archipelago-menu.sh
|
||||
elif [ -f "$BOOT_MEDIA/archipelago/scripts/archipelago-menu.sh" ]; then
|
||||
@@ -419,21 +450,88 @@ chmod +x "$ISO_CUSTOM/etc/profile.d/z99-archipelago.sh"
|
||||
mkdir -p "$ISO_CUSTOM/etc/skel"
|
||||
cat >> "$ISO_CUSTOM/etc/skel/.bashrc" <<'BASHRC_EOF'
|
||||
|
||||
# Archipelago auto-start fallback
|
||||
if [ -z "$ARCHIPELAGO_STARTED" ] && [ -t 0 ]; then
|
||||
[ -f /etc/profile.d/z99-archipelago.sh ] && source /etc/profile.d/z99-archipelago.sh
|
||||
# Archipelago auto-start
|
||||
if [ -z "$ARCHIPELAGO_STARTED" ] && [ -n "$PS1" ]; then
|
||||
export ARCHIPELAGO_STARTED=1
|
||||
|
||||
# Find boot media
|
||||
for dev in /run/live/medium /lib/live/mount/medium /cdrom; do
|
||||
if [ -d "$dev/archipelago" ]; then
|
||||
bash "$dev/archipelago/setup-archipelago.sh" 2>/dev/null || true
|
||||
break
|
||||
fi
|
||||
done
|
||||
fi
|
||||
BASHRC_EOF
|
||||
|
||||
# Modify GRUB config for Archipelago branding
|
||||
# CRITICAL: Make getty run our script directly after auto-login
|
||||
mkdir -p "$ISO_CUSTOM/etc/systemd/system/getty@tty1.service.d"
|
||||
cat > "$ISO_CUSTOM/etc/systemd/system/getty@tty1.service.d/override.conf" <<'GETTY_EOF'
|
||||
[Service]
|
||||
ExecStart=
|
||||
ExecStart=-/sbin/agetty --autologin user --login-program /bin/bash --login-options "-c 'source /etc/profile.d/z99-archipelago.sh; exec bash -i'" --noclear %I $TERM
|
||||
Type=idle
|
||||
GETTY_EOF
|
||||
|
||||
# Create a live-config hook that adds our script to the actual user's .bashrc after user creation
|
||||
mkdir -p "$ISO_CUSTOM/lib/live/config"
|
||||
cat > "$ISO_CUSTOM/lib/live/config/9999-archipelago-autostart" <<'LIVECONFIG_EOF'
|
||||
#!/bin/bash
|
||||
# Live-config hook to add Archipelago auto-start to live user's bashrc
|
||||
|
||||
set -e
|
||||
|
||||
# This runs after the live user is created
|
||||
if [ -d /home/user ]; then
|
||||
cat >> /home/user/.bashrc <<'EOF'
|
||||
|
||||
# Archipelago Auto-Start
|
||||
if [ -z "$ARCHIPELAGO_STARTED" ] && [ -n "$PS1" ]; then
|
||||
export ARCHIPELAGO_STARTED=1
|
||||
|
||||
# Find boot media
|
||||
BOOT_MEDIA=""
|
||||
for dev in /run/live/medium /lib/live/mount/medium /cdrom; do
|
||||
if [ -d "$dev/archipelago" ]; then
|
||||
BOOT_MEDIA="$dev"
|
||||
break
|
||||
fi
|
||||
done
|
||||
|
||||
if [ -n "$BOOT_MEDIA" ]; then
|
||||
# Source the profile script
|
||||
if [ -f /etc/profile.d/z99-archipelago.sh ]; then
|
||||
bash /etc/profile.d/z99-archipelago.sh
|
||||
fi
|
||||
fi
|
||||
fi
|
||||
EOF
|
||||
chown user:user /home/user/.bashrc
|
||||
fi
|
||||
LIVECONFIG_EOF
|
||||
|
||||
chmod +x "$ISO_CUSTOM/lib/live/config/9999-archipelago-autostart"
|
||||
cat > "$ISO_CUSTOM/etc/systemd/system/getty@tty1.service.d/override.conf" <<'GETTY_EOF'
|
||||
[Service]
|
||||
ExecStart=
|
||||
ExecStart=-/sbin/agetty --autologin user --noclear %I $TERM
|
||||
Type=idle
|
||||
GETTY_EOF
|
||||
|
||||
# Modify GRUB config for Archipelago branding and auto-start
|
||||
echo ""
|
||||
echo "⚙️ Configuring boot..."
|
||||
|
||||
if [ -f "$ISO_CUSTOM/boot/grub/grub.cfg" ]; then
|
||||
# Update branding
|
||||
sed -i.bak \
|
||||
-e 's/Debian GNU\/Linux/Archipelago Bitcoin Node OS/g' \
|
||||
-e 's/Live system/Archipelago Live/g' \
|
||||
"$ISO_CUSTOM/boot/grub/grub.cfg"
|
||||
|
||||
# Add components=live.persist boot parameter to enable persistence hooks
|
||||
# This will allow our scripts to run on boot
|
||||
sed -i '' -e 's/\(boot=live\)/\1 components=/' "$ISO_CUSTOM/boot/grub/grub.cfg" 2>/dev/null || true
|
||||
fi
|
||||
|
||||
if [ -f "$ISO_CUSTOM/isolinux/menu.cfg" ]; then
|
||||
@@ -500,12 +598,36 @@ fi
|
||||
echo ""
|
||||
echo "✅ ISO created successfully!"
|
||||
echo ""
|
||||
echo "📀 Output: $OUTPUT_ISO"
|
||||
echo " Size: $(du -h "$OUTPUT_ISO" | cut -f1)"
|
||||
|
||||
# Calculate build time
|
||||
BUILD_END=$(date +%s)
|
||||
BUILD_DURATION=$((BUILD_END - BUILD_START))
|
||||
BUILD_MINUTES=$((BUILD_DURATION / 60))
|
||||
BUILD_SECONDS=$((BUILD_DURATION % 60))
|
||||
|
||||
ISO_SIZE=$(du -h "$OUTPUT_ISO" | cut -f1)
|
||||
ISO_MD5=$(md5 -q "$OUTPUT_ISO" 2>/dev/null || md5sum "$OUTPUT_ISO" | awk '{print $1}')
|
||||
|
||||
echo "╔════════════════════════════════════════════════════════╗"
|
||||
echo "║ 🎉 Build Complete! ║"
|
||||
echo "╚════════════════════════════════════════════════════════╝"
|
||||
echo ""
|
||||
echo "🔥 This is Debian Live-based - reliable USB boot like StartOS!"
|
||||
echo "📀 ISO File: $OUTPUT_ISO"
|
||||
echo "📏 Size: $ISO_SIZE"
|
||||
echo "🔐 MD5: $ISO_MD5"
|
||||
echo "⏱️ Build Time: ${BUILD_MINUTES}m ${BUILD_SECONDS}s"
|
||||
echo "🎯 Base: Debian 12 Live (Bookworm)"
|
||||
echo ""
|
||||
echo "To create USB:"
|
||||
echo " 1. Use Balena Etcher to flash the ISO"
|
||||
echo " 2. Or: sudo dd if=$OUTPUT_ISO of=/dev/sdX bs=4M status=progress"
|
||||
echo "🔥 Next Steps:"
|
||||
echo ""
|
||||
echo " 1. Flash to USB:"
|
||||
echo " cd image-recipe && ./write-usb-dd.sh /dev/diskN"
|
||||
echo ""
|
||||
echo " 2. Boot on target device"
|
||||
echo ""
|
||||
echo " 3. Auto-login as 'user' with menu launch"
|
||||
echo ""
|
||||
echo " 4. Access Web UI at http://<IP>:5678"
|
||||
echo ""
|
||||
echo " 5. SSH access: ssh user@<IP> (password: archipelago)"
|
||||
echo ""
|
||||
|
||||
Reference in New Issue
Block a user