104 lines
3.6 KiB
Terraform
104 lines
3.6 KiB
Terraform
variable "zitadel_domain" {
|
|||
|
|
description = "External domain of the ZITADEL instance, without scheme."
|
||
|
|
type = string
|
||
|
|
default = "zitadel.riotpiao.com"
|
||
|
|
}
|
||
|
|
|
||
|
|
variable "zitadel_port" {
|
||
|
|
description = "Port for the ZITADEL API. 443 behind ingress, 8080 for a direct pod port-forward."
|
||
|
|
type = string
|
||
|
|
default = "443"
|
||
|
|
}
|
||
|
|
|
||
|
|
variable "zitadel_insecure" {
|
||
|
|
description = "Call the API over plain HTTP (set true only when port-forwarding the pod)."
|
||
|
|
type = bool
|
||
|
|
default = false
|
||
|
|
}
|
||
|
|
|
||
|
|
variable "jwt_profile_file" {
|
||
|
|
description = "Path to the iam-admin machine key JSON extracted from the iam-admin Secret."
|
||
|
|
type = string
|
||
|
|
default = null
|
||
|
|
}
|
||
|
|
|
||
|
|
variable "org_id" {
|
||
|
|
description = <<-EOT
|
||
|
|
ID of the ZITADEL organization that holds the project. Read it from the
|
||
|
|
console: https://zitadel.riotpiao.com -> Organization settings -> Resource
|
||
|
|
ID. The chart's setup job creates the default org; this module never creates
|
||
|
|
one, because creating a second org would split the role and grant space.
|
||
|
|
EOT
|
||
|
|
type = string
|
||
|
|
}
|
||
|
|
|
||
|
|
variable "project_id" {
|
||
|
|
description = <<-EOT
|
||
|
|
Stable project ID. ZITADEL puts the project ID in the access token `aud`
|
||
|
|
claim, so pinning it keeps audience checks readable across a rebuild.
|
||
|
|
Every consumer that validates `aud` against a client ID must be re-pointed
|
||
|
|
to this value — see the plan §5.2.
|
||
|
|
EOT
|
||
|
|
type = string
|
||
|
|
default = "homelab"
|
||
|
|
}
|
||
|
|
|
||
|
|
variable "project_name" {
|
||
|
|
description = "Display name of the project that carries every role and application."
|
||
|
|
type = string
|
||
|
|
default = "homelab"
|
||
|
|
}
|
||
|
|
|
||
|
|
variable "machine_key_expiry" {
|
||
|
|
description = "Expiry of every machine key, RFC3339. Matches the chart's default iam-admin key window; rotate by changing this value and re-applying."
|
||
|
|
type = string
|
||
|
|
default = "2029-01-01T00:00:00Z"
|
||
|
|
}
|
||
|
|
|
||
|
|
variable "api_app_consumers" {
|
||
|
|
description = <<-EOT
|
||
|
|
Machine users that also need an API application (the client_credentials
|
||
|
|
replacement). Only the gateway does: every other agent signs a JWT with its
|
||
|
|
machine key and does not need a client_credentials grant.
|
||
|
|
EOT
|
||
|
|
type = map(string)
|
||
|
|
default = { api-gw = "Go LLM gateway" }
|
||
|
|
}
|
||
|
|
|
||
|
|
variable "enable_groups_claim_action" {
|
||
|
|
description = <<-EOT
|
||
|
|
Create the Actions v1 script and its trigger that synthesizes the `groups`
|
||
|
|
claim. Keep this false until the live go/no-go gate passes: the claim is
|
||
|
|
load-bearing for kube-apiserver RBAC, MinIO policies, Grafana role mapping
|
||
|
|
and every service that reads `groups`. Turning it on with an unverified
|
||
|
|
script can break every consumer at once.
|
||
|
|
EOT
|
||
|
|
type = bool
|
||
|
|
default = false
|
||
|
|
}
|
||
|
|
|
||
|
|
variable "groups_claim_script" {
|
||
|
|
description = <<-EOT
|
||
|
|
Path to the JavaScript body for the groups-claim action, read only when
|
||
|
|
enable_groups_claim_action is true. The body is deliberately not shipped
|
||
|
|
blind: the ZITADEL v1 Actions runtime API must be confirmed against the live
|
||
|
|
instance before a script is committed, because a wrong call silently emits
|
||
|
|
no claim instead of failing loudly.
|
||
|
|
EOT
|
||
|
|
type = string
|
||
|
|
default = null
|
||
|
|
|
||
|
|
validation {
|
||
|
|
# try() is required: HCL does not short-circuit `||`, so fileexists(null)
|
||
|
|
# would fail the whole plan even with the action disabled.
|
||
|
|
condition = try(fileexists(var.groups_claim_script), true)
|
||
|
|
error_message = "groups_claim_script must name an existing file when it is set."
|
||
|
|
}
|
||
|
|
|
||
|
|
# Enabling the action without a script would reach file(null) inside actions.tf.
|
||
|
|
validation {
|
||
|
|
condition = !var.enable_groups_claim_action || var.groups_claim_script != null
|
||
|
|
error_message = "enable_groups_claim_action requires groups_claim_script."
|
||
|
|
}
|
||
|
|
}
|