From 41131e58bafa9ac5fa899018465e0c60b73f9b66 Mon Sep 17 00:00:00 2001 From: Viktor Barzin Date: Sat, 14 Mar 2026 18:51:14 +0000 Subject: [PATCH] add novelapp deployment [ci skip] Deploy NovelApp (web novel reading tracker) to k8s cluster. - Namespace: novelapp, tier: aux - iSCSI PVC for SQLite persistence - Ingress at novelapp.viktorbarzin.me - Browser scraping disabled --- config.tfvars | Bin 9945 -> 9957 bytes stacks/novelapp/main.tf | 158 +++++++++++++++++++++++++++++++++ stacks/novelapp/secrets | 1 + stacks/novelapp/terragrunt.hcl | 13 +++ 4 files changed, 172 insertions(+) create mode 100644 stacks/novelapp/main.tf create mode 120000 stacks/novelapp/secrets create mode 100644 stacks/novelapp/terragrunt.hcl diff --git a/config.tfvars b/config.tfvars index b0e4b08c3deb1f2b8e77dc3360a8c636c22a2a37..a2993be3e0e062fcdb4da5705ecaa54ee55aad07 100644 GIT binary patch literal 9957 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 literal 9945 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 X&Z$C7R&@?~OO6jm-&%(uST(d`J%}`f diff --git a/stacks/novelapp/main.tf b/stacks/novelapp/main.tf new file mode 100644 index 00000000..925d7abc --- /dev/null +++ b/stacks/novelapp/main.tf @@ -0,0 +1,158 @@ +variable "tls_secret_name" { + type = string + sensitive = true +} + +resource "kubernetes_namespace" "novelapp" { + metadata { + name = "novelapp" + labels = { + "istio-injection" : "disabled" + tier = local.tiers.aux + } + } +} + +module "tls_secret" { + source = "../../modules/kubernetes/setup_tls_secret" + namespace = kubernetes_namespace.novelapp.metadata[0].name + tls_secret_name = var.tls_secret_name +} + +resource "kubernetes_persistent_volume_claim" "novelapp-data" { + metadata { + name = "novelapp-data" + namespace = kubernetes_namespace.novelapp.metadata[0].name + } + spec { + access_modes = ["ReadWriteOnce"] + storage_class_name = "iscsi-truenas" + resources { + requests = { + storage = "1Gi" + } + } + } +} + +resource "kubernetes_deployment" "novelapp" { + metadata { + name = "novelapp" + namespace = kubernetes_namespace.novelapp.metadata[0].name + labels = { + app = "novelapp" + tier = local.tiers.aux + } + } + lifecycle { + ignore_changes = [ + spec[0].template[0].spec[0].container[0].image, + ] + } + spec { + replicas = 1 + strategy { + type = "Recreate" + } + selector { + match_labels = { + app = "novelapp" + } + } + template { + metadata { + labels = { + app = "novelapp" + } + } + spec { + volume { + name = "data" + persistent_volume_claim { + claim_name = kubernetes_persistent_volume_claim.novelapp-data.metadata[0].name + } + } + container { + image = "viktorbarzin/novelapp:1" + name = "novelapp" + image_pull_policy = "Always" + env { + name = "NODE_ENV" + value = "production" + } + env { + name = "DB_PATH" + value = "/app/data/novelapp.db" + } + env { + name = "DISABLE_BROWSER_SCRAPING" + value = "true" + } + env { + name = "PORT" + value = "3000" + } + volume_mount { + name = "data" + mount_path = "/app/data" + } + port { + container_port = 3000 + } + resources { + requests = { + memory = "64Mi" + cpu = "10m" + } + limits = { + memory = "128Mi" + } + } + } + } + } + } +} + +resource "kubernetes_service" "novelapp" { + metadata { + name = "novelapp" + namespace = kubernetes_namespace.novelapp.metadata[0].name + labels = { + "app" = "novelapp" + } + } + + spec { + selector = { + app = "novelapp" + } + port { + name = "http" + port = 80 + target_port = 3000 + } + } +} + +module "ingress" { + source = "../../modules/kubernetes/ingress_factory" + namespace = kubernetes_namespace.novelapp.metadata[0].name + name = "novelapp" + tls_secret_name = var.tls_secret_name + + extra_annotations = { + "gethomepage.dev/enabled" = "true" + "gethomepage.dev/name" = "NovelApp" + "gethomepage.dev/description" = "Web novel tracker" + "gethomepage.dev/icon" = "mdi-book-open-page-variant" + "gethomepage.dev/group" = "Other" + "gethomepage.dev/pod-selector" = "" + } +} + +# Sealed Secrets — encrypted secrets safe to commit to git +resource "kubernetes_manifest" "sealed_secrets" { + for_each = fileset(path.module, "sealed-*.yaml") + manifest = yamldecode(file("${path.module}/${each.value}")) +} diff --git a/stacks/novelapp/secrets b/stacks/novelapp/secrets new file mode 120000 index 00000000..ca54a7cf --- /dev/null +++ b/stacks/novelapp/secrets @@ -0,0 +1 @@ +../../secrets \ No newline at end of file diff --git a/stacks/novelapp/terragrunt.hcl b/stacks/novelapp/terragrunt.hcl new file mode 100644 index 00000000..f4c920ab --- /dev/null +++ b/stacks/novelapp/terragrunt.hcl @@ -0,0 +1,13 @@ +include "root" { + path = find_in_parent_folders() +} + +dependency "platform" { + config_path = "../platform" + skip_outputs = true +} + +dependency "vault" { + config_path = "../vault" + skip_outputs = true +}