#!/bin/bash # DevMatrix Setup Script for Proxmox - CUSTOMIZED for Roberth # Storage: pve-main2 (HDD) | Future NVMe: pve-main # TrueNAS: 192.168.5.195 | Dataset: NAS2 # VM IDs: 300-320 # Run this ON THE PROXMOX HOST as root set -e # ============================================ # CONFIGURATION (Your Specific Setup) # ============================================ NETWORK_BRIDGE="vmbr1" STORAGE_HDD="pve-main2" # Current HDD storage STORAGE_NVME="pve-main" # Future NVMe storage (when installed) TRUENAS_IP="192.168.5.195" TRUENAS_DATASET="NAS2" # VM IDs MAIN_VMID=300 # OpenClaw DevMatrix (Ubuntu) WIN_VMID=301 # Windows LTSC IoT Test VM ANDROID_VMID=302 # Android Emulator VM # Static IPs (safe range - verified from network scan) MAIN_IP="192.168.5.210" WIN_IP="192.168.5.211" ANDROID_IP="192.168.5.212" GATEWAY="192.168.5.1" # Resource Allocation (Optimized for HDD) MAIN_RAM=32768 # 32GB RAM MAIN_CORES=16 MAIN_OS_DISK=200 # 200GB OS disk (HDD now, NVMe later) MAIN_DATA_DISK=200 # 200GB data disk (stays on HDD) WIN_RAM=16384 # 16GB RAM WIN_CORES=8 WIN_DISK=100 # 100GB disk ANDROID_RAM=8192 # 8GB RAM ANDROID_CORES=4 ANDROID_DISK=50 # 50GB disk # ============================================ # COLORS # ============================================ RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' BLUE='\033[0;34m' CYAN='\033[0;36m' NC='\033[0m' log() { echo -e "${GREEN}[DevMatrix]${NC} $1"; } warn() { echo -e "${YELLOW}[Warning]${NC} $1"; } error() { echo -e "${RED}[Error]${NC} $1"; exit 1; } info() { echo -e "${CYAN}[Info]${NC} $1"; } # ============================================ # PRE-FLIGHT CHECKS # ============================================ log "🔍 Running pre-flight checks..." if [ "$EUID" -ne 0 ]; then error "Please run as root" fi # Check vmbr1 if ! ip link show "$NETWORK_BRIDGE" &> /dev/null; then error "Network bridge '$NETWORK_BRIDGE' not found!" fi log "✓ Network bridge '$NETWORK_BRIDGE' found" # Check storage if ! pvesm status | grep -q "^$STORAGE_HDD"; then error "Storage '$STORAGE_HDD' not found!" fi log "✓ HDD storage '$STORAGE_HDD' found" # Check available space on HDD HDD_AVAIL=$(pvesm status | grep "^$STORAGE_HDD" | awk '{print $4}' | sed 's/G//') info "HDD available: ${HDD_AVAIL}GB" NEEDED_HDD=$((MAIN_OS_DISK + MAIN_DATA_DISK + WIN_DISK + ANDROID_DISK + 100)) # +100GB buffer if [ "${HDD_AVAIL%.*}" -lt "$NEEDED_HDD" ]; then error "Not enough space on $STORAGE_HDD. Need ${NEEDED_HDD}GB, have ${HDD_AVAIL}GB" fi log "✓ Sufficient HDD space (${NEEDED_HDD}GB needed)" # Check VM IDs - warn if exist, allow skip log "🔍 Checking VM ID availability..." existing_vms="" for vmid in $MAIN_VMID $WIN_VMID $ANDROID_VMID; do if qm status "$vmid" &> /dev/null; then vmname=$(qm config "$vmid" | grep name | awk '{print $2}') warn "VM $vmid ($vmname) already exists!" existing_vms="$existing_vms $vmid" fi done if [ -n "$existing_vms" ]; then echo "" echo "Options:" echo " 1) Skip existing VMs and create only new ones" echo " 2) Destroy existing VMs and recreate" echo " 3) Exit and check manually" read -p "Choose (1/2/3): " choice case $choice in 1) log "Will skip existing VMs..." ;; 2) warn "Destroying VMs:$existing_vms" for vmid in $existing_vms; do qm stop "$vmid" &> /dev/null || true qm destroy "$vmid" --purge log "Destroyed VM $vmid" done ;; 3) exit 1 ;; *) error "Invalid choice" ;; esac fi log "✓ VM IDs checked" # Check RAM AVAILABLE_RAM=$(free -m | awk '/^Mem:/{print $7}') TOTAL_RAM=$((MAIN_RAM + WIN_RAM + ANDROID_RAM)) info "Available RAM: ${AVAILABLE_RAM}MB" info "Required RAM: ${TOTAL_RAM}MB" if [ "$AVAILABLE_RAM" -lt "$TOTAL_RAM" ]; then warn "Low RAM! Consider reducing VM memory" read -p "Continue anyway? (y/N): " confirm [ "$confirm" != "y" ] && exit 1 fi # Check TrueNAS connectivity if ping -c 1 "$TRUENAS_IP" &> /dev/null; then log "✓ TrueNAS ($TRUENAS_IP) reachable" else warn "TrueNAS ($TRUENAS_IP) not reachable - will configure later" fi echo "" log "✅ Pre-flight checks complete!" echo "" # ============================================ # DOWNLOAD ISO IMAGES # ============================================ log "⬇️ Checking for ISO images..." ISO_DIR="/var/lib/vz/template/iso" mkdir -p "$ISO_DIR" # Ubuntu 22.04 Server ISO UBUNTU_ISO="$ISO_DIR/ubuntu-22.04.5-live-server-amd64.iso" if [ -f "$UBUNTU_ISO" ]; then log "✓ Ubuntu ISO found" else log "⬇️ Downloading Ubuntu 22.04 Server ISO..." wget -O "$UBUNTU_ISO" \ "https://releases.ubuntu.com/22.04/ubuntu-22.04.5-live-server-amd64.iso" \ --progress=bar:force 2>&1 | tail -f -n +6 log "✓ Ubuntu ISO downloaded" fi # Check for Windows ISO WIN_ISO="$ISO_DIR/Win11_IoT_Enterprise_LTSC.iso" WIN_ISO_ALT="$ISO_DIR/Win11.iso" if [ -f "$WIN_ISO" ]; then log "✓ Windows LTSC IoT ISO found" WIN_ISO_FILE="Win11_IoT_Enterprise_LTSC.iso" elif [ -f "$WIN_ISO_ALT" ]; then log "✓ Windows 11 ISO found" WIN_ISO_FILE="Win11.iso" else warn "⚠️ Windows ISO not found" info "Please download Windows 11 ISO and place it in:" info " $ISO_DIR/Win11.iso" info "Download from: https://www.microsoft.com/software-download/windows11" read -p "Press Enter when Windows ISO is ready (or 'skip' to continue without): " response if [ "$response" == "skip" ]; then WIN_ISO_FILE="" fi fi echo "" # ============================================ # CREATE VM 300: OpenClaw DevMatrix (Ubuntu) # ============================================ log "🚀 Creating VM $MAIN_VMID: OpenClaw-DevMatrix" log " IP: $MAIN_IP | Storage: $STORAGE_HDD (migrates to $STORAGE_NVME later)" qm create $MAIN_VMID \ --name "OpenClaw-DevMatrix" \ --memory $MAIN_RAM \ --cores $MAIN_CORES \ --cpu host \ --net0 virtio,bridge=$NETWORK_BRIDGE,tag=1 \ --scsihw virtio-scsi-single \ --bios ovmf \ --machine q35 # EFI disk (small, fast) qm set $MAIN_VMID --efidisk0 ${STORAGE_HDD}:1,format=qcow2,efitype=4m,pre-enrolled-keys=1 # OS Disk - HDD optimized (will migrate to NVMe) # Using writeback cache for better HDD performance qm set $MAIN_VMID \ --scsi0 ${STORAGE_HDD}:${MAIN_OS_DISK},format=qcow2,cache=writeback,discard=on,iothread=1,ssd=1 # Data Disk - stays on HDD even after migration qm set $MAIN_VMID \ --scsi1 ${STORAGE_HDD}:${MAIN_DATA_DISK},format=qcow2,cache=none,discard=on,iothread=1 # Cloud-init drive qm set $MAIN_VMID --ide2 ${STORAGE_HDD}:cloudinit,media=cdrom # Attach Ubuntu ISO qm set $MAIN_VMID --ide0 local:iso/ubuntu-22.04.5-live-server-amd64.iso,media=cdrom # Boot order qm set $MAIN_VMID --boot order=scsi0;ide0 # Enable QEMU Guest Agent qm set $MAIN_VMID --agent enabled=1,fstrim_cloned_disks=1 # CPU optimization for compilation workloads qm set $MAIN_VMID --cpu cputype=host,flags=+aes # Configure cloud-init with static IP qm set $MAIN_VMID --ciuser devmatrix qm set $MAIN_VMID --cipassword $(openssl rand -base64 32) qm set $MAIN_VMID --ipconfig0 ip=${MAIN_IP}/24,gw=${GATEWAY} # Generate SSH key pair if [ ! -f ~/.ssh/devmatrix_id_rsa ]; then ssh-keygen -t rsa -b 4096 -f ~/.ssh/devmatrix_id_rsa -N "" -C "devmatrix@proxmox" chmod 600 ~/.ssh/devmatrix_id_rsa fi qm set $MAIN_VMID --sshkeys ~/.ssh/devmatrix_id_rsa.pub # Description qm set $MAIN_VMID --description "OpenClaw DevMatrix - Ubuntu Dev Environment IP: ${MAIN_IP} Storage: ${STORAGE_HDD} (OS migrates to ${STORAGE_NVME} later) Data: ${STORAGE_HDD} (permanent) TrueNAS: ${TRUENAS_IP}" log "✓ VM $MAIN_VMID created" echo "" # ============================================ # CREATE VM 301: Windows LTSC IoT Test VM # ============================================ log "🚀 Creating VM $WIN_VMID: Windows-LTSC-Test" log " IP: $WIN_IP | Storage: $STORAGE_HDD" qm create $WIN_VMID \ --name "Windows-LTSC-Test" \ --memory $WIN_RAM \ --cores $WIN_CORES \ --cpu host \ --net0 virtio,bridge=$NETWORK_BRIDGE,tag=1 \ --scsihw virtio-scsi-single \ --bios ovmf \ --machine q35 # EFI disk qm set $WIN_VMID --efidisk0 ${STORAGE_HDD}:1,format=qcow2,efitype=4m,pre-enrolled-keys=1 # OS Disk - HDD optimized qm set $WIN_VMID \ --scsi0 ${STORAGE_HDD}:${WIN_DISK},format=qcow2,cache=writeback,discard=on,iothread=1,ssd=1 # Attach Windows ISO if available if [ -n "$WIN_ISO_FILE" ]; then qm set $WIN_VMID --ide0 local:iso/${WIN_ISO_FILE},media=cdrom else warn "No Windows ISO attached. Attach manually later." fi # Boot order qm set $WIN_VMID --boot order=scsi0;ide0 # Enable QEMU Guest Agent qm set $WIN_VMID --agent enabled=1 # Windows benefits from more video memory qm set $WIN_VMID --vga virtio,memory=64 # Description qm set $WIN_VMID --description "Windows 11 LTSC IoT Test VM IP: ${WIN_IP} Storage: ${STORAGE_HDD} User: testuser / DevMatrix2024!" log "✓ VM $WIN_VMID created" echo "" # ============================================ # CREATE VM 302: Android Emulator VM # ============================================ log "🚀 Creating VM $ANDROID_VMID: Android-Emulator" log " IP: $ANDROID_IP | Storage: $STORAGE_HDD" qm create $ANDROID_VMID \ --name "Android-Emulator" \ --memory $ANDROID_RAM \ --cores $ANDROID_CORES \ --cpu host \ --net0 virtio,bridge=$NETWORK_BRIDGE,tag=1 \ --scsihw virtio-scsi-single \ --bios ovmf \ --machine q35 # EFI disk qm set $ANDROID_VMID --efidisk0 ${STORAGE_HDD}:1,format=qcow2,efitype=4m,pre-enrolled-keys=1 # OS Disk qm set $ANDROID_VMID \ --scsi0 ${STORAGE_HDD}:${ANDROID_DISK},format=qcow2,cache=writeback,discard=on,iothread=1,ssd=1 # Attach Ubuntu ISO (for Android dev environment setup) qm set $ANDROID_VMID --ide0 local:iso/ubuntu-22.04.5-live-server-amd64.iso,media=cdrom # Boot order qm set $ANDROID_VMID --boot order=scsi0;ide0 # Enable QEMU Guest Agent qm set $ANDROID_VMID --agent enabled=1 # Description qm set $ANDROID_VMID --description "Android Emulator VM IP: ${ANDROID_IP} Storage: ${STORAGE_HDD} Note: Install Android SDK and Emulator after Ubuntu setup" log "✓ VM $ANDROID_VMID created" echo "" # ============================================ # CREATE MIGRATION SCRIPT # ============================================ log "📝 Creating NVMe migration script..." mkdir -p /root/devmatrix-scripts cat > /root/devmatrix-scripts/migrate_to_nvme.sh << 'EOF' #!/bin/bash # Migrate DevMatrix VMs from HDD (pve-main2) to NVMe (pve-main) # Run this after installing NVMe drive and adding it as 'pve-main' storage STORAGE_NVME="pve-main" STORAGE_HDD="pve-main2" MIGRATE_VMS="300 301 302" echo "🚀 DevMatrix NVMe Migration Tool" echo "================================" echo "" # Check NVMe storage exists if ! pvesm status | grep -q "^$STORAGE_NVME"; then echo "❌ NVMe storage '$STORAGE_NVME' not found!" echo "" echo "To add NVMe storage:" echo "1. Install NVMe drive" echo "2. In Proxmox: Datacenter -> Storage -> Add -> Directory" echo "3. Set ID to 'pve-main' and point to your NVMe mount point" exit 1 fi echo "✓ NVMe storage '$STORAGE_NVME' found" echo "" migrate_vm() { local vmid=$1 local vmname=$(qm config $vmid | grep name | cut -d' ' -f2) echo "🔄 Migrating VM $vmid ($vmname)..." # Check if running if qm status $vmid | grep -q running; then echo " Stopping VM..." qm stop $vmid sleep 5 fi # Get current disk size DISK_SIZE=$(qm config $vmid | grep scsi0 | grep -oP '\d+(?=,)' | head -1) echo " Moving disk (${DISK_SIZE}GB)..." qm move-disk $vmid scsi0 $STORAGE_NVME # Update cache settings for SSD (writethrough is safer for SSD) qm set $vmid --scsi0 ${STORAGE_NVME}:${DISK_SIZE},cache=writethrough,discard=on,ssd=1,iothread=1 # Update description qm set $vmid --description "$(qm config $vmid | grep description | cut -d' ' -f2-) | Migrated to NVMe $(date +%Y-%m-%d)" echo " ✓ Migrated successfully" echo "" } # Confirm read -p "Migrate VMs $MIGRATE_VMS to NVMe? (y/N): " confirm if [ "$confirm" != "y" ]; then echo "Cancelled." exit 0 fi # Migrate for vmid in $MIGRATE_VMS; do migrate_vm $vmid done echo "🎉 All VMs migrated to NVMe!" echo "" echo "Next steps:" echo "1. Start VMs and verify they boot correctly" echo "2. Update any hardcoded paths in VM configs" echo "3. Consider moving data disks (scsi1) to NVMe for better performance" echo "" echo "Old HDD storage can now be used for backups and less critical VMs" EOF chmod +x /root/devmatrix-scripts/migrate_to_nvme.sh log "✓ Migration script created: /root/devmatrix-scripts/migrate_to_nvme.sh" # ============================================ # CREATE VM INFO FILE # ============================================ cat > ~/devmatrix_vm_info.txt << EOF DevMatrix VM Configuration ========================== Created: $(date) Network: $NETWORK_BRIDGE Storage HDD: $STORAGE_HDD Future NVMe: $STORAGE_NVME TrueNAS: $TRUENAS_IP ($TRUENAS_DATASET) VM INVENTORY ============ ID 300: OpenClaw-DevMatrix (Ubuntu 22.04) ----------------------------------------- Name: OpenClaw-DevMatrix IP: ${MAIN_IP}/24 (Gateway: ${GATEWAY}) RAM: ${MAIN_RAM}MB (32GB) CPU: ${MAIN_CORES} cores OS Disk: ${MAIN_OS_DISK}GB on ${STORAGE_HDD} (migrates to ${STORAGE_NVME}) Data Disk: ${MAIN_DATA_DISK}GB on ${STORAGE_HDD} (permanent) SSH: ssh -i ~/.ssh/devmatrix_id_rsa devmatrix@${MAIN_IP} VS Code: http://${MAIN_IP}:8080 ID 301: Windows-LTSC-Test (Windows 11) -------------------------------------- Name: Windows-LTSC-Test IP: ${WIN_IP}/24 RAM: ${WIN_RAM}MB (16GB) CPU: ${WIN_CORES} cores Disk: ${WIN_DISK}GB on ${STORAGE_HDD} RDP: mstsc /v:${WIN_IP} User: testuser / DevMatrix2024! ID 302: Android-Emulator (Ubuntu 22.04) --------------------------------------- Name: Android-Emulator IP: ${ANDROID_IP}/24 RAM: ${ANDROID_RAM}MB (8GB) CPU: ${ANDROID_CORES} cores Disk: ${ANDROID_DISK}GB on ${STORAGE_HDD} SSH ACCESS ========== Private Key: ~/.ssh/devmatrix_id_rsa Public Key: ~/.ssh/devmatrix_id_rsa.pub Add this public key to VMs during cloud-init or after install: $(cat ~/.ssh/devmatrix_id_rsa.pub) PROXMOX COMMANDS ================ Start VM 300: qm start 300 Stop VM 300: qm stop 300 Console: qm console 300 Status: qm status 300 SNAPSHOTS ========= Create: qm snapshot 300 before-update List: qm listsnapshot 300 Restore: qm rollback 300 before-update MIGRATION ========= When NVMe (pve-main) is installed, run: /root/devmatrix-scripts/migrate_to_nvme.sh This will move VM 300-302 OS disks from HDD to NVMe TRUENAS INTEGRATION =================== TrueNAS IP: ${TRUENAS_IP} Dataset: ${TRUENAS_DATASET} Setup shares on TrueNAS: 1. Create dataset: ${TRUENAS_DATASET}/devmatrix 2. Create sub-datasets: - ${TRUENAS_DATASET}/devmatrix/projects - ${TRUENAS_DATASET}/devmatrix/backups - ${TRUENAS_DATASET}/devmatrix/iso-archive 3. Create NFS shares for each 4. Mount in VM 300 using ~/scripts/setup_truenas.sh NEXT STEPS ========== 1. Install Ubuntu on VM 300: qm start 300 # Connect via console, complete installation 2. Install Windows on VM 301: qm start 301 # Install Windows LTSC IoT 3. Setup Dev Environment (inside VM 300): ssh devmatrix@${MAIN_IP} # Run setup_openclaw_dev.sh 4. Configure TrueNAS shares (optional): # Setup on TrueNAS first, then run setup_truenas.sh in VM For detailed instructions, see: DEVMATRIX_SETUP_GUIDE.md EOF # ============================================ # SUMMARY # ============================================ log "🎉 DevMatrix VMs Created Successfully!" echo "" echo "╔════════════════════════════════════════════════════════════╗" echo "║ VM INVENTORY ║" echo "╠════════════════════════════════════════════════════════════╣" echo "║ ║" printf "║ ID 300: %-15s IP: %-15s ║\n" "OpenClaw-DevMatrix" "$MAIN_IP" printf "║ Ubuntu 22.04 RAM: 32GB Disk: 400GB ║\n" echo "║ ║" printf "║ ID 301: %-15s IP: %-15s ║\n" "Windows-LTSC-Test" "$WIN_IP" printf "║ Windows 11 LTSC RAM: 16GB Disk: 100GB ║\n" echo "║ ║" printf "║ ID 302: %-15s IP: %-15s ║\n" "Android-Emulator" "$ANDROID_IP" printf "║ Ubuntu 22.04 RAM: 8GB Disk: 50GB ║\n" echo "║ ║" echo "╠════════════════════════════════════════════════════════════╣" echo "║ Storage: HDD ($STORAGE_HDD) → NVMe ($STORAGE_NVME) later ║" echo "║ TrueNAS: $TRUENAS_IP ║" echo "╚════════════════════════════════════════════════════════════╝" echo "" log "📄 Configuration saved to: ~/devmatrix_vm_info.txt" log "🔑 SSH key: ~/.ssh/devmatrix_id_rsa" log "🚀 Migration tool: /root/devmatrix-scripts/migrate_to_nvme.sh" echo "" echo "Next: Install Ubuntu on VM 300, then run setup_openclaw_dev.sh" echo ""