feat(openclaw): add shopping, supermarket deals, geizhals, and ebay MCP tools

This commit is contained in:
Moritz Graf
2026-09-10 21:32:22 +02:00
parent 2f2f597a67
commit 1e81cdbead
4754 changed files with 1298747 additions and 896 deletions
+32 -32
View File
@@ -1,24 +1,24 @@
# This file is maintained automatically by "terraform init".
# Manual edits may be lost in future updates.
provider "registry.opentofu.org/ovh/ovh" {
version = "2.1.0"
provider "registry.terraform.io/goauthentik/authentik" {
version = "2026.5.1"
constraints = ">= 2024.12.0"
hashes = [
"h1:QNYWbHCXQyUAs1Ucxd4Lw7CS/FohMP/P21uyRWlYPTw=",
"zh:08d56f6fd7e0730ea379962b869a80ee47992d5f8523d259eada4479001ce646",
"zh:0f1e34db1f51e5b05e183b8905e89c521e223481507ab72421ec141718cb1465",
"zh:299b1a702fba2b42bcef9a12db0cb51d091962a6387e1da6043b4830d60b7eca",
"zh:4ee79a677eddff27ceed33c207b074ebbfc33727a9e5b863ae8d800da819f1da",
"zh:50b7ae60d4d539b79e8db097db954a03e582d29c760cff0854a9b882148db848",
"zh:6121ce09a73ed20025e933a8e237cbc62ccaee92fed5ebcbb6984b3c2bc6e4fc",
"zh:75cccdfefdfd9054b388b6c8ddce3ffa76adbdc9eb149f6e34998a87e5bb0d3d",
"zh:8859bdfb25ae26e4e924e9909f476eafea91a9c2c9f7f65fbc85e68f3c2c4e60",
"zh:a435fe28514806bc7b3a3c5a9b878401790402bd75d34f1a9fe1b7b7db9b66b7",
"zh:b3ac7469d1864cf96cad90fd8b0c4b99da2e5695b6b2826540320302c241f803",
"zh:b531d3ea1b12a17a8999a093a819f0e90c18b0d5db371e2c7e15add337f421ff",
"zh:bebc6b1aa48fc5c42fd68d9ff2f8866d794bfff568486d1943827202212aed44",
"zh:d4fb1c9e76eb923b35bea62ba4921cba63da83abe4676150d7a4bb9b687228eb",
"zh:f953ef37e4a1b3cac22f851c3269e7376704018ffa642b4768869cc227ffccc9",
"h1:sa790BNXc5pY8vVXyFn8Y1cHY+cRDbEiHDsr9t0NdiA=",
"zh:05f252734db99792e5d3f52b582a4e0027348ac2614d8c9621bf7e623cff8036",
"zh:0e1cd8041650aed9bb8d4af23301e786223ed5d1a00c2a5150b7ad874ae03917",
"zh:26b1daebd30650df411f903248e061cf963712a063b38e731782fb13a5755ddf",
"zh:362b536ff6bf8866c7c1094c3e2322c22b8c36d8d4caa4db0397cebbcad08561",
"zh:3d94367b853960f5e88efe3ae69d995d02a11dc8d60ec4d7413a37aabf78b379",
"zh:3e840e204677eabe562d17c2ad12afdfa250098725bebac4e91fb8934e233c22",
"zh:4db66139d7a9ec6f7852538573261010d48f0a939e2fe8eeb5c55b01149e3629",
"zh:7b88a830fb26c697f9d240f498f604485454b12e56b7604eda4ca35d10660ecd",
"zh:851bc8bd2d4a16dc71f30da17b6285aa7d85f4bc4175fde7b8319a6a8987ec65",
"zh:8bdfc2c70271d48126eef3b1a30d0d132e868d2118ae7277323ed4c905636e4a",
"zh:e85c03eac43f23f25ad5443a2984cc67977c3abdcb4c4c426d37342c2f25c37e",
"zh:efc296826a700a4e90ee06f8bd3b137617486ce774772aabed3053d4ef8dd906",
"zh:f249033dc242c51600cd3968535efa0780352d5ae7435e8ab1482a7ccc9c2f5e",
]
}
@@ -84,21 +84,21 @@ provider "registry.terraform.io/hashicorp/random" {
}
provider "registry.terraform.io/ovh/ovh" {
version = "2.15.0"
version = "2.19.0"
hashes = [
"h1:Y6pQdKjn1OR4wNlxRpy+nI7Dvap/bKzFb68fynMxTmI=",
"zh:22d361f99caa70b07532fce13208fce8b84072cf83eaf6ddfcd9096df88b57ea",
"zh:497f88936649d3c352fdb639ba5ebdabfec8ec7a59d67bf619013e3afbbaefb4",
"zh:62e49208e2950daf366b396694dc7de5bba31a8b7a10aac7c021f2c78fd64f70",
"zh:97e06f7494706df30c136f4809314d92a25129738cf080e22c5c9e47ec70c4cf",
"zh:be23cf1ecb2eb76c60dad72eb4f9d005c6184cae6e2cf9f13b0462030133644c",
"zh:bf60c1af6db5ca51ff4372fee8e64a21462134d281ae9cb3968ca5b209338c4b",
"zh:c9e5ad5c063249786595c5b6c3f59791bd21f5157ff0572a4ed2d52ca8141c50",
"zh:d2bf2603741df6fc29a88384f7026fb8b0e982b8a270796e672037d287b41e83",
"zh:d944de8032fc01d8488087755bf7fb813e7b8c259e23a7b68ed654905ad19b56",
"zh:dcf2a7620abac38e9d8f0a88f2a79de0fddd917ba0facba1108f6581eb1b7f6f",
"zh:e7c7905954f69f0d5b6cf9bd87572101924e128aa33311856dbbfedd711361d2",
"zh:f6a9977d744ed879a0b3c28a5a800b6a1f49aabe8d71e87ca1d02fe6a77a31ba",
"zh:fd0e48de826df04e18489d33b0ff35bd776cb6e7704188f67dad66cbb041e5af",
"h1:SUzZY0kbQQ1Z+T958n8//7u+UlItQgll3vTfxuUbdOM=",
"zh:0ba0eec9b66d3cf3ffbb8cc753d87aebc7ddb73b975c5b2eb372ec1fcf8712fe",
"zh:24773d4959b2fa2674760eebdda421e93a7b0e4cadf1ae135ed66d573e86b040",
"zh:2f24103c6b132cb21f1834ee2b00ebce863118d53dc2e55b85cd5b1d154bdc46",
"zh:3a7492ea842566601323b6ff4ee45a6ced7eb7c08ed888608acc3bc8e490c22a",
"zh:5018841095e9677fc8e5abcdd8336b5ad20086426cc22be35fb657b3cd8c7b9d",
"zh:62ea15a24fb26a79586c14eed2d1b8dfbdb5195288620dcd36d9c71a55b5860c",
"zh:6847b431185ddf4e7349d2397ac9cb1659ad129b01ec1661df2cac60b031e6c4",
"zh:7cdc7f403f10b405ef5e9a10094ce11685d2a739058e5c21c7db268dcf3c8fd8",
"zh:9d9ae5b6afe707487230c46930a805b0bcfc4c95cb779c4dd956695dd67a7a84",
"zh:bcc1bfd1df2546aff09726885703713dc9579f73240395cb9890140165f45d1c",
"zh:c02e93bdd854b5814089d88c2ecf76fc22b83dda1c4785aea6765c1b72ac9897",
"zh:e26191ff7f5ae7750d129136c0e6f13a54167fe332dc6c5f3f3ceab17c27c4df",
"zh:f0de0de40649efc805e63fbe405055ed4c0f8149b0d530bb63d079b62f692de1",
]
}
Binary file not shown.
+725
View File
@@ -0,0 +1,725 @@
# --- Authentik Terraform Configuration ---
variable "authentik_url" {
description = "Base URL of the Authentik instance"
type = string
default = "https://auth.haumdaucher.de"
}
variable "authentik_token" {
description = "Authentik API Token (create via Directory > Tokens & App passwords)"
type = string
sensitive = true
default = null
}
provider "authentik" {
url = var.authentik_url
token = var.authentik_token
}
# --- Branding: Haumdaucher Custom Theme & Assets ---
resource "authentik_brand" "haumdaucher" {
domain = "auth.haumdaucher.de"
default = true
branding_title = "HAUMDAUCHER"
branding_logo = "https://haumdaucher.de/images/logo_classic.png"
branding_favicon = "https://haumdaucher.de/icon-192.png"
branding_custom_css = file("${path.module}/haumdaucher-theme.css")
}
# --- Directory: User Groups ---
resource "authentik_group" "infra_admins" {
name = "infra-admins"
is_superuser = false
}
resource "authentik_group" "users" {
name = "users"
is_superuser = false
}
resource "authentik_group" "verein_mitglieder" {
name = "verein-mitglieder"
is_superuser = false
}
# --- Flows: Authorization, Invalidation & Custom Invitation Flow ---
data "authentik_flow" "default_authorization_flow" {
slug = "default-provider-authorization-implicit-consent"
}
data "authentik_flow" "default_invalidation_flow" {
slug = "default-invalidation-flow"
}
# 1. Prompt Fields for Member Onboarding
resource "authentik_stage_prompt_field" "haumdaucher_enrollment_username" {
name = "haumdaucher-enrollment-username"
field_key = "username"
label = "Benutzername"
type = "username"
required = true
order = 10
}
resource "authentik_stage_prompt_field" "haumdaucher_enrollment_email" {
name = "haumdaucher-enrollment-email"
field_key = "email"
label = "E-Mail-Adresse"
type = "email"
required = true
order = 15
}
resource "authentik_stage_prompt_field" "haumdaucher_enrollment_name" {
name = "haumdaucher-enrollment-name"
field_key = "name"
label = "Vollständiger Name"
type = "text"
required = true
order = 20
}
resource "authentik_stage_prompt_field" "haumdaucher_enrollment_password" {
name = "haumdaucher-enrollment-password"
field_key = "password"
label = "Passwort"
type = "password"
required = true
order = 30
}
resource "authentik_stage_prompt_field" "haumdaucher_enrollment_password_repeat" {
name = "haumdaucher-enrollment-password-repeat"
field_key = "password_repeat"
label = "Passwort wiederholen"
type = "password"
required = true
order = 40
}
# 2. Prompt Stage
resource "authentik_stage_prompt" "haumdaucher_enrollment_prompt" {
name = "haumdaucher-enrollment-prompt"
fields = [
authentik_stage_prompt_field.haumdaucher_enrollment_username.id,
authentik_stage_prompt_field.haumdaucher_enrollment_email.id,
authentik_stage_prompt_field.haumdaucher_enrollment_name.id,
authentik_stage_prompt_field.haumdaucher_enrollment_password.id,
authentik_stage_prompt_field.haumdaucher_enrollment_password_repeat.id,
]
}
# 3. Invitation Stage (gates the flow so only valid ?itoken=... can register)
resource "authentik_stage_invitation" "haumdaucher_enrollment_invitation" {
name = "haumdaucher-enrollment-invitation"
continue_flow_without_invitation = false
}
# 4. User Write Stage (creates user in database and assigns default 'users' group)
resource "authentik_stage_user_write" "haumdaucher_enrollment_write" {
name = "haumdaucher-enrollment-write"
create_users_as_inactive = false
create_users_group = authentik_group.users.id
}
# 5. User Login Stage (starts the user session)
resource "authentik_stage_user_login" "haumdaucher_enrollment_login" {
name = "haumdaucher-enrollment-login"
session_duration = "seconds=0"
}
# 6. Redirect Stage (redirects user to haumdaucher.de after successful registration)
resource "authentik_stage_redirect" "haumdaucher_enrollment_redirect" {
name = "haumdaucher-enrollment-redirect"
mode = "static"
target_static = "https://haumdaucher.de"
}
# 7. Flow Definition
resource "authentik_flow" "haumdaucher_invitation_flow" {
name = "Haumdaucher Invitation Flow"
slug = "haumdaucher-invitation-flow"
title = "Haumdaucher Registrierung"
designation = "enrollment"
}
# 8. Flow Stage Bindings (Execution Order)
resource "authentik_flow_stage_binding" "bind_haumdaucher_invitation" {
target = authentik_flow.haumdaucher_invitation_flow.uuid
stage = authentik_stage_invitation.haumdaucher_enrollment_invitation.id
order = 10
}
resource "authentik_flow_stage_binding" "bind_haumdaucher_prompt" {
target = authentik_flow.haumdaucher_invitation_flow.uuid
stage = authentik_stage_prompt.haumdaucher_enrollment_prompt.id
order = 20
}
resource "authentik_flow_stage_binding" "bind_haumdaucher_write" {
target = authentik_flow.haumdaucher_invitation_flow.uuid
stage = authentik_stage_user_write.haumdaucher_enrollment_write.id
order = 30
}
resource "authentik_flow_stage_binding" "bind_haumdaucher_login" {
target = authentik_flow.haumdaucher_invitation_flow.uuid
stage = authentik_stage_user_login.haumdaucher_enrollment_login.id
order = 40
}
resource "authentik_flow_stage_binding" "bind_haumdaucher_redirect" {
target = authentik_flow.haumdaucher_invitation_flow.uuid
stage = authentik_stage_redirect.haumdaucher_enrollment_redirect.id
order = 50
}
# --- ForwardAuth Proxy Providers & Applications ---
# 1. Zigbee2MQTT
resource "authentik_provider_proxy" "zigbee2mqtt" {
name = "Zigbee2MQTT"
external_host = "https://zigbee2mqtt.moritzgraf.de"
mode = "forward_single"
authorization_flow = data.authentik_flow.default_authorization_flow.id
invalidation_flow = data.authentik_flow.default_invalidation_flow.id
intercept_header_auth = true
}
resource "authentik_application" "zigbee2mqtt" {
name = "Zigbee2MQTT"
slug = "zigbee2mqtt"
protocol_provider = authentik_provider_proxy.zigbee2mqtt.id
}
# 2. Prometheus
resource "authentik_provider_proxy" "prometheus" {
name = "Prometheus"
external_host = "https://prometheus.haumdaucher.de"
mode = "forward_single"
authorization_flow = data.authentik_flow.default_authorization_flow.id
invalidation_flow = data.authentik_flow.default_invalidation_flow.id
intercept_header_auth = true
}
resource "authentik_application" "prometheus" {
name = "Prometheus"
slug = "prometheus"
protocol_provider = authentik_provider_proxy.prometheus.id
}
# 3. Alertmanager
resource "authentik_provider_proxy" "alertmanager" {
name = "Alertmanager"
external_host = "https://alertmanager.haumdaucher.de"
mode = "forward_single"
authorization_flow = data.authentik_flow.default_authorization_flow.id
invalidation_flow = data.authentik_flow.default_invalidation_flow.id
intercept_header_auth = true
}
resource "authentik_application" "alertmanager" {
name = "Alertmanager"
slug = "alertmanager"
protocol_provider = authentik_provider_proxy.alertmanager.id
}
# 4. Nextcloud phpMyAdmin
resource "authentik_provider_proxy" "nextcloud_phpmyadmin" {
name = "Nextcloud phpMyAdmin"
external_host = "https://nextcloud.phpmyadmin.haumdaucher.de"
mode = "forward_single"
authorization_flow = data.authentik_flow.default_authorization_flow.id
invalidation_flow = data.authentik_flow.default_invalidation_flow.id
intercept_header_auth = true
}
resource "authentik_application" "nextcloud_phpmyadmin" {
name = "Nextcloud phpMyAdmin"
slug = "nextcloud-phpmyadmin"
protocol_provider = authentik_provider_proxy.nextcloud_phpmyadmin.id
}
# 5. Gitea phpMyAdmin
resource "authentik_provider_proxy" "gitea_phpmyadmin" {
name = "Gitea phpMyAdmin"
external_host = "https://gitea.phpmyadmin.haumdaucher.de"
mode = "forward_single"
authorization_flow = data.authentik_flow.default_authorization_flow.id
invalidation_flow = data.authentik_flow.default_invalidation_flow.id
intercept_header_auth = true
}
resource "authentik_application" "gitea_phpmyadmin" {
name = "Gitea phpMyAdmin"
slug = "gitea-phpmyadmin"
protocol_provider = authentik_provider_proxy.gitea_phpmyadmin.id
}
# 6. Home Assistant VS Code
resource "authentik_provider_proxy" "hass_coder" {
name = "Home Assistant Code"
external_host = "https://hass-coder.moritzgraf.de"
mode = "forward_single"
authorization_flow = data.authentik_flow.default_authorization_flow.id
invalidation_flow = data.authentik_flow.default_invalidation_flow.id
intercept_header_auth = true
}
resource "authentik_application" "hass_coder" {
name = "Home Assistant Code"
slug = "hass-coder"
protocol_provider = authentik_provider_proxy.hass_coder.id
}
# 7. OpenClaw
resource "authentik_provider_proxy" "openclaw" {
name = "OpenClaw"
external_host = "https://openclaw.haumdaucher.de"
mode = "forward_single"
authorization_flow = data.authentik_flow.default_authorization_flow.id
invalidation_flow = data.authentik_flow.default_invalidation_flow.id
intercept_header_auth = true
}
resource "authentik_application" "openclaw" {
name = "OpenClaw"
slug = "openclaw"
protocol_provider = authentik_provider_proxy.openclaw.id
}
# 8. n8n
resource "authentik_provider_proxy" "n8n" {
name = "n8n"
external_host = "https://n8n.moritzgraf.de"
mode = "forward_single"
authorization_flow = data.authentik_flow.default_authorization_flow.id
invalidation_flow = data.authentik_flow.default_invalidation_flow.id
intercept_header_auth = true
}
resource "authentik_application" "n8n" {
name = "n8n"
slug = "n8n"
protocol_provider = authentik_provider_proxy.n8n.id
}
# --- Outpost: Embedded Proxy Outpost ---
resource "authentik_outpost" "embedded" {
name = "authentik Embedded Outpost"
type = "proxy"
protocol_providers = [
authentik_provider_proxy.zigbee2mqtt.id,
authentik_provider_proxy.prometheus.id,
authentik_provider_proxy.alertmanager.id,
authentik_provider_proxy.nextcloud_phpmyadmin.id,
authentik_provider_proxy.gitea_phpmyadmin.id,
authentik_provider_proxy.hass_coder.id,
authentik_provider_proxy.openclaw.id,
authentik_provider_proxy.n8n.id,
]
}
# --- Machine & AI Assistant: Service Account & API Token ---
resource "authentik_user" "ai_assistant" {
username = "ai-assistant"
name = "AI Assistant"
type = "service_account"
groups = [authentik_group.infra_admins.id]
}
resource "authentik_token" "ai_assistant_token" {
identifier = "ai-assistant-api-token"
user = authentik_user.ai_assistant.id
intent = "api"
expiring = false
retrieve_key = true
}
# --- Native OIDC Providers & Applications ---
# Scope Mappings
data "authentik_property_mapping_provider_scope" "openid" {
scope_name = "openid"
}
data "authentik_property_mapping_provider_scope" "email" {
scope_name = "email"
}
data "authentik_property_mapping_provider_scope" "profile" {
scope_name = "profile"
}
data "authentik_certificate_key_pair" "generated" {
name = "authentik Self-signed Certificate"
}
# 1. Gitea
resource "random_password" "gitea_oauth_client_secret" {
length = 40
special = false
}
resource "authentik_provider_oauth2" "gitea" {
name = "Gitea"
client_id = "gitea"
client_secret = random_password.gitea_oauth_client_secret.result
client_type = "confidential"
authorization_flow = data.authentik_flow.default_authorization_flow.id
invalidation_flow = data.authentik_flow.default_invalidation_flow.id
signing_key = data.authentik_certificate_key_pair.generated.id
grant_types = ["authorization_code", "refresh_token"]
allowed_redirect_uris = [
{
matching_mode = "strict"
url = "https://git.moritzgraf.de/user/oauth2/authentik/callback"
},
{
matching_mode = "strict"
url = "https://git.moritzgraf.de/user/oauth2/Authentik/callback"
}
]
sub_mode = "user_username"
include_claims_in_id_token = true
property_mappings = [
data.authentik_property_mapping_provider_scope.openid.id,
data.authentik_property_mapping_provider_scope.email.id,
data.authentik_property_mapping_provider_scope.profile.id,
]
}
resource "authentik_application" "gitea" {
name = "Gitea"
slug = "gitea"
protocol_provider = authentik_provider_oauth2.gitea.id
}
output "gitea_oauth_client_secret" {
description = "OAuth2 Client Secret for Gitea OIDC provider"
value = random_password.gitea_oauth_client_secret.result
sensitive = true
}
# 2. Grafana
resource "random_password" "grafana_oauth_client_secret" {
length = 40
special = false
}
resource "authentik_provider_oauth2" "grafana" {
name = "Grafana"
client_id = "grafana"
client_secret = random_password.grafana_oauth_client_secret.result
client_type = "confidential"
authorization_flow = data.authentik_flow.default_authorization_flow.id
invalidation_flow = data.authentik_flow.default_invalidation_flow.id
signing_key = data.authentik_certificate_key_pair.generated.id
grant_types = ["authorization_code", "refresh_token"]
allowed_redirect_uris = [
{
matching_mode = "strict"
url = "https://grafana.haumdaucher.de/login/generic_oauth"
}
]
sub_mode = "user_username"
include_claims_in_id_token = true
property_mappings = [
data.authentik_property_mapping_provider_scope.openid.id,
data.authentik_property_mapping_provider_scope.email.id,
data.authentik_property_mapping_provider_scope.profile.id,
]
}
resource "authentik_application" "grafana" {
name = "Grafana"
slug = "grafana"
protocol_provider = authentik_provider_oauth2.grafana.id
}
output "grafana_oauth_client_secret" {
description = "OAuth2 Client Secret for Grafana OIDC provider"
value = random_password.grafana_oauth_client_secret.result
sensitive = true
}
# 3. Coder v2
resource "random_password" "coder_oauth_client_secret" {
length = 40
special = false
}
resource "authentik_provider_oauth2" "coder" {
name = "Coder"
client_id = "coder"
client_secret = random_password.coder_oauth_client_secret.result
client_type = "confidential"
authorization_flow = data.authentik_flow.default_authorization_flow.id
invalidation_flow = data.authentik_flow.default_invalidation_flow.id
signing_key = data.authentik_certificate_key_pair.generated.id
grant_types = ["authorization_code", "refresh_token"]
allowed_redirect_uris = [
{
matching_mode = "strict"
url = "https://coder.moritzgraf.de/api/v2/users/oidc/callback"
}
]
sub_mode = "user_username"
include_claims_in_id_token = true
property_mappings = [
data.authentik_property_mapping_provider_scope.openid.id,
data.authentik_property_mapping_provider_scope.email.id,
data.authentik_property_mapping_provider_scope.profile.id,
]
}
resource "authentik_application" "coder" {
name = "Coder"
slug = "coder"
protocol_provider = authentik_provider_oauth2.coder.id
}
output "coder_oauth_client_secret" {
description = "OAuth2 Client Secret for Coder OIDC provider"
value = random_password.coder_oauth_client_secret.result
sensitive = true
}
# 4. MinIO Console
resource "authentik_property_mapping_provider_scope" "minio_policy" {
name = "minio-policy"
scope_name = "policy"
expression = <<EOF
if "infra-admins" in [group.name for group in request.user.groups.all()]:
return {"policy": "consoleAdmin"}
return {"policy": "readonly"}
EOF
}
resource "random_password" "minio_oauth_client_secret" {
length = 40
special = false
}
resource "authentik_provider_oauth2" "minio" {
name = "MinIO"
client_id = "minio"
client_secret = random_password.minio_oauth_client_secret.result
client_type = "confidential"
authorization_flow = data.authentik_flow.default_authorization_flow.id
invalidation_flow = data.authentik_flow.default_invalidation_flow.id
signing_key = data.authentik_certificate_key_pair.generated.id
grant_types = ["authorization_code", "refresh_token"]
allowed_redirect_uris = [
{
matching_mode = "strict"
url = "https://minio-console.haumdaucher.de/oauth_callback"
}
]
sub_mode = "user_username"
include_claims_in_id_token = true
property_mappings = [
data.authentik_property_mapping_provider_scope.openid.id,
data.authentik_property_mapping_provider_scope.email.id,
data.authentik_property_mapping_provider_scope.profile.id,
authentik_property_mapping_provider_scope.minio_policy.id,
]
}
resource "authentik_application" "minio" {
name = "MinIO"
slug = "minio"
protocol_provider = authentik_provider_oauth2.minio.id
}
output "minio_oauth_client_secret" {
description = "OAuth2 Client Secret for MinIO OIDC provider"
value = random_password.minio_oauth_client_secret.result
sensitive = true
}
# 5. Nextcloud
resource "random_password" "nextcloud_oauth_client_secret" {
length = 40
special = false
}
resource "authentik_provider_oauth2" "nextcloud" {
name = "Nextcloud"
client_id = "nextcloud"
client_secret = random_password.nextcloud_oauth_client_secret.result
client_type = "confidential"
authorization_flow = data.authentik_flow.default_authorization_flow.id
invalidation_flow = data.authentik_flow.default_invalidation_flow.id
signing_key = data.authentik_certificate_key_pair.generated.id
grant_types = ["authorization_code", "refresh_token"]
allowed_redirect_uris = [
{
matching_mode = "strict"
url = "https://cloud.haumdaucher.de/apps/user_oidc/code"
}
]
sub_mode = "user_username"
include_claims_in_id_token = true
property_mappings = [
data.authentik_property_mapping_provider_scope.openid.id,
data.authentik_property_mapping_provider_scope.email.id,
data.authentik_property_mapping_provider_scope.profile.id,
]
}
resource "authentik_application" "nextcloud" {
name = "Nextcloud"
slug = "nextcloud"
protocol_provider = authentik_provider_oauth2.nextcloud.id
}
output "nextcloud_oauth_client_secret" {
description = "OAuth2 Client Secret for Nextcloud OIDC provider"
value = random_password.nextcloud_oauth_client_secret.result
sensitive = true
}
# 6. Home Assistant
resource "random_password" "homeassistant_oauth_client_secret" {
length = 40
special = false
}
resource "authentik_provider_oauth2" "homeassistant" {
name = "Home Assistant"
client_id = "homeassistant"
client_secret = random_password.homeassistant_oauth_client_secret.result
client_type = "confidential"
authorization_flow = data.authentik_flow.default_authorization_flow.id
invalidation_flow = data.authentik_flow.default_invalidation_flow.id
signing_key = data.authentik_certificate_key_pair.generated.id
grant_types = ["authorization_code", "refresh_token"]
allowed_redirect_uris = [
{
matching_mode = "strict"
url = "https://hass.moritzgraf.de/auth/oidc/callback"
},
{
matching_mode = "strict"
url = "https://hass.moritzgraf.de/auth/external/callback"
}
]
sub_mode = "user_username"
include_claims_in_id_token = true
property_mappings = [
data.authentik_property_mapping_provider_scope.openid.id,
data.authentik_property_mapping_provider_scope.email.id,
data.authentik_property_mapping_provider_scope.profile.id,
]
}
resource "authentik_application" "homeassistant" {
name = "Home Assistant"
slug = "homeassistant"
protocol_provider = authentik_provider_oauth2.homeassistant.id
}
output "homeassistant_oauth_client_secret" {
description = "OAuth2 Client Secret for Home Assistant OIDC provider"
value = random_password.homeassistant_oauth_client_secret.result
sensitive = true
}
# --- Application Policy Bindings (Access Control & RBAC) ---
# 1. Admin-Only Applications (Strictly restricted to infra-admins)
resource "authentik_policy_binding" "openclaw_admin_only" {
target = authentik_application.openclaw.uuid
group = authentik_group.infra_admins.id
order = 0
}
resource "authentik_policy_binding" "zigbee2mqtt_admin_only" {
target = authentik_application.zigbee2mqtt.uuid
group = authentik_group.infra_admins.id
order = 0
}
resource "authentik_policy_binding" "prometheus_admin_only" {
target = authentik_application.prometheus.uuid
group = authentik_group.infra_admins.id
order = 0
}
resource "authentik_policy_binding" "alertmanager_admin_only" {
target = authentik_application.alertmanager.uuid
group = authentik_group.infra_admins.id
order = 0
}
resource "authentik_policy_binding" "nextcloud_phpmyadmin_admin_only" {
target = authentik_application.nextcloud_phpmyadmin.uuid
group = authentik_group.infra_admins.id
order = 0
}
resource "authentik_policy_binding" "gitea_phpmyadmin_admin_only" {
target = authentik_application.gitea_phpmyadmin.uuid
group = authentik_group.infra_admins.id
order = 0
}
resource "authentik_policy_binding" "hass_coder_admin_only" {
target = authentik_application.hass_coder.uuid
group = authentik_group.infra_admins.id
order = 0
}
resource "authentik_policy_binding" "n8n_admin_only" {
target = authentik_application.n8n.uuid
group = authentik_group.infra_admins.id
order = 0
}
resource "authentik_policy_binding" "coder_admin_only" {
target = authentik_application.coder.uuid
group = authentik_group.infra_admins.id
order = 0
}
resource "authentik_policy_binding" "minio_admin_only" {
target = authentik_application.minio.uuid
group = authentik_group.infra_admins.id
order = 0
}
# 2. Shared & Member Applications (Accessible to all authenticated users)
resource "authentik_policy_binding" "grafana_users" {
target = authentik_application.grafana.uuid
group = authentik_group.users.id
order = 0
}
resource "authentik_policy_binding" "nextcloud_users" {
target = authentik_application.nextcloud.uuid
group = authentik_group.users.id
order = 0
}
resource "authentik_policy_binding" "gitea_users" {
target = authentik_application.gitea.uuid
group = authentik_group.users.id
order = 0
}
resource "authentik_policy_binding" "homeassistant_users" {
target = authentik_application.homeassistant.uuid
group = authentik_group.users.id
order = 0
}
+40 -40
View File
@@ -2,10 +2,10 @@
resource "ovh_domain_zone_record" "haumdaucher_mx_record" {
zone = "haumdaucher.de"
fieldtype = "MX"
ttl = 60
target = "1 SMTP.GOOGLE.COM."
zone = "haumdaucher.de"
fieldtype = "MX"
ttl = 60
target = "1 SMTP.GOOGLE.COM."
}
resource "ovh_domain_zone_record" "spf_haumdaucher_de" {
@@ -36,18 +36,18 @@ resource "ovh_domain_zone_record" "dkim_google_haumdaucher_de" {
resource "ovh_domain_zone_record" "mx_record_moritzgraf_de" {
zone = "moritzgraf.de"
fieldtype = "MX"
ttl = 60
target = "1 SMTP.GOOGLE.COM."
zone = "moritzgraf.de"
fieldtype = "MX"
ttl = 60
target = "1 SMTP.GOOGLE.COM."
}
resource "ovh_domain_zone_record" "google_domain_verification_moritzgraf_de" {
zone = "moritzgraf.de"
fieldtype = "TXT"
ttl = 60
target = "google-site-verification=YwUd-Bmbq1-lA7uYGcowsLEMczqx1odndFZq_Nk3nvM"
zone = "moritzgraf.de"
fieldtype = "TXT"
ttl = 60
target = "google-site-verification=YwUd-Bmbq1-lA7uYGcowsLEMczqx1odndFZq_Nk3nvM"
}
resource "ovh_domain_zone_record" "spf_moritzgraf_de" {
@@ -79,17 +79,17 @@ resource "ovh_domain_zone_record" "dkim_google_moritzgraf_de" {
resource "ovh_domain_zone_record" "mx_record_ameliegraf_de" {
zone = "ameliegraf.de"
zone = "ameliegraf.de"
fieldtype = "MX"
ttl = 60
target = "1 smtp.google.com."
ttl = 60
target = "1 smtp.google.com."
}
resource "ovh_domain_zone_record" "google_domain_verification_ameliegraf_de" {
zone = "ameliegraf.de"
fieldtype = "TXT"
ttl = 60
target = "google-site-verification=LwCbVqOp4c200QYrEEX1m4lIebOzxl5eBb2IkHbrSVA"
zone = "ameliegraf.de"
fieldtype = "TXT"
ttl = 60
target = "google-site-verification=LwCbVqOp4c200QYrEEX1m4lIebOzxl5eBb2IkHbrSVA"
}
resource "ovh_domain_zone_record" "spf_ameliegraf_de" {
@@ -121,17 +121,17 @@ resource "ovh_domain_zone_record" "dkim_google_ameliegraf_de" {
resource "ovh_domain_zone_record" "mx_record_graf_fam_de" {
zone = "graf-fam.de"
zone = "graf-fam.de"
fieldtype = "MX"
ttl = 60
target = "1 smtp.google.com."
ttl = 60
target = "1 smtp.google.com."
}
resource "ovh_domain_zone_record" "google_domain_verification_graf_fam_de" {
zone = "graf-fam.de"
fieldtype = "TXT"
ttl = 60
target = "google-site-verification=DcG0tKp5YXxCRvw_Ekxa-3gbzdkZvxXUVkPs8aq9yQ4"
zone = "graf-fam.de"
fieldtype = "TXT"
ttl = 60
target = "google-site-verification=DcG0tKp5YXxCRvw_Ekxa-3gbzdkZvxXUVkPs8aq9yQ4"
}
resource "ovh_domain_zone_record" "spf_graf_fam_de" {
@@ -163,17 +163,17 @@ resource "ovh_domain_zone_record" "dkim_google_graf_fam_de" {
resource "ovh_domain_zone_record" "mx_record_krassescheisse_de" {
zone = "krassescheisse.de"
zone = "krassescheisse.de"
fieldtype = "MX"
ttl = 60
target = "1 smtp.google.com."
ttl = 60
target = "1 smtp.google.com."
}
resource "ovh_domain_zone_record" "google_domain_verification_krassescheisse_de" {
zone = "krassescheisse.de"
fieldtype = "TXT"
ttl = 60
target = "google-site-verification=SHFDcMegmOoh9syhj7_xBH9dLQxA2NMnh_zvg4Ma0CM"
zone = "krassescheisse.de"
fieldtype = "TXT"
ttl = 60
target = "google-site-verification=SHFDcMegmOoh9syhj7_xBH9dLQxA2NMnh_zvg4Ma0CM"
}
resource "ovh_domain_zone_record" "spf_krassescheisse_de" {
@@ -204,17 +204,17 @@ resource "ovh_domain_zone_record" "dkim_google_krassescheisse_de" {
resource "ovh_domain_zone_record" "mx_record_grabengasse7_de" {
zone = "grabengasse7.de"
zone = "grabengasse7.de"
fieldtype = "MX"
ttl = 60
target = "1 smtp.google.com."
ttl = 60
target = "1 smtp.google.com."
}
resource "ovh_domain_zone_record" "google_domain_verification_grabengasse7_de" {
zone = "grabengasse7.de"
fieldtype = "TXT"
ttl = 60
target = "google-site-verification=zwmmYhET0gyCJr_An22btaOVcpsE_nR2b1St0y4jn1A"
zone = "grabengasse7.de"
fieldtype = "TXT"
ttl = 60
target = "google-site-verification=zwmmYhET0gyCJr_An22btaOVcpsE_nR2b1St0y4jn1A"
}
resource "ovh_domain_zone_record" "spf_grabengasse7_de" {
+514
View File
@@ -0,0 +1,514 @@
/* ==========================================================================
HAUMDAUCHER THEME FOR AUTHENTIK
Wurst und Spezialitäten n.e.V.
========================================================================== */
@import url('https://fonts.googleapis.com/css2?family=Outfit:wght@300;400;500;600;700;800;900&display=swap');
/* --- Global Brand Font (Safe for all pages) --- */
:root {
--hd-font: 'Outfit', -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif;
--pf-global--FontFamily--sans-serif: var(--hd-font);
--pf-v5-global--FontFamily--sans-serif: var(--hd-font);
}
/* ==========================================================================
AUTHENTICATED INTERFACE POLISH (User Dashboard & Admin Console)
Ensure brand logo is well proportioned and high-contrast in masthead
========================================================================== */
ak-interface-user .pf-c-brand img,
ak-interface-admin .pf-c-brand img,
.pf-c-page__header-brand img,
.pf-v5-c-page__header-brand img {
max-height: 38px !important;
width: auto !important;
}
[data-theme='dark'] ak-interface-user .pf-c-brand img,
[data-theme='dark'] ak-interface-admin .pf-c-brand img,
[data-theme='dark'] .pf-c-page__header-brand img,
[data-theme='dark'] .pf-v5-c-page__header-brand img {
filter: invert(1) hue-rotate(180deg);
}
/* ==========================================================================
LOGIN & AUTHENTICATION FLOW SCOPE
All custom card styling, colors, and layout rules are strictly scoped
to ak-flow-executor and .pf-c-login to avoid leaking into the dashboard!
========================================================================== */
/* --- Flow Executor Variables & Overrides --- */
ak-flow-executor,
.pf-c-login,
.pf-v5-c-login,
ak-stage,
.ak-stage {
--hd-bg: #f4f5f8;
--hd-card-bg: #ffffff;
--hd-card-border: rgba(0, 0, 0, 0.08);
--hd-text-main: #111111;
--hd-text-muted: #555555;
--hd-input-bg: #f9f9fb;
--hd-input-border: #d0d5dd;
--hd-btn-bg: #000000;
--hd-btn-text: #ffffff;
--hd-radius: 12px;
--hd-card-radius: 22px;
--hd-transition: all 0.2s ease-in-out;
/* Force PatternFly flow text & inputs to crisp black on the white card */
--pf-global--FontFamily--sans-serif: var(--hd-font) !important;
--pf-v5-global--FontFamily--sans-serif: var(--hd-font) !important;
--pf-global--Color--100: #111111 !important;
--pf-v5-global--Color--100: #111111 !important;
--pf-global--Color--200: #222222 !important;
--pf-v5-global--Color--200: #222222 !important;
--pf-global--Color--300: #444444 !important;
--pf-v5-global--Color--300: #444444 !important;
--pf-global--Color--dark-100: #111111 !important;
--pf-v5-global--Color--dark-100: #111111 !important;
--pf-global--Color--light-100: #111111 !important;
--pf-v5-global--Color--light-100: #111111 !important;
--pf-global--primary-color--100: #000000 !important;
--pf-v5-global--primary-color--100: #000000 !important;
/* Form & Label Variables */
--pf-c-form__label--Color: #111111 !important;
--pf-v5-c-form__label--Color: #111111 !important;
--pf-c-form__label-text--Color: #111111 !important;
--pf-v5-c-form__label-text--Color: #111111 !important;
--pf-c-form-control--Color: #111111 !important;
--pf-v5-c-form-control--Color: #111111 !important;
--pf-c-form-control--placeholder--Color: #666666 !important;
--pf-v5-c-form-control--placeholder--Color: #666666 !important;
--pf-c-form-control--BackgroundColor: #f9f9fb !important;
--pf-v5-c-form-control--BackgroundColor: #f9f9fb !important;
--pf-c-form-control--BorderColor: #d0d5dd !important;
--pf-v5-c-form-control--BorderColor: #d0d5dd !important;
--pf-c-form__helper-text--Color: #555555 !important;
--pf-v5-c-form__helper-text--Color: #555555 !important;
}
/* --- Flow Executor Viewport Centering & Background --- */
ak-flow-executor,
.pf-c-login,
.pf-v5-c-login {
min-height: 100vh !important;
min-height: 100dvh !important;
display: flex !important;
flex-direction: column !important;
align-items: center !important;
justify-content: center !important;
background-color: #f4f5f8 !important;
background-image: radial-gradient(circle at 50% 15%, rgba(0, 0, 0, 0.03) 0%, transparent 60%) !important;
background-attachment: fixed !important;
background-size: cover !important;
padding: 32px 16px 48px 16px !important;
box-sizing: border-box !important;
position: relative !important;
font-family: var(--hd-font) !important;
color: #111111 !important;
}
/* --- Centered Login Container --- */
ak-flow-executor .pf-c-login__container,
.pf-c-login .pf-c-login__container,
.pf-v5-c-login .pf-v5-c-login__container {
display: flex !important;
flex-direction: column !important;
align-items: center !important;
justify-content: center !important;
width: 100% !important;
max-width: 420px !important;
margin: auto !important;
padding: 0 !important;
box-sizing: border-box !important;
}
/* --- Top Header & Logo Layout --- */
ak-flow-executor .pf-c-login__header,
.pf-c-login .pf-c-login__header,
.pf-v5-c-login .pf-v5-c-login__header {
display: flex !important;
justify-content: center !important;
align-items: center !important;
width: 100% !important;
margin-top: 0 !important;
margin-bottom: 24px !important;
padding: 0 !important;
}
ak-flow-executor .pf-c-login__header ak-brand,
ak-flow-executor .pf-c-login__header img,
.pf-c-login .pf-c-login__header ak-brand,
.pf-c-login .pf-c-login__header img,
.pf-v5-c-login .pf-v5-c-login__header ak-brand,
.pf-v5-c-login .pf-v5-c-login__header img {
display: block !important;
max-height: 85px !important;
max-width: 240px !important;
width: auto !important;
margin: 0 auto !important;
mix-blend-mode: multiply !important;
filter: drop-shadow(0 2px 8px rgba(0, 0, 0, 0.08)) !important;
transition: all 0.2s ease-in-out;
}
/* --- Classic White Card --- */
ak-flow-executor .pf-c-login__main,
.pf-c-login .pf-c-login__main,
.pf-v5-c-login .pf-v5-c-login__main,
ak-flow-executor ak-stage,
ak-flow-executor .ak-stage {
background: #ffffff !important;
border: 1px solid rgba(0, 0, 0, 0.08) !important;
border-radius: 22px !important;
box-shadow: 0 16px 48px rgba(0, 0, 0, 0.06), 0 1px 3px rgba(0, 0, 0, 0.04) !important;
padding: 36px 32px 32px 32px !important;
width: 100% !important;
box-sizing: border-box !important;
color: #111111 !important;
}
/* --- Fully Hide Duplicate / Generic Flow Title --- */
ak-flow-executor .pf-c-login__main-header-title,
ak-flow-executor .pf-v5-c-login__main-header-title,
ak-flow-executor .pf-c-title,
ak-flow-executor .pf-v5-c-title,
.pf-c-login .pf-c-login__main-header-title,
.pf-v5-c-login .pf-v5-c-login__main-header-title {
display: none !important;
}
ak-flow-executor .pf-c-login__main-header,
.pf-c-login .pf-c-login__main-header,
.pf-v5-c-login .pf-v5-c-login__main-header {
margin-bottom: 24px !important;
padding: 0 !important;
text-align: center !important;
}
ak-flow-executor .pf-c-login__main-header-desc,
.pf-c-login .pf-c-login__main-header-desc,
.pf-v5-c-login .pf-v5-c-login__main-header-desc {
font-family: var(--hd-font) !important;
font-size: 0.95rem !important;
line-height: 1.5 !important;
margin: 0 !important;
color: #555555 !important;
text-align: center !important;
}
ak-flow-executor .pf-c-login__main-header-desc strong,
ak-flow-executor .pf-c-login__main-header-desc b,
.pf-c-login .pf-c-login__main-header-desc strong,
.pf-c-login .pf-c-login__main-header-desc b,
.pf-v5-c-login .pf-v5-c-login__main-header-desc strong,
.pf-v5-c-login .pf-v5-c-login__main-header-desc b {
color: #111111 !important;
font-weight: 700 !important;
}
/* --- Form Field Groups --- */
ak-flow-executor .pf-c-form__group,
.pf-c-login .pf-c-form__group,
.pf-v5-c-login .pf-v5-c-form__group {
margin-bottom: 20px !important;
}
/* --- LABELS & LABEL TEXT (High-Contrast Black inside login flow) --- */
ak-flow-executor .pf-c-form__label,
ak-flow-executor .pf-v5-c-form__label,
ak-flow-executor .pf-c-form__label-text,
ak-flow-executor .pf-v5-c-form__label-text,
ak-flow-executor .pf-c-form__group-label,
ak-flow-executor .pf-v5-c-form__group-label,
ak-flow-executor label,
ak-flow-executor label *,
.pf-c-login .pf-c-form__label,
.pf-c-login .pf-v5-c-form__label,
.pf-c-login .pf-c-form__label-text,
.pf-c-login .pf-v5-c-form__label-text,
.pf-c-login label,
.pf-c-login label *,
.pf-v5-c-login label,
.pf-v5-c-login label * {
font-family: var(--hd-font) !important;
font-weight: 600 !important;
font-size: 0.9rem !important;
color: #111111 !important;
margin-bottom: 6px !important;
display: inline-block !important;
opacity: 1 !important;
}
/* Required Asterisk */
ak-flow-executor .pf-c-form__label-required,
ak-flow-executor .pf-v5-c-form__label-required,
.pf-c-login .pf-c-form__label-required,
.pf-v5-c-login .pf-v5-c-form__label-required {
color: #c9190b !important;
margin-left: 4px !important;
font-weight: 700 !important;
}
/* --- INPUT FIELDS & TEXT (inside login flow) --- */
ak-flow-executor .pf-c-form-control,
ak-flow-executor .pf-v5-c-form-control,
ak-flow-executor input[type="text"],
ak-flow-executor input[type="password"],
ak-flow-executor input[type="email"],
ak-flow-executor input,
.pf-c-login .pf-c-form-control,
.pf-c-login .pf-v5-c-form-control,
.pf-c-login input,
.pf-v5-c-login input {
font-family: var(--hd-font) !important;
font-size: 0.98rem !important;
border-radius: 12px !important;
padding: 12px 14px !important;
background-color: #f9f9fb !important;
border: 1px solid #d0d5dd !important;
color: #111111 !important;
transition: all 0.2s ease-in-out !important;
width: 100% !important;
box-sizing: border-box !important;
}
/* Input Placeholder */
ak-flow-executor input::placeholder,
.pf-c-login input::placeholder,
.pf-v5-c-login input::placeholder {
color: #666666 !important;
font-style: normal !important;
opacity: 1 !important;
}
/* Focus State */
ak-flow-executor input:focus,
.pf-c-login input:focus,
.pf-v5-c-login input:focus {
outline: none !important;
border-color: #000000 !important;
box-shadow: 0 0 0 3px rgba(0, 0, 0, 0.12) !important;
background-color: #ffffff !important;
color: #111111 !important;
}
/* Browser Autofill Fix (Prevent White on White) */
ak-flow-executor input:-webkit-autofill,
ak-flow-executor input:-webkit-autofill:hover,
ak-flow-executor input:-webkit-autofill:focus,
.pf-c-login input:-webkit-autofill,
.pf-v5-c-login input:-webkit-autofill {
-webkit-text-fill-color: #111111 !important;
-webkit-box-shadow: 0 0 0 1000px #f9f9fb inset !important;
box-shadow: 0 0 0 1000px #f9f9fb inset !important;
transition: background-color 5000s ease-in-out 0s !important;
}
/* --- Solid Black Submit Button (inside login flow) --- */
ak-flow-executor button[type="submit"],
ak-flow-executor .pf-c-button.pf-m-primary,
ak-flow-executor .pf-v5-c-button.pf-m-primary,
.pf-c-login button[type="submit"],
.pf-c-login .pf-c-button.pf-m-primary,
.pf-v5-c-login button[type="submit"],
.pf-v5-c-login .pf-v5-c-button.pf-m-primary {
font-family: var(--hd-font) !important;
font-size: 1rem !important;
font-weight: 700 !important;
letter-spacing: 0.3px !important;
border-radius: 12px !important;
padding: 13px 20px !important;
border: none !important;
cursor: pointer !important;
background: #000000 !important;
color: #ffffff !important;
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15) !important;
transition: all 0.2s ease-in-out !important;
width: 100% !important;
margin-top: 16px !important;
margin-bottom: 4px !important;
display: flex !important;
align-items: center !important;
justify-content: center !important;
}
ak-flow-executor button[type="submit"]:hover,
.pf-c-login button[type="submit"]:hover,
.pf-v5-c-login button[type="submit"]:hover {
background: #222222 !important;
color: #ffffff !important;
transform: translateY(-1px) !important;
box-shadow: 0 6px 16px rgba(0, 0, 0, 0.2) !important;
}
ak-flow-executor button[type="submit"]:active,
.pf-c-login button[type="submit"]:active,
.pf-v5-c-login button[type="submit"]:active {
transform: translateY(0) !important;
}
/* Secondary Buttons (inside login flow) */
ak-flow-executor .pf-c-button.pf-m-secondary,
ak-flow-executor .pf-v5-c-button.pf-m-secondary,
.pf-c-login .pf-c-button.pf-m-secondary,
.pf-v5-c-login .pf-v5-c-button.pf-m-secondary {
font-family: var(--hd-font) !important;
font-weight: 600 !important;
border-radius: 12px !important;
padding: 11px 18px !important;
border: 1px solid #d0d5dd !important;
background: #ffffff !important;
color: #111111 !important;
transition: all 0.2s ease-in-out !important;
}
ak-flow-executor .pf-c-button.pf-m-secondary:hover,
.pf-c-login .pf-c-button.pf-m-secondary:hover,
.pf-v5-c-login .pf-v5-c-button.pf-m-secondary:hover {
background: #f4f5f7 !important;
border-color: #000000 !important;
}
/* --- Alerts & Messages (inside login flow) --- */
ak-flow-executor .pf-c-alert,
ak-flow-executor .pf-v5-c-alert,
.pf-c-login .pf-c-alert,
.pf-v5-c-login .pf-v5-c-alert {
border-radius: 12px !important;
margin-bottom: 16px !important;
}
/* --- LANGUAGE BUTTON AT BOTTOM (inside login flow only) --- */
ak-flow-executor ak-locale-select,
ak-flow-executor [part="locale-select"],
ak-flow-executor::part(locale-select),
.pf-c-login ak-locale-select,
.pf-v5-c-login ak-locale-select {
position: fixed !important;
inset-block-start: auto !important;
inset-inline-start: auto !important;
top: auto !important;
left: auto !important;
bottom: 14px !important;
right: 18px !important;
z-index: 999 !important;
opacity: 0.65 !important;
transition: opacity 0.2s ease, transform 0.2s ease !important;
}
ak-flow-executor ak-locale-select:hover,
.pf-c-login ak-locale-select:hover {
opacity: 1 !important;
transform: translateY(-1px) !important;
}
ak-flow-executor ak-locale-select select,
.pf-c-login ak-locale-select select {
color: #111111 !important;
background: transparent !important;
cursor: pointer !important;
}
ak-flow-executor ak-locale-select label,
.pf-c-login ak-locale-select label {
color: #111111 !important;
cursor: pointer !important;
}
/* --- Footer & Copyright (inside login flow) --- */
ak-flow-executor ak-brand-links,
ak-flow-executor .pf-c-login__footer,
ak-flow-executor .pf-v5-c-login__footer,
.pf-c-login .pf-c-login__footer,
.pf-v5-c-login .pf-v5-c-login__footer {
margin-top: 24px !important;
margin-bottom: 0 !important;
text-align: center !important;
font-size: 0.82rem !important;
color: #555555 !important;
}
ak-flow-executor ak-brand-links a,
ak-flow-executor .pf-c-login__footer a,
.pf-c-login .pf-c-login__footer a,
.pf-v5-c-login .pf-v5-c-login__footer a {
color: #111111 !important;
text-decoration: none !important;
font-weight: 600 !important;
}
ak-flow-executor ak-brand-links a:hover,
ak-flow-executor .pf-c-login__footer a:hover,
.pf-c-login .pf-c-login__footer a:hover,
.pf-v5-c-login .pf-v5-c-login__footer a:hover {
text-decoration: underline !important;
}
/* --- Watermark (inside login flow container) --- */
ak-flow-executor .pf-c-login__container::after,
.pf-c-login .pf-c-login__container::after,
.pf-v5-c-login .pf-v5-c-login__container::after {
content: "HAUMDAUCHER • Wurst und Spezialitäten n.e.V.";
display: block;
margin-top: 28px;
margin-bottom: 12px;
font-size: 0.76rem;
letter-spacing: 1.5px;
text-transform: uppercase;
font-weight: 600;
color: #888888;
text-align: center;
}
/* --- Mobile Responsiveness (inside login flow) --- */
@media (max-width: 480px) {
ak-flow-executor,
.pf-c-login,
.pf-v5-c-login {
padding: 24px 12px 48px 12px !important;
}
ak-flow-executor .pf-c-login__container,
.pf-c-login .pf-c-login__container,
.pf-v5-c-login .pf-v5-c-login__container {
padding: 0 !important;
}
ak-flow-executor .pf-c-login__header,
.pf-c-login .pf-c-login__header,
.pf-v5-c-login .pf-v5-c-login__header {
margin-bottom: 18px !important;
}
ak-flow-executor .pf-c-login__main,
.pf-c-login .pf-c-login__main,
.pf-v5-c-login .pf-v5-c-login__main,
ak-flow-executor ak-stage,
ak-flow-executor .ak-stage {
padding: 28px 20px 24px 20px !important;
border-radius: 18px !important;
}
ak-flow-executor .pf-c-login__header img,
.pf-c-login .pf-c-login__header img,
.pf-v5-c-login .pf-v5-c-login__header img {
max-height: 72px !important;
}
ak-flow-executor .pf-c-login__container::after,
.pf-c-login .pf-c-login__container::after,
.pf-v5-c-login .pf-v5-c-login__container::after {
margin-top: 20px;
margin-bottom: 8px;
}
ak-flow-executor ak-locale-select,
.pf-c-login ak-locale-select,
.pf-v5-c-login ak-locale-select {
bottom: 10px !important;
right: 12px !important;
}
}
+100 -80
View File
@@ -6,7 +6,7 @@ provider "ovh" {
}
locals {
ttl = "60"
ttl = "60"
}
## old moritzgrafde
@@ -15,65 +15,65 @@ locals {
## => 91.121.64.43
variable "subdomains_moritzgraf" {
default = ["auth","prometheus","alertmanager","chat","mqtt", "cloud",
"monitoring","smtp","pop3","imap","jaeger","ldap","code","hub",
"grafana","phpmyadmin","webapp","kc","phppgadmin","www","rstudio","code" ]
default = ["auth", "prometheus", "alertmanager", "chat", "mqtt", "cloud",
"monitoring", "smtp", "pop3", "imap", "jaeger", "ldap", "code", "hub",
"grafana", "phpmyadmin", "webapp", "kc", "phppgadmin", "www", "rstudio", "code"]
}
resource "ovh_domain_zone_record" "moritzgraf_subdomains" {
for_each = toset( var.subdomains_moritzgraf )
zone = "moritzgraf.de"
subdomain = each.key
fieldtype = "CNAME"
ttl = local.ttl
target = "moritzgraf.de."
for_each = toset(var.subdomains_moritzgraf)
zone = "moritzgraf.de"
subdomain = each.key
fieldtype = "CNAME"
ttl = local.ttl
target = "moritzgraf.de."
}
## new haumdaucher k8s
variable "subdomains_moritzgraf_k8s" {
default = ["corona","corona-api","tt-rss","git" ]
default = ["corona", "corona-api", "tt-rss", "git"]
}
resource "ovh_domain_zone_record" "moritzgraf_subdomains_k8s" {
for_each = toset( var.subdomains_moritzgraf_k8s )
zone = "moritzgraf.de"
subdomain = each.key
fieldtype = "CNAME"
ttl = local.ttl
target = "haumdaucher.de."
for_each = toset(var.subdomains_moritzgraf_k8s)
zone = "moritzgraf.de"
subdomain = each.key
fieldtype = "CNAME"
ttl = local.ttl
target = "haumdaucher.de."
}
# Kochen
resource "ovh_domain_zone_record" "kochen_haumdaucher" {
zone = "haumdaucher.de"
subdomain = "kochen"
fieldtype = "CNAME"
ttl = local.ttl
target = "haumdaucher-datalab.github.io."
zone = "haumdaucher.de"
subdomain = "kochen"
fieldtype = "CNAME"
ttl = local.ttl
target = "haumdaucher-datalab.github.io."
}
## nodes
resource "ovh_domain_zone_record" "one" {
zone = "haumdaucher.de"
subdomain = "one"
fieldtype = "A"
ttl = local.ttl
#target = "91.121.84.190"
target = "136.243.23.215"
zone = "haumdaucher.de"
subdomain = "one"
fieldtype = "A"
ttl = local.ttl
#target = "91.121.84.190"
target = "136.243.23.215"
}
## krassescheisse
resource "ovh_domain_zone_record" "krassescheisse_subdomains" {
for_each = toset( var.subdomains_moritzgraf )
zone = "krassescheisse.de"
subdomain = each.key
fieldtype = "CNAME"
ttl = local.ttl
target = "krassescheisse.de."
for_each = toset(var.subdomains_moritzgraf)
zone = "krassescheisse.de"
subdomain = each.key
fieldtype = "CNAME"
ttl = local.ttl
target = "krassescheisse.de."
}
@@ -92,36 +92,36 @@ variable "subdomains_haumdaucher" {
# ## graf.me -> problems with domain
variable "domains" {
default = [ "moritzgraf.de"
,"graf-fam.de"
,"krassescheisse.de"]
default = ["moritzgraf.de"
, "graf-fam.de"
, "krassescheisse.de"]
}
resource "ovh_domain_zone_record" "haumdaucher_domain" {
zone = "haumdaucher.de"
subdomain = ""
fieldtype = "A"
ttl = local.ttl
#target = "91.121.84.190"
target = "136.243.23.215"
zone = "haumdaucher.de"
subdomain = ""
fieldtype = "A"
ttl = local.ttl
#target = "91.121.84.190"
target = "136.243.23.215"
}
resource "ovh_domain_zone_record" "haumdaucher_wildcard_domain" {
zone = "haumdaucher.de"
subdomain = "*"
fieldtype = "A"
ttl = local.ttl
#target = "91.121.84.190"
target = "136.243.23.215"
zone = "haumdaucher.de"
subdomain = "*"
fieldtype = "A"
ttl = local.ttl
#target = "91.121.84.190"
target = "136.243.23.215"
}
resource "ovh_domain_zone_record" "moritzgraf_wildcard_domain" {
zone = "moritzgraf.de"
subdomain = "*"
fieldtype = "A"
ttl = local.ttl
#target = "91.121.84.190"
target = "136.243.23.215"
zone = "moritzgraf.de"
subdomain = "*"
fieldtype = "A"
ttl = local.ttl
#target = "91.121.84.190"
target = "136.243.23.215"
}
######################################
@@ -130,40 +130,60 @@ resource "ovh_domain_zone_record" "moritzgraf_wildcard_domain" {
locals {
# adobe
first = "151.101.128.119"
first = "151.101.128.119"
second = "151.101.192.119"
}
resource "ovh_domain_zone_record" "ameliegraf_de_first" {
zone = "ameliegraf.de"
subdomain = ""
fieldtype = "A"
ttl = local.ttl
#target = "91.121.84.190"
target = local.first
zone = "ameliegraf.de"
subdomain = ""
fieldtype = "A"
ttl = local.ttl
#target = "91.121.84.190"
target = local.first
}
resource "ovh_domain_zone_record" "ameliegraf_de_second" {
zone = "ameliegraf.de"
subdomain = ""
fieldtype = "A"
ttl = local.ttl
#target = "91.121.84.190"
target = local.second
zone = "ameliegraf.de"
subdomain = ""
fieldtype = "A"
ttl = local.ttl
#target = "91.121.84.190"
target = local.second
}
resource "ovh_domain_zone_record" "wildcard_ameliegraf_de_first" {
zone = "ameliegraf.de"
subdomain = "*"
fieldtype = "A"
ttl = local.ttl
#target = "91.121.84.190"
target = local.first
zone = "ameliegraf.de"
subdomain = "*"
fieldtype = "A"
ttl = local.ttl
#target = "91.121.84.190"
target = local.first
}
resource "ovh_domain_zone_record" "wildcard_ameliegraf_de_second" {
zone = "ameliegraf.de"
subdomain = "*"
fieldtype = "A"
ttl = local.ttl
#target = "91.121.84.190"
target = local.second
zone = "ameliegraf.de"
subdomain = "*"
fieldtype = "A"
ttl = local.ttl
#target = "91.121.84.190"
target = local.second
}
######################################
## grabengasse7.de
resource "ovh_domain_zone_record" "grabengasse7_de_domain" {
zone = "grabengasse7.de"
subdomain = ""
fieldtype = "A"
ttl = local.ttl
target = "136.243.23.215"
}
resource "ovh_domain_zone_record" "grabengasse7_de_wildcard" {
zone = "grabengasse7.de"
subdomain = "*"
fieldtype = "A"
ttl = local.ttl
target = "136.243.23.215"
}
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
+4
View File
@@ -11,6 +11,10 @@ terraform {
source = "hashicorp/local"
version = "~> 2.0"
}
authentik = {
source = "goauthentik/authentik"
version = ">= 2024.12"
}
}
required_version = ">= 0.13"
}