Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
36 commits
Select commit Hold shift + click to select a range
88fb42b
remove deprecated runtime values
maciaszczykm Feb 9, 2026
f367001
update console, cert manager and runtime values folders
maciaszczykm Feb 9, 2026
95b8e30
update README to clarify helm values folder structure
maciaszczykm Feb 9, 2026
94e9b58
ignore temporary bootstrap files
maciaszczykm Feb 9, 2026
34a4f95
format template
maciaszczykm Feb 9, 2026
23cf530
centralize owner email declaration in runtime values template
maciaszczykm Feb 9, 2026
91fd8bc
add .gitkeep to maintain directory structure
maciaszczykm Feb 9, 2026
3beea4f
update .gitignore to generalize temporary file exclusion during boots…
maciaszczykm Feb 9, 2026
b3ab1b2
add runtime.yaml.tpl for secret management
maciaszczykm Feb 9, 2026
e4b4fc6
update values templates for improved configuration management
maciaszczykm Feb 9, 2026
0121098
remove .gitkeep from helm directory
maciaszczykm Feb 9, 2026
0201095
refactor values templates to standardize configuration and secret han…
maciaszczykm Feb 9, 2026
a34fef6
refactor values templates to standardize configuration and secret han…
maciaszczykm Feb 9, 2026
c3aba42
fix values template syntax for owner email configuration
maciaszczykm Feb 9, 2026
8d6c9cf
connect runtime service with its configuration
maciaszczykm Feb 9, 2026
062f2dd
update file paths for certmanager and flux configurations
maciaszczykm Feb 9, 2026
d1c9d30
use temp helm values during runtime install
maciaszczykm Feb 9, 2026
0c65d39
use single values for runtime
maciaszczykm Feb 9, 2026
a0cd1d0
use terraform to create secrets
maciaszczykm Feb 9, 2026
721a721
Revert "use single values for runtime"
maciaszczykm Feb 9, 2026
fbc117b
add .gitkeep to temp directory in .gitignore
maciaszczykm Feb 9, 2026
278717e
remove .gitkeep exception for temp directory in .gitignore
maciaszczykm Feb 9, 2026
e2157ff
update README to clarify purpose of temp directory in gitignore
maciaszczykm Feb 9, 2026
fef19b7
add kubernetes secret resource for console configuration
maciaszczykm Feb 9, 2026
76b21e9
add console and kas DNS entries to config secrets
maciaszczykm Feb 10, 2026
1e4f81c
add postgres URL to config secrets
maciaszczykm Feb 10, 2026
ce6fcab
add cluster issuer to console configuration secret
maciaszczykm Feb 10, 2026
bfcf295
add admin credentials to config secrets
maciaszczykm Feb 10, 2026
d110612
refactor console configuration secrets to use local values and update…
maciaszczykm Feb 10, 2026
49fd6f1
update console Helm configuration to reference runtime-config and adj…
maciaszczykm Feb 10, 2026
1380712
add kubernetes namespace resource for infra and update secret namespaces
maciaszczykm Feb 10, 2026
93c8eb9
remove outdated test/helm-values entry from .gitignore
maciaszczykm Feb 10, 2026
fe1905e
refactor config secrets to remove base64 encoding for string values
maciaszczykm Feb 10, 2026
9b90bda
refactor config secrets to use snake_case for local variable keys
maciaszczykm Feb 10, 2026
581cace
update console Helm chart version to 0.3.139
maciaszczykm Feb 11, 2026
85bd184
fix configuration ref
maciaszczykm Feb 11, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 4 additions & 3 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -33,9 +33,10 @@ override.tf.json
.terraformrc
terraform.rc

test/helm-values

# IDE
.idea/

**/values.secret.yaml
**/values.secret.yaml

# Temporary files used during bootstrap
temp/
8 changes: 4 additions & 4 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -22,11 +22,9 @@ Our defaults are meant to be tweaked, feel free to reference the documentation o
A plural installation repo will have a folder structure like this:

```
helm-values/ # git-crypted helm values to be used to bootstrap your setup. Avoid editing unless necessary
helm/ # helm values files
- ${app}.yaml # value overrides
- ${app}-defaults.yaml # default values we generate on install

helm/ # helm values files that are meant to be user-editable, used for setup of many common components
- *.yaml{.liquid} # `.liquid` extension signifies the helm values file can be templated

bootstrap/ # setup for apps within your cluster fleet, this is the root service-of-services that bootstraps everything recursively
Expand All @@ -40,6 +38,8 @@ terraform/
- - clusters
- - - {cloud} # we've crafted some reusable modules for setting up clusters on most major clouds, feel free to use these in stacks or wherever
- ${app}/ - submodule for individual app's terraform

temp/ # a temp folder used during bootstrap that is gitignored
```

