From 06a8d9e6807c47154488594c800ce89b57e7dd2c Mon Sep 17 00:00:00 2001 From: pierre Date: Mon, 2 Mar 2026 09:27:03 +0000 Subject: [PATCH] add cronjob backup DB mysql not workign yet --- module.tf | 102 +++++++++++++++++++++++++++++++++++++++++- variables.auto.tfvars | 5 ++- 2 files changed, 104 insertions(+), 3 deletions(-) diff --git a/module.tf b/module.tf index 46fb513..01316c1 100644 --- a/module.tf +++ b/module.tf @@ -17,7 +17,7 @@ provider "kubernetes" { provider "bitwarden-secrets" { api_url = "https://bitwarden.tryton.geeraert.eu/api" identity_url = "https://bitwarden.tryton.geeraert.eu/identity" - access_token = "0.716253cf-61a8-4d60-9116-b3ec00bf67b1.yRfbBN649M3DwG0TVQJO0w9m89mN1l:69GrWDDy6awetvPwQe/V8A==" + access_token = "0.dd9b243a-b5f5-4b26-aaba-b3f70170088c.fjoaQEShPaEEZa7GmkTJXQYEmF5wVp:5B4jhLp5gRymNcwktMDyOg==" organization_id = "a6361589-badd-4bde-9cb4-af8901161c0d" } @@ -82,6 +82,24 @@ variable "kubernetes" { } +variable "database_backup_info" { + type = map(object({ + image = optional(string) + command = optional(string) + })) + description = "based on DB engine, give the docker image and the command used to backup" + default = { + postgres = { + image = "alpine/psql" + command = "pg_dump |gzip -9 > /backup/$(DB_DATABASE_NAME)-DB-$(date +%Y%m%d).sql.gz" + } + mysql = { + image = "mysql" + command = "mysqldump |gzip -9 > /backup/$(DB_DATABASE_NAME)-DB-$(date +%Y%m%d).sql.gz" + } + } +} + locals { pvc_list = flatten([ for key, value in var.kubernetes : [ @@ -210,6 +228,28 @@ resource "kubernetes_persistent_volume_claim_v1" "automatic-pvc-database" { } } +resource "kubernetes_persistent_volume_claim_v1" "backup-pvc-database" { + for_each = { for key, value in var.kubernetes : key => value if value.database != null && value.enabled == true } + metadata { + namespace = coalesce(each.value.namespace, each.value.connected_namespace, each.key) + name = "${each.key}-db-backup" + labels = { + deployment_method = "Terraform" + } + annotations = { + fileType = "Backup" } + } + spec { + access_modes = ["ReadWriteMany"] + storage_class_name = "nfs-storage-fastaccess" + resources { + requests = { + storage = "1Gi" + } + } + } +} + resource "kubernetes_persistent_volume_claim_v1" "automatic-pvc-redis" { for_each = { for key, value in var.kubernetes : key => value if value.redis != null && value.enabled == true } metadata { @@ -665,6 +705,62 @@ resource "kubernetes_deployment_v1" "database-automatic" { } +resource "kubernetes_cron_job_v1" "database-backup" { + for_each = { for key, value in var.kubernetes : key => value if value.database != null && value.enabled == true } + metadata { + name = "${coalesce(each.value.namespace, each.key)}-db-backup" + namespace = coalesce(each.value.namespace, each.value.connected_namespace, each.key) + labels = { + app = each.key + deployment_method = "Terraform" + database = "true" + #image = try(var.database_backup_info[each.value.database.engine].image, var.database_backup_info.postgres.image) + } + } + spec { + failed_jobs_history_limit = 5 + schedule = "1 0 * * *" + timezone = "Etc/UTC" + successful_jobs_history_limit = 5 + job_template { + metadata {} + spec { + backoff_limit = 4 + ttl_seconds_after_finished = 100 + template { + metadata {} + spec { + container { + name = "${coalesce(each.value.namespace, each.key)}-db-backup" + #image = "alpine/psql" + image = try(var.database_backup_info[each.value.database.engine].image, var.database_backup_info.postgres.image) + command = ["/bin/sh", "-c"] + #args = ["pg_dump |gzip -9 > /backup/$(DB_DATABASE_NAME)-DB-$(date +%Y%m%d).sql.gz"] + args = [try(var.database_backup_info[each.value.database.engine].command, var.database_backup_info.postgres.command)] + env_from { + secret_ref { + name = "${each.key}-db-terraform" + } + } + volume_mount { + mount_path = "/backup" + name = "${each.key}-db-backup" + } + } + volume { + name = "${each.key}-db-backup" + persistent_volume_claim { + claim_name = "${each.key}-db-backup" + } + } + } + } + } + } + } +} + + resource "kubernetes_deployment_v1" "redis-automatic" { for_each = { for key, value in var.kubernetes : key => value if value.redis != null && value.enabled == true } @@ -867,14 +963,18 @@ resource "kubernetes_secret_v1" "automatic-database-secret" { DB_DATABASE_NAME = "${resource.bitwarden-secrets_secret.automatic_bitwarden_secret_db_name[each.key].value}" POSTGRES_DB = "${resource.bitwarden-secrets_secret.automatic_bitwarden_secret_db_name[each.key].value}" MYSQL_DATABASE = "${resource.bitwarden-secrets_secret.automatic_bitwarden_secret_db_name[each.key].value}" + PGDATABASE = "${resource.bitwarden-secrets_secret.automatic_bitwarden_secret_db_name[each.key].value}" DB_HOST = "${resource.bitwarden-secrets_secret.automatic_bitwarden_secret_db_host[each.key].value}" + PGHOST = "${resource.bitwarden-secrets_secret.automatic_bitwarden_secret_db_host[each.key].value}" DB_PASSWORD = "${resource.bitwarden-secrets_secret.automatic_bitwarden_secret_db_password[each.key].value}" MYSQL_PASSWORD = "${resource.bitwarden-secrets_secret.automatic_bitwarden_secret_db_password[each.key].value}" MYSQL_ROOT_PASSWORD = "${resource.bitwarden-secrets_secret.automatic_bitwarden_secret_db_password[each.key].value}" POSTGRES_PASSWORD = "${resource.bitwarden-secrets_secret.automatic_bitwarden_secret_db_password[each.key].value}" + PGPASSWORD = "${resource.bitwarden-secrets_secret.automatic_bitwarden_secret_db_password[each.key].value}" DB_USERNAME = "${resource.bitwarden-secrets_secret.automatic_bitwarden_secret_db_username[each.key].value}" POSTGRES_USER = "${resource.bitwarden-secrets_secret.automatic_bitwarden_secret_db_username[each.key].value}" MYSQL_USER = "${resource.bitwarden-secrets_secret.automatic_bitwarden_secret_db_username[each.key].value}" + PGUSER = "${resource.bitwarden-secrets_secret.automatic_bitwarden_secret_db_username[each.key].value}" } diff --git a/variables.auto.tfvars b/variables.auto.tfvars index d0319ef..e850770 100644 --- a/variables.auto.tfvars +++ b/variables.auto.tfvars @@ -8,6 +8,7 @@ kubernetes = { image = "linuxserver/bookstack:latest" service_port = [80, 443] database = { + "engine" = "mysql" "image" = "lscr.io/linuxserver/mariadb" "port" = 3306 "mountPath" = "/config" @@ -1383,7 +1384,7 @@ kubernetes = { #enabled = false #replicas = 0 connected_namespace = "immich" - image = "ghcr.io/immich-app/immich-server:v2.0.0" + image = "ghcr.io/immich-app/immich-server:v2.5.6" service_port = [2283] database = { image = "docker.io/tensorchord/pgvecto-rs:pg14-v0.2.0" @@ -1510,7 +1511,7 @@ kubernetes = { #enabled = false #replicas = 0 connected_namespace = "immich" - image = "ghcr.io/immich-app/immich-machine-learning:v2.0.0" + image = "ghcr.io/immich-app/immich-machine-learning:v2.5.6" service_port = [3003] environment = { DB_DATABASE_NAME = {