- Updated Cargo.toml to remove unnecessary package backtrace optimizations. - Changed default bind host and port in config.rs for broader accessibility. - Renamed state_manager to _state_manager in server.rs for clarity. - Updated user field to _user in PodmanClient and DockerRuntime for consistency. - Modified build-debian-iso.sh to enhance welcome message and backend startup instructions. - Improved archipelago-menu.sh to display backend status and updated Web UI URL. - Enhanced install-to-disk.sh for better package management and user creation during installation.
341 lines
12 KiB
Bash
Executable File
341 lines
12 KiB
Bash
Executable File
#!/bin/bash
|
|
#
|
|
# Archipelago Main Menu
|
|
# Interactive setup wizard for Archipelago Bitcoin Node OS
|
|
#
|
|
|
|
SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
|
|
|
|
# Install required tools on first run (for live mode)
|
|
install_required_tools() {
|
|
if [ -f /tmp/.archipelago-tools-installed ]; then
|
|
return 0
|
|
fi
|
|
|
|
# Check if we need to install tools
|
|
local NEED_TOOLS=0
|
|
for tool in parted debootstrap mkfs.ext4 mkfs.vfat; do
|
|
if ! command -v $tool >/dev/null 2>&1; then
|
|
NEED_TOOLS=1
|
|
break
|
|
fi
|
|
done
|
|
|
|
if [ $NEED_TOOLS -eq 1 ]; then
|
|
echo ""
|
|
echo " 📦 Installing required tools (first run)..."
|
|
echo ""
|
|
sudo apt-get update -qq 2>/dev/null
|
|
sudo apt-get install -y parted debootstrap dosfstools e2fsprogs 2>/dev/null
|
|
echo " ✅ Tools installed"
|
|
echo ""
|
|
sleep 1
|
|
fi
|
|
|
|
touch /tmp/.archipelago-tools-installed
|
|
}
|
|
|
|
# Run tool installation at startup
|
|
install_required_tools
|
|
|
|
show_banner() {
|
|
clear
|
|
echo ""
|
|
echo " ╔═══════════════════════════════════════════════════════════╗"
|
|
echo " ║ ║"
|
|
echo " ║ 🏝️ ARCHIPELAGO BITCOIN NODE OS ║"
|
|
echo " ║ ║"
|
|
echo " ║ Your sovereign Bitcoin infrastructure ║"
|
|
echo " ║ ║"
|
|
echo " ╚═══════════════════════════════════════════════════════════╝"
|
|
echo ""
|
|
}
|
|
|
|
show_status() {
|
|
echo " System Status:"
|
|
echo " ─────────────────────────────────────────────────────────────"
|
|
|
|
# Check if we're in live mode
|
|
if [ -d /run/live ]; then
|
|
echo " Mode: 🔴 Live (changes won't persist)"
|
|
else
|
|
echo " Mode: 🟢 Installed"
|
|
fi
|
|
|
|
# Check Podman
|
|
if command -v podman >/dev/null 2>&1; then
|
|
echo " Podman: 🟢 Installed"
|
|
else
|
|
echo " Podman: 🔴 Not installed"
|
|
fi
|
|
|
|
# Check Bitcoin Core
|
|
if podman ps 2>/dev/null | grep -q bitcoind; then
|
|
BLOCKS=$(podman exec bitcoind bitcoin-cli getblockcount 2>/dev/null || echo "syncing")
|
|
echo " Bitcoin: 🟢 Running (blocks: $BLOCKS)"
|
|
elif podman ps -a 2>/dev/null | grep -q bitcoind; then
|
|
echo " Bitcoin: 🟡 Stopped"
|
|
else
|
|
echo " Bitcoin: ⚪ Not configured"
|
|
fi
|
|
|
|
# Check LND
|
|
if podman ps 2>/dev/null | grep -q lnd; then
|
|
echo " Lightning: 🟢 Running"
|
|
elif podman ps -a 2>/dev/null | grep -q lnd; then
|
|
echo " Lightning: 🟡 Stopped"
|
|
else
|
|
echo " Lightning: ⚪ Not configured"
|
|
fi
|
|
|
|
echo ""
|
|
}
|
|
|
|
main_menu() {
|
|
while true; do
|
|
show_banner
|
|
show_status
|
|
|
|
# Show Web UI URL prominently
|
|
IP=$(hostname -I 2>/dev/null | awk '{print $1}')
|
|
[ -z "$IP" ] && IP=$(ip -4 addr show | grep -oP '(?<=inet\s)\d+(\.\d+){3}' | grep -v '127.0.0.1' | head -1)
|
|
|
|
echo " ┌─────────────────────────────────────────────────────────────┐"
|
|
if [ -n "$IP" ]; then
|
|
# Check if backend is running
|
|
if pgrep -f "archipelago" >/dev/null 2>&1; then
|
|
echo " │ 🌐 Web UI: http://$IP:5678 (running) │"
|
|
else
|
|
echo " │ 🌐 Web UI: http://$IP:5678 (not started) │"
|
|
fi
|
|
echo " │ 📡 SSH: ssh user@$IP (password: archipelago) │"
|
|
else
|
|
echo " │ 🌐 Web UI: (no network) │"
|
|
fi
|
|
echo " └─────────────────────────────────────────────────────────────┘"
|
|
echo ""
|
|
|
|
echo " Main Menu:"
|
|
echo " ─────────────────────────────────────────────────────────────"
|
|
echo ""
|
|
echo " w) Open Web UI - Launch graphical interface"
|
|
echo ""
|
|
echo " 1) Install to Disk - Permanently install Archipelago"
|
|
echo " 2) Setup Bitcoin Core - Configure Bitcoin full node"
|
|
echo " 3) Setup Lightning (LND) - Configure Lightning Network"
|
|
echo " 4) Setup BTCPay Server - Bitcoin payment processor"
|
|
echo " 5) View Logs - Monitor running services"
|
|
echo " 6) Network Settings - Configure networking"
|
|
echo " 7) System Info - View system information"
|
|
echo ""
|
|
echo " q) Quit"
|
|
echo ""
|
|
read -p " Select option: " choice
|
|
|
|
case $choice in
|
|
w|W)
|
|
echo ""
|
|
# Start the real backend on port 5678
|
|
if command -v archipelago >/dev/null 2>&1; then
|
|
if pgrep -f "archipelago" >/dev/null 2>&1; then
|
|
echo " ✅ Archipelago backend already running on port 5678"
|
|
else
|
|
echo " 🚀 Starting Archipelago backend on port 5678..."
|
|
nohup archipelago >/tmp/archipelago.log 2>&1 &
|
|
sleep 2
|
|
if pgrep -f "archipelago" >/dev/null 2>&1; then
|
|
echo " ✅ Backend started!"
|
|
else
|
|
echo " ⚠️ Failed to start backend. Check /tmp/archipelago.log"
|
|
fi
|
|
fi
|
|
IP=$(hostname -I 2>/dev/null | awk '{print $1}')
|
|
echo ""
|
|
echo " ┌─────────────────────────────────────────────────────────────┐"
|
|
echo " │ 🌐 Open in browser: http://$IP:5678 │"
|
|
echo " └─────────────────────────────────────────────────────────────┘"
|
|
else
|
|
echo " ⚠️ Archipelago binary not found at /usr/local/bin/archipelago"
|
|
echo ""
|
|
echo " Try running:"
|
|
echo " sudo cp /run/live/medium/archipelago/bin/archipelago /usr/local/bin/"
|
|
fi
|
|
echo ""
|
|
read -p " Press Enter to continue..."
|
|
;;
|
|
1)
|
|
if [ -f "$SCRIPT_DIR/install-to-disk.sh" ]; then
|
|
sudo bash "$SCRIPT_DIR/install-to-disk.sh"
|
|
else
|
|
echo "Installer not found. Running from: $SCRIPT_DIR"
|
|
fi
|
|
read -p "Press Enter to continue..."
|
|
;;
|
|
2)
|
|
if [ -f "$SCRIPT_DIR/setup-bitcoin.sh" ]; then
|
|
bash "$SCRIPT_DIR/setup-bitcoin.sh"
|
|
else
|
|
echo "Bitcoin setup script not found."
|
|
fi
|
|
read -p "Press Enter to continue..."
|
|
;;
|
|
3)
|
|
if [ -f "$SCRIPT_DIR/setup-lnd.sh" ]; then
|
|
bash "$SCRIPT_DIR/setup-lnd.sh"
|
|
else
|
|
echo "LND setup script not found."
|
|
fi
|
|
read -p "Press Enter to continue..."
|
|
;;
|
|
4)
|
|
setup_btcpay
|
|
read -p "Press Enter to continue..."
|
|
;;
|
|
5)
|
|
view_logs
|
|
;;
|
|
6)
|
|
network_settings
|
|
read -p "Press Enter to continue..."
|
|
;;
|
|
7)
|
|
system_info
|
|
read -p "Press Enter to continue..."
|
|
;;
|
|
q|Q)
|
|
echo ""
|
|
echo " Goodbye! 🏝️"
|
|
echo ""
|
|
exit 0
|
|
;;
|
|
*)
|
|
echo "Invalid option"
|
|
sleep 1
|
|
;;
|
|
esac
|
|
done
|
|
}
|
|
|
|
setup_btcpay() {
|
|
show_banner
|
|
echo " BTCPay Server Setup"
|
|
echo " ─────────────────────────────────────────────────────────────"
|
|
echo ""
|
|
echo " BTCPay Server is a self-hosted Bitcoin payment processor."
|
|
echo ""
|
|
|
|
if ! podman ps | grep -q bitcoind; then
|
|
echo " ⚠️ Bitcoin Core must be running first."
|
|
return
|
|
fi
|
|
|
|
read -p " Setup BTCPay Server? [y/N]: " SETUP
|
|
if [[ ! "$SETUP" =~ ^[Yy]$ ]]; then
|
|
return
|
|
fi
|
|
|
|
echo ""
|
|
echo " 🐳 Pulling BTCPay Server image..."
|
|
podman pull docker.io/btcpayserver/btcpayserver:latest
|
|
|
|
# Create data directory
|
|
mkdir -p ~/.btcpay
|
|
|
|
echo ""
|
|
echo " BTCPay Server setup is more complex and typically uses docker-compose."
|
|
echo " For a full setup, visit: https://docs.btcpayserver.org"
|
|
echo ""
|
|
}
|
|
|
|
view_logs() {
|
|
show_banner
|
|
echo " View Logs"
|
|
echo " ─────────────────────────────────────────────────────────────"
|
|
echo ""
|
|
echo " 1) Bitcoin Core logs"
|
|
echo " 2) LND logs"
|
|
echo " 3) System logs"
|
|
echo " b) Back"
|
|
echo ""
|
|
read -p " Select: " choice
|
|
|
|
case $choice in
|
|
1)
|
|
if podman ps -a | grep -q bitcoind; then
|
|
podman logs -f --tail 50 bitcoind
|
|
else
|
|
echo "Bitcoin Core not running"
|
|
read -p "Press Enter..."
|
|
fi
|
|
;;
|
|
2)
|
|
if podman ps -a | grep -q lnd; then
|
|
podman logs -f --tail 50 lnd
|
|
else
|
|
echo "LND not running"
|
|
read -p "Press Enter..."
|
|
fi
|
|
;;
|
|
3)
|
|
journalctl -f
|
|
;;
|
|
esac
|
|
}
|
|
|
|
network_settings() {
|
|
show_banner
|
|
echo " Network Settings"
|
|
echo " ─────────────────────────────────────────────────────────────"
|
|
echo ""
|
|
|
|
# Show current IP
|
|
IP=$(hostname -I | awk '{print $1}')
|
|
echo " Current IP: $IP"
|
|
echo ""
|
|
|
|
# Show network interfaces
|
|
echo " Network Interfaces:"
|
|
ip -br addr | grep -v "^lo" | while read line; do
|
|
echo " $line"
|
|
done
|
|
echo ""
|
|
|
|
echo " Ports in use:"
|
|
echo " 8332 - Bitcoin RPC"
|
|
echo " 8333 - Bitcoin P2P"
|
|
echo " 9735 - Lightning P2P"
|
|
echo " 10009 - Lightning gRPC"
|
|
echo " 8080 - Lightning REST"
|
|
echo ""
|
|
}
|
|
|
|
system_info() {
|
|
show_banner
|
|
echo " System Information"
|
|
echo " ─────────────────────────────────────────────────────────────"
|
|
echo ""
|
|
echo " Hostname: $(hostname)"
|
|
echo " Kernel: $(uname -r)"
|
|
echo " Uptime: $(uptime -p)"
|
|
echo ""
|
|
echo " CPU: $(grep "model name" /proc/cpuinfo | head -1 | cut -d: -f2 | xargs)"
|
|
echo " Memory: $(free -h | grep Mem | awk '{print $2}') total, $(free -h | grep Mem | awk '{print $3}') used"
|
|
echo ""
|
|
echo " Disk Usage:"
|
|
df -h / | tail -1 | awk '{print " Root: " $3 " / " $2 " (" $5 " used)"}'
|
|
if [ -d ~/.bitcoin ]; then
|
|
echo " Bitcoin: $(du -sh ~/.bitcoin 2>/dev/null | cut -f1)"
|
|
fi
|
|
echo ""
|
|
|
|
# Container status
|
|
echo " Containers:"
|
|
if command -v podman >/dev/null 2>&1; then
|
|
podman ps --format " {{.Names}}: {{.Status}}" 2>/dev/null || echo " No containers running"
|
|
fi
|
|
echo ""
|
|
}
|
|
|
|
# Run main menu
|
|
main_menu
|