You're free to extend this as you'd like, although if you use the plural marketplace that structure will be expected. You can also deploy services w/ manifests in other repos, this is meant to serve as a base to define the core infrastructure and get you started in a sane way.
Expand Down Expand Up @@ -113,7 +113,7 @@ spec:
namespace: infra
git:
ref: main
folder: helm-values # or wherever else you want to store the helm values
folder: helm # or wherever else you want to store the helm values
helm:
version: 6.31.4
chart: externaldns
Expand Down
78 changes: 78 additions & 0 deletions charts/runtime/values.yaml.liquid.tpl
Original file line number Diff line number Diff line change
@@ -0,0 +1,78 @@
ownerEmail: {{ "{{ configuration.ownerEmail }}" }}

{{ if not .Cloud }}
external-dns:
extraArgs:
plural-cluster: {{ .Cluster }}
plural-provider: {{ .Provider }}
domainFilters:
- {{ .Subdomain }}

dnsSolver:
webhook:
groupName: acme.plural.sh
solverName: plural-solver
config:
cluster: {{ .Cluster }}
provider: {{ .Provider }}

pluralToken: {{ "{{ configuration.pluralToken }}" }}

acmeEAB:
kid: {{ "{{ configuration.acmeEABKid }}" }}
secret: {{ "{{ configuration.acmeEABSecret }}" }}
{{ end }}

{{ if .Cloud }}
external-dns:
enabled: false

plural-certmanager-webhook:
enabled: false

operator:
enabled: false

application:
enabled: false

plural:
enabled: false

ingress-nginx:
enabled: false
ingress-nginx-private:
enabled: false
{{ end }}

{{ if and (eq .Provider "aws") (not .Cloud) }}
ingress-nginx:
controller:
service:
annotations:
service.beta.kubernetes.io/aws-load-balancer-scheme: internet-facing
service.beta.kubernetes.io/aws-load-balancer-backend-protocol: tcp
service.beta.kubernetes.io/aws-load-balancer-cross-zone-load-balancing-enabled: 'true'
service.beta.kubernetes.io/aws-load-balancer-type: external
service.beta.kubernetes.io/aws-load-balancer-nlb-target-type: ip
service.beta.kubernetes.io/aws-load-balancer-proxy-protocol: "*"
service.beta.kubernetes.io/aws-load-balancer-connection-idle-timeout: '3600'
config:
compute-full-forwarded-for: 'true'
use-forwarded-headers: 'true'
use-proxy-protocol: 'true'
ingress-nginx-private:
controller:
service:
annotations:
service.beta.kubernetes.io/aws-load-balancer-backend-protocol: tcp
service.beta.kubernetes.io/aws-load-balancer-cross-zone-load-balancing-enabled: 'true'
service.beta.kubernetes.io/aws-load-balancer-type: external
service.beta.kubernetes.io/aws-load-balancer-nlb-target-type: ip
service.beta.kubernetes.io/aws-load-balancer-proxy-protocol: "*"
service.beta.kubernetes.io/aws-load-balancer-connection-idle-timeout: '3600'
config:
compute-full-forwarded-for: 'true'
use-forwarded-headers: 'true'
use-proxy-protocol: 'true'
{{ end }}
7 changes: 2 additions & 5 deletions charts/runtime/values.yaml.tpl
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
ownerEmail: {{ .Config.Email }}

{{ if not .Cloud }}
external-dns:
extraArgs:
Expand All @@ -14,7 +16,6 @@ dnsSolver:
cluster: {{ .Cluster }}
provider: {{ .Provider }}

ownerEmail: {{ .Config.Email }}
pluralToken: {{ .Config.Token }}

acmeEAB:
Expand All @@ -23,10 +24,6 @@ acmeEAB:
{{ end }}

{{ if .Cloud }}

ownerEmail: {{ .Config.Email }}


external-dns:
enabled: false

Expand Down
74 changes: 0 additions & 74 deletions helm/runtime.yaml

This file was deleted.

2 changes: 1 addition & 1 deletion setup/cert-manager.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ metadata:
spec:
namespace: cert-manager
git:
folder: helm-values
folder: helm
ref: [[ or .Context.Branch "main" ]]
repositoryRef:
kind: GitRepository
Expand Down
7 changes: 5 additions & 2 deletions setup/console.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -6,18 +6,21 @@ metadata:
spec:
namespace: plrl-console
git:
folder: helm-values
folder: helm
ref: [[ or .Context.Branch "main" ]]
repositoryRef:
kind: GitRepository
name: infra
namespace: infra
configurationRef:
name: console-config
namespace: infra
helm:
version: "0.x.x"
chart: console
url: https://pluralsh.github.io/console
valuesFiles:
- console.yaml
- console.yaml.liquid
clusterRef:
kind: Cluster
name: mgmt
Expand Down
7 changes: 5 additions & 2 deletions setup/runtime.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -6,18 +6,21 @@ metadata:
spec:
namespace: plural-runtime
git:
folder: helm-values
folder: helm
ref: [[ or .Context.Branch "main" ]]
repositoryRef:
kind: GitRepository
name: infra
namespace: infra
configurationRef:
name: runtime-config
namespace: infra
helm:
version: "0.x.x"
chart: runtime
url: https://pluralsh.github.io/bootstrap
valuesFiles:
- runtime.yaml
- runtime.yaml.liquid
clusterRef:
kind: Cluster
name: mgmt
Expand Down
69 changes: 69 additions & 0 deletions templates/setup/config-secrets.tf
Original file line number Diff line number Diff line change
@@ -0,0 +1,69 @@
# This file should not be commited to repository.

