#!/bin/bash # Default configuration values for NAS setup script # Script metadata SCRIPT_VERSION="2.1.0" SCRIPT_NAME="NAS Setup Script" SCRIPT_AUTHOR="Sebastian Palencsár" # Directories and files LOG_FILE="/var/log/nas_setup.log" CONFIG_FILE="/etc/nas_setup.conf" ROLLBACK_FILE="/tmp/nas_setup_rollback.sh" TEMP_DIR="/tmp/nas_setup" # User configuration NEW_USER="nasadmin" DEFAULT_USER="nas_user" # Network configuration NETWORK_INTERFACE="eth0" DEFAULT_SSH_PORT=39000 # Service configurations SAMBA_CONFIG="/etc/samba/smb.conf" NFS_EXPORT_DIR="/srv/nfs" NETDATA_PORT="19999" # Docker configuration DEFAULT_DOCKER_DATA_DIR="/var/lib/docker" DOCKER_COMPOSE_VERSION="2.30.0" # Application data directories VAULTWARDEN_DATA_DIR="/opt/vaultwarden" JELLYFIN_DATA_DIR="/var/lib/jellyfin" PORTAINER_DATA_DIR="/opt/portainer" # System requirements MIN_DISK_SPACE_GB=30 MIN_RAM_MB=2048 RECOMMENDED_RAM_MB=4096 # Security settings ENABLE_FAIL2BAN=true ENABLE_UFW=true ENABLE_AUTO_UPDATES=true SECURE_SSH=true # Debug and logging DEBUG=${DEBUG:-false} LOG_LEVEL=${LOG_LEVEL:-"INFO"} ENABLE_PROGRESS_BAR=true # Colors for output RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[0;33m' BLUE='\033[0;34m' MAGENTA='\033[0;35m' CYAN='\033[0;36m' WHITE='\033[0;37m' BOLD='\033[1m' NC='\033[0m' # No Color # Supported distributions SUPPORTED_DISTROS=("ubuntu" "debian" "fedora" "arch" "opensuse") # Get package manager for distribution get_package_manager() { local distro="$1" case "$distro" in ubuntu|debian) echo "apt-get" ;; fedora) echo "dnf" ;; arch) echo "pacman" ;; opensuse) echo "zypper" ;; *) echo "unknown" ;; esac } # Get update command for distribution get_update_command() { local distro="$1" case "$distro" in ubuntu|debian) echo "apt-get update && apt-get upgrade -y" ;; fedora) echo "dnf update -y" ;; arch) echo "pacman -Syu --noconfirm" ;; opensuse) echo "zypper refresh && zypper update -y" ;; *) echo "unknown" ;; esac } # Get service port for service get_service_port() { local service="$1" case "$service" in ssh) echo "${DEFAULT_SSH_PORT}" ;; samba) echo "139,445" ;; nfs) echo "2049" ;; netdata) echo "${NETDATA_PORT}" ;; vaultwarden) echo "8080" ;; jellyfin) echo "8096" ;; portainer) echo "9000" ;; docker) echo "2375,2376" ;; *) echo "unknown" ;; esac } # Default firewall rules FIREWALL_RULES=( "allow ${DEFAULT_SSH_PORT}/tcp comment 'SSH'" "allow from any to any port 139,138 proto udp comment 'Samba'" "allow from any to any port 139,445 proto tcp comment 'Samba'" "allow 2049/tcp comment 'NFS'" "allow ${NETDATA_PORT}/tcp comment 'Netdata'" ) # Feature flags - can be overridden by user config INSTALL_DOCKER=${INSTALL_DOCKER:-false} INSTALL_NFS=${INSTALL_NFS:-false} INSTALL_NETDATA=${INSTALL_NETDATA:-false} INSTALL_VAULTWARDEN=${INSTALL_VAULTWARDEN:-false} INSTALL_JELLYFIN=${INSTALL_JELLYFIN:-false} INSTALL_PORTAINER=${INSTALL_PORTAINER:-false} # Configuration validation validate_config() { local errors=0 # Validate SSH port if ! validate_port "${DEFAULT_SSH_PORT}"; then log_error "Invalid SSH port: ${DEFAULT_SSH_PORT}" ((errors++)) fi # Validate user names if ! validate_username "${NEW_USER}"; then log_error "Invalid username: ${NEW_USER}" ((errors++)) fi # Validate directories for dir in "${VAULTWARDEN_DATA_DIR}" "${JELLYFIN_DATA_DIR}" "${PORTAINER_DATA_DIR}"; do if ! validate_path "${dir}"; then log_error "Invalid directory path: ${dir}" ((errors++)) fi done return $errors }