diff --git a/bootstrap/edge/variables.tf b/bootstrap/edge/variables.tf index 6d1c76a..3e1b03f 100644 --- a/bootstrap/edge/variables.tf +++ b/bootstrap/edge/variables.tf @@ -1,6 +1,11 @@ variable "edge_host" { type = string - default = "132.145.170.74" + default = "" + + validation { + condition = var.edge_host != "" + error_message = "edge_host must be provided from homelab.yml through jeannie or an explicit tfvars/env value." + } } variable "edge_user" { @@ -25,19 +30,17 @@ variable "edge_install_docker" { variable "server_name" { type = string - default = "lab2025.duckdns.org" + default = "" + + validation { + condition = var.server_name != "" + error_message = "server_name must be provided from homelab.yml through jeannie or an explicit tfvars/env value." + } } variable "additional_server_names" { - type = list(string) - default = [ - "demos.lab2025.duckdns.org", - "heimdall.lab2025.duckdns.org", - "grafana.lab2025.duckdns.org", - "prometheus.lab2025.duckdns.org", - "alertmanager.lab2025.duckdns.org", - "argocd.lab2025.duckdns.org", - ] + type = list(string) + default = [] } variable "enable_letsencrypt" { @@ -57,7 +60,12 @@ variable "letsencrypt_staging" { variable "backend_host" { type = string - default = "192.168.100.240" + default = "" + + validation { + condition = var.backend_host != "" + error_message = "backend_host must be provided from homelab.yml through jeannie or an explicit tfvars/env value." + } } variable "backend_port" { @@ -77,7 +85,12 @@ variable "gitea_backend_port" { variable "gitea_backend_host" { type = string - default = "100.85.138.30" + default = "" + + validation { + condition = var.gitea_backend_host != "" + error_message = "gitea_backend_host must be provided from homelab.yml through jeannie or an explicit tfvars/env value." + } } variable "haproxy_stats_user" { diff --git a/jeannie b/jeannie index e0029af..3140838 100755 --- a/jeannie +++ b/jeannie @@ -29,6 +29,7 @@ load_homelab_inventory_defaults() { rendered_defaults="$(python3 - "${inventory_file}" <<'PY' import re +import json import shlex import sys @@ -140,6 +141,14 @@ if debian_ip and gitea_http: gitea_ts = values.get("hosts.debian.tailscale_ip") if gitea_ts: print(f": ${{LAB_GITEA_TAILSCALE_IP:={shlex.quote(gitea_ts)}}}") +subdomains = values.get("domain.subdomains") +if subdomains: + if isinstance(subdomains, str): + subdomain_values = [item.strip() for item in subdomains.split(",") if item.strip()] + else: + subdomain_values = list(subdomains) + if subdomain_values: + print(f": ${{LAB_ADDITIONAL_SERVER_NAMES_JSON:={shlex.quote(json.dumps(subdomain_values))}}}") PY )" @@ -182,6 +191,7 @@ export_homelab_inventory_tf_vars() { export_if_unset TF_VAR_edge_user "${LAB_EDGE_USER:-}" export_if_unset TF_VAR_edge_install_dir "${LAB_EDGE_INSTALL_DIR:-}" export_if_unset TF_VAR_server_name "${LAB_DOMAIN:-}" + export_if_unset TF_VAR_additional_server_names "${LAB_ADDITIONAL_SERVER_NAMES_JSON:-}" export_if_unset TF_VAR_backend_host "${LAB_TRAEFIK_LB_IP:-}" export_if_unset TF_VAR_gitea_backend_host "${LAB_DEBIAN_TAILSCALE_IP:-}" export_if_unset TF_VAR_gitea_backend_port "${LAB_GITEA_HTTP_PORT:-}" @@ -1363,7 +1373,7 @@ check_debian_tailscale_ip() { } check_edge_ssh() { - local edge_host="${LAB_EDGE_HOST:-132.145.170.74}" + local edge_host="${LAB_EDGE_HOST:?LAB_EDGE_HOST is required from homelab.yml}" local edge_user="${LAB_EDGE_USER:-ubuntu}" ssh -o BatchMode=yes -o ConnectTimeout=10 -o StrictHostKeyChecking=accept-new "${edge_user}@${edge_host}" "true" @@ -1466,7 +1476,7 @@ sudo rm -f \"\$root/.homelab-check/write-test\"" } check_edge_disk_free() { - local edge_host="${LAB_EDGE_HOST:-132.145.170.74}" + local edge_host="${LAB_EDGE_HOST:?LAB_EDGE_HOST is required from homelab.yml}" local edge_user="${LAB_EDGE_USER:-ubuntu}" local min_gib="${LAB_PREFLIGHT_EDGE_MIN_FREE_GIB:-2}" @@ -1536,7 +1546,7 @@ homelab_preflight() { fi preflight_warn "RPi Tailscale IP ${LAB_RPI_TAILSCALE_IP:-unset}" check_rpi_tailscale_ip preflight_check "Pimox storage ${LAB_PIMOX_WORKER_STORAGE:-${TF_VAR_pimox_worker_storage:-opi5_ssd}} is active" check_pimox_storage || failures=$((failures + 1)) - preflight_check "OCI edge SSH ${LAB_EDGE_USER:-ubuntu}@${LAB_EDGE_HOST:-132.145.170.74}" check_edge_ssh || failures=$((failures + 1)) + preflight_check "OCI edge SSH ${LAB_EDGE_USER:-ubuntu}@${LAB_EDGE_HOST:?LAB_EDGE_HOST is required from homelab.yml}" check_edge_ssh || failures=$((failures + 1)) if ((failures > 0)); then echo "Preflight failed with ${failures} blocking check(s). Fix the inventory or host state before continuing." >&2 @@ -2830,8 +2840,8 @@ deploy_gitea() { local image="${LAB_GITEA_IMAGE:-gitea/gitea:1.21.7}" local http_port="${LAB_GITEA_HTTP_PORT:-3000}" local ssh_port="${LAB_GITEA_SSH_PORT:-32222}" - local domain="${LAB_GITEA_DOMAIN:-${LAB_DOMAIN:-lab2025.duckdns.org}}" - local root_url="${LAB_GITEA_ROOT_URL:-${LAB_PUBLIC_URL:-https://lab2025.duckdns.org}/git/}" + local domain="${LAB_GITEA_DOMAIN:-${LAB_DOMAIN:?LAB_DOMAIN is required from homelab.yml}}" + local root_url="${LAB_GITEA_ROOT_URL:-${LAB_PUBLIC_URL:?LAB_PUBLIC_URL is required from homelab.yml}/git/}" local container_name="${LAB_GITEA_CONTAINER_NAME:-homelab-gitea}" local compose_file="${REPO_ROOT}/infra/gitea/docker-compose.yml" local install_docker="${LAB_GITEA_INSTALL_DOCKER:-false}" @@ -3248,7 +3258,7 @@ bootstrap_gitea_repo() { local container_name="${LAB_GITEA_CONTAINER_NAME:-homelab-gitea}" local http_port="${LAB_GITEA_HTTP_PORT:-3000}" local ssh_port="${LAB_GITEA_SSH_PORT:-32222}" - local root_url="${LAB_GITEA_ROOT_URL:-https://lab2025.duckdns.org/git/}" + local root_url="${LAB_GITEA_ROOT_URL:?LAB_GITEA_ROOT_URL is required from homelab.yml}" local repo_owner="${LAB_GITEA_REPO_OWNER:-jv}" local repo_name="${LAB_GITEA_REPO_NAME:-my-homelab-configs}" local default_branch="${LAB_GITEA_REPO_DEFAULT_BRANCH:-main}" @@ -4659,7 +4669,7 @@ status_http_reachable() { } status_gitea_public_ok() { - local root_url="${LAB_GITEA_ROOT_URL:-${LAB_PUBLIC_URL:-https://lab2025.duckdns.org}/git/}" + local root_url="${LAB_GITEA_ROOT_URL:-${LAB_PUBLIC_URL:?LAB_PUBLIC_URL is required from homelab.yml}/git/}" status_http_reachable "${root_url}" } @@ -4957,8 +4967,8 @@ status_cascade_report() { status_section "Edge And Public URLs" status_cascade_check "OCI edge SSH" check_edge_ssh || failures=$((failures + 1)) - status_cascade_check "Traefik LoadBalancer HTTP" status_http_reachable "http://${LAB_TRAEFIK_LB_IP:-192.168.100.240}/" || failures=$((failures + 1)) - status_cascade_check "Website public URL" status_http_ok "${LAB_PUBLIC_URL:-https://lab2025.duckdns.org}/" || failures=$((failures + 1)) + status_cascade_check "Traefik LoadBalancer HTTP" status_http_reachable "http://${LAB_TRAEFIK_LB_IP:?LAB_TRAEFIK_LB_IP is required from homelab.yml}/" || failures=$((failures + 1)) + status_cascade_check "Website public URL" status_http_ok "${LAB_PUBLIC_URL:?LAB_PUBLIC_URL is required from homelab.yml}/" || failures=$((failures + 1)) status_cascade_check "Gitea public route" status_gitea_public_ok || failures=$((failures + 1)) if ((failures > 0)); then @@ -5311,10 +5321,10 @@ status_report() { fi status_section "HTTP" - status_http "website public" "${LAB_PUBLIC_URL:-https://lab2025.duckdns.org}/" - status_http "gitea public" "${LAB_GITEA_ROOT_URL:-${LAB_PUBLIC_URL:-https://lab2025.duckdns.org}/git/}" + status_http "website public" "${LAB_PUBLIC_URL:?LAB_PUBLIC_URL is required from homelab.yml}/" + status_http "gitea public" "${LAB_GITEA_ROOT_URL:-${LAB_PUBLIC_URL:?LAB_PUBLIC_URL is required from homelab.yml}/git/}" status_http "gitea local" "http://127.0.0.1:${LAB_GITEA_HTTP_PORT:-3000}/" - status_http "traefik lb" "http://${LAB_TRAEFIK_LB_IP:-192.168.100.240}/" + status_http "traefik lb" "http://${LAB_TRAEFIK_LB_IP:?LAB_TRAEFIK_LB_IP is required from homelab.yml}/" status_http "arr radarr" "http://127.0.0.1:7878/" status_http "arr sonarr" "http://127.0.0.1:8989/" status_http "arr prowlarr" "http://127.0.0.1:9696/" @@ -5323,17 +5333,17 @@ status_report() { } doctor_edge() { - local edge_host="${LAB_EDGE_HOST:-132.145.170.74}" + local edge_host="${LAB_EDGE_HOST:?LAB_EDGE_HOST is required from homelab.yml}" local edge_user="${LAB_EDGE_USER:-ubuntu}" - local traefik_ip="${LAB_TRAEFIK_LB_IP:-192.168.100.240}" - local gitea_ts_ip="${LAB_GITEA_TAILSCALE_IP:-100.85.138.30}" + local traefik_ip="${LAB_TRAEFIK_LB_IP:?LAB_TRAEFIK_LB_IP is required from homelab.yml}" + local gitea_ts_ip="${LAB_GITEA_TAILSCALE_IP:?LAB_GITEA_TAILSCALE_IP is required from homelab.yml}" local gitea_http_port="${LAB_GITEA_HTTP_PORT:-3000}" require_debian_server "doctor-edge" status_section "Doctor Edge" - status_http "website public" "${LAB_PUBLIC_URL:-https://lab2025.duckdns.org}/" - status_http "gitea public" "${LAB_GITEA_ROOT_URL:-${LAB_PUBLIC_URL:-https://lab2025.duckdns.org}/git/}" + status_http "website public" "${LAB_PUBLIC_URL:?LAB_PUBLIC_URL is required from homelab.yml}/" + status_http "gitea public" "${LAB_GITEA_ROOT_URL:-${LAB_PUBLIC_URL:?LAB_PUBLIC_URL is required from homelab.yml}/git/}" printf '\n-- edge backend reachability\n' if ! ssh -o BatchMode=yes -o ConnectTimeout=10 -o StrictHostKeyChecking=accept-new "${edge_user}@${edge_host}" " @@ -5359,8 +5369,8 @@ EOF backstage_brain_note "doctor-edge" </dev/null 2>&1; then @@ -5467,7 +5477,7 @@ EOF backstage_brain_note "doctor-cluster" <