diff --git a/stacks/actualbudget/.terraform.lock.hcl b/stacks/actualbudget/.terraform.lock.hcl
new file mode 100644
index 00000000..afde2320
--- /dev/null
+++ b/stacks/actualbudget/.terraform.lock.hcl
@@ -0,0 +1,59 @@
+# This file is maintained automatically by "terraform init".
+# Manual edits may be lost in future updates.
+
+provider "registry.terraform.io/hashicorp/helm" {
+ version = "3.1.1"
+ hashes = [
+ "h1:47CqNwkxctJtL/N/JuEj+8QMg8mRNI/NWeKO5/ydfZU=",
+ "zh:1a6d5ce931708aec29d1f3d9e360c2a0c35ba5a54d03eeaff0ce3ca597cd0275",
+ "zh:3411919ba2a5941801e677f0fea08bdd0ae22ba3c9ce3309f55554699e06524a",
+ "zh:81b36138b8f2320dc7f877b50f9e38f4bc614affe68de885d322629dd0d16a29",
+ "zh:95a2a0a497a6082ee06f95b38bd0f0d6924a65722892a856cfd914c0d117f104",
+ "zh:9d3e78c2d1bb46508b972210ad706dd8c8b106f8b206ecf096cd211c54f46990",
+ "zh:a79139abf687387a6efdbbb04289a0a8e7eaca2bd91cdc0ce68ea4f3286c2c34",
+ "zh:aaa8784be125fbd50c48d84d6e171d3fb6ef84a221dbc5165c067ce05faab4c8",
+ "zh:afecd301f469975c9d8f350cc482fe656e082b6ab0f677d1a816c3c615837cc1",
+ "zh:c54c22b18d48ff9053d899d178d9ffef7d9d19785d9bf310a07d648b7aac075b",
+ "zh:db2eefd55aea48e73384a555c72bac3f7d428e24147bedb64e1a039398e5b903",
+ "zh:ee61666a233533fd2be971091cecc01650561f1585783c381b6f6e8a390198a4",
+ "zh:f569b65999264a9416862bca5cd2a6177d94ccb0424f3a4ef424428912b9cb3c",
+ ]
+}
+
+provider "registry.terraform.io/hashicorp/kubernetes" {
+ version = "3.0.1"
+ hashes = [
+ "h1:P0c8knzZnouTNFIRij8IS7+pqd0OKaFDYX0j4GRsiqo=",
+ "zh:02d55b0b2238fd17ffa12d5464593864e80f402b90b31f6e1bd02249b9727281",
+ "zh:20b93a51bfeed82682b3c12f09bac3031f5bdb4977c47c97a042e4df4fb2f9ba",
+ "zh:6e14486ecfaee38c09ccf33d4fdaf791409f90795c1b66e026c226fad8bc03c7",
+ "zh:8d0656ff422df94575668e32c310980193fccb1c28117e5c78dd2d4050a760a6",
+ "zh:9795119b30ec0c1baa99a79abace56ac850b6e6fbce60e7f6067792f6eb4b5f4",
+ "zh:b388c87acc40f6bd9620f4e23f01f3c7b41d9b88a68d5255dec0a72f0bdec249",
+ "zh:b59abd0a980649c2f97f172392f080eaeb18e486b603f83bf95f5d93aeccc090",
+ "zh:ba6e3060fddf4a022087d8f09e38aa0001c705f21170c2ded3d1c26c12f70d97",
+ "zh:c12626d044b1d5501cf95ca78cbe507c13ad1dd9f12d4736df66eb8e5f336eb8",
+ "zh:c55203240d50f4cdeb3df1e1760630d677679f5b1a6ffd9eba23662a4ad05119",
+ "zh:ea206a5a32d6e0d6e32f1849ad703da9a28355d9c516282a8458b5cf1502b2a1",
+ "zh:f569b65999264a9416862bca5cd2a6177d94ccb0424f3a4ef424428912b9cb3c",
+ ]
+}
+
+provider "registry.terraform.io/hashicorp/random" {
+ version = "3.8.1"
+ hashes = [
+ "h1:u8AKlWVDTH5r9YLSeswoVEjiY72Rt4/ch7U+61ZDkiQ=",
+ "zh:08dd03b918c7b55713026037c5400c48af5b9f468f483463321bd18e17b907b4",
+ "zh:0eee654a5542dc1d41920bbf2419032d6f0d5625b03bd81339e5b33394a3e0ae",
+ "zh:229665ddf060aa0ed315597908483eee5b818a17d09b6417a0f52fd9405c4f57",
+ "zh:2469d2e48f28076254a2a3fc327f184914566d9e40c5780b8d96ebf7205f8bc0",
+ "zh:37d7eb334d9561f335e748280f5535a384a88675af9a9eac439d4cfd663bcb66",
+ "zh:741101426a2f2c52dee37122f0f4a2f2d6af6d852cb1db634480a86398fa3511",
+ "zh:78d5eefdd9e494defcb3c68d282b8f96630502cac21d1ea161f53cfe9bb483b3",
+ "zh:a902473f08ef8df62cfe6116bd6c157070a93f66622384300de235a533e9d4a9",
+ "zh:b85c511a23e57a2147355932b3b6dce2a11e856b941165793a0c3d7578d94d05",
+ "zh:c5172226d18eaac95b1daac80172287b69d4ce32750c82ad77fa0768be4ea4b8",
+ "zh:dab4434dba34aad569b0bc243c2d3f3ff86dd7740def373f2a49816bd2ff819b",
+ "zh:f49fd62aa8c5525a5c17abd51e27ca5e213881d58882fd42fec4a545b53c9699",
+ ]
+}
diff --git a/stacks/actualbudget/backend.tf b/stacks/actualbudget/backend.tf
new file mode 100644
index 00000000..07725d7d
--- /dev/null
+++ b/stacks/actualbudget/backend.tf
@@ -0,0 +1,6 @@
+# Generated by Terragrunt. Sig: nIlQXj57tbuaRZEa
+terraform {
+ backend "local" {
+ path = "/Users/viktorbarzin/code/infra/state/stacks/actualbudget/terraform.tfstate"
+ }
+}
diff --git a/stacks/actualbudget/main.tf b/stacks/actualbudget/main.tf
index 2bb2d58c..ddba7250 100644
--- a/stacks/actualbudget/main.tf
+++ b/stacks/actualbudget/main.tf
@@ -12,8 +12,8 @@ locals {
}
module "actualbudget" {
- source = "../../modules/kubernetes/actualbudget"
- tls_secret_name = var.tls_secret_name
- tier = local.tiers.edge
- credentials = var.actualbudget_credentials
+ source = "./module"
+ tls_secret_name = var.tls_secret_name
+ tier = local.tiers.edge
+ credentials = var.actualbudget_credentials
}
diff --git a/modules/kubernetes/actualbudget/factory/main.tf b/stacks/actualbudget/module/factory/main.tf
similarity index 98%
rename from modules/kubernetes/actualbudget/factory/main.tf
rename to stacks/actualbudget/module/factory/main.tf
index d76a7f94..e173d3fb 100644
--- a/modules/kubernetes/actualbudget/factory/main.tf
+++ b/stacks/actualbudget/module/factory/main.tf
@@ -89,7 +89,7 @@ resource "kubernetes_service" "actualbudget" {
}
module "ingress" {
- source = "../../ingress_factory"
+ source = "../../../../modules/kubernetes/ingress_factory"
namespace = "actualbudget"
name = "budget-${var.name}"
tls_secret_name = var.tls_secret_name
diff --git a/modules/kubernetes/actualbudget/main.tf b/stacks/actualbudget/module/main.tf
similarity index 96%
rename from modules/kubernetes/actualbudget/main.tf
rename to stacks/actualbudget/module/main.tf
index e9f374c5..eaa4ebd4 100644
--- a/modules/kubernetes/actualbudget/main.tf
+++ b/stacks/actualbudget/module/main.tf
@@ -20,7 +20,7 @@ resource "kubernetes_namespace" "actualbudget" {
}
module "tls_secret" {
- source = "../setup_tls_secret"
+ source = "../../../modules/kubernetes/setup_tls_secret"
namespace = kubernetes_namespace.actualbudget.metadata[0].name
tls_secret_name = var.tls_secret_name
}
diff --git a/stacks/actualbudget/providers.tf b/stacks/actualbudget/providers.tf
new file mode 100644
index 00000000..516f9fed
--- /dev/null
+++ b/stacks/actualbudget/providers.tf
@@ -0,0 +1,15 @@
+# Generated by Terragrunt. Sig: nIlQXj57tbuaRZEa
+variable "kube_config_path" {
+ type = string
+ default = "~/.kube/config"
+}
+
+provider "kubernetes" {
+ config_path = var.kube_config_path
+}
+
+provider "helm" {
+ kubernetes = {
+ config_path = var.kube_config_path
+ }
+}
diff --git a/stacks/actualbudget/secrets b/stacks/actualbudget/secrets
new file mode 120000
index 00000000..ca54a7cf
--- /dev/null
+++ b/stacks/actualbudget/secrets
@@ -0,0 +1 @@
+../../secrets
\ No newline at end of file
diff --git a/stacks/affine/.terraform.lock.hcl b/stacks/affine/.terraform.lock.hcl
new file mode 100644
index 00000000..1e5d8b27
--- /dev/null
+++ b/stacks/affine/.terraform.lock.hcl
@@ -0,0 +1,40 @@
+# This file is maintained automatically by "terraform init".
+# Manual edits may be lost in future updates.
+
+provider "registry.terraform.io/hashicorp/helm" {
+ version = "3.1.1"
+ hashes = [
+ "h1:47CqNwkxctJtL/N/JuEj+8QMg8mRNI/NWeKO5/ydfZU=",
+ "zh:1a6d5ce931708aec29d1f3d9e360c2a0c35ba5a54d03eeaff0ce3ca597cd0275",
+ "zh:3411919ba2a5941801e677f0fea08bdd0ae22ba3c9ce3309f55554699e06524a",
+ "zh:81b36138b8f2320dc7f877b50f9e38f4bc614affe68de885d322629dd0d16a29",
+ "zh:95a2a0a497a6082ee06f95b38bd0f0d6924a65722892a856cfd914c0d117f104",
+ "zh:9d3e78c2d1bb46508b972210ad706dd8c8b106f8b206ecf096cd211c54f46990",
+ "zh:a79139abf687387a6efdbbb04289a0a8e7eaca2bd91cdc0ce68ea4f3286c2c34",
+ "zh:aaa8784be125fbd50c48d84d6e171d3fb6ef84a221dbc5165c067ce05faab4c8",
+ "zh:afecd301f469975c9d8f350cc482fe656e082b6ab0f677d1a816c3c615837cc1",
+ "zh:c54c22b18d48ff9053d899d178d9ffef7d9d19785d9bf310a07d648b7aac075b",
+ "zh:db2eefd55aea48e73384a555c72bac3f7d428e24147bedb64e1a039398e5b903",
+ "zh:ee61666a233533fd2be971091cecc01650561f1585783c381b6f6e8a390198a4",
+ "zh:f569b65999264a9416862bca5cd2a6177d94ccb0424f3a4ef424428912b9cb3c",
+ ]
+}
+
+provider "registry.terraform.io/hashicorp/kubernetes" {
+ version = "3.0.1"
+ hashes = [
+ "h1:P0c8knzZnouTNFIRij8IS7+pqd0OKaFDYX0j4GRsiqo=",
+ "zh:02d55b0b2238fd17ffa12d5464593864e80f402b90b31f6e1bd02249b9727281",
+ "zh:20b93a51bfeed82682b3c12f09bac3031f5bdb4977c47c97a042e4df4fb2f9ba",
+ "zh:6e14486ecfaee38c09ccf33d4fdaf791409f90795c1b66e026c226fad8bc03c7",
+ "zh:8d0656ff422df94575668e32c310980193fccb1c28117e5c78dd2d4050a760a6",
+ "zh:9795119b30ec0c1baa99a79abace56ac850b6e6fbce60e7f6067792f6eb4b5f4",
+ "zh:b388c87acc40f6bd9620f4e23f01f3c7b41d9b88a68d5255dec0a72f0bdec249",
+ "zh:b59abd0a980649c2f97f172392f080eaeb18e486b603f83bf95f5d93aeccc090",
+ "zh:ba6e3060fddf4a022087d8f09e38aa0001c705f21170c2ded3d1c26c12f70d97",
+ "zh:c12626d044b1d5501cf95ca78cbe507c13ad1dd9f12d4736df66eb8e5f336eb8",
+ "zh:c55203240d50f4cdeb3df1e1760630d677679f5b1a6ffd9eba23662a4ad05119",
+ "zh:ea206a5a32d6e0d6e32f1849ad703da9a28355d9c516282a8458b5cf1502b2a1",
+ "zh:f569b65999264a9416862bca5cd2a6177d94ccb0424f3a4ef424428912b9cb3c",
+ ]
+}
diff --git a/stacks/affine/backend.tf b/stacks/affine/backend.tf
new file mode 100644
index 00000000..973f9c04
--- /dev/null
+++ b/stacks/affine/backend.tf
@@ -0,0 +1,6 @@
+# Generated by Terragrunt. Sig: nIlQXj57tbuaRZEa
+terraform {
+ backend "local" {
+ path = "/Users/viktorbarzin/code/infra/state/stacks/affine/terraform.tfstate"
+ }
+}
diff --git a/stacks/affine/main.tf b/stacks/affine/main.tf
index 52137488..0043e2a5 100644
--- a/stacks/affine/main.tf
+++ b/stacks/affine/main.tf
@@ -13,9 +13,9 @@ locals {
}
module "affine" {
- source = "../../modules/kubernetes/affine"
- tls_secret_name = var.tls_secret_name
- postgresql_password = var.affine_postgresql_password
- smtp_password = var.mailserver_accounts["info@viktorbarzin.me"]
- tier = local.tiers.aux
+ source = "./module"
+ tls_secret_name = var.tls_secret_name
+ postgresql_password = var.affine_postgresql_password
+ smtp_password = var.mailserver_accounts["info@viktorbarzin.me"]
+ tier = local.tiers.aux
}
diff --git a/modules/kubernetes/affine/main.tf b/stacks/affine/module/main.tf
similarity index 97%
rename from modules/kubernetes/affine/main.tf
rename to stacks/affine/module/main.tf
index b1a8d4fc..8d73ec85 100644
--- a/modules/kubernetes/affine/main.tf
+++ b/stacks/affine/module/main.tf
@@ -13,7 +13,7 @@ resource "kubernetes_namespace" "affine" {
}
module "tls_secret" {
- source = "../setup_tls_secret"
+ source = "../../../modules/kubernetes/setup_tls_secret"
namespace = kubernetes_namespace.affine.metadata[0].name
tls_secret_name = var.tls_secret_name
}
@@ -209,7 +209,7 @@ resource "kubernetes_service" "affine" {
}
module "ingress" {
- source = "../ingress_factory"
+ source = "../../../modules/kubernetes/ingress_factory"
namespace = kubernetes_namespace.affine.metadata[0].name
name = "affine"
tls_secret_name = var.tls_secret_name
diff --git a/stacks/affine/providers.tf b/stacks/affine/providers.tf
new file mode 100644
index 00000000..516f9fed
--- /dev/null
+++ b/stacks/affine/providers.tf
@@ -0,0 +1,15 @@
+# Generated by Terragrunt. Sig: nIlQXj57tbuaRZEa
+variable "kube_config_path" {
+ type = string
+ default = "~/.kube/config"
+}
+
+provider "kubernetes" {
+ config_path = var.kube_config_path
+}
+
+provider "helm" {
+ kubernetes = {
+ config_path = var.kube_config_path
+ }
+}
diff --git a/stacks/affine/secrets b/stacks/affine/secrets
new file mode 120000
index 00000000..ca54a7cf
--- /dev/null
+++ b/stacks/affine/secrets
@@ -0,0 +1 @@
+../../secrets
\ No newline at end of file
diff --git a/stacks/audiobookshelf/.terraform.lock.hcl b/stacks/audiobookshelf/.terraform.lock.hcl
new file mode 100644
index 00000000..1e5d8b27
--- /dev/null
+++ b/stacks/audiobookshelf/.terraform.lock.hcl
@@ -0,0 +1,40 @@
+# This file is maintained automatically by "terraform init".
+# Manual edits may be lost in future updates.
+
+provider "registry.terraform.io/hashicorp/helm" {
+ version = "3.1.1"
+ hashes = [
+ "h1:47CqNwkxctJtL/N/JuEj+8QMg8mRNI/NWeKO5/ydfZU=",
+ "zh:1a6d5ce931708aec29d1f3d9e360c2a0c35ba5a54d03eeaff0ce3ca597cd0275",
+ "zh:3411919ba2a5941801e677f0fea08bdd0ae22ba3c9ce3309f55554699e06524a",
+ "zh:81b36138b8f2320dc7f877b50f9e38f4bc614affe68de885d322629dd0d16a29",
+ "zh:95a2a0a497a6082ee06f95b38bd0f0d6924a65722892a856cfd914c0d117f104",
+ "zh:9d3e78c2d1bb46508b972210ad706dd8c8b106f8b206ecf096cd211c54f46990",
+ "zh:a79139abf687387a6efdbbb04289a0a8e7eaca2bd91cdc0ce68ea4f3286c2c34",
+ "zh:aaa8784be125fbd50c48d84d6e171d3fb6ef84a221dbc5165c067ce05faab4c8",
+ "zh:afecd301f469975c9d8f350cc482fe656e082b6ab0f677d1a816c3c615837cc1",
+ "zh:c54c22b18d48ff9053d899d178d9ffef7d9d19785d9bf310a07d648b7aac075b",
+ "zh:db2eefd55aea48e73384a555c72bac3f7d428e24147bedb64e1a039398e5b903",
+ "zh:ee61666a233533fd2be971091cecc01650561f1585783c381b6f6e8a390198a4",
+ "zh:f569b65999264a9416862bca5cd2a6177d94ccb0424f3a4ef424428912b9cb3c",
+ ]
+}
+
+provider "registry.terraform.io/hashicorp/kubernetes" {
+ version = "3.0.1"
+ hashes = [
+ "h1:P0c8knzZnouTNFIRij8IS7+pqd0OKaFDYX0j4GRsiqo=",
+ "zh:02d55b0b2238fd17ffa12d5464593864e80f402b90b31f6e1bd02249b9727281",
+ "zh:20b93a51bfeed82682b3c12f09bac3031f5bdb4977c47c97a042e4df4fb2f9ba",
+ "zh:6e14486ecfaee38c09ccf33d4fdaf791409f90795c1b66e026c226fad8bc03c7",
+ "zh:8d0656ff422df94575668e32c310980193fccb1c28117e5c78dd2d4050a760a6",
+ "zh:9795119b30ec0c1baa99a79abace56ac850b6e6fbce60e7f6067792f6eb4b5f4",
+ "zh:b388c87acc40f6bd9620f4e23f01f3c7b41d9b88a68d5255dec0a72f0bdec249",
+ "zh:b59abd0a980649c2f97f172392f080eaeb18e486b603f83bf95f5d93aeccc090",
+ "zh:ba6e3060fddf4a022087d8f09e38aa0001c705f21170c2ded3d1c26c12f70d97",
+ "zh:c12626d044b1d5501cf95ca78cbe507c13ad1dd9f12d4736df66eb8e5f336eb8",
+ "zh:c55203240d50f4cdeb3df1e1760630d677679f5b1a6ffd9eba23662a4ad05119",
+ "zh:ea206a5a32d6e0d6e32f1849ad703da9a28355d9c516282a8458b5cf1502b2a1",
+ "zh:f569b65999264a9416862bca5cd2a6177d94ccb0424f3a4ef424428912b9cb3c",
+ ]
+}
diff --git a/stacks/audiobookshelf/backend.tf b/stacks/audiobookshelf/backend.tf
new file mode 100644
index 00000000..486ccbea
--- /dev/null
+++ b/stacks/audiobookshelf/backend.tf
@@ -0,0 +1,6 @@
+# Generated by Terragrunt. Sig: nIlQXj57tbuaRZEa
+terraform {
+ backend "local" {
+ path = "/Users/viktorbarzin/code/infra/state/stacks/audiobookshelf/terraform.tfstate"
+ }
+}
diff --git a/stacks/audiobookshelf/main.tf b/stacks/audiobookshelf/main.tf
index a7930049..d09071b9 100644
--- a/stacks/audiobookshelf/main.tf
+++ b/stacks/audiobookshelf/main.tf
@@ -11,7 +11,7 @@ locals {
}
module "audiobookshelf" {
- source = "../../modules/kubernetes/audiobookshelf"
- tls_secret_name = var.tls_secret_name
- tier = local.tiers.aux
+ source = "./module"
+ tls_secret_name = var.tls_secret_name
+ tier = local.tiers.aux
}
diff --git a/modules/kubernetes/audiobookshelf/main.tf b/stacks/audiobookshelf/module/main.tf
similarity index 95%
rename from modules/kubernetes/audiobookshelf/main.tf
rename to stacks/audiobookshelf/module/main.tf
index a23fb489..db3280aa 100644
--- a/modules/kubernetes/audiobookshelf/main.tf
+++ b/stacks/audiobookshelf/module/main.tf
@@ -12,7 +12,7 @@ resource "kubernetes_namespace" "audiobookshelf" {
}
module "tls_secret" {
- source = "../setup_tls_secret"
+ source = "../../../modules/kubernetes/setup_tls_secret"
namespace = kubernetes_namespace.audiobookshelf.metadata[0].name
tls_secret_name = var.tls_secret_name
}
@@ -126,7 +126,7 @@ resource "kubernetes_service" "audiobookshelf" {
}
module "ingress" {
- source = "../ingress_factory"
+ source = "../../../modules/kubernetes/ingress_factory"
namespace = kubernetes_namespace.audiobookshelf.metadata[0].name
name = "audiobookshelf"
tls_secret_name = var.tls_secret_name
diff --git a/stacks/audiobookshelf/providers.tf b/stacks/audiobookshelf/providers.tf
new file mode 100644
index 00000000..516f9fed
--- /dev/null
+++ b/stacks/audiobookshelf/providers.tf
@@ -0,0 +1,15 @@
+# Generated by Terragrunt. Sig: nIlQXj57tbuaRZEa
+variable "kube_config_path" {
+ type = string
+ default = "~/.kube/config"
+}
+
+provider "kubernetes" {
+ config_path = var.kube_config_path
+}
+
+provider "helm" {
+ kubernetes = {
+ config_path = var.kube_config_path
+ }
+}
diff --git a/stacks/audiobookshelf/secrets b/stacks/audiobookshelf/secrets
new file mode 120000
index 00000000..ca54a7cf
--- /dev/null
+++ b/stacks/audiobookshelf/secrets
@@ -0,0 +1 @@
+../../secrets
\ No newline at end of file
diff --git a/stacks/blog/.terraform.lock.hcl b/stacks/blog/.terraform.lock.hcl
new file mode 100644
index 00000000..1e5d8b27
--- /dev/null
+++ b/stacks/blog/.terraform.lock.hcl
@@ -0,0 +1,40 @@
+# This file is maintained automatically by "terraform init".
+# Manual edits may be lost in future updates.
+
+provider "registry.terraform.io/hashicorp/helm" {
+ version = "3.1.1"
+ hashes = [
+ "h1:47CqNwkxctJtL/N/JuEj+8QMg8mRNI/NWeKO5/ydfZU=",
+ "zh:1a6d5ce931708aec29d1f3d9e360c2a0c35ba5a54d03eeaff0ce3ca597cd0275",
+ "zh:3411919ba2a5941801e677f0fea08bdd0ae22ba3c9ce3309f55554699e06524a",
+ "zh:81b36138b8f2320dc7f877b50f9e38f4bc614affe68de885d322629dd0d16a29",
+ "zh:95a2a0a497a6082ee06f95b38bd0f0d6924a65722892a856cfd914c0d117f104",
+ "zh:9d3e78c2d1bb46508b972210ad706dd8c8b106f8b206ecf096cd211c54f46990",
+ "zh:a79139abf687387a6efdbbb04289a0a8e7eaca2bd91cdc0ce68ea4f3286c2c34",
+ "zh:aaa8784be125fbd50c48d84d6e171d3fb6ef84a221dbc5165c067ce05faab4c8",
+ "zh:afecd301f469975c9d8f350cc482fe656e082b6ab0f677d1a816c3c615837cc1",
+ "zh:c54c22b18d48ff9053d899d178d9ffef7d9d19785d9bf310a07d648b7aac075b",
+ "zh:db2eefd55aea48e73384a555c72bac3f7d428e24147bedb64e1a039398e5b903",
+ "zh:ee61666a233533fd2be971091cecc01650561f1585783c381b6f6e8a390198a4",
+ "zh:f569b65999264a9416862bca5cd2a6177d94ccb0424f3a4ef424428912b9cb3c",
+ ]
+}
+
+provider "registry.terraform.io/hashicorp/kubernetes" {
+ version = "3.0.1"
+ hashes = [
+ "h1:P0c8knzZnouTNFIRij8IS7+pqd0OKaFDYX0j4GRsiqo=",
+ "zh:02d55b0b2238fd17ffa12d5464593864e80f402b90b31f6e1bd02249b9727281",
+ "zh:20b93a51bfeed82682b3c12f09bac3031f5bdb4977c47c97a042e4df4fb2f9ba",
+ "zh:6e14486ecfaee38c09ccf33d4fdaf791409f90795c1b66e026c226fad8bc03c7",
+ "zh:8d0656ff422df94575668e32c310980193fccb1c28117e5c78dd2d4050a760a6",
+ "zh:9795119b30ec0c1baa99a79abace56ac850b6e6fbce60e7f6067792f6eb4b5f4",
+ "zh:b388c87acc40f6bd9620f4e23f01f3c7b41d9b88a68d5255dec0a72f0bdec249",
+ "zh:b59abd0a980649c2f97f172392f080eaeb18e486b603f83bf95f5d93aeccc090",
+ "zh:ba6e3060fddf4a022087d8f09e38aa0001c705f21170c2ded3d1c26c12f70d97",
+ "zh:c12626d044b1d5501cf95ca78cbe507c13ad1dd9f12d4736df66eb8e5f336eb8",
+ "zh:c55203240d50f4cdeb3df1e1760630d677679f5b1a6ffd9eba23662a4ad05119",
+ "zh:ea206a5a32d6e0d6e32f1849ad703da9a28355d9c516282a8458b5cf1502b2a1",
+ "zh:f569b65999264a9416862bca5cd2a6177d94ccb0424f3a4ef424428912b9cb3c",
+ ]
+}
diff --git a/stacks/blog/backend.tf b/stacks/blog/backend.tf
new file mode 100644
index 00000000..e91c1b32
--- /dev/null
+++ b/stacks/blog/backend.tf
@@ -0,0 +1,6 @@
+# Generated by Terragrunt. Sig: nIlQXj57tbuaRZEa
+terraform {
+ backend "local" {
+ path = "/Users/viktorbarzin/code/infra/state/stacks/blog/terraform.tfstate"
+ }
+}
diff --git a/stacks/blog/main.tf b/stacks/blog/main.tf
index 15aefede..6a0ec217 100644
--- a/stacks/blog/main.tf
+++ b/stacks/blog/main.tf
@@ -11,7 +11,7 @@ locals {
}
module "blog" {
- source = "../../modules/kubernetes/blog"
- tls_secret_name = var.tls_secret_name
- tier = local.tiers.aux
+ source = "./module"
+ tls_secret_name = var.tls_secret_name
+ tier = local.tiers.aux
}
diff --git a/modules/kubernetes/blog/main.tf b/stacks/blog/module/main.tf
similarity index 91%
rename from modules/kubernetes/blog/main.tf
rename to stacks/blog/module/main.tf
index eb02b035..e01b2d10 100644
--- a/modules/kubernetes/blog/main.tf
+++ b/stacks/blog/module/main.tf
@@ -13,13 +13,13 @@ resource "kubernetes_namespace" "website" {
}
module "tls_secret" {
- source = "../setup_tls_secret"
+ source = "../../../modules/kubernetes/setup_tls_secret"
namespace = kubernetes_namespace.website.metadata[0].name
tls_secret_name = var.tls_secret_name
}
# module "dockerhub_creds" {
-# source = "../dockerhub_secret"
+# source = "../../../modules/kubernetes/dockerhub_secret"
# namespace = kubernetes_namespace.website.metadata[0].name
# password = var.dockerhub_password
# }
@@ -110,7 +110,7 @@ resource "kubernetes_service" "blog" {
}
module "ingress" {
- source = "../ingress_factory"
+ source = "../../../modules/kubernetes/ingress_factory"
namespace = kubernetes_namespace.website.metadata[0].name
name = "blog"
service_name = "blog"
@@ -120,7 +120,7 @@ module "ingress" {
}
module "ingress-www" {
- source = "../ingress_factory"
+ source = "../../../modules/kubernetes/ingress_factory"
namespace = kubernetes_namespace.website.metadata[0].name
name = "blog-www"
service_name = "blog"
diff --git a/stacks/blog/providers.tf b/stacks/blog/providers.tf
new file mode 100644
index 00000000..516f9fed
--- /dev/null
+++ b/stacks/blog/providers.tf
@@ -0,0 +1,15 @@
+# Generated by Terragrunt. Sig: nIlQXj57tbuaRZEa
+variable "kube_config_path" {
+ type = string
+ default = "~/.kube/config"
+}
+
+provider "kubernetes" {
+ config_path = var.kube_config_path
+}
+
+provider "helm" {
+ kubernetes = {
+ config_path = var.kube_config_path
+ }
+}
diff --git a/stacks/blog/secrets b/stacks/blog/secrets
new file mode 120000
index 00000000..ca54a7cf
--- /dev/null
+++ b/stacks/blog/secrets
@@ -0,0 +1 @@
+../../secrets
\ No newline at end of file
diff --git a/stacks/calibre/.terraform.lock.hcl b/stacks/calibre/.terraform.lock.hcl
new file mode 100644
index 00000000..1e5d8b27
--- /dev/null
+++ b/stacks/calibre/.terraform.lock.hcl
@@ -0,0 +1,40 @@
+# This file is maintained automatically by "terraform init".
+# Manual edits may be lost in future updates.
+
+provider "registry.terraform.io/hashicorp/helm" {
+ version = "3.1.1"
+ hashes = [
+ "h1:47CqNwkxctJtL/N/JuEj+8QMg8mRNI/NWeKO5/ydfZU=",
+ "zh:1a6d5ce931708aec29d1f3d9e360c2a0c35ba5a54d03eeaff0ce3ca597cd0275",
+ "zh:3411919ba2a5941801e677f0fea08bdd0ae22ba3c9ce3309f55554699e06524a",
+ "zh:81b36138b8f2320dc7f877b50f9e38f4bc614affe68de885d322629dd0d16a29",
+ "zh:95a2a0a497a6082ee06f95b38bd0f0d6924a65722892a856cfd914c0d117f104",
+ "zh:9d3e78c2d1bb46508b972210ad706dd8c8b106f8b206ecf096cd211c54f46990",
+ "zh:a79139abf687387a6efdbbb04289a0a8e7eaca2bd91cdc0ce68ea4f3286c2c34",
+ "zh:aaa8784be125fbd50c48d84d6e171d3fb6ef84a221dbc5165c067ce05faab4c8",
+ "zh:afecd301f469975c9d8f350cc482fe656e082b6ab0f677d1a816c3c615837cc1",
+ "zh:c54c22b18d48ff9053d899d178d9ffef7d9d19785d9bf310a07d648b7aac075b",
+ "zh:db2eefd55aea48e73384a555c72bac3f7d428e24147bedb64e1a039398e5b903",
+ "zh:ee61666a233533fd2be971091cecc01650561f1585783c381b6f6e8a390198a4",
+ "zh:f569b65999264a9416862bca5cd2a6177d94ccb0424f3a4ef424428912b9cb3c",
+ ]
+}
+
+provider "registry.terraform.io/hashicorp/kubernetes" {
+ version = "3.0.1"
+ hashes = [
+ "h1:P0c8knzZnouTNFIRij8IS7+pqd0OKaFDYX0j4GRsiqo=",
+ "zh:02d55b0b2238fd17ffa12d5464593864e80f402b90b31f6e1bd02249b9727281",
+ "zh:20b93a51bfeed82682b3c12f09bac3031f5bdb4977c47c97a042e4df4fb2f9ba",
+ "zh:6e14486ecfaee38c09ccf33d4fdaf791409f90795c1b66e026c226fad8bc03c7",
+ "zh:8d0656ff422df94575668e32c310980193fccb1c28117e5c78dd2d4050a760a6",
+ "zh:9795119b30ec0c1baa99a79abace56ac850b6e6fbce60e7f6067792f6eb4b5f4",
+ "zh:b388c87acc40f6bd9620f4e23f01f3c7b41d9b88a68d5255dec0a72f0bdec249",
+ "zh:b59abd0a980649c2f97f172392f080eaeb18e486b603f83bf95f5d93aeccc090",
+ "zh:ba6e3060fddf4a022087d8f09e38aa0001c705f21170c2ded3d1c26c12f70d97",
+ "zh:c12626d044b1d5501cf95ca78cbe507c13ad1dd9f12d4736df66eb8e5f336eb8",
+ "zh:c55203240d50f4cdeb3df1e1760630d677679f5b1a6ffd9eba23662a4ad05119",
+ "zh:ea206a5a32d6e0d6e32f1849ad703da9a28355d9c516282a8458b5cf1502b2a1",
+ "zh:f569b65999264a9416862bca5cd2a6177d94ccb0424f3a4ef424428912b9cb3c",
+ ]
+}
diff --git a/stacks/calibre/backend.tf b/stacks/calibre/backend.tf
new file mode 100644
index 00000000..93431ff5
--- /dev/null
+++ b/stacks/calibre/backend.tf
@@ -0,0 +1,6 @@
+# Generated by Terragrunt. Sig: nIlQXj57tbuaRZEa
+terraform {
+ backend "local" {
+ path = "/Users/viktorbarzin/code/infra/state/stacks/calibre/terraform.tfstate"
+ }
+}
diff --git a/stacks/calibre/main.tf b/stacks/calibre/main.tf
index 4170c94d..8e2434ec 100644
--- a/stacks/calibre/main.tf
+++ b/stacks/calibre/main.tf
@@ -12,9 +12,9 @@ locals {
}
module "calibre" {
- source = "../../modules/kubernetes/calibre"
- tls_secret_name = var.tls_secret_name
- homepage_username = var.homepage_credentials["calibre-web"]["username"]
- homepage_password = var.homepage_credentials["calibre-web"]["password"]
- tier = local.tiers.edge
+ source = "./module"
+ tls_secret_name = var.tls_secret_name
+ homepage_username = var.homepage_credentials["calibre-web"]["username"]
+ homepage_password = var.homepage_credentials["calibre-web"]["password"]
+ tier = local.tiers.edge
}
diff --git a/modules/kubernetes/calibre/main.tf b/stacks/calibre/module/main.tf
similarity index 97%
rename from modules/kubernetes/calibre/main.tf
rename to stacks/calibre/module/main.tf
index a2ac3ff1..fe444ed0 100644
--- a/modules/kubernetes/calibre/main.tf
+++ b/stacks/calibre/module/main.tf
@@ -20,7 +20,7 @@ resource "kubernetes_namespace" "calibre" {
}
module "tls_secret" {
- source = "../setup_tls_secret"
+ source = "../../../modules/kubernetes/setup_tls_secret"
namespace = kubernetes_namespace.calibre.metadata[0].name
tls_secret_name = var.tls_secret_name
}
@@ -222,7 +222,7 @@ resource "kubernetes_service" "calibre" {
}
module "ingress" {
- source = "../ingress_factory"
+ source = "../../../modules/kubernetes/ingress_factory"
namespace = kubernetes_namespace.calibre.metadata[0].name
name = "calibre"
tls_secret_name = var.tls_secret_name
@@ -325,7 +325,7 @@ resource "kubernetes_service" "annas-archive-stacks" {
}
module "stacks-ingress" {
- source = "../ingress_factory"
+ source = "../../../modules/kubernetes/ingress_factory"
namespace = kubernetes_namespace.calibre.metadata[0].name
name = "stacks"
service_name = "annas-archive-stacks"
diff --git a/stacks/calibre/providers.tf b/stacks/calibre/providers.tf
new file mode 100644
index 00000000..516f9fed
--- /dev/null
+++ b/stacks/calibre/providers.tf
@@ -0,0 +1,15 @@
+# Generated by Terragrunt. Sig: nIlQXj57tbuaRZEa
+variable "kube_config_path" {
+ type = string
+ default = "~/.kube/config"
+}
+
+provider "kubernetes" {
+ config_path = var.kube_config_path
+}
+
+provider "helm" {
+ kubernetes = {
+ config_path = var.kube_config_path
+ }
+}
diff --git a/stacks/calibre/secrets b/stacks/calibre/secrets
new file mode 120000
index 00000000..ca54a7cf
--- /dev/null
+++ b/stacks/calibre/secrets
@@ -0,0 +1 @@
+../../secrets
\ No newline at end of file
diff --git a/stacks/changedetection/.terraform.lock.hcl b/stacks/changedetection/.terraform.lock.hcl
new file mode 100644
index 00000000..1e5d8b27
--- /dev/null
+++ b/stacks/changedetection/.terraform.lock.hcl
@@ -0,0 +1,40 @@
+# This file is maintained automatically by "terraform init".
+# Manual edits may be lost in future updates.
+
+provider "registry.terraform.io/hashicorp/helm" {
+ version = "3.1.1"
+ hashes = [
+ "h1:47CqNwkxctJtL/N/JuEj+8QMg8mRNI/NWeKO5/ydfZU=",
+ "zh:1a6d5ce931708aec29d1f3d9e360c2a0c35ba5a54d03eeaff0ce3ca597cd0275",
+ "zh:3411919ba2a5941801e677f0fea08bdd0ae22ba3c9ce3309f55554699e06524a",
+ "zh:81b36138b8f2320dc7f877b50f9e38f4bc614affe68de885d322629dd0d16a29",
+ "zh:95a2a0a497a6082ee06f95b38bd0f0d6924a65722892a856cfd914c0d117f104",
+ "zh:9d3e78c2d1bb46508b972210ad706dd8c8b106f8b206ecf096cd211c54f46990",
+ "zh:a79139abf687387a6efdbbb04289a0a8e7eaca2bd91cdc0ce68ea4f3286c2c34",
+ "zh:aaa8784be125fbd50c48d84d6e171d3fb6ef84a221dbc5165c067ce05faab4c8",
+ "zh:afecd301f469975c9d8f350cc482fe656e082b6ab0f677d1a816c3c615837cc1",
+ "zh:c54c22b18d48ff9053d899d178d9ffef7d9d19785d9bf310a07d648b7aac075b",
+ "zh:db2eefd55aea48e73384a555c72bac3f7d428e24147bedb64e1a039398e5b903",
+ "zh:ee61666a233533fd2be971091cecc01650561f1585783c381b6f6e8a390198a4",
+ "zh:f569b65999264a9416862bca5cd2a6177d94ccb0424f3a4ef424428912b9cb3c",
+ ]
+}
+
+provider "registry.terraform.io/hashicorp/kubernetes" {
+ version = "3.0.1"
+ hashes = [
+ "h1:P0c8knzZnouTNFIRij8IS7+pqd0OKaFDYX0j4GRsiqo=",
+ "zh:02d55b0b2238fd17ffa12d5464593864e80f402b90b31f6e1bd02249b9727281",
+ "zh:20b93a51bfeed82682b3c12f09bac3031f5bdb4977c47c97a042e4df4fb2f9ba",
+ "zh:6e14486ecfaee38c09ccf33d4fdaf791409f90795c1b66e026c226fad8bc03c7",
+ "zh:8d0656ff422df94575668e32c310980193fccb1c28117e5c78dd2d4050a760a6",
+ "zh:9795119b30ec0c1baa99a79abace56ac850b6e6fbce60e7f6067792f6eb4b5f4",
+ "zh:b388c87acc40f6bd9620f4e23f01f3c7b41d9b88a68d5255dec0a72f0bdec249",
+ "zh:b59abd0a980649c2f97f172392f080eaeb18e486b603f83bf95f5d93aeccc090",
+ "zh:ba6e3060fddf4a022087d8f09e38aa0001c705f21170c2ded3d1c26c12f70d97",
+ "zh:c12626d044b1d5501cf95ca78cbe507c13ad1dd9f12d4736df66eb8e5f336eb8",
+ "zh:c55203240d50f4cdeb3df1e1760630d677679f5b1a6ffd9eba23662a4ad05119",
+ "zh:ea206a5a32d6e0d6e32f1849ad703da9a28355d9c516282a8458b5cf1502b2a1",
+ "zh:f569b65999264a9416862bca5cd2a6177d94ccb0424f3a4ef424428912b9cb3c",
+ ]
+}
diff --git a/stacks/changedetection/backend.tf b/stacks/changedetection/backend.tf
new file mode 100644
index 00000000..a0c7d0a9
--- /dev/null
+++ b/stacks/changedetection/backend.tf
@@ -0,0 +1,6 @@
+# Generated by Terragrunt. Sig: nIlQXj57tbuaRZEa
+terraform {
+ backend "local" {
+ path = "/Users/viktorbarzin/code/infra/state/stacks/changedetection/terraform.tfstate"
+ }
+}
diff --git a/stacks/changedetection/main.tf b/stacks/changedetection/main.tf
index c6996e46..0be18513 100644
--- a/stacks/changedetection/main.tf
+++ b/stacks/changedetection/main.tf
@@ -11,7 +11,7 @@ locals {
}
module "changedetection" {
- source = "../../modules/kubernetes/changedetection"
- tls_secret_name = var.tls_secret_name
- tier = local.tiers.aux
+ source = "./module"
+ tls_secret_name = var.tls_secret_name
+ tier = local.tiers.aux
}
diff --git a/modules/kubernetes/changedetection/main.tf b/stacks/changedetection/module/main.tf
similarity index 95%
rename from modules/kubernetes/changedetection/main.tf
rename to stacks/changedetection/module/main.tf
index e7dca791..b5c99704 100644
--- a/modules/kubernetes/changedetection/main.tf
+++ b/stacks/changedetection/module/main.tf
@@ -12,7 +12,7 @@ resource "kubernetes_namespace" "changedetection" {
}
module "tls_secret" {
- source = "../setup_tls_secret"
+ source = "../../../modules/kubernetes/setup_tls_secret"
namespace = kubernetes_namespace.changedetection.metadata[0].name
tls_secret_name = var.tls_secret_name
}
@@ -124,7 +124,7 @@ resource "kubernetes_service" "changedetection" {
}
module "ingress" {
- source = "../ingress_factory"
+ source = "../../../modules/kubernetes/ingress_factory"
namespace = kubernetes_namespace.changedetection.metadata[0].name
name = "changedetection"
tls_secret_name = var.tls_secret_name
diff --git a/stacks/changedetection/providers.tf b/stacks/changedetection/providers.tf
new file mode 100644
index 00000000..516f9fed
--- /dev/null
+++ b/stacks/changedetection/providers.tf
@@ -0,0 +1,15 @@
+# Generated by Terragrunt. Sig: nIlQXj57tbuaRZEa
+variable "kube_config_path" {
+ type = string
+ default = "~/.kube/config"
+}
+
+provider "kubernetes" {
+ config_path = var.kube_config_path
+}
+
+provider "helm" {
+ kubernetes = {
+ config_path = var.kube_config_path
+ }
+}
diff --git a/stacks/changedetection/secrets b/stacks/changedetection/secrets
new file mode 120000
index 00000000..ca54a7cf
--- /dev/null
+++ b/stacks/changedetection/secrets
@@ -0,0 +1 @@
+../../secrets
\ No newline at end of file
diff --git a/stacks/city-guesser/.terraform.lock.hcl b/stacks/city-guesser/.terraform.lock.hcl
new file mode 100644
index 00000000..1e5d8b27
--- /dev/null
+++ b/stacks/city-guesser/.terraform.lock.hcl
@@ -0,0 +1,40 @@
+# This file is maintained automatically by "terraform init".
+# Manual edits may be lost in future updates.
+
+provider "registry.terraform.io/hashicorp/helm" {
+ version = "3.1.1"
+ hashes = [
+ "h1:47CqNwkxctJtL/N/JuEj+8QMg8mRNI/NWeKO5/ydfZU=",
+ "zh:1a6d5ce931708aec29d1f3d9e360c2a0c35ba5a54d03eeaff0ce3ca597cd0275",
+ "zh:3411919ba2a5941801e677f0fea08bdd0ae22ba3c9ce3309f55554699e06524a",
+ "zh:81b36138b8f2320dc7f877b50f9e38f4bc614affe68de885d322629dd0d16a29",
+ "zh:95a2a0a497a6082ee06f95b38bd0f0d6924a65722892a856cfd914c0d117f104",
+ "zh:9d3e78c2d1bb46508b972210ad706dd8c8b106f8b206ecf096cd211c54f46990",
+ "zh:a79139abf687387a6efdbbb04289a0a8e7eaca2bd91cdc0ce68ea4f3286c2c34",
+ "zh:aaa8784be125fbd50c48d84d6e171d3fb6ef84a221dbc5165c067ce05faab4c8",
+ "zh:afecd301f469975c9d8f350cc482fe656e082b6ab0f677d1a816c3c615837cc1",
+ "zh:c54c22b18d48ff9053d899d178d9ffef7d9d19785d9bf310a07d648b7aac075b",
+ "zh:db2eefd55aea48e73384a555c72bac3f7d428e24147bedb64e1a039398e5b903",
+ "zh:ee61666a233533fd2be971091cecc01650561f1585783c381b6f6e8a390198a4",
+ "zh:f569b65999264a9416862bca5cd2a6177d94ccb0424f3a4ef424428912b9cb3c",
+ ]
+}
+
+provider "registry.terraform.io/hashicorp/kubernetes" {
+ version = "3.0.1"
+ hashes = [
+ "h1:P0c8knzZnouTNFIRij8IS7+pqd0OKaFDYX0j4GRsiqo=",
+ "zh:02d55b0b2238fd17ffa12d5464593864e80f402b90b31f6e1bd02249b9727281",
+ "zh:20b93a51bfeed82682b3c12f09bac3031f5bdb4977c47c97a042e4df4fb2f9ba",
+ "zh:6e14486ecfaee38c09ccf33d4fdaf791409f90795c1b66e026c226fad8bc03c7",
+ "zh:8d0656ff422df94575668e32c310980193fccb1c28117e5c78dd2d4050a760a6",
+ "zh:9795119b30ec0c1baa99a79abace56ac850b6e6fbce60e7f6067792f6eb4b5f4",
+ "zh:b388c87acc40f6bd9620f4e23f01f3c7b41d9b88a68d5255dec0a72f0bdec249",
+ "zh:b59abd0a980649c2f97f172392f080eaeb18e486b603f83bf95f5d93aeccc090",
+ "zh:ba6e3060fddf4a022087d8f09e38aa0001c705f21170c2ded3d1c26c12f70d97",
+ "zh:c12626d044b1d5501cf95ca78cbe507c13ad1dd9f12d4736df66eb8e5f336eb8",
+ "zh:c55203240d50f4cdeb3df1e1760630d677679f5b1a6ffd9eba23662a4ad05119",
+ "zh:ea206a5a32d6e0d6e32f1849ad703da9a28355d9c516282a8458b5cf1502b2a1",
+ "zh:f569b65999264a9416862bca5cd2a6177d94ccb0424f3a4ef424428912b9cb3c",
+ ]
+}
diff --git a/stacks/city-guesser/backend.tf b/stacks/city-guesser/backend.tf
new file mode 100644
index 00000000..92290eb7
--- /dev/null
+++ b/stacks/city-guesser/backend.tf
@@ -0,0 +1,6 @@
+# Generated by Terragrunt. Sig: nIlQXj57tbuaRZEa
+terraform {
+ backend "local" {
+ path = "/Users/viktorbarzin/code/infra/state/stacks/city-guesser/terraform.tfstate"
+ }
+}
diff --git a/stacks/city-guesser/main.tf b/stacks/city-guesser/main.tf
index 70e5d965..422497b4 100644
--- a/stacks/city-guesser/main.tf
+++ b/stacks/city-guesser/main.tf
@@ -11,7 +11,7 @@ locals {
}
module "city-guesser" {
- source = "../../modules/kubernetes/city-guesser"
- tls_secret_name = var.tls_secret_name
- tier = local.tiers.aux
+ source = "./module"
+ tls_secret_name = var.tls_secret_name
+ tier = local.tiers.aux
}
diff --git a/stacks/city-guesser/module/main.tf b/stacks/city-guesser/module/main.tf
new file mode 100644
index 00000000..b1ece574
--- /dev/null
+++ b/stacks/city-guesser/module/main.tf
@@ -0,0 +1,154 @@
+variable "tls_secret_name" {}
+variable "tier" { type = string }
+
+resource "kubernetes_namespace" "city-guesser" {
+ metadata {
+ name = "city-guesser"
+ labels = {
+ "istio-injection" : "disabled"
+ tier = var.tier
+ }
+ }
+}
+
+module "tls_secret" {
+ source = "../../../modules/kubernetes/setup_tls_secret"
+ namespace = "city-guesser"
+ tls_secret_name = var.tls_secret_name
+}
+
+resource "kubernetes_deployment" "city-guesser" {
+ metadata {
+ name = "city-guesser"
+ namespace = "city-guesser"
+ labels = {
+ run = "city-guesser"
+ tier = var.tier
+ }
+ }
+ spec {
+ replicas = 1
+ selector {
+ match_labels = {
+ run = "city-guesser"
+ }
+ }
+ template {
+ metadata {
+ labels = {
+ run = "city-guesser"
+ }
+ }
+ spec {
+ container {
+ image = "viktorbarzin/city-guesser:latest"
+ name = "city-guesser"
+ resources {
+ limits = {
+ cpu = "0.5"
+ memory = "512Mi"
+ }
+ requests = {
+ cpu = "250m"
+ memory = "50Mi"
+ }
+ }
+ port {
+ container_port = 80
+ }
+ }
+ }
+ }
+ }
+}
+
+resource "kubernetes_service" "city-guesser" {
+ metadata {
+ name = "city-guesser"
+ namespace = "city-guesser"
+ labels = {
+ "run" = "city-guesser"
+ }
+ }
+
+ spec {
+ selector = {
+ run = "city-guesser"
+ }
+ port {
+ name = "http"
+ port = "80"
+ target_port = "80"
+ }
+ }
+}
+# resource "kubernetes_service" "city-guesser-oauth" {
+# metadata {
+# name = "city-guesser-oauth"
+# namespace = "city-guesser"
+# labels = {
+# "run" = "city-guesser-oauth"
+# }
+# }
+
+# spec {
+# type = "ExternalName"
+# external_name = "oauth-proxy.oauth.svc.cluster.local"
+
+# # port {
+# # name = "tcp"
+# # port = "80"
+# # target_port = "80"
+# # }
+# }
+# }
+
+module "ingress" {
+ source = "../../../modules/kubernetes/ingress_factory"
+ namespace = "city-guesser"
+ name = "city-guesser"
+ tls_secret_name = var.tls_secret_name
+ protected = true
+}
+
+# resource "kubernetes_ingress_v1" "city-guesser-oauth" {
+# metadata {
+# name = "city-guesser-ingress-oauth"
+# namespace = "city-guesser"
+# annotations = {
+# "kubernetes.io/ingress.class" = "nginx"
+# }
+# }
+
+# spec {
+# tls {
+# hosts = ["city-guesser.viktorbarzin.me"]
+# secret_name = var.tls_secret_name
+# }
+# rule {
+# host = "city-guesser.viktorbarzin.me"
+# http {
+# path {
+# path = "/oauth2"
+# backend {
+# service_name = "city-guesser-oauth"
+# service_port = "80"
+# }
+# }
+# }
+# }
+# }
+# }
+
+
+# module "oauth" {
+# source = "../../../modules/kubernetes/oauth-proxy"
+# # oauth_client_id = "3d8ce4bf7b893899d967"
+# # oauth_client_secret = "REDACTED_OAUTH_SECRET"
+# client_id = "3d8ce4bf7b893899d967"
+# client_secret = "REDACTED_OAUTH_SECRET"
+# namespace = "city-guesser"
+# host = "city-guesser.viktorbarzin.me"
+# tls_secret_name = var.tls_secret_name
+# svc_name = "city-guesser-oauth"
+# }
diff --git a/stacks/city-guesser/providers.tf b/stacks/city-guesser/providers.tf
new file mode 100644
index 00000000..516f9fed
--- /dev/null
+++ b/stacks/city-guesser/providers.tf
@@ -0,0 +1,15 @@
+# Generated by Terragrunt. Sig: nIlQXj57tbuaRZEa
+variable "kube_config_path" {
+ type = string
+ default = "~/.kube/config"
+}
+
+provider "kubernetes" {
+ config_path = var.kube_config_path
+}
+
+provider "helm" {
+ kubernetes = {
+ config_path = var.kube_config_path
+ }
+}
diff --git a/stacks/city-guesser/secrets b/stacks/city-guesser/secrets
new file mode 120000
index 00000000..ca54a7cf
--- /dev/null
+++ b/stacks/city-guesser/secrets
@@ -0,0 +1 @@
+../../secrets
\ No newline at end of file
diff --git a/stacks/coturn/.terraform.lock.hcl b/stacks/coturn/.terraform.lock.hcl
new file mode 100644
index 00000000..1e5d8b27
--- /dev/null
+++ b/stacks/coturn/.terraform.lock.hcl
@@ -0,0 +1,40 @@
+# This file is maintained automatically by "terraform init".
+# Manual edits may be lost in future updates.
+
+provider "registry.terraform.io/hashicorp/helm" {
+ version = "3.1.1"
+ hashes = [
+ "h1:47CqNwkxctJtL/N/JuEj+8QMg8mRNI/NWeKO5/ydfZU=",
+ "zh:1a6d5ce931708aec29d1f3d9e360c2a0c35ba5a54d03eeaff0ce3ca597cd0275",
+ "zh:3411919ba2a5941801e677f0fea08bdd0ae22ba3c9ce3309f55554699e06524a",
+ "zh:81b36138b8f2320dc7f877b50f9e38f4bc614affe68de885d322629dd0d16a29",
+ "zh:95a2a0a497a6082ee06f95b38bd0f0d6924a65722892a856cfd914c0d117f104",
+ "zh:9d3e78c2d1bb46508b972210ad706dd8c8b106f8b206ecf096cd211c54f46990",
+ "zh:a79139abf687387a6efdbbb04289a0a8e7eaca2bd91cdc0ce68ea4f3286c2c34",
+ "zh:aaa8784be125fbd50c48d84d6e171d3fb6ef84a221dbc5165c067ce05faab4c8",
+ "zh:afecd301f469975c9d8f350cc482fe656e082b6ab0f677d1a816c3c615837cc1",
+ "zh:c54c22b18d48ff9053d899d178d9ffef7d9d19785d9bf310a07d648b7aac075b",
+ "zh:db2eefd55aea48e73384a555c72bac3f7d428e24147bedb64e1a039398e5b903",
+ "zh:ee61666a233533fd2be971091cecc01650561f1585783c381b6f6e8a390198a4",
+ "zh:f569b65999264a9416862bca5cd2a6177d94ccb0424f3a4ef424428912b9cb3c",
+ ]
+}
+
+provider "registry.terraform.io/hashicorp/kubernetes" {
+ version = "3.0.1"
+ hashes = [
+ "h1:P0c8knzZnouTNFIRij8IS7+pqd0OKaFDYX0j4GRsiqo=",
+ "zh:02d55b0b2238fd17ffa12d5464593864e80f402b90b31f6e1bd02249b9727281",
+ "zh:20b93a51bfeed82682b3c12f09bac3031f5bdb4977c47c97a042e4df4fb2f9ba",
+ "zh:6e14486ecfaee38c09ccf33d4fdaf791409f90795c1b66e026c226fad8bc03c7",
+ "zh:8d0656ff422df94575668e32c310980193fccb1c28117e5c78dd2d4050a760a6",
+ "zh:9795119b30ec0c1baa99a79abace56ac850b6e6fbce60e7f6067792f6eb4b5f4",
+ "zh:b388c87acc40f6bd9620f4e23f01f3c7b41d9b88a68d5255dec0a72f0bdec249",
+ "zh:b59abd0a980649c2f97f172392f080eaeb18e486b603f83bf95f5d93aeccc090",
+ "zh:ba6e3060fddf4a022087d8f09e38aa0001c705f21170c2ded3d1c26c12f70d97",
+ "zh:c12626d044b1d5501cf95ca78cbe507c13ad1dd9f12d4736df66eb8e5f336eb8",
+ "zh:c55203240d50f4cdeb3df1e1760630d677679f5b1a6ffd9eba23662a4ad05119",
+ "zh:ea206a5a32d6e0d6e32f1849ad703da9a28355d9c516282a8458b5cf1502b2a1",
+ "zh:f569b65999264a9416862bca5cd2a6177d94ccb0424f3a4ef424428912b9cb3c",
+ ]
+}
diff --git a/stacks/coturn/backend.tf b/stacks/coturn/backend.tf
new file mode 100644
index 00000000..a160e22c
--- /dev/null
+++ b/stacks/coturn/backend.tf
@@ -0,0 +1,6 @@
+# Generated by Terragrunt. Sig: nIlQXj57tbuaRZEa
+terraform {
+ backend "local" {
+ path = "/Users/viktorbarzin/code/infra/state/stacks/coturn/terraform.tfstate"
+ }
+}
diff --git a/stacks/coturn/main.tf b/stacks/coturn/main.tf
index 38be5240..d1ceadff 100644
--- a/stacks/coturn/main.tf
+++ b/stacks/coturn/main.tf
@@ -13,9 +13,9 @@ locals {
}
module "coturn" {
- source = "../../modules/kubernetes/coturn"
- tls_secret_name = var.tls_secret_name
- tier = local.tiers.edge
- turn_secret = var.coturn_turn_secret
- public_ip = var.public_ip
+ source = "./module"
+ tls_secret_name = var.tls_secret_name
+ tier = local.tiers.edge
+ turn_secret = var.coturn_turn_secret
+ public_ip = var.public_ip
}
diff --git a/modules/kubernetes/coturn/main.tf b/stacks/coturn/module/main.tf
similarity index 98%
rename from modules/kubernetes/coturn/main.tf
rename to stacks/coturn/module/main.tf
index c580a7a5..abbd5ecf 100644
--- a/modules/kubernetes/coturn/main.tf
+++ b/stacks/coturn/module/main.tf
@@ -21,7 +21,7 @@ resource "kubernetes_namespace" "coturn" {
}
module "tls_secret" {
- source = "../setup_tls_secret"
+ source = "../../../modules/kubernetes/setup_tls_secret"
namespace = kubernetes_namespace.coturn.metadata[0].name
tls_secret_name = var.tls_secret_name
}
diff --git a/stacks/coturn/providers.tf b/stacks/coturn/providers.tf
new file mode 100644
index 00000000..516f9fed
--- /dev/null
+++ b/stacks/coturn/providers.tf
@@ -0,0 +1,15 @@
+# Generated by Terragrunt. Sig: nIlQXj57tbuaRZEa
+variable "kube_config_path" {
+ type = string
+ default = "~/.kube/config"
+}
+
+provider "kubernetes" {
+ config_path = var.kube_config_path
+}
+
+provider "helm" {
+ kubernetes = {
+ config_path = var.kube_config_path
+ }
+}
diff --git a/stacks/coturn/secrets b/stacks/coturn/secrets
new file mode 120000
index 00000000..ca54a7cf
--- /dev/null
+++ b/stacks/coturn/secrets
@@ -0,0 +1 @@
+../../secrets
\ No newline at end of file
diff --git a/stacks/cyberchef/.terraform.lock.hcl b/stacks/cyberchef/.terraform.lock.hcl
new file mode 100644
index 00000000..1e5d8b27
--- /dev/null
+++ b/stacks/cyberchef/.terraform.lock.hcl
@@ -0,0 +1,40 @@
+# This file is maintained automatically by "terraform init".
+# Manual edits may be lost in future updates.
+
+provider "registry.terraform.io/hashicorp/helm" {
+ version = "3.1.1"
+ hashes = [
+ "h1:47CqNwkxctJtL/N/JuEj+8QMg8mRNI/NWeKO5/ydfZU=",
+ "zh:1a6d5ce931708aec29d1f3d9e360c2a0c35ba5a54d03eeaff0ce3ca597cd0275",
+ "zh:3411919ba2a5941801e677f0fea08bdd0ae22ba3c9ce3309f55554699e06524a",
+ "zh:81b36138b8f2320dc7f877b50f9e38f4bc614affe68de885d322629dd0d16a29",
+ "zh:95a2a0a497a6082ee06f95b38bd0f0d6924a65722892a856cfd914c0d117f104",
+ "zh:9d3e78c2d1bb46508b972210ad706dd8c8b106f8b206ecf096cd211c54f46990",
+ "zh:a79139abf687387a6efdbbb04289a0a8e7eaca2bd91cdc0ce68ea4f3286c2c34",
+ "zh:aaa8784be125fbd50c48d84d6e171d3fb6ef84a221dbc5165c067ce05faab4c8",
+ "zh:afecd301f469975c9d8f350cc482fe656e082b6ab0f677d1a816c3c615837cc1",
+ "zh:c54c22b18d48ff9053d899d178d9ffef7d9d19785d9bf310a07d648b7aac075b",
+ "zh:db2eefd55aea48e73384a555c72bac3f7d428e24147bedb64e1a039398e5b903",
+ "zh:ee61666a233533fd2be971091cecc01650561f1585783c381b6f6e8a390198a4",
+ "zh:f569b65999264a9416862bca5cd2a6177d94ccb0424f3a4ef424428912b9cb3c",
+ ]
+}
+
+provider "registry.terraform.io/hashicorp/kubernetes" {
+ version = "3.0.1"
+ hashes = [
+ "h1:P0c8knzZnouTNFIRij8IS7+pqd0OKaFDYX0j4GRsiqo=",
+ "zh:02d55b0b2238fd17ffa12d5464593864e80f402b90b31f6e1bd02249b9727281",
+ "zh:20b93a51bfeed82682b3c12f09bac3031f5bdb4977c47c97a042e4df4fb2f9ba",
+ "zh:6e14486ecfaee38c09ccf33d4fdaf791409f90795c1b66e026c226fad8bc03c7",
+ "zh:8d0656ff422df94575668e32c310980193fccb1c28117e5c78dd2d4050a760a6",
+ "zh:9795119b30ec0c1baa99a79abace56ac850b6e6fbce60e7f6067792f6eb4b5f4",
+ "zh:b388c87acc40f6bd9620f4e23f01f3c7b41d9b88a68d5255dec0a72f0bdec249",
+ "zh:b59abd0a980649c2f97f172392f080eaeb18e486b603f83bf95f5d93aeccc090",
+ "zh:ba6e3060fddf4a022087d8f09e38aa0001c705f21170c2ded3d1c26c12f70d97",
+ "zh:c12626d044b1d5501cf95ca78cbe507c13ad1dd9f12d4736df66eb8e5f336eb8",
+ "zh:c55203240d50f4cdeb3df1e1760630d677679f5b1a6ffd9eba23662a4ad05119",
+ "zh:ea206a5a32d6e0d6e32f1849ad703da9a28355d9c516282a8458b5cf1502b2a1",
+ "zh:f569b65999264a9416862bca5cd2a6177d94ccb0424f3a4ef424428912b9cb3c",
+ ]
+}
diff --git a/stacks/cyberchef/backend.tf b/stacks/cyberchef/backend.tf
new file mode 100644
index 00000000..87e2ee96
--- /dev/null
+++ b/stacks/cyberchef/backend.tf
@@ -0,0 +1,6 @@
+# Generated by Terragrunt. Sig: nIlQXj57tbuaRZEa
+terraform {
+ backend "local" {
+ path = "/Users/viktorbarzin/code/infra/state/stacks/cyberchef/terraform.tfstate"
+ }
+}
diff --git a/stacks/cyberchef/main.tf b/stacks/cyberchef/main.tf
index a331e2fa..ad338c05 100644
--- a/stacks/cyberchef/main.tf
+++ b/stacks/cyberchef/main.tf
@@ -11,7 +11,7 @@ locals {
}
module "cyberchef" {
- source = "../../modules/kubernetes/cyberchef"
- tls_secret_name = var.tls_secret_name
- tier = local.tiers.aux
+ source = "./module"
+ tls_secret_name = var.tls_secret_name
+ tier = local.tiers.aux
}
diff --git a/modules/kubernetes/cyberchef/main.tf b/stacks/cyberchef/module/main.tf
similarity index 92%
rename from modules/kubernetes/cyberchef/main.tf
rename to stacks/cyberchef/module/main.tf
index 5f707e29..e0c5970b 100644
--- a/modules/kubernetes/cyberchef/main.tf
+++ b/stacks/cyberchef/module/main.tf
@@ -10,7 +10,7 @@ resource "kubernetes_namespace" "cyberchef" {
}
module "tls_secret" {
- source = "../setup_tls_secret"
+ source = "../../../modules/kubernetes/setup_tls_secret"
namespace = kubernetes_namespace.cyberchef.metadata[0].name
tls_secret_name = var.tls_secret_name
}
@@ -80,7 +80,7 @@ resource "kubernetes_service" "cyberchef" {
module "ingress" {
- source = "../ingress_factory"
+ source = "../../../modules/kubernetes/ingress_factory"
namespace = kubernetes_namespace.cyberchef.metadata[0].name
name = "cc"
tls_secret_name = var.tls_secret_name
diff --git a/stacks/cyberchef/providers.tf b/stacks/cyberchef/providers.tf
new file mode 100644
index 00000000..516f9fed
--- /dev/null
+++ b/stacks/cyberchef/providers.tf
@@ -0,0 +1,15 @@
+# Generated by Terragrunt. Sig: nIlQXj57tbuaRZEa
+variable "kube_config_path" {
+ type = string
+ default = "~/.kube/config"
+}
+
+provider "kubernetes" {
+ config_path = var.kube_config_path
+}
+
+provider "helm" {
+ kubernetes = {
+ config_path = var.kube_config_path
+ }
+}
diff --git a/stacks/cyberchef/secrets b/stacks/cyberchef/secrets
new file mode 120000
index 00000000..ca54a7cf
--- /dev/null
+++ b/stacks/cyberchef/secrets
@@ -0,0 +1 @@
+../../secrets
\ No newline at end of file
diff --git a/stacks/dashy/.terraform.lock.hcl b/stacks/dashy/.terraform.lock.hcl
new file mode 100644
index 00000000..1e5d8b27
--- /dev/null
+++ b/stacks/dashy/.terraform.lock.hcl
@@ -0,0 +1,40 @@
+# This file is maintained automatically by "terraform init".
+# Manual edits may be lost in future updates.
+
+provider "registry.terraform.io/hashicorp/helm" {
+ version = "3.1.1"
+ hashes = [
+ "h1:47CqNwkxctJtL/N/JuEj+8QMg8mRNI/NWeKO5/ydfZU=",
+ "zh:1a6d5ce931708aec29d1f3d9e360c2a0c35ba5a54d03eeaff0ce3ca597cd0275",
+ "zh:3411919ba2a5941801e677f0fea08bdd0ae22ba3c9ce3309f55554699e06524a",
+ "zh:81b36138b8f2320dc7f877b50f9e38f4bc614affe68de885d322629dd0d16a29",
+ "zh:95a2a0a497a6082ee06f95b38bd0f0d6924a65722892a856cfd914c0d117f104",
+ "zh:9d3e78c2d1bb46508b972210ad706dd8c8b106f8b206ecf096cd211c54f46990",
+ "zh:a79139abf687387a6efdbbb04289a0a8e7eaca2bd91cdc0ce68ea4f3286c2c34",
+ "zh:aaa8784be125fbd50c48d84d6e171d3fb6ef84a221dbc5165c067ce05faab4c8",
+ "zh:afecd301f469975c9d8f350cc482fe656e082b6ab0f677d1a816c3c615837cc1",
+ "zh:c54c22b18d48ff9053d899d178d9ffef7d9d19785d9bf310a07d648b7aac075b",
+ "zh:db2eefd55aea48e73384a555c72bac3f7d428e24147bedb64e1a039398e5b903",
+ "zh:ee61666a233533fd2be971091cecc01650561f1585783c381b6f6e8a390198a4",
+ "zh:f569b65999264a9416862bca5cd2a6177d94ccb0424f3a4ef424428912b9cb3c",
+ ]
+}
+
+provider "registry.terraform.io/hashicorp/kubernetes" {
+ version = "3.0.1"
+ hashes = [
+ "h1:P0c8knzZnouTNFIRij8IS7+pqd0OKaFDYX0j4GRsiqo=",
+ "zh:02d55b0b2238fd17ffa12d5464593864e80f402b90b31f6e1bd02249b9727281",
+ "zh:20b93a51bfeed82682b3c12f09bac3031f5bdb4977c47c97a042e4df4fb2f9ba",
+ "zh:6e14486ecfaee38c09ccf33d4fdaf791409f90795c1b66e026c226fad8bc03c7",
+ "zh:8d0656ff422df94575668e32c310980193fccb1c28117e5c78dd2d4050a760a6",
+ "zh:9795119b30ec0c1baa99a79abace56ac850b6e6fbce60e7f6067792f6eb4b5f4",
+ "zh:b388c87acc40f6bd9620f4e23f01f3c7b41d9b88a68d5255dec0a72f0bdec249",
+ "zh:b59abd0a980649c2f97f172392f080eaeb18e486b603f83bf95f5d93aeccc090",
+ "zh:ba6e3060fddf4a022087d8f09e38aa0001c705f21170c2ded3d1c26c12f70d97",
+ "zh:c12626d044b1d5501cf95ca78cbe507c13ad1dd9f12d4736df66eb8e5f336eb8",
+ "zh:c55203240d50f4cdeb3df1e1760630d677679f5b1a6ffd9eba23662a4ad05119",
+ "zh:ea206a5a32d6e0d6e32f1849ad703da9a28355d9c516282a8458b5cf1502b2a1",
+ "zh:f569b65999264a9416862bca5cd2a6177d94ccb0424f3a4ef424428912b9cb3c",
+ ]
+}
diff --git a/stacks/dashy/backend.tf b/stacks/dashy/backend.tf
new file mode 100644
index 00000000..b1f5cb0b
--- /dev/null
+++ b/stacks/dashy/backend.tf
@@ -0,0 +1,6 @@
+# Generated by Terragrunt. Sig: nIlQXj57tbuaRZEa
+terraform {
+ backend "local" {
+ path = "/Users/viktorbarzin/code/infra/state/stacks/dashy/terraform.tfstate"
+ }
+}
diff --git a/stacks/dashy/main.tf b/stacks/dashy/main.tf
index ea12817f..40b7eb84 100644
--- a/stacks/dashy/main.tf
+++ b/stacks/dashy/main.tf
@@ -11,7 +11,7 @@ locals {
}
module "dashy" {
- source = "../../modules/kubernetes/dashy"
- tls_secret_name = var.tls_secret_name
- tier = local.tiers.aux
+ source = "./module"
+ tls_secret_name = var.tls_secret_name
+ tier = local.tiers.aux
}
diff --git a/modules/kubernetes/dashy/conf.yml b/stacks/dashy/module/conf.yml
similarity index 100%
rename from modules/kubernetes/dashy/conf.yml
rename to stacks/dashy/module/conf.yml
diff --git a/modules/kubernetes/dashy/main.tf b/stacks/dashy/module/main.tf
similarity index 94%
rename from modules/kubernetes/dashy/main.tf
rename to stacks/dashy/module/main.tf
index 6f1b8e35..f4100cac 100644
--- a/modules/kubernetes/dashy/main.tf
+++ b/stacks/dashy/module/main.tf
@@ -3,7 +3,7 @@ variable "tls_secret_name" {}
variable "tier" { type = string }
module "tls_secret" {
- source = "../setup_tls_secret"
+ source = "../../../modules/kubernetes/setup_tls_secret"
namespace = kubernetes_namespace.dashy.metadata[0].name
tls_secret_name = var.tls_secret_name
}
@@ -117,7 +117,7 @@ resource "kubernetes_service" "dashy" {
}
module "ingress" {
- source = "../ingress_factory"
+ source = "../../../modules/kubernetes/ingress_factory"
namespace = kubernetes_namespace.dashy.metadata[0].name
name = "dashy"
tls_secret_name = var.tls_secret_name
diff --git a/stacks/dashy/providers.tf b/stacks/dashy/providers.tf
new file mode 100644
index 00000000..516f9fed
--- /dev/null
+++ b/stacks/dashy/providers.tf
@@ -0,0 +1,15 @@
+# Generated by Terragrunt. Sig: nIlQXj57tbuaRZEa
+variable "kube_config_path" {
+ type = string
+ default = "~/.kube/config"
+}
+
+provider "kubernetes" {
+ config_path = var.kube_config_path
+}
+
+provider "helm" {
+ kubernetes = {
+ config_path = var.kube_config_path
+ }
+}
diff --git a/stacks/dashy/secrets b/stacks/dashy/secrets
new file mode 120000
index 00000000..ca54a7cf
--- /dev/null
+++ b/stacks/dashy/secrets
@@ -0,0 +1 @@
+../../secrets
\ No newline at end of file
diff --git a/stacks/dawarich/.terraform.lock.hcl b/stacks/dawarich/.terraform.lock.hcl
new file mode 100644
index 00000000..1e5d8b27
--- /dev/null
+++ b/stacks/dawarich/.terraform.lock.hcl
@@ -0,0 +1,40 @@
+# This file is maintained automatically by "terraform init".
+# Manual edits may be lost in future updates.
+
+provider "registry.terraform.io/hashicorp/helm" {
+ version = "3.1.1"
+ hashes = [
+ "h1:47CqNwkxctJtL/N/JuEj+8QMg8mRNI/NWeKO5/ydfZU=",
+ "zh:1a6d5ce931708aec29d1f3d9e360c2a0c35ba5a54d03eeaff0ce3ca597cd0275",
+ "zh:3411919ba2a5941801e677f0fea08bdd0ae22ba3c9ce3309f55554699e06524a",
+ "zh:81b36138b8f2320dc7f877b50f9e38f4bc614affe68de885d322629dd0d16a29",
+ "zh:95a2a0a497a6082ee06f95b38bd0f0d6924a65722892a856cfd914c0d117f104",
+ "zh:9d3e78c2d1bb46508b972210ad706dd8c8b106f8b206ecf096cd211c54f46990",
+ "zh:a79139abf687387a6efdbbb04289a0a8e7eaca2bd91cdc0ce68ea4f3286c2c34",
+ "zh:aaa8784be125fbd50c48d84d6e171d3fb6ef84a221dbc5165c067ce05faab4c8",
+ "zh:afecd301f469975c9d8f350cc482fe656e082b6ab0f677d1a816c3c615837cc1",
+ "zh:c54c22b18d48ff9053d899d178d9ffef7d9d19785d9bf310a07d648b7aac075b",
+ "zh:db2eefd55aea48e73384a555c72bac3f7d428e24147bedb64e1a039398e5b903",
+ "zh:ee61666a233533fd2be971091cecc01650561f1585783c381b6f6e8a390198a4",
+ "zh:f569b65999264a9416862bca5cd2a6177d94ccb0424f3a4ef424428912b9cb3c",
+ ]
+}
+
+provider "registry.terraform.io/hashicorp/kubernetes" {
+ version = "3.0.1"
+ hashes = [
+ "h1:P0c8knzZnouTNFIRij8IS7+pqd0OKaFDYX0j4GRsiqo=",
+ "zh:02d55b0b2238fd17ffa12d5464593864e80f402b90b31f6e1bd02249b9727281",
+ "zh:20b93a51bfeed82682b3c12f09bac3031f5bdb4977c47c97a042e4df4fb2f9ba",
+ "zh:6e14486ecfaee38c09ccf33d4fdaf791409f90795c1b66e026c226fad8bc03c7",
+ "zh:8d0656ff422df94575668e32c310980193fccb1c28117e5c78dd2d4050a760a6",
+ "zh:9795119b30ec0c1baa99a79abace56ac850b6e6fbce60e7f6067792f6eb4b5f4",
+ "zh:b388c87acc40f6bd9620f4e23f01f3c7b41d9b88a68d5255dec0a72f0bdec249",
+ "zh:b59abd0a980649c2f97f172392f080eaeb18e486b603f83bf95f5d93aeccc090",
+ "zh:ba6e3060fddf4a022087d8f09e38aa0001c705f21170c2ded3d1c26c12f70d97",
+ "zh:c12626d044b1d5501cf95ca78cbe507c13ad1dd9f12d4736df66eb8e5f336eb8",
+ "zh:c55203240d50f4cdeb3df1e1760630d677679f5b1a6ffd9eba23662a4ad05119",
+ "zh:ea206a5a32d6e0d6e32f1849ad703da9a28355d9c516282a8458b5cf1502b2a1",
+ "zh:f569b65999264a9416862bca5cd2a6177d94ccb0424f3a4ef424428912b9cb3c",
+ ]
+}
diff --git a/stacks/dawarich/backend.tf b/stacks/dawarich/backend.tf
new file mode 100644
index 00000000..6e6a11de
--- /dev/null
+++ b/stacks/dawarich/backend.tf
@@ -0,0 +1,6 @@
+# Generated by Terragrunt. Sig: nIlQXj57tbuaRZEa
+terraform {
+ backend "local" {
+ path = "/Users/viktorbarzin/code/infra/state/stacks/dawarich/terraform.tfstate"
+ }
+}
diff --git a/stacks/dawarich/main.tf b/stacks/dawarich/main.tf
index 7124910b..d4b9bc5e 100644
--- a/stacks/dawarich/main.tf
+++ b/stacks/dawarich/main.tf
@@ -13,9 +13,9 @@ locals {
}
module "dawarich" {
- source = "../../modules/kubernetes/dawarich"
- tls_secret_name = var.tls_secret_name
- database_password = var.dawarich_database_password
- geoapify_api_key = var.geoapify_api_key
- tier = local.tiers.edge
+ source = "./module"
+ tls_secret_name = var.tls_secret_name
+ database_password = var.dawarich_database_password
+ geoapify_api_key = var.geoapify_api_key
+ tier = local.tiers.edge
}
diff --git a/modules/kubernetes/dawarich/main.tf b/stacks/dawarich/module/main.tf
similarity index 98%
rename from modules/kubernetes/dawarich/main.tf
rename to stacks/dawarich/module/main.tf
index 527bcd55..6b9ce1fd 100644
--- a/modules/kubernetes/dawarich/main.tf
+++ b/stacks/dawarich/module/main.tf
@@ -18,7 +18,7 @@ resource "kubernetes_namespace" "dawarich" {
}
module "tls_secret" {
- source = "../setup_tls_secret"
+ source = "../../../modules/kubernetes/setup_tls_secret"
namespace = kubernetes_namespace.dawarich.metadata[0].name
tls_secret_name = var.tls_secret_name
}
@@ -317,7 +317,7 @@ resource "kubernetes_service" "dawarich" {
# }
# }
module "ingress" {
- source = "../ingress_factory"
+ source = "../../../modules/kubernetes/ingress_factory"
namespace = kubernetes_namespace.dawarich.metadata[0].name
name = "dawarich"
tls_secret_name = var.tls_secret_name
diff --git a/stacks/dawarich/providers.tf b/stacks/dawarich/providers.tf
new file mode 100644
index 00000000..516f9fed
--- /dev/null
+++ b/stacks/dawarich/providers.tf
@@ -0,0 +1,15 @@
+# Generated by Terragrunt. Sig: nIlQXj57tbuaRZEa
+variable "kube_config_path" {
+ type = string
+ default = "~/.kube/config"
+}
+
+provider "kubernetes" {
+ config_path = var.kube_config_path
+}
+
+provider "helm" {
+ kubernetes = {
+ config_path = var.kube_config_path
+ }
+}
diff --git a/stacks/dawarich/secrets b/stacks/dawarich/secrets
new file mode 120000
index 00000000..ca54a7cf
--- /dev/null
+++ b/stacks/dawarich/secrets
@@ -0,0 +1 @@
+../../secrets
\ No newline at end of file
diff --git a/stacks/descheduler/.terraform.lock.hcl b/stacks/descheduler/.terraform.lock.hcl
new file mode 100644
index 00000000..1e5d8b27
--- /dev/null
+++ b/stacks/descheduler/.terraform.lock.hcl
@@ -0,0 +1,40 @@
+# This file is maintained automatically by "terraform init".
+# Manual edits may be lost in future updates.
+
+provider "registry.terraform.io/hashicorp/helm" {
+ version = "3.1.1"
+ hashes = [
+ "h1:47CqNwkxctJtL/N/JuEj+8QMg8mRNI/NWeKO5/ydfZU=",
+ "zh:1a6d5ce931708aec29d1f3d9e360c2a0c35ba5a54d03eeaff0ce3ca597cd0275",
+ "zh:3411919ba2a5941801e677f0fea08bdd0ae22ba3c9ce3309f55554699e06524a",
+ "zh:81b36138b8f2320dc7f877b50f9e38f4bc614affe68de885d322629dd0d16a29",
+ "zh:95a2a0a497a6082ee06f95b38bd0f0d6924a65722892a856cfd914c0d117f104",
+ "zh:9d3e78c2d1bb46508b972210ad706dd8c8b106f8b206ecf096cd211c54f46990",
+ "zh:a79139abf687387a6efdbbb04289a0a8e7eaca2bd91cdc0ce68ea4f3286c2c34",
+ "zh:aaa8784be125fbd50c48d84d6e171d3fb6ef84a221dbc5165c067ce05faab4c8",
+ "zh:afecd301f469975c9d8f350cc482fe656e082b6ab0f677d1a816c3c615837cc1",
+ "zh:c54c22b18d48ff9053d899d178d9ffef7d9d19785d9bf310a07d648b7aac075b",
+ "zh:db2eefd55aea48e73384a555c72bac3f7d428e24147bedb64e1a039398e5b903",
+ "zh:ee61666a233533fd2be971091cecc01650561f1585783c381b6f6e8a390198a4",
+ "zh:f569b65999264a9416862bca5cd2a6177d94ccb0424f3a4ef424428912b9cb3c",
+ ]
+}
+
+provider "registry.terraform.io/hashicorp/kubernetes" {
+ version = "3.0.1"
+ hashes = [
+ "h1:P0c8knzZnouTNFIRij8IS7+pqd0OKaFDYX0j4GRsiqo=",
+ "zh:02d55b0b2238fd17ffa12d5464593864e80f402b90b31f6e1bd02249b9727281",
+ "zh:20b93a51bfeed82682b3c12f09bac3031f5bdb4977c47c97a042e4df4fb2f9ba",
+ "zh:6e14486ecfaee38c09ccf33d4fdaf791409f90795c1b66e026c226fad8bc03c7",
+ "zh:8d0656ff422df94575668e32c310980193fccb1c28117e5c78dd2d4050a760a6",
+ "zh:9795119b30ec0c1baa99a79abace56ac850b6e6fbce60e7f6067792f6eb4b5f4",
+ "zh:b388c87acc40f6bd9620f4e23f01f3c7b41d9b88a68d5255dec0a72f0bdec249",
+ "zh:b59abd0a980649c2f97f172392f080eaeb18e486b603f83bf95f5d93aeccc090",
+ "zh:ba6e3060fddf4a022087d8f09e38aa0001c705f21170c2ded3d1c26c12f70d97",
+ "zh:c12626d044b1d5501cf95ca78cbe507c13ad1dd9f12d4736df66eb8e5f336eb8",
+ "zh:c55203240d50f4cdeb3df1e1760630d677679f5b1a6ffd9eba23662a4ad05119",
+ "zh:ea206a5a32d6e0d6e32f1849ad703da9a28355d9c516282a8458b5cf1502b2a1",
+ "zh:f569b65999264a9416862bca5cd2a6177d94ccb0424f3a4ef424428912b9cb3c",
+ ]
+}
diff --git a/stacks/descheduler/backend.tf b/stacks/descheduler/backend.tf
new file mode 100644
index 00000000..ea7708a6
--- /dev/null
+++ b/stacks/descheduler/backend.tf
@@ -0,0 +1,6 @@
+# Generated by Terragrunt. Sig: nIlQXj57tbuaRZEa
+terraform {
+ backend "local" {
+ path = "/Users/viktorbarzin/code/infra/state/stacks/descheduler/terraform.tfstate"
+ }
+}
diff --git a/stacks/descheduler/main.tf b/stacks/descheduler/main.tf
index 2a761e02..a56cbbcf 100644
--- a/stacks/descheduler/main.tf
+++ b/stacks/descheduler/main.tf
@@ -1,3 +1,3 @@
module "descheduler" {
- source = "../../modules/kubernetes/descheduler"
+ source = "./module"
}
diff --git a/modules/kubernetes/descheduler/main.tf b/stacks/descheduler/module/main.tf
similarity index 100%
rename from modules/kubernetes/descheduler/main.tf
rename to stacks/descheduler/module/main.tf
diff --git a/modules/kubernetes/descheduler/values.yaml b/stacks/descheduler/module/values.yaml
similarity index 100%
rename from modules/kubernetes/descheduler/values.yaml
rename to stacks/descheduler/module/values.yaml
diff --git a/stacks/descheduler/providers.tf b/stacks/descheduler/providers.tf
new file mode 100644
index 00000000..516f9fed
--- /dev/null
+++ b/stacks/descheduler/providers.tf
@@ -0,0 +1,15 @@
+# Generated by Terragrunt. Sig: nIlQXj57tbuaRZEa
+variable "kube_config_path" {
+ type = string
+ default = "~/.kube/config"
+}
+
+provider "kubernetes" {
+ config_path = var.kube_config_path
+}
+
+provider "helm" {
+ kubernetes = {
+ config_path = var.kube_config_path
+ }
+}
diff --git a/stacks/descheduler/secrets b/stacks/descheduler/secrets
new file mode 120000
index 00000000..ca54a7cf
--- /dev/null
+++ b/stacks/descheduler/secrets
@@ -0,0 +1 @@
+../../secrets
\ No newline at end of file
diff --git a/stacks/diun/.terraform.lock.hcl b/stacks/diun/.terraform.lock.hcl
new file mode 100644
index 00000000..1e5d8b27
--- /dev/null
+++ b/stacks/diun/.terraform.lock.hcl
@@ -0,0 +1,40 @@
+# This file is maintained automatically by "terraform init".
+# Manual edits may be lost in future updates.
+
+provider "registry.terraform.io/hashicorp/helm" {
+ version = "3.1.1"
+ hashes = [
+ "h1:47CqNwkxctJtL/N/JuEj+8QMg8mRNI/NWeKO5/ydfZU=",
+ "zh:1a6d5ce931708aec29d1f3d9e360c2a0c35ba5a54d03eeaff0ce3ca597cd0275",
+ "zh:3411919ba2a5941801e677f0fea08bdd0ae22ba3c9ce3309f55554699e06524a",
+ "zh:81b36138b8f2320dc7f877b50f9e38f4bc614affe68de885d322629dd0d16a29",
+ "zh:95a2a0a497a6082ee06f95b38bd0f0d6924a65722892a856cfd914c0d117f104",
+ "zh:9d3e78c2d1bb46508b972210ad706dd8c8b106f8b206ecf096cd211c54f46990",
+ "zh:a79139abf687387a6efdbbb04289a0a8e7eaca2bd91cdc0ce68ea4f3286c2c34",
+ "zh:aaa8784be125fbd50c48d84d6e171d3fb6ef84a221dbc5165c067ce05faab4c8",
+ "zh:afecd301f469975c9d8f350cc482fe656e082b6ab0f677d1a816c3c615837cc1",
+ "zh:c54c22b18d48ff9053d899d178d9ffef7d9d19785d9bf310a07d648b7aac075b",
+ "zh:db2eefd55aea48e73384a555c72bac3f7d428e24147bedb64e1a039398e5b903",
+ "zh:ee61666a233533fd2be971091cecc01650561f1585783c381b6f6e8a390198a4",
+ "zh:f569b65999264a9416862bca5cd2a6177d94ccb0424f3a4ef424428912b9cb3c",
+ ]
+}
+
+provider "registry.terraform.io/hashicorp/kubernetes" {
+ version = "3.0.1"
+ hashes = [
+ "h1:P0c8knzZnouTNFIRij8IS7+pqd0OKaFDYX0j4GRsiqo=",
+ "zh:02d55b0b2238fd17ffa12d5464593864e80f402b90b31f6e1bd02249b9727281",
+ "zh:20b93a51bfeed82682b3c12f09bac3031f5bdb4977c47c97a042e4df4fb2f9ba",
+ "zh:6e14486ecfaee38c09ccf33d4fdaf791409f90795c1b66e026c226fad8bc03c7",
+ "zh:8d0656ff422df94575668e32c310980193fccb1c28117e5c78dd2d4050a760a6",
+ "zh:9795119b30ec0c1baa99a79abace56ac850b6e6fbce60e7f6067792f6eb4b5f4",
+ "zh:b388c87acc40f6bd9620f4e23f01f3c7b41d9b88a68d5255dec0a72f0bdec249",
+ "zh:b59abd0a980649c2f97f172392f080eaeb18e486b603f83bf95f5d93aeccc090",
+ "zh:ba6e3060fddf4a022087d8f09e38aa0001c705f21170c2ded3d1c26c12f70d97",
+ "zh:c12626d044b1d5501cf95ca78cbe507c13ad1dd9f12d4736df66eb8e5f336eb8",
+ "zh:c55203240d50f4cdeb3df1e1760630d677679f5b1a6ffd9eba23662a4ad05119",
+ "zh:ea206a5a32d6e0d6e32f1849ad703da9a28355d9c516282a8458b5cf1502b2a1",
+ "zh:f569b65999264a9416862bca5cd2a6177d94ccb0424f3a4ef424428912b9cb3c",
+ ]
+}
diff --git a/stacks/diun/backend.tf b/stacks/diun/backend.tf
new file mode 100644
index 00000000..57f03703
--- /dev/null
+++ b/stacks/diun/backend.tf
@@ -0,0 +1,6 @@
+# Generated by Terragrunt. Sig: nIlQXj57tbuaRZEa
+terraform {
+ backend "local" {
+ path = "/Users/viktorbarzin/code/infra/state/stacks/diun/terraform.tfstate"
+ }
+}
diff --git a/stacks/diun/main.tf b/stacks/diun/main.tf
index 941d3fd3..332bf1b4 100644
--- a/stacks/diun/main.tf
+++ b/stacks/diun/main.tf
@@ -13,9 +13,9 @@ locals {
}
module "diun" {
- source = "../../modules/kubernetes/diun"
- tls_secret_name = var.tls_secret_name
- diun_nfty_token = var.diun_nfty_token
- diun_slack_url = var.diun_slack_url
- tier = local.tiers.aux
+ source = "./module"
+ tls_secret_name = var.tls_secret_name
+ diun_nfty_token = var.diun_nfty_token
+ diun_slack_url = var.diun_slack_url
+ tier = local.tiers.aux
}
diff --git a/modules/kubernetes/diun/main.tf b/stacks/diun/module/main.tf
similarity index 98%
rename from modules/kubernetes/diun/main.tf
rename to stacks/diun/module/main.tf
index 5109495b..ed7809f0 100644
--- a/modules/kubernetes/diun/main.tf
+++ b/stacks/diun/module/main.tf
@@ -14,7 +14,7 @@ resource "kubernetes_namespace" "diun" {
}
module "tls_secret" {
- source = "../setup_tls_secret"
+ source = "../../../modules/kubernetes/setup_tls_secret"
namespace = kubernetes_namespace.diun.metadata[0].name
tls_secret_name = var.tls_secret_name
}
diff --git a/stacks/diun/providers.tf b/stacks/diun/providers.tf
new file mode 100644
index 00000000..516f9fed
--- /dev/null
+++ b/stacks/diun/providers.tf
@@ -0,0 +1,15 @@
+# Generated by Terragrunt. Sig: nIlQXj57tbuaRZEa
+variable "kube_config_path" {
+ type = string
+ default = "~/.kube/config"
+}
+
+provider "kubernetes" {
+ config_path = var.kube_config_path
+}
+
+provider "helm" {
+ kubernetes = {
+ config_path = var.kube_config_path
+ }
+}
diff --git a/stacks/diun/secrets b/stacks/diun/secrets
new file mode 120000
index 00000000..ca54a7cf
--- /dev/null
+++ b/stacks/diun/secrets
@@ -0,0 +1 @@
+../../secrets
\ No newline at end of file
diff --git a/stacks/drone/.terraform.lock.hcl b/stacks/drone/.terraform.lock.hcl
new file mode 100644
index 00000000..1e5d8b27
--- /dev/null
+++ b/stacks/drone/.terraform.lock.hcl
@@ -0,0 +1,40 @@
+# This file is maintained automatically by "terraform init".
+# Manual edits may be lost in future updates.
+
+provider "registry.terraform.io/hashicorp/helm" {
+ version = "3.1.1"
+ hashes = [
+ "h1:47CqNwkxctJtL/N/JuEj+8QMg8mRNI/NWeKO5/ydfZU=",
+ "zh:1a6d5ce931708aec29d1f3d9e360c2a0c35ba5a54d03eeaff0ce3ca597cd0275",
+ "zh:3411919ba2a5941801e677f0fea08bdd0ae22ba3c9ce3309f55554699e06524a",
+ "zh:81b36138b8f2320dc7f877b50f9e38f4bc614affe68de885d322629dd0d16a29",
+ "zh:95a2a0a497a6082ee06f95b38bd0f0d6924a65722892a856cfd914c0d117f104",
+ "zh:9d3e78c2d1bb46508b972210ad706dd8c8b106f8b206ecf096cd211c54f46990",
+ "zh:a79139abf687387a6efdbbb04289a0a8e7eaca2bd91cdc0ce68ea4f3286c2c34",
+ "zh:aaa8784be125fbd50c48d84d6e171d3fb6ef84a221dbc5165c067ce05faab4c8",
+ "zh:afecd301f469975c9d8f350cc482fe656e082b6ab0f677d1a816c3c615837cc1",
+ "zh:c54c22b18d48ff9053d899d178d9ffef7d9d19785d9bf310a07d648b7aac075b",
+ "zh:db2eefd55aea48e73384a555c72bac3f7d428e24147bedb64e1a039398e5b903",
+ "zh:ee61666a233533fd2be971091cecc01650561f1585783c381b6f6e8a390198a4",
+ "zh:f569b65999264a9416862bca5cd2a6177d94ccb0424f3a4ef424428912b9cb3c",
+ ]
+}
+
+provider "registry.terraform.io/hashicorp/kubernetes" {
+ version = "3.0.1"
+ hashes = [
+ "h1:P0c8knzZnouTNFIRij8IS7+pqd0OKaFDYX0j4GRsiqo=",
+ "zh:02d55b0b2238fd17ffa12d5464593864e80f402b90b31f6e1bd02249b9727281",
+ "zh:20b93a51bfeed82682b3c12f09bac3031f5bdb4977c47c97a042e4df4fb2f9ba",
+ "zh:6e14486ecfaee38c09ccf33d4fdaf791409f90795c1b66e026c226fad8bc03c7",
+ "zh:8d0656ff422df94575668e32c310980193fccb1c28117e5c78dd2d4050a760a6",
+ "zh:9795119b30ec0c1baa99a79abace56ac850b6e6fbce60e7f6067792f6eb4b5f4",
+ "zh:b388c87acc40f6bd9620f4e23f01f3c7b41d9b88a68d5255dec0a72f0bdec249",
+ "zh:b59abd0a980649c2f97f172392f080eaeb18e486b603f83bf95f5d93aeccc090",
+ "zh:ba6e3060fddf4a022087d8f09e38aa0001c705f21170c2ded3d1c26c12f70d97",
+ "zh:c12626d044b1d5501cf95ca78cbe507c13ad1dd9f12d4736df66eb8e5f336eb8",
+ "zh:c55203240d50f4cdeb3df1e1760630d677679f5b1a6ffd9eba23662a4ad05119",
+ "zh:ea206a5a32d6e0d6e32f1849ad703da9a28355d9c516282a8458b5cf1502b2a1",
+ "zh:f569b65999264a9416862bca5cd2a6177d94ccb0424f3a4ef424428912b9cb3c",
+ ]
+}
diff --git a/stacks/drone/backend.tf b/stacks/drone/backend.tf
new file mode 100644
index 00000000..49bde38f
--- /dev/null
+++ b/stacks/drone/backend.tf
@@ -0,0 +1,6 @@
+# Generated by Terragrunt. Sig: nIlQXj57tbuaRZEa
+terraform {
+ backend "local" {
+ path = "/Users/viktorbarzin/code/infra/state/stacks/drone/terraform.tfstate"
+ }
+}
diff --git a/stacks/drone/main.tf b/stacks/drone/main.tf
index 84372a98..7a2cb194 100644
--- a/stacks/drone/main.tf
+++ b/stacks/drone/main.tf
@@ -15,14 +15,14 @@ locals {
}
module "drone" {
- source = "../../modules/kubernetes/drone"
- tls_secret_name = var.tls_secret_name
- git_crypt_key_base64 = filebase64("${path.root}/../../.git/git-crypt/keys/default")
- github_client_id = var.drone_github_client_id
- github_client_secret = var.drone_github_client_secret
- rpc_secret = var.drone_rpc_secret
- webhook_secret = var.drone_webhook_secret
- server_host = "drone.viktorbarzin.me"
- server_proto = "https"
- tier = local.tiers.edge
+ source = "./module"
+ tls_secret_name = var.tls_secret_name
+ git_crypt_key_base64 = filebase64("${path.root}/../../.git/git-crypt/keys/default")
+ github_client_id = var.drone_github_client_id
+ github_client_secret = var.drone_github_client_secret
+ rpc_secret = var.drone_rpc_secret
+ webhook_secret = var.drone_webhook_secret
+ server_host = "drone.viktorbarzin.me"
+ server_proto = "https"
+ tier = local.tiers.edge
}
diff --git a/modules/kubernetes/drone/main.tf b/stacks/drone/module/main.tf
similarity index 97%
rename from modules/kubernetes/drone/main.tf
rename to stacks/drone/module/main.tf
index 07e99d0e..9a84de24 100644
--- a/modules/kubernetes/drone/main.tf
+++ b/stacks/drone/module/main.tf
@@ -42,7 +42,7 @@ resource "kubernetes_resource_quota" "drone" {
}
module "tls_secret" {
- source = "../setup_tls_secret"
+ source = "../../../modules/kubernetes/setup_tls_secret"
namespace = kubernetes_namespace.drone.metadata[0].name
tls_secret_name = var.tls_secret_name
}
@@ -191,7 +191,7 @@ resource "kubernetes_service" "drone" {
}
module "ingress" {
- source = "../ingress_factory"
+ source = "../../../modules/kubernetes/ingress_factory"
namespace = kubernetes_namespace.drone.metadata[0].name
name = "drone"
tls_secret_name = var.tls_secret_name
@@ -314,6 +314,10 @@ resource "kubernetes_deployment" "drone_runner" {
name = "DRONE_DEBUG"
value = "true"
}
+ env {
+ name = "DRONE_IMAGES_CLONE"
+ value = "alpine/git:latest"
+ }
}
}
}
diff --git a/stacks/drone/providers.tf b/stacks/drone/providers.tf
new file mode 100644
index 00000000..516f9fed
--- /dev/null
+++ b/stacks/drone/providers.tf
@@ -0,0 +1,15 @@
+# Generated by Terragrunt. Sig: nIlQXj57tbuaRZEa
+variable "kube_config_path" {
+ type = string
+ default = "~/.kube/config"
+}
+
+provider "kubernetes" {
+ config_path = var.kube_config_path
+}
+
+provider "helm" {
+ kubernetes = {
+ config_path = var.kube_config_path
+ }
+}
diff --git a/stacks/drone/secrets b/stacks/drone/secrets
new file mode 120000
index 00000000..ca54a7cf
--- /dev/null
+++ b/stacks/drone/secrets
@@ -0,0 +1 @@
+../../secrets
\ No newline at end of file
diff --git a/stacks/ebook2audiobook/.terraform.lock.hcl b/stacks/ebook2audiobook/.terraform.lock.hcl
new file mode 100644
index 00000000..1e5d8b27
--- /dev/null
+++ b/stacks/ebook2audiobook/.terraform.lock.hcl
@@ -0,0 +1,40 @@
+# This file is maintained automatically by "terraform init".
+# Manual edits may be lost in future updates.
+
+provider "registry.terraform.io/hashicorp/helm" {
+ version = "3.1.1"
+ hashes = [
+ "h1:47CqNwkxctJtL/N/JuEj+8QMg8mRNI/NWeKO5/ydfZU=",
+ "zh:1a6d5ce931708aec29d1f3d9e360c2a0c35ba5a54d03eeaff0ce3ca597cd0275",
+ "zh:3411919ba2a5941801e677f0fea08bdd0ae22ba3c9ce3309f55554699e06524a",
+ "zh:81b36138b8f2320dc7f877b50f9e38f4bc614affe68de885d322629dd0d16a29",
+ "zh:95a2a0a497a6082ee06f95b38bd0f0d6924a65722892a856cfd914c0d117f104",
+ "zh:9d3e78c2d1bb46508b972210ad706dd8c8b106f8b206ecf096cd211c54f46990",
+ "zh:a79139abf687387a6efdbbb04289a0a8e7eaca2bd91cdc0ce68ea4f3286c2c34",
+ "zh:aaa8784be125fbd50c48d84d6e171d3fb6ef84a221dbc5165c067ce05faab4c8",
+ "zh:afecd301f469975c9d8f350cc482fe656e082b6ab0f677d1a816c3c615837cc1",
+ "zh:c54c22b18d48ff9053d899d178d9ffef7d9d19785d9bf310a07d648b7aac075b",
+ "zh:db2eefd55aea48e73384a555c72bac3f7d428e24147bedb64e1a039398e5b903",
+ "zh:ee61666a233533fd2be971091cecc01650561f1585783c381b6f6e8a390198a4",
+ "zh:f569b65999264a9416862bca5cd2a6177d94ccb0424f3a4ef424428912b9cb3c",
+ ]
+}
+
+provider "registry.terraform.io/hashicorp/kubernetes" {
+ version = "3.0.1"
+ hashes = [
+ "h1:P0c8knzZnouTNFIRij8IS7+pqd0OKaFDYX0j4GRsiqo=",
+ "zh:02d55b0b2238fd17ffa12d5464593864e80f402b90b31f6e1bd02249b9727281",
+ "zh:20b93a51bfeed82682b3c12f09bac3031f5bdb4977c47c97a042e4df4fb2f9ba",
+ "zh:6e14486ecfaee38c09ccf33d4fdaf791409f90795c1b66e026c226fad8bc03c7",
+ "zh:8d0656ff422df94575668e32c310980193fccb1c28117e5c78dd2d4050a760a6",
+ "zh:9795119b30ec0c1baa99a79abace56ac850b6e6fbce60e7f6067792f6eb4b5f4",
+ "zh:b388c87acc40f6bd9620f4e23f01f3c7b41d9b88a68d5255dec0a72f0bdec249",
+ "zh:b59abd0a980649c2f97f172392f080eaeb18e486b603f83bf95f5d93aeccc090",
+ "zh:ba6e3060fddf4a022087d8f09e38aa0001c705f21170c2ded3d1c26c12f70d97",
+ "zh:c12626d044b1d5501cf95ca78cbe507c13ad1dd9f12d4736df66eb8e5f336eb8",
+ "zh:c55203240d50f4cdeb3df1e1760630d677679f5b1a6ffd9eba23662a4ad05119",
+ "zh:ea206a5a32d6e0d6e32f1849ad703da9a28355d9c516282a8458b5cf1502b2a1",
+ "zh:f569b65999264a9416862bca5cd2a6177d94ccb0424f3a4ef424428912b9cb3c",
+ ]
+}
diff --git a/stacks/ebook2audiobook/backend.tf b/stacks/ebook2audiobook/backend.tf
new file mode 100644
index 00000000..6457a661
--- /dev/null
+++ b/stacks/ebook2audiobook/backend.tf
@@ -0,0 +1,6 @@
+# Generated by Terragrunt. Sig: nIlQXj57tbuaRZEa
+terraform {
+ backend "local" {
+ path = "/Users/viktorbarzin/code/infra/state/stacks/ebook2audiobook/terraform.tfstate"
+ }
+}
diff --git a/stacks/ebook2audiobook/main.tf b/stacks/ebook2audiobook/main.tf
index 354a39a4..ee3c57db 100644
--- a/stacks/ebook2audiobook/main.tf
+++ b/stacks/ebook2audiobook/main.tf
@@ -11,7 +11,7 @@ locals {
}
module "ebook2audiobook" {
- source = "../../modules/kubernetes/ebook2audiobook"
- tls_secret_name = var.tls_secret_name
- tier = local.tiers.gpu
+ source = "./module"
+ tls_secret_name = var.tls_secret_name
+ tier = local.tiers.gpu
}
diff --git a/modules/kubernetes/ebook2audiobook/audiblez-web b/stacks/ebook2audiobook/module/audiblez-web
similarity index 100%
rename from modules/kubernetes/ebook2audiobook/audiblez-web
rename to stacks/ebook2audiobook/module/audiblez-web
diff --git a/modules/kubernetes/ebook2audiobook/main.tf b/stacks/ebook2audiobook/module/main.tf
similarity index 97%
rename from modules/kubernetes/ebook2audiobook/main.tf
rename to stacks/ebook2audiobook/module/main.tf
index 991dd93b..8f0e609f 100644
--- a/modules/kubernetes/ebook2audiobook/main.tf
+++ b/stacks/ebook2audiobook/module/main.tf
@@ -3,7 +3,7 @@ variable "tls_secret_name" {}
variable "tier" { type = string }
module "tls_secret" {
- source = "../setup_tls_secret"
+ source = "../../../modules/kubernetes/setup_tls_secret"
namespace = kubernetes_namespace.ebook2audiobook.metadata[0].name
tls_secret_name = var.tls_secret_name
}
@@ -223,7 +223,7 @@ resource "kubernetes_service" "ebook2audiobook" {
module "ingress" {
- source = "../ingress_factory"
+ source = "../../../modules/kubernetes/ingress_factory"
namespace = kubernetes_namespace.ebook2audiobook.metadata[0].name
name = "ebook2audiobook"
tls_secret_name = var.tls_secret_name
@@ -399,7 +399,7 @@ resource "kubernetes_service" "audiblez-web" {
}
module "audiblez-web-ingress" {
- source = "../ingress_factory"
+ source = "../../../modules/kubernetes/ingress_factory"
namespace = kubernetes_namespace.ebook2audiobook.metadata[0].name
name = "audiblez-web"
host = "audiblez"
diff --git a/stacks/ebook2audiobook/providers.tf b/stacks/ebook2audiobook/providers.tf
new file mode 100644
index 00000000..516f9fed
--- /dev/null
+++ b/stacks/ebook2audiobook/providers.tf
@@ -0,0 +1,15 @@
+# Generated by Terragrunt. Sig: nIlQXj57tbuaRZEa
+variable "kube_config_path" {
+ type = string
+ default = "~/.kube/config"
+}
+
+provider "kubernetes" {
+ config_path = var.kube_config_path
+}
+
+provider "helm" {
+ kubernetes = {
+ config_path = var.kube_config_path
+ }
+}
diff --git a/stacks/ebook2audiobook/secrets b/stacks/ebook2audiobook/secrets
new file mode 120000
index 00000000..ca54a7cf
--- /dev/null
+++ b/stacks/ebook2audiobook/secrets
@@ -0,0 +1 @@
+../../secrets
\ No newline at end of file
diff --git a/stacks/echo/.terraform.lock.hcl b/stacks/echo/.terraform.lock.hcl
new file mode 100644
index 00000000..1e5d8b27
--- /dev/null
+++ b/stacks/echo/.terraform.lock.hcl
@@ -0,0 +1,40 @@
+# This file is maintained automatically by "terraform init".
+# Manual edits may be lost in future updates.
+
+provider "registry.terraform.io/hashicorp/helm" {
+ version = "3.1.1"
+ hashes = [
+ "h1:47CqNwkxctJtL/N/JuEj+8QMg8mRNI/NWeKO5/ydfZU=",
+ "zh:1a6d5ce931708aec29d1f3d9e360c2a0c35ba5a54d03eeaff0ce3ca597cd0275",
+ "zh:3411919ba2a5941801e677f0fea08bdd0ae22ba3c9ce3309f55554699e06524a",
+ "zh:81b36138b8f2320dc7f877b50f9e38f4bc614affe68de885d322629dd0d16a29",
+ "zh:95a2a0a497a6082ee06f95b38bd0f0d6924a65722892a856cfd914c0d117f104",
+ "zh:9d3e78c2d1bb46508b972210ad706dd8c8b106f8b206ecf096cd211c54f46990",
+ "zh:a79139abf687387a6efdbbb04289a0a8e7eaca2bd91cdc0ce68ea4f3286c2c34",
+ "zh:aaa8784be125fbd50c48d84d6e171d3fb6ef84a221dbc5165c067ce05faab4c8",
+ "zh:afecd301f469975c9d8f350cc482fe656e082b6ab0f677d1a816c3c615837cc1",
+ "zh:c54c22b18d48ff9053d899d178d9ffef7d9d19785d9bf310a07d648b7aac075b",
+ "zh:db2eefd55aea48e73384a555c72bac3f7d428e24147bedb64e1a039398e5b903",
+ "zh:ee61666a233533fd2be971091cecc01650561f1585783c381b6f6e8a390198a4",
+ "zh:f569b65999264a9416862bca5cd2a6177d94ccb0424f3a4ef424428912b9cb3c",
+ ]
+}
+
+provider "registry.terraform.io/hashicorp/kubernetes" {
+ version = "3.0.1"
+ hashes = [
+ "h1:P0c8knzZnouTNFIRij8IS7+pqd0OKaFDYX0j4GRsiqo=",
+ "zh:02d55b0b2238fd17ffa12d5464593864e80f402b90b31f6e1bd02249b9727281",
+ "zh:20b93a51bfeed82682b3c12f09bac3031f5bdb4977c47c97a042e4df4fb2f9ba",
+ "zh:6e14486ecfaee38c09ccf33d4fdaf791409f90795c1b66e026c226fad8bc03c7",
+ "zh:8d0656ff422df94575668e32c310980193fccb1c28117e5c78dd2d4050a760a6",
+ "zh:9795119b30ec0c1baa99a79abace56ac850b6e6fbce60e7f6067792f6eb4b5f4",
+ "zh:b388c87acc40f6bd9620f4e23f01f3c7b41d9b88a68d5255dec0a72f0bdec249",
+ "zh:b59abd0a980649c2f97f172392f080eaeb18e486b603f83bf95f5d93aeccc090",
+ "zh:ba6e3060fddf4a022087d8f09e38aa0001c705f21170c2ded3d1c26c12f70d97",
+ "zh:c12626d044b1d5501cf95ca78cbe507c13ad1dd9f12d4736df66eb8e5f336eb8",
+ "zh:c55203240d50f4cdeb3df1e1760630d677679f5b1a6ffd9eba23662a4ad05119",
+ "zh:ea206a5a32d6e0d6e32f1849ad703da9a28355d9c516282a8458b5cf1502b2a1",
+ "zh:f569b65999264a9416862bca5cd2a6177d94ccb0424f3a4ef424428912b9cb3c",
+ ]
+}
diff --git a/stacks/echo/backend.tf b/stacks/echo/backend.tf
new file mode 100644
index 00000000..b0d2db2b
--- /dev/null
+++ b/stacks/echo/backend.tf
@@ -0,0 +1,6 @@
+# Generated by Terragrunt. Sig: nIlQXj57tbuaRZEa
+terraform {
+ backend "local" {
+ path = "/Users/viktorbarzin/code/infra/state/stacks/echo/terraform.tfstate"
+ }
+}
diff --git a/stacks/echo/main.tf b/stacks/echo/main.tf
index 9aab5baf..946c6230 100644
--- a/stacks/echo/main.tf
+++ b/stacks/echo/main.tf
@@ -11,7 +11,7 @@ locals {
}
module "echo" {
- source = "../../modules/kubernetes/echo"
- tls_secret_name = var.tls_secret_name
- tier = local.tiers.edge
+ source = "./module"
+ tls_secret_name = var.tls_secret_name
+ tier = local.tiers.edge
}
diff --git a/modules/kubernetes/echo/main.tf b/stacks/echo/module/main.tf
similarity index 91%
rename from modules/kubernetes/echo/main.tf
rename to stacks/echo/module/main.tf
index 1eacfb41..e13c4e09 100644
--- a/modules/kubernetes/echo/main.tf
+++ b/stacks/echo/module/main.tf
@@ -12,7 +12,7 @@ resource "kubernetes_namespace" "echo" {
}
module "tls_secret" {
- source = "../setup_tls_secret"
+ source = "../../../modules/kubernetes/setup_tls_secret"
namespace = kubernetes_namespace.echo.metadata[0].name
tls_secret_name = var.tls_secret_name
}
@@ -77,7 +77,7 @@ resource "kubernetes_service" "echo" {
}
module "ingress" {
- source = "../ingress_factory"
+ source = "../../../modules/kubernetes/ingress_factory"
namespace = kubernetes_namespace.echo.metadata[0].name
name = "echo"
tls_secret_name = var.tls_secret_name
diff --git a/stacks/echo/providers.tf b/stacks/echo/providers.tf
new file mode 100644
index 00000000..516f9fed
--- /dev/null
+++ b/stacks/echo/providers.tf
@@ -0,0 +1,15 @@
+# Generated by Terragrunt. Sig: nIlQXj57tbuaRZEa
+variable "kube_config_path" {
+ type = string
+ default = "~/.kube/config"
+}
+
+provider "kubernetes" {
+ config_path = var.kube_config_path
+}
+
+provider "helm" {
+ kubernetes = {
+ config_path = var.kube_config_path
+ }
+}
diff --git a/stacks/echo/secrets b/stacks/echo/secrets
new file mode 120000
index 00000000..ca54a7cf
--- /dev/null
+++ b/stacks/echo/secrets
@@ -0,0 +1 @@
+../../secrets
\ No newline at end of file
diff --git a/stacks/excalidraw/.terraform.lock.hcl b/stacks/excalidraw/.terraform.lock.hcl
new file mode 100644
index 00000000..1e5d8b27
--- /dev/null
+++ b/stacks/excalidraw/.terraform.lock.hcl
@@ -0,0 +1,40 @@
+# This file is maintained automatically by "terraform init".
+# Manual edits may be lost in future updates.
+
+provider "registry.terraform.io/hashicorp/helm" {
+ version = "3.1.1"
+ hashes = [
+ "h1:47CqNwkxctJtL/N/JuEj+8QMg8mRNI/NWeKO5/ydfZU=",
+ "zh:1a6d5ce931708aec29d1f3d9e360c2a0c35ba5a54d03eeaff0ce3ca597cd0275",
+ "zh:3411919ba2a5941801e677f0fea08bdd0ae22ba3c9ce3309f55554699e06524a",
+ "zh:81b36138b8f2320dc7f877b50f9e38f4bc614affe68de885d322629dd0d16a29",
+ "zh:95a2a0a497a6082ee06f95b38bd0f0d6924a65722892a856cfd914c0d117f104",
+ "zh:9d3e78c2d1bb46508b972210ad706dd8c8b106f8b206ecf096cd211c54f46990",
+ "zh:a79139abf687387a6efdbbb04289a0a8e7eaca2bd91cdc0ce68ea4f3286c2c34",
+ "zh:aaa8784be125fbd50c48d84d6e171d3fb6ef84a221dbc5165c067ce05faab4c8",
+ "zh:afecd301f469975c9d8f350cc482fe656e082b6ab0f677d1a816c3c615837cc1",
+ "zh:c54c22b18d48ff9053d899d178d9ffef7d9d19785d9bf310a07d648b7aac075b",
+ "zh:db2eefd55aea48e73384a555c72bac3f7d428e24147bedb64e1a039398e5b903",
+ "zh:ee61666a233533fd2be971091cecc01650561f1585783c381b6f6e8a390198a4",
+ "zh:f569b65999264a9416862bca5cd2a6177d94ccb0424f3a4ef424428912b9cb3c",
+ ]
+}
+
+provider "registry.terraform.io/hashicorp/kubernetes" {
+ version = "3.0.1"
+ hashes = [
+ "h1:P0c8knzZnouTNFIRij8IS7+pqd0OKaFDYX0j4GRsiqo=",
+ "zh:02d55b0b2238fd17ffa12d5464593864e80f402b90b31f6e1bd02249b9727281",
+ "zh:20b93a51bfeed82682b3c12f09bac3031f5bdb4977c47c97a042e4df4fb2f9ba",
+ "zh:6e14486ecfaee38c09ccf33d4fdaf791409f90795c1b66e026c226fad8bc03c7",
+ "zh:8d0656ff422df94575668e32c310980193fccb1c28117e5c78dd2d4050a760a6",
+ "zh:9795119b30ec0c1baa99a79abace56ac850b6e6fbce60e7f6067792f6eb4b5f4",
+ "zh:b388c87acc40f6bd9620f4e23f01f3c7b41d9b88a68d5255dec0a72f0bdec249",
+ "zh:b59abd0a980649c2f97f172392f080eaeb18e486b603f83bf95f5d93aeccc090",
+ "zh:ba6e3060fddf4a022087d8f09e38aa0001c705f21170c2ded3d1c26c12f70d97",
+ "zh:c12626d044b1d5501cf95ca78cbe507c13ad1dd9f12d4736df66eb8e5f336eb8",
+ "zh:c55203240d50f4cdeb3df1e1760630d677679f5b1a6ffd9eba23662a4ad05119",
+ "zh:ea206a5a32d6e0d6e32f1849ad703da9a28355d9c516282a8458b5cf1502b2a1",
+ "zh:f569b65999264a9416862bca5cd2a6177d94ccb0424f3a4ef424428912b9cb3c",
+ ]
+}
diff --git a/stacks/excalidraw/backend.tf b/stacks/excalidraw/backend.tf
new file mode 100644
index 00000000..b9a78a68
--- /dev/null
+++ b/stacks/excalidraw/backend.tf
@@ -0,0 +1,6 @@
+# Generated by Terragrunt. Sig: nIlQXj57tbuaRZEa
+terraform {
+ backend "local" {
+ path = "/Users/viktorbarzin/code/infra/state/stacks/excalidraw/terraform.tfstate"
+ }
+}
diff --git a/stacks/excalidraw/main.tf b/stacks/excalidraw/main.tf
index d2e4fcbc..cfbf6fb8 100644
--- a/stacks/excalidraw/main.tf
+++ b/stacks/excalidraw/main.tf
@@ -11,7 +11,7 @@ locals {
}
module "excalidraw" {
- source = "../../modules/kubernetes/excalidraw"
- tls_secret_name = var.tls_secret_name
- tier = local.tiers.aux
+ source = "./module"
+ tls_secret_name = var.tls_secret_name
+ tier = local.tiers.aux
}
diff --git a/modules/kubernetes/excalidraw/main.tf b/stacks/excalidraw/module/main.tf
similarity index 94%
rename from modules/kubernetes/excalidraw/main.tf
rename to stacks/excalidraw/module/main.tf
index c120e7fc..4c410692 100644
--- a/modules/kubernetes/excalidraw/main.tf
+++ b/stacks/excalidraw/module/main.tf
@@ -13,7 +13,7 @@ resource "kubernetes_namespace" "excalidraw" {
module "tls_secret" {
- source = "../setup_tls_secret"
+ source = "../../../modules/kubernetes/setup_tls_secret"
namespace = kubernetes_namespace.excalidraw.metadata[0].name
tls_secret_name = var.tls_secret_name
}
@@ -99,7 +99,7 @@ resource "kubernetes_service" "draw" {
}
module "ingress" {
- source = "../ingress_factory"
+ source = "../../../modules/kubernetes/ingress_factory"
namespace = kubernetes_namespace.excalidraw.metadata[0].name
name = "draw"
tls_secret_name = var.tls_secret_name
diff --git a/modules/kubernetes/excalidraw/project/.gitignore b/stacks/excalidraw/module/project/.gitignore
similarity index 100%
rename from modules/kubernetes/excalidraw/project/.gitignore
rename to stacks/excalidraw/module/project/.gitignore
diff --git a/modules/kubernetes/excalidraw/project/Dockerfile b/stacks/excalidraw/module/project/Dockerfile
similarity index 100%
rename from modules/kubernetes/excalidraw/project/Dockerfile
rename to stacks/excalidraw/module/project/Dockerfile
diff --git a/modules/kubernetes/excalidraw/project/README.md b/stacks/excalidraw/module/project/README.md
similarity index 100%
rename from modules/kubernetes/excalidraw/project/README.md
rename to stacks/excalidraw/module/project/README.md
diff --git a/modules/kubernetes/excalidraw/project/go.mod b/stacks/excalidraw/module/project/go.mod
similarity index 100%
rename from modules/kubernetes/excalidraw/project/go.mod
rename to stacks/excalidraw/module/project/go.mod
diff --git a/modules/kubernetes/excalidraw/project/main.go b/stacks/excalidraw/module/project/main.go
similarity index 100%
rename from modules/kubernetes/excalidraw/project/main.go
rename to stacks/excalidraw/module/project/main.go
diff --git a/modules/kubernetes/excalidraw/project/static/editor.html b/stacks/excalidraw/module/project/static/editor.html
similarity index 100%
rename from modules/kubernetes/excalidraw/project/static/editor.html
rename to stacks/excalidraw/module/project/static/editor.html
diff --git a/stacks/excalidraw/providers.tf b/stacks/excalidraw/providers.tf
new file mode 100644
index 00000000..516f9fed
--- /dev/null
+++ b/stacks/excalidraw/providers.tf
@@ -0,0 +1,15 @@
+# Generated by Terragrunt. Sig: nIlQXj57tbuaRZEa
+variable "kube_config_path" {
+ type = string
+ default = "~/.kube/config"
+}
+
+provider "kubernetes" {
+ config_path = var.kube_config_path
+}
+
+provider "helm" {
+ kubernetes = {
+ config_path = var.kube_config_path
+ }
+}
diff --git a/stacks/excalidraw/secrets b/stacks/excalidraw/secrets
new file mode 120000
index 00000000..ca54a7cf
--- /dev/null
+++ b/stacks/excalidraw/secrets
@@ -0,0 +1 @@
+../../secrets
\ No newline at end of file
diff --git a/stacks/f1-stream/.terraform.lock.hcl b/stacks/f1-stream/.terraform.lock.hcl
new file mode 100644
index 00000000..1e5d8b27
--- /dev/null
+++ b/stacks/f1-stream/.terraform.lock.hcl
@@ -0,0 +1,40 @@
+# This file is maintained automatically by "terraform init".
+# Manual edits may be lost in future updates.
+
+provider "registry.terraform.io/hashicorp/helm" {
+ version = "3.1.1"
+ hashes = [
+ "h1:47CqNwkxctJtL/N/JuEj+8QMg8mRNI/NWeKO5/ydfZU=",
+ "zh:1a6d5ce931708aec29d1f3d9e360c2a0c35ba5a54d03eeaff0ce3ca597cd0275",
+ "zh:3411919ba2a5941801e677f0fea08bdd0ae22ba3c9ce3309f55554699e06524a",
+ "zh:81b36138b8f2320dc7f877b50f9e38f4bc614affe68de885d322629dd0d16a29",
+ "zh:95a2a0a497a6082ee06f95b38bd0f0d6924a65722892a856cfd914c0d117f104",
+ "zh:9d3e78c2d1bb46508b972210ad706dd8c8b106f8b206ecf096cd211c54f46990",
+ "zh:a79139abf687387a6efdbbb04289a0a8e7eaca2bd91cdc0ce68ea4f3286c2c34",
+ "zh:aaa8784be125fbd50c48d84d6e171d3fb6ef84a221dbc5165c067ce05faab4c8",
+ "zh:afecd301f469975c9d8f350cc482fe656e082b6ab0f677d1a816c3c615837cc1",
+ "zh:c54c22b18d48ff9053d899d178d9ffef7d9d19785d9bf310a07d648b7aac075b",
+ "zh:db2eefd55aea48e73384a555c72bac3f7d428e24147bedb64e1a039398e5b903",
+ "zh:ee61666a233533fd2be971091cecc01650561f1585783c381b6f6e8a390198a4",
+ "zh:f569b65999264a9416862bca5cd2a6177d94ccb0424f3a4ef424428912b9cb3c",
+ ]
+}
+
+provider "registry.terraform.io/hashicorp/kubernetes" {
+ version = "3.0.1"
+ hashes = [
+ "h1:P0c8knzZnouTNFIRij8IS7+pqd0OKaFDYX0j4GRsiqo=",
+ "zh:02d55b0b2238fd17ffa12d5464593864e80f402b90b31f6e1bd02249b9727281",
+ "zh:20b93a51bfeed82682b3c12f09bac3031f5bdb4977c47c97a042e4df4fb2f9ba",
+ "zh:6e14486ecfaee38c09ccf33d4fdaf791409f90795c1b66e026c226fad8bc03c7",
+ "zh:8d0656ff422df94575668e32c310980193fccb1c28117e5c78dd2d4050a760a6",
+ "zh:9795119b30ec0c1baa99a79abace56ac850b6e6fbce60e7f6067792f6eb4b5f4",
+ "zh:b388c87acc40f6bd9620f4e23f01f3c7b41d9b88a68d5255dec0a72f0bdec249",
+ "zh:b59abd0a980649c2f97f172392f080eaeb18e486b603f83bf95f5d93aeccc090",
+ "zh:ba6e3060fddf4a022087d8f09e38aa0001c705f21170c2ded3d1c26c12f70d97",
+ "zh:c12626d044b1d5501cf95ca78cbe507c13ad1dd9f12d4736df66eb8e5f336eb8",
+ "zh:c55203240d50f4cdeb3df1e1760630d677679f5b1a6ffd9eba23662a4ad05119",
+ "zh:ea206a5a32d6e0d6e32f1849ad703da9a28355d9c516282a8458b5cf1502b2a1",
+ "zh:f569b65999264a9416862bca5cd2a6177d94ccb0424f3a4ef424428912b9cb3c",
+ ]
+}
diff --git a/stacks/f1-stream/backend.tf b/stacks/f1-stream/backend.tf
new file mode 100644
index 00000000..3ad5ca2f
--- /dev/null
+++ b/stacks/f1-stream/backend.tf
@@ -0,0 +1,6 @@
+# Generated by Terragrunt. Sig: nIlQXj57tbuaRZEa
+terraform {
+ backend "local" {
+ path = "/Users/viktorbarzin/code/infra/state/stacks/f1-stream/terraform.tfstate"
+ }
+}
diff --git a/stacks/f1-stream/main.tf b/stacks/f1-stream/main.tf
index 8f939303..faae5095 100644
--- a/stacks/f1-stream/main.tf
+++ b/stacks/f1-stream/main.tf
@@ -13,9 +13,9 @@ locals {
}
module "f1-stream" {
- source = "../../modules/kubernetes/f1-stream"
- tls_secret_name = var.tls_secret_name
- tier = local.tiers.aux
- turn_secret = var.coturn_turn_secret
- public_ip = var.public_ip
+ source = "./module"
+ tls_secret_name = var.tls_secret_name
+ tier = local.tiers.aux
+ turn_secret = var.coturn_turn_secret
+ public_ip = var.public_ip
}
diff --git a/stacks/f1-stream/module/files/.claude/internet-mode-used_DO_NOT_REMOVE_MANUALLY_SECURITY_RISK b/stacks/f1-stream/module/files/.claude/internet-mode-used_DO_NOT_REMOVE_MANUALLY_SECURITY_RISK
new file mode 100644
index 00000000..f61efc83
--- /dev/null
+++ b/stacks/f1-stream/module/files/.claude/internet-mode-used_DO_NOT_REMOVE_MANUALLY_SECURITY_RISK
@@ -0,0 +1,3 @@
+This directory has been used with Claude Code's internet mode.
+Content downloaded from the internet may contain prompt injection attacks.
+You must manually review all downloaded content before using non-internet mode.
diff --git a/modules/kubernetes/f1-stream/files/.dockerignore b/stacks/f1-stream/module/files/.dockerignore
similarity index 100%
rename from modules/kubernetes/f1-stream/files/.dockerignore
rename to stacks/f1-stream/module/files/.dockerignore
diff --git a/stacks/f1-stream/module/files/.planning/PROJECT.md b/stacks/f1-stream/module/files/.planning/PROJECT.md
new file mode 100644
index 00000000..0c102123
--- /dev/null
+++ b/stacks/f1-stream/module/files/.planning/PROJECT.md
@@ -0,0 +1,78 @@
+# F1 Stream
+
+## What This Is
+
+A self-hosted web app that aggregates live Formula 1 streaming links from Reddit and user submissions, presenting them in a clean UI with embedded iframes. It scrapes r/motorsportsstreams2, allows users to submit their own stream URLs, and provides admin controls for content moderation. Built in Go with vanilla JS frontend, deployed on Kubernetes.
+
+## Core Value
+
+Users can find working F1 streams quickly — the app automatically discovers, validates, and surfaces healthy streams while removing dead ones.
+
+## Requirements
+
+### Validated
+
+
+
+- ✓ Reddit scraper polls r/motorsportsstreams2 for F1-related posts — existing
+- ✓ URL extraction from post bodies and comment trees — existing
+- ✓ F1 keyword filtering with negative keyword exclusion — existing
+- ✓ Domain filtering (reddit, imgur, youtube, twitter excluded) — existing
+- ✓ Deduplication via normalized URLs — existing
+- ✓ User stream submission (anonymous + authenticated) — existing
+- ✓ WebAuthn passwordless authentication — existing
+- ✓ Admin approval workflow for user-submitted streams — existing
+- ✓ HTTP proxy with rate limiting, private IP blocking, CSP stripping — existing
+- ✓ Static frontend with iframe-based stream viewing — existing
+- ✓ Default seed streams on first run — existing
+- ✓ Stale link cleanup (24h) — existing
+- ✓ Client-side health sort (reorder by reachability) — existing
+
+### Active
+
+
+
+- [ ] Scraper validates extracted URLs look like actual streams (video/player content), not random links
+- [ ] Server-side health checker runs every 5 minutes against all known streams
+- [ ] Health check: HTTP reachability check first, then proxy-fetch to detect video/player markers
+- [ ] Configurable health check timeout
+- [ ] Streams marked unhealthy after 5 consecutive check failures get hidden from public page
+- [ ] Unhealthy streams retried on each check cycle — restored if they recover
+- [ ] Scraped streams that pass health checks auto-published to main streams page
+- [ ] Dead streams dynamically removed from the page without manual intervention
+- [ ] Health status persisted (failure count, last check time, healthy/unhealthy state)
+
+### Out of Scope
+
+- Database migration (SQLite/PostgreSQL) — file-based storage is fine for this scope
+- Multiple subreddit sources — stick with r/motorsportsstreams2 for now
+- Real-time WebSocket push of stream status — polling is sufficient
+- Mobile app — web-only
+- OAuth/social login — WebAuthn is sufficient
+
+## Context
+
+- The app runs on a personal Kubernetes cluster, deployed via Terraform
+- Single-user / small-group usage — performance at scale is not a concern
+- The existing client-side `sortStreamsByHealth` does a basic `no-cors` fetch but can't inspect content; server-side checks via the proxy can do deeper validation
+- Reddit's public JSON API requires no auth but rate-limits aggressively; the scraper already handles 429s with backoff
+- Stream sites frequently go down, change URLs, or get taken down — health checking is essential for a good UX
+
+## Constraints
+
+- **Tech stack**: Go backend, vanilla JS frontend — no new frameworks or dependencies unless strictly necessary
+- **Storage**: File-based JSON — no database
+- **Deployment**: Docker container on Kubernetes, single replica
+- **Reddit API**: Public JSON endpoints, must respect rate limits (1 req/sec delay already in place)
+
+## Key Decisions
+
+| Decision | Rationale | Outcome |
+|----------|-----------|---------|
+| Server-side health checks over client-side only | Client can't inspect response content (CORS); server proxy can detect video markers | — Pending |
+| 5 consecutive failures before hiding | Avoids flapping — streams that are temporarily down aren't immediately removed | — Pending |
+| Auto-publish scraped streams that pass health | Reduces manual admin work; the health check is the quality gate | — Pending |
+| Health check every 5 minutes | Balances freshness vs. load — streams don't change status that frequently | — Pending |
+
+---
+*Last updated: 2026-02-17 after initialization*
diff --git a/stacks/f1-stream/module/files/.planning/REQUIREMENTS.md b/stacks/f1-stream/module/files/.planning/REQUIREMENTS.md
new file mode 100644
index 00000000..c50a1f71
--- /dev/null
+++ b/stacks/f1-stream/module/files/.planning/REQUIREMENTS.md
@@ -0,0 +1,115 @@
+# Requirements: F1 Stream
+
+**Defined:** 2026-02-17
+**Core Value:** Users can find working F1 streams quickly — the app automatically discovers, validates, and surfaces healthy streams while removing dead ones.
+
+## v1 Requirements
+
+Requirements for initial release. Each maps to roadmap phases.
+
+### Scraper Validation
+
+- [ ] **SCRP-01**: Scraper filters Reddit posts by F1 keywords before extracting URLs (existing behavior, preserve)
+- [ ] **SCRP-02**: Scraper validates each extracted URL by proxy-fetching it and checking for video/player content markers (video tags, HLS/DASH manifests, common player libraries)
+- [ ] **SCRP-03**: URLs that don't look like streams (no video markers detected) are discarded before saving
+- [ ] **SCRP-04**: Validation has a configurable timeout (default 10s) to avoid blocking on slow sites
+
+### Health Checking
+
+- [ ] **HLTH-01**: Background health checker service runs every 5 minutes against all known streams (scraped + user-submitted)
+- [ ] **HLTH-02**: Health check performs HTTP reachability check first (does the URL respond with 2xx?)
+- [ ] **HLTH-03**: If HTTP check passes, health checker proxy-fetches the page and checks for video/player content markers
+- [ ] **HLTH-04**: Health check has a configurable timeout per check (default 10s)
+- [ ] **HLTH-05**: Each stream tracks consecutive failure count, last check time, and healthy/unhealthy status in persisted state
+- [ ] **HLTH-06**: Stream marked unhealthy after 5 consecutive health check failures
+- [ ] **HLTH-07**: Unhealthy streams hidden from public streams page (`GET /api/streams/public`)
+- [ ] **HLTH-08**: Unhealthy streams continue to be checked — restored to healthy if they recover (failure count resets)
+- [ ] **HLTH-09**: Health check interval configurable via `HEALTH_CHECK_INTERVAL` env var (default 5m)
+
+### Auto-publish Pipeline
+
+- [ ] **AUTO-01**: Scraped streams that pass both scraper validation and initial health check are auto-published to the main streams page
+- [ ] **AUTO-02**: Dead streams (unhealthy after 5 failures) are dynamically removed from the public page without admin intervention
+- [ ] **AUTO-03**: Auto-published streams are distinguishable from user-submitted streams in the data model (source field)
+
+### Secure Embedding
+
+- [ ] **EMBED-01**: Proxy fetches stream page and attempts to extract direct video source URL (HLS .m3u8, DASH .mpd, direct MP4/WebM, or embedded video player source)
+- [ ] **EMBED-02**: When direct video source is found, render it in a minimal HTML5 video player on the app's own page (no third-party page loaded)
+- [ ] **EMBED-03**: When direct extraction fails, fall back to rendering the full proxied page in a shadow DOM sandbox
+- [ ] **EMBED-04**: Shadow DOM sandbox blocks `window.open`, `window.top` navigation, popup creation, and `alert`/`confirm`/`prompt`
+- [ ] **EMBED-05**: Shadow DOM sandbox prevents access to parent page cookies and localStorage
+- [ ] **EMBED-06**: Proxy strips known ad/tracker scripts and domains from proxied content before serving
+- [ ] **EMBED-07**: Proxy rewrites relative URLs in proxied content to route through the proxy (so sub-resources load correctly)
+- [ ] **EMBED-08**: All proxied content served with strict CSP headers scoped to the sandbox context
+
+## v2 Requirements
+
+Deferred to future release. Tracked but not in current roadmap.
+
+### Enhanced Sources
+
+- **SRC-01**: Support scraping from additional subreddits or Discord channels
+- **SRC-02**: User-reported stream quality ratings
+
+### UI Enhancements
+
+- **UI-01**: Real-time WebSocket push of stream health status changes
+- **UI-02**: Stream quality indicator (resolution, bitrate if detectable)
+- **UI-03**: Stream viewer count or popularity metric
+
+### Security Hardening
+
+- **SEC-01**: Ad-blocker filter list integration (uBlock Origin lists)
+- **SEC-02**: JavaScript AST analysis for malicious patterns before allowing execution
+
+## Out of Scope
+
+| Feature | Reason |
+|---------|--------|
+| Database migration (SQLite/PostgreSQL) | File-based storage is sufficient for current scale |
+| Multiple replica deployment | Single-user/small-group usage, single replica is fine |
+| Mobile app | Web-only, responsive design sufficient |
+| OAuth/social login | WebAuthn already works |
+| Full browser automation (Puppeteer/Playwright) | Too heavy for stream validation; HTTP-based checks are sufficient |
+| Video transcoding/re-streaming | Out of scope — we link to or proxy existing streams |
+
+## Traceability
+
+Which phases cover which requirements. Updated during roadmap creation.
+
+| Requirement | Phase | Status |
+|-------------|-------|--------|
+| SCRP-01 | Phase 1 | Pending |
+| SCRP-02 | Phase 1 | Pending |
+| SCRP-03 | Phase 1 | Pending |
+| SCRP-04 | Phase 1 | Pending |
+| HLTH-01 | Phase 2 | Pending |
+| HLTH-02 | Phase 2 | Pending |
+| HLTH-03 | Phase 2 | Pending |
+| HLTH-04 | Phase 2 | Pending |
+| HLTH-05 | Phase 2 | Pending |
+| HLTH-06 | Phase 2 | Pending |
+| HLTH-07 | Phase 2 | Pending |
+| HLTH-08 | Phase 2 | Pending |
+| HLTH-09 | Phase 2 | Pending |
+| AUTO-01 | Phase 3 | Pending |
+| AUTO-02 | Phase 3 | Pending |
+| AUTO-03 | Phase 3 | Pending |
+| EMBED-01 | Phase 4 | Pending |
+| EMBED-02 | Phase 4 | Pending |
+| EMBED-03 | Phase 5 | Pending |
+| EMBED-04 | Phase 5 | Pending |
+| EMBED-05 | Phase 5 | Pending |
+| EMBED-06 | Phase 5 | Pending |
+| EMBED-07 | Phase 5 | Pending |
+| EMBED-08 | Phase 5 | Pending |
+
+**Coverage:**
+- v1 requirements: 24 total
+- Mapped to phases: 24
+- Unmapped: 0
+
+---
+*Requirements defined: 2026-02-17*
+*Last updated: 2026-02-17 after roadmap creation*
diff --git a/stacks/f1-stream/module/files/.planning/ROADMAP.md b/stacks/f1-stream/module/files/.planning/ROADMAP.md
new file mode 100644
index 00000000..d79f7d42
--- /dev/null
+++ b/stacks/f1-stream/module/files/.planning/ROADMAP.md
@@ -0,0 +1,106 @@
+# Roadmap: F1 Stream
+
+## Overview
+
+This roadmap delivers server-side stream quality assurance and secure viewing. First, the scraper learns to validate that extracted URLs actually contain video content. Then a background health checker continuously monitors all streams. These combine into an auto-publish pipeline that surfaces good streams and hides dead ones without admin intervention. Finally, secure embedding replaces raw iframes with native video playback where possible and a hardened sandbox fallback for everything else.
+
+## Phases
+
+**Phase Numbering:**
+- Integer phases (1, 2, 3): Planned milestone work
+- Decimal phases (2.1, 2.2): Urgent insertions (marked with INSERTED)
+
+Decimal phases appear between their surrounding integers in numeric order.
+
+- [ ] **Phase 1: Scraper Validation** - Scraper validates extracted URLs contain video/player content before saving
+- [ ] **Phase 2: Health Check Infrastructure** - Background service continuously monitors stream health and persists status
+- [ ] **Phase 3: Auto-publish Pipeline** - Healthy scraped streams auto-publish; dead streams auto-hide
+- [ ] **Phase 4: Video Extraction and Native Playback** - Extract direct video sources and play them in a native HTML5 player
+- [ ] **Phase 5: Sandbox and Proxy Hardening** - Fallback rendering in a sandboxed shadow DOM with ad stripping and strict CSP
+
+## Phase Details
+
+### Phase 1: Scraper Validation
+**Goal**: Scraped URLs are verified to contain actual video/player content before being stored, eliminating junk links at the source
+**Depends on**: Nothing (extends existing scraper)
+**Requirements**: SCRP-01, SCRP-02, SCRP-03, SCRP-04
+**Success Criteria** (what must be TRUE):
+ 1. Scraper still discovers F1-related posts from Reddit using keyword filtering (existing behavior preserved)
+ 2. Each extracted URL is proxy-fetched and inspected for video/player content markers (video tags, HLS/DASH manifests, player libraries)
+ 3. URLs without video content markers are discarded and do not appear in scraped.json
+ 4. Validation respects a configurable timeout so slow sites do not block the scrape cycle
+**Plans**: 1 plan
+
+Plans:
+- [ ] 01-01-PLAN.md — Add URL validation with video marker detection to scraper pipeline
+
+### Phase 2: Health Check Infrastructure
+**Goal**: All known streams are continuously monitored for health, with status persisted and unhealthy streams hidden from users
+**Depends on**: Phase 1 (reuses content validation logic from scraper validation)
+**Requirements**: HLTH-01, HLTH-02, HLTH-03, HLTH-04, HLTH-05, HLTH-06, HLTH-07, HLTH-08, HLTH-09
+**Success Criteria** (what must be TRUE):
+ 1. A background service checks every known stream (scraped and user-submitted) on a regular interval that defaults to 5 minutes and is configurable via environment variable
+ 2. Each check performs HTTP reachability first, then proxy-fetches the page to verify video/player content markers
+ 3. Each stream's health state (consecutive failure count, last check time, healthy/unhealthy flag) is persisted across restarts
+ 4. A stream is hidden from the public streams page after 5 consecutive check failures, and restored if it later passes a check
+ 5. Health check timeout per stream is configurable
+**Plans**: 2 plans
+
+Plans:
+- [ ] 02-01-PLAN.md — HealthState model, store persistence, export HasVideoContent, create HealthChecker service
+- [ ] 02-02-PLAN.md — Wire health checker in main.go, filter unhealthy streams from public API
+
+### Phase 3: Auto-publish Pipeline
+**Goal**: Scraped streams that pass validation and health checks appear on the public page automatically; dead streams disappear without admin action
+**Depends on**: Phase 1, Phase 2
+**Requirements**: AUTO-01, AUTO-02, AUTO-03
+**Success Criteria** (what must be TRUE):
+ 1. A scraped stream that passes scraper validation and its first health check is visible on the public streams page without any admin approval
+ 2. A stream marked unhealthy (5 consecutive failures) is no longer visible on the public page, with no admin intervention required
+ 3. Auto-published streams are distinguishable from user-submitted streams in the data model (source field tracks origin)
+**Plans**: 1 plan
+
+Plans:
+- [ ] 03-01-PLAN.md — Add Source field to Stream model, create PublishScrapedStream, wire scraper auto-publish
+
+### Phase 4: Video Extraction and Native Playback
+**Goal**: When a stream URL contains an extractable video source, users watch it in a clean native HTML5 player instead of loading the third-party page
+**Depends on**: Nothing (independent of phases 1-3; can be built in parallel but ordered here for delivery focus)
+**Requirements**: EMBED-01, EMBED-02
+**Success Criteria** (what must be TRUE):
+ 1. The proxy can extract direct video source URLs (HLS .m3u8, DASH .mpd, direct MP4/WebM, or embedded player source attributes) from a stream page
+ 2. When a direct video source is found, the user sees a minimal HTML5 video player on the app's own page playing the stream without loading the original third-party page
+**Plans**: 2 plans
+
+Plans:
+- [ ] 04-01-PLAN.md — Backend video source extractor package and API endpoint
+- [ ] 04-02-PLAN.md — Frontend native HTML5 video player with HLS.js and iframe fallback
+
+### Phase 5: Sandbox and Proxy Hardening
+**Goal**: When direct video extraction fails, the proxied page is rendered safely in a sandbox that blocks popups, ads, and access to the parent page
+**Depends on**: Phase 4 (this is the fallback path when extraction fails)
+**Requirements**: EMBED-03, EMBED-04, EMBED-05, EMBED-06, EMBED-07, EMBED-08
+**Success Criteria** (what must be TRUE):
+ 1. When direct video extraction fails, the full proxied page renders inside a shadow DOM sandbox on the app's page
+ 2. The sandbox blocks window.open, top-frame navigation, popup creation, and alert/confirm/prompt dialogs
+ 3. The sandbox prevents the proxied content from accessing parent page cookies and localStorage
+ 4. Known ad/tracker scripts and domains are stripped from proxied content before serving, and relative URLs are rewritten to route through the proxy
+ 5. All proxied content is served with strict CSP headers scoped to the sandbox context
+**Plans**: 2 plans
+
+Plans:
+- [ ] 05-01-PLAN.md — Backend proxy hardening: HTML sanitizer with ad/tracker stripping, URL rewriting, and CSP headers
+- [ ] 05-02-PLAN.md — Frontend shadow DOM sandbox replacing iframe fallback with API overrides
+
+## Progress
+
+**Execution Order:**
+Phases execute in numeric order: 1 -> 2 -> 3 -> 4 -> 5
+
+| Phase | Plans Complete | Status | Completed |
+|-------|----------------|--------|-----------|
+| 1. Scraper Validation | 0/1 | Planned | - |
+| 2. Health Check Infrastructure | 0/2 | Planned | - |
+| 3. Auto-publish Pipeline | 0/1 | Planned | - |
+| 4. Video Extraction and Native Playback | 0/2 | Planned | - |
+| 5. Sandbox and Proxy Hardening | 0/2 | Not started | - |
diff --git a/stacks/f1-stream/module/files/.planning/STATE.md b/stacks/f1-stream/module/files/.planning/STATE.md
new file mode 100644
index 00000000..043af6e1
--- /dev/null
+++ b/stacks/f1-stream/module/files/.planning/STATE.md
@@ -0,0 +1,93 @@
+# Project State
+
+## Project Reference
+
+See: .planning/PROJECT.md (updated 2026-02-17)
+
+**Core value:** Users can find working F1 streams quickly -- the app automatically discovers, validates, and surfaces healthy streams while removing dead ones.
+**Current focus:** Phase 5: Sandbox Proxy Hardening (complete)
+
+## Current Position
+
+Phase: 5 of 5 (Sandbox Proxy Hardening)
+Plan: 2 of 2 in current phase (complete)
+Status: ALL PHASES COMPLETE -- project finished
+Last activity: 2026-02-17 -- Completed 05-02 frontend shadow DOM sandbox
+
+Progress: [██████████] 100%
+
+## Performance Metrics
+
+**Velocity:**
+- Total plans completed: 8
+- Average duration: 2.1min
+- Total execution time: 0.28 hours
+
+**By Phase:**
+
+| Phase | Plans | Total | Avg/Plan |
+|-------|-------|-------|----------|
+| 01-scraper-validation | 1 | 3min | 3min |
+| 02-health-check-infrastructure | 2 | 4min | 2min |
+| 03-auto-publish-pipeline | 1 | 2min | 2min |
+| 04-video-extraction-native-playback | 2 | 5min | 2.5min |
+| 05-sandbox-proxy-hardening | 2 | 3min | 1.5min |
+
+**Recent Trend:**
+- Last 5 plans: 2min, 3min, 2min, 2min, 1min
+- Trend: Stable
+
+*Updated after each plan completion*
+
+## Accumulated Context
+
+### Decisions
+
+Decisions are logged in PROJECT.md Key Decisions table.
+Recent decisions affecting current work:
+
+- Server-side health checks chosen over client-only (client can't inspect CORS responses)
+- 5 consecutive failures threshold to avoid flapping
+- Auto-publish for scraped streams that pass health check (health check is the quality gate)
+- 5-minute health check interval (freshness vs load balance)
+- String matching over DOM parsing for video detection (DOM reserved for Phase 4)
+- 2MB body limit for HTML inspection to prevent memory issues
+- 3 redirect limit to avoid infinite redirect chains on stream sites
+- HealthMap reads file without lock to avoid deadlock from cross-lock scenarios
+- Single HasVideoContent call covers both reachability and content checks
+- Orphaned health state entries pruned each cycle to prevent unbounded file growth
+- URLs not in health map assumed healthy to prevent new streams disappearing before first check
+- HealthMap called within streamsMu/scrapedMu read locks safely via lock-free file read
+- Source field uses string values (user/system/scraped) for readability over int enum
+- PublishScrapedStream deduplicates by exact URL match; normalized matching stays in scraper layer
+- Auto-publish iterates all validated links each cycle; deduplication makes repeat calls no-ops
+- DOM parsing with golang.org/x/net/html for structured video source extraction (Phase 4)
+- Dual extraction strategy: DOM walking + regex script parsing for maximum video URL coverage
+- Priority ordering HLS > DASH > MP4 > WebM for frontend source selection
+- 5-minute cache on extract endpoint to reduce upstream load
+- Empty sources array (not error) when no video found to distinguish from fetch failures
+- HLS.js loaded from jsDelivr CDN to avoid bundling complexity
+- Extraction runs async after card render -- progressive enhancement with shadow DOM sandbox fallback
+- DASH sources fall back to shadow DOM sandbox (dash.js too heavy for current scope)
+- Silent console.log on extraction failure -- no user-facing errors for extraction issues
+- 50+ ad/tracker domains in blocklist with parent-domain walk-up matching
+- Inline scripts kept for video players; blocked scripts removed by domain
+- CSP allows img/media/connect broadly since video sources come from arbitrary origins
+- Non-HTML sub-resources proxied as-is with CSP headers
+- Closed shadow DOM mode prevents external JS from accessing shadow root
+- Script element created via createElement for execution in shadow DOM (innerHTML scripts don't execute)
+- Direct link fallback when sandbox proxy fetch fails rather than broken state
+
+### Pending Todos
+
+None yet.
+
+### Blockers/Concerns
+
+None yet.
+
+## Session Continuity
+
+Last session: 2026-02-17
+Stopped at: Completed 05-02-PLAN.md (frontend shadow DOM sandbox) -- ALL PHASES COMPLETE
+Resume file: None
diff --git a/stacks/f1-stream/module/files/.planning/codebase/ARCHITECTURE.md b/stacks/f1-stream/module/files/.planning/codebase/ARCHITECTURE.md
new file mode 100644
index 00000000..76ebca6b
--- /dev/null
+++ b/stacks/f1-stream/module/files/.planning/codebase/ARCHITECTURE.md
@@ -0,0 +1,191 @@
+# Architecture
+
+**Analysis Date:** 2026-02-17
+
+## Pattern Overview
+
+**Overall:** Layered monolithic service with clear separation between HTTP API layer, business logic, and persistent storage layer.
+
+**Key Characteristics:**
+- Single Go binary serving both API and static frontend
+- File-based JSON persistence (no database)
+- Modular internal packages for distinct concerns
+- WebAuthn-based passwordless authentication
+- Background scraper for content aggregation
+- Rate-limited proxy service
+
+## Layers
+
+**HTTP Handler Layer:**
+- Purpose: Accept and route HTTP requests, apply middleware, respond to clients
+- Location: `internal/server/`
+- Contains: Route registration, handler functions, middleware chains
+- Depends on: Auth, Store, Proxy, Scraper packages
+- Used by: HTTP clients (browser, mobile)
+
+**Authentication & Authorization Layer:**
+- Purpose: Manage user registration, login, sessions, and permission checks
+- Location: `internal/auth/`
+- Contains: WebAuthn ceremony implementations, session management, context helpers
+- Depends on: Store, go-webauthn library
+- Used by: Server middleware and handlers
+
+**Business Logic Layer:**
+- Purpose: Core domain operations (stream management, scraping, proxying)
+- Location: `internal/scraper/`, `internal/proxy/`
+- Contains: Scraper service (Reddit polling), Proxy service (content fetching with rate limiting)
+- Depends on: Store for persistence
+- Used by: Server, main entry point for orchestration
+
+**Data Model Layer:**
+- Purpose: Define domain types and interfaces
+- Location: `internal/models/models.go`
+- Contains: `User`, `Stream`, `ScrapedLink`, `Session` types
+- Depends on: External WebAuthn library for credential types
+- Used by: All layers
+
+**Persistence Layer:**
+- Purpose: Provide file-based storage abstraction
+- Location: `internal/store/`
+- Contains: JSON read/write helpers, file-based storage per entity type (streams, users, sessions, scraped links)
+- Depends on: Models, filesystem
+- Used by: All business logic layers
+
+## Data Flow
+
+**Stream Submission Flow:**
+
+1. Client submits stream URL and title via `POST /api/streams`
+2. Server handler validates URL format and length
+3. Optional: If authenticated user, stream marked as unpublished; if anonymous, marked as published
+4. Stream stored via `Store.AddStream()` which reads current `streams.json`, appends new stream, writes atomically
+5. Response returned with stream metadata
+
+**Authentication Flow (WebAuthn):**
+
+1. User initiates registration with `POST /api/auth/register/begin` sending username
+2. Server validates username format, checks uniqueness, creates temporary user
+3. Server generates WebAuthn registration options via go-webauthn library
+4. Server stores session data in memory with 5-minute expiry
+5. Client performs attestation ceremony, sends credential via `POST /api/auth/register/finish?username=...`
+6. Server retrieves in-memory session, validates with go-webauthn
+7. Credential appended to user in `users.json`
+8. Session token created in `sessions.json`, set as HttpOnly cookie
+
+**Scraper Flow:**
+
+1. Scraper runs on timer (default 15 minutes) or on manual trigger
+2. Calls `scrapeReddit()` to poll r/motorsportsstreams2 new posts
+3. Extracts URLs using regex, filters by F1-related keywords
+4. Merges with existing `scraped.json`, deduplicating by normalized URL
+5. Writes updated list atomically
+6. Stale entries cleaned up, active ones returned via `GET /api/scraped`
+
+**Proxy Flow:**
+
+1. Client requests `GET /proxy?url=https://...`
+2. Server validates URL scheme (must be HTTPS), length, and target is not private IP
+3. Applies rate limiting via token bucket per client IP
+4. Fetches URL with timeout, limits response body to 5MB
+5. Injects `
Hello world
`, false}, + {"reddit link page", `Click here`, false}, + {"blog post", `