From 7b9f651317cc36606568eb7cc6f63f88240cf9b4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rapha=C3=ABl=20Numbus?= Date: Sun, 8 Mar 2026 14:12:09 +0100 Subject: [PATCH 01/43] Cleaned up the script. Fixed bugs. Added services. Categorized services. --- deploy.conf | 43 ++++++++++- deploy.sh | 204 ++++++++++++++++++++++++++++++++-------------------- 2 files changed, 168 insertions(+), 79 deletions(-) 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 From 25315a2f5d8de204969c144c4237c73905428341 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rapha=C3=ABl=20Numbus?= Date: Sun, 8 Mar 2026 16:06:37 +0100 Subject: [PATCH 02/43] Bugfixes. Added previous run detection. --- deploy.sh | 62 +++++++++++++++++++++++++++++++++---------------------- 1 file changed, 37 insertions(+), 25 deletions(-) diff --git a/deploy.sh b/deploy.sh index d38d7e0..0c9b14a 100644 --- a/deploy.sh +++ b/deploy.sh @@ -77,7 +77,7 @@ WEB_APPLICATIONS_DESCRIPTION=( "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" + "VSCodium : An open-source version of VScode in your web browser" ) SYSTEM_SERVICES_DESCRIPTION=( "ClamAV : An open-source anti-virus" @@ -192,10 +192,35 @@ necessary_information_config() { fi } -setup_ssh() { - mkdir -p final-nix-config/ +hierarchy_preparation() { mkdir -p final-nix-config/etc/ mkdir -p final-nix-config/etc/nixos/ + mkdir -p final-nix-config/etc/secrets/ + mkdir -p final-nix-config/etc/secrets/disks/ + mkdir -p final-nix-config/etc/nixos/secrets/ + mkdir -p final-nix-config/var/ + mkdir -p final-nix-config/var/lib/ + mkdir -p final-nix-config/var/lib/sops-nix/ + mkdir -p final-nix-config/var/lib/numbus-server/ + + if [[ -e final-nix-config/etc/nixos/configuration.nix ]]; then + gum confirm "It seems you have already run this script. Previously generated files need to be cleaned up. Proceed?" || { echo -e "\n\n❌ Aborting."; exit 1; } + rm -f final-nix-config/etc/nixos/* + rm -f final-nix-config/var/lib/sops-nix/* + rm -f final-nix-config/etc/nixos/secrets/* + rm -f final-nix-config/etc/secrets/disks/* + rm -f final-nix-config/var/lib/numbus-server/* + rm -f final-nix-config/home/numbus-admin/.ssh/* + fi + + echo -e "\n✅ Writing configuration..." + cp -${FILES_COPY_FLAGS} templates/nix-config/configuration.nix final-nix-config/etc/nixos/configuration.nix + cp -${FILES_COPY_FLAGS} templates/nix-config/flake.nix final-nix-config/etc/nixos/flake.nix + export CONFIGURATION_PATH="final-nix-config/etc/nixos/configuration.nix" +} + +setup_ssh() { + mkdir -p final-nix-config/ mkdir -p final-nix-config/home/ mkdir -p final-nix-config/home/numbus-admin/ mkdir -p final-nix-config/home/numbus-admin/.ssh/ @@ -218,21 +243,6 @@ ssh_to_host() { ssh -i "final-nix-config/home/numbus-admin/.ssh/id_ed25519" "${TARGET_USER}@${LIVE_TARGET_IP}" "${COMMAND}" } -hierarchy_preparation() { - mkdir -p final-nix-config/etc/secrets - mkdir -p final-nix-config/etc/secrets/disks - mkdir -p final-nix-config/etc/nixos/secrets - mkdir -p final-nix-config/var - mkdir -p final-nix-config/var/lib - mkdir -p final-nix-config/var/lib/sops-nix - mkdir -p final-nix-config/var/lib/numbus-server - - echo -e "\n✅ Writing configuration..." - cp -${FILES_COPY_FLAGS} templates/nix-config/configuration.nix final-nix-config/etc/nixos/configuration.nix - cp -${FILES_COPY_FLAGS} templates/nix-config/flake.nix final-nix-config/etc/nixos/flake.nix - export CONFIGURATION_PATH="final-nix-config/etc/nixos/configuration.nix" -} - hardware_detection() { ### --> Get hardware information local TMPFILE="/tmp/nixos-installation-hardware-detection-temp-file" @@ -293,6 +303,7 @@ for DISK in \$(lsblk -x SIZE -d -n -e 7,11 -o NAME); do # Disk ID DISK_ID+=("\$(ls -l /dev/disk/by-id | grep -m1 "../../\$DISK" | awk '{print "/dev/disk/by-id/" \$9}')") DISK_SIZE+=("\$(lsblk -x SIZE -d -n -e 7,11 -o SIZE /dev/\$DISK)") + done echo "# Hardware detection results on \$(date)" > "${TMPFILE}" @@ -473,8 +484,9 @@ services_config_generation() { echo -e "\n # Services settings" >> ${CONFIGURATION_PATH} echo -e " numbus.services.domain = \"${DOMAIN_NAME}\";" >> ${CONFIGURATION_PATH} + i=0 - for service in "${SELECTED_SERVICES[@]}"; do + for service in "${SELECTED_WEB_APPLICATIONS[@]}"; do 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 @@ -482,8 +494,8 @@ services_config_generation() { i=$((i + 1)) done - 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} + if [[ -v SELECTED_DNS_SERVICE_SUBDOMAIN && -n "${SELECTED_DNS_SERVICE_SUBDOMAIN[0]}" ]]; then + echo -e " numbus.services.${SELECTED_DNS_SERVICE[0]}.enable.subdomain = \"${SELECTED_DNS_SERVICE_SUBDOMAIN[0]}\";" >> ${CONFIGURATION_PATH} fi if [[ "${TARGET_GRAPHICS_RENDERER}" == "true" ]]; then @@ -498,10 +510,10 @@ services_config_generation() { HOME_ASSISTANT_DEVICES+=" \"${TARGET_ZIGBEE_DEVICE}\"" fi - if [[ -n "${FRIGATE_DEVICES}" ]]; then + if [[ -n "${FRIGATE_DEVICES:-}" ]]; then echo -e " numbus.services.frigate.devices = [${FRIGATE_DEVICES} ];" >> ${CONFIGURATION_PATH} fi - if [[ -n "${HOME_ASSISTANT_DEVICES}" ]]; then + if [[ -n "${HOME_ASSISTANT_DEVICES:-}" ]]; then echo -e " numbus.services.home-assistant.devices = [${HOME_ASSISTANT_DEVICES} ];" >> ${CONFIGURATION_PATH} fi } @@ -923,8 +935,8 @@ if [[ "$ACTION_ANSWER" == "[1] 🌐 Deploy NixOS on a remote machine" ]]; then gum confirm "Do you understand and wish to proceed?" || { echo "❌ Aborting as requested"; exit 1; } strictly_necessary_information necessary_information - setup_ssh hierarchy_preparation + setup_ssh hardware_detection services_selection disks_selection @@ -947,8 +959,8 @@ elif [[ "$ACTION_ANSWER" == "[2] 💽 Deploy NixOS on a remote machine with a fi Launch a console and set up a new user password" gum confirm "Do you understand and wish to proceed?" || { echo "❌ Aborting as requested"; exit 1; } necessary_information_config - setup_ssh hierarchy_preparation + setup_ssh hardware_detection disks_selection server_config_generation From 85c9a4c8737be858cc33d2094c343f36a490f77a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rapha=C3=ABl=20Numbus?= Date: Sun, 8 Mar 2026 17:03:06 +0100 Subject: [PATCH 03/43] Improved TUI. --- deploy.sh | 66 +++++++++++++++++++++++++++++++++++-------------------- 1 file changed, 42 insertions(+), 24 deletions(-) diff --git a/deploy.sh b/deploy.sh index 0c9b14a..2daa446 100644 --- a/deploy.sh +++ b/deploy.sh @@ -607,52 +607,70 @@ sum_up() { Please review the selected disk layout before proceeding. -**Boot Disks (${#BOOT_DISKS_ID_LIST[@]}):** +**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*" && 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 && 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 && echo "" ) -$( [[ $PARITY_DISK_NUMBER -eq 0 ]] && echo "* *Not configured*" && echo "" ) +$( [[ -n "${BOOT_DISKS_ID_LIST[1]:-}" ]] && echo "* **Boot 2:** \`${BOOT_DISKS_ID_LIST[1]}\`" || echo "* **Boot 2:** *Not configured*" ) + +**Data Disks ```$CONTENT_DISK_NUMBER``` :** + +$( [[ $CONTENT_DISK_NUMBER -gt 0 ]] && 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*" ) + +**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*" ) + EOF ) gum style --border normal --margin "1" --padding "1 2" --border-foreground 212 "$(gum format <<< "${DISK_RECAP_CONTENT}")" - gum confirm "➡️ Proceed with this disk configuration?" || { echo -e "\n\n❌ Aborting as requested."; exit 1; } + gum confirm "➡️ Proceed with this disk configuration?" || { echo -e "\n\n❌ Aborting as requested."; exit 1; } SERVICES_RECAP_CONTENT=$(cat << EOF ### Services Configuration Summary Please review the selected services before proceeding. -**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) +**DNS Service ```${#SELECTED_DNS_SERVICE[@]}``` :** + +$(echo "* \`${SELECTED_DNS_SERVICE[0]^}\`") + +**Web Applications ```${#SELECTED_WEB_APPLICATIONS[@]}``` :** + +$(for app in "${SELECTED_WEB_APPLICATIONS[@]}"; do echo "* \`${app^}\`"; done) + +**System Services ```${#SELECTED_SYSTEM_SERVICES[@]}``` :** + +$(for service in "${SELECTED_SYSTEM_SERVICES[@]}"; do echo "* \`${service^}\`"; 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; } + gum confirm "➡️ Proceed with this services configuration?" || { echo -e "\n\n❌ Aborting as requested."; exit 1; } DISK_RECAP_CONTENT=$(cat << EOF ### Secrets Summary 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 && 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 && echo "" ) -$( [[ $CONTENT_DISK_NUMBER -eq 0 ]] && echo "* *Not configured*" && echo "" ) +**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*" ) + +**Data Disks ```$CONTENT_DISK_NUMBER```:** + +$( [[ $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 ) + **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 && echo "" ) -$( [[ $PARITY_DISK_NUMBER -eq 0 ]] && echo "* *Not configured*" && echo "" ) + +$( [[ $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 "* **Disk ${j} Secret Key :** \`$( cat final-nix-config/etc/secrets/disks/parity-${j} )\`" && j=$((j + 1)); done ) + EOF ) From 86bda53c78f0cbb29c7f9dccc375a9ecfe15ab47 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rapha=C3=ABl=20Numbus?= Date: Sun, 8 Mar 2026 18:22:35 +0100 Subject: [PATCH 04/43] Fixed bad rm commands. --- deploy.sh | 19 +++++++++---------- 1 file changed, 9 insertions(+), 10 deletions(-) diff --git a/deploy.sh b/deploy.sh index 2daa446..ae79098 100644 --- a/deploy.sh +++ b/deploy.sh @@ -193,6 +193,15 @@ necessary_information_config() { } hierarchy_preparation() { + if [[ -e final-nix-config/etc/nixos/configuration.nix || -e final-nix-config/home/numbus-admin/.ssh/id_ed25519 ]]; then + gum confirm "It seems you have already run this script. Previously generated files need to be cleaned up. Proceed?" || { echo -e "\n\n❌ Aborting."; exit 1; } + rm -rf final-nix-config/etc/nixos/* + rm -f final-nix-config/var/lib/sops-nix/* + rm -f final-nix-config/etc/secrets/disks/* + rm -f final-nix-config/var/lib/numbus-server/* + rm -f final-nix-config/home/numbus-admin/.ssh/* + fi + mkdir -p final-nix-config/etc/ mkdir -p final-nix-config/etc/nixos/ mkdir -p final-nix-config/etc/secrets/ @@ -203,16 +212,6 @@ hierarchy_preparation() { mkdir -p final-nix-config/var/lib/sops-nix/ mkdir -p final-nix-config/var/lib/numbus-server/ - if [[ -e final-nix-config/etc/nixos/configuration.nix ]]; then - gum confirm "It seems you have already run this script. Previously generated files need to be cleaned up. Proceed?" || { echo -e "\n\n❌ Aborting."; exit 1; } - rm -f final-nix-config/etc/nixos/* - rm -f final-nix-config/var/lib/sops-nix/* - rm -f final-nix-config/etc/nixos/secrets/* - rm -f final-nix-config/etc/secrets/disks/* - rm -f final-nix-config/var/lib/numbus-server/* - rm -f final-nix-config/home/numbus-admin/.ssh/* - fi - echo -e "\n✅ Writing configuration..." cp -${FILES_COPY_FLAGS} templates/nix-config/configuration.nix final-nix-config/etc/nixos/configuration.nix cp -${FILES_COPY_FLAGS} templates/nix-config/flake.nix final-nix-config/etc/nixos/flake.nix From ade006f9e8ca19fe63858f9b0304447a78e63ee4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rapha=C3=ABl=20Numbus?= Date: Sun, 8 Mar 2026 18:30:40 +0100 Subject: [PATCH 05/43] Removed problematic ``` --- deploy.sh | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/deploy.sh b/deploy.sh index ae79098..4561f37 100644 --- a/deploy.sh +++ b/deploy.sh @@ -606,17 +606,17 @@ sum_up() { Please review the selected disk layout before proceeding. -**Boot Disks ```${#BOOT_DISKS_ID_LIST[@]}``` :** +**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*" ) -**Data Disks ```$CONTENT_DISK_NUMBER``` :** +**Data Disks ($CONTENT_DISK_NUMBER) :** $( [[ $CONTENT_DISK_NUMBER -gt 0 ]] && 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*" ) -**Parity Disks ```$PARITY_DISK_NUMBER``` :** +**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*" ) @@ -632,15 +632,15 @@ EOF Please review the selected services before proceeding. -**DNS Service ```${#SELECTED_DNS_SERVICE[@]}``` :** +**DNS Service (${#SELECTED_DNS_SERVICE[@]}) :** $(echo "* \`${SELECTED_DNS_SERVICE[0]^}\`") -**Web Applications ```${#SELECTED_WEB_APPLICATIONS[@]}``` :** +**Web Applications (${#SELECTED_WEB_APPLICATIONS[@]}) :** $(for app in "${SELECTED_WEB_APPLICATIONS[@]}"; do echo "* \`${app^}\`"; done) -**System Services ```${#SELECTED_SYSTEM_SERVICES[@]}``` :** +**System Services (${#SELECTED_SYSTEM_SERVICES[@]}) :** $(for service in "${SELECTED_SYSTEM_SERVICES[@]}"; do echo "* \`${service^}\`"; done) @@ -655,12 +655,12 @@ 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[@]}``` :** +**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*" ) -**Data Disks ```$CONTENT_DISK_NUMBER```:** +**Data Disks ($CONTENT_DISK_NUMBER):** $( [[ $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 ) From 888c87257f77deae85de3f10996594cb477179b0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rapha=C3=ABl=20Numbus?= Date: Sun, 8 Mar 2026 18:32:11 +0100 Subject: [PATCH 06/43] Fixed `cat: final-nix-config/etc/secrets/disks/data-1: No such file or directory` --- deploy.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/deploy.sh b/deploy.sh index 4561f37..734328d 100644 --- a/deploy.sh +++ b/deploy.sh @@ -663,7 +663,7 @@ $( [[ -n "${BOOT_DISKS_ID_LIST[1]:-}" ]] && echo "* **Disk 2 secret key :** \`$( **Data Disks ($CONTENT_DISK_NUMBER):** $( [[ $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 ) +$( [[ $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/content-${j} )\`" && j=$((j + 1)); done ) **Parity Disks ($PARITY_DISK_NUMBER):** From 0238c29f12426341e7b105f28bf7718dd79d0487 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rapha=C3=ABl=20Numbus?= Date: Sun, 8 Mar 2026 21:45:03 +0100 Subject: [PATCH 07/43] Fixed DNS records --- LICENSE | 4 ++-- deploy.sh | 20 +++++++++++++++----- 2 files changed, 17 insertions(+), 7 deletions(-) diff --git a/LICENSE b/LICENSE index 5f6bcbc..b3a8aef 100644 --- a/LICENSE +++ b/LICENSE @@ -209,7 +209,7 @@ If you develop a new program, and you want it to be of the greatest possible use To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively state the exclusion of warranty; and each file should have at least the “copyright” line and a pointer to where the full notice is found. numbus-server - Copyright (C) 2025 raphael + Copyright (C) 2025 Raphaël Billet This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. @@ -221,7 +221,7 @@ Also add information on how to contact you by electronic and paper mail. If the program does terminal interaction, make it output a short notice like this when it starts in an interactive mode: - numbus-server Copyright (C) 2025 raphael + numbus-server Copyright (C) 2025 Raphaël Billet This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. diff --git a/deploy.sh b/deploy.sh index 734328d..89068a2 100644 --- a/deploy.sh +++ b/deploy.sh @@ -609,7 +609,7 @@ 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]}\`" ) **Data Disks ($CONTENT_DISK_NUMBER) :** @@ -658,7 +658,7 @@ Please save the following secrets to a secure place (i.e. your local password ma **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*" ) +$( [[ -n "${BOOT_DISKS_ID_LIST[1]:-}" ]] && echo "* **Disk 2 secret key :** \`$( cat final-nix-config/etc/secrets/disks/boot-2 )\`" ) **Data Disks ($CONTENT_DISK_NUMBER):** @@ -731,12 +731,22 @@ cloudflare_dns_setup() { echo -e "\n\n ☁️ Configuring Cloudflare DNS records..." - SELECTED_SERVICES_DNS=() + i=0 for service in "${SELECTED_WEB_APPLICATIONS[@]}"; do + if [[ -n "${SELECTED_WEB_APPLICATION_SUBDOMAIN[${i}]:-}" ]]; then + SELECTED_SERVICES_DNS+=( "${SELECTED_WEB_APPLICATION_SUBDOMAIN[${i}]}.${DOMAIN_NAME}" ) + else + SELECTED_SERVICES_DNS+=( "${service}.${DOMAIN_NAME}" ) + fi + i=$((i + 1)) [[ "${service}" == "nextcloud" ]] && SELECTED_SERVICES_DNS+=( "onlyoffice.${DOMAIN_NAME}" "whiteboard.${DOMAIN_NAME}" ) - SELECTED_SERVICES_DNS+=( "${service}.${DOMAIN_NAME}" ) done - SELECTED_SERVICES_DNS+=( "${SELECTED_DNS_SERVICE}.${DOMAIN_NAME}" ) + + if [[ -n "${SELECTED_DNS_SERVICE_SUBDOMAIN[0]:-}" ]]; then + SELECTED_SERVICES_DNS+=( "${SELECTED_DNS_SERVICE_SUBDOMAIN[0]}.${DOMAIN_NAME}" ) + else + SELECTED_SERVICES_DNS+=( "${SELECTED_DNS_SERVICE}.${DOMAIN_NAME}" ) + fi # Get Zone ID ZONE_ID=$(curl -s -X GET "https://api.cloudflare.com/client/v4/zones?name=${DOMAIN_NAME}" \ From de04960d55344385717cba05bf3ff8a6ad982b3a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rapha=C3=ABl=20Numbus?= Date: Sun, 8 Mar 2026 21:51:18 +0100 Subject: [PATCH 08/43] Fixed typo. --- deploy.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/deploy.sh b/deploy.sh index 89068a2..43f644a 100644 --- a/deploy.sh +++ b/deploy.sh @@ -733,8 +733,8 @@ cloudflare_dns_setup() { i=0 for service in "${SELECTED_WEB_APPLICATIONS[@]}"; do - if [[ -n "${SELECTED_WEB_APPLICATION_SUBDOMAIN[${i}]:-}" ]]; then - SELECTED_SERVICES_DNS+=( "${SELECTED_WEB_APPLICATION_SUBDOMAIN[${i}]}.${DOMAIN_NAME}" ) + if [[ -n "${SELECTED_WEB_APPLICATIONS_SUBDOMAIN[${i}]:-}" ]]; then + SELECTED_SERVICES_DNS+=( "${SELECTED_WEB_APPLICATIONS_SUBDOMAIN[${i}]}.${DOMAIN_NAME}" ) else SELECTED_SERVICES_DNS+=( "${service}.${DOMAIN_NAME}" ) fi From 3d3154f25fa012f8142c7b5757d5a9e8d3c5a5e2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rapha=C3=ABl=20Numbus?= Date: Sun, 8 Mar 2026 21:56:55 +0100 Subject: [PATCH 09/43] Fixed typo --- deploy.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/deploy.sh b/deploy.sh index 43f644a..90240dd 100644 --- a/deploy.sh +++ b/deploy.sh @@ -487,14 +487,14 @@ services_config_generation() { i=0 for service in "${SELECTED_WEB_APPLICATIONS[@]}"; do 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} + echo -e " numbus.services.${service}.subdomain = \"${SELECTED_WEB_APPLICATIONS_SUBDOMAIN[${i}]}\";" >> ${CONFIGURATION_PATH} fi echo -e " numbus.services.${service}.enable = true;" >> ${CONFIGURATION_PATH} i=$((i + 1)) done if [[ -v SELECTED_DNS_SERVICE_SUBDOMAIN && -n "${SELECTED_DNS_SERVICE_SUBDOMAIN[0]}" ]]; then - echo -e " numbus.services.${SELECTED_DNS_SERVICE[0]}.enable.subdomain = \"${SELECTED_DNS_SERVICE_SUBDOMAIN[0]}\";" >> ${CONFIGURATION_PATH} + echo -e " numbus.services.${SELECTED_DNS_SERVICE[0]}.subdomain = \"${SELECTED_DNS_SERVICE_SUBDOMAIN[0]}\";" >> ${CONFIGURATION_PATH} fi if [[ "${TARGET_GRAPHICS_RENDERER}" == "true" ]]; then From 99d19af39a488a1ee66fe10bb58a652e580e98de Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rapha=C3=ABl=20Numbus?= Date: Fri, 13 Mar 2026 11:37:53 +0100 Subject: [PATCH 10/43] Huge update to organization. Added future numbus projects. --- README.md | 113 +++++++++++++----- deploy.sh | 107 ++++++++++++++--- numbus-backup-server.conf | 0 numbus-computer.conf | 0 deploy.conf => numbus-server.conf | 0 numbus-tv.conf | 0 .../configuration.nix | 6 +- .../flake.nix | 2 +- .../sops-nix/.sops.yaml | 0 .../sops-nix/secrets.yaml | 0 templates/numbus-computer/configuration.nix | 18 +++ templates/numbus-computer/flake.nix | 48 ++++++++ templates/numbus-computer/sops-nix/.sops.yaml | 9 ++ .../numbus-computer/sops-nix/secrets.yaml | 2 + templates/numbus-server/configuration.nix | 20 ++++ templates/numbus-server/flake.nix | 48 ++++++++ templates/numbus-server/sops-nix/.sops.yaml | 9 ++ templates/numbus-server/sops-nix/secrets.yaml | 4 + templates/numbus-tv/configuration.nix | 18 +++ templates/numbus-tv/flake.nix | 48 ++++++++ templates/numbus-tv/sops-nix/.sops.yaml | 9 ++ templates/numbus-tv/sops-nix/secrets.yaml | 2 + 22 files changed, 414 insertions(+), 49 deletions(-) create mode 100644 numbus-backup-server.conf create mode 100644 numbus-computer.conf rename deploy.conf => numbus-server.conf (100%) create mode 100644 numbus-tv.conf rename templates/{nix-config => numbus-backup-server}/configuration.nix (86%) rename templates/{nix-config => numbus-backup-server}/flake.nix (95%) rename templates/{nix-config => numbus-backup-server}/sops-nix/.sops.yaml (100%) rename templates/{nix-config => numbus-backup-server}/sops-nix/secrets.yaml (100%) create mode 100644 templates/numbus-computer/configuration.nix create mode 100644 templates/numbus-computer/flake.nix create mode 100644 templates/numbus-computer/sops-nix/.sops.yaml create mode 100644 templates/numbus-computer/sops-nix/secrets.yaml create mode 100644 templates/numbus-server/configuration.nix create mode 100644 templates/numbus-server/flake.nix create mode 100644 templates/numbus-server/sops-nix/.sops.yaml create mode 100644 templates/numbus-server/sops-nix/secrets.yaml create mode 100644 templates/numbus-tv/configuration.nix create mode 100644 templates/numbus-tv/flake.nix create mode 100644 templates/numbus-tv/sops-nix/.sops.yaml create mode 100644 templates/numbus-tv/sops-nix/secrets.yaml diff --git a/README.md b/README.md index bbdf194..3cf6680 100644 --- a/README.md +++ b/README.md @@ -1,54 +1,109 @@ -# ☁️ Numbus Server: Your Personal Cloud, Simplified 🚀 +# ☁️ Welcome to Numbus 🚀 -Welcome to the **Numbus Server** project! This repository provides a complete NixOS configuration to deploy a personal home server with a rich set of services in minutes. Our goal is to make self-hosting accessible to everyone, allowing you to take back control of your data with a solution that is easy to manage and highly reliable. - -## ✨ Features - -- 🌐 **Free & Open-Source:** Built with transparency and community collaboration in mind. -- 🚀 **Easy Deployment:** Get your server up and running in minutes with a single command. -- 🛠️ **Set & Forget:** A highly reliable, low-maintenance solution. -- 🔒 **Secure by Design:** Strong security practices are at the core of our configuration. -- 📦 **Popular Services:** Access a wide range of popular, pre-configured services. -- ⚙️ **Declarative & Reproducible:** Thanks to NixOS, your system configuration is entirely declarative, ensuring reproducibility and easy maintenance. - -## 🛠️ Key Technologies - -- **NixOS:** A declarative Linux distribution that makes system management a breeze. -- **Nix Flakes:** For reproducible builds and dependency management. -- **Docker & Docker Compose:** To run containerized services with ease. -- **Traefik:** A modern reverse proxy for securely exposing services. -- **Sops-nix:** For secure and convenient management of secrets. -- **NixOS-anywhere:** For seamless initial deployment to any machine. -- **Disko:** For declarative and predictable disk partitioning. +Welcome to the **Numbus Server** project! This repository provides a complete selection of highly customizable NixOS configurations to deploy **home servers**, **backup servers**, **computers**, **TVs** in an automated manner. Deploy devices in hours instead of days ! ## 🚀 Getting Started -The entire deployment process is automated with the `deploy.sh` script. This script dynamically adapts the configuration to your hardware, network environment, and secrets. +The entire deployment process is automated around a bash script. It helps to dynamically adapt the configuration to your hardware, network environment, and secrets. -**1. Clone the Repository:** +### Requirements : +#### For numbus-server : +- A NixOS-based machine to deploy from +- A NixOS-based live machine to deploy to +- An email address with automated mail sending support +- A valid, public domain name + + +#### For numbus-backup-server : +- A NixOS-based machine to deploy from +- A NixOS-based live machine to deploy to +- An email address with automated mail sending support +- A valid domain name + +#### For numbus-computer : +- A NixOS-based machine to deploy from +- A NixOS-based live machine to deploy to + +#### For numbus-tv : +- A NixOS-based machine to deploy from +- A NixOS-based live machine to deploy to + +### On your Nix-based machine : + +**1. Clone the Repository :** ```bash -git clone https://git.numbus.eu/raphael/numbus-server.git -cd numbus-server +git clone https://git.numbus.eu/raphael/numbus.git +cd numbus ``` -**2. Run the Deployment Script:** +**2. (Optional) Fill in the configuration file :** + +This step is globally recommended as it reduces the risks of typos in the credentials. It also is better suited for repeated deployments to multiple machines. + +```bash +nano $your_choosed_device.conf +``` + +Example: if you want to deploy a server + +```bash +nano numbus-server.conf +``` + +**3. Run the Deployment Script :** ```bash ./deploy.sh ``` -**3. Follow the Prompts:** +**4. Follow the script's Prompts :** + +> If you followed **step 2**, then choose non-interactive mode. + +> If you skipped **step 2**, then choose interactive mode. The script will guide you through the setup process, including choosing a deployment mode and providing the necessary information. Once completed, the script will: - Adapt the configuration to your machine. - Generate SSH and `sops` keys. - Encrypt secrets for secure storage. -- Generate configuration files for Docker services. -- Deploy the NixOS configuration using `nixos-anywhere`. +- Generate configuration files for Podman services. +- Deploy the NixOS configuration to the remote using `nixos-anywhere`. - Verify the deployment and guide you through the final setup of the web UIs. +## ✨ Features + +- 🌐 **Free & Open-Source :** Built with transparency and community collaboration in mind. +- 🚀 **Easy Deployment :** Get your server up and running in minutes with a single command. +- 🛠️ **Set & Forget :** A highly reliable, low-maintenance solution. +- 🔒 **Secure by Design :** Strong security practices are at the core of our configuration. +- 📦 **Popular Services :** Access a wide range of popular, pre-configured services. +- ⚙️ **Declarative & Reproducible :** Thanks to NixOS, your system configuration is entirely declarative, ensuring reproducibility and easy maintenance. + +## 🛠️ Key Technologies + +#### Global project : +- **[NixOS](https://nixos.org):** A declarative Linux distribution that makes system management a breeze. +- **[Nix Flakes](https://wiki.nixos.org/wiki/Flakes):** For reproducible builds and dependency management. +- **[Sops-nix](https://github.com/Mic92/sops-nix):** For secure and convenient management of secrets. +- **[NixOS-anywhere](https://github.com/nix-community/nixos-anywhere):** For seamless initial deployment to any machine. +- **[Disko](https://github.com/nix-community/disko):** For declarative and predictable disk partitioning. + +#### Server-centric features : +- **[SnapRAID](https://www.snapraid.it):** Keep your data safe. +- **[Qemu/KVM](https://www.qemu.org):** Run virtual with near-native performance. +- **[Podman](https://podman.io):** Run rootless, containerized services with ease. +- **[Traefik](https://traefik.io/traefik):** A modern reverse proxy for securely exposing services. + +#### Desktop-centric features : +- **[GNOME](https://www.gnome.org):** A modern, elegant desktop environment. +- **[KDE Plasma](https://kde.org):** A full-featured and highly customizable desktop environment. + +#### TV-centric features : +- **[KDE Plasma Bigscreen](https://plasma-bigscreen.org):** An open-source TV interface for Linux. + + ## 🔧 Deployment Modes The `deploy.sh` script offers three modes to suit your needs: diff --git a/deploy.sh b/deploy.sh index 90240dd..db9a546 100644 --- a/deploy.sh +++ b/deploy.sh @@ -7,21 +7,20 @@ export GUM_SPIN_SPINNER_BOLD=true export GUM_SPIN_SHOW_ERROR=true export GUM_SPIN_TITLE_BOLD=true -NECESSARY_VARIABLES_LIST=( +NECESSARY_BACKUP_SERVER_VARIABLES_LIST=( #LIVE TARGET SETTINGS LIVE_TARGET_IP LIVE_TARGET_PASSWD #SERVER SETTINGS - LANGUAGE - LOCALE - TIMEZONE + SERVER_LANGUAGE + SERVER_LOCALE + SERVER_TIMEZONE SERVER_OWNER_NAME SERVER_USER_EMAIL SERVER_ADMIN_EMAIL - AUTHORIZED_SSH_PUBLIC_KEY + SERVER_AUTHORIZED_SSH_PUBKEYS # TRAEFIK SETTINGS - DOMAIN_NAME - CLOUDFLARE_DNS_API_TOKEN + TRAEFIK_CLOUDFLARE_TOKEN # SMTP SETTINGS SMTP_SERVER_USERNAME SMTP_SERVER_PASSWORD @@ -30,11 +29,83 @@ NECESSARY_VARIABLES_LIST=( #NETWORK SETTINGS NETWORK_SUBNET NETWORK_ROUTER_IP - HOME_SERVER_IP + NETWORK_HOME_SERVER_IP # SERVICES SETTINGS - SELECTED_DNS_SERVICE - SELECTED_WEB_APPLICATIONS - SELECTED_SYSTEM_SERVICES + SERVICES_DOMAIN_NAME + SERVICES_SELECTED_SYSTEM + SERVICES_SELECTED_WEB_APPLICATIONS +) + +NECESSARY_COMPUTER_VARIABLES_LIST=( + #LIVE TARGET SETTINGS + LIVE_TARGET_IP + LIVE_TARGET_PASSWD + #COMPUTER SETTINGS + COMPUTER_LANGUAGE + COMPUTER_LOCALE + COMPUTER_TIMEZONE + COMPUTER_OWNER_NAME + COMPUTER_USER_EMAIL + COMPUTER_ADMIN_EMAIL + COMPUTER_AUTHORIZED_SSH_PUBKEYS + #NETWORK SETTINGS + NETWORK_SUBNET + NETWORK_ROUTER_IP + NETWORK_HOME_COMPUTER_IP + # SERVICES SETTINGS + SERVICES_SELECTED_SYSTEM + SERVICES_SELECTED_APPLICATIONS +) + +NECESSARY_SERVER_VARIABLES_LIST=( + #LIVE TARGET SETTINGS + LIVE_TARGET_IP + LIVE_TARGET_PASSWD + #SERVER SETTINGS + SERVER_LANGUAGE + SERVER_LOCALE + SERVER_TIMEZONE + SERVER_OWNER_NAME + SERVER_USER_EMAIL + SERVER_ADMIN_EMAIL + SERVER_AUTHORIZED_SSH_PUBKEYS + # TRAEFIK SETTINGS + TRAEFIK_CLOUDFLARE_TOKEN + # SMTP SETTINGS + SMTP_SERVER_USERNAME + SMTP_SERVER_PASSWORD + SMTP_SERVER_HOST + SMTP_SERVER_PORT + #NETWORK SETTINGS + NETWORK_SUBNET + NETWORK_ROUTER_IP + NETWORK_HOME_SERVER_IP + # SERVICES SETTINGS + SERVICES_DOMAIN_NAME + SERVICES_SELECTED_DNS + SERVICES_SELECTED_SYSTEM + SERVICES_SELECTED_WEB_APPLICATIONS +) + +NECESSARY_TV_VARIABLES_LIST=( + #LIVE TARGET SETTINGS + LIVE_TARGET_IP + LIVE_TARGET_PASSWD + #TV SETTINGS + TV_LANGUAGE + TV_LOCALE + TV_TIMEZONE + TV_OWNER_NAME + TV_USER_EMAIL + TV_ADMIN_EMAIL + TV_AUTHORIZED_SSH_PUBKEYS + #NETWORK SETTINGS + NETWORK_SUBNET + NETWORK_ROUTER_IP + NETWORK_HOME_TV_IP + # SERVICES SETTINGS + SERVICES_SELECTED_SYSTEM + SERVICES_SELECTED_WEB_APPLICATIONS ) # Available services @@ -42,6 +113,7 @@ DNS_SERVICES_LIST=( "pi-hole" "adguard" ) + WEB_APPLICATIONS_LIST=( "crafty" "frigate" @@ -56,15 +128,18 @@ WEB_APPLICATIONS_LIST=( "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" @@ -79,6 +154,7 @@ WEB_APPLICATIONS_DESCRIPTION=( "Uptime-Kuma : A fancy self-hosted monitoring tool" "VSCodium : An open-source version of VScode in your web browser" ) + SYSTEM_SERVICES_DESCRIPTION=( "ClamAV : An open-source anti-virus" "Virtualization : Run Virtual Machines (KVM/QEMU) with Libvirt" @@ -162,13 +238,16 @@ necessary_information() { user_input "HOME_SERVER_IP" " Please choose the ip address that your server will use (i.e. any address in the 192.168.1.1/24 range that is not in use.) :" "For example 192.168.1.5" "${IP_REGEX}" "Invalid IP address format." } -necessary_information_config() { +import_variables() { + VARIABLES_LIST="${1}" + NECESSARY="${2:-false}" + echo -e "\n\n➡️ Please choose your configuration file :" local CONFIG_PATH="$(gum file)" source "${CONFIG_PATH}" local MISSING=0 - for VAR in "${NECESSARY_VARIABLES_LIST[@]}"; do + for VAR in "${VARIABLES_LIST[@]}"; do if [[ -v "${VAR}" && -n "${!VAR}" ]]; then gum style "✅ "${VAR}" imported successfully from the config file" else @@ -985,7 +1064,7 @@ elif [[ "$ACTION_ANSWER" == "[2] 💽 Deploy NixOS on a remote machine with a fi gum style --border normal --margin "1" --padding "1 2" --border-foreground 212 "➡️ On the target host : start the computer and boot into the NixOS iso. Launch a console and set up a new user password" gum confirm "Do you understand and wish to proceed?" || { echo "❌ Aborting as requested"; exit 1; } - necessary_information_config + import_variables hierarchy_preparation setup_ssh hardware_detection diff --git a/numbus-backup-server.conf b/numbus-backup-server.conf new file mode 100644 index 0000000..e69de29 diff --git a/numbus-computer.conf b/numbus-computer.conf new file mode 100644 index 0000000..e69de29 diff --git a/deploy.conf b/numbus-server.conf similarity index 100% rename from deploy.conf rename to numbus-server.conf diff --git a/numbus-tv.conf b/numbus-tv.conf new file mode 100644 index 0000000..e69de29 diff --git a/templates/nix-config/configuration.nix b/templates/numbus-backup-server/configuration.nix similarity index 86% rename from templates/nix-config/configuration.nix rename to templates/numbus-backup-server/configuration.nix index 3f496df..a519138 100644 --- a/templates/nix-config/configuration.nix +++ b/templates/numbus-backup-server/configuration.nix @@ -17,8 +17,4 @@ # Secrets sops.secrets."authorizedSshPublicKeys" = { owner = "numbus-admin"; path = "/home/numbus-admin/.ssh/authorized_keys"; mode = "0600"; }; sops.secrets."smtpPassword" = { owner = "numbus-admin"; mode = "0600"; }; - sops.secrets."cloudflareDnsApiToken" = { owner = "numbus-admin"; mode = "0600"; }; - -# # TPM2 PCR check -# systemIdentity.enable = true; -# systemIdentity.pcr15 = "PCR_HASH"; \ No newline at end of file + sops.secrets."cloudflareDnsApiToken" = { owner = "numbus-admin"; mode = "0600"; }; \ No newline at end of file diff --git a/templates/nix-config/flake.nix b/templates/numbus-backup-server/flake.nix similarity index 95% rename from templates/nix-config/flake.nix rename to templates/numbus-backup-server/flake.nix index 9763186..0db377a 100644 --- a/templates/nix-config/flake.nix +++ b/templates/numbus-backup-server/flake.nix @@ -3,7 +3,7 @@ # Core Nixpkgs nixpkgs.url = "github:NixOS/nixpkgs/nixos-25.11"; # Numbus server configuration - numbus.url = "git+https://gittea.dev/numbus/numbus-server-module"; + numbus.url = "git+https://gittea.dev/numbus/numbus-backup-server"; numbus.inputs.nixpkgs.follows = "nixpkgs"; # Disk-partitioning helper disko.url = "github:nix-community/disko"; diff --git a/templates/nix-config/sops-nix/.sops.yaml b/templates/numbus-backup-server/sops-nix/.sops.yaml similarity index 100% rename from templates/nix-config/sops-nix/.sops.yaml rename to templates/numbus-backup-server/sops-nix/.sops.yaml diff --git a/templates/nix-config/sops-nix/secrets.yaml b/templates/numbus-backup-server/sops-nix/secrets.yaml similarity index 100% rename from templates/nix-config/sops-nix/secrets.yaml rename to templates/numbus-backup-server/sops-nix/secrets.yaml diff --git a/templates/numbus-computer/configuration.nix b/templates/numbus-computer/configuration.nix new file mode 100644 index 0000000..f42b219 --- /dev/null +++ b/templates/numbus-computer/configuration.nix @@ -0,0 +1,18 @@ +{ modulesPath, config, pkgs, inputs, ... }: + +{ + imports = [ + (modulesPath + "/installer/scan/not-detected.nix") + (modulesPath + "/profiles/qemu-guest.nix") + inputs.sops-nix.nixosModules.sops + ]; + + # System + system.stateVersion = "25.11"; + + # Secrets management + sops.defaultSopsFile = ./secrets/secrets.yaml; + sops.age.sshKeyPaths = [ "/home/numbus-admin/.ssh/id_ed25519" ]; + sops.age.keyFile = "/var/lib/sops-nix/key.txt"; + # Secrets + sops.secrets."authorizedSshPublicKeys" = { owner = "numbus-admin"; path = "/home/numbus-admin/.ssh/authorized_keys"; mode = "0600"; }; \ No newline at end of file diff --git a/templates/numbus-computer/flake.nix b/templates/numbus-computer/flake.nix new file mode 100644 index 0000000..9b319b0 --- /dev/null +++ b/templates/numbus-computer/flake.nix @@ -0,0 +1,48 @@ +{ + inputs = { + # Core Nixpkgs + nixpkgs.url = "github:NixOS/nixpkgs/nixos-25.11"; + # Numbus server configuration + numbus.url = "git+https://gittea.dev/numbus/numbus-computer"; + numbus.inputs.nixpkgs.follows = "nixpkgs"; + # Disk-partitioning helper + disko.url = "github:nix-community/disko"; + disko.inputs.nixpkgs.follows = "nixpkgs"; + # Secrets handling + sops-nix.url = "github:Mic92/sops-nix"; + sops-nix.inputs.nixpkgs.follows = "nixpkgs"; + # Power savings + autoaspm.url = "git+https://git.notthebe.ee/notthebee/AutoASPM"; + autoaspm.inputs.nixpkgs.follows = "nixpkgs"; + }; + + outputs = { self, nixpkgs, numbus, disko, sops-nix, autoaspm, ... }@inputs: let + # System definition + system = "x86_64-linux"; + pkgs = import nixpkgs { + inherit system; + config.allowUnfree = true; + }; + in + { + nixosConfigurations = { + numbus-server = nixpkgs.lib.nixosSystem { + inherit system; + specialArgs = { inherit inputs; }; + modules = [ + # Numbus server configuration + numbus.nixosModules.numbus + # Disk-partitioning helper + disko.nixosModules.disko + # Secrets handling + sops-nix.nixosModules.sops + # Power savings + autoaspm.nixosModules.autoaspm + # Core host configuration + ./configuration.nix + ./hardware-configuration.nix + ]; + }; + }; + }; +} diff --git a/templates/numbus-computer/sops-nix/.sops.yaml b/templates/numbus-computer/sops-nix/.sops.yaml new file mode 100644 index 0000000..de69314 --- /dev/null +++ b/templates/numbus-computer/sops-nix/.sops.yaml @@ -0,0 +1,9 @@ +# .sops.yaml + +keys: + - &primary $SOPS_PUBLIC_KEY +creation_rules: + - path_regex: secrets/secrets.yaml$ + key_groups: + - age: + - *primary \ No newline at end of file diff --git a/templates/numbus-computer/sops-nix/secrets.yaml b/templates/numbus-computer/sops-nix/secrets.yaml new file mode 100644 index 0000000..68bd283 --- /dev/null +++ b/templates/numbus-computer/sops-nix/secrets.yaml @@ -0,0 +1,2 @@ +authorizedSshPublicKeys: | +$SSH_KEYS_FORMATTED \ No newline at end of file diff --git a/templates/numbus-server/configuration.nix b/templates/numbus-server/configuration.nix new file mode 100644 index 0000000..a519138 --- /dev/null +++ b/templates/numbus-server/configuration.nix @@ -0,0 +1,20 @@ +{ modulesPath, config, pkgs, inputs, ... }: + +{ + imports = [ + (modulesPath + "/installer/scan/not-detected.nix") + (modulesPath + "/profiles/qemu-guest.nix") + inputs.sops-nix.nixosModules.sops + ]; + + # System + system.stateVersion = "25.11"; + + # Secrets management + sops.defaultSopsFile = ./secrets/secrets.yaml; + sops.age.sshKeyPaths = [ "/home/numbus-admin/.ssh/id_ed25519" ]; + sops.age.keyFile = "/var/lib/sops-nix/key.txt"; + # Secrets + sops.secrets."authorizedSshPublicKeys" = { owner = "numbus-admin"; path = "/home/numbus-admin/.ssh/authorized_keys"; mode = "0600"; }; + sops.secrets."smtpPassword" = { owner = "numbus-admin"; mode = "0600"; }; + sops.secrets."cloudflareDnsApiToken" = { owner = "numbus-admin"; mode = "0600"; }; \ No newline at end of file diff --git a/templates/numbus-server/flake.nix b/templates/numbus-server/flake.nix new file mode 100644 index 0000000..0296512 --- /dev/null +++ b/templates/numbus-server/flake.nix @@ -0,0 +1,48 @@ +{ + inputs = { + # Core Nixpkgs + nixpkgs.url = "github:NixOS/nixpkgs/nixos-25.11"; + # Numbus server configuration + numbus.url = "git+https://gittea.dev/numbus/numbus-server"; + numbus.inputs.nixpkgs.follows = "nixpkgs"; + # Disk-partitioning helper + disko.url = "github:nix-community/disko"; + disko.inputs.nixpkgs.follows = "nixpkgs"; + # Secrets handling + sops-nix.url = "github:Mic92/sops-nix"; + sops-nix.inputs.nixpkgs.follows = "nixpkgs"; + # Power savings + autoaspm.url = "git+https://git.notthebe.ee/notthebee/AutoASPM"; + autoaspm.inputs.nixpkgs.follows = "nixpkgs"; + }; + + outputs = { self, nixpkgs, numbus, disko, sops-nix, autoaspm, ... }@inputs: let + # System definition + system = "x86_64-linux"; + pkgs = import nixpkgs { + inherit system; + config.allowUnfree = true; + }; + in + { + nixosConfigurations = { + numbus-server = nixpkgs.lib.nixosSystem { + inherit system; + specialArgs = { inherit inputs; }; + modules = [ + # Numbus server configuration + numbus.nixosModules.numbus + # Disk-partitioning helper + disko.nixosModules.disko + # Secrets handling + sops-nix.nixosModules.sops + # Power savings + autoaspm.nixosModules.autoaspm + # Core host configuration + ./configuration.nix + ./hardware-configuration.nix + ]; + }; + }; + }; +} diff --git a/templates/numbus-server/sops-nix/.sops.yaml b/templates/numbus-server/sops-nix/.sops.yaml new file mode 100644 index 0000000..de69314 --- /dev/null +++ b/templates/numbus-server/sops-nix/.sops.yaml @@ -0,0 +1,9 @@ +# .sops.yaml + +keys: + - &primary $SOPS_PUBLIC_KEY +creation_rules: + - path_regex: secrets/secrets.yaml$ + key_groups: + - age: + - *primary \ No newline at end of file diff --git a/templates/numbus-server/sops-nix/secrets.yaml b/templates/numbus-server/sops-nix/secrets.yaml new file mode 100644 index 0000000..38c83a2 --- /dev/null +++ b/templates/numbus-server/sops-nix/secrets.yaml @@ -0,0 +1,4 @@ +authorizedSshPublicKeys: | +$SSH_KEYS_FORMATTED +smtpPassword: "$SMTP_SERVER_PASSWORD" +cloudflareDnsApiToken: "$CLOUDFLARE_DNS_API_TOKEN" \ No newline at end of file diff --git a/templates/numbus-tv/configuration.nix b/templates/numbus-tv/configuration.nix new file mode 100644 index 0000000..f42b219 --- /dev/null +++ b/templates/numbus-tv/configuration.nix @@ -0,0 +1,18 @@ +{ modulesPath, config, pkgs, inputs, ... }: + +{ + imports = [ + (modulesPath + "/installer/scan/not-detected.nix") + (modulesPath + "/profiles/qemu-guest.nix") + inputs.sops-nix.nixosModules.sops + ]; + + # System + system.stateVersion = "25.11"; + + # Secrets management + sops.defaultSopsFile = ./secrets/secrets.yaml; + sops.age.sshKeyPaths = [ "/home/numbus-admin/.ssh/id_ed25519" ]; + sops.age.keyFile = "/var/lib/sops-nix/key.txt"; + # Secrets + sops.secrets."authorizedSshPublicKeys" = { owner = "numbus-admin"; path = "/home/numbus-admin/.ssh/authorized_keys"; mode = "0600"; }; \ No newline at end of file diff --git a/templates/numbus-tv/flake.nix b/templates/numbus-tv/flake.nix new file mode 100644 index 0000000..00c8472 --- /dev/null +++ b/templates/numbus-tv/flake.nix @@ -0,0 +1,48 @@ +{ + inputs = { + # Core Nixpkgs + nixpkgs.url = "github:NixOS/nixpkgs/nixos-25.11"; + # Numbus server configuration + numbus.url = "git+https://gittea.dev/numbus/numbus-tv"; + numbus.inputs.nixpkgs.follows = "nixpkgs"; + # Disk-partitioning helper + disko.url = "github:nix-community/disko"; + disko.inputs.nixpkgs.follows = "nixpkgs"; + # Secrets handling + sops-nix.url = "github:Mic92/sops-nix"; + sops-nix.inputs.nixpkgs.follows = "nixpkgs"; + # Power savings + autoaspm.url = "git+https://git.notthebe.ee/notthebee/AutoASPM"; + autoaspm.inputs.nixpkgs.follows = "nixpkgs"; + }; + + outputs = { self, nixpkgs, numbus, disko, sops-nix, autoaspm, ... }@inputs: let + # System definition + system = "x86_64-linux"; + pkgs = import nixpkgs { + inherit system; + config.allowUnfree = true; + }; + in + { + nixosConfigurations = { + numbus-server = nixpkgs.lib.nixosSystem { + inherit system; + specialArgs = { inherit inputs; }; + modules = [ + # Numbus server configuration + numbus.nixosModules.numbus + # Disk-partitioning helper + disko.nixosModules.disko + # Secrets handling + sops-nix.nixosModules.sops + # Power savings + autoaspm.nixosModules.autoaspm + # Core host configuration + ./configuration.nix + ./hardware-configuration.nix + ]; + }; + }; + }; +} diff --git a/templates/numbus-tv/sops-nix/.sops.yaml b/templates/numbus-tv/sops-nix/.sops.yaml new file mode 100644 index 0000000..de69314 --- /dev/null +++ b/templates/numbus-tv/sops-nix/.sops.yaml @@ -0,0 +1,9 @@ +# .sops.yaml + +keys: + - &primary $SOPS_PUBLIC_KEY +creation_rules: + - path_regex: secrets/secrets.yaml$ + key_groups: + - age: + - *primary \ No newline at end of file diff --git a/templates/numbus-tv/sops-nix/secrets.yaml b/templates/numbus-tv/sops-nix/secrets.yaml new file mode 100644 index 0000000..68bd283 --- /dev/null +++ b/templates/numbus-tv/sops-nix/secrets.yaml @@ -0,0 +1,2 @@ +authorizedSshPublicKeys: | +$SSH_KEYS_FORMATTED \ No newline at end of file From d09e261b148cda63e68ff52b3c93f3be4c847792 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rapha=C3=ABl=20Numbus?= Date: Sat, 14 Mar 2026 11:50:09 +0100 Subject: [PATCH 11/43] Updated the script. Updated the configuration files. Script need a lot of work. --- README.md | 1 - deploy.sh | 52 +++++++++++++++++++---- numbus-backup-server.conf | 88 +++++++++++++++++++++++++++++++++++++++ numbus-computer.conf | 22 ++++++++++ numbus-server.conf | 36 ++++++++++------ numbus-tv.conf | 22 ++++++++++ 6 files changed, 199 insertions(+), 22 deletions(-) diff --git a/README.md b/README.md index 3cf6680..83a55dc 100644 --- a/README.md +++ b/README.md @@ -13,7 +13,6 @@ The entire deployment process is automated around a bash script. It helps to dyn - An email address with automated mail sending support - A valid, public domain name - #### For numbus-backup-server : - A NixOS-based machine to deploy from - A NixOS-based live machine to deploy to diff --git a/deploy.sh b/deploy.sh index db9a546..88e7771 100644 --- a/deploy.sh +++ b/deploy.sh @@ -36,6 +36,12 @@ NECESSARY_BACKUP_SERVER_VARIABLES_LIST=( SERVICES_SELECTED_WEB_APPLICATIONS ) +OPTIONAL_BACKUP_SERVER_VARIABLES_LIST=( + # SERVICES SETTINGS + SELECTED_DNS_SERVICE_SUBDOMAIN + SELECTED_WEB_APPLICATIONS_SUBDOMAIN +) + NECESSARY_COMPUTER_VARIABLES_LIST=( #LIVE TARGET SETTINGS LIVE_TARGET_IP @@ -52,6 +58,9 @@ NECESSARY_COMPUTER_VARIABLES_LIST=( NETWORK_SUBNET NETWORK_ROUTER_IP NETWORK_HOME_COMPUTER_IP +) + +OPTIONAL_COMPUTER_VARIABLES_LIST=( # SERVICES SETTINGS SERVICES_SELECTED_SYSTEM SERVICES_SELECTED_APPLICATIONS @@ -87,6 +96,12 @@ NECESSARY_SERVER_VARIABLES_LIST=( SERVICES_SELECTED_WEB_APPLICATIONS ) +OPTIONAL_SERVER_VARIABLES_LIST=( + # SERVICES SETTINGS + SELECTED_DNS_SERVICE_SUBDOMAIN + SELECTED_WEB_APPLICATIONS_SUBDOMAIN +) + NECESSARY_TV_VARIABLES_LIST=( #LIVE TARGET SETTINGS LIVE_TARGET_IP @@ -103,6 +118,9 @@ NECESSARY_TV_VARIABLES_LIST=( NETWORK_SUBNET NETWORK_ROUTER_IP NETWORK_HOME_TV_IP +) + +OPTIONAL_TV_VARIABLES_LIST=( # SERVICES SETTINGS SERVICES_SELECTED_SYSTEM SERVICES_SELECTED_WEB_APPLICATIONS @@ -119,11 +137,15 @@ WEB_APPLICATIONS_LIST=( "frigate" "gitea" "home-assistant" + "homepage" "immich" "it-tools" "jellyfin" + "n8n" "netbootxyz" "nextcloud" + "ntfy" + "odoo" "passbolt" "uptime-kuma" "vscodium" @@ -145,11 +167,15 @@ WEB_APPLICATIONS_DESCRIPTION=( "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" + "Homepage : A modern dashboard to organize your applications and services" "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" + "N8n : Workflow automation tool" "netboot.xyz : PXE boot various OS installers and utilities" "Nextcloud : A self-hosted productivity platform, like Google Drive & Office" + "Ntfy : Send push notifications to your phone or desktop via HTTP" + "Odoo : Open-source business management suite (ERP & CRM)" "Passbolt: An open-source, security-first password manager for teams" "Uptime-Kuma : A fancy self-hosted monitoring tool" "VSCodium : An open-source version of VScode in your web browser" @@ -170,8 +196,8 @@ user_input() { local SENSITIVE="${6:-false}" while true; do - [[ "$SENSITIVE" == "false" ]] && INPUT_VALUE=$(gum input --placeholder "${PLACEHOLDER}" --header "${HEADER}") - [[ "$SENSITIVE" == "true" ]] && INPUT_VALUE=$(gum input --password --placeholder "${PLACEHOLDER}" --header "${HEADER}") + [[ "${SENSITIVE}" == "false" ]] && INPUT_VALUE=$(gum input --placeholder "${PLACEHOLDER}" --header "${HEADER}") + [[ "${SENSITIVE}" == "true" ]] && INPUT_VALUE=$(gum input --password --placeholder "${PLACEHOLDER}" --header "${HEADER}") if [[ -z "${INPUT_VALUE}" ]]; then echo "❌ Error: Input cannot be empty. Please provide the necessary information." @@ -246,19 +272,21 @@ import_variables() { local CONFIG_PATH="$(gum file)" source "${CONFIG_PATH}" - local MISSING=0 + local MISSING=false for VAR in "${VARIABLES_LIST[@]}"; do if [[ -v "${VAR}" && -n "${!VAR}" ]]; then gum style "✅ "${VAR}" imported successfully from the config file" else gum style "❌ "${VAR}" is missing or empty" - MISSING=1 + MISSING=true fi done - if [[ "${MISSING}" -eq 1 ]]; then - echo -e "\n❌ Please check your configuration file to include all necessary variables" - exit 1 + if [[ "${MISSING}" == "true" ]]; then + if [[ "${NECESSARY}" = "true" ]]; then + echo -e "\n❌ Please check your configuration file to include all necessary variables" + exit 1 + fi fi if [[ "${DEBUG:-false}" == "true" ]]; then @@ -1031,7 +1059,15 @@ EOF sleep 1 # Choose the action -ACTION_ANSWER=$(gum choose "[1] 🌐 Deploy NixOS on a remote machine" "[2] 💽 Deploy NixOS on a remote machine with a file configuration" "[3] 🛠️ Update a NixOS remote machine") +ACTION_ANSWER=$(gum choose \ + "[1.A] 🌍 Deploy interactively a numbus-server" \ + "[1.B] 🌍 Deploy non-interactively (with a config file) a numbus-server" \ + "[2.A] 💾 Deploy interactively a numbus-backup-server" \ + "[2.B] 💾 Deploy non-interactively (with a config file) a numbus-backup-server" \ + "[3.A] 💻 Deploy interactively a numbus-computer" \ + "[3.B] 💻 Deploy non-interactively (with a config file) a numbus-computer" \ + "[4.A] 📺 Deploy interactively a numbus-tv" \ + "[4.B] 📺 Deploy non-interactively (with a config file) a numbus-tv" ) if [[ "$ACTION_ANSWER" == "[1] 🌐 Deploy NixOS on a remote machine" ]]; then TARGET_USER="nixos" diff --git a/numbus-backup-server.conf b/numbus-backup-server.conf index e69de29..77b799e 100644 --- a/numbus-backup-server.conf +++ b/numbus-backup-server.conf @@ -0,0 +1,88 @@ +# --> +# MANDATORY SETTINGS +# <-- + +## Script settings +export DEBUG="true" + +## Live target settings +export LIVE_TARGET_IP="192.168.1.10" +export LIVE_TARGET_PASSWD="example" + +## Server settings +export SERVER_LANGUAGE="FR" +export SERVER_LOCALE="fr_FR" +export SERVER_TIMEZONE="Europe/Paris" +export SERVER_OWNER_NAME="yourName" +export SERVER_USER_EMAIL="user@your-domain.com" +export SERVER_ADMIN_EMAIL="admin@your-domain.com" +export SERVER_AUTHORIZED_SSH_PUBKEYS=( "ssh-ed25519 AAAAoefzefpoipoeCEZJCPEACPAcjapjcpajepcjAPJECJPEJAPJAZ yours@yourdomain.com" ) + +## Traefik settings +export CLOUDFLARE_DNS_API_TOKEN="yourToken" + +## Smtp settings +export SMTP_SERVER_USERNAME="your-address@gmail.com" +export SMTP_SERVER_PASSWORD="emrp raps vzoi vnoe" +export SMTP_SERVER_HOST="smtp.yourdomain.com" +export SMTP_SERVER_PORT="587" + +## Network settings +export NETWORK_SUBNET="192.168.1.0/24" +export NETWORK_ROUTER_IP="192.168.1.1" +export HOME_SERVER_IP="192.168.1.5" + +## Services settings +export DOMAIN_NAME="yourdomain.com" + +## DNS service +export SELECTED_DNS_SERVICE=( + "pi-hole" # or "adguard" +) + +## Web applications +export SELECTED_WEB_APPLICATIONS=( + "crafty" + "frigate" + "gitea" + "home-assistant" + "immich" + "it-tools" + "jellyfin" + "netbootxyz" + "nextcloud" + "passbolt" + "uptime-kuma" + "vscodium" +) + +## System services +export SELECTED_SYSTEM_SERVICES=( + "clamav" + "virtualization" +) + +# --> +# OPTIONAL SETTINGS +# <-- + +## DNS service subdomain +export SELECTED_DNS_SERVICE_SUBDOMAIN=( + "my-pi-hole-subdomain" # or "my-adguard-subdomain" +) + +## Web applications 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/numbus-computer.conf b/numbus-computer.conf index e69de29..8802a97 100644 --- a/numbus-computer.conf +++ b/numbus-computer.conf @@ -0,0 +1,22 @@ +# --> +# MANDATORY SETTINGS +# <-- + +## Script settings +export DEBUG="true" + +## Live target settings +export LIVE_TARGET_IP="192.168.1.10" +export LIVE_TARGET_PASSWD="example" + +## Computer settings +export COMPUTER_LANGUAGE="FR" +export COMPUTER_LOCALE="fr_FR" +export COMPUTER_TIMEZONE="Europe/Paris" +export COMPUTER_OWNER_NAME="yourName" +export COMPUTER_AUTHORIZED_SSH_PUBKEYS=( "ssh-ed25519 AAAAoefzefpoipoeCEZJCPEACPAcjapjcpajepcjAPJECJPEJAPJAZ yours@yourdomain.com" ) + +## Network settings +export NETWORK_SUBNET="192.168.1.0/24" +export NETWORK_ROUTER_IP="192.168.1.1" +export HOME_SERVER_IP="192.168.1.5" \ No newline at end of file diff --git a/numbus-server.conf b/numbus-server.conf index 3c3fe9a..c1dd981 100644 --- a/numbus-server.conf +++ b/numbus-server.conf @@ -1,37 +1,41 @@ -# SCRIPT SETTINGS +# --> +# MANDATORY SETTINGS +# <-- + +## Script settings export DEBUG="true" -#LIVE TARGET SETTINGS +## Live target settings export LIVE_TARGET_IP="192.168.1.10" export LIVE_TARGET_PASSWD="example" -#SERVER SETTINGS -export LANGUAGE="FR" -export LOCALE="fr_FR" -export TIMEZONE="Europe/Paris" +## Server settings +export SERVER_LANGUAGE="FR" +export SERVER_LOCALE="fr_FR" +export SERVER_TIMEZONE="Europe/Paris" export SERVER_OWNER_NAME="yourName" export SERVER_USER_EMAIL="user@your-domain.com" export SERVER_ADMIN_EMAIL="admin@your-domain.com" -export AUTHORIZED_SSH_PUBLIC_KEY=( "ssh-ed25519 AAAAoefzefpoipoeCEZJCPEACPAcjapjcpajepcjAPJECJPEJAPJAZ yours@yourdomain.com" ) +export SERVER_AUTHORIZED_SSH_PUBKEYS=( "ssh-ed25519 AAAAoefzefpoipoeCEZJCPEACPAcjapjcpajepcjAPJECJPEJAPJAZ yours@yourdomain.com" ) -# TRAEFIK SETTINGS -export DOMAIN_NAME="yourdomain.com" +## Traefik settings export CLOUDFLARE_DNS_API_TOKEN="yourToken" -# SMTP SETTINGS +## Smtp settings export SMTP_SERVER_USERNAME="your-address@gmail.com" export SMTP_SERVER_PASSWORD="emrp raps vzoi vnoe" export SMTP_SERVER_HOST="smtp.yourdomain.com" export SMTP_SERVER_PORT="587" -#NETWORK SETTINGS +## Network settings export NETWORK_SUBNET="192.168.1.0/24" export NETWORK_ROUTER_IP="192.168.1.1" export HOME_SERVER_IP="192.168.1.5" -# SERVICES SETTINGS +## Services settings +export DOMAIN_NAME="yourdomain.com" export SELECTED_DNS_SERVICE=( - "pi-hole" # or adguard + "pi-hole" # or "adguard" ) export SELECTED_WEB_APPLICATIONS=( "crafty" @@ -52,10 +56,16 @@ export SELECTED_SYSTEM_SERVICES=( "virtualization" ) +# --> # OPTIONAL SETTINGS +# <-- + +## DNS service subdomain export SELECTED_DNS_SERVICE_SUBDOMAIN=( "my-pi-hole-subdomain" # or "my-adguard-subdomain" ) + +## Web applications subdomain export SELECTED_WEB_APPLICATIONS_SUBDOMAIN=( # ⚠️ Must match SELECTED_WEB_APPLICATIONS order ⚠️ "my-crafty-subdomain" "my-frigate-subdomain" diff --git a/numbus-tv.conf b/numbus-tv.conf index e69de29..8802a97 100644 --- a/numbus-tv.conf +++ b/numbus-tv.conf @@ -0,0 +1,22 @@ +# --> +# MANDATORY SETTINGS +# <-- + +## Script settings +export DEBUG="true" + +## Live target settings +export LIVE_TARGET_IP="192.168.1.10" +export LIVE_TARGET_PASSWD="example" + +## Computer settings +export COMPUTER_LANGUAGE="FR" +export COMPUTER_LOCALE="fr_FR" +export COMPUTER_TIMEZONE="Europe/Paris" +export COMPUTER_OWNER_NAME="yourName" +export COMPUTER_AUTHORIZED_SSH_PUBKEYS=( "ssh-ed25519 AAAAoefzefpoipoeCEZJCPEACPAcjapjcpajepcjAPJECJPEJAPJAZ yours@yourdomain.com" ) + +## Network settings +export NETWORK_SUBNET="192.168.1.0/24" +export NETWORK_ROUTER_IP="192.168.1.1" +export HOME_SERVER_IP="192.168.1.5" \ No newline at end of file From b156bf443e7666c13321a33c8fde4ca8e627d9f5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rapha=C3=ABl=20Numbus?= Date: Wed, 18 Mar 2026 13:26:13 +0100 Subject: [PATCH 12/43] Added documentation for the numbus-server --- deploy.sh | 243 +++++++++--------- docs/deployment_overview.png | Bin 0 -> 260960 bytes docs/index.md | 45 ++++ docs/logo.png | Bin 0 -> 32548 bytes docs/numbus-backup-server/requirements.md | 31 +++ docs/numbus-computer/requirements.md | 31 +++ .../configuration/automatic_ssl_certs.md | 7 + docs/numbus-server/configuration/index.md | 19 ++ .../configuration/live_target.md | 8 + docs/numbus-server/configuration/mail.md | 24 ++ docs/numbus-server/configuration/network.md | 9 + docs/numbus-server/configuration/script.md | 7 + docs/numbus-server/configuration/server.md | 13 + .../configuration/services/crafty.md | 13 + .../configuration/services/index.md | 45 ++++ docs/numbus-server/requirements.md | 31 +++ docs/numbus-tv/requirements.md | 31 +++ numbus-backup-server.conf | 101 ++++++-- numbus-server.conf | 83 ++++-- wg0.conf | 1 + 20 files changed, 581 insertions(+), 161 deletions(-) create mode 100644 docs/deployment_overview.png create mode 100644 docs/index.md create mode 100644 docs/logo.png create mode 100644 docs/numbus-backup-server/requirements.md create mode 100644 docs/numbus-computer/requirements.md create mode 100644 docs/numbus-server/configuration/automatic_ssl_certs.md create mode 100644 docs/numbus-server/configuration/index.md create mode 100644 docs/numbus-server/configuration/live_target.md create mode 100644 docs/numbus-server/configuration/mail.md create mode 100644 docs/numbus-server/configuration/network.md create mode 100644 docs/numbus-server/configuration/script.md create mode 100644 docs/numbus-server/configuration/server.md create mode 100644 docs/numbus-server/configuration/services/crafty.md create mode 100644 docs/numbus-server/configuration/services/index.md create mode 100644 docs/numbus-server/requirements.md create mode 100644 docs/numbus-tv/requirements.md create mode 100644 wg0.conf diff --git a/deploy.sh b/deploy.sh index 88e7771..b25a0b1 100644 --- a/deploy.sh +++ b/deploy.sh @@ -30,23 +30,22 @@ NECESSARY_BACKUP_SERVER_VARIABLES_LIST=( NETWORK_SUBNET NETWORK_ROUTER_IP NETWORK_HOME_SERVER_IP - # SERVICES SETTINGS - SERVICES_DOMAIN_NAME - SERVICES_SELECTED_SYSTEM - SERVICES_SELECTED_WEB_APPLICATIONS ) OPTIONAL_BACKUP_SERVER_VARIABLES_LIST=( # SERVICES SETTINGS - SELECTED_DNS_SERVICE_SUBDOMAIN - SELECTED_WEB_APPLICATIONS_SUBDOMAIN + SERVICES_DOMAIN_NAME + SERVICES_SELECTED_SYSTEM_PACKAGES + SERVICES_SELECTED_SYSTEM_SERVICES + SERVICES_SELECTED_WEB_APPLICATIONS + SERVIVCES_SELECTED_WEB_APPLICATIONS_SUBDOMAIN ) NECESSARY_COMPUTER_VARIABLES_LIST=( - #LIVE TARGET SETTINGS + # LIVE TARGET SETTINGS LIVE_TARGET_IP LIVE_TARGET_PASSWD - #COMPUTER SETTINGS + # COMPUTER SETTINGS COMPUTER_LANGUAGE COMPUTER_LOCALE COMPUTER_TIMEZONE @@ -54,16 +53,22 @@ NECESSARY_COMPUTER_VARIABLES_LIST=( COMPUTER_USER_EMAIL COMPUTER_ADMIN_EMAIL COMPUTER_AUTHORIZED_SSH_PUBKEYS - #NETWORK SETTINGS - NETWORK_SUBNET - NETWORK_ROUTER_IP - NETWORK_HOME_COMPUTER_IP + # USER SETTINGS + USER_ADMINISTRATORS + USER_NORMAL_USERS ) OPTIONAL_COMPUTER_VARIABLES_LIST=( + # NETWORK SETTINGS + NETWORK_SUBNET + NETWORK_ROUTER_IP + NETWORK_HOME_COMPUTER_IP # SERVICES SETTINGS - SERVICES_SELECTED_SYSTEM - SERVICES_SELECTED_APPLICATIONS + SERVICES_SELECTED_SYSTEM_PACKAGES + SERVICES_SELECTED_DESKTOP_ENVIRONMENT + SERVICE_SELECTED_GNOME_EXTENSIONS + SERVICES_SELECTED_FLATPAK_APPLICATIONS + SERVICES_SELECTED_WEB_APPLICATIONS ) NECESSARY_SERVER_VARIABLES_LIST=( @@ -122,16 +127,18 @@ NECESSARY_TV_VARIABLES_LIST=( OPTIONAL_TV_VARIABLES_LIST=( # SERVICES SETTINGS - SERVICES_SELECTED_SYSTEM + SERVICES_SELECTED_SYSTEM_PACKAGES + SERVICES_SELECTED_FLATPAK_APPLICATIONS SERVICES_SELECTED_WEB_APPLICATIONS ) -# Available services +# Available DNS services DNS_SERVICES_LIST=( "pi-hole" "adguard" ) +# Available services WEB_APPLICATIONS_LIST=( "crafty" "frigate" @@ -151,6 +158,7 @@ WEB_APPLICATIONS_LIST=( "vscodium" ) +# Available system services SYSTEM_SERVICES_LIST=( "clamav" "virtualization" @@ -158,27 +166,27 @@ SYSTEM_SERVICES_LIST=( # Services descriptions DNS_SERVICES_DESCRIPTION=( - "Pi-Hole : Simple open-source DNS black hole" - "AdGuard : Feature rich DNS service" + "Pi-hole : Simple, fully open network-wide Ad Blocker" + "AdGuard : Feature-rich network-wide Ad Blocker" ) 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" - "Homepage : A modern dashboard to organize your applications and services" - "Immich : Self-hosted Google Photos alternative for photos and videos" + "Frigate [Home Assistant required] : NVR with real-time local object detection for IP cameras" + "Gitea : Painless self-hosted Git service" + "Home-Assistant : Open source home automation that puts local control and privacy first" + "Homepage : A modern, secure, highly customizable application dashboard" + "Immich : High performance self-hosted photo and video management solution" "IT-tools : Handy collection of online tools for developers" - "Jellyfin : A self-hosted media server to stream your movies and music" - "N8n : Workflow automation tool" - "netboot.xyz : PXE boot various OS installers and utilities" - "Nextcloud : A self-hosted productivity platform, like Google Drive & Office" - "Ntfy : Send push notifications to your phone or desktop via HTTP" - "Odoo : Open-source business management suite (ERP & CRM)" - "Passbolt: An open-source, security-first password manager for teams" + "Jellyfin : The Free Software Media System" + "N8n : Workflow automation for technical people" + "netboot.xyz : Network boot various operating system installers and utilities" + "Nextcloud : The most popular self-hosted collaboration platform" + "Ntfy : Send push notifications to your phone or desktop via PUT/POST" + "Odoo : Open Source ERP and CRM" + "Passbolt : Open source password manager for teams" "Uptime-Kuma : A fancy self-hosted monitoring tool" - "VSCodium : An open-source version of VScode in your web browser" + "VSCodium : Free/Libre Open Source Software Binaries of VS Code" ) SYSTEM_SERVICES_DESCRIPTION=( @@ -1032,99 +1040,54 @@ it simple and use defaults) and take care to note down all the passwords. Change set -euo pipefail -fastfetch --logo nixos --structure ' ' +clear +fastfetch --logo nixos --logo-padding-left 4 --structure ' ' -cat << EOF - - ██████ █████ █████ -▒▒██████ ▒▒███ ▒▒███ - ▒███▒███ ▒███ █████ ████ █████████████ ▒███████ █████ ████ █████ - ▒███▒▒███▒███ ▒▒███ ▒███ ▒▒███▒▒███▒▒███ ▒███▒▒███▒▒███ ▒███ ███▒▒ - ▒███ ▒▒██████ ▒███ ▒███ ▒███ ▒███ ▒███ ▒███ ▒███ ▒███ ▒███ ▒▒█████ - ▒███ ▒▒█████ ▒███ ▒███ ▒███ ▒███ ▒███ ▒███ ▒███ ▒███ ▒███ ▒▒▒▒███ - █████ ▒▒█████ ▒▒████████ █████▒███ █████ ████████ ▒▒████████ ██████ -▒▒▒▒▒ ▒▒▒▒▒ ▒▒▒▒▒▒▒▒ ▒▒▒▒▒ ▒▒▒ ▒▒▒▒▒ ▒▒▒▒▒▒▒▒ ▒▒▒▒▒▒▒▒ ▒▒▒▒▒▒ - - █████████ - ███▒▒▒▒▒███ -▒███ ▒▒▒ ██████ ████████ █████ █████ ██████ ████████ -▒▒█████████ ███▒▒███▒▒███▒▒███▒▒███ ▒▒███ ███▒▒███▒▒███▒▒███ - ▒▒▒▒▒▒▒▒███▒███████ ▒███ ▒▒▒ ▒███ ▒███ ▒███████ ▒███ ▒▒▒ - ███ ▒███▒███▒▒▒ ▒███ ▒▒███ ███ ▒███▒▒▒ ▒███ -▒▒█████████ ▒▒██████ █████ ▒▒█████ ▒▒██████ █████ - ▒▒▒▒▒▒▒▒▒ ▒▒▒▒▒▒ ▒▒▒▒▒ ▒▒▒▒▒ ▒▒▒▒▒▒ ▒▒▒▒▒ - -EOF +gum style --align center --width 80 --foreground 212 " + ██████ █████ █████ +▒▒██████ ▒▒███ ▒▒███ + ▒███▒███ ▒███ █████ ████ █████████████ ▒███████ █████ ████ █████ + ▒███▒▒███▒███ ▒▒███ ▒▒███ ▒▒███▒▒███▒▒███ ▒███▒▒███▒▒███ ▒▒███ ███▒▒ + ▒███ ▒▒██████ ▒███ ▒▒███ ▒███ ▒███ ▒███ ▒███ ▒███ ▒███ ▒▒███ ▒▒█████ + ▒███ ▒▒█████ ▒███ ▒▒███ ▒███ ▒███ ▒███ ▒███ ▒███ ▒███ ▒▒███ ▒▒▒▒███ + █████ ▒▒█████ ▒▒████████ █████▒███ █████ ████████ ▒▒████████ ██████ +▒▒▒▒▒ ▒▒▒▒▒ ▒▒▒▒▒▒▒▒ ▒▒▒▒▒ ▒▒▒ ▒▒▒▒▒ ▒▒▒▒▒▒▒▒ ▒▒▒▒▒▒▒▒ ▒▒▒▒▒▒ + █████████ + ███▒▒▒▒▒███ +▒███ ▒▒▒ ██████ ████████ █████ █████ ██████ ████████ +▒▒█████████ ███▒▒███▒▒███▒▒███▒▒███ ▒▒███ ███▒▒███▒▒███▒▒███ + ▒▒▒▒▒▒▒▒███▒███████ ▒███ ▒▒▒ ▒███ ▒███ ▒███████ ▒███ ▒▒▒ + ███ ▒███▒███▒▒▒ ▒███ ▒▒███ ███ ▒███▒▒▒ ▒███ +▒▒█████████ ▒▒██████ █████ ▒▒█████ ▒▒██████ █████ + ▒▒▒▒▒▒▒▒▒ ▒▒▒▒▒▒ ▒▒▒▒▒ ▒▒▒▒▒ ▒▒▒▒▒▒ ▒▒▒▒▒ +" sleep 1 -# Choose the action -ACTION_ANSWER=$(gum choose \ - "[1.A] 🌍 Deploy interactively a numbus-server" \ - "[1.B] 🌍 Deploy non-interactively (with a config file) a numbus-server" \ - "[2.A] 💾 Deploy interactively a numbus-backup-server" \ - "[2.B] 💾 Deploy non-interactively (with a config file) a numbus-backup-server" \ - "[3.A] 💻 Deploy interactively a numbus-computer" \ - "[3.B] 💻 Deploy non-interactively (with a config file) a numbus-computer" \ - "[4.A] 📺 Deploy interactively a numbus-tv" \ - "[4.B] 📺 Deploy non-interactively (with a config file) a numbus-tv" ) +SELECTED_DEVICE=$(gum choose --header "📦 Select the device type to deploy:" \ + "numbus-server" \ + "numbus-backup-server" \ + "numbus-computer" \ + "numbus-tv" \ +) -if [[ "$ACTION_ANSWER" == "[1] 🌐 Deploy NixOS on a remote machine" ]]; then - TARGET_USER="nixos" - echo -e "\n➡️ Proceeding with deployment…" - gum style --border normal --margin "1" --padding "1 2" --border-foreground 212 "➡️ On the target host : start the computer and boot into the NixOS iso. - Launch a console and set up a new user password" - gum confirm "Do you understand and wish to proceed?" || { echo "❌ Aborting as requested"; exit 1; } - strictly_necessary_information - necessary_information - hierarchy_preparation - setup_ssh - hardware_detection - services_selection - disks_selection - server_config_generation - network_config_generation - services_config_generation - mail_config_generation - disk_config_generation - keys_generation - sum_up - cloudflare_dns_setup - export_configuration - deploy - postrun_action +SELECTED_MODE=$(gum choose --header "🛠️ Select the deployment strategy for ${SELECTED_DEVICE}:" \ + "Semi-interactive (recommended - use a config file)" \ + "Interactive (manual input)" \ + "Update and Maintain (existing installation)" \ +) -elif [[ "$ACTION_ANSWER" == "[2] 💽 Deploy NixOS on a remote machine with a file configuration" ]]; then - TARGET_USER="nixos" - echo -e "\n➡️ Proceeding with deployment using a config file…" - gum style --border normal --margin "1" --padding "1 2" --border-foreground 212 "➡️ On the target host : start the computer and boot into the NixOS iso. - Launch a console and set up a new user password" - gum confirm "Do you understand and wish to proceed?" || { echo "❌ Aborting as requested"; exit 1; } - import_variables - hierarchy_preparation - setup_ssh - hardware_detection - disks_selection - server_config_generation - network_config_generation - services_config_generation - mail_config_generation - disk_config_generation - keys_generation - sum_up - cloudflare_dns_setup - export_configuration - deploy - postrun_action - -elif [[ "$ACTION_ANSWER" == "[3] 🛠️ Update a NixOS remote machine" ]]; then +if [[ "${SELECTED_MODE}" == "Update and Maintain"* ]]; then TARGET_USER="numbus-admin" - echo -e "\n➡️ Proceeding with update…" - gum style --border normal --margin "1" --padding "1 2" --border-foreground 212 "➡️ On the target host : make sure the NixOS installation you want - to update is up-and-running, accessible with SSH" - gum confirm "Do you understand and wish to proceed?" || { echo "❌ Aborting as requested."; exit 1; } + echo -e "\n➡️ Proceeding with maintenance/update for ${SELECTED_DEVICE}..." + gum style --border normal --margin "1" --padding "1 2" --border-foreground 212 \ + "➡️ Ensure the remote device is powered on and accessible via SSH." + + gum confirm "Ready to proceed?" || { echo "❌ Aborted."; exit 1; } + strictly_necessary_information setup_ssh + # Maintain legacy update sequence more_information_config folder_tree_generation nix_generation @@ -1132,6 +1095,52 @@ elif [[ "$ACTION_ANSWER" == "[3] 🛠️ Update a NixOS remote machine" ]]; then congrats else - echo "Aborting - you did not type 1, 2 or 3" - exit 1 + TARGET_USER="nixos" + echo -e "\n➡️ Proceeding with new deployment for ${SELECTED_DEVICE}..." + gum style --border normal --margin "1" --padding "1 2" --border-foreground 212 \ + "➡️ On the target host: Boot into the NixOS ISO, launch a console, and set a temporary user password." + + gum confirm "Ready to proceed?" || { echo "❌ Aborted."; exit 1; } + + if [[ "${SELECTED_MODE}" == "Semi-interactive"* ]]; then + import_variables "${VARS_LIST[@]}" "true" + else + strictly_necessary_information + necessary_information + fi + + # Standard Deployment Pipeline + hierarchy_preparation + setup_ssh + hardware_detection + + # Server-specific logic + if [[ "${SELECTED_DEVICE}" == "numbus-server" ]]; then + services_selection + fi + + disks_selection + server_config_generation + network_config_generation + + if [[ "${SELECTED_DEVICE}" == "numbus-server" ]]; then + services_config_generation + fi + + # Mail setup for server-grade devices + if [[ "${SELECTED_DEVICE}" == *"server"* ]]; then + mail_config_generation + fi + + disk_config_generation + keys_generation + sum_up + + if [[ "${SELECTED_DEVICE}" == "numbus-server" ]]; then + cloudflare_dns_setup + fi + + export_configuration + deploy + postrun_action fi \ No newline at end of file diff --git a/docs/deployment_overview.png b/docs/deployment_overview.png new file mode 100644 index 0000000000000000000000000000000000000000..cfd189f3dc85f3e540bb236a77e75269c49e9247 GIT binary patch literal 260960 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 z z-7Fx0+*z#S;?-(34FNb~i5c)fT(c^|?1O?8vt20a7Fk~J;KHm6uaB1`xAh|0gvC>&&5L+0PW(n~cL`6&U_!q$z%|4OT_IppVU6)2T|gTy14q$h-Tb_ggCjKzr6&1x@J8>Kkc*0J|LF!BEb}kr@Q)`$KrbKQj2-JHv1= zaG#Vo&dElEur<)bJiv&0n|Zo^bzskPpx-Q8_xpYEHWSx`$&GF~62CRr+odIxXu!Nb zb^W=3-RoIGRCb66hr56D9a#dVI)v}qjq}F+WXjv^3;XlIL?%1afPTPmnZ-)OnCH`oE*Ilmfi!+;vA;fiVpl

D<13>w%)vjb&Fe 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

#|_*J%EXV&~{qQf-MT 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

3SYO=V{$z+HWIh%jIM@hhSk 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 + +## Deployment process overview + +A graph showing an overview of the deployment process + +## Table of contents + +### [Numbus Server](https://gittea.dev/numbus/numbus-server) + +* [Presentation](https://gittea.dev/numbus/numbus-server) +* [Requirements](./numbus-server/requirements.md) +* [Configuration](./numbus-server/configuration/index.md) +* [Deployment](./numbus-server/deployment/index.md) +* [Updates](./numbus-server/updates/index.md) +* [Maintenance](./numbus-server/maintenance/index.md) + +### [Numbus Backup Server](https://gittea.dev/numbus/numbus-backup-server) + +* [Presentation](https://gittea.dev/numbus/numbus-backup-server) +* [Requirements](./numbus-backup-server/requirements.md) +* [Configuration](./numbus-backup-server/configuration/index.md) +* [Deployment](./numbus-backup-server/deployment/index.md) +* [Updates](./numbus-backup-server/updates/index.md) +* [Maintenance](./numbus-backup-server/maintenance/index.md) + +### [Numbus Computer](https://gittea.dev/numbus/numbus-computer) + +* [Presentation](https://gittea.dev/numbus/numbus-computer) +* [Requirements](./numbus-computer/requirements.md) +* [Configuration](./numbus-computer/configuration/index.md) +* [Deployment](./numbus-computer/deployment/index.md) +* [Updates](./numbus-computer/updates/index.md) +* [Maintenance](./numbus-computer/maintenance/index.md) + +### [Numbus TV](https://gittea.dev/numbus/numbus-tv) + +* [Presentation](https://gittea.dev/numbus/numbus-tv) +* [Requirements](./numbus-tv/requirements.md) +* [Configuration](./numbus-tv/configuration/index.md) +* [Deployment](./numbus-tv/deployment/index.md) +* [Updates](./numbus-tv/updates/index.md) +* [Maintenance](./numbus-tv/maintenance/index.md) \ No newline at end of file diff --git a/docs/logo.png b/docs/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..28581fae8652e470a39818f546fffb7c6b525438 GIT binary patch literal 32548 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 🚀 Let's fill this configuration file ! + +The configuration file is divided into **multiple categories**. Some of them are **optional**, some are **mandatory**. Here is the list of categories : + +| Category | Available variables | +| -------- | ------------------ | +| [Live target settings](./live_target.md) | 2 | +| [Server settings](/.server.md) | 7 | +| [Mail settings](./mail.md) | 4 | +| [Traefik settings](./automatic_ssl_certs.md) | 1 | +| [Network settings](./network.md) | 3 | +| [Services selection](./services/index.md) | 5 | +| [Script settings](./script.md) | 1 | \ No newline at end of file diff --git a/docs/numbus-server/configuration/live_target.md b/docs/numbus-server/configuration/live_target.md new file mode 100644 index 0000000..93c1787 --- /dev/null +++ b/docs/numbus-server/configuration/live_target.md @@ -0,0 +1,8 @@ +# Documentation + +### 📦 Configuring the target settings + +| Variable | Description | Values | Default | +| -------- | ----------- | ------- | --------- | +| LIVE_TARGET_IP | The IP address of the target machine. Without the CIDR notation. | "192.168.1.28", "10.10.10.45", ... | | +| LIVE_TARGET_PASSWD | The password of the target machine that you set using the `passwd` command. | "my-password", ... | | \ No newline at end of file diff --git a/docs/numbus-server/configuration/mail.md b/docs/numbus-server/configuration/mail.md new file mode 100644 index 0000000..fc69931 --- /dev/null +++ b/docs/numbus-server/configuration/mail.md @@ -0,0 +1,24 @@ +# Documentation + +## 📬 Configuring the mail settings + +| Variable | Description | Values | Default | +| -------- | ----------- | ------ | --------- | +| SMTP_SERVER_USERNAME | The email address used to send automated emails (alerts, notifications). | "your-address@your-domain.com" | | +| SMTP_SERVER_PASSWORD | The password or app-specific password for the email account. | "your-secure-password" | | +| SMTP_SERVER_HOST | The address of the SMTP server. | "smtp.yourdomain.com" | "smtp.gmail.com" | +| SMTP_SERVER_PORT | The port number for the SMTP server. | "587" or "465" | "587" | + +## ❓ I don't already have an SMTP capable email + +If your provider doesn't support **standard SMTP**, the easiest solution is to create a **free Gmail account** dedicated to your server. + +Gmail allows you to generate an **App Password** which works perfectly for automated alerts. + +1. Navigate to the [Google account creation page](https://accounts.google.com/signup). Follow the prompts to create your account. Feel free **not to provide** real information about yourself. Giving your phone number and home address is **not needed**. + +2. Once your account is **created** navigate to the [Google account settings](https://myaccount.google.com). + +3. In the security page, enable the **two factor authentication (2FA)**. The best way to enable 2FA without providing too much information is using **TOTP codes** (under Authenticator label). You can use the open-source [Ente Auth](https://ente.io/auth/) app to get your **TOTP codes**. + +4. Finally, once **2FA** is enabled, you can generate an **app password**. Navigate to the [app passwords page](https://myaccount.google.com/apppasswords). Generate an app password and call it "numbus-server" to **remember** what it is used for. \ No newline at end of file diff --git a/docs/numbus-server/configuration/network.md b/docs/numbus-server/configuration/network.md new file mode 100644 index 0000000..665aa6a --- /dev/null +++ b/docs/numbus-server/configuration/network.md @@ -0,0 +1,9 @@ +# Documentation + +## 🛜 Configuring the server's network settings + +| Variable | Description | Values | Default | +| -------- | ----------- | ------ | --------- | +| NETWORK_SUBNET | The local network subnet in CIDR notation. | "192.168.1.0/24", "10.10.10.0/24", ... | "192.168.1.0/24" | +| NETWORK_ROUTER_IP | The IP address of your internet router/gateway. | "192.168.1.1", "192.168.1.254", ... | "192.168.1.1" | +| HOME_SERVER_IP | The static IP address to assign to this server (must be outside the router's DHCP range). | "192.168.1.5", "192.168.0.200", ... | "192.168.1.254" | \ No newline at end of file diff --git a/docs/numbus-server/configuration/script.md b/docs/numbus-server/configuration/script.md new file mode 100644 index 0000000..2eb5224 --- /dev/null +++ b/docs/numbus-server/configuration/script.md @@ -0,0 +1,7 @@ +# Documentation + +## 📜 Configuring the script's settings + +| Variable | Description | Values | Default | +| -------- | ----------- | ------ | --------- | +| VERBOSE | Enables verbose logging for the deployment script (useful for debugging). | "true" or "false" | "false" | \ No newline at end of file diff --git a/docs/numbus-server/configuration/server.md b/docs/numbus-server/configuration/server.md new file mode 100644 index 0000000..ddc7fd7 --- /dev/null +++ b/docs/numbus-server/configuration/server.md @@ -0,0 +1,13 @@ +# Documentation + +## ⚙️ Configuring the server settings + +| Variable | Description | Values | Default | +| -------- | ----------- | ------ | --------- | +| SERVER_LANGUAGE | The desired language for the server's system and services. | "FR", "DE", "UK", ... | "FR" | +| SERVER_LOCALE | Defines the server's regional settings, including date, time, and number formatting. | "fr_FR", "de_DE", "en_UK", ... | "fr_FR" | +| SERVER_TIMEZONE | Sets the server's timezone to ensure accurate timekeeping for logs and services. | "Europe/Paris", "Europe/Berlin", "Europe/London", ... | "Europe/Paris" | +| SERVER_OWNER_NAME | The name of the server owner. Will be used for emails personnalization and server identification (if you have multiple servers for example). | "Alexandre", "Jane", ... | "Numbus" | +| SERVER_USER_EMAIL | This email will be used to send friendly alerts in case of problems. | "your-user@your-domain.com" | | +| SERVER_ADMIN_EMAIL | This email will be used to send complete alerts, including some logs, in case of problems. | "your-admin@your-domain.com" | | +| SERVER_AUTHORIZED_SSH_PUBKEYS | The public SSH key(s) that will be authorized to access the server. You can add multiple keys in the parenthesis, space-separated. | ( "ssh-ed25519 AAAAoefzefpoipoeCEZJCPEACPAcjapjcpajepcjAPJECJPEJAPJAZ yours@your-domain.com" ) | | \ No newline at end of file diff --git a/docs/numbus-server/configuration/services/crafty.md b/docs/numbus-server/configuration/services/crafty.md new file mode 100644 index 0000000..2f940c0 --- /dev/null +++ b/docs/numbus-server/configuration/services/crafty.md @@ -0,0 +1,13 @@ +# Documentation + +## ⛏️ Configuring Crafty Controller + +To access your Minecraft server, **ports** need to be **open on the firewall**. In order to **minimize** the number of open ports and thus reduce **risks**, the numbus-server will only open a necessary number of ports that matches the number of minecraft. **Most people** should set the number of servers to **1** of their favorite version. + +These option **only configure networking** and **won't** create the Minecraft server for you. You will have to do it in Crafty's interface. + +| Variable | Description | Values | Default | +| -------- | ----------- | ------ | --------- | +| DYNMAP_ENABLED | Enables the Dynmap feature for Minecraft servers. | "true" or "false" | "false" | +| WANTED_NUMBER_OF_JAVA_MINECRAFT_SERVERS | The number of Java Edition Minecraft servers you plan on creating. | "0", "1", ..., "100" | "0" | +| WANTED_NUMBER_OF_BEDROCK_MINECRAFT_SERVERS | The number of Bedrock Edition Minecraft servers you plan on creating. | "0", "1", ..., "100" | "0" | \ No newline at end of file diff --git a/docs/numbus-server/configuration/services/index.md b/docs/numbus-server/configuration/services/index.md new file mode 100644 index 0000000..666dc63 --- /dev/null +++ b/docs/numbus-server/configuration/services/index.md @@ -0,0 +1,45 @@ +# Documentation + +## 🛠️ Configuring the server's services + +| Variable | Description | Values | Default | +| -------- | ----------- | ------ | --------- | +| SELECTED_DNS_SERVICE | The DNS service to install (AdBlocking). | ( "pi-hole" ), ( "adguard" ) | ( "pi-hole" ) | +| SELECTED_WEB_APPLICATIONS | The list of web applications to install. | ( "nextcloud" ), ( "homepage" jellyfin" "it-tools" "netbootxyz" ), ... [see the full list below](./index.md#web-applications-list) | | +| SELECTED_SYSTEM_SERVICES | The list of system services to install. | ( "clamav" ), ( "virtualization" "clamav" ), ... [see the full list below](./index.md#system-services-list) | | +| SELECTED_DNS_SERVICE_SUBDOMAIN | Custom subdomain for the DNS service. | "my-dns" | Will be the name of the service. I.e. pi-hole.your-domain.com or adguard.your-domain.com | +| SELECTED_WEB_APPLICATIONS_SUBDOMAIN | Custom subdomains for the web applications (must match the order of SELECTED_WEB_APPLICATIONS). | "my-cloud", "my-photos" | Will be the name of the service. I.e. nextcloud.your-domain.com, immich.your-domain.com, ... | + +## Web applications list + +This is the list of **all the available apps** that can be enabled on the numbus-server. You can choose as many as you want, just **keep in mind** that enabling more apps will be more resource **intensive** and consume more power. + +| Name | Description | Additional settings ? | +| -------- | ----------- | ------ | +| pi-hole | Simple, fully open network-wide Ad Blocker. | No | +| adguard | Feature-rich network-wide Ad Blocker. | No | +| crafty | Minecraft server(s) manager. | [Yes](./crafty.md) | +| frigate | NVR with real-time local object detection. | No | +| gitea | Painless self-hosted Git service. | No | +| home-assistant | Open source home automation. | No | +| homepage | A modern, secure, highly customizable dashboard. | No | +| immich | High performance self-hosted photo/video management. | No | +| it-tools | Collection of online tools for developers. | No | +| jellyfin | The Free Software Media System. | No | +| n8n | Workflow automation tool. | No | +| netbootxyz | Network boot operating system installers. | No | +| nextcloud | Self-hosted collaboration platform. | No | +| ntfy | Send push notifications via HTTP. | No | +| odoo | Open Source ERP and CRM. | No | +| passbolt | Open source password manager. | No | +| uptime-kuma | Self-hosted monitoring tool. | No | +| vscodium | VS Code in your browser. | No | +| clamav | Open-source anti-virus. | No | +| virtualization | Run Virtual Machines (KVM/QEMU). | No | + +## System services list + +| Name | Description | Additional settings ? | +| -------- | ----------- | ------ | +| clamav | Open-source anti-virus software. | No | +| virtualization | Run Virtual Machines (KVM/QEMU). | No | \ No newline at end of file diff --git a/docs/numbus-server/requirements.md b/docs/numbus-server/requirements.md new file mode 100644 index 0000000..ca8528e --- /dev/null +++ b/docs/numbus-server/requirements.md @@ -0,0 +1,31 @@ +# Requirements + +### To deploy + +To deploy a numbus-backup-server, you will need : + +* A **live NixOS** bootable USB disk. + +You will make the **target** machine **boot** into the NixOS live environment using this **USB stick**. Download the [NixOS iso](https://github.com/nix-community/nixos-images/releases/download/nixos-unstable/nixos-installer-x86_64-linux.iso) image. + +*On Linux* : Flash it using [Impression (flatpak)](https://flathub.org/en/apps/io.gitlab.adhami3310.Impression) or [BalenaEtcher (AppImage)](https://etcher.balena.io/#download-etcher). + +*On MacOS* : Flash it using [BalenaEtcher](https://etcher.balena.io/#download-etcher). + +*On Windows* : Flash it using [Rufus](https://rufus.ie/en/#download) or [BalenaEtcher](https://etcher.balena.io/#download-etcher). + +* **Source** Machine: + +Can be any machine with **Nix installed**, e.g. a **NixOS** machine. + +* **Target** Machine: + +Can be **any computer** (desktop, SFF, tiny/mini/micro, even a laptop). It could be a dedicated server that you bought or just some computer that you decided to repurpose into a backup server. + +* **Network connection** between the source and the target machine. + +--- + +### Next step + +[Configuration](./configuration/index.md) diff --git a/docs/numbus-tv/requirements.md b/docs/numbus-tv/requirements.md new file mode 100644 index 0000000..ca8528e --- /dev/null +++ b/docs/numbus-tv/requirements.md @@ -0,0 +1,31 @@ +# Requirements + +### To deploy + +To deploy a numbus-backup-server, you will need : + +* A **live NixOS** bootable USB disk. + +You will make the **target** machine **boot** into the NixOS live environment using this **USB stick**. Download the [NixOS iso](https://github.com/nix-community/nixos-images/releases/download/nixos-unstable/nixos-installer-x86_64-linux.iso) image. + +*On Linux* : Flash it using [Impression (flatpak)](https://flathub.org/en/apps/io.gitlab.adhami3310.Impression) or [BalenaEtcher (AppImage)](https://etcher.balena.io/#download-etcher). + +*On MacOS* : Flash it using [BalenaEtcher](https://etcher.balena.io/#download-etcher). + +*On Windows* : Flash it using [Rufus](https://rufus.ie/en/#download) or [BalenaEtcher](https://etcher.balena.io/#download-etcher). + +* **Source** Machine: + +Can be any machine with **Nix installed**, e.g. a **NixOS** machine. + +* **Target** Machine: + +Can be **any computer** (desktop, SFF, tiny/mini/micro, even a laptop). It could be a dedicated server that you bought or just some computer that you decided to repurpose into a backup server. + +* **Network connection** between the source and the target machine. + +--- + +### Next step + +[Configuration](./configuration/index.md) diff --git a/numbus-backup-server.conf b/numbus-backup-server.conf index 77b799e..2fa35de 100644 --- a/numbus-backup-server.conf +++ b/numbus-backup-server.conf @@ -1,88 +1,147 @@ -# --> -# MANDATORY SETTINGS -# <-- +### -----------------> ### +### MANDATORY SETTINGS ### + -## Script settings -export DEBUG="true" ## Live target settings +# The IP address of the machine to install NixOS on (must be reachable via SSH). export LIVE_TARGET_IP="192.168.1.10" +# The password of the live installer environment (the one you set using 'passwd' on the live machine). export LIVE_TARGET_PASSWD="example" -## Server settings + +## Backup server settings +# The language/keyboard layout (e.g. FR, EN, DE). export SERVER_LANGUAGE="FR" +# The system locale (e.g. fr_FR, en_US, de_DE). export SERVER_LOCALE="fr_FR" +# The timezone (e.g. Europe/Paris, America/New_York, Europe/Berlin). export SERVER_TIMEZONE="Europe/Paris" +# The name of the server owner. Used in mails and for identification (if you bought support or have multiple servers). export SERVER_OWNER_NAME="yourName" +# The email address where services notifications and alerts will be sent. export SERVER_USER_EMAIL="user@your-domain.com" +# The email address where system failure notifications and alerts will be sent. export SERVER_ADMIN_EMAIL="admin@your-domain.com" +# A list of SSH public keys allowed to log in as the administrator. export SERVER_AUTHORIZED_SSH_PUBKEYS=( "ssh-ed25519 AAAAoefzefpoipoeCEZJCPEACPAcjapjcpajepcjAPJECJPEJAPJAZ yours@yourdomain.com" ) + ## Traefik settings +# Cloudflare API token with "Zone:DNS:Edit" permissions for automatic renewal of Let's Encrypt certificates. export CLOUDFLARE_DNS_API_TOKEN="yourToken" + ## Smtp settings +# The email account used by the server to send outgoing notifications. export SMTP_SERVER_USERNAME="your-address@gmail.com" +# The password for the email account (use an App Password if using Gmail/2FA). export SMTP_SERVER_PASSWORD="emrp raps vzoi vnoe" export SMTP_SERVER_HOST="smtp.yourdomain.com" export SMTP_SERVER_PORT="587" + ## Network settings +# The local network subnet in CIDR notation (e.g. 192.168.1.0/24). export NETWORK_SUBNET="192.168.1.0/24" +# The IP address of your internet router/gateway. export NETWORK_ROUTER_IP="192.168.1.1" +# The static IP address to assign to this server (must be outside the router's DHCP range). export HOME_SERVER_IP="192.168.1.5" + ## Services settings +# The root domain name for your services (e.g. example.com). export DOMAIN_NAME="yourdomain.com" -## DNS service -export SELECTED_DNS_SERVICE=( - "pi-hole" # or "adguard" -) ## Web applications +# All apps are open-source, fully local export SELECTED_WEB_APPLICATIONS=( + # Minecraft server(s) manager. Supports Bedrock and Java, Dynmap. https://craftycontrol.com/ "crafty" + # Network-Video-Recorder with advanced features such as person detection, face recognition. https://frigate.video/ "frigate" + # Full-featured git platform. Replace GitHub with your own and stop AI bots from accessing your code. https://about.gitea.com/ "gitea" + # Home automation platform. Every smart home devices in one place. Endless automation options. Integrates with Frigate to get notified when someone is detected. https://www.home-assistant.io/ "home-assistant" + # A modern, secure, highly customizable application dashboard. https://gethomepage.dev/ + "homepage" + # Photos backup platform similar to Google Photos. Advanced features such as face and object recognition powered search. https://immich.app/ "immich" + # A set of super useful tools when doing IT. https://it-tools.tech/ "it-tools" + # The Free Software Media System. Stream to any device from your own server, with no strings attached. https://jellyfin.org/ "jellyfin" + # Workflow automation for technical people. node-based workflow automation tool. https://n8n.io/ + "n8n" + # Network boot various operating system installers and utilities from one place. https://netboot.xyz/ "netbootxyz" + # The most popular self-hosted collaboration platform. File sharing, productivity, and groupware. https://nextcloud.com/ "nextcloud" + # Send push notifications to your phone or desktop via PUT/POST. https://ntfy.sh/ + "ntfy" + # Open Source ERP and CRM. https://www.odoo.com/ + "odoo" + # Open source password manager for teams. Security first, privacy focused. https://www.passbolt.com/ "passbolt" + # A fancy self-hosted monitoring tool. https://uptimekuma.org/ "uptime-kuma" + # Free/Libre Open Source Software Binaries of VS Code. Run VS Code in your browser. https://vscodium.com/ "vscodium" ) + ## System services +# All apps are open-source, fully local export SELECTED_SYSTEM_SERVICES=( + # Backup your numbus-server using this client. + "backup-client" + # Anti-virus software. Will scan the system periodically. Will scan on-access the data stored in your services' data directories : for example, where your Nextcloud data is. https://www.clamav.net/ "clamav" + # Virtualization host software. Uses Qemu/KVM. Run VMs with near-native performance and device passthrough capabilities. https://www.qemu.org/ "virtualization" ) -# --> -# OPTIONAL SETTINGS -# <-- -## DNS service subdomain -export SELECTED_DNS_SERVICE_SUBDOMAIN=( - "my-pi-hole-subdomain" # or "my-adguard-subdomain" -) +### MANDATORY SETTINGS ### +### <----------------- ### + + + +### -----------------> ### +### OPTIONAL SETTINGS ### + + ## Web applications subdomain -export SELECTED_WEB_APPLICATIONS_SUBDOMAIN=( # ⚠️ Must match SELECTED_WEB_APPLICATIONS order ⚠️ +# Subdomains for each selected web application. +# ⚠️ The order must strictly match the SELECTED_WEB_APPLICATIONS array above. The below example would be correct if you selected every service in the SELECTED_WEB_APPLICATIONS array. +export SELECTED_WEB_APPLICATIONS_SUBDOMAIN=( "my-crafty-subdomain" "my-frigate-subdomain" "my-gitea-subdomain" - "my-home-assistant-subdomain" + "my-home-assistant-subdomain" # Example : your Home-assistant URL will be ; https://my-home-assistant-subdomain.yourdomain.com/ + "my-homepage-subdomain" "my-immich-subdomain" "my-it-tools-subdomain" - "my-jellyfin-subdomain" + "my-jellyfin-subdomain" # Example : your Jellyfin URL will be ; https://my-jellyfin-subdomain.yourdomain.com/ + "my-n8n-subdomain" "my-netbootxyz-subdomain" "my-nextcloud-subdomain" + "my-ntfy-subdomain" + "my-odoo-subdomain" "my-passbolt-subdomain" "my-uptime-kuma-subdomain" "my-vscodium-subdomain" -) \ No newline at end of file +) + + +## Script settings +# Enable verbose logging for debugging purposes. +export DEBUG="true" + + +### OPTIONAL SETTINGS ### +### <----------------- ### \ No newline at end of file diff --git a/numbus-server.conf b/numbus-server.conf index c1dd981..537a19a 100644 --- a/numbus-server.conf +++ b/numbus-server.conf @@ -1,15 +1,11 @@ -# --> -# MANDATORY SETTINGS -# <-- - -## Script settings -export DEBUG="true" - -## Live target settings +## 📦 Live target settings +# See docs/numbus-server/configuration/live_target.md export LIVE_TARGET_IP="192.168.1.10" export LIVE_TARGET_PASSWD="example" -## Server settings + +## ⚙️ Server settings +# See docs/numbus-server/configuration/server.md export SERVER_LANGUAGE="FR" export SERVER_LOCALE="fr_FR" export SERVER_TIMEZONE="Europe/Paris" @@ -18,65 +14,106 @@ export SERVER_USER_EMAIL="user@your-domain.com" export SERVER_ADMIN_EMAIL="admin@your-domain.com" export SERVER_AUTHORIZED_SSH_PUBKEYS=( "ssh-ed25519 AAAAoefzefpoipoeCEZJCPEACPAcjapjcpajepcjAPJECJPEJAPJAZ yours@yourdomain.com" ) -## Traefik settings -export CLOUDFLARE_DNS_API_TOKEN="yourToken" -## Smtp settings -export SMTP_SERVER_USERNAME="your-address@gmail.com" +## 📬 Mail settings +# See docs/numbus-server/configuration/mail.md +export SMTP_SERVER_USERNAME="your-address@your-domain.com" export SMTP_SERVER_PASSWORD="emrp raps vzoi vnoe" export SMTP_SERVER_HOST="smtp.yourdomain.com" export SMTP_SERVER_PORT="587" -## Network settings + +## 🚦 Traefik settings +# See docs/numbus-server/configuration/services/traefik.md +export CLOUDFLARE_DNS_API_TOKEN="yourToken" + + + + + +## 🛜 Network settings +# See docs/numbus-server/configuration/network.md export NETWORK_SUBNET="192.168.1.0/24" export NETWORK_ROUTER_IP="192.168.1.1" export HOME_SERVER_IP="192.168.1.5" -## Services settings + +## 🛠️ Services settings +# See docs/numbus-server/configuration/services/index.md export DOMAIN_NAME="yourdomain.com" + + +## DNS service export SELECTED_DNS_SERVICE=( - "pi-hole" # or "adguard" + "pi-hole" + "adguard" ) + + +## Web applications export SELECTED_WEB_APPLICATIONS=( "crafty" "frigate" "gitea" "home-assistant" + "homepage" "immich" "it-tools" "jellyfin" + "n8n" "netbootxyz" "nextcloud" + "ntfy" + "odoo" "passbolt" "uptime-kuma" "vscodium" ) + + +## System services export SELECTED_SYSTEM_SERVICES=( "clamav" "virtualization" ) -# --> -# OPTIONAL SETTINGS -# <-- ## DNS service subdomain +# See docs/numbus-server/configuration/services/index.md export SELECTED_DNS_SERVICE_SUBDOMAIN=( "my-pi-hole-subdomain" # or "my-adguard-subdomain" ) + ## Web applications subdomain -export SELECTED_WEB_APPLICATIONS_SUBDOMAIN=( # ⚠️ Must match SELECTED_WEB_APPLICATIONS order ⚠️ +# ⚠️ The order must strictly match the SELECTED_WEB_APPLICATIONS array above. +export SELECTED_WEB_APPLICATIONS_SUBDOMAIN=( "my-crafty-subdomain" "my-frigate-subdomain" "my-gitea-subdomain" - "my-home-assistant-subdomain" + "my-home-assistant-subdomain" # Example : your Home-assistant URL will be ; https://my-home-assistant-subdomain.yourdomain.com/ + "my-homepage-subdomain" "my-immich-subdomain" "my-it-tools-subdomain" - "my-jellyfin-subdomain" + "my-jellyfin-subdomain" # Example : your Jellyfin URL will be ; https://my-jellyfin-subdomain.yourdomain.com/ + "my-n8n-subdomain" "my-netbootxyz-subdomain" "my-nextcloud-subdomain" + "my-ntfy-subdomain" + "my-odoo-subdomain" "my-passbolt-subdomain" "my-uptime-kuma-subdomain" "my-vscodium-subdomain" -) \ No newline at end of file +) + + +## ⛏️ Crafty settings +# See docs/numbus-server/configuration/services/crafty.md +export DYNMAP_ENABLED="false" +export WANTED_NUMBER_OF_JAVA_MINECRAFT_SERVERS="1" +export WANTED_NUMBER_OF_BEDROCK_MINECRAFT_SERVERS="0" + + +## 📜 Script settings +# See docs/numbus-server/configuration/script.md +export VERBOSE="true" \ No newline at end of file diff --git a/wg0.conf b/wg0.conf new file mode 100644 index 0000000..d23d6d7 --- /dev/null +++ b/wg0.conf @@ -0,0 +1 @@ +# Populate this file with a valid WireGuard tunnel configuration if you chose to deploy a numbus-backup-server. \ No newline at end of file From e67dc12f42eba0387d47b8191a26d9b86eee1774 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rapha=C3=ABl=20Numbus?= Date: Sun, 22 Mar 2026 14:09:40 +0100 Subject: [PATCH 13/43] Improved documentation. Needs more work. --- .../configuration/automatic_ssl_certs.md | 2 +- .../configuration/custom_subdomain.md | 34 +++++++++++++ docs/numbus-server/configuration/index.md | 2 +- .../configuration/live_target.md | 2 +- docs/numbus-server/configuration/mail.md | 2 +- docs/numbus-server/configuration/network.md | 2 +- docs/numbus-server/configuration/script.md | 2 +- docs/numbus-server/configuration/server.md | 2 +- .../configuration/services/crafty.md | 2 +- .../configuration/services/index.md | 48 +++++++++---------- 10 files changed, 65 insertions(+), 33 deletions(-) create mode 100644 docs/numbus-server/configuration/custom_subdomain.md diff --git a/docs/numbus-server/configuration/automatic_ssl_certs.md b/docs/numbus-server/configuration/automatic_ssl_certs.md index 3df10c0..5486db2 100644 --- a/docs/numbus-server/configuration/automatic_ssl_certs.md +++ b/docs/numbus-server/configuration/automatic_ssl_certs.md @@ -1,4 +1,4 @@ -# Documentation +# Numbus Server documentation ## 🚦 Configuring Traefik diff --git a/docs/numbus-server/configuration/custom_subdomain.md b/docs/numbus-server/configuration/custom_subdomain.md new file mode 100644 index 0000000..b110052 --- /dev/null +++ b/docs/numbus-server/configuration/custom_subdomain.md @@ -0,0 +1,34 @@ +# Numbus Server documentation + +## 🌍 Using custom subdomains + +**By default**, the name of the service will be the **subdomain**. For example, nextcloud will get the "nextcloud" subdomain. You **should change** those subdomains : +- If you are using the **same domain name** for **multiple servers** (avoids conflicts) +- If you just **want** to change them + +
+ +> To change the subdomain of a service, just create a variable in the **.conf** configuration file like so : **_SUBDOMAIN="your_custom_subdomain".** If you are you are unsure of the correct service name, check the list below. + +## Variables list + +| Variable | Default | +| --------- | ------ | +| PI_HOLE_SUBDOMAIN | pi-hole | +| ADGUARD_SUBDOMAIN | adguard | +| CRAFFY_SUBDOMAIN | crafty | +| FRIGATE_SUBDOMAIN | frigate | +| GITEA_SUBDOMAIN | gitea | +| HOME_ASSISTANT_SUBDOMAIN | home-assistant | +| HOMEPAGE_SUBDOMAIN | homepage | +| IMMICH_SUBDOMAIN | immich | +| IT_TOOLS_SUBDOMAIN | it-tools | +| JELLYFIN_SUBDOMAIN | jellyfin | +| N8N_SUBDOMAIN | n8n | +| NETBOOTXYZ_SUBDOMAIN | netbootxyz | +| NEXTCLOUD_SUBDOMAIN | nextcloud | +| NTFY_SUBDOMAIN | ntfy | +| ODOO_SUBDOMAIN | odoo | +| PASSBOLT_SUBDOMAIN | passbolt | +| UPTIME_KUMA_SUBDOMAIN | uptime-kuma | +| VSCODIUM_SUBDOMAIN | vscodium | \ No newline at end of file diff --git a/docs/numbus-server/configuration/index.md b/docs/numbus-server/configuration/index.md index f0dae2e..a88d970 100644 --- a/docs/numbus-server/configuration/index.md +++ b/docs/numbus-server/configuration/index.md @@ -1,4 +1,4 @@ -# Documentation +# Numbus Server documentation ## ✏️ Filling the configuration file diff --git a/docs/numbus-server/configuration/live_target.md b/docs/numbus-server/configuration/live_target.md index 93c1787..f351f45 100644 --- a/docs/numbus-server/configuration/live_target.md +++ b/docs/numbus-server/configuration/live_target.md @@ -1,4 +1,4 @@ -# Documentation +# Numbus Server documentation ### 📦 Configuring the target settings diff --git a/docs/numbus-server/configuration/mail.md b/docs/numbus-server/configuration/mail.md index fc69931..b4855a1 100644 --- a/docs/numbus-server/configuration/mail.md +++ b/docs/numbus-server/configuration/mail.md @@ -1,4 +1,4 @@ -# Documentation +# Numbus Server documentation ## 📬 Configuring the mail settings diff --git a/docs/numbus-server/configuration/network.md b/docs/numbus-server/configuration/network.md index 665aa6a..86e8669 100644 --- a/docs/numbus-server/configuration/network.md +++ b/docs/numbus-server/configuration/network.md @@ -1,4 +1,4 @@ -# Documentation +# Numbus Server documentation ## 🛜 Configuring the server's network settings diff --git a/docs/numbus-server/configuration/script.md b/docs/numbus-server/configuration/script.md index 2eb5224..ced492b 100644 --- a/docs/numbus-server/configuration/script.md +++ b/docs/numbus-server/configuration/script.md @@ -1,4 +1,4 @@ -# Documentation +# Numbus Server documentation ## 📜 Configuring the script's settings diff --git a/docs/numbus-server/configuration/server.md b/docs/numbus-server/configuration/server.md index ddc7fd7..c4965e9 100644 --- a/docs/numbus-server/configuration/server.md +++ b/docs/numbus-server/configuration/server.md @@ -1,4 +1,4 @@ -# Documentation +# Numbus Server documentation ## ⚙️ Configuring the server settings diff --git a/docs/numbus-server/configuration/services/crafty.md b/docs/numbus-server/configuration/services/crafty.md index 2f940c0..0ed5cfc 100644 --- a/docs/numbus-server/configuration/services/crafty.md +++ b/docs/numbus-server/configuration/services/crafty.md @@ -1,4 +1,4 @@ -# Documentation +# Numbus Server documentation ## ⛏️ Configuring Crafty Controller diff --git a/docs/numbus-server/configuration/services/index.md b/docs/numbus-server/configuration/services/index.md index 666dc63..44b8713 100644 --- a/docs/numbus-server/configuration/services/index.md +++ b/docs/numbus-server/configuration/services/index.md @@ -1,4 +1,4 @@ -# Documentation +# Numbus Server documentation ## 🛠️ Configuring the server's services @@ -7,35 +7,33 @@ | SELECTED_DNS_SERVICE | The DNS service to install (AdBlocking). | ( "pi-hole" ), ( "adguard" ) | ( "pi-hole" ) | | SELECTED_WEB_APPLICATIONS | The list of web applications to install. | ( "nextcloud" ), ( "homepage" jellyfin" "it-tools" "netbootxyz" ), ... [see the full list below](./index.md#web-applications-list) | | | SELECTED_SYSTEM_SERVICES | The list of system services to install. | ( "clamav" ), ( "virtualization" "clamav" ), ... [see the full list below](./index.md#system-services-list) | | -| SELECTED_DNS_SERVICE_SUBDOMAIN | Custom subdomain for the DNS service. | "my-dns" | Will be the name of the service. I.e. pi-hole.your-domain.com or adguard.your-domain.com | -| SELECTED_WEB_APPLICATIONS_SUBDOMAIN | Custom subdomains for the web applications (must match the order of SELECTED_WEB_APPLICATIONS). | "my-cloud", "my-photos" | Will be the name of the service. I.e. nextcloud.your-domain.com, immich.your-domain.com, ... | +| SELECTED_DNS_SERVICE_[subdomain](../custom_subdomain.md) | Custom [subdomain](../custom_subdomain.md) for the DNS service. | "my-dns" | Will be the name of the service. I.e. pi-hole.your-domain.com or adguard.your-domain.com | +| SELECTED_WEB_APPLICATIONS_[subdomain](../custom_subdomain.md) | Custom [subdomain](../custom_subdomain.md)s for the web applications (must match the order of SELECTED_WEB_APPLICATIONS). | "my-cloud", "my-photos" | Will be the name of the service. I.e. nextcloud.your-domain.com, immich.your-domain.com, ... | ## Web applications list -This is the list of **all the available apps** that can be enabled on the numbus-server. You can choose as many as you want, just **keep in mind** that enabling more apps will be more resource **intensive** and consume more power. +This is the list of **all the available apps** that can be enabled on the numbus-server. You can choose as many as you want, just **keep in mind** that enabling more apps will be more resource **intensive** and consume **more power**. -| Name | Description | Additional settings ? | +| Name | Description | Additional settings | | -------- | ----------- | ------ | -| pi-hole | Simple, fully open network-wide Ad Blocker. | No | -| adguard | Feature-rich network-wide Ad Blocker. | No | -| crafty | Minecraft server(s) manager. | [Yes](./crafty.md) | -| frigate | NVR with real-time local object detection. | No | -| gitea | Painless self-hosted Git service. | No | -| home-assistant | Open source home automation. | No | -| homepage | A modern, secure, highly customizable dashboard. | No | -| immich | High performance self-hosted photo/video management. | No | -| it-tools | Collection of online tools for developers. | No | -| jellyfin | The Free Software Media System. | No | -| n8n | Workflow automation tool. | No | -| netbootxyz | Network boot operating system installers. | No | -| nextcloud | Self-hosted collaboration platform. | No | -| ntfy | Send push notifications via HTTP. | No | -| odoo | Open Source ERP and CRM. | No | -| passbolt | Open source password manager. | No | -| uptime-kuma | Self-hosted monitoring tool. | No | -| vscodium | VS Code in your browser. | No | -| clamav | Open-source anti-virus. | No | -| virtualization | Run Virtual Machines (KVM/QEMU). | No | +| pi-hole | Simple, fully open network-wide Ad Blocker. | [subdomain](../custom_subdomain.md) | +| adguard | Feature-rich network-wide Ad Blocker. | [subdomain](../custom_subdomain.md) | +| crafty | Minecraft server(s) manager. | [subdomain](../custom_subdomain.md), [settings](./crafty.md) | +| frigate | NVR with real-time local object detection. | [subdomain](../custom_subdomain.md) | +| gitea | Painless self-hosted Git service. | [subdomain](../custom_subdomain.md) | +| home-assistant | Open source home automation. | [subdomain](../custom_subdomain.md) | +| homepage | A modern, secure, highly customizable dashboard. | [subdomain](../custom_subdomain.md) | +| immich | High performance self-hosted photo/video management. | [subdomain](../custom_subdomain.md) | +| it-tools | Collection of online tools for developers. | [subdomain](../custom_subdomain.md) | +| jellyfin | The Free Software Media System. | [subdomain](../custom_subdomain.md) | +| n8n | Workflow automation tool. | [subdomain](../custom_subdomain.md) | +| netbootxyz | Network boot operating system installers. | [subdomain](../custom_subdomain.md) | +| nextcloud | Self-hosted collaboration platform. | [subdomain](../custom_subdomain.md) | +| ntfy | Send push notifications via HTTP. | [subdomain](../custom_subdomain.md) | +| odoo | Open Source ERP and CRM. | [subdomain](../custom_subdomain.md) | +| passbolt | Open source password manager. | [subdomain](../custom_subdomain.md) | +| uptime-kuma | Self-hosted monitoring tool. | [subdomain](../custom_subdomain.md) | +| vscodium | VS Code in your browser. | [subdomain](../custom_subdomain.md) | ## System services list From 29d7eac98187d39ddfcd30773e58d74d86e4716e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rapha=C3=ABl=20Numbus?= Date: Sat, 28 Mar 2026 21:49:24 +0100 Subject: [PATCH 14/43] Moving to a web based configurator. Huge changes. Surely a lot of bugfixing to do. --- README.md | 5 +- .../numbus-backup-server.conf | 0 .../numbus-computer.conf | 0 configuration-files/numbus-server.conf | 101 ++ .../numbus-tv.conf | 0 configurator/favicon.ico | Bin 0 -> 25484 bytes configurator/index.html | 1225 +++++++++++++++++ configurator/logo.png | Bin 0 -> 32548 bytes deploy.sh | 517 ++----- .../{ => services}/automatic_ssl_certs.md | 0 .../{ => services}/custom_subdomain.md | 0 .../configuration/services/index.md | 10 +- numbus-server.conf | 119 -- templates/numbus-server/configuration.nix | 19 +- .../numbus-server/custom-configuration.nix | 5 + templates/numbus-server/flake.nix | 12 +- templates/numbus-server/numbus-generated.nix | 10 + templates/numbus-server/sops-nix/secrets.yaml | 8 +- wg0.conf | 1 - 19 files changed, 1469 insertions(+), 563 deletions(-) rename numbus-backup-server.conf => configuration-files/numbus-backup-server.conf (100%) rename numbus-computer.conf => configuration-files/numbus-computer.conf (100%) create mode 100644 configuration-files/numbus-server.conf rename numbus-tv.conf => configuration-files/numbus-tv.conf (100%) create mode 100644 configurator/favicon.ico create mode 100644 configurator/index.html create mode 100644 configurator/logo.png rename docs/numbus-server/configuration/{ => services}/automatic_ssl_certs.md (100%) rename docs/numbus-server/configuration/{ => services}/custom_subdomain.md (100%) delete mode 100644 numbus-server.conf create mode 100644 templates/numbus-server/custom-configuration.nix create mode 100644 templates/numbus-server/numbus-generated.nix delete mode 100644 wg0.conf diff --git a/README.md b/README.md index 83a55dc..838e5a3 100644 --- a/README.md +++ b/README.md @@ -98,10 +98,13 @@ The script will guide you through the setup process, including choosing a deploy #### Desktop-centric features : - **[GNOME](https://www.gnome.org):** A modern, elegant desktop environment. - **[KDE Plasma](https://kde.org):** A full-featured and highly customizable desktop environment. +- **[XFCE](https://xfce.org)**: A super lightweight desktop to breathe new life into old computers. +- **[Wide offering of free and open-source apps](https://flathub.org/en/apps)**: If you need to get something done, there is an app for it. +- **[Windows games compatibility](https://www.protondb.com)**: Most games run on Linux thanks to Proton. #### TV-centric features : - **[KDE Plasma Bigscreen](https://plasma-bigscreen.org):** An open-source TV interface for Linux. - +- **[Web applications](https://flathub.org/en/apps/net.codelogistics.webapps)**: Install websites as apps. ## 🔧 Deployment Modes diff --git a/numbus-backup-server.conf b/configuration-files/numbus-backup-server.conf similarity index 100% rename from numbus-backup-server.conf rename to configuration-files/numbus-backup-server.conf diff --git a/numbus-computer.conf b/configuration-files/numbus-computer.conf similarity index 100% rename from numbus-computer.conf rename to configuration-files/numbus-computer.conf diff --git a/configuration-files/numbus-server.conf b/configuration-files/numbus-server.conf new file mode 100644 index 0000000..94ff582 --- /dev/null +++ b/configuration-files/numbus-server.conf @@ -0,0 +1,101 @@ +### MANDATORY SETTINGS ### + +## 📦 Live target settings +# See docs/numbus-server/configuration/live_target.md +LIVE_TARGET_IP="192.168.1.10" +LIVE_TARGET_PASSWD="example" + + +## ⚙️ Server settings +# See docs/numbus-server/configuration/server.md +SERVER_LANGUAGE="FR" +SERVER_LOCALE="fr_FR" +SERVER_TIMEZONE="Europe/Paris" +SERVER_OWNER_NAME="yourName" +SERVER_ADMIN_EMAIL="admin@your-domain.com" +SERVER_AUTHORIZED_SSH_PUBKEYS=( "ssh-ed25519 AAAAoefzefpoipoeCEZJCPEACPAcjapjcpajepcjAPJECJPEJAPJAZ yours@yourdomain.com" ) + + +## 📬 Mail settings +# See docs/numbus-server/configuration/mail.md +SMTP_SERVER_USERNAME="your-address@your-domain.com" +SMTP_SERVER_PASSWORD="emrp raps vzoi vnoe" +SMTP_SERVER_HOST="smtp.yourdomain.com" +SMTP_SERVER_PORT="587" + + +## 🛜 Network settings +# See docs/numbus-server/configuration/network.md +NETWORK_SUBNET="192.168.1.0/24" +NETWORK_ROUTER_IP="192.168.1.1" +HOME_SERVER_IP="192.168.1.5" + + +## 🛠️ Services settings +# See docs/numbus-server/configuration/services/index.md +DOMAIN_NAME="yourdomain.com" +SELECTED_DNS_SERVICE="pi-hole" # or SELECTED_DNS_SERVICE="adguard" +SELECTED_WEB_APPLICATIONS=( + "crafty" + "frigate" + "gitea" + "home-assistant" + "homepage" + "immich" + "it-tools" + "jellyfin" + "n8n" + "netbootxyz" + "nextcloud" + "ntfy" + "odoo" + "passbolt" + "uptime-kuma" + "vscodium" +) +SELECTED_SYSTEM_SERVICES=( + "clamav" + "virtualization" +) + + +## 🚦 Traefik settings +# See docs/numbus-server/configuration/services/automatic_ssl_certs.md +CLOUDFLARE_DNS_API_TOKEN="yourToken" + + + +### OPTIONAL SETTINGS ### + +## ⛏️ Crafty settings +# See docs/numbus-server/configuration/services/crafty.md +DYNMAP_ENABLED="false" +WANTED_NUMBER_OF_JAVA_MINECRAFT_SERVERS="1" +WANTED_NUMBER_OF_BEDROCK_MINECRAFT_SERVERS="0" + + +## 📜 Script settings +# See docs/numbus-server/configuration/script.md +VERBOSE="true" + + +## 🗺 Custom subdomains +# See docs/numbus-server/configuration/services/custom_subdomain.md +PI_HOLE_SUBDOMAIN="pi-hole" +ADGUARD_SUBDOMAIN="adguard" +CRAFFY_SUBDOMAIN="crafty" +FRIGATE_SUBDOMAIN="frigate" +GITEA_SUBDOMAIN="gitea" +HOME_ASSISTANT_SUBDOMAIN="home-assistant" +HOMEPAGE_SUBDOMAIN="homepage" +IMMICH_SUBDOMAIN="immich" +IT_TOOLS_SUBDOMAIN="it-tools" +JELLYFIN_SUBDOMAIN="jellyfin" +N8N_SUBDOMAIN="n8n" +NETBOOTXYZ_SUBDOMAIN="netbootxyz" +NEXTCLOUD_SUBDOMAIN="nextcloud" +NTFY_SUBDOMAIN="ntfy" +ODOO_SUBDOMAIN="odoo" +PASSBOLT_SUBDOMAIN="passbolt" +UPTIME_KUMA_SUBDOMAIN="uptime-kuma" +VSCODIUM_SUBDOMAIN="vscodium" \ No newline at end of file diff --git a/numbus-tv.conf b/configuration-files/numbus-tv.conf similarity index 100% rename from numbus-tv.conf rename to configuration-files/numbus-tv.conf diff --git a/configurator/favicon.ico b/configurator/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..d7151a8c3c14ee419ae0c78eafcc28c1cf321a5a GIT binary patch literal 25484 zcmb??i8qyR)b@VPXeKimjv+&3Dl&zG3YDph8B>{>%wu>Y6-^>3kt1ZvP!SQ1B2#5f zDV&N-88c`2p5Obf^?m=q$FdyDTIV_UzW2TNwXf^C0TAr_zb^zR5OfNFAA22VVP?e6 zBFuulWH&KBaO}VT{`bQ~!hSjW<+=a&*F`@wE2RBNa4NtlWs?K?Rw4aU>EsZHzR=A( zS1UxdpHDXUCc2m19>_lbzRs&Z+a$G@P5bkL@lTx*dEbkd3Cqrja&i5S`k(Nt$JHa# zHOqtHNk6xA1O%j+emdi%jV-%Y*WYj&b5%YGo!j^n{yCWGWc_6#EB|i0QrG_d3eZRf0uEd$4=%&W7&EOuE(tN#yj+<$5-r0zO0HnYHLIP+T9}8^3;cOe%3zTmKd2L{y6DrG5g=cPU64sMqVtvHZe$@=?TZ_Bv0ZT zt0E2r;w$3|6Mu2p(Qtov#1EVSZJ^#eR$o8Cyfi#jx>@I=2=kU$nNZ8t zUus2<$LwN~eplHw15scG2`*(O#=X|pEE5zgWY3R2->$G8J$r!rcbjZA=lRZVIS>P= zy*j!n5GEcsvuz?d5_intjPZ(A9^b^(wM+zDp+zsxvh;q!x}kB<{-;aS^FYN}cNahH37rikllO2c;2`QFu7~=DpO~$jy|9Se{^?6UW-lf@{U*oce#tRL) z-i7^pT5R+-if>Ja;>s)B6+lLMz5Ic`TFs6{ae@Y znRgE1igSCL6*J1h-(IpF!V&iU@`yGL*~}cS8>s+NCiU zH)I~0Esl~hC8p1MdGjRdin7EwvnM>g)IGE#utu05-_UN&A^+v$nR)}4KVOqff(~1q zu81OioywIYFY`VrHxGBq&6wCqSgE(*?;*g#Y}^ogV1CX7%in$Muuuu-Vd3m9s>3lV zUF{5$aC8+-M2_%@5gL_pPu9TEAHnUY?`zPrFu?_tD&koAPv_RfSFY`gDk8?aG{KA;<^D8JQiUQpF!{zSSqL7l=iKd!cv>FQg-Hl3N1s}M=$ zXXb3KA`fkee2$V$tR+nRBto9nZ|N-@Fgc_HP!di-pX%(R6Ho->vMK?6{K7H^VMoQ29^< zVvH{poUF6wT3ItWRx7^L&;E&>@TG~z#Y5;{X=$bZPpa|0x#gq!XEXGdp7a_`Zm~<( zD%@iaq^1M)TG0GZKFkI`j7CWWL*sQ^Gj~{PpW3YzlVRxti3g<<<(7V&^bK!%Oy4c{ zXmWCfxj6)iHe}@ZhbsKz+I8H^h7@4d|DlrfCX*^Ou9@&Et-NlY{(Eiv>`VO$`rSZQ zyYIK->SU9yyqlO|Zk0Y6>BlYhVAU~%>dur{Lz);)bY@3b(A(7_VEE=xrn?*$W#v_g zmHv9#y)?Vh%JXg)xt>K{XHn3jaNYA2PmJ1?=pyv#>&DI7uUn#af$Ilhl#d9#%Ca6g zB5_*+QL-aCE2$y&vc9JXyX~G$TxV*L{AcL89P^^NmUgoQaL0faFQeD<)GU$&+aPa* zO`Y-V+~u?g>DH!*G~R|jOOs1qjv_aDzs*aH$Gp5=q8byq!6Ut;na2m7xh)q}VL_j9 z0YQavQXObX(obIQt?)r^;#|;uLpI!Q8_NTS`0qN^8iz@54Kn@&8gB}8E}I+82OFIK z5j`=iPJ-&`ATo_a=Sqwc6edDfMB2SAj~P+(OC39CZuLL!8yOo5e;rL~TwF#_a>Ba! zG<)mr_sgQHt24q-skj}kCak~f5VRWq^(>^VU2{Z?1zd6iB<~u3xt7pa6gN;CIy_v= zwy@~cma!_x?ZVP)Fx9iR7an{-*#2_S%xLT_7h{{q5$VUSSFk!9`tXy#;W6WAqLQ`& zPX@<|&h6~wYpJw-dDeJzHkpL>iQ>RR;Uf;chQ8SD_czcgvVOZ6eZZ-aLU$Ya>0_rg z_qXr|Y29@-pfu{HoCSq`J(uVJZYRX@)-W~%t_^!v0 z&l+F9s3ii4deW0^J`kQTtI*#PHHuII%MmI*8o6k65Uq$=x4bC3V=l2&7{B|z%G2E3 z&KdLQsdh@Z!He25CFxxRc#yIlT!8P0r7Mu=r4>nT1fX%v{`I}5^JhvZ-d;Q9qg*Z zTXzp%I{_$PApA|rK+rzH9>V#+3QI0=4Md4-V~aK(bJ$GRl$O-Ec4g)REo(FCK$igZ zyy~hD*zkcWm)zyewkG-5kT36flqT(#B;22`%+}bkkYQ3haWO*9UVF6>XzU0H<-?;S z+}z4n_1?XBuRn$#+n8G&>v@6U!;`E#t^-qv52ifAcLrbV7%_=KLh@ zN+)h;`@`O6Fo7~RdF@KLg(I;zd8!(1`l~~vD`{%SOXcf$>LIMHuik<-IZ92wnT)B4n8+T(D%f9270qEQnuxPwZ4D4Q04R-yR_!3 zxMrRS6F)~$%Z9%1tgwE>EnupeS>1c7!KK9Pdi9BPb{NiLO(4UtOP$rjC@ilGu+s=~ zIEY73ZlLjk93EQReL(IR0SXW_HHrLp^3F_qArV*@@Z|QNmX|tZ+RM2>f441D(+Bx_ zM`GNZdj13QeF-cK>CW4JjO1NHKQXO*d1)VQ&C}9i+VJFbYPR$~t~1AU?#h1F+kL0- zU+nHzpVc&9EonglGYkWK-4A|%iU7r&6^OQ1`>AQPy-d9ZJCQwiJYi6(5{lH3L;cdu;2t$ z1d1#I4|oRU1kLY-XJ+8Tg`tTopc4WHzBzAdh{XwfQwy1t+>sM~^jBTLL7vx{4`lLR zy!SYsxLvxnVa+boE&Z^VOUmtGTg!1gHNfhOA|w79!3}~8?=l0E+ zGNWIIJ;3fHnTk-IsCo;pu9e>mdHKX&&g=(O75IJ^Ix69HO3lw*Tyv!!H)3p5_Z)v@e8_um%i$u~f}W=r z>yb(XOng8ds4S517Vo-4g!=J$L}=g|(DhM-ZVXI@3>%<3=s_N<;H;m;n@Nun=?mv7 z7_A4*!uGaYwVJ=GhSJTgz_p3WMTPK)ZNBa0E%fM+_u62;Td^-N&ncb~Jb& zr|(i7rFx?}^lQ+&o1?7_BAlmD2 zP`!4Nsny6v2Nv=)9{c&!(+w`Ymm4lh9n?JUva{Li?}v8pBh4SZP3tRT2;*h zYfkj3PNK39ykDuO;|Dojgpbd=@*iQ7-Y@^*tn9(q^vT)9Y74e1m;>s5NT|g9S9lH! z!t}5TB;n8?d_3)VNLwQ+`|`W|7z zq0&@bhi45v%_<9j|#qU!bmY zLxKbcTo6_sk^_-09BRpd%IM+gqQ60P0Cl~1w(*3L_Gfmx^)i=89(kodWI}(2QtR2e ztHXD4x)7>cP%2iooIv$~2#nh7`0v3s0>Ep$*`y-``~oA5PTAR|F%xk=FE3dD#SFmY zCon!E*@{eP+f^K`fs1U>1U|NSY^|v}Q)l!t2S7di)y|HwJh>@}ula%5Wu>R^;3Epx zGg~q;2KbH6a6#fxHZ(~KG~R@eDLq^21o&}-h}OpF3jrG$ZH@%2THT_G1FoSlnvY#= z=gwW#2`lN@WwgI4K*`Id=`8W%X)BT^qNK2@n()n)PGL+TphN;GQRwC6{pp@-H(CD_ zf9uBDXXn)Q>}PqCqfoyCDDM{_Z(kR39ih?IhU+hTp9c|+_VXI0#|!z1 zp(i0!P8idmrd_M~qk_F>*0b!Sdnti~c(6l21*i*d2#q?w>o=YfBU7gVJFg%UgzrHd3^N>>)dJK$yp_c2Rvbcq5UWRY@?6z6w)bu7Ym3*q1JKEeZ8qsB5$=)j zl;gZGI{(rps?n11Aj+a%pos{RTiUSK^i^3rhLRcKz3pM zRQ2J(9jG^>!I+;+O=kv+RxFyg@#y9YS2j38glAj4i7pctG7jvYy0`l^d-|4=()8xB zP)iRD;40#TQ2U~}Q2%8d)=m$9%Gj;gO`?x$BcNOH7Reqkg)cKFWvlyQ6qrtEJiYPs zCTxb^dfsw7<|reWqv$sB$jy7bX9~n8dAey!q$8g&N$yx{9X-vIS3HjIw}F&Wp0icoO8qie8RE zUq38je*JPsy$u_TUf2e|rwFH^(g`|lWCs%<@=8;bPen@6a;d3|@awNlJi*o3+S;qz zC)Z4zrYK$olTznDzFSu9UEF$>`Knz2Dw*H_0x1aEwjYY;v3ZaKU1y`MEHtqG?=-&*C|TzmUxO&cr@}t_U>056q6P=T*hQz1QEQuNiDjx=V#$Hvku&s7E0`z5KTa zarXC<5^_<_%iQeAcct``QQyodsNp9ZO!Q9|3fx+wTny66bVg}>%J1_2*D4q$M80wO? z`mWW8o^6$OO+2=btZTDMb0Y{58{4F}l*c{ABVS|%dTIv`sdkX zQ)wHOLZ#L4&iUnXsX6Uy#vcD>`w+Nx`&DMQs6xzLph|;J&^D;F)Z&Emdx16yemx%e zt}r-)r=N*IEP|HoEE}f)O?Q0z_b1RMl-;;Wx8E7av>M!5euY9KqORr&oikX=!lU+F zcCx1WvBxHdv4p!e@a)V1Z=QB`{^C@@F=45gbgAsZBrWtuNnjwGc5oTz!2(427s$b< zu3-Tjq?4ZQoUC;dgcBi9Che~96|tHi($AbEQ%GozDW0Sx3L&*RbfexgKN7Xd-tCA@ zN(m8xG6l zn=60h1zF~gI?O4eo|Xx*z$hyK<>=vDuF7%u^!;P*$(NWYAvWF;vLV9(lL9LN=KlCd z9jABMx&ABp)1OX;1A`ZQSU`ga2fPtRnh8SV##3W5q50|3mKlz&*nA>YYo)5j%^*u% z!lY@KshZP;5S zjqrpcYv1UIPfMK^q8vAz@iSSX{P5<>m*?kC?B~wUNi>#Dbf~B*d0uyCVd-{4^y5z1 zuxg`c)zyd0a3C8BV_MLSr{*BkZZ{+$i$qP1gpREG-fJ;~{6H(JXlaSZ&4uN+o6C1}zVz)~ zlK`JL)n`{4*x&@&{46`Jm=}gIFm3}DUn_Ii-xMdW_rFMb%CTFO#KoIBFd13w?I;e} zqXn|-hW@`RF&t%GGTPZ?IWRoxTr!Ch1pZNQN2q~36W8#wcTdRZ93qozMEDN4y}ryP zC?qV4kNAbsS9DOi4KPZDL25r-H6>zoOYqc9yd6M*DE0ke97U3ix$ZItl|_5=evBLT zJY96}?BByPgXL6Bi2d??-V_R>}sdq z(Fk;-k_LoPUIp|(W*(d1G5AwMBv=RZ7tmGk2v!g)U9~`UJD_2{;HV-DBMXl7 zUKW_Z?SIo1KE&^X%+wQCXd{E=bXD5S=35D@y00zCwjT1D{}(&TUgezk`JeD|H{UO$ zR%oM*1yZVo;drq((@}$KP6|93KILYT$G)9O6BQH`lroI@b^3J3&%2q?&qaa$d~>k# z)FEKJ5rmaMu(cI~_%Oaxjq1mdb46%uPvMZ~w(Fu1^{tepaEifrhMhg0+;c#JqOcK#170cG_4NbCM>@WF~$tAjO* zZPOW@KW^DxeB*jAdzr-&8sdm(*$*0*9I!1gTB%kUHe?h4Log2@YfwRLDdrE#yS}!gc0A5 zT*onbULds4*Fd$!b>-CE_Z(kD(A%7UFwKA?r==KEBX&@L>rY0fVUoREC${+Bq}pmf za?C(?7&b((!ExhFuRMXUzEj_b9H7WAbD2InE2xT?4(h3@&UJQltZdUjF$g~c?|&n- z0gP4pfmnEoz`Z9}7s%2TS@?{nOLI`tj{kN)kDlT(BX(_RtPm%2Ln zjAv4l4=Y3(CPam7!tSjrnJ}wivrl-qXyQ?Ykf#tZnt;ZMD>vSBG3jLY8Mu3N=}m^$ zWv{xsDtolFZZ)-Rk(icna1BA!)uSEcpTXT($Y z<^`)$@btrgQOnX)#-!r?xQ0%x$o!%$Uhb&0305g7o*I<@?MMj>)fhbTa`0|}M4y&+uy0ynONJ1KBufpcta-r`-` z%JKo8Ivgxvt@t;do}hw8KMaILwHkp~uuwV98xRY$LDq!e2z|IWriB*d1S0&LsE%=D zRK`s+iSRmAc@Lns*r<3(nQouoe?m*Le=Vahb(Zs!7%d`71-@wRx>ljR(`e%%-p&k; z8V+=jY;T;Fd~R&#IB$ORXu|X7CY}>2`?daO3u3TXD1gY+)aN=bV*mjR_^|c9j`#W(R-15x`^GoBR14;MWVhE8~6Ww_50?a|}K&AtB!9DH{^oWt`2dPg;9 z3-35->e%;n#~HaX4ib7T{XPZ`9uB+k!i9ORglaqKh-57gXgf%C^-ILL#^1bSzQGBl zoS>n>ip~lB*YRJuUl5+XIR|5Qs&EXWgr0LS+;S+OINKDHp>63H`5Sw~);^=&#pxGi zn`;R5KTz-|u+pxB$neMtu%!vYxsJ8&vo)lME5)%&Rk*M_B>x&blv28p$5s80|`+|UUhsr(&wk-Ee^QtC|h zDFjAH6M|Nuhiz{(MCBa6%<=h9n#Hh?hUrt8+~(nxk282UiLo(aaP8{VF+qAfj&fC| zP8m{1wb6rknxh~zvE%8P1Ddzmh;XrNGeC3Z5l1|8)wmIr=i=9PPsam1e{+Txp4PZ= z+eBOzNGbiDcyC(?{@^=o8ZkOTBqIvx_oPyX`zldRgm5uJ(e*XZf(<)F*@2ya8~FI^ z^O27{>>2zbMnh2n0d4~gD?MkiPXi1fLdv=fLM^f6po)O$C2Lnh#3Bd7>8#plD9ClN zqA}I?IRS|jNOUOcDFEIf>*Mt5+?j^x!2=PJ5h%kskp5PJj*ixcPxylf~}{B3dwT<3qABd8C! z)(OHIpklwk$C4Mr8BnGQs)DTlk%g|=cx8E5BHa*Y^Zszmb?1;&V@y|DFVA0IYn>kv z&rZvIP%>m#QIb9FXDM4BbgRCZhsgU3a*g5=){jX~e8UxOX@@vZB<|sDhEi^jORJy~yR&{^I%=A^rKeLP1|h7V;RsOgbjcI$Bg69FieUNFJHNIgtnM_3MXd#6RQcyI0!`Iirr0IvIo%SqPvnyQS&kspTGZ- zl8$Gtf%3D*r2XgQ;Dj*w(=nlbA{U8Th=6CBFI0hXDl1fRQ2v<_s1_m4CEpH4f8KH& zu`@Ofy0cPG+ZkgXmgYr}oIzpgwCT^*7 z1HH>xo(=8nWY*f++E3*|;J^oekil#qiFG!Uo>&3lI+El2#C`WV_&hgG`Snm7Hc)V}@DV;t6V z@cg|ctNSWBrK)wCymaicxuhW{}=Ip9eYh zE@ZbjED=1)W3Rba#9ljHG4s3p#!kDeXSaniM>ttOjxWUT7VrGF=2Gx@_M3|`C17XA z6QDYwwqZ&GL=6W{TEGXJ)P3t$(Z$@NI`WCADz-01M+V=F^=*DYcIV>95+BHJibziL z&#i$^(rx4t4~uF6Yln{Cn?nDU;qx5mrPOsvpmn1oyND>w@L-Lz$1bBcpR9c5dt{~G zc$|(s;rYYs$s`_})rEy0d_Ch0S32$8^06Q-OYZRG<@41RJ)N2XyhKvK>xns1}j2xG-ybWV5)$=i-aBkO605E zA#Pr!G;HcD`UjYuunU90HC z1ru5I{x+g8I~MgUdq|eL~i#M0Y3B2|D5oBB5{S$6Ee)4o|i14fbHz{?G2 zMlnrec)Gn5QaV%yUqtT@OotZxHSl6lkJb;L4;Ro9vdi5aQt=#UN1_zcj~}|9y8eds z!P<9y&EM@nt5{S=px@~OPn0wP4QIgMBS$9Kz>bU>Sa|Wm&qh%8*BHADd7t8|y>|ld zEHr22GnH9EN4;JhPY(VmfYaZZA4L=FPbSydan!0#V2a(JosXYk+P$V?6R_6NX|H)H zR~tBRHwfrt7bxRuKClxa`S)@HCxCkrYXEYTfF9{h9{aN1S2qGxjip@wmu-}o5t>fglDWNh|Kc}AC; z#5pbuBOO0NfaK()gWPl9g3gP97zzIHv!b7FOJs>)Br%Jsb+jphp1>NW&&ck?3^M(o zD5RxxqNyVQ8(Oo*z8L~lxW^v5RD~BcZ1am$GA*Mnw9GtDlyImht5;w7RgVw6O;#s@ z0Rrk}n+Dq>$BwyH$uOkCN4~szEu6d7;jCixjUr&u%Jqok7=-0@WJtuVw%aSA5JCW- z&*19zNegX>1)nELV(b@`Axr?M)nZU4GnPT*!c&WcLFK9zY7ZZR;UG2_H@?8T28q%? z2t(efltcAjMfLy96I0g1(n>`BvV9s47jMbU7du_zzrRu*xG>>uuhB?eM_ESfOTPxr z=@=Wl&90)MJI5y=c{&W%bR3u~B|+oXjQE3>IuFS7EI{v(>9x$#b=yEgo&;g4l~p@u zF_d#lrmh8i0!A=6B46sx=j!TSz05qvu6MuK-<;H?BX%htXp4xW<8ksJFIK2-qO#mt zA<_Pb&AY=?Y{LO{J;>actLzqzqAQ!VqcZ^Vl$qf+Mgzp4aacynVb!*J z*{hRX5C2;+->^iQ8tEMmgv_VGpua7)=0Zxr z;;T(8os0|(UQ~Z{I(GHSPI9-Q;k!#$CJ;dqM75U<-VupaU;olwwM7zRf0gJ283%zL zo{Uhvg~7_urI(BvT^LLYa^{Bqn>gw{L5MFaz$uACK>%W5oHWD)Js5d22DIFctKxDD z>d7sGrkJ`yT`|XO$&R;Bn){2@;7Dla;;g^=*Vm4Dsm-n>=9sugMDhi< zvK1NnTV{UU{k)7&o?LX!Q2goZXCkWl+o$6j3l#PucEVHOE&bcXrB|IPL=R@ixxwc! zJ1T(@P}o7lqwa=C!eid!Nxs#1S6jIgTQB*-9HRPnFdgVaZ3z7zZHY?!xAtkgh&u(I2^OYRr zvlzQ+JkoaL-`SlrI;)0{f2;om%wyUI zwOs=|T>*gst_9A&Rq*SVqke*E>PKo1#y8N6BD6|N@fb${{Q*bGD6CvLD_x*uv(~%v_h|;%1HcefG|HD%P!p!1MIX z(=F+f6F6PpW4FVuVVu;*-SWlhM7o~=GNzU?5*sAPB|LROMmBdV z(0krpu8ubZGcH)2vG21!31yAHM?0R-Fk)tp3be*6Whkb<6u{Jho+1KJ&pY(4uv~s_XA-quS)m8lgSwRql7GvHA<0CX(C33#D5-=I?wog8~N@AU%nrM zKY?m@TxQ%J(<)>bwgA|owf>>!1Hp;__nygMm4L9Qee8R? z!kVV@o=R=y!UzdC#{(Dy{w9)~<&4oi-xa&ciEW%PuDL!~|JAS}lFLU3ajlp@D86M! zDbpFU<3ze)Qj+@l5b%jXv$Ec6V(NrXH;Qo#wwe&%2sB-x%2Mw+Xm&hiKU-RwW>(h! zPNLecI`9+m0U5{`eXTB_!TzF0;z={=Pkf4OV5%Dq^&L~_-wOVg ziHC(PFI(5Cp5dM$1jWC>f6>#@@}1pB1}AcY*RlW9aq1Ne^tRNgLdR(g6i)Z^J@~3f zfR7YP`BsS%W~s0k6H4662tpKHW@ife%zyd+5M#_&Fb> zOvUJDx)_A3IbjQ0@U|xI69b(aM5^1q#35rc1qT;IskMUeDGqTRYQ<6ZQw+yW(=?0f zic|v`w}^=@QfIv;61FhSpf2KVH>&%O%d286KpjJ_$s&e7)Uv(v{)n2RyaO4J_QUvDt?j6NgwxPQy}B z8NMS}c?`2tvqoE8W{qAL*CCHQs4zM)V|MXJER`hAsaVP7sa8aIa~9zu>SPOms*J2G zg0_%=k6(<*p||1TPA@0edh84K*vX_vva}YV8T9pCy{Ek7I|ps*N?lO1!P_b zpx9h_F`CB8xI><)I|Y;%62?8q?pKttc?6Z&qAcLfZxGwbBI4q*NxzO;Ve+$tFtBl+ z?IVb|02toj|^+pAT(J^l>rbbWus$i?aM#BuHqM!oq_SqXkW1GO86bIs(l^dG-eq|VgSCVtfuozUgl%XeS5)CK(KQlJB7 z8W^jmNpat3u+86CF0;OlcRlTyc=Hwlzmm*v-7*cs!?gzJ7|78T4T(h(?%nN|-b;jH z1z9k_kdLC+c!a@5_|y}cRiyFk>h{=sJQp!}UQ{Msahe!Eu&iRH}j4hm?GD>zK=wYC}sqB{f->O!+ zzgG97D#+C;h@c(s#fx`We*6A{QO1v^TlEq1FpC-}tn$&Tp$2A$?~wIQXcYvvDA5@L zX*wZTpEwB}eo#A|AyXWvc0`iYI5x)XNSDS=9{~v4S<$8Y^?Qp<@mk$z1jbXIxQz*k z=x-m3cZh`tCJztp!z$L)rfxwoXWH*q6D5<{f>#Qe9}EgHl0UyZ|LJf&R#1${0X&3i zB)|y`KT#5OeJ#W%VtXV`r+Y0Bv-G+)BFgMgW~i4{y>;%{DRw+sr3+3xKK?o|%MU&w zUo_wVW|qcWROQJy>N8Bs(TsXgiJ4MzZJ*<5FCk#6PG-(!GhmcOQw%Z{_Fg^bp28(ZKhdpA#5FZlsOjuYLe5QP4J$XGnxDeN|>uZT%R zOUhcn33z{g+_7J_QxW|<$LMF7@2KET&_o>&z}x||Oy@V8J|@O>s_5wGA2MoUhFP`d z?VwS>2@~)1SFtgij1C8!N&3zNr{gdYWz99=?Kff2`W7uu;K!kZ1$5SQwr4~%l**_ct zJMdp>0gYGl@StMbb%ddar*^p^)TFxijgoUss&hKKPoHk-?A1PemE6PxvwvK-?3BUh zgAXih{{sy`Pv_Y0z!$O#KJFZF7@G=6fVsGTg3LisZj{~9I6dwf8g%Q%LEK$C8AVaR z<4<+S2?>eX;mNZ`z`&~DC2ZWuY`LffWe@nll7!HXvcV<$*?u9oq96sBqKav%0l*8k zC;w%j8?wA0b3-3!bry^_<|--N~_Nf^Af4oeg`lx8spcY=Rf}QdZb8< z^CZm9sRWMus+8~i5~Tn=6GZxAUhA7(DZ5yoDBAEk*IHNxj9)r9*Z6W|hrp+M$!VoxJ14?jJWdSFt-giT(*v8Lr^bHQf7-DGx4>Z zv@XN#VFTj&^$F(yT0E_?N9XIouqvZX9$+GanGnbSGj#03XkrPAOO8&d?X{PMM?2DF zcBZ6j-nu*5_IG4`jsfUlaroqtulUu!=+&9N^8Qy&wrBf;oqzOf3(Be5yY6TG?P2o^ z7ECVHIc6mg_UeiDnB$p?jIXVOwC4E78{3E<$qz6`3q9d@^ifvSYwU8*p7CA9{4EW= zNA>UPR8_q<4(^j1pWc2VrU`RI|3lF3{a~hqaSexw2wj}xa3St&FJ8l^pscw|uW;bI z(#x3E59%+w&zd_st=~#zd&mUEhphSjymtP^?UPlk&Nxx@Y7JNXd1*?|rL#F0aes=a z5%u3nwe??8vgSOt>R2E&Uu&Vm8}_E`ti1=qkD%#nSWaQ3q^)y#OL1!XU)Z2Dw~4g< z-LYvg38(aT*;)RlMH9E~bm#*mkxZ55L|>||rjXEm8(@6a>~>s{Y08z6eJ57VlsiyX z6+)QoRy~45w4H3OD54Z_Q?&hk=#aH7!KGyKF&-^UTQhj#U1grGSfqu~rm-Y2y3N-| zbbdDR2%$H6b3m=fF7n&u-xWgaD1(oLDq%KG9O@;<11ryOoY`|XRhG7BPT3`#4pfgO zWv`3kCx*W2u4CtmYBbp)BnBR;MRnMu$3a$O0)_o>g8O9%q*YnmJu8~fdq@=B2Olo& z)fxyI+1EfB_fmJ&g`KbU>1R`R{#|w|I{(=hL?CY|z2uy3@Z}&RzQ+lbI+$GDZdLZr zsaULo2-eL%eimDEVm3>e;hemv){zu38gZA0D`1 zLK_+F`KtS>I4f{g9q78icqYL?_k=vmII)atXzI&396X{%M*=+Ybddo#vR`b!<%v`g zhuqYB<~$O0UplVm1MYxx@lMWKn{P#r)~)I-)pTUdl0SQb&+q}02zpL|ZUoHg*s2NE z&g}DnXRM_f@a2&hT)2S;)6Iaf+}j++o1%Lp)f&C)c4$TiX+-bSh`#z*&3H58l^W+& z9E={F205^L3A9sSB-zGN6d-~rO`@zm%xzv(K{;9uWYF{mD_^J#d;WwXSy1K04{Cd1 zw(i)sy3tE#CWQhJ$vb@3(^|Hj`bn6L#^82J(9F=o?tp(dY9o}s1?4W}D3;21SA09_ zew_X3t{9WpQgHqDef_S_J?4j==9)PCrTYWwaO9UCj_SloksI z-W0d3KfBS|Ftl(x>`X#j#RxVCT)Gei->0z)=8Z?-Yy=g=W5xS}-`1@^rB;5VY^41bJij0;cMNSl|}H?hRh~ zndGcw0gjW^kgD?LfuX*QAaq;E4o_T2Uf7YJe6!L)ntR;)NTg|5IeX$~jyx|^ReeDR z9p3Uk2d|Bn67hEJ z9s$gzzP`uzz?g6zk4GyVVKc@~Qzi+v5d?K&nV@HT;#}UOtXPt3Z2yl$gn5pPH*m%r^NIl;-*)*6dm^mVr>MKBBsC zMO^88-vFymHIDLUAD}r|ehb#yS3lZ@)SSwFus|!qoGj9LCMqx50oa6>3l^4s4crMJoIvG%XoI!>weCYMRWb1yOOpi zw+>&u*RWEhiaAo$+*3E}uzM7LTgF&!%H`Gg=Ik6jWMw^F-o_Vdt7PLRi#v$0rL^A{ zaMn6*6Y%?7sJ)$4V6HQGevM*>%b%|v^O_!pKpyiJbX3HF;;mR`ZsKlx~!OD2O@B6bvF+ZcOZobH4ZQpjU zs#zZIHuq~InM640<+neSQA@5d@3UHZgAHFeD8@mbJL}~!GF2B6o}9ZkrDfyD9a5Sn zIcDKY6x)S&ozk4j-I*6O@bFt+2`d$GjUCmQ^>252eM`(r+y4>GeOXyfHMdbgI=4~0 zeMZl=lPj-|6?33Q3KWu;#CBcKsWOk)ql~A|3cE^G&hr zcZl^`S{RzYpl_<4Ul>~uZfyOPQ8f|&IEnu5M^n)@b`&euSFPp8d zdQ|w|`MzEk#*T*dxNHdm5q%hZXqiLlmX*%8n!Oqk)5)FxUgs7p`*T{C2t6JOrIkk7 zS_L*40F$Oer>Qy~qe3_nzYXbSMPvwK7xmb1F!isFwYtud439ztO5f?LDE?>oTHkvp zz2x&i4;jiP)OFVPdN_fY&Kv7fpT;D|A|k8?OgZl?_&Nz-I;||MM440TpC%$;#Y-?l?5F;<-#aeQ zG1=aZ8^h7J+^n}YPc?oF&@R;l9~@jtxZ>Vb7R^9!?o)$3rem;Yx=Il(Px1@6AqEz5 z>mLv4?uccb<#|MEXwNY^EVEFBt+80PRkmh_w*Z5v&IrpseQdV8iGK=Y?yjq6O33k; z%v`bA8hWF^{kclw$H3k7mB-&ZJ3Ew3Szff7oUvEWmm8NrX^@eucu@gOWMnFAr zZ%C{~8zpFC`j=oOgl?Hgu$n>ZdWDnP5|Vp62H8L933Qs81Vq${^w zk*aGjfR;MsRgX_UQYl%?9r_C$SLp;*=7B3$2hN|dHeNr~G4%caw07qIP`!WLAA9ma zD9R8byR8(Sk|qa6rRmOnKszH3J{`XHunPqA1R~3u$uSie5-z~{Bwq#4}Mn?-xScII9xB(ZqfvWhB8AG=RKp6$^GJvQrK;l+?x&&%Rgg9$;I=4{kW-Jm`aT|O*BCT{h zR1Lz9x;GzeDKi8f?dTi@+%7*F-Ye5N!uuYrPNiiltXXje_)kiw@nsge>y-k$jI9jbt(598 z0tPBp7zdUct+0WBM<)(`8x7B_{eFC3{Cq^7 z^O{?E-;93_f%xSntbn{^Yz%>$5r46owsFA2OS2>J{J{QYo4pTgjsYebXXzgE{oIQa zJ`sB*CWI+D-NUwE1Hnwy7af)cXs)8SLK4CITg%_~MmryUE(-fT0S>aXoZHMPB*)%W z*pHln&*I^KGWpA`-4{D}Ee?y?${pD?AMD@)Yi^*{?HqEDP4i|MRZUMW;IWq;XEozo z>oN6Rp+!spbpW7|>DinMAf~PB6%o}U^g-1}O}bGjY~j}Rg?_onXg#BxGtDOXR^*C2 zhXnba*kPr7CH<}3RuDCnP=}c*tcKJ6lauIbmVbX>eY{cHpfh3hWc2)KXjL@>VE4W( z>`7w9%hKy~0E!hgDr0MC6d`MG;Vt;>!JO!}SJS0p1-CZ}yh|1tty`2(me#Mc-of{Y zKFvA7yG%Vp%13@c!+zsd01(i_h4QidbH~uce#Yt#^8MJlP9q~@uD_~--|&$3YP@rB zQobnLAkXdis5c4Gf+^IBk6jT3c^c*+SLjiQzTief4MFMrZ~@r2by)`CWq5$ zId94K%>->0P8mAiKX5 z`5@Q-QTh>tdtWvLL=rYAz(|EiT+y(zCHrx z1MJ3NLk4L5MQfyxE*zyrsAa$_1E+Rcd+} zS)aR-OG`+=uorA-7xPe}xNB(|Nm#W8mY%Tb+fkg$cwVSZhJ`lTUj8MwXY+HB^Yx_e z&%aEXxuVOHN(`Y*{ST?45InHrF@Vuw>^Scr3d?a^`%EU9FuJgI71}v|z_5?2h(%ex zV*dTt;tyZT(plevwsBBYNIbK*jlk-xXQ_m}=flC&ljB6#lWHv^UcQuor^0?C^7>zt zJts`eyb4~+|9vhf0!?-kwZ1j?+JR&z;P=Ms+6cS3hu^y6BopAfRm@O%=BFGIE3h+L`nTV9WxDSDNZ5Mk?^%;(_~JQnm?ICNmQx_0JrU?gsGy6-HE$?vV(#SUr|nF~yv4?vC) z<(8+i$hl}5Uuy=bm7hz2g@a+H9Bos4@%@H!im&Cwu%%5d!y1J{0vyQhquz(+Glm|M zF+i=YXdEpe$_P2% zpFa~IHv%Q2|7LXXj0ND^E7N{xdcp5C{6*^H^I*ug5ayWOb`vW-FWQFU>@D0l(7S+7Wxoh(ypd-+Z3O2|43TP10KW@9Lvpu zjuVK~oZClR@9qM$yweafQzi_6_O@xrm2*8JJbr*xKu;IEW4m~ohDqqNv5)Rw4|zM; zzImF4K2p?i7SG!S6)TFEvRMlfsGY4suevuOG+fA{)EF^or3nLl%OG9rqPUF@XdlC6O7kJ#kZtOjPKMu5~trISIhECr~^UVK?8R03&4q2A}Og7I9!rMg; zeMTUIOC~OvMGf0({cY~jpJKUt9#G6gbW}@sF1)+&&a>HA0$B5Kdj+T7I#PjFGOXBL zaK9n0I4@@#mntRDbO_Lj=#5OjW$u_n^%GlliQoh=WpG-D$*W2sKfV5_uucvQsw5Bt-(apb|8|RZlxwqj2a5rF z4W3pM((bOBa?JpvVn&}e0RY6Y`&}{KqM95^i=DJo_2<%n-`h@Kt^&rqf0x5O8s9T$ zRrr{*%?gec`GhdC|M@XGS9DiL>I8e47@!!DDJ2fwz0AcjS2sEu)J<;fLC1R7v2KIk>`KZ`PRQ8=18be={*0;nn2+tg?hN$5d_U4Q&1+ zG!?6^-Nx#WwS(K2T??oQ<=n5~fLZ|;VFENq{o_ymttm=?Ip7WgdaX> z;9%(4dAcM>egHaWR)0mV{U&l)wfW4i-L}{G)h`!Re8wT?Vo2gE6H=Fm;YA7u@zncT z4WdLXk^9#_^F=`h^uy%#y4lb5#Xj1hjK*q=l!6;;{+-WSNdf7b$WPCKh;#V~lqzy_!(urma#6mQ+cjg(H)_U_As z{`fI<>2VqAxJV+Co9oi}x1XcO{ItG@3^Ckqb`9+N#i0cN4hDh&e`SYLr4l?lh}Z2K ztmjPQ`<0u@{5QF5R4?qUl+#We95*F>NNiADDksW8{2e(GD*JAimRJ7-@T1PmTXMo9 zkkAVvGo!+_`p`f$5qVdw=NH8#D|>HFp)MP7?yb@`j`UsPGp0y1{Cvvpt2lJgj;rYIoX%=vWSj;MRF{ejRM3wUbc&wxdK}^u`y6HK8K?`*$qaaT2SYC z0P~yQ^7()%k&QBjIgLwP9n4|6+Yc9rq{CKWVhbI&*}a zszSc01yvg|vc7pcB|`ULi3(R_^(iSdpZX=$eFR8TdzhNFeiDOYQ~)M zyr;{>pxiA3y|+Ivbte9#x-0p;t(Am)JL?l`e^$_&_WHCvQx60Sc;o%mG)k9+pR%{) z*SUwU+q@dVVfM0RTy}fa9O`w(YxBaZDf_(w8ntmfFCh>xWKSp4d?#DH>TQ#Od+ZmbbMa>i%)p zVh)5dnQ-x(k9YH9&r45JUMY|!eH`u#@~8Gc*+ZyrWpd^~CzJM)$nKhvHPIKUmu6aK zrBT2eiF=#uP1PX56w`aJXyB)M8k%C+D*;Ci^X9%C%TDvL$jjaWScKpES66qzf( zQLHjGzk+AOxE7w@wJhKI0F7=*9DH3gOdrLcG_p5SkvQBlkYzDt8^Gc$+8UVCf(z1k`I-2T|cF~~w`hTipT{p6V2ww;yrrKi}cu8;U(Nl1_; z_Tqw*OoI{j53qIHzWNgP&)g>|zlVG%c~<1yG_Z_>E@aHEY!=aVv9GZj zOhtRcw;2by1e%GQg;WQ$z9qkix%Y_b;s`$YkxB2h+Gc z=fp1LvvbzVqZc8FguKS0f@fpDPbamJ;7HCcxO$em8SAYG!!`Fb4pAOWL6LR0J9WlD*6b zRd<)%vxpHfAlma%2}OI!&wIg3eUA&u{-B&kSBU*(vf8YXebZnktJt5ban!|s6}Q#w z$oB2sj+VQ)&C5%K>!*-7)`r!_z9KWn&v=hK^ zGW2P;Pq~{Dc_ge>7dn%^yIApO6=KO2gh>k0fpSxCxWaP&`Ksfd3nG~TH=X>N-|#zwGB;dVdZQo-l@0a`K`kWra@L+hM!R}l{KCGqa(RYu zuEkH>Tlw>H!%(ltN3MD4?s#WzzVBnl)>{8We9cAp{%YQR1W#YVxq4~ap$Ohw?Ny`I zKDjE(u5m!u%?+U%NQdR0>g9gABWLQIEv;5q>KEAH;|)_OvEy;~XnU_E0UsD>R)V)F zYbEFSbqbuCw5o++@38^T?s+j^hSXU~Mc2RZ0Ps_bCE#@D2;GrbbjTk5 zu9hu0twua&Jb*NTXi46*w()8(b4<;{r}x+bB1e8JfB$zq)?H^vj2Lbz^aUvLSTVuP z31m}rC)xW?Gfu5fc>)bK^Xwh9X8YDr__G8GT?*ZmYEU}a_*RqoMW1q29g>HJO3@5A zHcDKuh;792;pW4j;~Y7Noa{pwQ-&K^pnbWh@L>J&3^_);#|ajoHslgEi7ifhJfVAX z?#Aj5tuyLO=WW`C(1Nssn1JuBO#7-pt*?ADXlKs+Qu1zSbZ=zYu4XRPu&dtCXBQKP zrd?X>6^iYv);o$SQj1C3JT#zj0o~4S1n$xRwSi_|Pr2tkv*CqYnh4j?vZEY@z3Hj} zY|nU@*2>FQ?wrpAmUxG@x`I-@WanbKFI~qozHDzz(?JV(C?7DrO_fnE>ku_Ig42Aq zgsfn7)2J-zIdQ{hIT zF`u6EBFuRz&}{66&#s4C?|7WmtWNXS-auGEhvG*-b~EawqtYo=dB=jMvAl~>M5J=% z)}Daulpo>o3=~j2ZW0L>u(5kubd4V?E40CN?r{fSEe&lL+b*Y?Y)xL9_Hp&Tun|a*w9rRWn9O-xAWjwT%*CAFxPbvE}yt}wG;rLot`Khy--?27ol zb+bDN!|pHn2w+;#g$zz-YZQ&oPwUh18hmbvXa%)X0F;e((gwh!ok-XLuY}I2Ms*(- zUud=P;JMpPZ?I;(dRs=VgKt-=z}crk2EFa2gZNszcbRgcrqsdV@kvI7lwAS~eSo9n z*LUAH@3?5VU2=8Im?@C)rb?}28j`cqKtdug*)1%=TgIi{>@bO&uTA(dHX|~=7B66Q z5`VugnJ;A95+?}@9XC^kS+=Y{ztu7^CR6sgQ0JmN9nGish7C04b$#+pg-z~t(Zn6O zwSa&tBeysmx7gU*W)RigTM59!mK+;wVoY`?j(HoIB|Llbwu8^P<|Fjc=-6{|%OHe$flL#wQC(7dE@1vR>sjX58=lRUWuhU5bzflFK zu&(xgvQMVAPz5`=*^u$1tsM z6>g6B23x-uka&=A6+y{-LA29afBe2*n;%%?8hR_D2iolEZ}k{jCtJJ9(=Pr1$>Qq( zIC<7~XM1n`3Pk|8h*8OLOwwMON*f5R0V5zq`!vg2@c(A`)f3Ct(*|%q9LQQ)G}e!J zMh8FXN3rJ`eAB%`Si{nPrKp#AZc@N{;)f^GUrqZYbCm!?S78yn$TTL;<_8gZMVsm) zBIroEpj;?*PFf5HXyVGOFk5RrhCsP1|znv`B?`R_gD19}hRoO2V0 zxtqEpI+0*EFHBI3Vn4hEfyy4d@7U_kbB!Yi?Jl2Sk%5I8!C8!8DFEZ z5|vKCd7jQ06Sv~h?AW}`EG+}1n7!axlZ})p0ENeU1>YGpg!l+q?*L*wPK40U!n+df z=iNkRLcoc1HF=XD)iiF)wMyUSQiHAJ%q!J9M>OFIC!XtVamuzbuH%<$lYcMXfG~kZ z;w7S9JBCU_?-4K#?^c?}oAzEW9-#r0FuT+u;Dv|W=iLons}7R@hsfK0{13a{={1s4 zKN2ZG&#Z$03JY*M06lo0kVYAD# zh_u9=@ps(Tz&FPde*UQhrT9fgbs^(*Ex&gpc!q;G_~m$kN-x`0TBKn7M!sQ;qmE}x zYV_<-$uPZ7P0sTG1An!8pn)pLyW`nOpBVwgY`LBRo#+AKSI9V))R$bfW&%sK9+h8T zw(IC;lKvACQrJ9vQ33gygP}bDbYeeg;xJ#znbaXgs$E8|EYJ9#VnF#*NjVL`zPNt> zf#aYVPMJylT_$o)0K4+-_6LK8%ohcGy9`@vW2P4agxd5Scl7VUV>~hkKNP27D&4vk zCZE(fJ^Q(WblqS7cg7)gs@a-AQg#~%s@|Z*!G>5M>gT+coU-&FO~3N-xH-uwUR0XP z4kPs!%xJ1Ze@?aRaKXZ}>VNG90DxDPMpvcYjiu#zZh%*t+4J-#l^8c@ny6x2z=bRF zZ`q{jlD;dd!9BBL&DwWr@D+pSe|iE|cB|1$9Q;Ench%#*WW4Mu9&Up9 zP%lyTBp_!sKH>q7nyAW8u%wy+DC&vExj{frT>nupQ?+xhHD#!752oXz<)edGbR8C6 z?T>xV3dn5|wmw205`wV~R1KKb>X}W+FrfcqA{XzRpw$=6Z?a{FMFlT_j;|rHki@8! zu$pX@fqHXCx*dJb762PY=YH3EYJQHwfq+9`ly37zUs0gG1+TxBK+nqo_TQI;rHVO{ k{y%Lj@&DSO;(08AmZlS!!KEui1kev-eG9!>9jCbe1B40V5C8xG literal 0 HcmV?d00001 diff --git a/configurator/index.html b/configurator/index.html new file mode 100644 index 0000000..bee35e5 --- /dev/null +++ b/configurator/index.html @@ -0,0 +1,1225 @@ + + + + + + Numbus Configurator + + + + + + + + + + + +

+ + + + + + \ No newline at end of file diff --git a/configurator/logo.png b/configurator/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..28581fae8652e470a39818f546fffb7c6b525438 GIT binary patch literal 32548 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 Default settings -export GUM_SPIN_SPINNER="minidot" -export GUM_SPIN_SPINNER_BOLD=true -export GUM_SPIN_SHOW_ERROR=true -export GUM_SPIN_TITLE_BOLD=true +launch_configurator() { + local PORT=8088 + local CONFIG_FILE="numbus.yaml" + local BRIDGE_SCRIPT="configurator/bridge.py" -NECESSARY_BACKUP_SERVER_VARIABLES_LIST=( - #LIVE TARGET SETTINGS - LIVE_TARGET_IP - LIVE_TARGET_PASSWD - #SERVER SETTINGS - SERVER_LANGUAGE - SERVER_LOCALE - SERVER_TIMEZONE - SERVER_OWNER_NAME - SERVER_USER_EMAIL - SERVER_ADMIN_EMAIL - SERVER_AUTHORIZED_SSH_PUBKEYS - # TRAEFIK SETTINGS - TRAEFIK_CLOUDFLARE_TOKEN - # SMTP SETTINGS - SMTP_SERVER_USERNAME - SMTP_SERVER_PASSWORD - SMTP_SERVER_HOST - SMTP_SERVER_PORT - #NETWORK SETTINGS - NETWORK_SUBNET - NETWORK_ROUTER_IP - NETWORK_HOME_SERVER_IP -) + # Create a more robust Python Bridge + cat << EOF > "${BRIDGE_SCRIPT}" +import http.server +import json +import os -OPTIONAL_BACKUP_SERVER_VARIABLES_LIST=( - # SERVICES SETTINGS - SERVICES_DOMAIN_NAME - SERVICES_SELECTED_SYSTEM_PACKAGES - SERVICES_SELECTED_SYSTEM_SERVICES - SERVICES_SELECTED_WEB_APPLICATIONS - SERVIVCES_SELECTED_WEB_APPLICATIONS_SUBDOMAIN -) +class BridgeHandler(http.server.SimpleHTTPRequestHandler): + def do_GET(self): + if self.path == '/logs': + self.send_response(200) + self.send_header('Content-type', 'text/plain') + self.send_header('Access-Control-Allow-Origin', '*') + self.end_headers() + if os.path.exists('deploy.log'): + with open('deploy.log', 'r') as f: + lines = f.readlines() + self.wfile.write("".join(lines[-20:]).encode()) + return + return http.server.SimpleHTTPRequestHandler.do_GET(self) -NECESSARY_COMPUTER_VARIABLES_LIST=( - # LIVE TARGET SETTINGS - LIVE_TARGET_IP - LIVE_TARGET_PASSWD - # COMPUTER SETTINGS - COMPUTER_LANGUAGE - COMPUTER_LOCALE - COMPUTER_TIMEZONE - COMPUTER_OWNER_NAME - COMPUTER_USER_EMAIL - COMPUTER_ADMIN_EMAIL - COMPUTER_AUTHORIZED_SSH_PUBKEYS - # USER SETTINGS - USER_ADMINISTRATORS - USER_NORMAL_USERS -) + def do_POST(self): + content_length = int(self.headers['Content-Length']) + post_data = self.rfile.read(content_length) + + if self.path == '/discovery': + with open("live_settings.json", "wb") as f: + f.write(post_data) + self.send_response(200) + self.end_headers() + # Signal Bash that discovery data is ready + with open(".discovery_ready", "w") as f: f.write("1") -OPTIONAL_COMPUTER_VARIABLES_LIST=( - # NETWORK SETTINGS - NETWORK_SUBNET - NETWORK_ROUTER_IP - NETWORK_HOME_COMPUTER_IP - # SERVICES SETTINGS - SERVICES_SELECTED_SYSTEM_PACKAGES - SERVICES_SELECTED_DESKTOP_ENVIRONMENT - SERVICE_SELECTED_GNOME_EXTENSIONS - SERVICES_SELECTED_FLATPAK_APPLICATIONS - SERVICES_SELECTED_WEB_APPLICATIONS -) + elif self.path == '/deploy': + with open("${CONFIG_FILE}", "wb") as f: + f.write(post_data) + self.send_response(200) + self.end_headers() + with open(".deploy_signal", "w") as f: f.write("1") -NECESSARY_SERVER_VARIABLES_LIST=( - #LIVE TARGET SETTINGS - LIVE_TARGET_IP - LIVE_TARGET_PASSWD - #SERVER SETTINGS - SERVER_LANGUAGE - SERVER_LOCALE - SERVER_TIMEZONE - SERVER_OWNER_NAME - SERVER_USER_EMAIL - SERVER_ADMIN_EMAIL - SERVER_AUTHORIZED_SSH_PUBKEYS - # TRAEFIK SETTINGS - TRAEFIK_CLOUDFLARE_TOKEN - # SMTP SETTINGS - SMTP_SERVER_USERNAME - SMTP_SERVER_PASSWORD - SMTP_SERVER_HOST - SMTP_SERVER_PORT - #NETWORK SETTINGS - NETWORK_SUBNET - NETWORK_ROUTER_IP - NETWORK_HOME_SERVER_IP - # SERVICES SETTINGS - SERVICES_DOMAIN_NAME - SERVICES_SELECTED_DNS - SERVICES_SELECTED_SYSTEM - SERVICES_SELECTED_WEB_APPLICATIONS -) +os.chdir("configurator") +http.server.HTTPServer(('localhost', ${PORT}), BridgeHandler).serve_forever() +EOF -OPTIONAL_SERVER_VARIABLES_LIST=( - # SERVICES SETTINGS - SELECTED_DNS_SERVICE_SUBDOMAIN - SELECTED_WEB_APPLICATIONS_SUBDOMAIN -) + # Cleanup old signals + rm -f configurator/.discovery_ready configurator/.deploy_signal configurator/live_settings.json configurator/hardware.json -NECESSARY_TV_VARIABLES_LIST=( - #LIVE TARGET SETTINGS - LIVE_TARGET_IP - LIVE_TARGET_PASSWD - #TV SETTINGS - TV_LANGUAGE - TV_LOCALE - TV_TIMEZONE - TV_OWNER_NAME - TV_USER_EMAIL - TV_ADMIN_EMAIL - TV_AUTHORIZED_SSH_PUBKEYS - #NETWORK SETTINGS - NETWORK_SUBNET - NETWORK_ROUTER_IP - NETWORK_HOME_TV_IP -) + echo -e "🚀 Launching Numbus Configurator..." + python3 "${BRIDGE_SCRIPT}" > /dev/null 2>&1 & + BRIDGE_PID=$! -OPTIONAL_TV_VARIABLES_LIST=( - # SERVICES SETTINGS - SERVICES_SELECTED_SYSTEM_PACKAGES - SERVICES_SELECTED_FLATPAK_APPLICATIONS - SERVICES_SELECTED_WEB_APPLICATIONS -) - -# Available DNS services -DNS_SERVICES_LIST=( - "pi-hole" - "adguard" -) - -# Available services -WEB_APPLICATIONS_LIST=( - "crafty" - "frigate" - "gitea" - "home-assistant" - "homepage" - "immich" - "it-tools" - "jellyfin" - "n8n" - "netbootxyz" - "nextcloud" - "ntfy" - "odoo" - "passbolt" - "uptime-kuma" - "vscodium" -) - -# Available system services -SYSTEM_SERVICES_LIST=( - "clamav" - "virtualization" -) - -# Services descriptions -DNS_SERVICES_DESCRIPTION=( - "Pi-hole : Simple, fully open network-wide Ad Blocker" - "AdGuard : Feature-rich network-wide Ad Blocker" -) - -WEB_APPLICATIONS_DESCRIPTION=( - "Crafty : A web-based control panel for Minecraft servers" - "Frigate [Home Assistant required] : NVR with real-time local object detection for IP cameras" - "Gitea : Painless self-hosted Git service" - "Home-Assistant : Open source home automation that puts local control and privacy first" - "Homepage : A modern, secure, highly customizable application dashboard" - "Immich : High performance self-hosted photo and video management solution" - "IT-tools : Handy collection of online tools for developers" - "Jellyfin : The Free Software Media System" - "N8n : Workflow automation for technical people" - "netboot.xyz : Network boot various operating system installers and utilities" - "Nextcloud : The most popular self-hosted collaboration platform" - "Ntfy : Send push notifications to your phone or desktop via PUT/POST" - "Odoo : Open Source ERP and CRM" - "Passbolt : Open source password manager for teams" - "Uptime-Kuma : A fancy self-hosted monitoring tool" - "VSCodium : Free/Libre Open Source Software Binaries of VS Code" -) - -SYSTEM_SERVICES_DESCRIPTION=( - "ClamAV : An open-source anti-virus" - "Virtualization : Run Virtual Machines (KVM/QEMU) with Libvirt" -) -### Default settings <-- - -user_input() { - local VAR_NAME="${1}" - local HEADER="${2}" - local PLACEHOLDER="${3}" - local REGEX="${4}" - local ERROR_MSG="${5}" - local SENSITIVE="${6:-false}" - - while true; do - [[ "${SENSITIVE}" == "false" ]] && INPUT_VALUE=$(gum input --placeholder "${PLACEHOLDER}" --header "${HEADER}") - [[ "${SENSITIVE}" == "true" ]] && INPUT_VALUE=$(gum input --password --placeholder "${PLACEHOLDER}" --header "${HEADER}") - - if [[ -z "${INPUT_VALUE}" ]]; then - echo "❌ Error: Input cannot be empty. Please provide the necessary information." - continue - fi - - if [[ -n "${REGEX}" ]]; then - if [[ ! "${INPUT_VALUE}" =~ ${REGEX} ]]; then - echo "❌ Error: ${ERROR_MSG}" - continue - fi - fi - - export "${VAR_NAME}"="${INPUT_VALUE}" - break - done -} - -strictly_necessary_information() { - export IP_REGEX='^([0-9]{1,3}\.){3}[0-9]{1,3}$' - user_input "LIVE_TARGET_IP" " Please provide the IP address of the target host :" "For example : 192.168.1.100" "${IP_REGEX}" "Invalid IP address format." - user_input "LIVE_TARGET_PASSWD" " Please enter the password for '${TARGET_USER}@${LIVE_TARGET_IP}' :" "${LIVE_TARGET_IP}'s password" "" "" "true" -} - -necessary_information() { - # Regex Definitions - local SUBNET_REGEX='^([0-9]{1,3}\.){3}[0-9]{1,3}/[0-9]{1,2}$' - local DOMAIN_REGEX='^([a-zA-Z0-9]([a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?\.)+[a-zA-Z]{2,}$' - local EMAIL_REGEX='^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$' - local PORT_REGEX='^[0-9]{1,5}$' - local SSH_KEY_REGEX='^ssh-[a-z0-9]+ [A-Za-z0-9+/]+.*' - - echo -e "\n\n➡️ This script needs information about the target you want to install NixOS on\n" - # LIVE TARGET SETTINGS - user_input "LIVE_TARGET_IP" " Please provide the IP address of the target host :" "For example : 192.168.1.100" "${IP_REGEX}" "Invalid IP address format." - user_input "LIVE_TARGET_PASSWD" " Please enter the password for '${TARGET_USER}@${LIVE_TARGET_IP}' :" "${LIVE_TARGET_IP}'s password" "" "" "true" - - echo -e "\n\n➡️ Now provide some information about the server you are deploying\n" - # SERVER SETTINGS - user_input "TIMEZONE" " Please provide the wanted timezone :" "For example : Europe/Paris, Europe/Berlin" "" "" - user_input "LANGUAGE" " Please provide the wanted language :" "For example : FR (for french), EN (for english), DE, IT, etc" "" "" - user_input "LOCALE" " Please provide your locale :" "For example : fr_FR for France, de_DE for Germany, en_US for USA or en_GB for Great-Britain, etc" "" "" - user_input "SERVER_OWNER_NAME" " Please provide the name of the owner of this server :" "For example : Steve" "" "" - user_input "SERVER_USER_EMAIL" " Please provide a valid user email address (to stay informed about your server's health) :" "For example : myemail@gmail.com" "${EMAIL_REGEX}" "Invalid email address format." - user_input "SERVER_ADMIN_EMAIL" " Please provide a valid admin email address (will be used for ACME, and system failures notifications) :" "For example : myemail@gmail.com" "${EMAIL_REGEX}" "Invalid email address format." - user_input "AUTHORIZED_SSH_PUBLIC_KEY" " Please provide a list of SSH public keys of authorized devices :" "For example : ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIGhcYDmjMo5YApLkk/3P3HZCnOSzm0uYewNAbxL8Fci8 user@your-pc" "${SSH_KEY_REGEX}" "Invalid SSH key format (must start with ssh-...)." "true" - - echo -e "\n\n➡️ You will access your services via a domain name (e.g. cloud.mydomain.com) and containers need credentials to create those subdomains\n" - # TRAEFIK SETTINGS - user_input "DOMAIN_NAME" " Please provide the domain name (FQDN) your home server will use :" "For example : yourdomain.com" "${DOMAIN_REGEX}" "Invalid domain name format." - user_input "CLOUDFLARE_DNS_API_TOKEN" " Please provide a cloudflare API token with DNS zone permission :" "For example : bA7hdvCOuXGytlNKohi3ZGtlVpf5CHpLuCMiJrE" "" "" "true" - - echo -e "\n\n➡️ Some services will be able to send you emails. For that you need an email that supports sending emails (like Gmail for example)\n" - # SMTP SETTINGS - user_input "SMTP_SERVER_USERNAME" " Please provide a valid sender email address :" "For example : myemail@gmail.com" "${EMAIL_REGEX}" "Invalid email address format." - user_input "SMTP_SERVER_PASSWORD" " Please provide the password of this email address :" "abcd efgh ijkl mnop" "" "" "true" - user_input "SMTP_SERVER_HOST" " Please provide the SMTP server endpoint :" "For Gmail : smtp.gmail.com" "${DOMAIN_REGEX}" "Invalid domain name format." - user_input "SMTP_SERVER_PORT" " Please provide the smtp TLS port :" "For Gmail : 587" "${PORT_REGEX}" "Invalid port number." - - echo -e "\n\n➡️ This server will connect to your local network and you will configure its IP address\n" - # NETWORK SETTINGS - user_input "NETWORK_SUBNET" " Please provide your network subnet :" "For example 192.168.1.0/24" "${SUBNET_REGEX}" "Invalid subnet format (e.g. 192.168.1.1/24)." - user_input "NETWORK_ROUTER_IP" " Please provide the ip address of your router :" "Most likely 192.168.1.1 or 192.168.1.254" "${IP_REGEX}" "Invalid IP address format." - user_input "HOME_SERVER_IP" " Please choose the ip address that your server will use (i.e. any address in the 192.168.1.1/24 range that is not in use.) :" "For example 192.168.1.5" "${IP_REGEX}" "Invalid IP address format." -} - -import_variables() { - VARIABLES_LIST="${1}" - NECESSARY="${2:-false}" - - echo -e "\n\n➡️ Please choose your configuration file :" - local CONFIG_PATH="$(gum file)" - - source "${CONFIG_PATH}" - local MISSING=false - for VAR in "${VARIABLES_LIST[@]}"; do - if [[ -v "${VAR}" && -n "${!VAR}" ]]; then - gum style "✅ "${VAR}" imported successfully from the config file" - else - gum style "❌ "${VAR}" is missing or empty" - MISSING=true - fi - done - - if [[ "${MISSING}" == "true" ]]; then - if [[ "${NECESSARY}" = "true" ]]; then - echo -e "\n❌ Please check your configuration file to include all necessary variables" - exit 1 - fi - fi - - if [[ "${DEBUG:-false}" == "true" ]]; then - echo -e "\n✅ Debugging enabled." - export DIR_COPY_FLAGS="ravu" - export FILES_COPY_FLAGS="avu" - else - export DIR_COPY_FLAGS="rau" - export FILES_COPY_FLAGS="au" - fi + echo -e "➡️ Open your browser at: $(gum style --foreground 212 "http://localhost:${PORT}")" + xdg-open "http://localhost:${PORT}" 2>/dev/null || open "http://localhost:${PORT}" 2>/dev/null || true } hierarchy_preparation() { @@ -359,15 +112,15 @@ ssh_to_host() { hardware_detection() { ### --> Get hardware information - local TMPFILE="/tmp/nixos-installation-hardware-detection-temp-file" + local TMPFILE="/tmp/hw_detection.json" ssh_to_host 'bash -s' << SSHEND +TARGET_GRAPHICS="false" +TARGET_GRAPHICS_BRAND=() for brand in Intel AMD NVIDIA; do if lspci -nn 2>/dev/null | grep -i "vga" | grep -iq "\${brand}"; then TARGET_GRAPHICS="true" TARGET_GRAPHICS_BRAND+=("\${brand}") - else - TARGET_GRAPHICS="false" fi done @@ -420,34 +173,47 @@ for DISK in \$(lsblk -x SIZE -d -n -e 7,11 -o NAME); do done -echo "# Hardware detection results on \$(date)" > "${TMPFILE}" -for var in \ - TARGET_GRAPHICS \ - TARGET_GRAPHICS_BRAND \ - TARGET_GRAPHICS_RENDERER \ - TARGET_USB_CORAL \ - TARGET_PCIE_CORAL \ - TARGET_ZIGBEE_DEVICE \ - TARGET_INTERFACE \ - TARGET_TPM \ - TARGET_TPM_VERSION; do - echo "export \${var}=\${!var}" >> "${TMPFILE}" -done - -for var in \ - DISK_DEVPATH \ - DISK_NAME \ - DISK_TYPE \ - DISK_HEALTH \ - DISK_ID \ - DISK_SIZE; do - declare -p \${var} | sed 's/^declare /declare -g /' >> "${TMPFILE}" -done +# Build organized JSON output for yq +cat << EOF > "\${TMPFILE}" +{ + "graphics": { + "enabled": \${TARGET_GRAPHICS}, + "brands": [ \$(printf '"%s",' "\${TARGET_GRAPHICS_BRAND[@]}" | sed 's/,\$//') ], + "renderer": \${TARGET_GRAPHICS_RENDERER} + }, + "tpu": { + "usb": \${TARGET_USB_CORAL}, + "pcie": \${TARGET_PCIE_CORAL} + }, + "tpm": { + "enabled": \${TARGET_TPM}, + "version": "\${TARGET_TPM_VERSION}" + }, + "zigbee": { + "device": "\${TARGET_ZIGBEE_DEVICE}" + }, + "network": { + "interface": "\${TARGET_INTERFACE}" + }, + "disks": [ +\$( + count=\${#DISK_NAME[@]} + for i in "\${!DISK_NAME[@]}"; do + echo " {\"name\": \"\${DISK_NAME[\$i]}\", \"path\": \"\${DISK_DEVPATH[\$i]}\", \"type\": \"\${DISK_TYPE[\$i]}\", \"health\": \"\${DISK_HEALTH[\$i]}\", \"id\": \"\${DISK_ID[\$i]}\", \"size\": \"\${DISK_SIZE[\$i]}\"}\$( [[ \$i -lt \$((count-1)) ]] && echo ',' )" + done +) + ] +} +EOF SSHEND ### Get hardware information <-- - scp -i "final-nix-config/home/numbus-admin/.ssh/id_ed25519" "${TARGET_USER}@${LIVE_TARGET_IP}":"${TMPFILE}" "${TMPFILE}" &> /dev/null - source "${TMPFILE}" && rm -rf "${TMPFILE}" + scp -i "final-nix-config/home/numbus-admin/.ssh/id_ed25519" "${TARGET_USER}@${LIVE_TARGET_IP}":"${TMPFILE}" "hardware.json" &> /dev/null + + # Create YAML for NixOS and JSON for the Configurator Website + yq -P '.' hardware.json > hardware.yaml + yq -o=json '.' hardware.yaml > configurator/hardware.json + rm hardware.json ### --> Generate hardware-configuration.nix if ssh_to_host "sudo nixos-generate-config --no-filesystems --show-hardware-config" > final-nix-config/etc/nixos/hardware-configuration.nix; then @@ -1026,32 +792,19 @@ nix_update() { --use-remote-sudo switch --flake final-nix-config/etc/nixos#numbus-server } -congrats() { - gum style --border normal --margin "1" --padding "1 2" --border-foreground 212 " - ⚠️ $(gum style --foreground 212 'CONGRATULATIONS !!:') You now have a working home server. \ -Data stored on there will be fully yours and protected. Keep in my mind this comes with the \ -responsability of managing it and keeping it secure. Now, you have to log in the webpages of \ -the services you installed. Create an admin account for all of them and configure them (or keep \ -it simple and use defaults) and take care to note down all the passwords. Change all default passwords \ - and create user accounts for your family or friends that will use the server. - - Cheers !!" -} - set -euo pipefail clear -fastfetch --logo nixos --logo-padding-left 4 --structure ' ' gum style --align center --width 80 --foreground 212 " ██████ █████ █████ ▒▒██████ ▒▒███ ▒▒███ - ▒███▒███ ▒███ █████ ████ █████████████ ▒███████ █████ ████ █████ + ▒███▒███ ▒███ █████ ████ █████████████ ▒███████ █████ ████ █████ ▒███▒▒███▒███ ▒▒███ ▒▒███ ▒▒███▒▒███▒▒███ ▒███▒▒███▒▒███ ▒▒███ ███▒▒ ▒███ ▒▒██████ ▒███ ▒▒███ ▒███ ▒███ ▒███ ▒███ ▒███ ▒███ ▒▒███ ▒▒█████ ▒███ ▒▒█████ ▒███ ▒▒███ ▒███ ▒███ ▒███ ▒███ ▒███ ▒███ ▒▒███ ▒▒▒▒███ - █████ ▒▒█████ ▒▒████████ █████▒███ █████ ████████ ▒▒████████ ██████ -▒▒▒▒▒ ▒▒▒▒▒ ▒▒▒▒▒▒▒▒ ▒▒▒▒▒ ▒▒▒ ▒▒▒▒▒ ▒▒▒▒▒▒▒▒ ▒▒▒▒▒▒▒▒ ▒▒▒▒▒▒ + █████ ▒▒█████ ▒▒████████ █████▒███ █████ ████████ ▒▒████████ ██████ +▒▒▒▒▒ ▒▒▒▒▒ ▒▒▒▒▒▒▒▒ ▒▒▒▒▒ ▒▒▒ ▒▒▒▒▒ ▒▒▒▒▒▒▒▒ ▒▒▒▒▒▒▒▒ ▒▒▒▒▒▒ █████████ ███▒▒▒▒▒███ @@ -1062,85 +815,7 @@ gum style --align center --width 80 --foreground 212 " ▒▒█████████ ▒▒██████ █████ ▒▒█████ ▒▒██████ █████ ▒▒▒▒▒▒▒▒▒ ▒▒▒▒▒▒ ▒▒▒▒▒ ▒▒▒▒▒ ▒▒▒▒▒▒ ▒▒▒▒▒ " + sleep 1 -SELECTED_DEVICE=$(gum choose --header "📦 Select the device type to deploy:" \ - "numbus-server" \ - "numbus-backup-server" \ - "numbus-computer" \ - "numbus-tv" \ -) - -SELECTED_MODE=$(gum choose --header "🛠️ Select the deployment strategy for ${SELECTED_DEVICE}:" \ - "Semi-interactive (recommended - use a config file)" \ - "Interactive (manual input)" \ - "Update and Maintain (existing installation)" \ -) - -if [[ "${SELECTED_MODE}" == "Update and Maintain"* ]]; then - TARGET_USER="numbus-admin" - echo -e "\n➡️ Proceeding with maintenance/update for ${SELECTED_DEVICE}..." - gum style --border normal --margin "1" --padding "1 2" --border-foreground 212 \ - "➡️ Ensure the remote device is powered on and accessible via SSH." - - gum confirm "Ready to proceed?" || { echo "❌ Aborted."; exit 1; } - - strictly_necessary_information - setup_ssh - # Maintain legacy update sequence - more_information_config - folder_tree_generation - nix_generation - nix_update - congrats - -else - TARGET_USER="nixos" - echo -e "\n➡️ Proceeding with new deployment for ${SELECTED_DEVICE}..." - gum style --border normal --margin "1" --padding "1 2" --border-foreground 212 \ - "➡️ On the target host: Boot into the NixOS ISO, launch a console, and set a temporary user password." - - gum confirm "Ready to proceed?" || { echo "❌ Aborted."; exit 1; } - - if [[ "${SELECTED_MODE}" == "Semi-interactive"* ]]; then - import_variables "${VARS_LIST[@]}" "true" - else - strictly_necessary_information - necessary_information - fi - - # Standard Deployment Pipeline - hierarchy_preparation - setup_ssh - hardware_detection - - # Server-specific logic - if [[ "${SELECTED_DEVICE}" == "numbus-server" ]]; then - services_selection - fi - - disks_selection - server_config_generation - network_config_generation - - if [[ "${SELECTED_DEVICE}" == "numbus-server" ]]; then - services_config_generation - fi - - # Mail setup for server-grade devices - if [[ "${SELECTED_DEVICE}" == *"server"* ]]; then - mail_config_generation - fi - - disk_config_generation - keys_generation - sum_up - - if [[ "${SELECTED_DEVICE}" == "numbus-server" ]]; then - cloudflare_dns_setup - fi - - export_configuration - deploy - postrun_action -fi \ No newline at end of file +launch_configurator diff --git a/docs/numbus-server/configuration/automatic_ssl_certs.md b/docs/numbus-server/configuration/services/automatic_ssl_certs.md similarity index 100% rename from docs/numbus-server/configuration/automatic_ssl_certs.md rename to docs/numbus-server/configuration/services/automatic_ssl_certs.md diff --git a/docs/numbus-server/configuration/custom_subdomain.md b/docs/numbus-server/configuration/services/custom_subdomain.md similarity index 100% rename from docs/numbus-server/configuration/custom_subdomain.md rename to docs/numbus-server/configuration/services/custom_subdomain.md diff --git a/docs/numbus-server/configuration/services/index.md b/docs/numbus-server/configuration/services/index.md index 44b8713..d5050b7 100644 --- a/docs/numbus-server/configuration/services/index.md +++ b/docs/numbus-server/configuration/services/index.md @@ -4,11 +4,11 @@ | Variable | Description | Values | Default | | -------- | ----------- | ------ | --------- | +| DOMAIN_NAME | The domain name that will be used to access the different services. | your-domain.com | | | SELECTED_DNS_SERVICE | The DNS service to install (AdBlocking). | ( "pi-hole" ), ( "adguard" ) | ( "pi-hole" ) | | SELECTED_WEB_APPLICATIONS | The list of web applications to install. | ( "nextcloud" ), ( "homepage" jellyfin" "it-tools" "netbootxyz" ), ... [see the full list below](./index.md#web-applications-list) | | | SELECTED_SYSTEM_SERVICES | The list of system services to install. | ( "clamav" ), ( "virtualization" "clamav" ), ... [see the full list below](./index.md#system-services-list) | | -| SELECTED_DNS_SERVICE_[subdomain](../custom_subdomain.md) | Custom [subdomain](../custom_subdomain.md) for the DNS service. | "my-dns" | Will be the name of the service. I.e. pi-hole.your-domain.com or adguard.your-domain.com | -| SELECTED_WEB_APPLICATIONS_[subdomain](../custom_subdomain.md) | Custom [subdomain](../custom_subdomain.md)s for the web applications (must match the order of SELECTED_WEB_APPLICATIONS). | "my-cloud", "my-photos" | Will be the name of the service. I.e. nextcloud.your-domain.com, immich.your-domain.com, ... | + ## Web applications list @@ -37,7 +37,7 @@ This is the list of **all the available apps** that can be enabled on the numbus ## System services list -| Name | Description | Additional settings ? | +| Name | Description | Additional settings | | -------- | ----------- | ------ | -| clamav | Open-source anti-virus software. | No | -| virtualization | Run Virtual Machines (KVM/QEMU). | No | \ No newline at end of file +| clamav | Open-source anti-virus software. | | +| virtualization | Run Virtual Machines (KVM/QEMU). | | \ No newline at end of file diff --git a/numbus-server.conf b/numbus-server.conf deleted file mode 100644 index 537a19a..0000000 --- a/numbus-server.conf +++ /dev/null @@ -1,119 +0,0 @@ -## 📦 Live target settings -# See docs/numbus-server/configuration/live_target.md -export LIVE_TARGET_IP="192.168.1.10" -export LIVE_TARGET_PASSWD="example" - - -## ⚙️ Server settings -# See docs/numbus-server/configuration/server.md -export SERVER_LANGUAGE="FR" -export SERVER_LOCALE="fr_FR" -export SERVER_TIMEZONE="Europe/Paris" -export SERVER_OWNER_NAME="yourName" -export SERVER_USER_EMAIL="user@your-domain.com" -export SERVER_ADMIN_EMAIL="admin@your-domain.com" -export SERVER_AUTHORIZED_SSH_PUBKEYS=( "ssh-ed25519 AAAAoefzefpoipoeCEZJCPEACPAcjapjcpajepcjAPJECJPEJAPJAZ yours@yourdomain.com" ) - - -## 📬 Mail settings -# See docs/numbus-server/configuration/mail.md -export SMTP_SERVER_USERNAME="your-address@your-domain.com" -export SMTP_SERVER_PASSWORD="emrp raps vzoi vnoe" -export SMTP_SERVER_HOST="smtp.yourdomain.com" -export SMTP_SERVER_PORT="587" - - -## 🚦 Traefik settings -# See docs/numbus-server/configuration/services/traefik.md -export CLOUDFLARE_DNS_API_TOKEN="yourToken" - - - - - -## 🛜 Network settings -# See docs/numbus-server/configuration/network.md -export NETWORK_SUBNET="192.168.1.0/24" -export NETWORK_ROUTER_IP="192.168.1.1" -export HOME_SERVER_IP="192.168.1.5" - - -## 🛠️ Services settings -# See docs/numbus-server/configuration/services/index.md -export DOMAIN_NAME="yourdomain.com" - - -## DNS service -export SELECTED_DNS_SERVICE=( - "pi-hole" - "adguard" -) - - -## Web applications -export SELECTED_WEB_APPLICATIONS=( - "crafty" - "frigate" - "gitea" - "home-assistant" - "homepage" - "immich" - "it-tools" - "jellyfin" - "n8n" - "netbootxyz" - "nextcloud" - "ntfy" - "odoo" - "passbolt" - "uptime-kuma" - "vscodium" -) - - -## System services -export SELECTED_SYSTEM_SERVICES=( - "clamav" - "virtualization" -) - - -## DNS service subdomain -# See docs/numbus-server/configuration/services/index.md -export SELECTED_DNS_SERVICE_SUBDOMAIN=( - "my-pi-hole-subdomain" # or "my-adguard-subdomain" -) - - -## Web applications subdomain -# ⚠️ The order must strictly match the SELECTED_WEB_APPLICATIONS array above. -export SELECTED_WEB_APPLICATIONS_SUBDOMAIN=( - "my-crafty-subdomain" - "my-frigate-subdomain" - "my-gitea-subdomain" - "my-home-assistant-subdomain" # Example : your Home-assistant URL will be ; https://my-home-assistant-subdomain.yourdomain.com/ - "my-homepage-subdomain" - "my-immich-subdomain" - "my-it-tools-subdomain" - "my-jellyfin-subdomain" # Example : your Jellyfin URL will be ; https://my-jellyfin-subdomain.yourdomain.com/ - "my-n8n-subdomain" - "my-netbootxyz-subdomain" - "my-nextcloud-subdomain" - "my-ntfy-subdomain" - "my-odoo-subdomain" - "my-passbolt-subdomain" - "my-uptime-kuma-subdomain" - "my-vscodium-subdomain" -) - - -## ⛏️ Crafty settings -# See docs/numbus-server/configuration/services/crafty.md -export DYNMAP_ENABLED="false" -export WANTED_NUMBER_OF_JAVA_MINECRAFT_SERVERS="1" -export WANTED_NUMBER_OF_BEDROCK_MINECRAFT_SERVERS="0" - - -## 📜 Script settings -# See docs/numbus-server/configuration/script.md -export VERBOSE="true" \ No newline at end of file diff --git a/templates/numbus-server/configuration.nix b/templates/numbus-server/configuration.nix index a519138..8c1c408 100644 --- a/templates/numbus-server/configuration.nix +++ b/templates/numbus-server/configuration.nix @@ -1,20 +1,17 @@ -{ modulesPath, config, pkgs, inputs, ... }: +# Do NOT edit this file manually. +# Please use the dedicated script : https://gittea.dev/numbus/numbus. +# This could compromise system stability and is not supported by numbus. + +{ config, modulesPath, ... }: { imports = [ (modulesPath + "/installer/scan/not-detected.nix") (modulesPath + "/profiles/qemu-guest.nix") - inputs.sops-nix.nixosModules.sops + ./custom-configuration.nix + ./numbus-generated.nix ]; # System system.stateVersion = "25.11"; - - # Secrets management - sops.defaultSopsFile = ./secrets/secrets.yaml; - sops.age.sshKeyPaths = [ "/home/numbus-admin/.ssh/id_ed25519" ]; - sops.age.keyFile = "/var/lib/sops-nix/key.txt"; - # Secrets - sops.secrets."authorizedSshPublicKeys" = { owner = "numbus-admin"; path = "/home/numbus-admin/.ssh/authorized_keys"; mode = "0600"; }; - sops.secrets."smtpPassword" = { owner = "numbus-admin"; mode = "0600"; }; - sops.secrets."cloudflareDnsApiToken" = { owner = "numbus-admin"; mode = "0600"; }; \ No newline at end of file +} \ No newline at end of file diff --git a/templates/numbus-server/custom-configuration.nix b/templates/numbus-server/custom-configuration.nix new file mode 100644 index 0000000..23e44ad --- /dev/null +++ b/templates/numbus-server/custom-configuration.nix @@ -0,0 +1,5 @@ +# This file is reserved for ADVANCED USERS ONLY. +# Editing could compromise system stability and is not supported by numbus. +# Do NOT set options already managed by numbus. i.e. config.numbus.* and other options (networking, storage, etc.) +# Please use the dedicated script for those options : https://gittea.dev/numbus/numbus. + diff --git a/templates/numbus-server/flake.nix b/templates/numbus-server/flake.nix index 0296512..68454d4 100644 --- a/templates/numbus-server/flake.nix +++ b/templates/numbus-server/flake.nix @@ -1,10 +1,14 @@ +# Do NOT edit this file manually. +# Please use the dedicated script : https://gittea.dev/numbus/numbus. +# This could compromise system stability and is not supported by numbus. + { inputs = { # Core Nixpkgs nixpkgs.url = "github:NixOS/nixpkgs/nixos-25.11"; # Numbus server configuration - numbus.url = "git+https://gittea.dev/numbus/numbus-server"; - numbus.inputs.nixpkgs.follows = "nixpkgs"; + numbus-server.url = "git+https://gittea.dev/numbus/numbus-server"; + numbus-server.inputs.nixpkgs.follows = "nixpkgs"; # Disk-partitioning helper disko.url = "github:nix-community/disko"; disko.inputs.nixpkgs.follows = "nixpkgs"; @@ -16,7 +20,7 @@ autoaspm.inputs.nixpkgs.follows = "nixpkgs"; }; - outputs = { self, nixpkgs, numbus, disko, sops-nix, autoaspm, ... }@inputs: let + outputs = { self, nixpkgs, numbus-server, disko, sops-nix, autoaspm, ... }@inputs: let # System definition system = "x86_64-linux"; pkgs = import nixpkgs { @@ -31,7 +35,7 @@ specialArgs = { inherit inputs; }; modules = [ # Numbus server configuration - numbus.nixosModules.numbus + numbus-server.nixosModules.numbus-server # Disk-partitioning helper disko.nixosModules.disko # Secrets handling diff --git a/templates/numbus-server/numbus-generated.nix b/templates/numbus-server/numbus-generated.nix new file mode 100644 index 0000000..4302f12 --- /dev/null +++ b/templates/numbus-server/numbus-generated.nix @@ -0,0 +1,10 @@ +# Do NOT edit this file manually. +# Please use the dedicated script : https://gittea.dev/numbus/numbus. +# This could compromise system stability and is not supported by numbus. + +{ config, pkgs, inputs, ... }: + +{ + imports = [ + inputs.sops-nix.nixosModules.sops + ]; \ No newline at end of file diff --git a/templates/numbus-server/sops-nix/secrets.yaml b/templates/numbus-server/sops-nix/secrets.yaml index 38c83a2..1a2671b 100644 --- a/templates/numbus-server/sops-nix/secrets.yaml +++ b/templates/numbus-server/sops-nix/secrets.yaml @@ -1,4 +1,10 @@ +# SSH authorizedSshPublicKeys: | $SSH_KEYS_FORMATTED + +# SMTP smtpPassword: "$SMTP_SERVER_PASSWORD" -cloudflareDnsApiToken: "$CLOUDFLARE_DNS_API_TOKEN" \ No newline at end of file + +# CLOUDFLARE +cloudflareDnsApiToken: "$CLOUDFLARE_DNS_API_TOKEN" + diff --git a/wg0.conf b/wg0.conf deleted file mode 100644 index d23d6d7..0000000 --- a/wg0.conf +++ /dev/null @@ -1 +0,0 @@ -# Populate this file with a valid WireGuard tunnel configuration if you chose to deploy a numbus-backup-server. \ No newline at end of file From 3494bac065d029a5be5fb8b95e32dd628a999688 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rapha=C3=ABl=20Numbus?= Date: Sat, 28 Mar 2026 22:07:01 +0100 Subject: [PATCH 15/43] Added main code execution. --- configurator/index.html | 18 +++++++++--------- deploy.sh | 32 +++++++++++++++++++++++++++++++- 2 files changed, 40 insertions(+), 10 deletions(-) diff --git a/configurator/index.html b/configurator/index.html index bee35e5..4646f78 100644 --- a/configurator/index.html +++ b/configurator/index.html @@ -86,13 +86,13 @@
@@ -428,7 +428,7 @@
+ + + + + +
+ + +
+ Numbus Logo +

Welcome to Numbus

+

Let's transform your hardware into a powerful, private appliance. We'll guide you through discovery and configuration.

+ +
+ + + +

Privacy First: No data entered here ever leaves your device. This configurator runs entirely locally in your browser and is fully private.

+
+ + +
+ + +
+
+ + +
+
+

Deployment Mode

+

How would you like to set up your device?

+
+
+ + +
+
+ + +
+
+

Device Type

+

Select the personality for your new Numbus machine.

+
+
+ +
+
+ + +
+
+

Live Setup

+

Follow these steps to prepare your hardware for discovery.

+
+
+
+
+
1
+

Create a NixOS Boot ISO and flash it to a USB drive.

+
+
+
2
+
+

In BIOS, enable UEFI, VT-x/SVM, VT-d/IOMMU, TPM 2.0 and Disable Secure Boot.

+
+
+
+
3
+

Boot the device. Type ip a to get the IP, then passwd to set a temporary password.

+
+
+
+
+ + +
+
+ + +
+ +
+
+
+ + +
+
+
+
+
+

Hardware Discovery in Progress

+

We're remotely probing your machine for disks and interfaces. This usually takes 1-2 minutes.

+
+ + +
+
+

Language

+

Set your regional preferences to ensure correct time and language display.

+
+
+
+
+ + +
+

Choose the language for your server's system and primary interfaces.

+ +
+
+
+ + +
+

Defines regional formats for dates, currencies, and numbers (e.g., en_US for USA).

+ +
+
+
+ + +
+

Used to synchronize server logs, backups, and scheduled updates with your local time.

+ +
+
+
+ + +
+
+
+

Users

+

Manage people and their access permissions.

+
+ +
+ +
+ +
+ + +
+ + +
+
+ + +
+ + +
+
+
+ + +
+
+

Mail

+

Configure system notifications and service alerts.

+
+
+
+
+ + +
+

The email address used to send alerts (e.g. system@yourdomain.com).

+ +
+
+
+ + +
+

The password or app-token for the sender email account.

+ +
+
+
+ + +
+

The server address of your email provider (e.g. smtp.gmail.com).

+ +
+
+
+ + +
+

The network port for secure mail transmission. Common: 587 (TLS) or 465 (SSL).

+ +
+
+
+ + +
+
+

Network

+

Target host networking and server IP allocation.

+
+
+
+
+ + +
+

The fixed address of your server on your local network. It should be outside your router's DHCP range.

+ +
+
+
+ + +
+

The address of the device providing internet (the gateway). Usually 192.168.1.1.

+ +
+
+
+ + +
+ + +
+
+

Security

+

Manage infrastructure access and advanced protection.

+
+ +
+ +
+
+
+ +
+ +
+ One login for everything. Centralized identity management via LLDAP and Authelia. Provides enterprise-grade security and 2FA for all your apps. +
+
+
+ +
+
+ + +
+
+
+ +
+ +
+ Allows you to share links (like Nextcloud folders) with friends who don't have NetBird. Only specific URLs are exposed; everything else remains locked behind the VPN. +
+
+
+ +
+
+
+ +
+
+ + +
+

A secure way to log in without a password. Like a physical key, but digital.

+

Paste here the public keys that are allowed to connect to your server's admin account (one per line).

+ +
+ + +
+
+ +
+

Security Warning: Anyone who possesses one of these public keys AND their corresponding private key will have full administrator access to your server. Protect your private keys as if they were physical keys to your home.

+
+
+ + +
+
+

Services

+

Choose the applications to deploy.

+
+ +
+
+
+ + +
+ +
+ +

DNS Filter

+
+ +
+ +

Web Applications

+
+ +
+ +

System Services

+
+ +
+
+ + +
+

+ + Crafty Control Settings +

+
+
+
+ + +
+
+ + +
+
+
+ + +
+
+
+
+
+ + +
+
+

Configuration Source

+

Link your Git repository containing the numbus.yaml file.

+
+
+
+ + +
+
+
+ + +
+
+ + +
+
+
+
+ + +
+
+

Setup Type

+

Are we creating a new server instance or restoring an existing one?

+
+
+ + +
+
+ +

Pull data from an existing numbus-backup-server.

+
+ +
+ +
+ + + +
+
+
+ + +
+
+

Environment Overrides

+

Apply specific tweaks to this local deployment.

+
+

Select settings you wish to override from the Git configuration.

+
+ +
+

tweaks: []

+
+
+
+ + +
+
+
+
+

Deploying Numbus...

+
+
+ Live Terminal Logs + +
+
+

> Initializing nixos-anywhere...

+

> Checking connection to target...

+

> Copying closure to remote...

+
+
+ + +
+
+

Configuration Source

+

Link your Git repository containing the numbus.yaml file.

+
+
+
+ + +
+
+
+ + +
+
+ + +
+
+
+
+ + +
+
+

Setup Type

+

Are we creating a new server instance or restoring an existing one?

+
+
+ + +
+
+ +

Pull data from an existing numbus-backup-server.

+
+ +
+ +
+ + + +
+
+
+ + +
+
+

Environment Overrides

+

Apply specific tweaks to this local deployment.

+
+
+

Select settings you wish to override from the Git configuration.

+
+ tweaks: [] +
+
+
+ + +
+
+
+
+

Deploying Numbus...

+
+
+ Live Terminal Logs + +
+
+

[INFO] Starting deployment sequence...

+

[CMD] nixos-anywhere --flake .#numbus-server

+

[STDOUT] Initializing remote connection...

+
+
+
+
+ + +
+
+ +
+

Ready to Deploy

+

Your configuration has been generated successfully. Download the file and place it in your Numbus project root.

+ +
+
+

+                        
+
+
+ + +
+ + + + + +
+
+
+