add cronjob backup DB mysql not workign yet

This commit is contained in:
2026-03-02 09:27:03 +00:00
parent f933d5b659
commit 06a8d9e680
2 changed files with 104 additions and 3 deletions
+101 -1
View File
@@ -17,7 +17,7 @@ provider "kubernetes" {
provider "bitwarden-secrets" { provider "bitwarden-secrets" {
api_url = "https://bitwarden.tryton.geeraert.eu/api" api_url = "https://bitwarden.tryton.geeraert.eu/api"
identity_url = "https://bitwarden.tryton.geeraert.eu/identity" 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" 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 { locals {
pvc_list = flatten([ pvc_list = flatten([
for key, value in var.kubernetes : [ 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" { 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 } for_each = { for key, value in var.kubernetes : key => value if value.redis != null && value.enabled == true }
metadata { 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" { resource "kubernetes_deployment_v1" "redis-automatic" {
for_each = { for key, value in var.kubernetes : key => value if value.redis != null && value.enabled == true } 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}" 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}" 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}" 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}" 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}" 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_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}" 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}" 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}" 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}" 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}" 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}"
} }
+3 -2
View File
@@ -8,6 +8,7 @@ kubernetes = {
image = "linuxserver/bookstack:latest" image = "linuxserver/bookstack:latest"
service_port = [80, 443] service_port = [80, 443]
database = { database = {
"engine" = "mysql"
"image" = "lscr.io/linuxserver/mariadb" "image" = "lscr.io/linuxserver/mariadb"
"port" = 3306 "port" = 3306
"mountPath" = "/config" "mountPath" = "/config"
@@ -1383,7 +1384,7 @@ kubernetes = {
#enabled = false #enabled = false
#replicas = 0 #replicas = 0
connected_namespace = "immich" 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] service_port = [2283]
database = { database = {
image = "docker.io/tensorchord/pgvecto-rs:pg14-v0.2.0" image = "docker.io/tensorchord/pgvecto-rs:pg14-v0.2.0"
@@ -1510,7 +1511,7 @@ kubernetes = {
#enabled = false #enabled = false
#replicas = 0 #replicas = 0
connected_namespace = "immich" 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] service_port = [3003]
environment = { environment = {
DB_DATABASE_NAME = { DB_DATABASE_NAME = {