2026-11-01 00:43:19 +00:00
|
|
|
|
terraform {
|
|
|
|
|
|
required_providers {
|
|
|
|
|
|
kubernetes = {
|
|
|
|
|
|
source = "hashicorp/kubernetes"
|
|
|
|
|
|
version = "~> 2.26"
|
|
|
|
|
|
}
|
|
|
|
|
|
helm = {
|
|
|
|
|
|
source = "hashicorp/helm"
|
|
|
|
|
|
version = "~> 2.12"
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
2026-11-02 17:03:48 +00:00
|
|
|
|
|
2026-11-08 01:32:47 +00:00
|
|
|
|
# Der State-Pfad pro Umgebung wird beim init gesetzt:
|
|
|
|
|
|
# terraform init -backend-config=envs/test.backend.hcl (k3s, terraform/states/boday_tf – unverändert)
|
|
|
|
|
|
# terraform init -backend-config=envs/prod.backend.hcl (Talos, terraform/states/boday_tf_prod)
|
2026-11-02 17:03:48 +00:00
|
|
|
|
backend "consul" {
|
|
|
|
|
|
address = "consul:8500"
|
|
|
|
|
|
}
|
2026-11-01 00:43:19 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
2026-11-08 01:32:47 +00:00
|
|
|
|
# --- Variablen ---------------------------------------------------------------
|
|
|
|
|
|
|
2026-11-01 00:43:19 +00:00
|
|
|
|
variable "app_version" {
|
2026-11-08 01:32:47 +00:00
|
|
|
|
description = "Image-Tag (Git-SHA aus der Pipeline)"
|
|
|
|
|
|
type = string
|
|
|
|
|
|
default = "latest"
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
variable "environment" {
|
|
|
|
|
|
description = "test (k3s) oder prod (Talos)"
|
|
|
|
|
|
type = string
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
variable "kubeconfig_path" {
|
|
|
|
|
|
type = string
|
|
|
|
|
|
default = "./kind_kubeconfig"
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
# Nur für k3s nötig (überschreibt den Server aus der Kubeconfig). Bei Talos null lassen.
|
|
|
|
|
|
variable "kube_host" {
|
2026-11-01 00:43:19 +00:00
|
|
|
|
type = string
|
2026-11-08 01:32:47 +00:00
|
|
|
|
default = null
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
# k3s-Test: true. Talos: false – die Kubeconfig von talosctl enthält die CA.
|
|
|
|
|
|
variable "kube_insecure" {
|
|
|
|
|
|
type = bool
|
|
|
|
|
|
default = false
|
2026-11-01 00:43:19 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
2026-11-08 01:32:47 +00:00
|
|
|
|
variable "namespace" {
|
|
|
|
|
|
type = string
|
|
|
|
|
|
default = "default"
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
# Leer = Wert aus values.yaml bleibt (k3s-Test). Für Prod als Forgejo-Secret übergeben.
|
|
|
|
|
|
variable "django_secret_key" {
|
|
|
|
|
|
type = string
|
|
|
|
|
|
default = ""
|
|
|
|
|
|
sensitive = true
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
variable "postgres_password" {
|
|
|
|
|
|
type = string
|
|
|
|
|
|
default = ""
|
|
|
|
|
|
sensitive = true
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
# --- Provider ----------------------------------------------------------------
|
|
|
|
|
|
|
2026-11-01 00:43:19 +00:00
|
|
|
|
provider "kubernetes" {
|
2026-11-08 01:32:47 +00:00
|
|
|
|
config_path = var.kubeconfig_path
|
|
|
|
|
|
host = var.kube_host
|
|
|
|
|
|
insecure = var.kube_insecure
|
2026-11-01 00:43:19 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
provider "helm" {
|
|
|
|
|
|
kubernetes {
|
2026-11-08 01:32:47 +00:00
|
|
|
|
config_path = var.kubeconfig_path
|
|
|
|
|
|
host = var.kube_host
|
|
|
|
|
|
insecure = var.kube_insecure
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
# --- Deployment --------------------------------------------------------------
|
|
|
|
|
|
|
2026-11-01 00:43:19 +00:00
|
|
|
|
resource "helm_release" "boday_website" {
|
2026-11-08 01:32:47 +00:00
|
|
|
|
name = "boday-it"
|
|
|
|
|
|
chart = "./charts/boday-it"
|
|
|
|
|
|
namespace = var.namespace
|
|
|
|
|
|
create_namespace = var.namespace != "default"
|
2026-11-12 22:29:50 +00:00
|
|
|
|
timeout = 600 # 10 min instead of 5 (first Longhorn volume, slow pulls)
|
|
|
|
|
|
atomic = true # on failure: automatic rollback instead of a "failed" release
|
2026-11-08 01:32:47 +00:00
|
|
|
|
|
|
|
|
|
|
# Umgebungsspezifische Werte (Ingress-Klasse, StorageClass, ...)
|
|
|
|
|
|
values = [file("${path.module}/charts/boday-it/values-${var.environment}.yaml")]
|
2026-11-01 00:43:19 +00:00
|
|
|
|
|
|
|
|
|
|
set {
|
|
|
|
|
|
name = "image.tag"
|
|
|
|
|
|
value = var.app_version
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2026-11-08 01:50:44 +00:00
|
|
|
|
# Secrets nur setzen, wenn sie übergeben wurden (sonst gilt values.yaml).
|
|
|
|
|
|
# nonsensitive() gibt nur "gesetzt ja/nein" frei, nicht den Wert selbst.
|
|
|
|
|
|
dynamic "set_sensitive" {
|
|
|
|
|
|
for_each = nonsensitive(var.django_secret_key != "") ? ["secrets.djangoSecretKey"] : []
|
|
|
|
|
|
content {
|
|
|
|
|
|
name = set_sensitive.value
|
|
|
|
|
|
value = var.django_secret_key
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2026-11-08 01:32:47 +00:00
|
|
|
|
dynamic "set_sensitive" {
|
2026-11-08 01:50:44 +00:00
|
|
|
|
for_each = nonsensitive(var.postgres_password != "") ? ["secrets.postgresPassword"] : []
|
2026-11-08 01:32:47 +00:00
|
|
|
|
content {
|
2026-11-08 01:50:44 +00:00
|
|
|
|
name = set_sensitive.value
|
|
|
|
|
|
value = var.postgres_password
|
2026-11-08 01:32:47 +00:00
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|