resource "kubernetes_namespace" "vaultwarden" { metadata { name = "vaultwarden" } } resource "kubernetes_service_account" "vaultwarden" { metadata { name = "vaultwarden-sa" namespace = kubernetes_namespace.vaultwarden.metadata[0].name } automount_service_account_token = false } resource "kubernetes_config_map" "vaultwarden_config" { metadata { name = "vaultwarden-config" namespace = kubernetes_namespace.vaultwarden.metadata[0].name } data = { DOMAIN = "https://${local.app_fqdn}/" SIGNUP = var.signup_enabled ? "true" : "false" DATABASE_URL = "file:///data/db.sqlite3" } } resource "kubernetes_secret" "vaultwarden_secrets" { metadata { name = "vaultwarden-keys" namespace = kubernetes_namespace.vaultwarden.metadata[0].name } data = { ADMIN_TOKEN = var.admin_token } } resource "kubernetes_deployment" "vaultwarden" { metadata { name = "vaultwarden" namespace = kubernetes_namespace.vaultwarden.metadata[0].name labels = { app = "vaultwarden" } } spec { replicas = 1 selector { match_labels = { app = "vaultwarden" } } strategy { type = "Recreate" } template { metadata { labels = { app = "vaultwarden" } } spec { service_account_name = kubernetes_service_account.vaultwarden.metadata[0].name automount_service_account_token = false security_context { run_as_non_root = true run_as_user = 1000 run_as_group = 1000 fs_group = 1000 seccomp_profile { type = "RuntimeDefault" } } container { name = "vaultwarden" image = "vaultwarden/server:${local.app_version}" env_from { config_map_ref { name = kubernetes_config_map.vaultwarden_config.metadata[0].name } } env { name = "ADMIN_TOKEN" value_from { secret_key_ref { name = kubernetes_secret.vaultwarden_secrets.metadata[0].name key = "ADMIN_TOKEN" } } } security_context { allow_privilege_escalation = false privileged = false capabilities { drop = ["ALL"] } read_only_root_filesystem = true } port { name = "http" container_port = 80 protocol = "TCP" } liveness_probe { http_get { path = "/" port = "http" } initial_delay_seconds = 30 period_seconds = 15 } readiness_probe { http_get { path = "/" port = "http" } initial_delay_seconds = 10 period_seconds = 10 } volume_mount { name = "vaultwarden-data" mount_path = "/data" } volume_mount { name = "vaultwarden-tmp" mount_path = "/tmp" } } volume { name = "vaultwarden-data" host_path { path = local.db_path } } volume { name = "vaultwarden-tmp" empty_dir {} } } } } } resource "kubernetes_service" "vaultwarden" { metadata { name = "vaultwarden-service" namespace = kubernetes_namespace.vaultwarden.metadata[0].name } spec { selector = { app = "vaultwarden" } port { name = "http" port = 80 target_port = 80 } type = "ClusterIP" } lifecycle { ignore_changes = [ metadata[0].annotations ] } }