243 lines
8.2 KiB
Bash
243 lines
8.2 KiB
Bash
#!/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!"
|