# Root Terragrunt configuration # Provides DRY provider, backend, and variable loading for all stacks. # Two-tier state backend: # Tier 0 (bootstrap): local state, SOPS-encrypted in git — must exist before PG is reachable. # Tier 1 (everything else): PG backend on CNPG cluster, native pg_advisory_lock. locals { tier0_stacks = ["infra", "platform", "cnpg", "vault", "dbaas", "external-secrets"] stack_name = replace(path_relative_to_include(), "stacks/", "") is_tier0 = contains(local.tier0_stacks, local.stack_name) } remote_state { backend = local.is_tier0 ? "local" : "pg" generate = { path = "backend.tf" if_exists = "overwrite_terragrunt" } config = local.is_tier0 ? { path = "${get_repo_root()}/state/${path_relative_to_include()}/terraform.tfstate" } : { conn_str = get_env("PG_CONN_STR", "") schema_name = local.stack_name } } # Load config.tfvars (plaintext). Secrets come from Vault KV — authenticate via `vault login -method=oidc`. terraform { extra_arguments "common_vars" { commands = get_terraform_commands_that_need_vars() required_var_files = [ "${get_repo_root()}/config.tfvars" ] } extra_arguments "no_backup" { commands = ["apply", "plan", "destroy", "import"] arguments = ["-backup=-"] } extra_arguments "kube_config" { commands = get_terraform_commands_that_need_vars() arguments = [ "-var", "kube_config_path=${get_repo_root()}/config" ] } } # Generate kubernetes + helm + cloudflare providers for all stacks. # The infra stack overrides this to add the proxmox provider. generate "k8s_providers" { path = "providers.tf" if_exists = "overwrite_terragrunt" contents = <