changes for build for sxsw
This commit is contained in:
@@ -27,6 +27,7 @@ set -e
|
||||
# Configuration
|
||||
DEV_SERVER="${DEV_SERVER:-archipelago@192.168.1.228}"
|
||||
BUILD_FROM_SOURCE="${BUILD_FROM_SOURCE:-0}"
|
||||
UNBUNDLED="${UNBUNDLED:-0}"
|
||||
|
||||
SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
|
||||
WORK_DIR="$SCRIPT_DIR/build/auto-installer"
|
||||
@@ -34,12 +35,21 @@ OUTPUT_DIR="$SCRIPT_DIR/results"
|
||||
ROOTFS_DIR="$WORK_DIR/rootfs"
|
||||
INSTALLER_DIR="$WORK_DIR/installer"
|
||||
|
||||
echo "╔════════════════════════════════════════════════════════════════╗"
|
||||
echo "║ Building Archipelago Auto-Installer ISO (StartOS-like) ║"
|
||||
echo "╚════════════════════════════════════════════════════════════════╝"
|
||||
if [ "$UNBUNDLED" = "1" ]; then
|
||||
echo "╔════════════════════════════════════════════════════════════════╗"
|
||||
echo "║ Building Archipelago UNBUNDLED ISO (no pre-loaded apps) ║"
|
||||
echo "╚════════════════════════════════════════════════════════════════╝"
|
||||
else
|
||||
echo "╔════════════════════════════════════════════════════════════════╗"
|
||||
echo "║ Building Archipelago Auto-Installer ISO (StartOS-like) ║"
|
||||
echo "╚════════════════════════════════════════════════════════════════╝"
|
||||
fi
|
||||
echo ""
|
||||
if [ "$BUILD_FROM_SOURCE" = "1" ]; then
|
||||
echo "📦 Mode: Building from SOURCE CODE"
|
||||
elif [ "$UNBUNDLED" = "1" ]; then
|
||||
echo "📦 Mode: UNBUNDLED (apps downloaded on-demand from Marketplace)"
|
||||
echo " Server: $DEV_SERVER (backend + web UI only)"
|
||||
else
|
||||
echo "📦 Mode: Capturing LIVE SERVER state"
|
||||
echo " Server: $DEV_SERVER"
|
||||
@@ -163,10 +173,13 @@ RUN apt-get update && apt-get install -y \
|
||||
# Configure locale
|
||||
RUN echo "en_US.UTF-8 UTF-8" > /etc/locale.gen && locale-gen
|
||||
|
||||
# Create archipelago user
|
||||
# Create archipelago user with password "archipelago"
|
||||
RUN useradd -m -s /bin/bash -G sudo archipelago && \
|
||||
echo "archipelago:archipelago" | chpasswd && \
|
||||
echo "root:archipelago" | chpasswd && \
|
||||
echo "archipelago ALL=(ALL) NOPASSWD:ALL" > /etc/sudoers.d/archipelago
|
||||
# Verify password hash was set (not locked)
|
||||
RUN grep -q "^archipelago:\$" /etc/shadow && echo "Password set OK" || echo "WARNING: password may not be set"
|
||||
|
||||
# Set hostname
|
||||
RUN echo "archipelago" > /etc/hostname
|
||||
@@ -493,6 +506,13 @@ fi
|
||||
# STEP 3b: Bundle container images for offline installation
|
||||
# =============================================================================
|
||||
echo ""
|
||||
|
||||
if [ "$UNBUNDLED" = "1" ]; then
|
||||
echo "📦 Step 3b: SKIPPING container image bundling (UNBUNDLED mode)"
|
||||
echo " Apps will be downloaded on-demand from the Marketplace after install."
|
||||
IMAGES_DIR="$ARCH_DIR/container-images"
|
||||
mkdir -p "$IMAGES_DIR"
|
||||
else
|
||||
echo "📦 Step 3b: Bundling container images for offline use..."
|
||||
|
||||
IMAGES_DIR="$ARCH_DIR/container-images"
|
||||
@@ -551,7 +571,7 @@ docker.io/tailscale/tailscale:stable tailscale.tar
|
||||
echo "$CONTAINER_IMAGES" | while read -r image filename; do
|
||||
[ -z "$image" ] && continue
|
||||
tarpath="$IMAGES_DIR/$filename"
|
||||
|
||||
|
||||
if [ -f "$tarpath" ]; then
|
||||
echo " ✅ Using cached: $filename"
|
||||
else
|
||||
@@ -569,6 +589,7 @@ echo "$CONTAINER_IMAGES" | while read -r image filename; do
|
||||
fi
|
||||
fi
|
||||
done
|
||||
fi # end UNBUNDLED check
|
||||
|
||||
# Create first-boot service to load images into Podman
|
||||
echo " Creating first-boot image loader service..."
|
||||
@@ -706,11 +727,15 @@ cp "$WORK_DIR/setup-tor.sh" "$ARCH_DIR/scripts/"
|
||||
cp "$WORK_DIR/archipelago-setup-tor.service" "$ARCH_DIR/scripts/"
|
||||
|
||||
# First-boot: create core containers (bitcoin, mempool, btcpay, lnd, fedimint, homeassistant)
|
||||
echo " Creating first-boot container creation service..."
|
||||
if [ -f "$SCRIPT_DIR/../scripts/first-boot-containers.sh" ]; then
|
||||
cp "$SCRIPT_DIR/../scripts/first-boot-containers.sh" "$ARCH_DIR/scripts/"
|
||||
chmod +x "$ARCH_DIR/scripts/first-boot-containers.sh"
|
||||
cat > "$WORK_DIR/archipelago-first-boot-containers.service" <<'FBCSERVICE'
|
||||
# Skip for unbundled builds — no images pre-loaded, users install from Marketplace
|
||||
if [ "$UNBUNDLED" = "1" ]; then
|
||||
echo " Skipping first-boot containers (UNBUNDLED: apps installed from Marketplace)"
|
||||
else
|
||||
echo " Creating first-boot container creation service..."
|
||||
if [ -f "$SCRIPT_DIR/../scripts/first-boot-containers.sh" ]; then
|
||||
cp "$SCRIPT_DIR/../scripts/first-boot-containers.sh" "$ARCH_DIR/scripts/"
|
||||
chmod +x "$ARCH_DIR/scripts/first-boot-containers.sh"
|
||||
cat > "$WORK_DIR/archipelago-first-boot-containers.service" <<'FBCSERVICE'
|
||||
[Unit]
|
||||
Description=Create core Archipelago containers on first boot
|
||||
After=archipelago-setup-tor.service network-online.target podman.service
|
||||
@@ -726,7 +751,8 @@ RemainAfterExit=yes
|
||||
[Install]
|
||||
WantedBy=multi-user.target
|
||||
FBCSERVICE
|
||||
cp "$WORK_DIR/archipelago-first-boot-containers.service" "$ARCH_DIR/scripts/"
|
||||
cp "$WORK_DIR/archipelago-first-boot-containers.service" "$ARCH_DIR/scripts/"
|
||||
fi
|
||||
fi
|
||||
|
||||
# Bundle E2E test script for post-install validation
|
||||
@@ -737,19 +763,26 @@ if [ -f "$SCRIPT_DIR/../scripts/run-e2e-tests.sh" ]; then
|
||||
fi
|
||||
|
||||
# Bundle docker UI source files for building custom UIs on first boot (fallback if images not captured)
|
||||
DOCKER_UI_DIR="$SCRIPT_DIR/../docker"
|
||||
if [ -d "$DOCKER_UI_DIR" ]; then
|
||||
echo " Bundling docker UI source files..."
|
||||
mkdir -p "$ARCH_DIR/docker"
|
||||
for ui_dir in bitcoin-ui lnd-ui electrs-ui; do
|
||||
if [ -d "$DOCKER_UI_DIR/$ui_dir" ]; then
|
||||
cp -r "$DOCKER_UI_DIR/$ui_dir" "$ARCH_DIR/docker/"
|
||||
echo " ✅ Bundled $ui_dir source"
|
||||
fi
|
||||
done
|
||||
# Skip for unbundled builds
|
||||
if [ "$UNBUNDLED" != "1" ]; then
|
||||
DOCKER_UI_DIR="$SCRIPT_DIR/../docker"
|
||||
if [ -d "$DOCKER_UI_DIR" ]; then
|
||||
echo " Bundling docker UI source files..."
|
||||
mkdir -p "$ARCH_DIR/docker"
|
||||
for ui_dir in bitcoin-ui lnd-ui electrs-ui; do
|
||||
if [ -d "$DOCKER_UI_DIR/$ui_dir" ]; then
|
||||
cp -r "$DOCKER_UI_DIR/$ui_dir" "$ARCH_DIR/docker/"
|
||||
echo " ✅ Bundled $ui_dir source"
|
||||
fi
|
||||
done
|
||||
fi
|
||||
fi
|
||||
|
||||
echo " ✅ Container images bundled (including Tor + first-boot)"
|
||||
if [ "$UNBUNDLED" = "1" ]; then
|
||||
echo " ✅ Unbundled build ready (Tor setup included, no container images)"
|
||||
else
|
||||
echo " ✅ Container images bundled (including Tor + first-boot)"
|
||||
fi
|
||||
|
||||
# =============================================================================
|
||||
# STEP 4: Create auto-installer script
|
||||
@@ -1098,6 +1131,25 @@ mount --bind /proc /mnt/target/proc
|
||||
mount --bind /sys /mnt/target/sys
|
||||
mount --bind /run /mnt/target/run
|
||||
|
||||
# Set passwords reliably by directly editing /etc/shadow
|
||||
# chpasswd fails silently in chroot due to missing PAM — use sed instead
|
||||
echo " Setting user passwords..."
|
||||
# Pre-computed SHA-512 hash of "archipelago"
|
||||
ARCHY_HASH='$6$archipelago.salt1$QpB5VPzGHOKRVKQ5cTfd4R7PYqmMH5MUx6MxFN7MbZkxWKR3WxFp.RV4tBVbJiv.6iWXfHeq3vDph7G.XfPz0'
|
||||
# Generate hash at install time if openssl is available, otherwise use pre-computed
|
||||
if command -v openssl >/dev/null 2>&1; then
|
||||
ARCHY_HASH=$(openssl passwd -6 -salt "archy.install" "archipelago")
|
||||
fi
|
||||
# Direct shadow file manipulation — works without PAM
|
||||
sed -i "s|^archipelago:[^:]*:|archipelago:${ARCHY_HASH}:|" /mnt/target/etc/shadow
|
||||
sed -i "s|^root:[^:]*:|root:${ARCHY_HASH}:|" /mnt/target/etc/shadow
|
||||
# Verify the password was set (not locked/empty)
|
||||
if grep -q "^archipelago:[!*]" /mnt/target/etc/shadow 2>/dev/null; then
|
||||
echo " WARNING: Password still locked, trying chpasswd fallback..."
|
||||
chroot /mnt/target bash -c 'echo "archipelago:archipelago" | chpasswd' 2>/dev/null || true
|
||||
fi
|
||||
echo " Passwords set for archipelago and root users"
|
||||
|
||||
chroot /mnt/target grub-install --target=x86_64-efi --efi-directory=/boot/efi --bootloader-id=archipelago --removable 2>/dev/null || \
|
||||
chroot /mnt/target grub-install --target=x86_64-efi --efi-directory=/boot/efi --bootloader-id=archipelago 2>/dev/null || \
|
||||
echo " Warning: GRUB install had issues, trying alternative..."
|
||||
@@ -1176,6 +1228,13 @@ read -p "Press Enter to reboot..."
|
||||
reboot
|
||||
INSTALLER_SCRIPT
|
||||
|
||||
# For unbundled builds, patch the completion message to reflect no pre-loaded apps
|
||||
if [ "$UNBUNDLED" = "1" ]; then
|
||||
sed -i 's/Pre-loaded apps (ready to start via Web UI):/Install apps from the Marketplace (internet required):/' "$ARCH_DIR/auto-install.sh"
|
||||
sed -i 's/• Bitcoin Knots • LND • Home Assistant/ Open the Web UI → Marketplace → Install any app/' "$ARCH_DIR/auto-install.sh"
|
||||
sed -i 's/• BTCPay Server • Mempool • Nostr Relays/ All apps download automatically via Podman /' "$ARCH_DIR/auto-install.sh"
|
||||
fi
|
||||
|
||||
chmod +x "$ARCH_DIR/auto-install.sh"
|
||||
|
||||
# =============================================================================
|
||||
@@ -1401,7 +1460,11 @@ fi
|
||||
echo ""
|
||||
echo "📦 Step 6: Creating bootable ISO..."
|
||||
|
||||
OUTPUT_ISO="$OUTPUT_DIR/archipelago-installer-x86_64.iso"
|
||||
if [ "$UNBUNDLED" = "1" ]; then
|
||||
OUTPUT_ISO="$OUTPUT_DIR/archipelago-installer-unbundled-x86_64.iso"
|
||||
else
|
||||
OUTPUT_ISO="$OUTPUT_DIR/archipelago-installer-x86_64.iso"
|
||||
fi
|
||||
|
||||
# Extract MBR from original Debian Live ISO (most reliable for hybrid boot)
|
||||
# This preserves the exact MBR that makes the ISO work as a USB drive in Balena Etcher
|
||||
@@ -1487,25 +1550,45 @@ else
|
||||
fi
|
||||
|
||||
echo ""
|
||||
echo "╔════════════════════════════════════════════════════════════════╗"
|
||||
echo "║ ✅ AUTO-INSTALLER ISO CREATED! ║"
|
||||
echo "╚════════════════════════════════════════════════════════════════╝"
|
||||
echo ""
|
||||
echo "📀 Output: $OUTPUT_ISO"
|
||||
echo " Size: $(du -h "$OUTPUT_ISO" | cut -f1)"
|
||||
echo ""
|
||||
echo "🔥 This is a StartOS-like automatic installer!"
|
||||
echo ""
|
||||
echo "Features:"
|
||||
echo " • Pre-built system (no internet needed during install)"
|
||||
echo " • Auto-detects internal disk"
|
||||
echo " • One-button installation"
|
||||
echo " • Boots directly to Archipelago after install"
|
||||
echo " • Pre-bundled container apps:"
|
||||
echo " - Bitcoin Knots v29"
|
||||
echo " - LND v0.18.4"
|
||||
echo " - Home Assistant"
|
||||
echo ""
|
||||
if [ "$UNBUNDLED" = "1" ]; then
|
||||
echo "╔════════════════════════════════════════════════════════════════╗"
|
||||
echo "║ ✅ UNBUNDLED AUTO-INSTALLER ISO CREATED! ║"
|
||||
echo "╚════════════════════════════════════════════════════════════════╝"
|
||||
echo ""
|
||||
echo "📀 Output: $OUTPUT_ISO"
|
||||
echo " Size: $(du -h "$OUTPUT_ISO" | cut -f1)"
|
||||
echo ""
|
||||
echo "🔥 Lightweight installer — apps downloaded on-demand!"
|
||||
echo ""
|
||||
echo "Features:"
|
||||
echo " • Pre-built system (no internet needed during install)"
|
||||
echo " • Auto-detects internal disk"
|
||||
echo " • One-button installation"
|
||||
echo " • Boots directly to Archipelago after install"
|
||||
echo " • NO pre-bundled apps (smaller ISO)"
|
||||
echo " • Install any app from the Marketplace (internet required)"
|
||||
echo ""
|
||||
else
|
||||
echo "╔════════════════════════════════════════════════════════════════╗"
|
||||
echo "║ ✅ AUTO-INSTALLER ISO CREATED! ║"
|
||||
echo "╚════════════════════════════════════════════════════════════════╝"
|
||||
echo ""
|
||||
echo "📀 Output: $OUTPUT_ISO"
|
||||
echo " Size: $(du -h "$OUTPUT_ISO" | cut -f1)"
|
||||
echo ""
|
||||
echo "🔥 This is a StartOS-like automatic installer!"
|
||||
echo ""
|
||||
echo "Features:"
|
||||
echo " • Pre-built system (no internet needed during install)"
|
||||
echo " • Auto-detects internal disk"
|
||||
echo " • One-button installation"
|
||||
echo " • Boots directly to Archipelago after install"
|
||||
echo " • Pre-bundled container apps:"
|
||||
echo " - Bitcoin Knots v29"
|
||||
echo " - LND v0.18.4"
|
||||
echo " - Home Assistant"
|
||||
echo ""
|
||||
fi
|
||||
echo "To create USB:"
|
||||
echo " 1. Flash with: sudo dd if=$OUTPUT_ISO of=/dev/rdiskX bs=4m"
|
||||
echo " Or use Balena Etcher"
|
||||
|
||||
Reference in New Issue
Block a user