Files
homelab/terraform/argocd-bootstrap.tf
T
Story Crater Bot 9e3781a069 fix(minio): migrate to official chart, TF-owned
Bitnami wiped Docker Hub catalog (bitnami/minio: 0 tags), chart 14.1.0
dead on ImagePullBackOff. Move to minio/minio 5.4.0 (quay.io) as one TF
helm_release. Add longhorn-xfs SC: default SC ext4 mkfs on 100Gi exceeds
kubelet mount timeout, xfs near-instant. Drop minio ArgoCD Apps (TF owns
now, kills dual-controller conflict). Fix double base64 on OIDC secret.
2026-07-14 16:07:03 -07:00

186 lines
4.2 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"
}
}
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"
}
]
volumes = [
{
name = "homelab-ca"
secret = {
secretName = "homelab-ca-secret"
}
}
]
volumeMounts = [
{
name = "homelab-ca"
mountPath = "/etc/ssl/certs/homelab-ca.crt"
subPath = "tls.crt"
}
]
}
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
]
}