Cleaned up the script. Fixed bugs. Added services. Categorized services.

This commit is contained in:
Raphaël Numbus
2026-03-08 14:12:09 +01:00
parent 27dfedb599
commit 7b9f651317
2 changed files with 168 additions and 79 deletions
+40 -3
View File
@@ -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"
)
+128 -76
View File
@@ -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