locals {
console_values = yamldecode(data.local_sensitive_file.console.content)
}

resource "kubernetes_namespace" "infra" {
metadata {
name = "infra"
}

depends_on = [module.mgmt.cluster, module.mgmt.ready]
}

resource "kubernetes_secret" "console_config" {
metadata {
name = "console-config"
namespace = kubernetes_namespace.infra.metadata[0].name
}

type = "Opaque"

data = {
consoleDns = tostring(try(local.console_values.ingress.console_dns, ""))
kasDns = tostring(try(local.console_values.ingress.kas_dns, ""))

clusterIssuer = "plural"

provider = tostring(try(local.console_values.provider, ""))

jwt = tostring(try(local.console_values.secrets.jwt, ""))
erlang = tostring(try(local.console_values.secrets.erlang, ""))
aesKey = tostring(try(local.console_values.secrets.aes_key, ""))
key = tostring(try(local.console_values.secrets.key, ""))
identity = tostring(try(local.console_values.secrets.identity, ""))
pluralClientId = tostring(try(local.console_values.secrets.plural_client_id, ""))
pluralClientSecret = tostring(try(local.console_values.secrets.plural_client_secret, ""))
adminName = tostring(try(local.console_values.secrets.admin_name, ""))
adminEmail = tostring(try(local.console_values.secrets.admin_email, ""))
adminPassword = tostring(try(local.console_values.secrets.admin_password, ""))
clusterName = tostring(try(local.console_values.secrets.cluster_name, ""))

pluralToken = tostring(try(local.console_values.extraSecretEnv.PLURAL_TOKEN, ""))
kasApi = tostring(try(local.console_values.extraSecretEnv.KAS_API_SECRET, ""))
kasPrivateApi = tostring(try(local.console_values.extraSecretEnv.KAS_PRIVATE_API_SECRET, ""))
kasRedis = tostring(try(local.console_values.extraSecretEnv.KAS_REDIS_SECRET, ""))
postgresUrl = tostring(try(local.console_values.extraSecretEnv.POSTGRES_URL, ""))
}

depends_on = [kubernetes_namespace.infra, module.mgmt.cluster, module.mgmt.ready]
}

resource "kubernetes_secret" "runtime_config" {
metadata {
name = "runtime-config"
namespace = kubernetes_namespace.infra.metadata[0].name
}

type = "Opaque"

data = {
ownerEmail = "{{ .Config.Email }}"
pluralToken = "{{ .Config.Token }}"
acmeEABKid = "{{ .Acme.KeyId }}"
acmeEABSecret = "{{ .Acme.HmacKey }}"
}

depends_on = [kubernetes_namespace.infra, module.mgmt.cluster, module.mgmt.ready]
}
12 changes: 6 additions & 6 deletions templates/setup/console.tf
Original file line number Diff line number Diff line change
Expand Up @@ -2,24 +2,24 @@
resource "null_resource" "console" {
provisioner "local-exec" {
command = "plural cd control-plane-values --name {{ .Cluster }} --dsn \"${module.mgmt.db_url}\" --domain {{ .Subdomain }} --file console.yaml"
working_dir = "${path.module}/../../helm-values"
working_dir = "${path.module}/../../temp/helm"
}
}

data "local_sensitive_file" "certmanager" {
filename = "${path.module}/../../helm-values/certmanager.yaml"
filename = "${path.module}/../../helm/certmanager.yaml"
}

data "local_sensitive_file" "flux" {
filename = "${path.module}/../../helm-values/flux.yaml"
filename = "${path.module}/../../helm/flux.yaml"
}

data "local_sensitive_file" "runtime" {
filename = "${path.module}/../../helm-values/runtime.yaml"
filename = "${path.module}/../../temp/helm/runtime.yaml"
}

data "local_sensitive_file" "console" {
filename = "${path.module}/../../helm-values/console.yaml"
filename = "${path.module}/../../temp/helm/console.yaml"
depends_on = [null_resource.console]
}

Expand Down Expand Up @@ -76,7 +76,7 @@ resource "helm_release" "console" {
namespace = "plrl-console"
chart = "console"
repository = "https://pluralsh.github.io/console"
version = "0.3.125"
version = "0.3.139"
create_namespace = true
timeout = 600
wait = true
Expand Down