From 21c2bc4e2feb307c0c3ac4bbba03052430671ca7 Mon Sep 17 00:00:00 2001 From: Martin Date: Tue, 31 Mar 2026 11:51:56 +0200 Subject: [PATCH] feat(nfs): support multiple configurable NFS shares with folder/network/read_only options --- nfs/config.json | 24 ++++++++++++++++++++---- nfs/run.sh | 32 ++++++++++++++++++++++++++------ 2 files changed, 46 insertions(+), 10 deletions(-) diff --git a/nfs/config.json b/nfs/config.json index 8fd17b9..2ffcaa9 100644 --- a/nfs/config.json +++ b/nfs/config.json @@ -1,6 +1,6 @@ { "name": "NFS Server", - "version": "1.0.1", + "version": "1.0.3", "slug": "nfs_server", "description": "Expose Home Assistant media folder via NFS.", "arch": [ @@ -16,15 +16,31 @@ "SYS_ADMIN" ], "apparmor": false, + "hassio_api": true, "kernel_modules": true, "map": [ - "media:rw" + "media:rw", + "share:rw", + "config:ro", + "backup:ro" ], "options": { - "allowed_network": "192.168.1.0/24" + "shares": [ + { + "folder": "media", + "allowed_network": "192.168.1.0/24", + "read_only": false + } + ] }, "schema": { - "allowed_network": "str" + "shares": [ + { + "folder": "str", + "allowed_network": "str", + "read_only": "bool" + } + ] }, "build_from": { "amd64": "ghcr.io/home-assistant/amd64-base:latest", diff --git a/nfs/run.sh b/nfs/run.sh index c05594e..2b384de 100644 --- a/nfs/run.sh +++ b/nfs/run.sh @@ -1,17 +1,37 @@ #!/usr/bin/env bashio -# Read config -NETWORK=$(bashio::config 'allowed_network') +# Build /etc/exports from configured shares +bashio::log.info "Configuring NFS exports..." +> /etc/exports + +for index in $(bashio::config 'shares|keys[]'); do + FOLDER=$(bashio::config "shares[${index}].folder") + NETWORK=$(bashio::config "shares[${index}].allowed_network") + READ_ONLY=$(bashio::config "shares[${index}].read_only") + MOUNT_PATH="/${FOLDER}" + + if bashio::var.true "${READ_ONLY}"; then + OPTIONS="ro,sync,no_subtree_check,no_root_squash" + else + OPTIONS="rw,sync,no_subtree_check,no_root_squash" + fi + + bashio::log.info "Exporting ${MOUNT_PATH} to ${NETWORK} (${OPTIONS})..." + echo "${MOUNT_PATH} ${NETWORK}(${OPTIONS})" >> /etc/exports +done -# Setup exports -bashio::log.info "Exporting /media folder to ${NETWORK}..." -echo "/media ${NETWORK}(rw,sync,no_subtree_check,no_root_squash)" > /etc/exports cat /etc/exports # Load NFS kernel module bashio::log.info "Loading nfsd kernel module..." modprobe nfsd 2>/dev/null || bashio::log.warning "nfsd module not available, assuming built-in..." +# Mount nfsd filesystem if not already mounted +if ! mountpoint -q /proc/fs/nfsd 2>/dev/null; then + bashio::log.info "Mounting nfsd filesystem..." + mount -t nfsd nfsd /proc/fs/nfsd || bashio::log.warning "Could not mount nfsd filesystem, it may be built-in..." +fi + # Start NFS services bashio::log.info "Starting NFS services..." rpcbind @@ -24,4 +44,4 @@ rpc.statd & rpc.nfsd # Start rpc.mountd in the foreground to keep the container running -exec rpc.mountd --no-udp -F \ No newline at end of file +exec rpc.mountd --no-udp -F