terraform { required_providers { helm = { source = "hashicorp/helm" version = "~> 2.11.0" } kubernetes = { source = "hashicorp/kubernetes" version = "~> 2.23.0" } keycloak = { source = "mrparkers/keycloak" version = "~> 4.3.1" } proxmox = { source = "telmate/proxmox" version = "~> 2.9.8" } guacamole = { source = "techBeck03/guacamole" version = "~> 1.4.1" } } backend "kubernetes" { secret_suffix = "tfstate" config_path = "~/.kube/config" namespace = "dan-terraform" } } provider "kubernetes" { config_path = "~/.kube/config" } provider "helm" { kubernetes { config_path = "~/.kube/config" } } provider "keycloak" { client_id = "terraform" client_secret = var.keycloak_client_secret url = "https://keycloak.${var.domain_suffix}" } provider "guacamole" { url = "https://guac.${var.domain_suffix}/" # token = var.guacamole_token # data_source = var.guacamole_datasource username = "guacadmin" password = "guacadmin" } provider "proxmox" { pm_api_url = var.proxmox_api_url pm_api_token_id = var.proxmox_token_id pm_api_token_secret = var.proxmox_token pm_tls_insecure = true } resource "helm_release" "keycloak" { name = "keycloak" namespace = var.keycloak_namespace repository = "https://charts.bitnami.com/bitnami/" chart = "keycloak" create_namespace = true values = [ <<-EOT auth: adminPassword: ${var.keycloak_admin_pass} adminUser: admin global: storageClass: ${var.storageclass} ingress: annotations: cert-manager.io/cluster-issuer: letsencrypt-prod traefik.ingress.kubernetes.io/router.middlewares: default-redirect-https@kubernetescrd enabled: true hostname: keycloak.${var.domain_suffix} tls: true postgresql: auth: password: ${var.postgres_password} proxy: edge metrics: enabled: true EOT ] } resource "keycloak_realm" "realm" { realm = var.keycloak_realm display_name = var.keycloak_realm_display_name enabled = true default_signature_algorithm = "RS256" } resource "keycloak_user" "initial_keycloak_user" { realm_id = keycloak_realm.realm.id username = var.keycloak_user.username enabled = true email = var.keycloak_user.email first_name = var.keycloak_user.firstname last_name = var.keycloak_user.lastname initial_password { value = var.keycloak_user.password temporary = false } } resource "keycloak_group" "admin_group" { realm_id = keycloak_realm.realm.id name = "Admins" } resource "keycloak_user_groups" "initial_user_in_admin_group" { exhaustive = false realm_id = keycloak_realm.realm.id user_id = keycloak_user.initial_keycloak_user.id group_ids = [ keycloak_group.admin_group.id ] } resource "keycloak_openid_client" "gitea_client" { realm_id = keycloak_realm.realm.id client_id = "gitea" enabled = true access_type = "CONFIDENTIAL" standard_flow_enabled = true implicit_flow_enabled = true client_secret = var.keycloak_gitea_secret valid_redirect_uris = [ "https://git.${var.domain_suffix}/*" ] } resource "helm_release" "gitea" { name = "gitea" repository = "https://dl.gitea.com/charts/" chart = "gitea" namespace = var.gitea_namespace create_namespace = true values = [ <<-EOT gitea: oauth: - autoDiscoverUrl: https://keycloak.${var.domain_suffix}/realms/${keycloak_realm.realm.realm}/.well-known/openid-configuration key: ${keycloak_openid_client.gitea_client.client_id} name: md1clv.im provider: openidConnect secret: ${keycloak_openid_client.gitea_client.client_secret} global: storageClass: ${var.storageclass} ingress: annotations: traefik.ingress.kubernetes.io/router.middlewares: default-redirect-https@kubernetescrd cert-manager.io/cluster-issuer: letsencrypt-prod enabled: true hosts: - host: git.${var.domain_suffix} paths: - path: / pathType: Prefix tls: - hosts: - git.${var.domain_suffix} secretName: tls-gitea persistence: enabled: true storageClass: ${var.storageclass} EOT ] } resource "keycloak_openid_client" "guac_client" { realm_id = keycloak_realm.realm.id client_id = "guac" enabled = true access_type = "CONFIDENTIAL" standard_flow_enabled = true implicit_flow_enabled = true valid_redirect_uris = [ "https://guac.${var.domain_suffix}/*" ] } resource "random_password" "guac_db_pw" { length = 16 special = false } resource "random_password" "guac_db_admin_pw" { length = 16 special = false } resource "helm_release" "guacpg" { name = "guacpg" namespace = var.guac_namespace repository = "https://charts.bitnami.com/bitnami/" chart = "postgresql" create_namespace = true values = [ < x } name = each.value.name parent_identifier = guacamole_connection_group.routers.identifier parameters { hostname = each.value.default_ipv4_address username = "vyos" private_key = var.ssh_private_key } }