ImageRepository/lidarr scans lscr.io/linuxserver/lidarr. lscr.io answers the tag-list call with a cross-host redirect to ghcr.io, and the follow-up request reaches ghcr.io unauthenticated.
Observed this run (2026-10-29 ~21:23Z):
ALERTS{alertname="FluxImageAutomationNotReady"}: firing for ImageRepository/lidarr only.
kubectl -n flux-system get imagerepository lidarr: Ready=False since 18:56:20Z, scan failed: GET https://ghcr.io/v2/linuxserver/lidarr/tags/list?n=1000: UNAUTHORIZED: authentication required. Last good scan 17:56:04Z (9419 tags). The same error is in the reflector log at 20:51, 21:06 and 21:21.
GET https://lscr.io/v2/linuxserver/lidarr/tags/list?n=1000, with or without an anonymous ghcr bearer token: 302 Location: https://ghcr.io/v2/linuxserver/lidarr/tags/list?n=1000.
The same GET on ghcr.io with an anonymous token from ghcr.io/token?scope=repository:linuxserver/lidarr:pull returns 200 with pagination Link.
ghcr.io/linuxserver/lidarr:3.1.6.5079-ls46 resolves to sha256:9fddcf5c…6e63. That is the imageID the running lidarr pod reports for lscr.io/linuxserver/lidarr:3.1.6.5079-ls46, so both names point to the same image.
kubernetes/apps/navidrome/lidarr.yaml: both $imagepolicy-marked refs now use ghcr.io/linuxserver/lidarr:3.1.6.5079-ls46 (same tag and digest). They have to match the ImageRepository name, otherwise the setter rewrites them.
kubectl kustomize renders both dirs without errors.
After merge
Flux applies the new ImageRepository and the next scan succeeds, so ImageRepository/lidarr goes Ready=True and FluxImageAutomationNotReady stops firing.
The lidarr Deployment (strategy Recreate) restarts once because the image string changed. The digest stays the same.
Check: kubectl -n flux-system get imagerepository lidarr -o jsonpath='{.status.conditions[?(@.type=="Ready")]}' and .status.lastScanResult.scanTime.
Out of scope: beets.yaml also pulls from lscr.io. It is digest-pinned, has no ImageRepository and is not affected.
Hermes-Card: t_894a66a0 (apollo)
Closes #1527
## Cause
`ImageRepository/lidarr` scans `lscr.io/linuxserver/lidarr`. lscr.io answers the tag-list call with a cross-host redirect to ghcr.io, and the follow-up request reaches ghcr.io unauthenticated.
Observed this run (2026-10-29 ~21:23Z):
- `ALERTS{alertname="FluxImageAutomationNotReady"}`: firing for `ImageRepository/lidarr` only.
- `kubectl -n flux-system get imagerepository lidarr`: Ready=False since 18:56:20Z, `scan failed: GET https://ghcr.io/v2/linuxserver/lidarr/tags/list?n=1000: UNAUTHORIZED: authentication required`. Last good scan 17:56:04Z (9419 tags). The same error is in the reflector log at 20:51, 21:06 and 21:21.
- `GET https://lscr.io/v2/linuxserver/lidarr/tags/list?n=1000`, with or without an anonymous ghcr bearer token: `302 Location: https://ghcr.io/v2/linuxserver/lidarr/tags/list?n=1000`.
- The same GET on ghcr.io with an anonymous token from `ghcr.io/token?scope=repository:linuxserver/lidarr:pull` returns `200` with pagination `Link`.
- `ghcr.io/linuxserver/lidarr:3.1.6.5079-ls46` resolves to `sha256:9fddcf5c…6e63`. That is the imageID the running lidarr pod reports for `lscr.io/linuxserver/lidarr:3.1.6.5079-ls46`, so both names point to the same image.
## Change
- `kubernetes/infrastructure/image-automation/lidarr.yaml`: `spec.image: ghcr.io/linuxserver/lidarr`.
- `kubernetes/apps/navidrome/lidarr.yaml`: both `$imagepolicy`-marked refs now use `ghcr.io/linuxserver/lidarr:3.1.6.5079-ls46` (same tag and digest). They have to match the ImageRepository name, otherwise the setter rewrites them.
`kubectl kustomize` renders both dirs without errors.
## After merge
- Flux applies the new ImageRepository and the next scan succeeds, so ImageRepository/lidarr goes Ready=True and FluxImageAutomationNotReady stops firing.
- The lidarr Deployment (strategy `Recreate`) restarts once because the image string changed. The digest stays the same.
- Check: `kubectl -n flux-system get imagerepository lidarr -o jsonpath='{.status.conditions[?(@.type=="Ready")]}'` and `.status.lastScanResult.scanTime`.
Out of scope: `beets.yaml` also pulls from lscr.io. It is digest-pinned, has no ImageRepository and is not affected.
Hermes-Card: t_894a66a0 (apollo)
lscr.io 302-redirects the tag-list request to ghcr.io and the
image-reflector's follow-up arrives unauthenticated (UNAUTHORIZED),
leaving ImageRepository/lidarr not Ready since 2026-10-29T18:56Z.
ghcr.io/linuxserver/lidarr is the same repository (identical digest
for 3.1.6.5079-ls46) and scans anonymously. Workload refs follow so
the imagepolicy setter keeps matching.
Closes#1527
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.
Closes #1527
Cause
ImageRepository/lidarrscanslscr.io/linuxserver/lidarr. lscr.io answers the tag-list call with a cross-host redirect to ghcr.io, and the follow-up request reaches ghcr.io unauthenticated.Observed this run (2026-10-29 ~21:23Z):
ALERTS{alertname="FluxImageAutomationNotReady"}: firing forImageRepository/lidarronly.kubectl -n flux-system get imagerepository lidarr: Ready=False since 18:56:20Z,scan failed: GET https://ghcr.io/v2/linuxserver/lidarr/tags/list?n=1000: UNAUTHORIZED: authentication required. Last good scan 17:56:04Z (9419 tags). The same error is in the reflector log at 20:51, 21:06 and 21:21.GET https://lscr.io/v2/linuxserver/lidarr/tags/list?n=1000, with or without an anonymous ghcr bearer token:302 Location: https://ghcr.io/v2/linuxserver/lidarr/tags/list?n=1000.ghcr.io/token?scope=repository:linuxserver/lidarr:pullreturns200with paginationLink.ghcr.io/linuxserver/lidarr:3.1.6.5079-ls46resolves tosha256:9fddcf5c…6e63. That is the imageID the running lidarr pod reports forlscr.io/linuxserver/lidarr:3.1.6.5079-ls46, so both names point to the same image.Change
kubernetes/infrastructure/image-automation/lidarr.yaml:spec.image: ghcr.io/linuxserver/lidarr.kubernetes/apps/navidrome/lidarr.yaml: both$imagepolicy-marked refs now useghcr.io/linuxserver/lidarr:3.1.6.5079-ls46(same tag and digest). They have to match the ImageRepository name, otherwise the setter rewrites them.kubectl kustomizerenders both dirs without errors.After merge
Recreate) restarts once because the image string changed. The digest stays the same.kubectl -n flux-system get imagerepository lidarr -o jsonpath='{.status.conditions[?(@.type=="Ready")]}'and.status.lastScanResult.scanTime.Out of scope:
beets.yamlalso pulls from lscr.io. It is digest-pinned, has no ImageRepository and is not affected.Hermes-Card: t_894a66a0 (apollo)