diff --git a/NEW-SCRIPT-STRUCTURE.md b/NEW-SCRIPT-STRUCTURE.md new file mode 100644 index 0000000..c126012 --- /dev/null +++ b/NEW-SCRIPT-STRUCTURE.md @@ -0,0 +1,244 @@ +# Ubuntu Post-Install Script - New Structure + +## Current Problems + +1. ❌ Services prompt individually even when not selected in whiptail +2. ❌ Too many things installed BEFORE whiptail menu (Samba, VPNs, fail2ban) +3. ❌ No clear explanation to user about script phases +4. ❌ No uninstall option +5. ❌ Confusing for re-running on existing servers + +## New Structure + +### PHASE 1: Essential System Setup (Before Whiptail) +**Purpose:** Install only what's REQUIRED for everything else to work + +**What stays BEFORE whiptail:** +- ✅ System updates (apt update/upgrade) +- ✅ Essential packages (openssh-server, rsync, curl, wget, git, vim, htop, ncdu) +- ✅ SSH key generation (optional) +- ✅ SSH key import from GitHub/Launchpad (optional) +- ✅ Docker & Docker Compose installation +- ✅ Hard drive mounting/formatting + +**What moves TO whiptail menu:** +- 🔄 Samba file sharing +- 🔄 fail2ban for SSH +- 🔄 VPN services (Tailscale, WireGuard, NetBird) +- 🔄 Remote desktop (RustDesk, TeamViewer) +- 🔄 MeshCentral agent + +### PHASE 2: Service Selection (Whiptail Menu) +**Purpose:** Let user choose ALL optional services + +**New whiptail menu structure:** + +``` +┌─────────────────── Select Services ────────────────────┐ +│ ☐ INSTALL ☑ UNINSTALL │ +│ │ +│ === NETWORK & SECURITY === │ +│ [ ] SAMBA File sharing (SMB/CIFS) │ +│ [ ] FAIL2BAN_SSH Protect SSH from brute-force │ +│ [ ] TAILSCALE Easy VPN mesh network │ +│ [ ] NETBIRD Self-hosted VPN │ +│ [ ] WIREGUARD Manual VPN configuration │ +│ │ +│ === REMOTE ACCESS === │ +│ [ ] RUSTDESK Remote desktop (OSS) │ +│ [ ] TEAMVIEWER Remote desktop (commercial) │ +│ [ ] MESHCENTRAL Remote management agent │ +│ │ +│ === DOCKER SERVICES === │ +│ [ ] ACTUALBUDGET Personal finance │ +│ [ ] KEYCLOAK Identity management │ +│ [ ] CADDY Reverse proxy │ +│ [ ] FAIL2BAN_CADDY Protect Caddy services │ +│ [ ] JELLYFIN Media server │ +│ [ ] IMMICH Photo backup │ +│ [ ] AUDIOBOOKSHELF Audiobook server │ +│ [ ] MEALIE Recipe manager │ +│ [ ] UPTIMEKUMA Service monitoring │ +│ [ ] PORTAINER Docker management UI │ +│ [ ] WATCHTOWER Auto-update containers │ +│ ... (all other services) │ +│ │ +│ === MESHCENTRAL SERVER === │ +│ [ ] MESHCENTRAL_SRV Self-hosted remote mgmt server │ +│ │ +│ │ +└─────────────────────────────────────────────────────────┘ +``` + +### PHASE 3: Installation +**Purpose:** Install/uninstall selected services in correct order + +**Dependency-aware installation order:** +1. Install Caddy first (if selected) +2. Install services that depend on Caddy (Keycloak, etc.) +3. Install fail2ban for Caddy (if selected + Caddy installed) +4. Install independent services in parallel where possible + +### Re-Running The Script + +**Behavior on already-configured server:** + +**Phase 1 (Essential):** +- Detects existing installations +- Shows: "Docker is already installed: (version)" +- Prompts: "Reinstall Docker? (y/n): **n**" (defaults to NO) +- Skips if "n" + +**Phase 2 (Services):** +- Whiptail menu shows ALL services +- Already-installed services could be marked with (installed) +- User can: + - Select new services to add + - Select installed services + click "Uninstall Selected" + - Skip menu to make no changes + +## Implementation Changes + +### 1. Add Intro Text + +```bash +# At beginning of script after argument parsing +if [ "$UNATTENDED" != true ]; then + cat << 'EOF' +╔════════════════════════════════════════════════════════════════╗ +║ Ubuntu Post-Install Setup Script ║ +╚════════════════════════════════════════════════════════════════╝ + +This script installs and configures your Ubuntu server in TWO phases: + +PHASE 1: ESSENTIAL SETUP (Required) + • System updates & core packages + • SSH configuration + • Docker & Docker Compose + • Hard drive mounting + +PHASE 2: SERVICE SELECTION (Optional) + • Interactive menu to select services + • Install OR uninstall services + • Safe to re-run on existing servers + +Press ENTER to begin Phase 1... +EOF + read -p "" +fi +``` + +### 2. Reorganize Script Sections + +**NEW ORDER:** +1. Intro text +2. Essential system setup (Phase 1) +3. Whiptail menu with ALL services (Phase 2) +4. Service installations based on selections + +**REMOVED FROM PRE-WHIPTAIL:** +- Lines 1709-1800: Samba installation → Move to whiptail +- Lines 1596-1625: fail2ban (SSH) → Move to whiptail +- Lines 1841-1888: NetBird → Move to whiptail +- Lines 1889-1945: WireGuard → Move to whiptail +- Lines 1947-1998: Tailscale → Move to whiptail +- Lines 2000-2044: RustDesk → Move to whiptail +- Lines 2046-2095: TeamViewer → Move to whiptail +- Lines 2097-2153: MeshCentral Agent → Move to whiptail + +### 3. Update Whiptail Menu + +**Add these to the checklist:** +```bash +"SAMBA" "File sharing (Windows, Mac, Linux)" OFF \ +"FAIL2BAN_SSH" "Protect SSH from brute-force attacks" OFF \ +"TAILSCALE" "Easy VPN mesh network" OFF \ +"NETBIRD" "Self-hosted VPN alternative" OFF \ +"WIREGUARD" "Manual VPN configuration" OFF \ +"RUSTDESK" "Open-source remote desktop" OFF \ +"TEAMVIEWER" "Commercial remote desktop" OFF \ +"MESHCENTRAL_AGENT" "Remote management agent" OFF \ +``` + +### 4. Add Uninstall Functionality + +**New buttons in whiptail:** +```bash +--extra-button --extra-label "Uninstall" \ +--ok-button "Install" --cancel-button "Skip" +``` + +**Check return code:** +- 0 = Install selected +- 1 = Skip/Cancel +- 3 = Uninstall selected + +**Uninstall logic:** +```bash +if [ $WHIPTAIL_RETURN -eq 3 ]; then + # Uninstall mode + for service in $SELECTED_SERVICES; do + uninstall_service "$service" + done +fi +``` + +### 5. Fix Duplicate Prompts + +**Current issue:** +```bash +if [ -z "$INSTALL_AUDIOBOOKSHELF" ]; then + prompt_yn "Install Audiobookshelf? (y/n):" "n" INSTALL_AUDIOBOOKSHELF +fi +``` + +**Problem:** This runs even if user didn't select it in whiptail! + +**Fix:** Only show prompt if whiptail wasn't used OR variable not set by whiptail + +```bash +# After whiptail, set a flag +WHIPTAIL_USED=true + +# In individual service sections +if [ "$WHIPTAIL_USED" != true ] && [ -z "$INSTALL_AUDIOBOOKSHELF" ]; then + prompt_yn "Install Audiobookshelf? (y/n):" "n" INSTALL_AUDIOBOOKSHELF +fi +``` + +**Or simpler:** Just remove all individual prompts! If whiptail is available, use it. If not, show ALL services as prompts. + +## Benefits + +1. ✅ Clear two-phase structure +2. ✅ All optional services in ONE menu +3. ✅ No duplicate prompts +4. ✅ Uninstall functionality +5. ✅ Safe to re-run +6. ✅ User understands what's happening when +7. ✅ Faster for users who know what they want + +## Migration Path + +**For existing users:** +1. Script still works the same way +2. New intro text explains structure +3. Existing installations detected +4. Can use uninstall to remove unwanted services + +## Testing Scenarios + +1. **Fresh install:** All prompts flow correctly +2. **Re-run:** Detects existing, allows adding new services +3. **Uninstall:** Removes selected services cleanly +4. **Whiptail unavailable:** Falls back to individual prompts +5. **Cancel menu:** Skips all service installations + +--- + +**Implementation Priority:** +1. ✅ Fix duplicate prompts (CRITICAL - doing now) +2. ⏳ Add intro text (HIGH) +3. ⏳ Move services to whiptail (HIGH) +4. ⏳ Add uninstall functionality (MEDIUM) +5. ⏳ Improve re-run detection (LOW - already works) diff --git a/SCRIPT-FLOW-INTRO.txt b/SCRIPT-FLOW-INTRO.txt new file mode 100644 index 0000000..e4aef69 --- /dev/null +++ b/SCRIPT-FLOW-INTRO.txt @@ -0,0 +1,59 @@ +#!/bin/bash + +# SCRIPT FLOW EXPLANATION FOR USERS +cat << 'EOF' +╔════════════════════════════════════════════════════════════════╗ +║ Ubuntu Post-Install Setup Script ║ +╚════════════════════════════════════════════════════════════════╝ + +This script is divided into TWO main phases: + +┌────────────────────────────────────────────────────────────────┐ +│ PHASE 1: ESSENTIAL SYSTEM SETUP (Required) │ +├────────────────────────────────────────────────────────────────┤ +│ These are installed/configured FIRST: │ +│ ✓ System updates and essential packages │ +│ ✓ OpenSSH server (remote access) │ +│ ✓ rsync, curl, wget (core utilities) │ +│ ✓ SSH key configuration │ +│ ✓ Docker & Docker Compose (container platform) │ +│ ✓ Hard drive mounting (storage setup) │ +│ │ +│ These are REQUIRED for everything else to work. │ +└────────────────────────────────────────────────────────────────┘ + +┌────────────────────────────────────────────────────────────────┐ +│ PHASE 2: SERVICE SELECTION MENU (Optional) │ +├────────────────────────────────────────────────────────────────┤ +│ After Phase 1, you'll see a CHECKBOX MENU where you can: │ +│ • Select which services to INSTALL │ +│ • Select which services to UNINSTALL │ +│ • Skip services you don't want │ +│ │ +│ Services include: │ +│ • Self-hosted apps (ActualBudget, Keycloak, Jellyfin, etc.) │ +│ • Network services (Samba, VPNs, fail2ban) │ +│ • Monitoring tools (Uptime Kuma, Portainer, Watchtower) │ +│ • And many more... │ +└────────────────────────────────────────────────────────────────┘ + +┌────────────────────────────────────────────────────────────────┐ +│ RE-RUNNING THIS SCRIPT │ +├────────────────────────────────────────────────────────────────┤ +│ You can safely re-run this script on an already configured │ +│ server: │ +│ • Phase 1 will DETECT existing installations and skip them │ +│ • Phase 2 menu will show ALL services (installed and not) │ +│ • Select NEW services to add │ +│ • Or select UNINSTALL to remove services │ +│ │ +│ The script is IDEMPOTENT - safe to run multiple times! │ +└────────────────────────────────────────────────────────────────┘ + +Press ENTER to continue with Phase 1 (Essential Setup)... +EOF + +read -p "" + +# Now continue with the actual script... +EOF