#!/usr/bin/env bash
set -euo pipefail
LOG=/tmp/sovran-install.log
exec > >(tee -a "$LOG") 2>&1
export PATH=/run/current-system/sw/bin:$PATH
# Changed to 2TB cutoff
BYTES_2TB=$((2 * 1024 * 1024 * 1024 * 1024))
LOGO="/etc/sovran/logo.png"
human_size() {
numfmt --to=iec --suffix=B "$1"
}
# ── 1. WELCOME & ROLE SELECTION ──────────────────────────────────────────
ROLE=$(zenity --list --radiolist \
--window-icon="$LOGO" \
--width=1000 --height=400 \
--title="Welcome to Sovran SystemsOS" \
--text="Sovran Systems\nBe Digitally Sovereign\n\nPlease select your preferred installation type:" \
--print-column=3 \
--column="Select" --column="Logo" --column="Role" --column="Description" \
TRUE "🖥️" "Server+Desktop" "Gives you the full Sovereign Experience. A beautiful, easy-to-use, powerful daily driver desktop computer plus your very own cloud, website, secure messaging, video calling, password manager, and full Bitcoin node with Bitcoin Lightning and non-KYC buying and selling." \
FALSE "💻" "Desktop Only" "The same beautiful, easy-to-use desktop experience, but just the desktop without the background server applications." \
FALSE "₿" "Node (Bitcoin-only)" "Full Bitcoin node with Bitcoin Lightning and non-KYC buying and selling." || true)
if [ -z "$ROLE" ]; then
zenity --error --window-icon="$LOGO" --text="Installation cancelled."
exit 1
fi
# ── 2. FETCH DISKS ───────────────────────────────────────────────────────
# Filter out USB drives and loop/cdrom devices so it doesn't try to install to the installation media
mapfile -t DISKS < <(lsblk -b -dno NAME,SIZE,TYPE,RO,TRAN -e 7,11 | awk '$3=="disk" && $4=="0" && $5!="usb" {print $1":"$2}')
if [ "${#DISKS[@]}" -eq 0 ]; then
zenity --error --window-icon="$LOGO" --text="No valid internal drives found. (USB drives are ignored)"
exit 1
fi
IFS=$'\n' DISKS_SORTED=($(printf "%s\n" "${DISKS[@]}" | sort -t: -k2,2n))
unset IFS
BOOT_DISK="${DISKS_SORTED[0]%%:*}"
BOOT_SIZE="${DISKS_SORTED[0]##*:}"
DATA_DISK=""
DATA_SIZE=""
if [ "${#DISKS_SORTED[@]}" -ge 2 ]; then
DATA_DISK="${DISKS_SORTED[-1]%%:*}"
DATA_SIZE="${DISKS_SORTED[-1]##*:}"
fi
# Updated to check against 2TB
if [ -n "$DATA_DISK" ] && [ "$DATA_SIZE" -lt "$BYTES_2TB" ]; then
zenity --warning --window-icon="$LOGO" --text="Second disk detected (${DATA_DISK}), but it is smaller than 2TB.\n\nIt will NOT be used."
DATA_DISK=""
DATA_SIZE=""
fi
SUMMARY="Boot disk: /dev/${BOOT_DISK} ($(human_size "$BOOT_SIZE"))"
if [ -n "$DATA_DISK" ]; then
SUMMARY="${SUMMARY}\nData disk: /dev/${DATA_DISK} ($(human_size "$DATA_SIZE"))"
else
SUMMARY="${SUMMARY}\nData disk: none"
fi
CONFIRM=$(zenity --entry --window-icon="$LOGO" --text="WARNING: This will ERASE ALL DATA on:\n\n${SUMMARY}\n\nType ERASE to continue.")
if [ "$CONFIRM" != "ERASE" ]; then
zenity --error --window-icon="$LOGO" --text="Install cancelled."
exit 1
fi
BOOT_PATH="/dev/${BOOT_DISK}"
DATA_PATH=""
if [ -n "$DATA_DISK" ]; then
DATA_PATH="/dev/${DATA_DISK}"
fi
# Run Disko to partition and format drives
echo "Running Disko to partition and format drives..."
disko --mode disko /etc/sovran/flake/iso/disko.nix --argstr device "$BOOT_PATH" --argstr dataDevice "$DATA_PATH"
nixos-generate-config --root /mnt
cp /mnt/etc/nixos/hardware-configuration.nix /tmp/hardware-configuration.nix
rm -rf /mnt/etc/nixos/*
cp -a /etc/sovran/flake/* /mnt/etc/nixos/
cp /tmp/hardware-configuration.nix /mnt/etc/nixos/hardware-configuration.nix
# ── 3. APPLY ROLE STATE & TEMPLATE ───────────────────────────────────────
IS_SERVER="false"
IS_DESKTOP="false"
IS_NODE="false"
case "$ROLE" in
"Server+Desktop") IS_SERVER="true" ;;
"Desktop Only") IS_DESKTOP="true" ;;
"Node (Bitcoin-only)") IS_NODE="true" ;;
esac
cat > /mnt/etc/nixos/role-state.nix <Installation Successful!
Before you reboot, please write down your main login details:
Username: free
Password: free
🚨 CRITICAL: Do not lose this password! If you forget this, you will be permanently locked out of your computer.
📁 Other Passwords: Once the system reboots, it will finish building your forts and generate all the passwords for your apps (Nextcloud, Bitcoin, Matrix, etc.). It will save them in a secure PDF in your Documents folder.
Click OK to reboot into your new system!"
reboot