docs(dir): document zot storage config for remote object storage - #1954
Open
conorbronsdon wants to merge 10 commits into
Open
docs(dir): document zot storage config for remote object storage#1954conorbronsdon wants to merge 10 commits into
conorbronsdon wants to merge 10 commits into
Conversation
Zot defaults `dedupe` to true. The zot config.json shipped in the chart
does not set it, so an operator who swaps `storage` for an S3
`storageDriver` gets a registry that refuses to start:
invalid database config, dedupe set to true with remote storage and
database, but no remote database configured
Nothing in the deployment docs covered this, so it was only discovered at
boot on a production node.
Document the two supported storage layouts for a production node, with a
verified config snippet for each S3 option (dedupe off, or dedupe on with
a DynamoDB cacheDriver), and add the two corresponding startup failures to
the troubleshooting section. Add the same warning next to the config in
values.yaml, where an operator editing the storage block will see it.
Verified against zot v2.1.16 (the version the chart pulls) with MinIO
standing in for S3: the shipped config plus an S3 storageDriver exits 1 at
startup; adding `dedupe: false` starts and serves, and a push lands in the
bucket. Garbage collection and the search extension do not have to be
disabled, contrary to the workaround in the report.
Fixes agntcy#1885
Signed-off-by: Conor Bronsdon <cmbronsdon@gmail.com>
Codecov Report✅ All modified and coverable lines are covered by tests. 📢 Thoughts on this report? Let us know! |
conorbronsdon
marked this pull request as ready for review
July 31, 2026 19:06
…ntials Follow-up review fixes on the zot remote-storage docs: - The verify command pinned zot v2.1.16, which is the version from the bug report, not the version the chart deploys. The zot subchart (0.1.122, pinned in apiserver/Chart.lock) ships image tag v2.1.18, matching ZOT_VERSION in Taskfile.vars.yml and the compose files after agntcy#1923 aligned them. Re-ran the full config matrix on v2.1.18: every documented claim reproduces unchanged. - The gc/search note asserted that neither has to be disabled on remote storage, on the strength of a successful boot. GC runs on an interval (gcInterval/gcDelay, 1h by default), so a clean boot does not exercise it. Narrowed the claim to what was tested -- neither blocks startup -- and kept the reporter's gc: false as the fallback if GC errors appear later. - Neither S3 snippet mentioned credentials. Added the IAM-role-first guidance plus accesskey/secretkey and regionendpoint, and a note that storageDriver keys are pass-through and unvalidated, so a misspelled key still passes zot verify. - values.yaml pointed at a repo-relative docs path; the chart is published to OCI, so consumers never see that tree. Switched to the published URL. config.json is unchanged. Signed-off-by: Conor Bronsdon <cmbronsdon@gmail.com>
The Cross-Platform Test Linux job failed provisioning the e2e daemon testenv: the sentence-transformers/all-MiniLM-L6-v2 fetch from huggingface.co was reset by peer. Network flake, unrelated to this docs-only change. Signed-off-by: Conor Bronsdon <cmbronsdon@gmail.com>
2 tasks
keraron
self-requested a review
August 3, 2026 07:52
paralta
approved these changes
Aug 3, 2026
paralta
left a comment
Member
There was a problem hiding this comment.
LGTM 👍 Thank you so much for investigating this and for adding clear documentation to fix the reported issue!
keraron
requested changes
Aug 3, 2026
keraron
left a comment
Member
There was a problem hiding this comment.
Hi, some formatting changes and nits.
Co-authored-by: Aron Kerekes <arkereke@cisco.com> Signed-off-by: Conor Bronsdon <120674402+conorbronsdon@users.noreply.github.com>
Co-authored-by: Aron Kerekes <arkereke@cisco.com> Signed-off-by: Conor Bronsdon <120674402+conorbronsdon@users.noreply.github.com>
conorbronsdon
commented
Aug 3, 2026
Signed-off-by: Conor Bronsdon <120674402+conorbronsdon@users.noreply.github.com>
Suggestions from reviewer applied Co-authored-by: Aron Kerekes <arkereke@cisco.com> Signed-off-by: Conor Bronsdon <120674402+conorbronsdon@users.noreply.github.com>
The Docs CI job failed on two lint errors in dir-prod-deployment.md: :136:1 MD009 Trailing spaces [Expected: 0 or 2; Actual: 4] :137:1 MD012 Multiple consecutive blank lines [Expected: 1, Actual: 3] Those were the symptom. Applying the code-review suggestions in 6b9da18 converted the two bold option headers into a mkdocs content tab, but the replacement kept only the first tab marker and dropped the body: both JSON config blocks and the entire Option B tab went with it. The section then read "Pick one of the following when moving Zot to S3:", offered an empty Option A, had no Option B, and closed with "Neither snippet sets S3 credentials" - referring to two snippets that were no longer there. storageDriver mentions went 10 -> 8 in that commit, which is what surfaced it. Restored both snippets as proper content tabs, which is what the suggestion was asking for, with the bodies indented four spaces so they render inside the tabs. Option A disables dedupe; Option B keeps it and adds the DynamoDB cacheDriver. The trailing-whitespace line that tripped MD009/MD012 is gone as a consequence. Verified with the project's own linter and config rather than by eye: pymarkdown --config docs/pymarkdown.yaml reproduces both errors at 136 and 137 on the previous commit and reports nothing here. Signed-off-by: Conor Bronsdon <120674402+conorbronsdon@users.noreply.github.com>
keraron
approved these changes
Aug 3, 2026
Member
Author
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Fixes #1885
What this changes
Documentation and chart-values comments only. No Go code, no behaviour change.
The chart ships a zot
config.jsonthat uses local filesystem storage and does not setdedupe. Zot defaultsdedupetotrue, and zot rejectsdedupe: trueon remote storage without a remote cache driver, so an operator who swaps thestorageblock for an S3storageDrivergets a registry that will not boot. Nothing in the deployment docs covered which storage layouts are supported.docs/content/dir/dir-prod-deployment.md— new Zot Storage Backend section: the two supported layouts, a config snippet for each S3 option (dedupe off, or dedupe on with a DynamoDBcacheDriver), credential guidance, and two new troubleshooting entries keyed on the exact error strings.install/charts/dir/values.yaml— warning comment directly above the zotconfigFilesblock. Theconfig.jsoncontent itself is unchanged.docs/content/dir/dir-component-store.md— cross-reference.Verification
Run against zot v2.1.18 — the image tag shipped by the zot subchart (
0.1.122, pinned ininstall/charts/dir/apiserver/Chart.lock), which matchesZOT_VERSIONinTaskfile.vars.ymland the compose files after #1923 aligned them. The JSON in the two config snippets is extracted straight out of the committed markdown, so what is tested is what is documented.zot verifyzot serveconfig.json, localrootDirectoryGET /v2/→ 200config.json+ S3storageDriver,dedupeunsetdedupe: false)dedupe: true+ dynamodbcacheDriver)dedupe: falseremovedstorage.rootDirectoryremovedno storage config providedThe matrix was first run on v2.1.16 (the version in the bug report) and then re-run on v2.1.18. The
zot verifycolumn is identical on both versions; theserveresults for the two documented failure modes (dedupeunset,rootDirectorymissing) were re-confirmed on v2.1.18, the latter with the exactno storage config providederror. The MinIO push test was run on v2.1.16 only.Three findings that differ from the report, and one limit on what was tested:
searchextension is not required, andgc: falsewas not needed to boot. Onlydedupeis gated by config validation. Option A boots on S3 with GC at its default and search enabled. This is a startup result only — GC runs on an interval (gcInterval/gcDelay, one hour by default), so a clean boot does not exercise it, and it does not contradict the reporter's experience of needinggc: falsein a running deployment. The doc says exactly this and keepsgc: falseas the documented fallback.zot verifyis not sufficient. A config missingstorage.rootDirectorypassesverifyand then crash-loops.storageDriverare pass-through and unvalidated. A misspelled credential key (accessKeyIdforaccesskey) still passeszot verifyand fails only when zot contacts S3. Zot rejects unknown keys instoragebut not instorageDriver— confirmed against v2.1.18 in both directions. The doc calls this out.Credential parameter names (
accesskey,secretkey,regionendpoint) and IAM-role support are per the zot storage planning docs; the environment-variable chain was confirmed in the harness.helm lint ./install/charts/dir --with-subcharts→ 2 charts linted, 0 failed.pymarkdownandcodespellclean on both changed docs.Minimal reproduction of the failing case: