Four .enc.yaml files in k8s/argocd/secrets/ were committed as 0-byte placeholders (commit 0304461, next to scripts/iam/rotate-secrets.sh). Three now hold real SOPS-encrypted content and the fourth is removed.
file
was
now
source
memory-agent-oidc.enc.yaml
0 bytes
Secret memory-agent-oidc/poimen, 4 keys
the live Secret (identical values, so applying is idempotent)
oauth2-credentials.enc.yaml
0 bytes
Secret oauth2-credentials/iam, 5 client secrets
per-app live creds: api-gw, minio, poimen, paperless, grafana
username=rock (matches the SecretRotation appId: rock/riotpiao.com), password = the live registry PAT
database-passwords-backup.enc.yaml
0 bytes
removed
nothing references it anywhere in the repo — no producer, no consumer
All three are registered in the ksops generator, so ArgoCD creates them (29 files listed now).
Why it matters
registry-cleanup-cronjob.yaml mounts forgejo-registry-token with optional: true and reads /etc/registry-secret/{username,password}. That Secret never existed, so the job has been running unauthenticated and cleaning nothing, silently — crane auth login and the catalog query could not have succeeded. This PR gives it the credential it asks for.
Evidence
Values round-trip: decrypting each file yields entries whose SHA-256 matches the live source Secret, key for key.
Decrypted inside argocd-repo-server with its production env (SOPS_AGE_KEY_FILE=/sops-age/key.txt): all three OK — the same key ksops uses at build time.
A wrong key fails on the same files, so the check discriminates.
Notes / follow-ups
secret-rotation-controller (sample CR in k8s/apps/secret-rotation-controller/crd.yaml) writes k8s/argocd/secrets/forgejo-registry-secret.enc.yaml with secretRef: forgejo-registry-secret/kube-system/REGISTRY_TOKEN — a name mismatch with the CronJob's forgejo-registry-token in cicd. Decide which name wins; today the rotation controller and the consumer disagree.
scripts/iam/rotate-secrets.sh writes plaintext k8s/argocd/secrets/*.yaml and encrypts over the top — it creates these files, so the committed empties were an artifact of never having completed a rotation.
## What
Four `.enc.yaml` files in `k8s/argocd/secrets/` were committed as **0-byte placeholders** (commit 0304461, next to `scripts/iam/rotate-secrets.sh`). Three now hold real SOPS-encrypted content and the fourth is removed.
| file | was | now | source |
| --- | --- | --- | --- |
| `memory-agent-oidc.enc.yaml` | 0 bytes | Secret `memory-agent-oidc`/`poimen`, 4 keys | the live Secret (identical values, so applying is idempotent) |
| `oauth2-credentials.enc.yaml` | 0 bytes | Secret `oauth2-credentials`/`iam`, 5 client secrets | per-app live creds: api-gw, minio, poimen, paperless, grafana |
| `forgejo-registry-token.enc.yaml` | 0 bytes | Secret `forgejo-registry-token`/`cicd`, `username` + `password` | `username=rock` (matches the SecretRotation `appId: rock/riotpiao.com`), `password` = the live registry PAT |
| `database-passwords-backup.enc.yaml` | 0 bytes | removed | nothing references it anywhere in the repo — no producer, no consumer |
All three are registered in the ksops generator, so ArgoCD creates them (29 files listed now).
## Why it matters
`registry-cleanup-cronjob.yaml` mounts `forgejo-registry-token` with `optional: true` and reads `/etc/registry-secret/{username,password}`. That Secret never existed, so the job has been **running unauthenticated and cleaning nothing, silently** — `crane auth login` and the catalog query could not have succeeded. This PR gives it the credential it asks for.
## Evidence
- Values round-trip: decrypting each file yields entries whose SHA-256 matches the live source Secret, key for key.
- Decrypted **inside `argocd-repo-server`** with its production env (`SOPS_AGE_KEY_FILE=/sops-age/key.txt`): all three `OK` — the same key ksops uses at build time.
- A wrong key fails on the same files, so the check discriminates.
## Notes / follow-ups
- `secret-rotation-controller` (sample CR in `k8s/apps/secret-rotation-controller/crd.yaml`) writes `k8s/argocd/secrets/forgejo-registry-secret.enc.yaml` with `secretRef: forgejo-registry-secret/kube-system/REGISTRY_TOKEN` — a **name mismatch** with the CronJob's `forgejo-registry-token` in `cicd`. Decide which name wins; today the rotation controller and the consumer disagree.
- `scripts/iam/rotate-secrets.sh` writes plaintext `k8s/argocd/secrets/*.yaml` and encrypts over the top — it creates these files, so the committed empties were an artifact of never having completed a rotation.
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
What
Four
.enc.yamlfiles ink8s/argocd/secrets/were committed as 0-byte placeholders (commit0304461, next toscripts/iam/rotate-secrets.sh). Three now hold real SOPS-encrypted content and the fourth is removed.memory-agent-oidc.enc.yamlmemory-agent-oidc/poimen, 4 keysoauth2-credentials.enc.yamloauth2-credentials/iam, 5 client secretsforgejo-registry-token.enc.yamlforgejo-registry-token/cicd,username+passwordusername=rock(matches the SecretRotationappId: rock/riotpiao.com),password= the live registry PATdatabase-passwords-backup.enc.yamlAll three are registered in the ksops generator, so ArgoCD creates them (29 files listed now).
Why it matters
registry-cleanup-cronjob.yamlmountsforgejo-registry-tokenwithoptional: trueand reads/etc/registry-secret/{username,password}. That Secret never existed, so the job has been running unauthenticated and cleaning nothing, silently —crane auth loginand the catalog query could not have succeeded. This PR gives it the credential it asks for.Evidence
argocd-repo-serverwith its production env (SOPS_AGE_KEY_FILE=/sops-age/key.txt): all threeOK— the same key ksops uses at build time.Notes / follow-ups
secret-rotation-controller(sample CR ink8s/apps/secret-rotation-controller/crd.yaml) writesk8s/argocd/secrets/forgejo-registry-secret.enc.yamlwithsecretRef: forgejo-registry-secret/kube-system/REGISTRY_TOKEN— a name mismatch with the CronJob'sforgejo-registry-tokenincicd. Decide which name wins; today the rotation controller and the consumer disagree.scripts/iam/rotate-secrets.shwrites plaintextk8s/argocd/secrets/*.yamland encrypts over the top — it creates these files, so the committed empties were an artifact of never having completed a rotation.