Files
homelab/terraform/argocd-bootstrap.tf
T
Story Crater Bot 08a3fd9bcb feat(phase0): configure ArgoCD SOPS decryption + update encrypted secrets
Phase 0 continuation: enable ArgoCD to decrypt SOPS-encrypted secrets on sync.

1. Update ArgoCD Helm values (terraform/argocd-bootstrap.tf):
   - Add SOPS_AGE_KEY_FILE env var to repoServer
   - Mount sops-age K8s Secret at /home/argocd/.sops
   - Add ConfigManagementPlugin for SOPS (detects *.enc.yaml files)

2. Update encrypted secrets with real values:
   - k8s/base/secrets.enc.yaml: encrypted with actual service credentials
   - All secret values encrypted at rest in git
   - ArgoCD decrypts on sync using K8s Secret + AGE key

Prerequisites:
  - K8s Secret created: kubectl create secret generic sops-age -n argocd --from-file=keys.txt=/Users/rockliang/.sops/key.txt
  - SOPS_AGE_KEY_FILE env var set in ArgoCD repoServer (done above)

Next: Phase 1 — migrate 9 hookless releases to ArgoCD + create Applications that reference encrypted secrets.
2026-08-18 15:08:01 -07:00

218 lines
5.0 KiB
Terraform

resource "kubernetes_namespace" "argocd" {
metadata {
name = "argocd"
labels = {
"pod-security.kubernetes.io/enforce" = "baseline"
"pod-security.kubernetes.io/enforce-version" = "latest"
}
}
}
# Copy homelab-ca-secret from cert-manager to argocd namespace
# (Required for repo-server pod to verify self-signed forgejo TLS)
resource "null_resource" "copy_ca_secret_to_argocd" {
provisioner "local-exec" {
command = <<-EOT
kubectl get secret homelab-ca-secret -n cert-manager -o yaml | \
sed 's/namespace: cert-manager/namespace: argocd/' | \
kubectl apply -f -
EOT
}
depends_on = [
kubernetes_namespace.argocd
]
}
resource "helm_release" "argocd" {
name = "argocd"
repository = local.helm_repos["argo"]
chart = "argo-cd"
version = "7.3.3"
namespace = kubernetes_namespace.argocd.metadata[0].name
values = [
yamlencode({
global = {
domain = "argocd.${var.cluster_domain}"
}
configs = {
params = {
"application.instanceLabelKey" = "argocd.argoproj.io/instance"
}
rbac = {
"policy.default" = "role:readonly"
}
cmp = {
create = true
plugins = {
sops = {
allowConcurrency = false
discover = {
fileName = "*.enc.yaml"
}
generate = {
command = ["sh", "-c"]
args = ["sops -d \"$ARGOCD_ENV_FILE_PATH\""]
}
lockRepo = false
}
}
}
}
server = {
extraArgs = [
"--insecure"
]
ingress = {
enabled = true
hosts = [
"argocd.${var.cluster_domain}"
]
annotations = {
"nginx.ingress.kubernetes.io/backend-protocol" = "HTTPS"
}
ingressClassName = "nginx"
}
service = {
type = "ClusterIP"
port = 80
}
}
repoServer = {
autoscaling = {
enabled = true
minReplicas = 2
}
env = [
{
name = "GIT_SSL_CAINFO"
value = "/etc/ssl/certs/homelab-ca.crt"
}
{
name = "SOPS_AGE_KEY_FILE"
value = "/home/argocd/.sops/keys.txt"
}
]
volumes = [
{
name = "homelab-ca"
secret = {
secretName = "homelab-ca-secret"
}
}
{
name = "sops-age"
secret = {
secretName = "sops-age"
defaultMode = 384
}
}
]
volumeMounts = [
{
name = "homelab-ca"
mountPath = "/etc/ssl/certs/homelab-ca.crt"
subPath = "tls.crt"
}
{
name = "sops-age"
mountPath = "/home/argocd/.sops"
readOnly = true
}
]
}
controller = {
replicas = 2
}
})
]
depends_on = [
kubernetes_namespace.argocd,
null_resource.copy_ca_secret_to_argocd
]
# Note: lifecycle.ignore_changes removed to allow CA cert update
# This allows TF to inject the homelab-ca-secret for TLS verification
}
resource "kubernetes_manifest" "argocd_project" {
manifest = {
apiVersion = "argoproj.io/v1alpha1"
kind = "AppProject"
metadata = {
name = "homelab"
namespace = kubernetes_namespace.argocd.metadata[0].name
}
spec = {
sourceRepos = [
"https://forgejo.riotpiao.homelab.com/riotpiao.com/*"
]
destinations = [
{
server = "https://kubernetes.default.svc"
namespace = "*"
}
]
clusterResourceWhitelist = [
{
group = "*"
kind = "*"
}
]
}
}
field_manager {
name = "terraform"
}
depends_on = [
helm_release.argocd
]
}
resource "kubernetes_manifest" "argocd_root_app" {
manifest = {
apiVersion = "argoproj.io/v1alpha1"
kind = "Application"
metadata = {
name = "homelab-root"
namespace = kubernetes_namespace.argocd.metadata[0].name
}
spec = {
project = kubernetes_manifest.argocd_project.manifest.metadata.name
source = {
repoURL = "https://forgejo.riotpiao.homelab.com/riotpiao.com/homelab.git"
targetRevision = "main"
path = "k8s/argocd/apps"
directory = {
recurse = true
}
}
destination = {
server = "https://kubernetes.default.svc"
namespace = kubernetes_namespace.argocd.metadata[0].name
}
syncPolicy = {
automated = {
prune = true
selfHeal = true
}
syncOptions = [
"CreateNamespace=true"
]
}
}
}
field_manager {
name = "terraform"
}
depends_on = [
kubernetes_manifest.argocd_project
]
}