devmatrix-scripts/setup_devmatrix_proxmox_cus...

584 lines
18 KiB
Bash

#!/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.10"
# 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 ""
# ============================================
# CHECK ISO IMAGES (in pve-storage)
# ============================================
log "⬇️ Checking for ISO images in pve-storage..."
# Ubuntu ISO (use 24.04.3 from pve-storage)
UBUNTU_ISO="/mnt/pve/pve-storage/template/iso/ubuntu-24.04.3-live-server-amd64.iso"
if [ -f "$UBUNTU_ISO" ]; then
log "✓ Ubuntu 24.04.3 ISO found in pve-storage"
else
error "Ubuntu ISO not found in pve-storage. Please ensure ubuntu-24.04.3-live-server-amd64.iso exists."
fi
# Windows ISO
WIN_ISO="/mnt/pve/pve-storage/template/iso/Win11_IoT_Enterprise_LTSC.iso"
if [ -f "$WIN_ISO" ]; then
log "✓ Windows IoT Enterprise LTSC ISO found"
WIN_ISO_FILE="Win11_IoT_Enterprise_LTSC.iso"
else
warn "⚠️ Windows ISO not found in pve-storage"
info "Expected: Win11_IoT_Enterprise_LTSC.iso"
read -p "Press Enter when Windows ISO is ready (or 'skip' to continue without): " response
if [ "$response" == "skip" ]; then
WIN_ISO_FILE=""
fi
fi
# VirtIO drivers ISO
VIRTIO_ISO="/mnt/pve/pve-storage/template/iso/virtio-win-0.1.285.iso"
if [ -f "$VIRTIO_ISO" ]; then
log "✓ VirtIO drivers ISO found"
else
warn "⚠️ VirtIO drivers ISO not found"
info "Expected: virtio-win-0.1.285.iso"
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 pve-storage:iso/ubuntu-24.04.3-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 pve-storage:iso/Win11_IoT_Enterprise_LTSC.iso,media=cdrom
log "✓ Attached Windows ISO"
else
warn "No Windows ISO attached. Attach manually later."
fi
# Attach VirtIO drivers ISO
VIRTIO_ISO="/mnt/pve/pve-storage/template/iso/virtio-win-0.1.285.iso"
if [ -f "$VIRTIO_ISO" ]; then
qm set $WIN_VMID --ide1 pve-storage:iso/virtio-win-0.1.285.iso,media=cdrom
log "✓ Attached VirtIO drivers ISO"
else
warn "VirtIO drivers ISO not found. Install drivers manually after Windows setup."
fi
# Boot order (boot from Windows ISO first, then disk)
qm set $WIN_VMID --boot "order=ide0;scsi0"
# Enable QEMU Guest Agent
qm set $WIN_VMID --agent enabled=1,fstrim_cloned_disks=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 pve-storage:iso/ubuntu-24.04.3-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,fstrim_cloned_disks=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 ""