Cleaned up the script. Fixed bugs. Added services. Categorized services.
This commit is contained in:
+40
-3
@@ -30,6 +30,43 @@ export NETWORK_ROUTER_IP="192.168.1.1"
|
||||
export HOME_SERVER_IP="192.168.1.5"
|
||||
|
||||
# SERVICES SETTINGS
|
||||
export SELECTED_DNS_SERVICE="pi-hole" # or adguard
|
||||
export SELECTED_SERVICES=( "frigate" "gitea" "home-assistant" "immich" "it-tools" \
|
||||
"nextcloud" "passbolt" "clamav" "virtualization" )
|
||||
export SELECTED_DNS_SERVICE=(
|
||||
"pi-hole" # or adguard
|
||||
)
|
||||
export SELECTED_WEB_APPLICATIONS=(
|
||||
"crafty"
|
||||
"frigate"
|
||||
"gitea"
|
||||
"home-assistant"
|
||||
"immich"
|
||||
"it-tools"
|
||||
"jellyfin"
|
||||
"netbootxyz"
|
||||
"nextcloud"
|
||||
"passbolt"
|
||||
"uptime-kuma"
|
||||
"vscodium"
|
||||
)
|
||||
export SELECTED_SYSTEM_SERVICES=(
|
||||
"clamav"
|
||||
"virtualization"
|
||||
)
|
||||
|
||||
# OPTIONAL SETTINGS
|
||||
export SELECTED_DNS_SERVICE_SUBDOMAIN=(
|
||||
"my-pi-hole-subdomain" # or "my-adguard-subdomain"
|
||||
)
|
||||
export SELECTED_WEB_APPLICATIONS_SUBDOMAIN=( # ⚠️ Must match SELECTED_WEB_APPLICATIONS order ⚠️
|
||||
"my-crafty-subdomain"
|
||||
"my-frigate-subdomain"
|
||||
"my-gitea-subdomain"
|
||||
"my-home-assistant-subdomain"
|
||||
"my-immich-subdomain"
|
||||
"my-it-tools-subdomain"
|
||||
"my-jellyfin-subdomain"
|
||||
"my-netbootxyz-subdomain"
|
||||
"my-nextcloud-subdomain"
|
||||
"my-passbolt-subdomain"
|
||||
"my-uptime-kuma-subdomain"
|
||||
"my-vscodium-subdomain"
|
||||
)
|
||||
@@ -7,12 +7,82 @@ export GUM_SPIN_SPINNER_BOLD=true
|
||||
export GUM_SPIN_SHOW_ERROR=true
|
||||
export GUM_SPIN_TITLE_BOLD=true
|
||||
|
||||
NECESSARY_VARIABLES_LIST=( LIVE_TARGET_IP LIVE_TARGET_PASSWD \
|
||||
TIMEZONE LANGUAGE LOCALE SERVER_OWNER_NAME SERVER_USER_EMAIL SERVER_ADMIN_EMAIL AUTHORIZED_SSH_PUBLIC_KEY \
|
||||
DOMAIN_NAME CLOUDFLARE_DNS_API_TOKEN \
|
||||
SMTP_SERVER_USERNAME SMTP_SERVER_PASSWORD SMTP_SERVER_HOST SMTP_SERVER_PORT \
|
||||
NETWORK_SUBNET NETWORK_ROUTER_IP HOME_SERVER_IP)
|
||||
NECESSARY_VARIABLES_LIST=(
|
||||
#LIVE TARGET SETTINGS
|
||||
LIVE_TARGET_IP
|
||||
LIVE_TARGET_PASSWD
|
||||
#SERVER SETTINGS
|
||||
LANGUAGE
|
||||
LOCALE
|
||||
TIMEZONE
|
||||
SERVER_OWNER_NAME
|
||||
SERVER_USER_EMAIL
|
||||
SERVER_ADMIN_EMAIL
|
||||
AUTHORIZED_SSH_PUBLIC_KEY
|
||||
# TRAEFIK SETTINGS
|
||||
DOMAIN_NAME
|
||||
CLOUDFLARE_DNS_API_TOKEN
|
||||
# SMTP SETTINGS
|
||||
SMTP_SERVER_USERNAME
|
||||
SMTP_SERVER_PASSWORD
|
||||
SMTP_SERVER_HOST
|
||||
SMTP_SERVER_PORT
|
||||
#NETWORK SETTINGS
|
||||
NETWORK_SUBNET
|
||||
NETWORK_ROUTER_IP
|
||||
HOME_SERVER_IP
|
||||
# SERVICES SETTINGS
|
||||
SELECTED_DNS_SERVICE
|
||||
SELECTED_WEB_APPLICATIONS
|
||||
SELECTED_SYSTEM_SERVICES
|
||||
)
|
||||
|
||||
# Available services
|
||||
DNS_SERVICES_LIST=(
|
||||
"pi-hole"
|
||||
"adguard"
|
||||
)
|
||||
WEB_APPLICATIONS_LIST=(
|
||||
"crafty"
|
||||
"frigate"
|
||||
"gitea"
|
||||
"home-assistant"
|
||||
"immich"
|
||||
"it-tools"
|
||||
"jellyfin"
|
||||
"netbootxyz"
|
||||
"nextcloud"
|
||||
"passbolt"
|
||||
"uptime-kuma"
|
||||
"vscodium"
|
||||
)
|
||||
SYSTEM_SERVICES_LIST=(
|
||||
"clamav"
|
||||
"virtualization"
|
||||
)
|
||||
# Services descriptions
|
||||
DNS_SERVICES_DESCRIPTION=(
|
||||
"Pi-Hole : Simple open-source DNS black hole"
|
||||
"AdGuard : Feature rich DNS service"
|
||||
)
|
||||
WEB_APPLICATIONS_DESCRIPTION=(
|
||||
"Crafty : A web-based control panel for Minecraft servers"
|
||||
"Frigate [Home Assistant required] : AI-powered NVR for smart security cameras"
|
||||
"Gitea : A lightweight, self-hosted Git service like GitHub"
|
||||
"Home-Assistant : Open-source home automation to control all your devices"
|
||||
"Immich : Self-hosted Google Photos alternative for photos and videos"
|
||||
"IT-tools : Handy collection of online tools for developers"
|
||||
"Jellyfin : A self-hosted media server to stream your movies and music"
|
||||
"netboot.xyz : PXE boot various OS installers and utilities"
|
||||
"Nextcloud : A self-hosted productivity platform, like Google Drive & Office"
|
||||
"Passbolt: An open-source, security-first password manager for teams"
|
||||
"Uptime-Kuma : A fancy self-hosted monitoring tool"
|
||||
"VSCodium : Run VS Code in your browser, accessible anywhere"
|
||||
)
|
||||
SYSTEM_SERVICES_DESCRIPTION=(
|
||||
"ClamAV : An open-source anti-virus"
|
||||
"Virtualization : Run Virtual Machines (KVM/QEMU) with Libvirt"
|
||||
)
|
||||
### Default settings <--
|
||||
|
||||
user_input() {
|
||||
@@ -265,56 +335,40 @@ SSHEND
|
||||
}
|
||||
|
||||
services_selection() {
|
||||
services_choice() {
|
||||
local SERVICES_LIST=( "${1[@]}" )
|
||||
local SERVICES_DESCRIPTION=( "${2[@]}" )
|
||||
local FINAL_VARIABLE="${3}"
|
||||
local HEADER="${4}"
|
||||
local LIMIT="${5:---no-limit}"
|
||||
|
||||
local SELECTED_SERVICES=()
|
||||
local SELECTED_SERVICES_DESCRIPTION=()
|
||||
|
||||
local SELECTED_SERVICES_DESCRIPTION=$(gum choose ${LIMIT} --header "${HEADER}" "${SERVICES_DESCRIPTION[@]}")
|
||||
|
||||
for i in ${!SERVICES_LIST[@]}; do
|
||||
if printf '%s' "${SELECTED_SERVICES_DESCRIPTION}" | grep -iq "${SERVICES_LIST[${i}]}"; then
|
||||
SELECTED_SERVICES+=("${SERVICES_LIST[${i}]}")
|
||||
fi
|
||||
done
|
||||
|
||||
export "${FINAL_VARIABLE}=(${SELECTED_SERVICES[@]})"
|
||||
}
|
||||
|
||||
echo -e "\n\n ➡️ You will now select the services you want installed on your server:"
|
||||
|
||||
local AVAILABLE_DNS_SERVICES=( "pi-hole" "adguard" )
|
||||
|
||||
local AVAILABLE_SERVICES=( "frigate" "gitea" "home-assistant" "immich" "it-tools" \
|
||||
"nextcloud" "passbolt" "clamav" "virtualization" )
|
||||
|
||||
local DNS_SERVICES_DESCRIPTION=( "Pi-Hole : Simple open-source DNS black hole" \
|
||||
"AdGuard " : Feature rich DNS service )
|
||||
|
||||
local SERVICES_DESCRIPTION=( "Immich : Pictures and videos backup with local machine-learning" \
|
||||
"Nextcloud : No fuss Office 365 replacement" \
|
||||
"Passbolt: Security-first password manager with collaboration features" \
|
||||
"Home-Assistant : Manage your smart home and security cameras" \
|
||||
"Frigate [Home Assistant required] : Secure your house with security cameras" \
|
||||
"Gitea : Your own git platform" \
|
||||
"IT-tools : A set of useful tools when doing IT" \
|
||||
"ClamAV : An open-source anti-virus"
|
||||
"Virtualization : Run Virtual Machines (KVM/QEMU) with Libvirt" )
|
||||
|
||||
SELECTED_SERVICES=()
|
||||
local SELECTED_SERVICES_DESCRIPTION=$(gum choose --no-limit --header "Homelab services:" "${SERVICES_DESCRIPTION[@]}")
|
||||
|
||||
SELECTED_DNS_SERVICE=""
|
||||
local SELECTED_DNS_SERVICE_DESCRIPTION=$(gum choose --limit 1 --header "Homelab services:" "${DNS_SERVICES_DESCRIPTION[@]}")
|
||||
|
||||
for i in ${!AVAILABLE_SERVICES[@]}; do
|
||||
if printf '%s' "${SELECTED_SERVICES_DESCRIPTION}" | grep -iq "${AVAILABLE_SERVICES[${i}]}"; then
|
||||
SELECTED_SERVICES+=("${AVAILABLE_SERVICES[${i}]}")
|
||||
fi
|
||||
done
|
||||
|
||||
for i in ${!AVAILABLE_DNS_SERVICES[@]}; do
|
||||
if printf '%s' "${SELECTED_DNS_SERVICE_DESCRIPTION}" | grep -iq "${AVAILABLE_DNS_SERVICES[${i}]}"; then
|
||||
SELECTED_DNS_SERVICE="${AVAILABLE_DNS_SERVICES[${i}]}"
|
||||
fi
|
||||
done
|
||||
|
||||
export SELECTED_SERVICES
|
||||
export SELECTED_DNS_SERVICE
|
||||
services_choice "${DNS_SERVICES_LIST[@]}" "${DNS_SERVICES_DESCRIPTION[@]}" "SELECTED_DNS_SERVICE" "Choose your preferred DNS service :" "--limit=1"
|
||||
services_choice "${WEB_APPLICATIONS_LIST[@]}" "${WEB_APPLICATIONS_DESCRIPTION[@]}" "SELECTED_WEB_APPLICATIONS" "Choose the web applications you want to install :"
|
||||
services_choice "${SYSTEM_SERVICES_LIST[@]}" "${SYSTEM_SERVICES_DESCRIPTION[@]}" "SELECTED_SYSTEM_SERVICES" "Choose the system services you want to install :"
|
||||
|
||||
gum confirm "Do you want to edit the default subdomain of your services ?" || { echo -e "\n\n✅ Continuing..."; return 0; }
|
||||
|
||||
for service in ${!SELECTED_SERVICES[@]} $SELECTED_DNS_SERVICE; do
|
||||
local HEADER="Please provide the desired subdomain for ${service}:"
|
||||
local PLACEHOLDER="${service}"
|
||||
SELECTED_SERVICES_SUBDOMAIN+=("$(gum input --placeholder "${PLACEHOLDER}" --header "${HEADER}")")
|
||||
for service in ${SELECTED_WEB_APPLICATIONS[@]} ${SELECTED_DNS_SERVICE[@]}; do
|
||||
SELECTED_WEB_APPLICATIONS_SUBDOMAIN+=( "$(gum input --placeholder "${service}" --header "Please provide the desired subdomain for ${service}:")" )
|
||||
done
|
||||
|
||||
export SELECTED_SERVICES_SUBDOMAIN
|
||||
export SELECTED_WEB_APPLICATIONS_SUBDOMAIN
|
||||
}
|
||||
|
||||
disks_selection() {
|
||||
@@ -414,20 +468,22 @@ network_config_generation() {
|
||||
|
||||
services_config_generation() {
|
||||
echo -e "\n # DNS settings" >> ${CONFIGURATION_PATH}
|
||||
echo -e " numbus.services.dns = \"${SELECTED_DNS_SERVICE}\";" >> ${CONFIGURATION_PATH}
|
||||
echo -e " numbus.services.${SELECTED_DNS_SERVICE}.enable = true;" >> ${CONFIGURATION_PATH}
|
||||
echo -e " numbus.services.dns = \"${SELECTED_DNS_SERVICE[0]}\";" >> ${CONFIGURATION_PATH}
|
||||
echo -e " numbus.services.${SELECTED_DNS_SERVICE[0]}.enable = true;" >> ${CONFIGURATION_PATH}
|
||||
|
||||
echo -e "\n # Services settings" >> ${CONFIGURATION_PATH}
|
||||
echo -e " numbus.services.domain = \"${DOMAIN_NAME}\";" >> ${CONFIGURATION_PATH}
|
||||
i=0
|
||||
for service in "${SELECTED_SERVICES[@]}"; do
|
||||
[[ "${SELECTED_SERVICES_SUBDOMAIN+x:-false}" ]] && echo -e " numbus.services.${service}.enable.subdomain = \"${SELECTED_SERVICES_SUBDOMAIN[${i}]}\";" >> ${CONFIGURATION_PATH}
|
||||
if [[ -v SELECTED_WEB_APPLICATIONS_SUBDOMAIN && -n "${SELECTED_WEB_APPLICATIONS_SUBDOMAIN[${i}]}" ]]; then
|
||||
echo -e " numbus.services.${service}.enable.subdomain = \"${SELECTED_WEB_APPLICATIONS_SUBDOMAIN[${i}]}\";" >> ${CONFIGURATION_PATH}
|
||||
fi
|
||||
echo -e " numbus.services.${service}.enable = true;" >> ${CONFIGURATION_PATH}
|
||||
i=$((i + 1))
|
||||
done
|
||||
|
||||
if [[ "${SELECTED_SERVICES_SUBDOMAIN+x:-false}" && -n "$SELECTED_DNS_SERVICE" && -n "${SELECTED_SERVICES_SUBDOMAIN[${i}]}" ]]; then
|
||||
echo -e " numbus.services.${SELECTED_DNS_SERVICE}.enable.subdomain = \"${SELECTED_SERVICES_SUBDOMAIN[${i}]}\";" >> ${CONFIGURATION_PATH}
|
||||
if [[ -v SELECTED_WEB_APPLICATIONS_SUBDOMAIN && -n "$SELECTED_DNS_SERVICE" && -n "${SELECTED_WEB_APPLICATIONS_SUBDOMAIN[${i}]}" ]]; then
|
||||
echo -e " numbus.services.${SELECTED_DNS_SERVICE}.enable.subdomain = \"${SELECTED_WEB_APPLICATIONS_SUBDOMAIN[${i}]}\";" >> ${CONFIGURATION_PATH}
|
||||
fi
|
||||
|
||||
if [[ "${TARGET_GRAPHICS_RENDERER}" == "true" ]]; then
|
||||
@@ -541,15 +597,13 @@ Please review the selected disk layout before proceeding.
|
||||
|
||||
**Boot Disks (${#BOOT_DISKS_ID_LIST[@]}):**
|
||||
* **Boot 1:** \`${BOOT_DISKS_ID_LIST[0]}\`
|
||||
$( [[ -n "${BOOT_DISKS_ID_LIST[1]:-}" ]] && echo "* **Boot 2:** \`${BOOT_DISKS_ID_LIST[1]}\`" || echo "* **Boot 2:** *Not configured*" )
|
||||
|
||||
$( [[ -n "${BOOT_DISKS_ID_LIST[1]:-}" ]] && echo "* **Boot 2:** \`${BOOT_DISKS_ID_LIST[1]}\`" || echo "* **Boot 2:** *Not configured*" && echo "" )
|
||||
**Data Disks ($CONTENT_DISK_NUMBER):**
|
||||
$( j=1 && for i in $(seq 0 $(($CONTENT_DISK_NUMBER - 1))); do echo "* **Data ${j}:** \`${DATA_DISKS_ID[${i}]}\`" && j=$((j + 1)); done )
|
||||
$( [[ $CONTENT_DISK_NUMBER -eq 0 ]] && echo "* *Not configured*" )
|
||||
|
||||
$( j=1 && for i in $(seq 0 $(($CONTENT_DISK_NUMBER - 1))); do echo "* **Data ${j}:** \`${DATA_DISKS_ID[${i}]}\`" && j=$((j + 1)); done && echo "" )
|
||||
$( [[ $CONTENT_DISK_NUMBER -eq 0 ]] && echo "* *Not configured*" && echo "" )
|
||||
**Parity Disks ($PARITY_DISK_NUMBER):**
|
||||
$( [[ $PARITY_DISK_NUMBER -gt 0 ]] && j=1 && for i in $(seq $CONTENT_DISK_NUMBER $((${#DATA_DISKS_ID[@]} - 1))); do echo "* **Parity ${j}:** \`${DATA_DISKS_ID[${i}]}\`" && j=$((j + 1)); done )
|
||||
$( [[ $PARITY_DISK_NUMBER -eq 0 ]] && echo "* *Not configured*" )
|
||||
$( [[ $PARITY_DISK_NUMBER -gt 0 ]] && j=1 && for i in $(seq $CONTENT_DISK_NUMBER $((${#DATA_DISKS_ID[@]} - 1))); do echo "* **Parity ${j}:** \`${DATA_DISKS_ID[${i}]}\`" && j=$((j + 1)); done && echo "" )
|
||||
$( [[ $PARITY_DISK_NUMBER -eq 0 ]] && echo "* *Not configured*" && echo "" )
|
||||
EOF
|
||||
)
|
||||
|
||||
@@ -561,12 +615,15 @@ EOF
|
||||
|
||||
Please review the selected services before proceeding.
|
||||
|
||||
**DNS Service:**
|
||||
$(echo "\`${SELECTED_DNS_SERVICE^}\`" && echo "")
|
||||
**Services:**
|
||||
$(for service in ${AVAILABLE_SERVICES[@]}`; do echo "\`${service^}\`" && echo ""; done)
|
||||
**DNS Service :**
|
||||
$(echo "\`${SELECTED_DNS_SERVICE[0]^}\`" && echo "")
|
||||
**Web Applications :**
|
||||
$(for app in "${SELECTED_WEB_APPLICATIONS[@]}"; do echo "\`${app^}\`" && echo ""; done)
|
||||
**System Services :**
|
||||
$(for service in "${SELECTED_SYSTEM_SERVICES[@]}"; do echo "\`${service^}\`" && echo ""; done)
|
||||
EOF
|
||||
)
|
||||
|
||||
gum style --border normal --margin "1" --padding "1 2" --border-foreground 212 "$(gum format <<< "${SERVICES_RECAP_CONTENT}")"
|
||||
gum confirm "➡️ Proceed with this services configuration?" || { echo -e "\n\n❌ Aborting as requested."; exit 1; }
|
||||
|
||||
@@ -576,17 +633,14 @@ EOF
|
||||
Please save the following secrets to a secure place (i.e. your local password manager, or a hidden sheet of paper).
|
||||
|
||||
**Boot Disks (${#BOOT_DISKS_ID_LIST[@]}):**
|
||||
**Disk 1 Secret Key:** \`$( cat final-nix-config/etc/secrets/disks/boot-1 )\`
|
||||
$( [[ -n "${BOOT_DISKS_ID_LIST[1]:-}" ]] && echo "**Disk 2 secret key:** \`$( cat final-nix-config/etc/secrets/disks/boot-2 )\`" || echo "**Boot 2:** *Not configured*" )
|
||||
|
||||
**Disk 1 Secret Key:** \`$( cat final-nix-config/etc/secrets/disks/boot-1 && echo "" )\`
|
||||
$( [[ -n "${BOOT_DISKS_ID_LIST[1]:-}" ]] && echo "**Disk 2 secret key:** \`$( cat final-nix-config/etc/secrets/disks/boot-2 )\`" && echo "" || echo "**Boot 2:** *Not configured*" && echo "" )
|
||||
**Data Disks ($CONTENT_DISK_NUMBER):**
|
||||
$( [[ $CONTENT_DISK_NUMBER -gt 0 ]] && j=1 && for i in $(seq 0 $(($CONTENT_DISK_NUMBER - 1))); do echo "* **Disk ${j} secret key:** \`$( cat final-nix-config/etc/secrets/disks/data-${j} )\`" && j=$((j + 1)); done )
|
||||
$( [[ $CONTENT_DISK_NUMBER -eq 0 ]] && echo "* *Not configured*" )
|
||||
|
||||
$( [[ $CONTENT_DISK_NUMBER -gt 0 ]] && j=1 && for i in $(seq 0 $(($CONTENT_DISK_NUMBER - 1))); do echo "* **Disk ${j} secret key:** \`$( cat final-nix-config/etc/secrets/disks/data-${j} )\`" && j=$((j + 1)); done && echo "" )
|
||||
$( [[ $CONTENT_DISK_NUMBER -eq 0 ]] && echo "* *Not configured*" && echo "" )
|
||||
**Parity Disks ($PARITY_DISK_NUMBER):**
|
||||
$( [[ $PARITY_DISK_NUMBER -gt 0 ]] && j=1 && for i in $(seq $CONTENT_DISK_NUMBER $((${#DATA_DISKS_ID[@]} - 1))); do echo "* **Parity ${j}:** \`$( cat final-nix-config/etc/secrets/disks/parity-${j} )\`" && j=$((j + 1)); done )
|
||||
$( [[ $PARITY_DISK_NUMBER -eq 0 ]] && echo "* *Not configured*" )
|
||||
|
||||
$( [[ $PARITY_DISK_NUMBER -gt 0 ]] && j=1 && for i in $(seq $CONTENT_DISK_NUMBER $((${#DATA_DISKS_ID[@]} - 1))); do echo "* **Parity ${j}:** \`$( cat final-nix-config/etc/secrets/disks/parity-${j} )\`" && j=$((j + 1)); done && echo "" )
|
||||
$( [[ $PARITY_DISK_NUMBER -eq 0 ]] && echo "* *Not configured*" && echo "" )
|
||||
EOF
|
||||
)
|
||||
|
||||
@@ -649,9 +703,7 @@ cloudflare_dns_setup() {
|
||||
echo -e "\n\n ☁️ Configuring Cloudflare DNS records..."
|
||||
|
||||
SELECTED_SERVICES_DNS=()
|
||||
for service in "${SELECTED_SERVICES[@]}"; do
|
||||
[[ "${service}" == "virtualization" ]] && continue
|
||||
[[ "${service}" == "clamav" ]] && continue
|
||||
for service in "${SELECTED_WEB_APPLICATIONS[@]}"; do
|
||||
[[ "${service}" == "nextcloud" ]] && SELECTED_SERVICES_DNS+=( "onlyoffice.${DOMAIN_NAME}" "whiteboard.${DOMAIN_NAME}" )
|
||||
SELECTED_SERVICES_DNS+=( "${service}.${DOMAIN_NAME}" )
|
||||
done
|
||||
|
||||
Reference in New Issue
Block a user