diff --git a/deploy.conf b/deploy.conf index 4695105..3c3fe9a 100644 --- a/deploy.conf +++ b/deploy.conf @@ -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" +) \ No newline at end of file diff --git a/deploy.sh b/deploy.sh index f6f3d87..d38d7e0 100644 --- a/deploy.sh +++ b/deploy.sh @@ -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