#!/bin/bash # TrueNAS Share Setup Script for DevMatrix # Run this on TrueNAS (192.168.5.195) as root set -e # Configuration DATASET_NAME="NAS2" SHARE_PREFIX="devmatrix" NETWORK_ALLOW="192.168.5.0/24" echo "☁️ Setting up TrueNAS shares for DevMatrix..." echo " Dataset: $DATASET_NAME" echo " Network: $NETWORK_ALLOW" echo "" # ============================================ # CREATE DATASET STRUCTURE # ============================================ echo "📁 Creating dataset structure..." # Main dataset (if not exists) if ! zfs list "$DATASET_NAME/$SHARE_PREFIX" >/devdev/null 2>&1; then zfs create "$DATASET_NAME/$SHARE_PREFIX" echo "✓ Created: $DATASET_NAME/$SHARE_PREFIX" else echo "✓ Exists: $DATASET_NAME/$SHARE_PREFIX" fi # Sub-datasets for subdir in projects backups iso-archive shared; do dataset_path="$DATASET_NAME/$SHARE_PREFIX/$subdir" if ! zfs list "$dataset_path" >/dev/null 2>&1; then zfs create "$dataset_path" echo "✓ Created: $dataset_path" else echo "✓ Exists: $dataset_path" fi done # ============================================ # SET PERMISSIONS # ============================================ echo "" echo "🔐 Setting permissions..." # Set ownership (nobody:nogroup for NFS) for subdir in projects backups iso-archive shared; do mountpoint=$(zfs get -H -o value mountpoint "$DATASET_NAME/$SHARE_PREFIX/$subdir") chown -R nobody:nogroup "$mountpoint" chmod -R 777 "$mountpoint" echo "✓ Permissions set for: $subdir" done # ============================================ # CREATE NFS SHARES # ============================================ echo "" echo "🔗 Creating NFS shares..." # Function to create NFS share create_nfs_share() { local name=$1 local path=$2 local options=$3 # Check if share already exists if midclt call sharing.nfs.query "[[\"path\",\"=\",\"$path\"]]" | grep -q "$path"; then echo "✓ NFS share exists: $name" return fi # Create share using midclt (TrueNAS API) midclt call sharing.nfs.create "{ \"path\": \"$path\", \"comment\": \"DevMatrix $name\", \"hosts\": [\"$NETWORK_ALLOW\"], \"ro\": $options, \"maproot_user\": \"root\", \"maproot_group\": \"root\", \"mapall_user\": \"\", \"mapall_group\": \"\", \"security\": ["SYS"] }" > /dev/null echo "✓ Created NFS share: $name ($path)" } # Create shares mountpoint_base=$(zfs get -H -o value mountpoint "$DATASET_NAME") create_nfs_share "projects" "$mountpoint_base/$SHARE_PREFIX/projects" "false" create_nfs_share "backups" "$mountpoint_base/$SHARE_PREFIX/backups" "false" create_nfs_share "iso-archive" "$mountpoint_base/$SHARE_PREFIX/iso-archive" "false" create_nfs_share "shared" "$mountpoint_base/$SHARE_PREFIX/shared" "false" # ============================================ # ENABLE NFS SERVICE # ============================================ echo "" echo "🚀 Enabling NFS service..." # Check if NFS is running if ! midclt call service.query "[[\"service\",\"=\",\"nfs\"]]" | grep -q '"state": "RUNNING"'; then midclt call service.start "nfs" > /dev/null midclt call service.update "nfs" '{"enable": true}' > /dev/null echo "✓ NFS service started and enabled" else echo "✓ NFS service already running" fi # ============================================ # CREATE SMB SHARES (Optional - for Windows access) # ============================================ echo "" echo "🖥️ Creating SMB shares (for Windows access)..." # Enable SMB if not already if ! midclt call service.query "[[\"service\",\"=\",\"cifs\"]]" | grep -q '"state": "RUNNING"'; then midclt call service.start "cifs" > /dev/null midclt call service.update "cifs" '{"enable": true}' > /dev/null echo "✓ SMB service started and enabled" fi # Function to create SMB share create_smb_share() { local name=$1 local path=$2 # Check if exists if midclt call sharing.smb.query "[[\"path\",\"=\",\"$path\"]]" | grep -q "$path"; then echo "✓ SMB share exists: $name" return fi midclt call sharing.smb.create "{ \"path\": \"$path\", \"name\": \"devmatrix-$name\", \"comment\": \"DevMatrix $name\", \"browseable\": true, \"readonly\": false, \"guestok\": true, \"afp\": false }" > /dev/null echo "✓ Created SMB share: devmatrix-$name" } # Create SMB shares create_smb_share "projects" "$mountpoint_base/$SHARE_PREFIX/projects" create_smb_share "backups" "$mountpoint_base/$SHARE_PREFIX/backups" create_smb_share "shared" "$mountpoint_base/$SHARE_PREFIX/shared" # ============================================ # SUMMARY # ============================================ echo "" echo "╔════════════════════════════════════════════════════════╗" echo "║ TRUENAS SETUP COMPLETE ║" echo "╠════════════════════════════════════════════════════════╣" echo "║ ║" echo "║ NFS Shares (for Linux VMs): ║" echo "║ $mountpoint_base/$SHARE_PREFIX/projects ║" echo "║ $mountpoint_base/$SHARE_PREFIX/backups ║" echo "║ $mountpoint_base/$SHARE_PREFIX/iso-archive ║" echo "║ $mountpoint_base/$SHARE_PREFIX/shared ║" echo "║ ║" echo "║ SMB Shares (for Windows): ║" echo "║ \\$(hostname)\\devmatrix-projects ║" echo "║ \\$(hostname)\\devmatrix-backups ║" echo "║ \\$(hostname)\\devmatrix-shared ║" echo "║ ║" echo "║ Access from: $NETWORK_ALLOW ║" echo "║ ║" echo "╚════════════════════════════════════════════════════════╝" echo "" echo "Next: Run 'setup_truenas.sh' inside VM 300 to mount these shares"