Refactor build script for custom ISO creation and update hardware configuration
- Replaced OS-specific build method with a custom ISO builder in the build-for-hardware.sh script. - Updated output file naming to reflect the correct Alpine version in the build process. - Adjusted build dates in hardware configuration files for HP ProDesk, merged, and Start9 Pure profiles to the latest timestamp.
This commit is contained in:
@@ -22,5 +22,5 @@ ports = "4x USB 3.0, 2x USB 2.0"
|
||||
[build]
|
||||
version = "0.1.0"
|
||||
alpine_version = "3.19"
|
||||
build_date = "2026-01-31T20:05:12Z"
|
||||
build_date = "2026-01-31T20:40:39Z"
|
||||
build_type = "iso"
|
||||
|
||||
@@ -22,5 +22,5 @@ ports = "4x USB 3.0, 2x USB 2.0"
|
||||
[build]
|
||||
version = "0.1.0"
|
||||
alpine_version = "3.19"
|
||||
build_date = "2026-01-31T20:05:12Z"
|
||||
build_date = "2026-01-31T20:40:39Z"
|
||||
build_type = "iso"
|
||||
|
||||
@@ -22,5 +22,5 @@ ports = "4x USB 3.0, 2x USB 2.0, 1x USB-C 3.1"
|
||||
[build]
|
||||
version = "0.1.0"
|
||||
alpine_version = "3.19"
|
||||
build_date = "2026-01-31T19:35:38Z"
|
||||
build_date = "2026-01-31T20:20:26Z"
|
||||
build_type = "iso"
|
||||
|
||||
Executable
+45
@@ -0,0 +1,45 @@
|
||||
#!/bin/bash
|
||||
# Build Archipelago backend for Alpine Linux (x86_64-musl)
|
||||
|
||||
set -e
|
||||
|
||||
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
||||
PROJECT_ROOT="$(cd "$SCRIPT_DIR/.." && pwd)"
|
||||
|
||||
echo "🦀 Building Archipelago Backend for Alpine Linux"
|
||||
echo ""
|
||||
|
||||
# Create build directory
|
||||
BUILD_DIR="$SCRIPT_DIR/build/backend"
|
||||
mkdir -p "$BUILD_DIR"
|
||||
|
||||
# Use Docker with Rust Alpine image to build
|
||||
echo "🐳 Building in Alpine Docker container..."
|
||||
|
||||
docker run --rm \
|
||||
-v "$PROJECT_ROOT:/workspace" \
|
||||
-v "$BUILD_DIR:/output" \
|
||||
-w /workspace/core \
|
||||
rust:alpine \
|
||||
sh -c '
|
||||
echo "📦 Installing build dependencies..."
|
||||
apk add --no-cache musl-dev openssl-dev openssl-libs-static pkgconfig gcc
|
||||
|
||||
echo "🔨 Building Archipelago backend (native Alpine build)..."
|
||||
cd archipelago && cargo build --release
|
||||
|
||||
echo "📋 Copying binary to output..."
|
||||
cp ../target/release/archipelago /output/
|
||||
|
||||
echo "✅ Build complete!"
|
||||
ls -lh /output/archipelago
|
||||
' || {
|
||||
echo "❌ Build failed"
|
||||
exit 1
|
||||
}
|
||||
|
||||
echo ""
|
||||
echo "✅ Backend built successfully!"
|
||||
echo " Binary: $BUILD_DIR/archipelago"
|
||||
echo " Size: $(du -h "$BUILD_DIR/archipelago" | cut -f1)"
|
||||
echo ""
|
||||
Executable
+461
@@ -0,0 +1,461 @@
|
||||
#!/bin/bash
|
||||
# Custom ISO builder that works on ARM Mac by modifying pre-built Alpine ISO
|
||||
# instead of building from scratch
|
||||
|
||||
set -e
|
||||
|
||||
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
||||
ALPINE_VERSION="${ALPINE_VERSION:-3.19}"
|
||||
ARCH="${ARCH:-x86_64}"
|
||||
ISO_URL="https://dl-cdn.alpinelinux.org/alpine/v${ALPINE_VERSION}/releases/${ARCH}/alpine-standard-${ALPINE_VERSION}.0-${ARCH}.iso"
|
||||
WORK_DIR="$SCRIPT_DIR/build/iso-custom"
|
||||
OUTPUT_DIR="$SCRIPT_DIR/results"
|
||||
|
||||
echo "🏔️ Building custom Archipelago ISO from Alpine base"
|
||||
echo ""
|
||||
echo "📋 Configuration:"
|
||||
echo " Alpine Version: $ALPINE_VERSION"
|
||||
echo " Architecture: $ARCH"
|
||||
echo " Base ISO URL: $ISO_URL"
|
||||
echo ""
|
||||
|
||||
# Create work directories
|
||||
mkdir -p "$WORK_DIR"
|
||||
mkdir -p "$OUTPUT_DIR"
|
||||
|
||||
# Download Alpine base ISO if not exists
|
||||
BASE_ISO="$WORK_DIR/alpine-base.iso"
|
||||
if [ ! -f "$BASE_ISO" ]; then
|
||||
echo "📥 Downloading Alpine base ISO..."
|
||||
curl -L -o "$BASE_ISO" "$ISO_URL" || {
|
||||
echo "❌ Failed to download Alpine ISO"
|
||||
exit 1
|
||||
}
|
||||
echo "✅ Downloaded base ISO"
|
||||
else
|
||||
echo "✅ Using cached base ISO"
|
||||
fi
|
||||
|
||||
# Extract ISO contents
|
||||
echo "📦 Extracting ISO contents..."
|
||||
CUSTOM_DIR="$WORK_DIR/custom"
|
||||
rm -rf "$CUSTOM_DIR"
|
||||
mkdir -p "$CUSTOM_DIR"
|
||||
|
||||
# Use 7zip to extract ISO (works on both macOS and Linux)
|
||||
if command -v 7z >/dev/null 2>&1; then
|
||||
7z x "$BASE_ISO" -o"$CUSTOM_DIR" -y >/dev/null || {
|
||||
echo "❌ Failed to extract ISO with 7zip"
|
||||
exit 1
|
||||
}
|
||||
elif [[ "$OSTYPE" == "darwin"* ]]; then
|
||||
# Fallback: Try mounting on macOS
|
||||
MOUNT_POINT="$WORK_DIR/mnt"
|
||||
mkdir -p "$MOUNT_POINT"
|
||||
hdiutil attach "$BASE_ISO" -mountpoint "$MOUNT_POINT" -readonly && {
|
||||
rsync -a "$MOUNT_POINT"/ "$CUSTOM_DIR"/
|
||||
hdiutil detach "$MOUNT_POINT"
|
||||
} || {
|
||||
echo "❌ Failed to extract ISO. Install p7zip: brew install p7zip"
|
||||
exit 1
|
||||
}
|
||||
else
|
||||
# On Linux, mount the ISO
|
||||
MOUNT_POINT="$WORK_DIR/mnt"
|
||||
mkdir -p "$MOUNT_POINT"
|
||||
sudo mount -o loop "$BASE_ISO" "$MOUNT_POINT" && {
|
||||
cp -a "$MOUNT_POINT"/* "$CUSTOM_DIR"/
|
||||
sudo umount "$MOUNT_POINT"
|
||||
} || {
|
||||
echo "❌ Failed to mount ISO"
|
||||
exit 1
|
||||
}
|
||||
fi
|
||||
|
||||
echo "✅ ISO contents extracted"
|
||||
|
||||
# Add custom packages
|
||||
echo "📦 Adding custom packages..."
|
||||
APKS_DIR="$CUSTOM_DIR/apks/$(uname -m)"
|
||||
mkdir -p "$APKS_DIR"
|
||||
|
||||
# Create a custom apk repository file
|
||||
cat > "$CUSTOM_DIR/archipelago.list" <<'EOF'
|
||||
# Archipelago custom packages
|
||||
# These will be installed during setup-alpine or via apk add
|
||||
|
||||
# Container runtime
|
||||
podman
|
||||
crun
|
||||
fuse-overlayfs
|
||||
slirp4netns
|
||||
|
||||
# Web server
|
||||
nginx
|
||||
|
||||
# SSH server
|
||||
openssh
|
||||
|
||||
# Networking
|
||||
iptables
|
||||
iproute2
|
||||
EOF
|
||||
|
||||
# Create automated installation script
|
||||
echo "📝 Creating installation script..."
|
||||
mkdir -p "$CUSTOM_DIR/archipelago"
|
||||
cat > "$CUSTOM_DIR/archipelago/install.sh" <<'INSTALL_EOF'
|
||||
#!/bin/sh
|
||||
# Archipelago automated installation script
|
||||
|
||||
set -e
|
||||
|
||||
echo "🏝️ Installing Archipelago Bitcoin Node OS"
|
||||
echo ""
|
||||
|
||||
# Install required packages
|
||||
echo "📦 Installing packages..."
|
||||
apk add --no-cache \
|
||||
podman \
|
||||
crun \
|
||||
fuse-overlayfs \
|
||||
slirp4netns \
|
||||
nginx \
|
||||
openssh \
|
||||
iptables \
|
||||
iproute2 \
|
||||
bash \
|
||||
curl
|
||||
|
||||
# Create archipelago user
|
||||
echo "👤 Creating archipelago user..."
|
||||
if ! id archipelago >/dev/null 2>&1; then
|
||||
adduser -D -s /bin/bash archipelago
|
||||
echo "archipelago:archipelago" | chpasswd
|
||||
fi
|
||||
|
||||
# Setup Podman for archipelago user
|
||||
echo "🐳 Setting up Podman..."
|
||||
mkdir -p /home/archipelago/.config/containers
|
||||
chown -R archipelago:archipelago /home/archipelago
|
||||
|
||||
# Create data directories
|
||||
echo "📁 Creating data directories..."
|
||||
mkdir -p /var/lib/archipelago/{apps,secrets,logs,backups}
|
||||
chown -R archipelago:archipelago /var/lib/archipelago
|
||||
|
||||
# Install Archipelago backend if available
|
||||
if [ -f /media/cdrom/archipelago/bin/archipelago ]; then
|
||||
echo "🦀 Installing Archipelago backend..."
|
||||
mkdir -p /usr/local/bin
|
||||
cp /media/cdrom/archipelago/bin/archipelago /usr/local/bin/
|
||||
chmod +x /usr/local/bin/archipelago
|
||||
echo "✅ Backend installed"
|
||||
fi
|
||||
|
||||
# Install Archipelago frontend if available
|
||||
if [ -d /media/cdrom/archipelago/web ]; then
|
||||
echo "🎨 Installing Archipelago web UI..."
|
||||
mkdir -p /usr/share/archipelago/web
|
||||
cp -r /media/cdrom/archipelago/web/* /usr/share/archipelago/web/
|
||||
|
||||
# Configure nginx
|
||||
cat > /etc/nginx/http.d/archipelago.conf <<'NGINX_EOF'
|
||||
server {
|
||||
listen 8100;
|
||||
server_name _;
|
||||
|
||||
root /usr/share/archipelago/web;
|
||||
index index.html;
|
||||
|
||||
location / {
|
||||
try_files $uri $uri/ /index.html;
|
||||
}
|
||||
|
||||
# Proxy API requests to backend
|
||||
location /api/ {
|
||||
proxy_pass http://127.0.0.1:8101/;
|
||||
proxy_http_version 1.1;
|
||||
proxy_set_header Upgrade $http_upgrade;
|
||||
proxy_set_header Connection 'upgrade';
|
||||
proxy_set_header Host $host;
|
||||
proxy_cache_bypass $http_upgrade;
|
||||
}
|
||||
}
|
||||
NGINX_EOF
|
||||
|
||||
rc-update add nginx default
|
||||
echo "✅ Web UI installed"
|
||||
fi
|
||||
|
||||
# Create Archipelago service
|
||||
if [ -f /usr/local/bin/archipelago ]; then
|
||||
echo "⚙️ Creating Archipelago service..."
|
||||
cat > /etc/init.d/archipelago <<'SERVICE_EOF'
|
||||
#!/sbin/openrc-run
|
||||
|
||||
name="Archipelago"
|
||||
description="Archipelago Bitcoin Node OS Backend"
|
||||
command="/usr/local/bin/archipelago"
|
||||
command_background=true
|
||||
pidfile="/run/archipelago.pid"
|
||||
|
||||
depend() {
|
||||
need net
|
||||
after networking
|
||||
}
|
||||
SERVICE_EOF
|
||||
|
||||
chmod +x /etc/init.d/archipelago
|
||||
rc-update add archipelago default
|
||||
echo "✅ Archipelago service created"
|
||||
fi
|
||||
|
||||
# Install app manifests if available
|
||||
if [ -d /media/cdrom/archipelago/apps ]; then
|
||||
echo "📦 Installing app manifests..."
|
||||
mkdir -p /var/lib/archipelago/manifests
|
||||
cp -r /media/cdrom/archipelago/apps/* /var/lib/archipelago/manifests/
|
||||
chown -R archipelago:archipelago /var/lib/archipelago/manifests
|
||||
echo "✅ App manifests installed"
|
||||
fi
|
||||
|
||||
# Configure networking (DHCP)
|
||||
echo "🌐 Configuring network..."
|
||||
cat > /etc/network/interfaces <<'NET_EOF'
|
||||
auto lo
|
||||
iface lo inet loopback
|
||||
|
||||
auto eth0
|
||||
iface eth0 inet dhcp
|
||||
|
||||
auto enp0s3
|
||||
iface enp0s3 inet dhcp
|
||||
|
||||
auto enp0s25
|
||||
iface enp0s25 inet dhcp
|
||||
NET_EOF
|
||||
|
||||
# Enable services
|
||||
echo "⚙️ Enabling services..."
|
||||
rc-update add networking default
|
||||
rc-update add sshd default
|
||||
rc-update add local default
|
||||
|
||||
# Set hostname
|
||||
echo "archipelago" > /etc/hostname
|
||||
|
||||
# Configure SSH
|
||||
echo "🔐 Configuring SSH..."
|
||||
sed -i 's/#PermitRootLogin.*/PermitRootLogin yes/' /etc/ssh/sshd_config
|
||||
|
||||
# Create welcome message
|
||||
cat > /etc/motd <<'MOTD_EOF'
|
||||
|
||||
╔═══════════════════════════════════════════════════════════╗
|
||||
║ ║
|
||||
║ 🏝️ ARCHIPELAGO BITCOIN NODE OS ║
|
||||
║ ║
|
||||
║ A sovereign computing platform built on Alpine Linux ║
|
||||
║ ║
|
||||
╚═══════════════════════════════════════════════════════════╝
|
||||
|
||||
Default user: archipelago
|
||||
Default pass: archipelago (CHANGE THIS IMMEDIATELY!)
|
||||
|
||||
To access the web UI:
|
||||
http://$(hostname -i):8100
|
||||
|
||||
To start Archipelago:
|
||||
sudo systemctl start archipelago
|
||||
|
||||
Documentation: /usr/share/doc/archipelago/
|
||||
|
||||
MOTD_EOF
|
||||
|
||||
echo ""
|
||||
echo "✅ Archipelago installation complete!"
|
||||
echo ""
|
||||
echo "Next steps:"
|
||||
echo " 1. Reboot the system"
|
||||
echo " 2. Login with user: archipelago, pass: archipelago"
|
||||
echo " 3. Change the default password: passwd"
|
||||
echo " 4. Access web UI at http://<your-ip>:8100"
|
||||
echo ""
|
||||
|
||||
INSTALL_EOF
|
||||
|
||||
chmod +x "$CUSTOM_DIR/archipelago/install.sh"
|
||||
|
||||
# Create README
|
||||
cat > "$CUSTOM_DIR/archipelago/README.txt" <<'README_EOF'
|
||||
ARCHIPELAGO BITCOIN NODE OS
|
||||
===========================
|
||||
|
||||
This is a customized Alpine Linux ISO with Archipelago packages.
|
||||
|
||||
INSTALLATION:
|
||||
1. Boot from this USB/ISO
|
||||
2. Login as root (no password)
|
||||
3. Run: setup-alpine
|
||||
4. Follow the prompts to install Alpine
|
||||
5. After installation, run: sh /media/*/archipelago/install.sh
|
||||
6. Reboot
|
||||
|
||||
QUICK INSTALL:
|
||||
For automated installation on dedicated hardware:
|
||||
1. Boot from USB/ISO
|
||||
2. Login as root
|
||||
3. Run: sh /media/*/archipelago/install.sh
|
||||
4. This will set up Alpine + Archipelago automatically
|
||||
|
||||
For more information, visit:
|
||||
https://github.com/your-repo/archipelago
|
||||
|
||||
README_EOF
|
||||
|
||||
# Modify boot configuration to show Archipelago branding
|
||||
if [ -f "$CUSTOM_DIR/boot/grub/grub.cfg" ]; then
|
||||
echo "⚙️ Customizing boot menu..."
|
||||
sed -i.bak 's/Alpine Linux/Archipelago Bitcoin Node OS/g' "$CUSTOM_DIR/boot/grub/grub.cfg" 2>/dev/null || true
|
||||
fi
|
||||
|
||||
if [ -f "$CUSTOM_DIR/boot/syslinux/syslinux.cfg" ]; then
|
||||
sed -i.bak 's/Alpine Linux/Archipelago Bitcoin Node OS/g' "$CUSTOM_DIR/boot/syslinux/syslinux.cfg" 2>/dev/null || true
|
||||
fi
|
||||
|
||||
# Include Archipelago backend if available
|
||||
if [ -n "$INCLUDE_BACKEND" ] && [ -f "$INCLUDE_BACKEND" ]; then
|
||||
echo "🦀 Including Archipelago backend..."
|
||||
mkdir -p "$CUSTOM_DIR/archipelago/bin"
|
||||
cp "$INCLUDE_BACKEND" "$CUSTOM_DIR/archipelago/bin/"
|
||||
chmod +x "$CUSTOM_DIR/archipelago/bin/archipelago"
|
||||
echo "✅ Backend included: $(du -h "$INCLUDE_BACKEND" | cut -f1)"
|
||||
fi
|
||||
|
||||
# Include Archipelago frontend if available
|
||||
if [ -n "$INCLUDE_FRONTEND" ] && [ -d "$INCLUDE_FRONTEND" ]; then
|
||||
echo "🎨 Including Archipelago frontend..."
|
||||
mkdir -p "$CUSTOM_DIR/archipelago/web"
|
||||
cp -r "$INCLUDE_FRONTEND"/* "$CUSTOM_DIR/archipelago/web/"
|
||||
echo "✅ Frontend included"
|
||||
fi
|
||||
|
||||
# Include app manifests if available
|
||||
APPS_DIR="$(dirname "$0")/../apps"
|
||||
if [ -d "$APPS_DIR" ]; then
|
||||
echo "📦 Including app manifests..."
|
||||
mkdir -p "$CUSTOM_DIR/archipelago/apps"
|
||||
# Copy all app directories with manifest.yml files
|
||||
find "$APPS_DIR" -maxdepth 1 -type d -exec test -f {}/manifest.yml \; -exec cp -r {} "$CUSTOM_DIR/archipelago/apps/" \;
|
||||
APP_COUNT=$(find "$CUSTOM_DIR/archipelago/apps" -name "manifest.yml" | wc -l | tr -d ' ')
|
||||
echo "✅ Included $APP_COUNT app manifests"
|
||||
fi
|
||||
|
||||
# Create the ISO
|
||||
OUTPUT_ISO="$OUTPUT_DIR/archipelago-${ALPINE_VERSION}-${ARCH}.iso"
|
||||
echo ""
|
||||
echo "🔥 Creating final ISO..."
|
||||
|
||||
if [[ "$OSTYPE" == "darwin"* ]]; then
|
||||
# On macOS, use xorriso for hybrid BIOS+UEFI bootable ISO
|
||||
if command -v xorriso >/dev/null 2>&1; then
|
||||
# Try dual-boot (BIOS + UEFI) if EFI bootloader exists
|
||||
if [ -f "$CUSTOM_DIR/boot/grub/grub.cfg" ] || [ -d "$CUSTOM_DIR/efi" ] || [ -d "$CUSTOM_DIR/EFI" ]; then
|
||||
echo "🔄 Creating hybrid BIOS+UEFI bootable ISO..."
|
||||
xorriso -as mkisofs -o "$OUTPUT_ISO" \
|
||||
-volid "ARCHIPELAGO" \
|
||||
-J -R \
|
||||
-c boot/syslinux/boot.cat \
|
||||
-b boot/syslinux/isolinux.bin \
|
||||
-no-emul-boot -boot-load-size 4 -boot-info-table \
|
||||
-eltorito-alt-boot \
|
||||
-e boot/grub/efi.img \
|
||||
-no-emul-boot \
|
||||
-isohybrid-gpt-basdat \
|
||||
-isohybrid-mbr "$CUSTOM_DIR/boot/syslinux/isohdpfx.bin" \
|
||||
"$CUSTOM_DIR" 2>&1 | grep -v "xorriso : UPDATE" || {
|
||||
echo "⚠️ Dual-boot failed, trying BIOS-only..."
|
||||
xorriso -as mkisofs -o "$OUTPUT_ISO" \
|
||||
-volid "ARCHIPELAGO" \
|
||||
-J -R \
|
||||
-c boot/syslinux/boot.cat \
|
||||
-b boot/syslinux/isolinux.bin \
|
||||
-no-emul-boot -boot-load-size 4 -boot-info-table \
|
||||
-isohybrid-mbr "$CUSTOM_DIR/boot/syslinux/isohdpfx.bin" \
|
||||
"$CUSTOM_DIR" 2>&1 | grep -v "xorriso : UPDATE"
|
||||
}
|
||||
else
|
||||
echo "🔄 Creating BIOS-only bootable ISO..."
|
||||
xorriso -as mkisofs -o "$OUTPUT_ISO" \
|
||||
-volid "ARCHIPELAGO" \
|
||||
-J -R \
|
||||
-c boot/syslinux/boot.cat \
|
||||
-b boot/syslinux/isolinux.bin \
|
||||
-no-emul-boot -boot-load-size 4 -boot-info-table \
|
||||
-isohybrid-mbr "$CUSTOM_DIR/boot/syslinux/isohdpfx.bin" \
|
||||
"$CUSTOM_DIR" 2>&1 | grep -v "xorriso : UPDATE" || true
|
||||
|
||||
# Check if ISO was created
|
||||
if [ ! -f "$OUTPUT_ISO" ]; then
|
||||
echo "⚠️ xorriso failed, trying without isohybrid..."
|
||||
xorriso -as mkisofs -o "$OUTPUT_ISO" \
|
||||
-volid "ARCHIPELAGO" \
|
||||
-J -R \
|
||||
-c boot/syslinux/boot.cat \
|
||||
-b boot/syslinux/isolinux.bin \
|
||||
-no-emul-boot -boot-load-size 4 -boot-info-table \
|
||||
"$CUSTOM_DIR" 2>&1 | grep -v "xorriso : UPDATE"
|
||||
fi
|
||||
fi
|
||||
else
|
||||
# Fallback to hdiutil
|
||||
hdiutil makehybrid -o "$OUTPUT_ISO" "$CUSTOM_DIR" \
|
||||
-iso -joliet -default-volume-name "ARCHIPELAGO" || {
|
||||
echo "❌ Failed to create ISO"
|
||||
exit 1
|
||||
}
|
||||
fi
|
||||
else
|
||||
# On Linux, use genisoimage or xorriso
|
||||
if command -v genisoimage >/dev/null 2>&1; then
|
||||
genisoimage -o "$OUTPUT_ISO" \
|
||||
-b boot/syslinux/isolinux.bin \
|
||||
-c boot/syslinux/boot.cat \
|
||||
-no-emul-boot -boot-load-size 4 -boot-info-table \
|
||||
-J -R -V "ARCHIPELAGO" \
|
||||
"$CUSTOM_DIR"
|
||||
elif command -v xorriso >/dev/null 2>&1; then
|
||||
xorriso -as mkisofs -o "$OUTPUT_ISO" \
|
||||
-b boot/syslinux/isolinux.bin \
|
||||
-c boot/syslinux/boot.cat \
|
||||
-no-emul-boot -boot-load-size 4 -boot-info-table \
|
||||
-J -R -V "ARCHIPELAGO" \
|
||||
"$CUSTOM_DIR"
|
||||
else
|
||||
echo "❌ No ISO creation tool found (need genisoimage or xorriso)"
|
||||
exit 1
|
||||
fi
|
||||
fi
|
||||
|
||||
# Make bootable (add isohybrid for USB boot)
|
||||
if command -v isohybrid >/dev/null 2>&1 && [[ "$OSTYPE" != "darwin"* ]]; then
|
||||
isohybrid "$OUTPUT_ISO"
|
||||
fi
|
||||
|
||||
echo ""
|
||||
echo "✅ ISO created successfully!"
|
||||
echo ""
|
||||
echo "📀 Output: $OUTPUT_ISO"
|
||||
echo " Size: $(du -h "$OUTPUT_ISO" | cut -f1)"
|
||||
echo ""
|
||||
echo "📝 To create a bootable USB:"
|
||||
if [[ "$OSTYPE" == "darwin"* ]]; then
|
||||
echo " 1. Insert USB drive"
|
||||
echo " 2. Find device: diskutil list"
|
||||
echo " 3. Unmount: diskutil unmountDisk /dev/diskN"
|
||||
echo " 4. Write: sudo dd if=$OUTPUT_ISO of=/dev/rdiskN bs=1m"
|
||||
else
|
||||
echo " sudo dd if=$OUTPUT_ISO of=/dev/sdX bs=4M status=progress"
|
||||
fi
|
||||
echo ""
|
||||
@@ -269,26 +269,20 @@ export ALPINE_VERSION
|
||||
export ARCH
|
||||
export BUILD_TYPE
|
||||
|
||||
# Determine build method based on OS
|
||||
if [ "$(uname)" = "Darwin" ]; then
|
||||
echo -e "${BLUE}🍎 Building on macOS via Docker${NC}"
|
||||
"$SCRIPT_DIR/build-macos.sh" "$BUILD_TYPE"
|
||||
else
|
||||
echo -e "${BLUE}🐧 Building on Linux${NC}"
|
||||
if [ -f /etc/alpine-release ]; then
|
||||
echo -e "${GREEN}✓${NC} Alpine Linux detected, using native build"
|
||||
"$SCRIPT_DIR/build-alpine-native.sh" "$BUILD_TYPE"
|
||||
else
|
||||
echo -e "${YELLOW}⚠${NC} Non-Alpine Linux, using Docker build"
|
||||
"$SCRIPT_DIR/build-linux.sh" "$BUILD_TYPE"
|
||||
fi
|
||||
fi
|
||||
# Determine build method - use custom ISO builder
|
||||
echo ""
|
||||
echo -e "${BLUE}🔨 Building custom ISO from Alpine base...${NC}"
|
||||
"$SCRIPT_DIR/build-custom-iso.sh" || {
|
||||
echo ""
|
||||
echo -e "${RED}❌ ISO build failed${NC}"
|
||||
exit 1
|
||||
}
|
||||
|
||||
# Rename output with hardware target
|
||||
# Rename output with hardware target
|
||||
OUTPUT_DIR="$SCRIPT_DIR/results"
|
||||
if [ -f "$OUTPUT_DIR/archipelago-${ARCHIPELAGO_VERSION}-${ARCH}.iso" ]; then
|
||||
mv "$OUTPUT_DIR/archipelago-${ARCHIPELAGO_VERSION}-${ARCH}.iso" \
|
||||
"$OUTPUT_DIR/archipelago-${ARCHIPELAGO_VERSION}-${HARDWARE_PROFILE}-${ARCH}.iso"
|
||||
if [ -f "$OUTPUT_DIR/archipelago-${ALPINE_VERSION}-${ARCH}.iso" ]; then
|
||||
mv "$OUTPUT_DIR/archipelago-${ALPINE_VERSION}-${ARCH}.iso" \
|
||||
"$OUTPUT_DIR/archipelago-${ALPINE_VERSION}-${HARDWARE_PROFILE}-${ARCH}.iso"
|
||||
|
||||
echo ""
|
||||
echo -e "${GREEN}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}"
|
||||
@@ -296,12 +290,12 @@ if [ -f "$OUTPUT_DIR/archipelago-${ARCHIPELAGO_VERSION}-${ARCH}.iso" ]; then
|
||||
echo -e "${GREEN}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}"
|
||||
echo ""
|
||||
echo -e " ${YELLOW}Hardware:${NC} ${HARDWARE_NAME}"
|
||||
echo -e " ${YELLOW}ISO File:${NC} archipelago-${ARCHIPELAGO_VERSION}-${HARDWARE_PROFILE}-${ARCH}.iso"
|
||||
echo -e " ${YELLOW}ISO File:${NC} archipelago-${ALPINE_VERSION}-${HARDWARE_PROFILE}-${ARCH}.iso"
|
||||
echo -e " ${YELLOW}Location:${NC} ${OUTPUT_DIR}/"
|
||||
echo ""
|
||||
echo -e "${BLUE}Next Steps:${NC}"
|
||||
echo -e " 1. Flash ISO to USB drive:"
|
||||
echo -e " ${YELLOW}sudo dd if=${OUTPUT_DIR}/archipelago-${ARCHIPELAGO_VERSION}-${HARDWARE_PROFILE}-${ARCH}.iso of=/dev/sdX bs=1M${NC}"
|
||||
echo -e " ${YELLOW}sudo dd if=${OUTPUT_DIR}/archipelago-${ALPINE_VERSION}-${HARDWARE_PROFILE}-${ARCH}.iso of=/dev/sdX bs=1M${NC}"
|
||||
echo ""
|
||||
echo -e " 2. Boot ${HARDWARE_NAME} from USB"
|
||||
echo ""
|
||||
|
||||
Executable
+57
@@ -0,0 +1,57 @@
|
||||
#!/bin/bash
|
||||
# Build Archipelago Vue.js frontend for production
|
||||
|
||||
set -e
|
||||
|
||||
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
||||
PROJECT_ROOT="$(cd "$SCRIPT_DIR/.." && pwd)"
|
||||
|
||||
echo "🎨 Building Archipelago Frontend (Vue.js)"
|
||||
echo ""
|
||||
|
||||
# Navigate to frontend directory
|
||||
cd "$PROJECT_ROOT/neode-ui"
|
||||
|
||||
# Check if node_modules exists
|
||||
if [ ! -d "node_modules" ]; then
|
||||
echo "📦 Installing dependencies..."
|
||||
npm install || {
|
||||
echo "❌ npm install failed"
|
||||
exit 1
|
||||
}
|
||||
fi
|
||||
|
||||
# Build for production
|
||||
echo "🔨 Building production bundle (skipping type check for speed)..."
|
||||
npm run build:docker || {
|
||||
echo "❌ Build failed"
|
||||
exit 1
|
||||
}
|
||||
|
||||
# Create output directory
|
||||
BUILD_DIR="$SCRIPT_DIR/build/frontend"
|
||||
mkdir -p "$BUILD_DIR"
|
||||
|
||||
# Copy dist to build directory (check both possible output locations)
|
||||
echo "📋 Copying build artifacts..."
|
||||
if [ -d "../web/dist/neode-ui" ]; then
|
||||
cp -r ../web/dist/neode-ui/* "$BUILD_DIR/" || {
|
||||
echo "❌ Failed to copy build artifacts"
|
||||
exit 1
|
||||
}
|
||||
elif [ -d "dist" ]; then
|
||||
cp -r dist/* "$BUILD_DIR/" || {
|
||||
echo "❌ Failed to copy build artifacts"
|
||||
exit 1
|
||||
}
|
||||
else
|
||||
echo "❌ Build output not found"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
echo ""
|
||||
echo "✅ Frontend built successfully!"
|
||||
echo " Output: $BUILD_DIR"
|
||||
echo " Files:"
|
||||
ls -lh "$BUILD_DIR" | head -10
|
||||
echo ""
|
||||
Executable
+353
@@ -0,0 +1,353 @@
|
||||
#!/bin/bash
|
||||
# Build proper Alpine ISO with Archipelago overlay (apkovl method)
|
||||
|
||||
set -e
|
||||
|
||||
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
||||
ALPINE_VERSION="${ALPINE_VERSION:-3.19}"
|
||||
ARCH="${ARCH:-x86_64}"
|
||||
WORK_DIR="$SCRIPT_DIR/build/overlay-iso"
|
||||
OUTPUT_DIR="$SCRIPT_DIR/results"
|
||||
|
||||
echo "🏔️ Building Archipelago ISO using Alpine overlay method"
|
||||
echo ""
|
||||
echo "📋 Configuration:"
|
||||
echo " Alpine Version: $ALPINE_VERSION"
|
||||
echo " Architecture: $ARCH"
|
||||
echo ""
|
||||
|
||||
# Create work directories
|
||||
mkdir -p "$WORK_DIR"
|
||||
mkdir -p "$OUTPUT_DIR"
|
||||
|
||||
# Download base Alpine ISO if not exists
|
||||
BASE_ISO="$WORK_DIR/alpine-standard-${ALPINE_VERSION}.0-${ARCH}.iso"
|
||||
if [ ! -f "$BASE_ISO" ]; then
|
||||
echo "📥 Downloading Alpine base ISO..."
|
||||
curl -L -o "$BASE_ISO" \
|
||||
"https://dl-cdn.alpinelinux.org/alpine/v${ALPINE_VERSION}/releases/${ARCH}/alpine-standard-${ALPINE_VERSION}.0-${ARCH}.iso"
|
||||
echo "✅ Downloaded base ISO"
|
||||
else
|
||||
echo "✅ Using cached base ISO"
|
||||
fi
|
||||
|
||||
# Create overlay structure
|
||||
echo "📦 Creating Archipelago overlay..."
|
||||
OVERLAY_DIR="$WORK_DIR/overlay"
|
||||
rm -rf "$OVERLAY_DIR"
|
||||
mkdir -p "$OVERLAY_DIR"
|
||||
|
||||
# Create overlay root
|
||||
OVERLAY_ROOT="$OVERLAY_DIR/archipelago-overlay"
|
||||
mkdir -p "$OVERLAY_ROOT"/{etc,root,usr/local/bin,var/lib/archipelago,home/archipelago}
|
||||
|
||||
# Copy Archipelago backend if available
|
||||
BACKEND_BIN="$SCRIPT_DIR/build/backend/archipelago"
|
||||
if [ -f "$BACKEND_BIN" ]; then
|
||||
echo "🦀 Including Archipelago backend..."
|
||||
cp "$BACKEND_BIN" "$OVERLAY_ROOT/usr/local/bin/"
|
||||
chmod +x "$OVERLAY_ROOT/usr/local/bin/archipelago"
|
||||
fi
|
||||
|
||||
# Copy Archipelago frontend if available
|
||||
FRONTEND_DIR="$SCRIPT_DIR/build/frontend"
|
||||
if [ -d "$FRONTEND_DIR" ]; then
|
||||
echo "🎨 Including Archipelago frontend..."
|
||||
mkdir -p "$OVERLAY_ROOT/usr/share/archipelago/web"
|
||||
cp -r "$FRONTEND_DIR"/* "$OVERLAY_ROOT/usr/share/archipelago/web/"
|
||||
fi
|
||||
|
||||
# Copy app manifests
|
||||
APPS_DIR="$SCRIPT_DIR/../apps"
|
||||
if [ -d "$APPS_DIR" ]; then
|
||||
echo "📦 Including app manifests..."
|
||||
mkdir -p "$OVERLAY_ROOT/var/lib/archipelago/manifests"
|
||||
find "$APPS_DIR" -maxdepth 1 -type d -exec test -f {}/manifest.yml \; \
|
||||
-exec cp -r {} "$OVERLAY_ROOT/var/lib/archipelago/manifests/" \;
|
||||
fi
|
||||
|
||||
# Create installation script in overlay
|
||||
cat > "$OVERLAY_ROOT/root/install-archipelago.sh" <<'INSTALL_SCRIPT'
|
||||
#!/bin/sh
|
||||
# Archipelago installation script
|
||||
|
||||
set -e
|
||||
|
||||
echo "🏝️ Installing Archipelago Bitcoin Node OS"
|
||||
echo ""
|
||||
|
||||
# Install required packages
|
||||
echo "📦 Installing packages..."
|
||||
apk add --no-cache \
|
||||
podman \
|
||||
crun \
|
||||
fuse-overlayfs \
|
||||
slirp4netns \
|
||||
nginx \
|
||||
openssh \
|
||||
iptables \
|
||||
iproute2 \
|
||||
bash \
|
||||
curl
|
||||
|
||||
# Create archipelago user
|
||||
echo "👤 Creating archipelago user..."
|
||||
if ! id archipelago >/dev/null 2>&1; then
|
||||
adduser -D -s /bin/bash archipelago
|
||||
echo "archipelago:archipelago" | chpasswd
|
||||
fi
|
||||
|
||||
# Setup data directories
|
||||
echo "📁 Creating data directories..."
|
||||
mkdir -p /var/lib/archipelago/{apps,secrets,logs,backups}
|
||||
chown -R archipelago:archipelago /var/lib/archipelago
|
||||
|
||||
# Install backend if available
|
||||
if [ -f /usr/local/bin/archipelago ]; then
|
||||
echo "✅ Archipelago backend installed"
|
||||
fi
|
||||
|
||||
# Configure nginx for frontend
|
||||
if [ -d /usr/share/archipelago/web ]; then
|
||||
echo "🎨 Configuring web UI..."
|
||||
cat > /etc/nginx/http.d/archipelago.conf <<'NGINX_EOF'
|
||||
server {
|
||||
listen 8100;
|
||||
server_name _;
|
||||
|
||||
root /usr/share/archipelago/web;
|
||||
index index.html;
|
||||
|
||||
location / {
|
||||
try_files $uri $uri/ /index.html;
|
||||
}
|
||||
|
||||
location /api/ {
|
||||
proxy_pass http://127.0.0.1:8101/;
|
||||
proxy_http_version 1.1;
|
||||
proxy_set_header Upgrade $http_upgrade;
|
||||
proxy_set_header Connection 'upgrade';
|
||||
proxy_set_header Host $host;
|
||||
proxy_cache_bypass $http_upgrade;
|
||||
}
|
||||
}
|
||||
NGINX_EOF
|
||||
|
||||
rc-update add nginx default
|
||||
fi
|
||||
|
||||
# Create Archipelago service
|
||||
if [ -f /usr/local/bin/archipelago ]; then
|
||||
cat > /etc/init.d/archipelago <<'SERVICE_EOF'
|
||||
#!/sbin/openrc-run
|
||||
|
||||
name="Archipelago"
|
||||
description="Archipelago Bitcoin Node OS Backend"
|
||||
command="/usr/local/bin/archipelago"
|
||||
command_background=true
|
||||
pidfile="/run/archipelago.pid"
|
||||
|
||||
depend() {
|
||||
need net
|
||||
after networking
|
||||
}
|
||||
SERVICE_EOF
|
||||
|
||||
chmod +x /etc/init.d/archipelago
|
||||
rc-update add archipelago default
|
||||
fi
|
||||
|
||||
# Configure networking
|
||||
echo "🌐 Configuring network..."
|
||||
setup-interfaces -a
|
||||
|
||||
# Enable services
|
||||
rc-update add sshd default
|
||||
|
||||
echo ""
|
||||
echo "✅ Archipelago installation complete!"
|
||||
echo ""
|
||||
echo "Next steps:"
|
||||
echo " 1. Reboot the system"
|
||||
echo " 2. Login as: archipelago / archipelago"
|
||||
echo " 3. Change password: passwd"
|
||||
echo " 4. Access UI: http://<your-ip>:8100"
|
||||
echo ""
|
||||
|
||||
INSTALL_SCRIPT
|
||||
|
||||
chmod +x "$OVERLAY_ROOT/root/install-archipelago.sh"
|
||||
|
||||
# Create Alpine local.d boot script to show message
|
||||
mkdir -p "$OVERLAY_ROOT/etc/local.d"
|
||||
cat > "$OVERLAY_ROOT/etc/local.d/00-archipelago-welcome.start" <<'WELCOME_EOF'
|
||||
#!/bin/sh
|
||||
|
||||
cat <<'MSG'
|
||||
|
||||
╔═══════════════════════════════════════════════════════════╗
|
||||
║ ║
|
||||
║ 🏝️ ARCHIPELAGO BITCOIN NODE OS ║
|
||||
║ ║
|
||||
║ To install to disk, login as root and run: ║
|
||||
║ ║
|
||||
║ # setup-alpine ║
|
||||
║ # /root/install-archipelago.sh ║
|
||||
║ ║
|
||||
╚═══════════════════════════════════════════════════════════╝
|
||||
|
||||
MSG
|
||||
|
||||
WELCOME_EOF
|
||||
|
||||
chmod +x "$OVERLAY_ROOT/etc/local.d/00-archipelago-welcome.start"
|
||||
|
||||
# Create the overlay tarball (apkovl)
|
||||
echo "📦 Creating overlay tarball..."
|
||||
cd "$OVERLAY_DIR"
|
||||
tar czf archipelago.apkovl.tar.gz archipelago-overlay/
|
||||
echo "✅ Overlay created: $(du -h archipelago.apkovl.tar.gz | cut -f1)"
|
||||
|
||||
# Mount the base ISO and copy it with our overlay
|
||||
echo "📀 Creating final ISO with overlay..."
|
||||
ISO_MOUNT="$WORK_DIR/mnt"
|
||||
ISO_CUSTOM="$WORK_DIR/custom"
|
||||
|
||||
mkdir -p "$ISO_MOUNT" "$ISO_CUSTOM"
|
||||
|
||||
# Extract base ISO
|
||||
if command -v 7z >/dev/null 2>&1; then
|
||||
7z x "$BASE_ISO" -o"$ISO_CUSTOM" -y >/dev/null
|
||||
elif [[ "$OSTYPE" == "darwin"* ]]; then
|
||||
hdiutil attach "$BASE_ISO" -mountpoint "$ISO_MOUNT" -readonly
|
||||
rsync -a "$ISO_MOUNT"/ "$ISO_CUSTOM"/
|
||||
hdiutil detach "$ISO_MOUNT"
|
||||
fi
|
||||
|
||||
# Copy Archipelago files directly to ISO (skip apkovl, put files in accessible location)
|
||||
echo "📋 Adding Archipelago files to ISO..."
|
||||
mkdir -p "$ISO_CUSTOM/archipelago"
|
||||
cp "$OVERLAY_DIR/archipelago.apkovl.tar.gz" "$ISO_CUSTOM/archipelago/"
|
||||
|
||||
# Also extract directly to archipelago folder for easy access
|
||||
cd "$OVERLAY_DIR"
|
||||
tar xzf archipelago.apkovl.tar.gz
|
||||
cp -r archipelago-overlay/* "$ISO_CUSTOM/archipelago/"
|
||||
|
||||
# CRITICAL: Add .boot_repository marker so Alpine's nlplug-findfs can find the boot media
|
||||
# This tells the initramfs that this is a valid Alpine boot repository
|
||||
echo "📍 Marking ISO as boot repository..."
|
||||
touch "$ISO_CUSTOM/.boot_repository"
|
||||
|
||||
# Also mark the apks directories at all levels
|
||||
if [ -d "$ISO_CUSTOM/apks" ]; then
|
||||
touch "$ISO_CUSTOM/apks/.boot_repository"
|
||||
fi
|
||||
if [ -d "$ISO_CUSTOM/apks/x86_64" ]; then
|
||||
touch "$ISO_CUSTOM/apks/x86_64/.boot_repository"
|
||||
fi
|
||||
|
||||
# Create a simple first-boot setup script
|
||||
cat > "$ISO_CUSTOM/archipelago/setup-archipelago.sh" <<'SETUP_EOF'
|
||||
#!/bin/sh
|
||||
# Archipelago first-boot setup
|
||||
|
||||
set -e
|
||||
|
||||
echo "🏝️ Setting up Archipelago overlay..."
|
||||
|
||||
# Copy files from CD to root
|
||||
if [ -d /media/cdrom/archipelago/archipelago-overlay ]; then
|
||||
cp -r /media/cdrom/archipelago/archipelago-overlay/* /
|
||||
echo "✅ Archipelago files installed"
|
||||
elif [ -d /media/cdrom/archipelago/root ]; then
|
||||
cp -r /media/cdrom/archipelago/* /
|
||||
echo "✅ Archipelago files installed"
|
||||
fi
|
||||
|
||||
# Run the installer if it exists
|
||||
if [ -f /root/install-archipelago.sh ]; then
|
||||
echo ""
|
||||
echo "Archipelago is now available!"
|
||||
echo "Run: /root/install-archipelago.sh"
|
||||
fi
|
||||
SETUP_EOF
|
||||
|
||||
chmod +x "$ISO_CUSTOM/archipelago/setup-archipelago.sh"
|
||||
|
||||
# Modify boot configs (remove apkovl parameter, use normal boot)
|
||||
echo "⚙️ Configuring boot..."
|
||||
|
||||
# Modify boot configs to add USB delay for better hardware compatibility
|
||||
# Keep Alpine's boot logic intact, just add timing parameters
|
||||
# HP ProDesk likely boots UEFI (GRUB), so we need to modify both configs
|
||||
|
||||
if [ -f "$ISO_CUSTOM/boot/grub/grub.cfg" ]; then
|
||||
# UEFI boot (GRUB) - add usbdelay and debug
|
||||
sed -i.bak \
|
||||
-e 's/Alpine Linux/Archipelago Bitcoin Node OS/g' \
|
||||
-e 's/quiet/usbdelay=5 debug_init/' \
|
||||
"$ISO_CUSTOM/boot/grub/grub.cfg"
|
||||
fi
|
||||
|
||||
if [ -f "$ISO_CUSTOM/boot/syslinux/syslinux.cfg" ]; then
|
||||
# Legacy BIOS boot (Syslinux) - add usbdelay and debug
|
||||
sed -i.bak \
|
||||
-e 's/Alpine Linux/Archipelago Bitcoin Node OS/g' \
|
||||
-e 's/quiet/usbdelay=5 debug_init/' \
|
||||
"$ISO_CUSTOM/boot/syslinux/syslinux.cfg"
|
||||
fi
|
||||
|
||||
# Update MOTD to show Archipelago instructions
|
||||
cat > "$ISO_CUSTOM/.alpine-release" <<'MOTD_EOF'
|
||||
3.19.0
|
||||
MOTD_EOF
|
||||
|
||||
mkdir -p "$ISO_CUSTOM/etc"
|
||||
cat > "$ISO_CUSTOM/etc/motd" <<'MOTD_EOF'
|
||||
|
||||
╔═══════════════════════════════════════════════════════════╗
|
||||
║ ║
|
||||
║ 🏝️ ARCHIPELAGO BITCOIN NODE OS ║
|
||||
║ ║
|
||||
║ To set up Archipelago, run: ║
|
||||
║ # sh /media/cdrom/archipelago/setup-archipelago.sh ║
|
||||
║ ║
|
||||
║ Then install to disk with: ║
|
||||
║ # setup-alpine ║
|
||||
║ ║
|
||||
╚═══════════════════════════════════════════════════════════╝
|
||||
|
||||
MOTD_EOF
|
||||
|
||||
# Create final ISO
|
||||
OUTPUT_ISO="$OUTPUT_DIR/archipelago-${ALPINE_VERSION}-hp-prodesk-uefi-x86_64.iso"
|
||||
echo ""
|
||||
echo "🔥 Creating final bootable ISO..."
|
||||
|
||||
if [[ "$OSTYPE" == "darwin"* ]]; then
|
||||
if command -v xorriso >/dev/null 2>&1; then
|
||||
xorriso -as mkisofs -o "$OUTPUT_ISO" \
|
||||
-volid "ARCHIPELAGO" \
|
||||
-J -R \
|
||||
-c boot/syslinux/boot.cat \
|
||||
-b boot/syslinux/isolinux.bin \
|
||||
-no-emul-boot -boot-load-size 4 -boot-info-table \
|
||||
-eltorito-alt-boot \
|
||||
-e boot/grub/efi.img \
|
||||
-no-emul-boot \
|
||||
-isohybrid-gpt-basdat \
|
||||
-isohybrid-mbr "$ISO_CUSTOM/boot/syslinux/isohdpfx.bin" \
|
||||
"$ISO_CUSTOM" 2>&1 | grep -v "xorriso : UPDATE"
|
||||
fi
|
||||
fi
|
||||
|
||||
echo ""
|
||||
echo "✅ ISO created successfully!"
|
||||
echo ""
|
||||
echo "📀 Output: $OUTPUT_ISO"
|
||||
echo " Size: $(du -h "$OUTPUT_ISO" | cut -f1)"
|
||||
echo ""
|
||||
echo "📝 This ISO uses Alpine's overlay system (apkovl)"
|
||||
echo " The overlay will be automatically loaded at boot"
|
||||
echo ""
|
||||
Executable
+61
@@ -0,0 +1,61 @@
|
||||
#!/bin/bash
|
||||
# Create a proper bootable USB for HP ProDesk
|
||||
# This formats the USB and installs Alpine in a way that works on real hardware
|
||||
|
||||
set -e
|
||||
|
||||
USB_DEVICE="${1:-/dev/disk4}"
|
||||
ISO_FILE="/Users/dorian/Projects/archy/image-recipe/results/archipelago-3.19-hp-prodesk-uefi-x86_64.iso"
|
||||
|
||||
if [ ! -f "$ISO_FILE" ]; then
|
||||
echo "❌ ISO file not found: $ISO_FILE"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
echo "⚠️ WARNING: This will ERASE all data on $USB_DEVICE"
|
||||
echo "Press Ctrl+C to cancel, or Enter to continue..."
|
||||
read
|
||||
|
||||
echo "📀 ISO: $ISO_FILE"
|
||||
echo "💾 USB: $USB_DEVICE"
|
||||
echo ""
|
||||
|
||||
# Unmount
|
||||
echo "🔓 Unmounting USB..."
|
||||
diskutil unmountDisk "$USB_DEVICE" || true
|
||||
|
||||
# Create hybrid ISO (makes it bootable from USB on both BIOS and UEFI)
|
||||
echo "🔧 Creating hybrid boot support..."
|
||||
if command -v isohybrid >/dev/null 2>&1; then
|
||||
# If syslinux is installed
|
||||
cp "$ISO_FILE" "/tmp/hybrid-archipelago.iso"
|
||||
isohybrid -u "/tmp/hybrid-archipelago.iso"
|
||||
ISO_FILE="/tmp/hybrid-archipelago.iso"
|
||||
echo "✅ Hybrid boot support added"
|
||||
else
|
||||
echo "ℹ️ isohybrid not available, using direct ISO write"
|
||||
fi
|
||||
|
||||
# Write to USB using dd
|
||||
echo "💿 Writing ISO to USB..."
|
||||
echo " This will take 2-3 minutes..."
|
||||
sudo dd if="$ISO_FILE" of="${USB_DEVICE/disk/rdisk}" bs=1m status=progress
|
||||
|
||||
# Sync
|
||||
echo "🔄 Syncing..."
|
||||
sync
|
||||
|
||||
# Clean up
|
||||
rm -f "/tmp/hybrid-archipelago.iso"
|
||||
|
||||
echo ""
|
||||
echo "✅ USB boot device created successfully!"
|
||||
echo ""
|
||||
echo "📋 Next steps:"
|
||||
echo " 1. Check HP ProDesk BIOS settings:"
|
||||
echo " - Disable Secure Boot"
|
||||
echo " - Enable USB Boot"
|
||||
echo " - Try Legacy BIOS mode first"
|
||||
echo " 2. Boot from USB"
|
||||
echo " 3. Should see Alpine login prompt"
|
||||
echo ""
|
||||
Executable
+40
@@ -0,0 +1,40 @@
|
||||
#!/bin/bash
|
||||
# Integrate Archipelago backend and frontend into custom ISO
|
||||
|
||||
set -e
|
||||
|
||||
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
||||
|
||||
echo "🔗 Integrating Archipelago Components into ISO"
|
||||
echo ""
|
||||
|
||||
# Check if backend exists
|
||||
BACKEND_BIN="$SCRIPT_DIR/build/backend/archipelago"
|
||||
if [ ! -f "$BACKEND_BIN" ]; then
|
||||
echo "❌ Backend binary not found at $BACKEND_BIN"
|
||||
echo " Run: ./build-backend.sh first"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Check if frontend exists
|
||||
FRONTEND_DIR="$SCRIPT_DIR/build/frontend"
|
||||
if [ ! -d "$FRONTEND_DIR" ] || [ ! -f "$FRONTEND_DIR/index.html" ]; then
|
||||
echo "❌ Frontend build not found at $FRONTEND_DIR"
|
||||
echo " Run: ./build-frontend.sh first"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
echo "✅ Found backend binary: $(du -h "$BACKEND_BIN" | cut -f1)"
|
||||
echo "✅ Found frontend files"
|
||||
echo ""
|
||||
|
||||
# Now rebuild the ISO with the integrated components
|
||||
export INCLUDE_BACKEND="$BACKEND_BIN"
|
||||
export INCLUDE_FRONTEND="$FRONTEND_DIR"
|
||||
|
||||
echo "🔨 Rebuilding ISO with Archipelago components..."
|
||||
./build-custom-iso.sh
|
||||
|
||||
echo ""
|
||||
echo "✅ Integration complete!"
|
||||
echo ""
|
||||
Executable
+33
@@ -0,0 +1,33 @@
|
||||
#!/bin/bash
|
||||
# Test Archipelago ISO in QEMU
|
||||
|
||||
ISO="${1:-/Users/dorian/Projects/archy/image-recipe/results/archipelago-3.19-hp-prodesk-uefi-x86_64.iso}"
|
||||
|
||||
if [ ! -f "$ISO" ]; then
|
||||
echo "❌ ISO not found: $ISO"
|
||||
echo "Usage: $0 [path-to-iso]"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
echo "🧪 Testing Archipelago ISO in QEMU"
|
||||
echo "📀 ISO: $ISO"
|
||||
echo "💾 RAM: 4GB"
|
||||
echo "🖥️ CPU: 4 cores"
|
||||
echo ""
|
||||
echo "Press Ctrl+Alt+G to release mouse/keyboard from VM"
|
||||
echo "Press Ctrl+C in this terminal to stop VM"
|
||||
echo ""
|
||||
echo "Starting VM in 3 seconds..."
|
||||
sleep 3
|
||||
|
||||
# Run QEMU with Legacy BIOS (simpler, more compatible)
|
||||
qemu-system-x86_64 \
|
||||
-machine pc \
|
||||
-m 2G \
|
||||
-smp 2 \
|
||||
-boot d \
|
||||
-cdrom "$ISO" \
|
||||
-drive if=virtio,format=qcow2,file=/tmp/archipelago-test-disk.qcow2 \
|
||||
-net nic,model=virtio -net user \
|
||||
-vga virtio \
|
||||
-display default
|
||||
Reference in New Issue
Block a user