url-shortener était la seule app OutOfSync du cluster, en échec de sync en boucle malgré automated+selfHeal. Message ArgoCD :
PersistentVolumeClaim "url-shortener" is invalid: spec: Forbidden: spec is immutable after creation
- "VolumeName": "pvc-cdd434d1-…" (live)
+ "VolumeName": "" (désiré)
Le PVC live porte un spec.volumeName épinglé (rebind du volume Longhorn — vraisemblablement lors de la restauration post-drill coupure de courant) que le chart ne déclare pas. Le merge 3-way tente donc de le vider à chaque sync → refus API (champ immuable) → échec éternel.
Changements
argocd/templates/apps.yaml : passthrough générique ignoreDifferences et syncOptions additionnels par app (réutilisable pour tout futur champ immuable).
argocd/values.yaml : pour url-shortener, ignorer /spec/volumeName du PVC + RespectIgnoreDifferences=true — l'apply réinjecte alors la valeur live au lieu de la vider (le mécanisme documenté d'ArgoCD précisément pour ce cas : clusterIP, volumeName…).
Validation
Rendu helm template diffé contre main : seule l'Application url-shortener gagne les deux blocs, toutes les autres apps sont rendues à l'identique. Après merge, l'app-of-apps propage, puis le prochain sync d'url-shortener doit passer sans toucher au volume (aucun risque pour la base SQLite — on arrête justement d'essayer de modifier le PVC).
## Le SyncError permanent
`url-shortener` était la seule app OutOfSync du cluster, en échec de sync **en boucle** malgré `automated+selfHeal`. Message ArgoCD :
```
PersistentVolumeClaim "url-shortener" is invalid: spec: Forbidden: spec is immutable after creation
- "VolumeName": "pvc-cdd434d1-…" (live)
+ "VolumeName": "" (désiré)
```
Le PVC live porte un `spec.volumeName` épinglé (rebind du volume Longhorn — vraisemblablement lors de la restauration post-drill coupure de courant) que le chart ne déclare pas. Le merge 3-way tente donc de le **vider** à chaque sync → refus API (champ immuable) → échec éternel.
## Changements
- `argocd/templates/apps.yaml` : passthrough générique **`ignoreDifferences`** et **`syncOptions`** additionnels par app (réutilisable pour tout futur champ immuable).
- `argocd/values.yaml` : pour `url-shortener`, ignorer `/spec/volumeName` du PVC **+ `RespectIgnoreDifferences=true`** — l'apply réinjecte alors la valeur live au lieu de la vider (le mécanisme documenté d'ArgoCD précisément pour ce cas : `clusterIP`, `volumeName`…).
## Validation
Rendu `helm template` diffé contre main : seule l'Application `url-shortener` gagne les deux blocs, toutes les autres apps sont rendues à l'identique. Après merge, l'app-of-apps propage, puis le prochain sync d'url-shortener doit passer **sans toucher au volume** (aucun risque pour la base SQLite — on arrête justement d'essayer de modifier le PVC).
🤖 Generated with [Claude Code](https://claude.com/claude-code)
L'app url-shortener était en SyncError permanent : son PVC live porte un
spec.volumeName épinglé (rebind du volume Longhorn après le drill coupure de
courant) absent du chart ; chaque sync tentait donc de le vider, refus API
(spec immuable après création), échec en boucle malgré automated+selfHeal.
- apps.yaml : passthrough générique ignoreDifferences + syncOptions par app.
- values.yaml : url-shortener ignore /spec/volumeName du PVC, avec
RespectIgnoreDifferences=true pour que l'apply réinjecte la valeur live au
lieu de la vider (le cas d'usage documenté d'ArgoCD pour les champs
immuables).
Rendu helm vérifié : seule l'Application url-shortener change.
Co-Authored-By: Claude Fable 5 <[email protected]>
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.
Le SyncError permanent
url-shortenerétait la seule app OutOfSync du cluster, en échec de sync en boucle malgréautomated+selfHeal. Message ArgoCD :Le PVC live porte un
spec.volumeNameépinglé (rebind du volume Longhorn — vraisemblablement lors de la restauration post-drill coupure de courant) que le chart ne déclare pas. Le merge 3-way tente donc de le vider à chaque sync → refus API (champ immuable) → échec éternel.Changements
argocd/templates/apps.yaml: passthrough génériqueignoreDifferencesetsyncOptionsadditionnels par app (réutilisable pour tout futur champ immuable).argocd/values.yaml: poururl-shortener, ignorer/spec/volumeNamedu PVC +RespectIgnoreDifferences=true— l'apply réinjecte alors la valeur live au lieu de la vider (le mécanisme documenté d'ArgoCD précisément pour ce cas :clusterIP,volumeName…).Validation
Rendu
helm templatediffé contre main : seule l'Applicationurl-shortenergagne les deux blocs, toutes les autres apps sont rendues à l'identique. Après merge, l'app-of-apps propage, puis le prochain sync d'url-shortener doit passer sans toucher au volume (aucun risque pour la base SQLite — on arrête justement d'essayer de modifier le PVC).🤖 Generated with Claude Code