Moves setup files into embedded package.
This commit is contained in:
60
internal/setup/cluster-services/nfs/README.md
Normal file
60
internal/setup/cluster-services/nfs/README.md
Normal file
@@ -0,0 +1,60 @@
|
||||
# NFS Setup (Optional)
|
||||
|
||||
The infrastructure supports optional NFS (Network File System) for shared media storage across the cluster. If your config.yaml contains the `cloud.nfs` section, the NFS server will be set up automatically.
|
||||
|
||||
## Host Setup
|
||||
|
||||
First, set up the NFS server on your chosen host.
|
||||
|
||||
```bash
|
||||
./setup-nfs-host.sh <host> <media-path>
|
||||
```
|
||||
|
||||
Example:
|
||||
|
||||
```bash
|
||||
./setup-nfs-host.sh box-01 /srv/nfs
|
||||
```
|
||||
|
||||
## Cluster Integration
|
||||
|
||||
Add to your `config.yaml`:
|
||||
|
||||
```yaml
|
||||
cloud:
|
||||
nfs:
|
||||
host: box-01
|
||||
mediaPath: /srv/nfs
|
||||
storageCapacity: 250Gi # Max size for PersistentVolume
|
||||
```
|
||||
|
||||
And now you can run the nfs cluster setup:
|
||||
|
||||
```bash
|
||||
setup/setup-nfs-host.sh
|
||||
```
|
||||
|
||||
## Features
|
||||
|
||||
- Automatic IP detection - Uses network IP even when hostname resolves to localhost
|
||||
- Cluster-wide access - Any pod can mount the NFS share regardless of node placement
|
||||
- Configurable capacity - Set PersistentVolume size via `NFS_STORAGE_CAPACITY`
|
||||
- ReadWriteMany - Multiple pods can simultaneously access the same storage
|
||||
|
||||
## Usage
|
||||
|
||||
Applications can use NFS storage by setting `storageClassName: nfs` in their PVCs:
|
||||
|
||||
```yaml
|
||||
apiVersion: v1
|
||||
kind: PersistentVolumeClaim
|
||||
metadata:
|
||||
name: media-pvc
|
||||
spec:
|
||||
accessModes:
|
||||
- ReadWriteMany
|
||||
storageClassName: nfs
|
||||
resources:
|
||||
requests:
|
||||
storage: 100Gi
|
||||
```
|
||||
255
internal/setup/cluster-services/nfs/install.sh
Executable file
255
internal/setup/cluster-services/nfs/install.sh
Executable file
@@ -0,0 +1,255 @@
|
||||
#!/bin/bash
|
||||
set -e
|
||||
set -o pipefail
|
||||
|
||||
# Ensure WILD_INSTANCE is set
|
||||
if [ -z "${WILD_INSTANCE}" ]; then
|
||||
echo "❌ ERROR: WILD_INSTANCE is not set"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Ensure WILD_CENTRAL_DATA is set
|
||||
if [ -z "${WILD_CENTRAL_DATA}" ]; then
|
||||
echo "❌ ERROR: WILD_CENTRAL_DATA is not set"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Ensure KUBECONFIG is set
|
||||
if [ -z "${KUBECONFIG}" ]; then
|
||||
echo "❌ ERROR: KUBECONFIG is not set"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
INSTANCE_DIR="${WILD_CENTRAL_DATA}/instances/${WILD_INSTANCE}"
|
||||
CONFIG_FILE="${INSTANCE_DIR}/config.yaml"
|
||||
CLUSTER_SETUP_DIR="${INSTANCE_DIR}/setup/cluster-services"
|
||||
NFS_DIR="${CLUSTER_SETUP_DIR}/nfs"
|
||||
|
||||
echo "💾 === Registering NFS Server with Kubernetes Cluster ==="
|
||||
echo ""
|
||||
|
||||
# Templates should already be compiled
|
||||
echo "📦 Using pre-compiled NFS templates..."
|
||||
if [ ! -d "${NFS_DIR}/kustomize" ]; then
|
||||
echo "❌ ERROR: Compiled templates not found at ${NFS_DIR}/kustomize"
|
||||
echo "Templates should be compiled before deployment."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
NFS_HOST="$(yq '.cloud.nfs.host' "${CONFIG_FILE}" 2>/dev/null | tr -d '"')"
|
||||
NFS_MEDIA_PATH="$(yq '.cloud.nfs.mediaPath' "${CONFIG_FILE}" 2>/dev/null | tr -d '"')"
|
||||
NFS_STORAGE_CAPACITY="$(yq '.cloud.nfs.storageCapacity' "${CONFIG_FILE}" 2>/dev/null | tr -d '"')"
|
||||
|
||||
echo "📋 NFS Configuration:"
|
||||
echo " Host: ${NFS_HOST}"
|
||||
echo " Media path: ${NFS_MEDIA_PATH}"
|
||||
echo " Storage capacity: ${NFS_STORAGE_CAPACITY}"
|
||||
echo ""
|
||||
|
||||
# Validate required config values
|
||||
if [ -z "${NFS_HOST}" ] || [ "${NFS_HOST}" = "null" ]; then
|
||||
echo "❌ ERROR: cloud.nfs.host not set in config"
|
||||
exit 1
|
||||
fi
|
||||
if [ -z "${NFS_MEDIA_PATH}" ] || [ "${NFS_MEDIA_PATH}" = "null" ]; then
|
||||
echo "❌ ERROR: cloud.nfs.mediaPath not set in config"
|
||||
exit 1
|
||||
fi
|
||||
if [ -z "${NFS_STORAGE_CAPACITY}" ] || [ "${NFS_STORAGE_CAPACITY}" = "null" ]; then
|
||||
echo "❌ ERROR: cloud.nfs.storageCapacity not set in config"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Function to resolve NFS host to IP
|
||||
resolve_nfs_host() {
|
||||
echo "🌐 Resolving NFS host: ${NFS_HOST}"
|
||||
if [[ "${NFS_HOST}" =~ ^[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+$ ]]; then
|
||||
# NFS_HOST is already an IP address
|
||||
NFS_HOST_IP="${NFS_HOST}"
|
||||
echo " ℹ️ Host is already an IP address"
|
||||
else
|
||||
# Resolve hostname to IP
|
||||
echo " 🔍 Looking up hostname..."
|
||||
NFS_HOST_IP=$(getent hosts "${NFS_HOST}" 2>/dev/null | awk '{print $1}' | head -n1 || true)
|
||||
echo " 📍 Resolved to: ${NFS_HOST_IP}"
|
||||
if [[ -z "${NFS_HOST_IP}" ]]; then
|
||||
echo "❌ ERROR: Unable to resolve hostname ${NFS_HOST} to IP address"
|
||||
echo "💡 Make sure ${NFS_HOST} is resolvable from this cluster"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Check if resolved IP is localhost - auto-detect network IP instead
|
||||
if [[ "${NFS_HOST_IP}" =~ ^127\. ]]; then
|
||||
echo "⚠️ Warning: ${NFS_HOST} resolves to localhost (${NFS_HOST_IP})"
|
||||
echo "🔍 Auto-detecting network IP for cluster access..."
|
||||
|
||||
# Try to find the primary network interface IP (exclude docker/k8s networks)
|
||||
local network_ip=$(ip route get 8.8.8.8 | grep -oP 'src \K\S+' 2>/dev/null)
|
||||
|
||||
if [[ -n "${network_ip}" && ! "${network_ip}" =~ ^127\. ]]; then
|
||||
echo "✅ Using detected network IP: ${network_ip}"
|
||||
NFS_HOST_IP="${network_ip}"
|
||||
else
|
||||
echo "❌ Could not auto-detect network IP. Available IPs:"
|
||||
ip addr show | grep "inet " | grep -v "127.0.0.1" | grep -v "10.42" | grep -v "172." | awk '{print " " $2}' | cut -d/ -f1
|
||||
echo "💡 Please set NFS_HOST to the correct IP address manually."
|
||||
exit 1
|
||||
fi
|
||||
fi
|
||||
fi
|
||||
|
||||
echo "🌐 NFS server IP: ${NFS_HOST_IP}"
|
||||
export NFS_HOST_IP
|
||||
}
|
||||
|
||||
# Function to test NFS accessibility
|
||||
test_nfs_accessibility() {
|
||||
echo ""
|
||||
echo "🔍 Testing NFS accessibility from cluster..."
|
||||
|
||||
# Check if showmount is available
|
||||
if ! command -v showmount >/dev/null 2>&1; then
|
||||
echo "📦 Installing NFS client tools..."
|
||||
if command -v apt-get >/dev/null 2>&1; then
|
||||
sudo apt-get update && sudo apt-get install -y nfs-common
|
||||
elif command -v yum >/dev/null 2>&1; then
|
||||
sudo yum install -y nfs-utils
|
||||
elif command -v dnf >/dev/null 2>&1; then
|
||||
sudo dnf install -y nfs-utils
|
||||
else
|
||||
echo "⚠️ Warning: Unable to install NFS client tools. Skipping accessibility test."
|
||||
return 0
|
||||
fi
|
||||
fi
|
||||
|
||||
# Test if we can reach the NFS server
|
||||
echo "🌐 Testing connection to NFS server..."
|
||||
if timeout 10 showmount -e "${NFS_HOST_IP}" >/dev/null 2>&1; then
|
||||
echo "✅ NFS server is accessible"
|
||||
echo "📋 Available exports:"
|
||||
showmount -e "${NFS_HOST_IP}"
|
||||
else
|
||||
echo "❌ Cannot connect to NFS server at ${NFS_HOST_IP}"
|
||||
echo "💡 Make sure:"
|
||||
echo " 1. NFS server is running on ${NFS_HOST}"
|
||||
echo " 2. Network connectivity exists between cluster and NFS host"
|
||||
echo " 3. Firewall allows NFS traffic (port 2049)"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Test specific export
|
||||
if showmount -e "${NFS_HOST_IP}" | grep -q "${NFS_MEDIA_PATH}"; then
|
||||
echo "✅ Media path ${NFS_MEDIA_PATH} is exported"
|
||||
else
|
||||
echo "❌ Media path ${NFS_MEDIA_PATH} is not found in exports"
|
||||
echo "📋 Available exports:"
|
||||
showmount -e "${NFS_HOST_IP}"
|
||||
echo ""
|
||||
echo "💡 Run setup-nfs-host.sh on ${NFS_HOST} to configure the export"
|
||||
exit 1
|
||||
fi
|
||||
}
|
||||
|
||||
# Function to create test mount
|
||||
test_nfs_mount() {
|
||||
echo ""
|
||||
echo "🔧 Testing NFS mount functionality..."
|
||||
|
||||
local test_mount="/tmp/nfs-test-$$"
|
||||
mkdir -p "${test_mount}"
|
||||
|
||||
# Try to mount the NFS export
|
||||
if timeout 30 sudo mount -t nfs4 "${NFS_HOST_IP}:${NFS_MEDIA_PATH}" "${test_mount}"; then
|
||||
echo "✅ NFS mount successful"
|
||||
|
||||
# Test read access
|
||||
if ls "${test_mount}" >/dev/null 2>&1; then
|
||||
echo "✅ NFS read access working"
|
||||
else
|
||||
echo "❌ NFS read access failed"
|
||||
fi
|
||||
|
||||
# Unmount
|
||||
sudo umount "${test_mount}" || echo "⚠️ Warning: Failed to unmount test directory"
|
||||
else
|
||||
echo "❌ NFS mount failed"
|
||||
echo "💡 Check NFS server configuration and network connectivity"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Clean up
|
||||
rmdir "${test_mount}" 2>/dev/null || true
|
||||
}
|
||||
|
||||
# Function to create Kubernetes resources
|
||||
create_k8s_resources() {
|
||||
echo ""
|
||||
echo "🚀 Creating Kubernetes NFS resources..."
|
||||
|
||||
# Apply the NFS Kubernetes manifests using kustomize (templates already processed)
|
||||
echo "📦 Applying NFS manifests..."
|
||||
kubectl apply -k "${NFS_DIR}/kustomize"
|
||||
|
||||
echo "✅ NFS PersistentVolume and StorageClass created"
|
||||
|
||||
# Verify resources were created
|
||||
echo "🔍 Verifying Kubernetes resources..."
|
||||
if kubectl get storageclass nfs >/dev/null 2>&1; then
|
||||
echo "✅ StorageClass 'nfs' created"
|
||||
else
|
||||
echo "❌ StorageClass 'nfs' not found"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if kubectl get pv nfs-media-pv >/dev/null 2>&1; then
|
||||
echo "✅ PersistentVolume 'nfs-media-pv' created"
|
||||
kubectl get pv nfs-media-pv
|
||||
else
|
||||
echo "❌ PersistentVolume 'nfs-media-pv' not found"
|
||||
exit 1
|
||||
fi
|
||||
}
|
||||
|
||||
# Function to show usage instructions
|
||||
show_usage_instructions() {
|
||||
echo ""
|
||||
echo "✅ === NFS Kubernetes Setup Complete ==="
|
||||
echo ""
|
||||
echo "💾 NFS server ${NFS_HOST} (${NFS_HOST_IP}) has been registered with the cluster"
|
||||
echo ""
|
||||
echo "📋 Kubernetes resources created:"
|
||||
echo " - StorageClass: nfs"
|
||||
echo " - PersistentVolume: nfs-media-pv (${NFS_STORAGE_CAPACITY}, ReadWriteMany)"
|
||||
echo ""
|
||||
echo "💡 To use NFS storage in your applications:"
|
||||
echo " 1. Set storageClassName: nfs in your PVC"
|
||||
echo " 2. Use accessMode: ReadWriteMany for shared access"
|
||||
echo ""
|
||||
echo "📝 Example PVC:"
|
||||
echo "---"
|
||||
echo "apiVersion: v1"
|
||||
echo "kind: PersistentVolumeClaim"
|
||||
echo "metadata:"
|
||||
echo " name: my-nfs-pvc"
|
||||
echo "spec:"
|
||||
echo " accessModes:"
|
||||
echo " - ReadWriteMany"
|
||||
echo " storageClassName: nfs"
|
||||
echo " resources:"
|
||||
echo " requests:"
|
||||
echo " storage: 10Gi"
|
||||
echo ""
|
||||
}
|
||||
|
||||
# Main execution
|
||||
main() {
|
||||
resolve_nfs_host
|
||||
test_nfs_accessibility
|
||||
test_nfs_mount
|
||||
create_k8s_resources
|
||||
show_usage_instructions
|
||||
}
|
||||
|
||||
# Run main function
|
||||
echo "🔧 Starting NFS setup process..."
|
||||
main "$@"
|
||||
@@ -0,0 +1,6 @@
|
||||
apiVersion: kustomize.config.k8s.io/v1beta1
|
||||
kind: Kustomization
|
||||
|
||||
resources:
|
||||
- persistent-volume.yaml
|
||||
- storage-class.yaml
|
||||
@@ -0,0 +1,23 @@
|
||||
apiVersion: v1
|
||||
kind: PersistentVolume
|
||||
metadata:
|
||||
name: nfs-media-pv
|
||||
labels:
|
||||
storage: nfs-media
|
||||
spec:
|
||||
capacity:
|
||||
storage: {{ .cloud.nfs.storageCapacity }}
|
||||
accessModes:
|
||||
- ReadWriteMany
|
||||
persistentVolumeReclaimPolicy: Retain
|
||||
storageClassName: nfs
|
||||
nfs:
|
||||
server: {{ .cloud.nfs.host }}
|
||||
path: {{ .cloud.nfs.mediaPath }}
|
||||
mountOptions:
|
||||
- nfsvers=4.1
|
||||
- rsize=1048576
|
||||
- wsize=1048576
|
||||
- hard
|
||||
- intr
|
||||
- timeo=600
|
||||
@@ -0,0 +1,10 @@
|
||||
apiVersion: storage.k8s.io/v1
|
||||
kind: StorageClass
|
||||
metadata:
|
||||
name: nfs
|
||||
provisioner: nfs
|
||||
parameters:
|
||||
server: {{ .cloud.nfs.host }}
|
||||
path: {{ .cloud.nfs.mediaPath }}
|
||||
reclaimPolicy: Retain
|
||||
allowVolumeExpansion: true
|
||||
306
internal/setup/cluster-services/nfs/setup-nfs-host.sh
Executable file
306
internal/setup/cluster-services/nfs/setup-nfs-host.sh
Executable file
@@ -0,0 +1,306 @@
|
||||
#!/bin/bash
|
||||
set -e
|
||||
set -o pipefail
|
||||
|
||||
# Navigate to script directory
|
||||
SCRIPT_PATH="$(realpath "${BASH_SOURCE[0]}")"
|
||||
SCRIPT_DIR="$(dirname "$SCRIPT_PATH")"
|
||||
PROJECT_DIR="$(dirname "$SCRIPT_DIR")"
|
||||
|
||||
usage() {
|
||||
echo "Usage: setup-nfs-host.sh [server] [media-path] [options]"
|
||||
echo ""
|
||||
echo "Set up NFS server on the specified host."
|
||||
echo ""
|
||||
echo "Examples:"
|
||||
echo " setup-nfs-host.sh box-01 /data/media"
|
||||
echo ""
|
||||
echo "Options:"
|
||||
echo " -h, --help Show this help message"
|
||||
echo " -e, --export-options Set the NFS export options"
|
||||
|
||||
}
|
||||
|
||||
# Parse arguments
|
||||
while [[ $# -gt 0 ]]; do
|
||||
case $1 in
|
||||
-h|--help)
|
||||
usage
|
||||
exit 0
|
||||
;;
|
||||
-e|--export-options)
|
||||
if [[ -z "$2" ]]; then
|
||||
echo "Error: --export-options requires a value"
|
||||
exit 1
|
||||
else
|
||||
NFS_EXPORT_OPTIONS="$2"
|
||||
fi
|
||||
shift 2
|
||||
;;
|
||||
-*)
|
||||
echo "Unknown option $1"
|
||||
usage
|
||||
exit 1
|
||||
;;
|
||||
*)
|
||||
# First non-option argument is server
|
||||
if [[ -z "$NFS_HOST" ]]; then
|
||||
export NFS_HOST="$1"
|
||||
# Second non-option argument is media path
|
||||
elif [[ -z "$NFS_MEDIA_PATH" ]]; then
|
||||
export NFS_MEDIA_PATH="$1"
|
||||
else
|
||||
echo "Too many arguments"
|
||||
usage
|
||||
exit 1
|
||||
fi
|
||||
shift
|
||||
;;
|
||||
esac
|
||||
done
|
||||
|
||||
echo "Setting up NFS server on this host..."
|
||||
|
||||
# Check if required NFS variables are configured
|
||||
if [[ -z "${NFS_HOST}" ]]; then
|
||||
echo "NFS_HOST not set. Please set NFS_HOST=<hostname> in your environment"
|
||||
echo "Example: export NFS_HOST=box-01"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Ensure NFS_MEDIA_PATH is explicitly set
|
||||
if [[ -z "${NFS_MEDIA_PATH}" ]]; then
|
||||
echo "Error: NFS_MEDIA_PATH not set. Please set it in your environment"
|
||||
echo "Example: export NFS_MEDIA_PATH=/data/media"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Set default for NFS_EXPORT_OPTIONS if not already set
|
||||
if [[ -z "${NFS_EXPORT_OPTIONS}" ]]; then
|
||||
export NFS_EXPORT_OPTIONS="*(rw,sync,no_subtree_check,no_root_squash)"
|
||||
echo "Using default NFS_EXPORT_OPTIONS: ${NFS_EXPORT_OPTIONS}"
|
||||
fi
|
||||
|
||||
echo "Target NFS host: ${NFS_HOST}"
|
||||
echo "Media path: ${NFS_MEDIA_PATH}"
|
||||
echo "Export options: ${NFS_EXPORT_OPTIONS}"
|
||||
|
||||
# Function to check if we're running on the correct host
|
||||
check_host() {
|
||||
local current_hostname=$(hostname)
|
||||
if [[ "${current_hostname}" != "${NFS_HOST}" ]]; then
|
||||
echo "Warning: Current host (${current_hostname}) differs from NFS_HOST (${NFS_HOST})"
|
||||
echo "This script should be run on ${NFS_HOST}"
|
||||
read -p "Continue anyway? (y/N): " -n 1 -r
|
||||
echo
|
||||
if [[ ! $REPLY =~ ^[Yy]$ ]]; then
|
||||
exit 1
|
||||
fi
|
||||
fi
|
||||
}
|
||||
|
||||
# Function to install NFS server and SMB/CIFS
|
||||
install_nfs_server() {
|
||||
echo "Installing NFS server and SMB/CIFS packages..."
|
||||
|
||||
# Detect package manager and install NFS server + Samba
|
||||
if command -v apt-get >/dev/null 2>&1; then
|
||||
# Debian/Ubuntu
|
||||
sudo apt-get update
|
||||
sudo apt-get install -y nfs-kernel-server nfs-common samba samba-common-bin
|
||||
elif command -v yum >/dev/null 2>&1; then
|
||||
# RHEL/CentOS
|
||||
sudo yum install -y nfs-utils samba samba-client
|
||||
elif command -v dnf >/dev/null 2>&1; then
|
||||
# Fedora
|
||||
sudo dnf install -y nfs-utils samba samba-client
|
||||
else
|
||||
echo "Error: Unable to detect package manager. Please install NFS server and Samba manually."
|
||||
exit 1
|
||||
fi
|
||||
}
|
||||
|
||||
# Function to create media directory
|
||||
create_media_directory() {
|
||||
echo "Creating media directory: ${NFS_MEDIA_PATH}"
|
||||
|
||||
# Create directory if it doesn't exist
|
||||
sudo mkdir -p "${NFS_MEDIA_PATH}"
|
||||
|
||||
# Set appropriate permissions
|
||||
# Using 755 for directory, allowing read/execute for all, write for owner
|
||||
sudo chmod 755 "${NFS_MEDIA_PATH}"
|
||||
|
||||
echo "Media directory created with appropriate permissions"
|
||||
echo "Directory info:"
|
||||
ls -la "${NFS_MEDIA_PATH}/"
|
||||
}
|
||||
|
||||
# Function to configure NFS exports
|
||||
configure_nfs_exports() {
|
||||
echo "Configuring NFS exports..."
|
||||
|
||||
local export_line="${NFS_MEDIA_PATH} ${NFS_EXPORT_OPTIONS}"
|
||||
local exports_file="/etc/exports"
|
||||
|
||||
# Backup existing exports file
|
||||
sudo cp "${exports_file}" "${exports_file}.backup.$(date +%Y%m%d-%H%M%S)" 2>/dev/null || true
|
||||
|
||||
# Check if export already exists
|
||||
if sudo grep -q "^${NFS_MEDIA_PATH}" "${exports_file}" 2>/dev/null; then
|
||||
echo "Export for ${NFS_MEDIA_PATH} already exists, updating..."
|
||||
sudo sed -i "s|^${NFS_MEDIA_PATH}.*|${export_line}|" "${exports_file}"
|
||||
else
|
||||
echo "Adding new export for ${NFS_MEDIA_PATH}..."
|
||||
echo "${export_line}" | sudo tee -a "${exports_file}"
|
||||
fi
|
||||
|
||||
# Export the filesystems
|
||||
sudo exportfs -rav
|
||||
|
||||
echo "NFS exports configured:"
|
||||
sudo exportfs -v
|
||||
}
|
||||
|
||||
# Function to start and enable NFS services
|
||||
start_nfs_services() {
|
||||
echo "Starting NFS services..."
|
||||
|
||||
# Start and enable NFS server
|
||||
sudo systemctl enable nfs-server
|
||||
sudo systemctl start nfs-server
|
||||
|
||||
# Also enable related services
|
||||
sudo systemctl enable rpcbind
|
||||
sudo systemctl start rpcbind
|
||||
|
||||
echo "NFS services started and enabled"
|
||||
|
||||
# Show service status
|
||||
sudo systemctl status nfs-server --no-pager --lines=5
|
||||
}
|
||||
|
||||
# Function to configure SMB/CIFS sharing
|
||||
configure_smb_sharing() {
|
||||
echo "Configuring SMB/CIFS sharing..."
|
||||
|
||||
local smb_config="/etc/samba/smb.conf"
|
||||
local share_name="media"
|
||||
|
||||
# Backup existing config
|
||||
sudo cp "${smb_config}" "${smb_config}.backup.$(date +%Y%m%d-%H%M%S)" 2>/dev/null || true
|
||||
|
||||
# Check if share already exists
|
||||
if sudo grep -q "^\[${share_name}\]" "${smb_config}" 2>/dev/null; then
|
||||
echo "SMB share '${share_name}' already exists, updating..."
|
||||
# Remove existing share section
|
||||
sudo sed -i "/^\[${share_name}\]/,/^\[/{ /^\[${share_name}\]/d; /^\[/!d; }" "${smb_config}"
|
||||
fi
|
||||
|
||||
# Add media share configuration
|
||||
cat << EOF | sudo tee -a "${smb_config}"
|
||||
|
||||
[${share_name}]
|
||||
comment = Media files for Wild Cloud
|
||||
path = ${NFS_MEDIA_PATH}
|
||||
browseable = yes
|
||||
read only = no
|
||||
guest ok = yes
|
||||
create mask = 0664
|
||||
directory mask = 0775
|
||||
force user = $(whoami)
|
||||
force group = $(whoami)
|
||||
EOF
|
||||
|
||||
echo "SMB share configuration added"
|
||||
|
||||
# Test configuration
|
||||
if sudo testparm -s >/dev/null 2>&1; then
|
||||
echo "✓ SMB configuration is valid"
|
||||
else
|
||||
echo "✗ SMB configuration has errors"
|
||||
sudo testparm
|
||||
exit 1
|
||||
fi
|
||||
}
|
||||
|
||||
# Function to start SMB services
|
||||
start_smb_services() {
|
||||
echo "Starting SMB services..."
|
||||
|
||||
# Enable and start Samba services
|
||||
sudo systemctl enable smbd
|
||||
sudo systemctl start smbd
|
||||
sudo systemctl enable nmbd
|
||||
sudo systemctl start nmbd
|
||||
|
||||
echo "SMB services started and enabled"
|
||||
|
||||
# Show service status
|
||||
sudo systemctl status smbd --no-pager --lines=3
|
||||
}
|
||||
|
||||
# Function to test NFS setup
|
||||
test_nfs_setup() {
|
||||
echo "Testing NFS setup..."
|
||||
|
||||
# Test if NFS is responding
|
||||
if command -v showmount >/dev/null 2>&1; then
|
||||
echo "Available NFS exports:"
|
||||
showmount -e localhost || echo "Warning: showmount failed, but NFS may still be working"
|
||||
fi
|
||||
|
||||
# Check if the export directory is accessible
|
||||
if [[ -d "${NFS_MEDIA_PATH}" ]]; then
|
||||
echo "✓ Media directory exists and is accessible"
|
||||
else
|
||||
echo "✗ Media directory not accessible"
|
||||
exit 1
|
||||
fi
|
||||
}
|
||||
|
||||
# Function to show usage instructions
|
||||
show_usage_instructions() {
|
||||
echo
|
||||
echo "=== NFS/SMB Host Setup Complete ==="
|
||||
echo
|
||||
echo "NFS and SMB servers are now running on this host with media directory: ${NFS_MEDIA_PATH}"
|
||||
echo
|
||||
echo "Access methods:"
|
||||
echo "1. NFS (for Kubernetes): Use setup-nfs-k8s.sh to register with cluster"
|
||||
echo "2. SMB/CIFS (for Windows): \\\\${NFS_HOST}\\media"
|
||||
echo
|
||||
echo "To add media files:"
|
||||
echo "- Copy directly to: ${NFS_MEDIA_PATH}"
|
||||
echo "- Or mount SMB share from Windows and copy there"
|
||||
echo
|
||||
echo "Windows SMB mount:"
|
||||
echo "- Open File Explorer"
|
||||
echo "- Map network drive to: \\\\${NFS_HOST}\\media"
|
||||
echo "- Or use: \\\\$(hostname -I | awk '{print $1}')\\media"
|
||||
echo
|
||||
echo "To verify services:"
|
||||
echo "- NFS: showmount -e ${NFS_HOST}"
|
||||
echo "- SMB: smbclient -L ${NFS_HOST} -N"
|
||||
echo "- Status: systemctl status nfs-server smbd"
|
||||
echo
|
||||
echo "Current NFS exports:"
|
||||
sudo exportfs -v
|
||||
echo
|
||||
}
|
||||
|
||||
# Main execution
|
||||
main() {
|
||||
check_host
|
||||
install_nfs_server
|
||||
create_media_directory
|
||||
configure_nfs_exports
|
||||
start_nfs_services
|
||||
configure_smb_sharing
|
||||
start_smb_services
|
||||
test_nfs_setup
|
||||
show_usage_instructions
|
||||
}
|
||||
|
||||
# Run main function
|
||||
main "$@"
|
||||
21
internal/setup/cluster-services/nfs/wild-manifest.yaml
Normal file
21
internal/setup/cluster-services/nfs/wild-manifest.yaml
Normal file
@@ -0,0 +1,21 @@
|
||||
name: nfs
|
||||
description: NFS client provisioner for external NFS storage
|
||||
namespace: nfs-system
|
||||
category: infrastructure
|
||||
|
||||
serviceConfig:
|
||||
nfsHost:
|
||||
path: cloud.nfs.host
|
||||
prompt: "Enter NFS server hostname or IP address"
|
||||
default: "192.168.1.100"
|
||||
type: string
|
||||
mediaPath:
|
||||
path: cloud.nfs.mediaPath
|
||||
prompt: "Enter NFS export path for media storage"
|
||||
default: "/mnt/storage/media"
|
||||
type: string
|
||||
storageCapacity:
|
||||
path: cloud.nfs.storageCapacity
|
||||
prompt: "Enter NFS storage capacity (e.g., 1Ti, 500Gi)"
|
||||
default: "1Ti"
|
||||
type: string
|
||||
Reference in New Issue
Block a user