This issue was generated with GitHub Copilot and reviewed by me before submission.
Summary
Installing the proxysql-operator Helm chart (as documented in the quickstart, tutorials, and docs/migration-from-v1.md) leaves the operator pod in ImagePullBackOff, because the operator image ghcr.io/proxysql/proxysql-operator:0.4.0 cannot be pulled by external users. The image was published successfully — the problem is that the GHCR package is private and access-restricted: even an authenticated pull with a read:packages token returns 403 Forbidden.
Steps to reproduce
helm repo add proxysql https://proxysql.github.io/proxysql-on-k8s
helm install proxysql-operator proxysql/proxysql-operator \
-n proxysql-system --create-namespace
The manager pod enters ImagePullBackOff.
Observed behavior
On the node (anonymous pull):
Back-off pulling image "ghcr.io/proxysql/proxysql-operator:0.4.0": ErrImagePull:
failed to resolve image: ghcr.io/proxysql/proxysql-operator:0.4.0: not found
Manual anonymous pull:
$ docker pull ghcr.io/proxysql/proxysql-operator:0.4.0
Error response from daemon: error from registry: unauthorized
unauthorized
Manual authenticated pull (logged in to ghcr.io):
$ docker pull ghcr.io/proxysql/proxysql-operator:0.4.0
Error response from daemon: unknown: failed to resolve reference
"ghcr.io/proxysql/proxysql-operator:0.4.0": unexpected status from HEAD request to
https://ghcr.io/v2/proxysql/proxysql-operator/manifests/0.4.0: 403 Forbidden
The progression is telling:
- anonymous →
401 unauthorized / not found
- authenticated →
403 Forbidden
A 403 while authenticated indicates the credentials are accepted but the account is not permitted to pull this package — i.e. the package is private and its access is not granted to external users.
Evidence this is a visibility/access issue, not a missing image
The release build pushed the tag successfully — both 0.4.0 and latest, same digest:
#30 pushing manifest for ghcr.io/proxysql/proxysql-operator:0.4.0@sha256:b8ee11ddf6207f319ea9c0b152003ffb6812cca9a7f9a295f17a0b20fdfe4f29 done
#30 pushing manifest for ghcr.io/proxysql/proxysql-operator:latest@sha256:b8ee11ddf6207f319ea9c0b152003ffb6812cca9a7f9a295f17a0b20fdfe4f29 done
The chart requests exactly ghcr.io/proxysql/proxysql-operator:0.4.0 (empty image.tag defaults to appVersion: "0.4.0"), which matches the pushed tag.
Root cause
GHCR packages pushed via secrets.GITHUB_TOKEN (as .github/workflows/release.yaml does) default to private visibility, and release.yaml does not set the package to public anywhere. Because the package visibility was never switched to public, no external user installing the chart can pull the image — an authenticated pull with a valid read:packages token still returns 403 Forbidden.
Impact
Every documented install path is affected out of the box:
docs/quickstart.md
docs/tutorials/01-first-cluster.md
docs/user-guide/installation.md
docs/migration-from-v1.md
Each instructs users to helm install proxysql/proxysql-operator, which pulls the private image and fails. There is currently no self-service workaround for external users, since the package is not merely private but access-restricted (an authenticated, read:packages-scoped pull is still forbidden).
Suggested fix
Make the proxysql-operator GHCR package publicly pullable. For example:
- Set the package visibility to Public (Package → Settings → Change visibility → Public), and
- optionally ensure future releases stay public (e.g. by linking the package to the repository so it inherits public visibility, or otherwise handling visibility as part of the release process).
Maintainers are best placed to decide the exact mechanism.
Environment
- Chart:
proxysql-operator (chart/appVersion 0.4.0)
- Image:
ghcr.io/proxysql/proxysql-operator:0.4.0 (digest sha256:b8ee11ddf6207f319ea9c0b152003ffb6812cca9a7f9a295f17a0b20fdfe4f29)
Summary
Installing the
proxysql-operatorHelm chart (as documented in the quickstart, tutorials, anddocs/migration-from-v1.md) leaves the operator pod inImagePullBackOff, because the operator imageghcr.io/proxysql/proxysql-operator:0.4.0cannot be pulled by external users. The image was published successfully — the problem is that the GHCR package is private and access-restricted: even an authenticated pull with aread:packagestoken returns403 Forbidden.Steps to reproduce
The manager pod enters
ImagePullBackOff.Observed behavior
On the node (anonymous pull):
Manual anonymous pull:
Manual authenticated pull (logged in to ghcr.io):
The progression is telling:
401 unauthorized/not found403 ForbiddenA
403while authenticated indicates the credentials are accepted but the account is not permitted to pull this package — i.e. the package is private and its access is not granted to external users.Evidence this is a visibility/access issue, not a missing image
The release build pushed the tag successfully — both
0.4.0andlatest, same digest:The chart requests exactly
ghcr.io/proxysql/proxysql-operator:0.4.0(emptyimage.tagdefaults toappVersion: "0.4.0"), which matches the pushed tag.Root cause
GHCR packages pushed via
secrets.GITHUB_TOKEN(as.github/workflows/release.yamldoes) default to private visibility, andrelease.yamldoes not set the package to public anywhere. Because the package visibility was never switched to public, no external user installing the chart can pull the image — an authenticated pull with a validread:packagestoken still returns403 Forbidden.Impact
Every documented install path is affected out of the box:
docs/quickstart.mddocs/tutorials/01-first-cluster.mddocs/user-guide/installation.mddocs/migration-from-v1.mdEach instructs users to
helm install proxysql/proxysql-operator, which pulls the private image and fails. There is currently no self-service workaround for external users, since the package is not merely private but access-restricted (an authenticated,read:packages-scoped pull is still forbidden).Suggested fix
Make the
proxysql-operatorGHCR package publicly pullable. For example:Maintainers are best placed to decide the exact mechanism.
Environment
proxysql-operator(chart/appVersion0.4.0)ghcr.io/proxysql/proxysql-operator:0.4.0(digestsha256:b8ee11ddf6207f319ea9c0b152003ffb6812cca9a7f9a295f17a0b20fdfe4f29)