diff --git a/k8s/bootstrap/phase4-argocd/argocd-cmp-cm.yaml b/k8s/bootstrap/phase4-argocd/argocd-cmp-cm.yaml index ea4fdbe..2967780 100644 --- a/k8s/bootstrap/phase4-argocd/argocd-cmp-cm.yaml +++ b/k8s/bootstrap/phase4-argocd/argocd-cmp-cm.yaml @@ -11,23 +11,19 @@ data: metadata: name: sops-secrets-v1.0 spec: - version: v1.0 - init: - command: [sh, -c] - args: - - | - # Install sops if not present - if ! command -v sops &> /dev/null; then - wget -qO- https://github.com/getsops/sops/releases/download/v3.9.3/sops-v3.9.3.linux.amd64 > /usr/local/bin/sops - chmod +x /usr/local/bin/sops - fi generate: command: [sh, -c] args: - | - # Find all .enc.yaml files and decrypt them + # Find all .enc.yaml files and decrypt them, separating multi-doc output. + # Skip files that aren't full K8s manifests (no top-level "kind:") — some + # .enc.yaml files hold raw Helm values, not standalone Secret objects. find . -name '*.enc.yaml' -type f | while read -r file; do - sops -d "$file" + decrypted=$(sops -d "$file") + if echo "$decrypted" | grep -q '^kind:'; then + echo "---" + echo "$decrypted" + fi done discover: find: diff --git a/k8s/bootstrap/phase4-argocd/argocd-values.yaml b/k8s/bootstrap/phase4-argocd/argocd-values.yaml index bc41fa1..da7cf00 100644 --- a/k8s/bootstrap/phase4-argocd/argocd-values.yaml +++ b/k8s/bootstrap/phase4-argocd/argocd-values.yaml @@ -45,7 +45,7 @@ repoServer: cpu: 100m memory: 256Mi limits: - cpu: 500m + cpu: 1000m memory: 1Gi # Tolerations for control-plane @@ -54,6 +54,61 @@ repoServer: operator: Exists effect: NoSchedule + # Fetch sops binary into shared emptyDir (runs as root; main containers can't write /usr/local/bin) + initContainers: + - name: install-sops + image: alpine:3.20 + command: [sh, -c] + args: + - | + wget -qO /sops-bin/sops https://github.com/getsops/sops/releases/download/v3.9.3/sops-v3.9.3.linux.amd64 + chmod +x /sops-bin/sops + volumeMounts: + - mountPath: /sops-bin + name: sops-bin + + # SOPS CMP sidecar (decrypts *.enc.yaml via argocd-cmp-cm ConfigMap plugin) + extraContainers: + - name: sops-secrets-v1 + command: [/var/run/argocd/argocd-cmp-server] + image: quay.io/argoproj/argocd:v3.4.5 + env: + - name: SOPS_AGE_KEY_FILE + value: /sops-age/key.txt + - name: PATH + value: /sops-bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin + volumeMounts: + - mountPath: /var/run/argocd + name: var-files + - mountPath: /home/argocd/cmp-server/plugins + name: plugins + - mountPath: /tmp + name: cmp-tmp + - mountPath: /home/argocd/cmp-server/config/plugin.yaml + subPath: sops-secrets-v1.0.yaml + name: argocd-cmp-cm + - mountPath: /sops-age + name: sops-age + readOnly: true + - mountPath: /sops-bin + name: sops-bin + readOnly: true + securityContext: + runAsNonRoot: true + runAsUser: 999 + + volumes: + - name: sops-bin + emptyDir: {} + - name: cmp-tmp + emptyDir: {} + - name: argocd-cmp-cm + configMap: + name: argocd-cmp-cm + - name: sops-age + secret: + secretName: sops-age + # Controller configuration controller: resources: diff --git a/k8s/infra/logging/grafana-secrets.enc.yaml b/k8s/infra/logging/grafana-secrets.enc.yaml index 1d86e79..f6fc25e 100644 --- a/k8s/infra/logging/grafana-secrets.enc.yaml +++ b/k8s/infra/logging/grafana-secrets.enc.yaml @@ -1,18 +1,24 @@ -adminPassword: ENC[AES256_GCM,data:qykgCu5Kv5IwzM1JFLXL7wgiAyI=,iv:bAph3Jd4fxuyglS7zrWIwzfUgK/wBwRrcEpKusgFhVk=,tag:ymwdnU/Dxnp54eGur2caoQ==,type:str] -env: - GF_AUTH_GENERIC_OAUTH_CLIENT_SECRET: ENC[AES256_GCM,data:FwldsYfbOkRYGcycxn5BHZk/dOZsu23e3UCPo7dJKrcyr0n8dXQ9nH5XVSRHDpLOdRk7wbQwl+4Rgb8bGs21/w==,iv:JkNEfbsEIeE9TGouDA1xgjS4fX+v/sDrimaGpc4iaME=,tag:6Z3X29GKbgd2x6ghWA+CUw==,type:str] +apiVersion: ENC[AES256_GCM,data:TMY=,iv:ImbG3BggYpU11BV84Kwt1NrwoSZIrsoiZovqPM2ziWQ=,tag:xbld3DauQbVC7LrOyDgU+w==,type:str] +kind: ENC[AES256_GCM,data:PrsNgt4i,iv:6ICJnhTiMP0QFX2xQxqE59AkbtFXQ3UJwH/v/2KaQdw=,tag:wyWWV21lB+Oy23AoXDdFJQ==,type:str] +metadata: + name: ENC[AES256_GCM,data:yceBbeA92I2IMgwPww==,iv:Aw9oxB0x3eLODe/XVGKd5A4UdKoW1ChbRM7Un0kkwFQ=,tag:wTQfMQlO+ecU0epYGh32zA==,type:str] + namespace: ENC[AES256_GCM,data:MNtEckGs1Q==,iv:mf2ySxEaRrsPLgkwUUjmJuzklo74t8UTeCsUean2nx0=,tag:xvhxXljTD/uKCfwS6I4IZw==,type:str] +type: ENC[AES256_GCM,data:ykoXlXwe,iv:OMjn8JxX8g/jJSsIL911FX4autWEQDk1UGzfnnfKSjQ=,tag:8xhWjuq1jIhS9LxIGCa/PA==,type:str] +stringData: + admin-user: ENC[AES256_GCM,data:TJBiqjs=,iv:UwIdUTnI2soFYGjZz6xj8boacSMYHxTg0Bl1xFLllsU=,tag:zavbhAUpsjOChoGZ17cPRQ==,type:str] + admin-password: ENC[AES256_GCM,data:t+vGIzaybTrLzY001A==,iv:4V3wlpMMfakInQoqD6gxk+0A6lWCm3aPw31gpa0sKss=,tag:cbduSqiUnJFj0uOCjfKDSg==,type:str] sops: age: - enc: | -----BEGIN AGE ENCRYPTED FILE----- - YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBQdVNSMWZaVDZuN2RBKyt0 - eWJHRm5vRlErZ1UweXA0N2xSNGdESE5leWo4CjQ2TTlONnpJK2VZWmxoamdhdHZN - ZGVMSU84SUZpVTUxREZlek9JcUxaTXcKLS0tIHlNaEpzZG1iaVpvU0E1UTQzbkVk - WnQxSHZ6S3cyZ2hUTlpTNXQyaVZzRU0KwU/0aRJ0D/UsqtFcrJLmuHpNELhTsfYS - 4WL2TQ/yaUz261s7LEVQdpKUza8JjQXiKqqNcV2gaqEWurdx20ILzQ== + YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSB0ZlZiOWt3SFNiYzhNL252 + Vlh1WkNHZXYxV1ZsNG90YXhydlpJTURmS1ZBCmJYOTBvKzUvS3cvRGZRcDlQRFRS + c3pZNjZnbUw1Tml6eVBETnBRQ2xNK3MKLS0tIHU5UFdBSk1TUnBjdlZaODBNRkVy + azBhbjN6a1BRNVh0cUtMU24zK29jMlEK4Y8+P1L/O80xG+qtdF1I8fvfURX/IvtF + dFIn1EF7YRqMy4KWKx6QSewjo8Vx7JuBDZtRDPCGNJKIKJU3R9NK3w== -----END AGE ENCRYPTED FILE----- recipient: age1smu533f803gmd0jq60s2zaj9zlznajy0ca6rtewd4r37mr2hs3uqsrldfh - lastmodified: "2026-07-15T23:02:08Z" - mac: ENC[AES256_GCM,data:LeN0mm7i7fsDpwtGQ6La7/UzhHbKfG1f/K30wW7fZJ1XbqPZGh7cdq07kMqrodlR6oWvrq7r4gbyuhcH9ptlxKgN4NuD3OoUjn6/CiPEF+wzgKMMgg2JdqFLsZNxVvGL/Ig3Y5hP5iag91QdtQxXaJmaV6Q9+FF6maYofsOU2rA=,iv:Eik9jEhdu+7qJv1oN7e1Vydnv7rh0pnRpbcBPDhh8e8=,tag:Mkry9bpTsmsf9Xs1jW7b1g==,type:str] + lastmodified: "2026-08-11T21:40:58Z" + mac: ENC[AES256_GCM,data:761EqFteOI+BuznsTV8+wIOoOJAnCYvIPYy9gpdHSkDf+QbW6k3HUCjvPN/sNXfAEtbjIf28W6iW+zhljAbe3lpOXrY2Fy4O9i/e1ltXvsBUND6FWB3TkdSaweycRGoAPTsR9vb74INqecR4O0LITcGHL+Yl3TLPzwSJhxiqpiU=,iv:ug2qqUEhlXharDqegsiPSrlmqV7z0qQBv8Ha96qH+Lo=,tag:JY+xjJgX7o6o83tSvng7eQ==,type:str] unencrypted_suffix: _unencrypted version: 3.13.2