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.
This commit is contained in:
Dorian
2026-02-14 16:44:20 +00:00
parent d988396111
commit 6035c93289
19 changed files with 824 additions and 406 deletions
+44 -4
View File
@@ -105,6 +105,18 @@
<span>{{ store.isAppLoading(app.id) ? 'Starting...' : 'Start' }}</span>
</button>
<!-- Starting (created): show progress, no Launch yet -->
<div
v-else-if="store.getAppState(app.id) === 'created'"
class="flex-1 flex items-center justify-center gap-2 px-4 py-2 text-white/70 text-sm"
>
<svg class="w-4 h-4 animate-spin" fill="none" viewBox="0 0 24 24">
<circle class="opacity-25" cx="12" cy="12" r="10" stroke="currentColor" stroke-width="4"></circle>
<path class="opacity-75" fill="currentColor" d="M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z"></path>
</svg>
<span>Starting</span>
</div>
<!-- Running: Stop and Launch buttons -->
<template v-else-if="store.getAppState(app.id) === 'running'">
<button
@@ -183,7 +195,7 @@
</template>
<script setup lang="ts">
import { onMounted, computed } from 'vue'
import { onMounted, onUnmounted, computed } from 'vue'
import { useContainerStore, type BundledApp } from '@/stores/container'
import ContainerStatus from '@/components/ContainerStatus.vue'
@@ -195,15 +207,30 @@ const bundledApps = computed(() => store.enrichedBundledApps)
// Get current host for launch URLs
const currentHost = computed(() => window.location.hostname)
let startingPollInterval: ReturnType<typeof setInterval> | null = null
onMounted(async () => {
await store.fetchContainers()
await store.fetchHealthStatus()
// Refresh every 10 seconds
setInterval(async () => {
await store.fetchContainers()
await store.fetchHealthStatus()
}, 10000)
// When any bundled app is in 'created' (starting), poll every 2s so state updates to running
startingPollInterval = setInterval(async () => {
const anyStarting = bundledApps.value.some((app) => store.getAppState(app.id) === 'created')
if (anyStarting) {
await store.fetchContainers()
await store.fetchHealthStatus()
}
}, 2000)
})
onUnmounted(() => {
if (startingPollInterval) clearInterval(startingPollInterval)
})
// Containers that aren't bundled apps
@@ -237,6 +264,8 @@ function getStatusBadgeClass(appId: string): string {
case 'stopped':
case 'exited':
return 'bg-gray-500/20 text-gray-400'
case 'created':
return 'bg-yellow-500/20 text-yellow-400'
case 'not-installed':
default:
return 'bg-blue-500/20 text-blue-400'
@@ -270,17 +299,28 @@ function getStatusText(appId: string): string {
return 'Stopped'
case 'not-installed':
return 'Ready to Start'
case 'created':
return 'Starting'
default:
return state
}
}
const backendPort = 5678
function getLaunchUrl(app: BundledApp): string {
// Prefer lan_address from backend (for apps with custom UIs)
if (app.lan_address) {
return app.lan_address
// Replace localhost so Launch works when browsing from another machine (e.g. 192.168.1.228)
let url = app.lan_address.replace(/localhost/i, currentHost.value)
// LND UI (and other app UIs) need backend URL for live data (logs, getinfo proxy)
if (app.id === 'lnd') {
const backend = `http://${currentHost.value}:${backendPort}`
url += (url.includes('?') ? '&' : '?') + 'backend=' + encodeURIComponent(backend)
}
return url
}
// Fallback to first configured port
const port = app.ports[0]?.host
if (!port) return '#'