#!/bin/bash # TrueNAS Mount Setup Script for DevMatrix VM (Idempotent) # Run this INSIDE VM 300 (OpenClaw-DevMatrix) after OS setup set -e # Configuration TRUENAS_IP="192.168.5.195" TRUENAS_DATASET="NAS2" MOUNT_BASE="/mnt/truenas" # Colors RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' BLUE='\033[0;34m' NC='\033[0m' log() { echo -e "${GREEN}[TrueNAS]${NC} $1"; } warn() { echo -e "${YELLOW}[Warning]${NC} $1"; } error() { echo -e "${RED}[Error]${NC} $1"; exit 1; } log "☁️ Setting up TrueNAS integration..." echo " TrueNAS IP: $TRUENAS_IP" echo " Dataset: $TRUENAS_DATASET" echo "" # ============================================ # CHECK CONNECTIVITY # ============================================ log "🔍 Checking TrueNAS connectivity..." if ! ping -c 1 "$TRUENAS_IP" >/dev/null 2>&1; then error "Cannot reach TrueNAS at $TRUENAS_IP" fi log "✓ TrueNAS is reachable" # ============================================ # INSTALL NFS CLIENT (Skip if installed) # ============================================ log "📦 Checking NFS client..." if dpkg -l | grep -q "nfs-common"; then log "✓ NFS client already installed" else sudo apt update sudo apt install -y nfs-common log "✓ NFS client installed" fi # ============================================ # CREATE MOUNT POINTS (Skip if exist) # ============================================ log "📁 Checking mount points..." for dir in projects backups iso-archive shared; do mountpoint="$MOUNT_BASE/$dir" if [ -d "$mountpoint" ]; then echo "✓ Mount point exists: $mountpoint" else sudo mkdir -p "$mountpoint" echo "✓ Created: $mountpoint" fi done sudo chown -R $(id -u):$(id -g) "$MOUNT_BASE" # ============================================ # CONFIGURE FSTAB (Skip if entries exist) # ============================================ log "⚙️ Checking fstab entries..." # Backup fstab if not already backed up if [ ! -f /etc/fstab.backup.$(date +%Y%m%d) ]; then sudo cp /etc/fstab /etc/fstab.backup.$(date +%Y%m%d) log "✓ Backed up fstab" fi # Function to check if fstab entry exists check_fstab_entry() { local path=$1 grep -q "$path" /etc/fstab } # Add entries only if they don't exist added_entries=0 if ! check_fstab_entry "$TRUENAS_IP:/mnt/$TRUENAS_DATASET/devmatrix/projects"; then echo "$TRUENAS_IP:/mnt/$TRUENAS_DATASET/devmatrix/projects $MOUNT_BASE/projects nfs defaults,_netdev,rw,sync,hard,intr 0 0" | sudo tee -a /etc/fstab >/dev/null echo "✓ Added fstab: projects" added_entries=$((added_entries + 1)) else echo "✓ fstab entry exists: projects" fi if ! check_fstab_entry "$TRUENAS_IP:/mnt/$TRUENAS_DATASET/devmatrix/backups"; then echo "$TRUENAS_IP:/mnt/$TRUENAS_DATASET/devmatrix/backups $MOUNT_BASE/backups nfs defaults,_netdev,rw,sync,hard,intr 0 0" | sudo tee -a /etc/fstab >/dev/null echo "✓ Added fstab: backups" added_entries=$((added_entries + 1)) else echo "✓ fstab entry exists: backups" fi if ! check_fstab_entry "$TRUENAS_IP:/mnt/$TRUENAS_DATASET/devmatrix/iso-archive"; then echo "$TRUENAS_IP:/mnt/$TRUENAS_DATASET/devmatrix/iso-archive $MOUNT_BASE/iso-archive nfs defaults,_netdev,ro,sync,hard,intr 0 0" | sudo tee -a /etc/fstab >/dev/null echo "✓ Added fstab: iso-archive" added_entries=$((added_entries + 1)) else echo "✓ fstab entry exists: iso-archive" fi if ! check_fstab_entry "$TRUENAS_IP:/mnt/$TRUENAS_DATASET/devmatrix/shared"; then echo "$TRUENAS_IP:/mnt/$TRUENAS_DATASET/devmatrix/shared $MOUNT_BASE/shared nfs defaults,_netdev,rw,sync,hard,intr 0 0" | sudo tee -a /etc/fstab >/dev/null echo "✓ Added fstab: shared" added_entries=$((added_entries + 1)) else echo "✓ fstab entry exists: shared" fi # ============================================ # MOUNT SHARES (Skip if already mounted) # ============================================ log "🔗 Mounting shares..." mounted_count=0 for dir in projects backups iso-archive shared; do mountpoint="$MOUNT_BASE/$dir" if mount | grep -q "$mountpoint"; then echo "✓ Already mounted: $dir" else echo " Mounting: $dir..." if sudo mount "$mountpoint" 2>&1; then echo "✓ Mounted: $dir" mounted_count=$((mounted_count + 1)) else warn "Failed to mount: $dir (may need to retry after TrueNAS setup completes)" fi fi done # ============================================ # CREATE SYMLINKS (Skip if exist) # ============================================ log "🔗 Checking symlinks..." if [ -L ~/projects-nas ]; then echo "✓ Symlink exists: ~/projects-nas" else ln -sf "$MOUNT_BASE/projects" ~/projects-nas echo "✓ Created: ~/projects-nas" fi if [ -L ~/backups-nas ]; then echo "✓ Symlink exists: ~/backups-nas" else ln -sf "$MOUNT_BASE/backups" ~/backups-nas echo "✓ Created: ~/backups-nas" fi if [ -L ~/shared-nas ]; then echo "✓ Symlink exists: ~/shared-nas" else ln -sf "$MOUNT_BASE/shared" ~/shared-nas echo "✓ Created: ~/shared-nas" fi # ============================================ # CREATE BACKUP SCRIPT (Skip if exists) # ============================================ log "📝 Checking backup scripts..." mkdir -p ~/scripts if [ -f ~/scripts/backup_to_truenas.sh ]; then echo "✓ Backup script exists" else cat > ~/scripts/backup_to_truenas.sh << 'EOFSCRIPT' #!/bin/bash # Backup important data to TrueNAS BACKUP_DIR="/mnt/truenas/backups/$(hostname)/$(date +%Y-%m-%d)" LOG_FILE="/tmp/backup_$(date +%Y%m%d_%H%M%S).log" echo "Starting backup to TrueNAS..." echo "Destination: $BACKUP_DIR" mkdir -p "$BACKUP_DIR" # Backup projects if [ -d ~/projects ]; then echo "Backing up projects..." rsync -avz ~/projects/ "$BACKUP_DIR/projects/" 2>&1 | tee -a $LOG_FILE fi # Backup OpenClaw config if [ -d ~/.openclaw ]; then echo "Backing up OpenClaw config..." rsync -avz ~/.openclaw/ "$BACKUP_DIR/openclaw/" 2>&1 | tee -a $LOG_FILE fi # Backup scripts if [ -d ~/scripts ]; then echo "Backing up scripts..." rsync -avz ~/scripts/ "$BACKUP_DIR/scripts/" 2>&1 | tee -a $LOG_FILE fi echo "Backup complete! Log: $LOG_FILE" EOFSCRIPT chmod +x ~/scripts/backup_to_truenas.sh echo "✓ Created: ~/scripts/backup_to_truenas.sh" fi # ============================================ # SUMMARY # ============================================ log "☁️ TrueNAS integration complete!" echo "" echo "╔════════════════════════════════════════════════════════╗" echo "║ TRUENAS CONFIGURATION ║" echo "╠════════════════════════════════════════════════════════╣" echo "║ ║" echo "║ Mount Points: ║" echo "║ ✓ /mnt/truenas/projects ║" echo "║ ✓ /mnt/truenas/backups ║" echo "║ ✓ /mnt/truenas/iso-archive ║" echo "║ ✓ /mnt/truenas/shared ║" echo "║ ║" echo "║ Symlinks: ║" echo "║ ✓ ~/projects-nas → /mnt/truenas/projects ║" echo "║ ✓ ~/backups-nas → /mnt/truenas/backups ║" echo "║ ✓ ~/shared-nas → /mnt/truenas/shared ║" echo "║ ║" echo "║ Helper Scripts: ║" echo "║ ✓ ~/scripts/backup_to_truenas.sh ║" echo "║ ║" echo "╚════════════════════════════════════════════════════════╝" echo "" # Show mounted shares echo "Mounted TrueNAS shares:" df -h | grep truenas || echo " (check with: df -h | grep truenas)" echo "" echo "Run this script again anytime to add missing resources!"