#!/bin/bash # TrueNAS Integration Script for DevMatrix # 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 "" # ============================================ # INSTALL NFS CLIENT # ============================================ log "📦 Installing NFS client..." sudo apt update sudo apt install -y nfs-common # ============================================ # CREATE MOUNT POINTS # ============================================ log "📁 Creating mount points..." sudo mkdir -p $MOUNT_BASE/{projects,backups,iso-archive,shared} # Set permissions sudo chown -R $(id -u):$(id -g) $MOUNT_BASE # ============================================ # CONFIGURE NFS MOUNTS # ============================================ log "⚙️ Configuring NFS mounts..." # Check if we can reach TrueNAS if ! ping -c 1 $TRUENAS_IP >/dev/null 2>&1; then error "Cannot reach TrueNAS at $TRUENAS_IP" fi log "✓ TrueNAS is reachable" # Show available shares echo "" echo "Checking available NFS shares on TrueNAS..." showmount -e $TRUENAS_IP 2>/dev/null || warn "Cannot list exports. Make sure NFS is enabled on TrueNAS." echo "" echo "Expected shares (create these on TrueNAS if not present):" echo " - /mnt/$TRUENAS_DATASET/devmatrix/projects" echo " - /mnt/$TRUENAS_DATASET/devmatrix/backups" echo " - /mnt/$TRUENAS_DATASET/devmatrix/iso-archive" echo " - /mnt/$TRUENAS_DATASET/devmatrix/shared" echo "" # ============================================ # CREATE FSTAB ENTRIES # ============================================ log "📝 Adding mount entries to /etc/fstab..." # Backup original fstab sudo cp /etc/fstab /etc/fstab.backup.$(date +%Y%m%d) # Add entries cat << EOF | sudo tee -a /etc/fstab # TrueNAS mounts for DevMatrix # Format: server:path mountpoint type options dump pass $TRUENAS_IP:/mnt/$TRUENAS_DATASET/devmatrix/projects $MOUNT_BASE/projects nfs defaults,_netdev,rw,sync,hard,intr 0 0 $TRUENAS_IP:/mnt/$TRUENAS_DATASET/devmatrix/backups $MOUNT_BASE/backups nfs defaults,_netdev,rw,sync,hard,intr 0 0 $TRUENAS_IP:/mnt/$TRUENAS_DATASET/devmatrix/iso-archive $MOUNT_BASE/iso-archive nfs defaults,_netdev,ro,sync,hard,intr 0 0 $TRUENAS_IP:/mnt/$TRUENAS_DATASET/devmatrix/shared $MOUNT_BASE/shared nfs defaults,_netdev,rw,sync,hard,intr 0 0 EOF log "✓ fstab entries added" # ============================================ # MOUNT SHARES # ============================================ log "🔗 Mounting shares..." # Try to mount all sudo mount -a 2>&1 || { warn "Some mounts failed. This is expected if shares don't exist yet." warn "Set up shares on TrueNAS first, then run: sudo mount -a" } # Check what's mounted echo "" echo "Currently mounted TrueNAS shares:" df -h | grep $TRUENAS_IP || echo " (none mounted yet)" # ============================================ # CREATE SYMLINKS # ============================================ log "🔗 Creating convenience symlinks..." # In home directory ln -sf $MOUNT_BASE/projects ~/projects-nas ln -sf $MOUNT_BASE/backups ~/backups-nas ln -sf $MOUNT_BASE/shared ~/shared-nas # In standard locations sudo mkdir -p /opt/truenas sudo ln -sf $MOUNT_BASE/shared /opt/truenas/shared log "✓ Symlinks created:" echo " ~/projects-nas → TrueNAS projects" echo " ~/backups-nas → TrueNAS backups" echo " ~/shared-nas → TrueNAS shared" echo " /opt/truenas → TrueNAS shared (system-wide)" # ============================================ # SETUP AUTO-MOUNT # ============================================ log "⚙️ Configuring auto-mount..." # Enable rpcbind for NFS sudo systemctl enable rpcbind sudo systemctl start rpcbind # Create systemd mount units for reliability cat > /tmp/truenas-projects.mount << EOF [Unit] Description=TrueNAS Projects Mount After=network-online.target Wants=network-online.target [Mount] What=$TRUENAS_IP:/mnt/$TRUENAS_DATASET/devmatrix/projects Where=$MOUNT_BASE/projects Type=nfs Options=defaults,_netdev,rw,sync,hard,intr [Install] WantedBy=multi-user.target EOF sudo mv /tmp/truenas-projects.mount /etc/systemd/system/ sudo systemctl daemon-reload # ============================================ # BACKUP SCRIPT # ============================================ log "📝 Creating backup helper script..." mkdir -p ~/scripts 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" echo "" # Create backup directory mkdir -p "$BACKUP_DIR" # Backup projects if [ -d ~/projects ]; then echo "Backing up projects..." rsync -avz --progress ~/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 --progress ~/.openclaw/ "$BACKUP_DIR/openclaw/" 2>&1 | tee -a $LOG_FILE fi # Backup scripts if [ -d ~/scripts ]; then echo "Backing up scripts..." rsync -avz --progress ~/scripts/ "$BACKUP_DIR/scripts/" 2>&1 | tee -a $LOG_FILE fi # Create backup manifest cat > "$BACKUP_DIR/backup-manifest.txt" << EOF Backup Date: $(date) Hostname: $(hostname) User: $(whoami) Source: ~/projects, ~/.openclaw, ~/scripts EOF echo "" echo "Backup complete!" echo "Log: $LOG_FILE" echo "Location: $BACKUP_DIR" EOFSCRIPT chmod +x ~/scripts/backup_to_truenas.sh # ============================================ # RESTORE SCRIPT # ============================================ cat > ~/scripts/restore_from_truenas.sh << 'EOFSCRIPT' #!/bin/bash # Restore from TrueNAS backup if [ -z "$1" ]; then echo "Usage: $0 " echo "Example: $0 2024-02-16" echo "" echo "Available backups:" ls /mnt/truenas/backups/$(hostname)/ 2>/dev/null || echo " (no backups found)" exit 1 fi BACKUP_DATE="$1" BACKUP_DIR="/mnt/truenas/backups/$(hostname)/$BACKUP_DATE" if [ ! -d "$BACKUP_DIR" ]; then echo "Error: Backup not found: $BACKUP_DIR" exit 1 fi echo "Restoring from backup: $BACKUP_DATE" echo "Source: $BACKUP_DIR" echo "" read -p "Are you sure? This will overwrite existing files! (y/N): " confirm if [ "$confirm" != "y" ]; then echo "Cancelled." exit 0 fi # Restore projects if [ -d "$BACKUP_DIR/projects" ]; then echo "Restoring projects..." rsync -avz "$BACKUP_DIR/projects/" ~/projects/ fi # Restore OpenClaw config if [ -d "$BACKUP_DIR/openclaw" ]; then echo "Restoring OpenClaw config..." rsync -avz "$BACKUP_DIR/openclaw/" ~/.openclaw/ fi # Restore scripts if [ -d "$BACKUP_DIR/scripts" ]; then echo "Restoring scripts..." rsync -avz "$BACKUP_DIR/scripts/" ~/scripts/ fi echo "" echo "Restore complete!" EOFSCRIPT chmod +x ~/scripts/restore_from_truenas.sh # ============================================ # SUMMARY # ============================================ log "☁️ TrueNAS integration complete!" echo "" echo "╔════════════════════════════════════════════════════════╗" echo "║ TRUENAS CONFIGURATION ║" echo "╠════════════════════════════════════════════════════════╣" echo "║ ║" echo "║ Mount Points: ║" echo "║ /mnt/truenas/projects - Project storage ║" echo "║ /mnt/truenas/backups - Backup storage ║" echo "║ /mnt/truenas/iso-archive - ISO storage ║" echo "║ /mnt/truenas/shared - Shared files ║" 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 - Backup data ║" echo "║ ~/scripts/restore_from_truenas.sh - Restore data ║" echo "║ ║" echo "╚════════════════════════════════════════════════════════╝" echo "" echo "⚠️ IMPORTANT: Create shares on TrueNAS first!" echo "" echo "On TrueNAS ($TRUENAS_IP):" echo "1. Go to Storage → Pools → $TRUENAS_DATASET" echo "2. Create dataset: devmatrix" echo "3. Create sub-datasets:" echo " - devmatrix/projects" echo " - devmatrix/backups" echo " - devmatrix/iso-archive" echo " - devmatrix/shared" echo "4. Go to Sharing → Unix (NFS) Shares" echo "5. Add NFS shares for each dataset" echo "6. Set permissions to allow this VM's IP ($(hostname -I | awk '{print $1}'))" echo "" echo "Then run: sudo mount -a" echo ""