diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 2a89aad..8a22948 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -6,14 +6,18 @@ on: permissions: read-all +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: ${{ github.event_name == 'pull_request' }} + jobs: ci: - runs-on: ubuntu-latest + runs-on: ${{ vars.CI_RUNNERS || 'ubuntu-latest' }} permissions: - packages: write - contents: write + contents: read steps: - name: Cleanup Disk + if: vars.CI_RUNNERS == '' || vars.CI_RUNNERS == 'ubuntu-latest' uses: jlumbroso/free-disk-space@v1.3.1 with: android: true @@ -23,6 +27,7 @@ jobs: large-packages: false swap-storage: false - name: Cleanup docker cache + if: vars.CI_RUNNERS == '' || vars.CI_RUNNERS == 'ubuntu-latest' run: | echo "-------------Disk info before cleanup----------------" df -h @@ -32,24 +37,43 @@ jobs: df -h echo "-----------------------------------------------------" - name: Checkout - uses: actions/checkout@v6 + uses: actions/checkout@v7.0.1 # We need the full history for the commitlint task with: fetch-depth: 0 ref: ${{ github.event.pull_request.head.sha }} - - name: Install QEMU static binaries - uses: docker/setup-qemu-action@v4 - name: Install Task - uses: arduino/setup-task@v2 + uses: arduino/setup-task@v3.0.0 - name: Install Dagger env: # renovate: datasource=github-tags depName=dagger/dagger versioning=semver - DAGGER_VERSION: 0.20.8 + DAGGER_VERSION: 0.21.9 run: | curl -L https://dl.dagger.io/dagger/install.sh | BIN_DIR=$HOME/.local/bin sh - name: Run CI task run: | task ci + + publish: + runs-on: ${{ vars.CI_RUNNERS || 'ubuntu-latest' }} + permissions: + contents: read + packages: write + steps: + - name: Checkout + uses: actions/checkout@v7.0.1 + with: + ref: ${{ github.event.pull_request.head.sha }} + - name: Install QEMU static binaries + uses: docker/setup-qemu-action@v4 + - name: Install Task + uses: arduino/setup-task@v3.0.0 + - name: Install Dagger + env: + # renovate: datasource=github-tags depName=dagger/dagger versioning=semver + DAGGER_VERSION: 0.21.9 + run: | + curl -L https://dl.dagger.io/dagger/install.sh | BIN_DIR=$HOME/.local/bin sh - name: Write manifest run: | task manifest diff --git a/.github/workflows/publish-docs.yml b/.github/workflows/publish-docs.yml index ef8f01e..166a6c3 100644 --- a/.github/workflows/publish-docs.yml +++ b/.github/workflows/publish-docs.yml @@ -20,15 +20,15 @@ permissions: read-all jobs: build: - runs-on: ubuntu-latest + runs-on: ${{ vars.CI_RUNNERS || 'ubuntu-latest' }} permissions: contents: read steps: - name: Checkout - uses: actions/checkout@v6 + uses: actions/checkout@v7.0.1 - name: Setup Node - uses: actions/setup-node@v6 + uses: actions/setup-node@v7 with: # Use the latest LTS version of Node.js already installed on the runner. node-version: latest @@ -60,7 +60,7 @@ jobs: name: github-pages url: ${{ steps.deployment.outputs.page_url }} needs: build - runs-on: ubuntu-latest + runs-on: ${{ vars.CI_RUNNERS || 'ubuntu-latest' }} steps: - name: Deploy to GitHub Pages id: deployment diff --git a/.github/workflows/release-please.yml b/.github/workflows/release-please.yml index 27d4e92..a010044 100644 --- a/.github/workflows/release-please.yml +++ b/.github/workflows/release-please.yml @@ -9,7 +9,7 @@ permissions: read-all jobs: release-please: - runs-on: ubuntu-latest + runs-on: ${{ vars.CI_RUNNERS || 'ubuntu-latest' }} permissions: contents: write pull-requests: write @@ -19,19 +19,19 @@ jobs: # We'll use the cli until there's a fix for # https://github.com/googleapis/release-please/issues/2280. - name: Checkout - uses: actions/checkout@v6 + uses: actions/checkout@v7.0.1 - name: Install node - uses: actions/setup-node@v6 + uses: actions/setup-node@v7 with: node-version: 24 - name: Install QEMU static binaries uses: docker/setup-qemu-action@v4 - name: Install Task - uses: arduino/setup-task@v2 + uses: arduino/setup-task@v3.0.0 - name: Install Dagger env: # renovate: datasource=github-tags depName=dagger/dagger versioning=semver - DAGGER_VERSION: 0.20.8 + DAGGER_VERSION: 0.21.9 run: | curl -L https://dl.dagger.io/dagger/install.sh | BIN_DIR=$HOME/.local/bin sh - name: Create image and manifest diff --git a/.github/workflows/release-publish.yml b/.github/workflows/release-publish.yml index 481f35e..b531a89 100644 --- a/.github/workflows/release-publish.yml +++ b/.github/workflows/release-publish.yml @@ -7,21 +7,21 @@ permissions: read-all jobs: release-publish-artifacts: - runs-on: ubuntu-latest + runs-on: ${{ vars.CI_RUNNERS || 'ubuntu-latest' }} permissions: packages: write contents: write steps: - name: Checkout - uses: actions/checkout@v6 + uses: actions/checkout@v7.0.1 - name: Install QEMU static binaries uses: docker/setup-qemu-action@v4 - name: Install Task - uses: arduino/setup-task@v2 + uses: arduino/setup-task@v3.0.0 - name: Install Dagger env: # renovate: datasource=github-tags depName=dagger/dagger versioning=semver - DAGGER_VERSION: 0.20.8 + DAGGER_VERSION: 0.21.9 run: | curl -L https://dl.dagger.io/dagger/install.sh | BIN_DIR=$HOME/.local/bin sh - name: Create image and manifest diff --git a/.release-please-manifest.json b/.release-please-manifest.json index 8032c17..f87262a 100644 --- a/.release-please-manifest.json +++ b/.release-please-manifest.json @@ -1,3 +1,3 @@ { - ".": "0.12.0" + ".": "0.15.0" } diff --git a/CHANGELOG.md b/CHANGELOG.md index fb5c7a2..b7bac82 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,83 @@ # Changelog +## [0.15.0](https://github.com/cloudnative-pg/plugin-barman-cloud/compare/v0.14.0...v0.15.0) (2026-09-03) + + +### Features + +* **deps:** Bump Barman version to 3.20.0 ([#1090](https://github.com/cloudnative-pg/plugin-barman-cloud/issues/1090)) ([1bb6bab](https://github.com/cloudnative-pg/plugin-barman-cloud/commit/1bb6bab640f5adf038c86e33c96d42765d2aa708)) +* Serve restore hooks from the instance sidecar ([#1025](https://github.com/cloudnative-pg/plugin-barman-cloud/issues/1025)) ([7bb01a8](https://github.com/cloudnative-pg/plugin-barman-cloud/commit/7bb01a865b15c0f5f608c8bfbc7561daadf2de3d)) + + +### Bug Fixes + +* **deps:** Update all non-major go dependencies ([#1041](https://github.com/cloudnative-pg/plugin-barman-cloud/issues/1041)) ([9a3cc0d](https://github.com/cloudnative-pg/plugin-barman-cloud/commit/9a3cc0d35492697a31ddc13b87f269cca3e83ea5)) +* **deps:** Update all non-major go dependencies ([#1086](https://github.com/cloudnative-pg/plugin-barman-cloud/issues/1086)) ([31b2553](https://github.com/cloudnative-pg/plugin-barman-cloud/commit/31b25538bf6d8fadf2cd28c15b23c9c81ae22fac)) +* **deps:** Update kubernetes monorepo to v0.37.0 ([#1084](https://github.com/cloudnative-pg/plugin-barman-cloud/issues/1084)) ([b15b661](https://github.com/cloudnative-pg/plugin-barman-cloud/commit/b15b661648792cb2cb899ee628b8a3aa909c3fc8)) +* **deps:** Update module google.golang.org/grpc to v1.83.2 ([#1073](https://github.com/cloudnative-pg/plugin-barman-cloud/issues/1073)) ([b3d948c](https://github.com/cloudnative-pg/plugin-barman-cloud/commit/b3d948ce821c68be1d99c84c679e020b5f3db363)) + +## [0.14.0](https://github.com/cloudnative-pg/plugin-barman-cloud/compare/v0.13.0...v0.14.0) (2026-07-29) + + +### Features + +* Honor the operator's check_empty_wal_archive decision ([#1009](https://github.com/cloudnative-pg/plugin-barman-cloud/issues/1009)) ([7bcb74b](https://github.com/cloudnative-pg/plugin-barman-cloud/commit/7bcb74b987a3cca232c6f8021157eb711a1289b0)) + + +### Bug Fixes + +* **deps:** Update all non-major go dependencies ([#963](https://github.com/cloudnative-pg/plugin-barman-cloud/issues/963)) ([f949241](https://github.com/cloudnative-pg/plugin-barman-cloud/commit/f94924105b51b7b015338d4ec2c71904ef8d095c)) +* **deps:** Update all non-major go dependencies ([#979](https://github.com/cloudnative-pg/plugin-barman-cloud/issues/979)) ([bf52833](https://github.com/cloudnative-pg/plugin-barman-cloud/commit/bf5283359478071f116464c14a7a3d3d0a358eea)) +* **deps:** Update all non-major go dependencies ([#982](https://github.com/cloudnative-pg/plugin-barman-cloud/issues/982)) ([5f84ecc](https://github.com/cloudnative-pg/plugin-barman-cloud/commit/5f84ecce4a9433da27346d194f6a4b456d59f75f)) +* **deps:** Update all non-major go dependencies to 53ffbf0 ([#973](https://github.com/cloudnative-pg/plugin-barman-cloud/issues/973)) ([7190349](https://github.com/cloudnative-pg/plugin-barman-cloud/commit/719034947061f72ce8fcc919f5e209aa7fd7d874)) +* **deps:** Update all non-major go dependencies to 592f761 ([#972](https://github.com/cloudnative-pg/plugin-barman-cloud/issues/972)) ([2fa63c4](https://github.com/cloudnative-pg/plugin-barman-cloud/commit/2fa63c4bc28c03fbb79e3751a001868e991b8917)) +* **deps:** Update all non-major go dependencies to 8d9302e ([#975](https://github.com/cloudnative-pg/plugin-barman-cloud/issues/975)) ([0c687cb](https://github.com/cloudnative-pg/plugin-barman-cloud/commit/0c687cbbf13f4ce5ca1690d4dcf768d76cb4731a)) +* **deps:** Update all non-major go dependencies to v2.30.0 ([#957](https://github.com/cloudnative-pg/plugin-barman-cloud/issues/957)) ([61b82ce](https://github.com/cloudnative-pg/plugin-barman-cloud/commit/61b82ce250e95f04d49d0fb427e79364f2d900c0)) +* **deps:** Update documentation dependencies to v3.10.2 ([#1001](https://github.com/cloudnative-pg/plugin-barman-cloud/issues/1001)) ([88f2e29](https://github.com/cloudnative-pg/plugin-barman-cloud/commit/88f2e296746f495d3e7b27cd7297e772d53f61e9)) +* **deps:** Update github.com/cloudnative-pg/barman-cloud digest to 950b0f5 ([#1022](https://github.com/cloudnative-pg/plugin-barman-cloud/issues/1022)) ([98537c4](https://github.com/cloudnative-pg/plugin-barman-cloud/commit/98537c4d0e899e136e85237b29020a9bbbf9f5aa)) +* **deps:** Update k8s.io/utils digest to a95e086 ([#968](https://github.com/cloudnative-pg/plugin-barman-cloud/issues/968)) ([f7f0136](https://github.com/cloudnative-pg/plugin-barman-cloud/commit/f7f0136520b1032698b26e33e6eff1caa01173f5)) +* **deps:** Update k8s.io/utils digest to be93311 ([#986](https://github.com/cloudnative-pg/plugin-barman-cloud/issues/986)) ([2cc4e99](https://github.com/cloudnative-pg/plugin-barman-cloud/commit/2cc4e9905db6b1d1c5788dd6093a1a7d330d9064)) +* **deps:** Update kubernetes monorepo to v0.36.2 ([#958](https://github.com/cloudnative-pg/plugin-barman-cloud/issues/958)) ([030b28c](https://github.com/cloudnative-pg/plugin-barman-cloud/commit/030b28c4b9aee205f7a43f1fcc4da363b50839d9)) +* **deps:** Update kubernetes monorepo to v0.36.3 ([#1031](https://github.com/cloudnative-pg/plugin-barman-cloud/issues/1031)) ([ce81794](https://github.com/cloudnative-pg/plugin-barman-cloud/commit/ce8179442b49e0686ec05505b4ba79360b54ec8c)) +* **deps:** Update module github.com/cloudnative-pg/cnpg-i to v0.6.0 ([#1021](https://github.com/cloudnative-pg/plugin-barman-cloud/issues/1021)) ([13450a3](https://github.com/cloudnative-pg/plugin-barman-cloud/commit/13450a370d16fda87c128fc3a2f420f5b0cc442b)) +* **deps:** Update module google.golang.org/grpc to v1.82.1 ([#1008](https://github.com/cloudnative-pg/plugin-barman-cloud/issues/1008)) ([3c27364](https://github.com/cloudnative-pg/plugin-barman-cloud/commit/3c273641e3fb8027011be74ebb09d0ba91f71c7b)) +* **docs:** Fix broken anchor link in concepts.md ([#1013](https://github.com/cloudnative-pg/plugin-barman-cloud/issues/1013)) ([9c84d06](https://github.com/cloudnative-pg/plugin-barman-cloud/commit/9c84d069edc39c2848813aff5fd13c13c2ac8ff9)) +* Inject barman sidecar in replica clusters bootstrapped with pg_basebackup ([#965](https://github.com/cloudnative-pg/plugin-barman-cloud/issues/965)) ([eb5e860](https://github.com/cloudnative-pg/plugin-barman-cloud/commit/eb5e8607752d60bf36b4a9ddcaa5bb447f323012)) +* Reduce startupProbe periodSeconds without losing failure tolerance ([#992](https://github.com/cloudnative-pg/plugin-barman-cloud/issues/992)) ([bf95543](https://github.com/cloudnative-pg/plugin-barman-cloud/commit/bf955430cb58987bbbe3cd2925ea06700cf85609)), refs [#991](https://github.com/cloudnative-pg/plugin-barman-cloud/issues/991) +* Restore WAL from replica source during designated primary promotion ([#966](https://github.com/cloudnative-pg/plugin-barman-cloud/issues/966)) ([c34b232](https://github.com/cloudnative-pg/plugin-barman-cloud/commit/c34b2329ea39f9a1030d9d1225aa4d0a276255eb)) +* **walrestore:** Serve pg_rewind without prefetching and flag machinery ([#1007](https://github.com/cloudnative-pg/plugin-barman-cloud/issues/1007)) ([fb3f0f9](https://github.com/cloudnative-pg/plugin-barman-cloud/commit/fb3f0f9dabba85d87af85418d58b2f8224ed6305)) + +## [0.13.0](https://github.com/cloudnative-pg/plugin-barman-cloud/compare/v0.12.0...v0.13.0) (2026-06-10) + + +### Features + +* Configure k8s recommended labels on subresources ([#865](https://github.com/cloudnative-pg/plugin-barman-cloud/issues/865)) ([4bbaf18](https://github.com/cloudnative-pg/plugin-barman-cloud/commit/4bbaf18cd30174229d98e23151d2d257c90b561a)), closes [#545](https://github.com/cloudnative-pg/plugin-barman-cloud/issues/545) +* Pass additionalCommandArgs to barman-cloud-restore ([#914](https://github.com/cloudnative-pg/plugin-barman-cloud/issues/914)) ([c5f149b](https://github.com/cloudnative-pg/plugin-barman-cloud/commit/c5f149b86a38fd2af33045d785c2e9a69a7e340a)), closes [#821](https://github.com/cloudnative-pg/plugin-barman-cloud/issues/821) + + +### Bug Fixes + +* Add lz4 compression support for base backups ([#868](https://github.com/cloudnative-pg/plugin-barman-cloud/issues/868)) ([e30154b](https://github.com/cloudnative-pg/plugin-barman-cloud/commit/e30154b938b053f688b5ab520000233e164df6b6)), closes [#867](https://github.com/cloudnative-pg/plugin-barman-cloud/issues/867) +* Classify WAL restore errors with precise gRPC statuses ([#927](https://github.com/cloudnative-pg/plugin-barman-cloud/issues/927)) ([aaf6120](https://github.com/cloudnative-pg/plugin-barman-cloud/commit/aaf6120eaaf96d805d26fe4550b1f9c14dd8e02f)) +* **deps:** Update all non-major go dependencies ([#877](https://github.com/cloudnative-pg/plugin-barman-cloud/issues/877)) ([a81f6e3](https://github.com/cloudnative-pg/plugin-barman-cloud/commit/a81f6e3d73ee348df22439f2daf062f4be598910)) +* **deps:** Update all non-major go dependencies ([#898](https://github.com/cloudnative-pg/plugin-barman-cloud/issues/898)) ([acdbfb8](https://github.com/cloudnative-pg/plugin-barman-cloud/commit/acdbfb8b10f93cf52f874ec893905709d9bcaa8b)) +* **deps:** Update all non-major go dependencies to 5d46599 ([#940](https://github.com/cloudnative-pg/plugin-barman-cloud/issues/940)) ([40aa4b2](https://github.com/cloudnative-pg/plugin-barman-cloud/commit/40aa4b21b88e2e323226c391078240d365653de9)) +* **deps:** Update all non-major go dependencies to 8e1642e ([#939](https://github.com/cloudnative-pg/plugin-barman-cloud/issues/939)) ([f708825](https://github.com/cloudnative-pg/plugin-barman-cloud/commit/f7088258fd0ca1bca2e7dc15753be495d7dcc022)) +* **deps:** Update all non-major go dependencies to bd68198 ([#950](https://github.com/cloudnative-pg/plugin-barman-cloud/issues/950)) ([787d2b3](https://github.com/cloudnative-pg/plugin-barman-cloud/commit/787d2b35ad4f86a0c125e4996194ec8fe7957de7)) +* **deps:** Update documentation dependencies to v3.10.1 ([#878](https://github.com/cloudnative-pg/plugin-barman-cloud/issues/878)) ([6cf473d](https://github.com/cloudnative-pg/plugin-barman-cloud/commit/6cf473d5e8a16e204364b53bb0718d541c8c99ac)) +* **deps:** Update k8s.io/utils digest to ff6756f ([#894](https://github.com/cloudnative-pg/plugin-barman-cloud/issues/894)) ([b7389e1](https://github.com/cloudnative-pg/plugin-barman-cloud/commit/b7389e18e5ec216a601722bb6686b11c49745b03)) +* **deps:** Update kubernetes monorepo to v0.35.4 ([#853](https://github.com/cloudnative-pg/plugin-barman-cloud/issues/853)) ([21f811a](https://github.com/cloudnative-pg/plugin-barman-cloud/commit/21f811a3f22b8f87ca9230a131f57f832c086fcf)) +* **deps:** Update kubernetes monorepo to v0.36.1 ([#909](https://github.com/cloudnative-pg/plugin-barman-cloud/issues/909)) ([99eb4a3](https://github.com/cloudnative-pg/plugin-barman-cloud/commit/99eb4a3fe5f4503c76f9afea08164d8e511c4f5b)) +* **deps:** Update module github.com/cloudnative-pg/cloudnative-pg to v1.29.1 [security] ([#902](https://github.com/cloudnative-pg/plugin-barman-cloud/issues/902)) ([ba5063f](https://github.com/cloudnative-pg/plugin-barman-cloud/commit/ba5063f01393309459e02c30078c34b429f8f21b)) +* **deps:** Update module github.com/cloudnative-pg/machinery to v0.5.0 ([#925](https://github.com/cloudnative-pg/plugin-barman-cloud/issues/925)) ([ef4b711](https://github.com/cloudnative-pg/plugin-barman-cloud/commit/ef4b7111372877eed087b9178d157dd0d1084bf8)) +* **deps:** Update module github.com/onsi/ginkgo/v2 to v2.28.2 ([#874](https://github.com/cloudnative-pg/plugin-barman-cloud/issues/874)) ([8cb32e5](https://github.com/cloudnative-pg/plugin-barman-cloud/commit/8cb32e5a5153347a6b05bf63816bcbc9d94f4d67)) +* **deps:** Update module google.golang.org/grpc to v1.81.0 ([#884](https://github.com/cloudnative-pg/plugin-barman-cloud/issues/884)) ([6fdecfd](https://github.com/cloudnative-pg/plugin-barman-cloud/commit/6fdecfde21b7a5cd05bc3f53895243fbf8537770)) +* **deps:** Update module sigs.k8s.io/controller-runtime to v0.24.0 ([#880](https://github.com/cloudnative-pg/plugin-barman-cloud/issues/880)) ([58f4fed](https://github.com/cloudnative-pg/plugin-barman-cloud/commit/58f4fed40ba788f76f706e148bebf1892a2dd609)) +* **deps:** Update module sigs.k8s.io/controller-runtime to v0.24.1 ([#910](https://github.com/cloudnative-pg/plugin-barman-cloud/issues/910)) ([9be87b0](https://github.com/cloudnative-pg/plugin-barman-cloud/commit/9be87b0d9c87c0df7f1f72caa33bf848fbc16582)) +* **docs:** Update broken link to CloudNativePG documentation ([#904](https://github.com/cloudnative-pg/plugin-barman-cloud/issues/904)) ([43f92fb](https://github.com/cloudnative-pg/plugin-barman-cloud/commit/43f92fbcf1f57d95bbca22cb63c9697d75fc0dbc)), closes [#729](https://github.com/cloudnative-pg/plugin-barman-cloud/issues/729) +* **scheme:** Register meta types for CNPG scheme group version ([#943](https://github.com/cloudnative-pg/plugin-barman-cloud/issues/943)) ([bb7845d](https://github.com/cloudnative-pg/plugin-barman-cloud/commit/bb7845dd621115026744c9f1b32cb2fd0cb4a729)), closes [#942](https://github.com/cloudnative-pg/plugin-barman-cloud/issues/942) + ## [0.12.0](https://github.com/cloudnative-pg/plugin-barman-cloud/compare/v0.11.0...v0.12.0) (2026-04-13) diff --git a/CODEOWNERS b/CODEOWNERS index c0e7e8b..89d75b7 100644 --- a/CODEOWNERS +++ b/CODEOWNERS @@ -1,5 +1,9 @@ -# The CODEOWNERS file is used to define individuals or teams that are -# responsible for code in a repository. For details, please refer to -# https://docs.github.com/en/free-pro-team@latest/github/creating-cloning-and-archiving-repositories/about-code-owners +# This file is generated from componentowners-policy.yaml in +# cloudnative-pg/cnpg-infra — do not hand-edit, propose changes there instead. +# +# Path-scoped rules below always include the repo's own general owners +# (the "*" line) in addition to their own specific teams/users, since +# CODEOWNERS only honors the LAST matching pattern for a given path — +# it does not merge an earlier, less-specific rule into a later one. -* @cloudnative-pg/maintainers +* @cloudnative-pg/plugin-barman-cloud-owners diff --git a/Taskfile.yml b/Taskfile.yml index 56da017..eaff88b 100644 --- a/Taskfile.yml +++ b/Taskfile.yml @@ -9,7 +9,7 @@ vars: GO_VERSION: sh: sed -n 's/^toolchain go//p' go.mod | grep . || sed -n 's/^go //p' go.mod # renovate: datasource=docker depName=kindest/node versioning=semver - E2E_KUBERNETES_VERSION: v1.35.1 + E2E_KUBERNETES_VERSION: v1.37.0 E2E_CLUSTER_NAME: barman-cloud-plugin-e2e-{{.E2E_KUBERNETES_VERSION}} REGISTRY_NETWORK: barman-cloud-plugin REGISTRY_NAME: registry.barman-cloud-plugin @@ -21,9 +21,9 @@ tasks: desc: Run golangci-lint env: # renovate: datasource=git-refs depName=golangci-lint lookupName=https://github.com/sagikazarmark/daggerverse currentValue=main - DAGGER_GOLANGCI_LINT_SHA: 81b688189377135bd0cf85f3ddba88c4fbb52c2d + DAGGER_GOLANGCI_LINT_SHA: ff27cd50f6b4eed2e3753c520632cd6099e1ce52 # renovate: datasource=docker depName=golangci/golangci-lint versioning=semver - GOLANGCI_LINT_VERSION: v2.12.2 + GOLANGCI_LINT_VERSION: v2.13.2 cmds: - > GITHUB_REF= dagger -sc "github.com/sagikazarmark/daggerverse/golangci-lint@${DAGGER_GOLANGCI_LINT_SHA} @@ -34,6 +34,7 @@ tasks: wordlist-ordered: desc: Order the word list file + run: once cmds: - LANG=C LC_ALL=C sort .wordlist.txt > .wordlist.txt.new - mv -f .wordlist.txt.new .wordlist.txt @@ -46,7 +47,7 @@ tasks: - wordlist-ordered env: # renovate: datasource=git-refs depName=spellcheck lookupName=https://github.com/cloudnative-pg/daggerverse currentValue=main - DAGGER_SPELLCHECK_SHA: 537e0ddae55ad0344af8f4454de7f27baeee48fa + DAGGER_SPELLCHECK_SHA: 26cd57fb6ad66e88c036b675b0478d38df93962d cmds: - > GITHUB_REF= dagger -s call -m github.com/cloudnative-pg/daggerverse/spellcheck@${DAGGER_SPELLCHECK_SHA} @@ -60,12 +61,32 @@ tasks: desc: Check for conventional commits env: # renovate: datasource=git-refs depName=commitlint lookupName=https://github.com/cloudnative-pg/daggerverse currentValue=main - DAGGER_COMMITLINT_SHA: 537e0ddae55ad0344af8f4454de7f27baeee48fa + DAGGER_COMMITLINT_SHA: 26cd57fb6ad66e88c036b675b0478d38df93962d cmds: - > GITHUB_REF= dagger -s call -m github.com/cloudnative-pg/daggerverse/commitlint@${DAGGER_COMMITLINT_SHA} lint --source . --args "--from=origin/main" stdout + pip-compile-sidecar: + desc: Regenerate containers/sidecar-requirements.txt with the same Python version as the sidecar image + cmds: + - > + GITHUB_REF= dagger call --no-mod + container from --address=debian:trixie-slim + with-env-variable --name=DEBIAN_FRONTEND --value=noninteractive + with-exec --args="apt-get,update,-qq" + with-exec --args="apt-get,install,-y,-qq,python3,python3-venv,python3-pip,gcc,libpq-dev" + with-exec --args="pip,install,--quiet,--break-system-packages,pip-tools,click<8.5.0" + with-directory --path=/work --source=containers + with-workdir --path=/work + with-exec --args="pip-compile,--allow-unsafe,--generate-hashes,--output-file=sidecar-requirements.txt,--strip-extras,sidecar-requirements.in" + file --path=/work/sidecar-requirements.txt + export --path=containers/sidecar-requirements.txt + sources: + - containers/sidecar-requirements.in + generates: + - containers/sidecar-requirements.txt + uncommitted: desc: Check for uncommitted changes deps: @@ -74,7 +95,7 @@ tasks: - wordlist-ordered env: # renovate: datasource=git-refs depName=uncommitted lookupName=https://github.com/cloudnative-pg/daggerverse currentValue=main - DAGGER_UNCOMMITTED_SHA: 537e0ddae55ad0344af8f4454de7f27baeee48fa + DAGGER_UNCOMMITTED_SHA: 26cd57fb6ad66e88c036b675b0478d38df93962d cmds: - GITHUB_REF= dagger -s call -m github.com/cloudnative-pg/daggerverse/uncommitted@${DAGGER_UNCOMMITTED_SHA} check-uncommitted --source . stdout sources: @@ -86,7 +107,7 @@ tasks: - controller-gen env: # renovate: datasource=git-refs depName=crd-gen-refs lookupName=https://github.com/cloudnative-pg/daggerverse currentValue=main - DAGGER_CRDGENREF_SHA: 537e0ddae55ad0344af8f4454de7f27baeee48fa + DAGGER_CRDGENREF_SHA: 26cd57fb6ad66e88c036b675b0478d38df93962d # renovate: datasource=go depName=github.com/elastic/crd-ref-docs CRDREFDOCS_VERSION: v0.3.0 cmds: @@ -122,7 +143,7 @@ tasks: docusaurus-version-is-aligned: desc: Verify that a documentation version exists for the current version of the plugin cmds: - - $(dagger -s call -m dagger/check-doc-version has-version-documentation --src .) + - $(GITHUB_REF= dagger -s call -m dagger/check-doc-version has-version-documentation --src .) src: - .release-please-manifest.json - ./web/versions.json @@ -206,7 +227,7 @@ tasks: - start-build-network vars: # renovate: datasource=github-tags depName=dagger/dagger versioning=semver - DAGGER_VERSION: 0.20.8 + DAGGER_VERSION: 0.21.9 DAGGER_ENGINE_IMAGE: registry.dagger.io/engine:v{{ .DAGGER_VERSION }} cmds: - > @@ -263,7 +284,7 @@ tasks: run: once vars: # renovate: datasource=git-refs depName=kind lookupName=https://github.com/kubernetes-sigs/kind versioning=semver - KIND_VERSION: v0.31.0 + KIND_VERSION: v0.33.0 cmds: - go install sigs.k8s.io/kind@{{.KIND_VERSION}} - kind version | grep -q {{.KIND_VERSION}} @@ -360,18 +381,20 @@ tasks: SIDECAR_IMAGE_NAME: ghcr.io/{{.GITHUB_REPOSITORY}}-sidecar{{if not (hasPrefix "refs/tags/v" .GITHUB_REF)}}-testing{{end}} # remove /merge suffix from the branch name. This is a workaround for the GitHub workflow on PRs, # where the branch name is suffixed with /merge. Prepend pr- to the branch name on PRs. - IMAGE_VERSION: '{{regexReplaceAll "(\\d+)/merge" .GITHUB_REF_NAME "pr-${1}"}}' + # Any remaining "/" (e.g. from namespaced branches like "dev/foo") is replaced with "-" since + # "/" is not a valid character in a Docker tag. + IMAGE_VERSION: '{{replace "/" "-" (regexReplaceAll "(\\d+)/merge" .GITHUB_REF_NAME "pr-${1}")}}' env: # renovate: datasource=git-refs depName=docker lookupName=https://github.com/purpleclay/daggerverse currentValue=main DAGGER_DOCKER_SHA: ee12c1a4a2630e194ec20c5a9959183e3a78c192 cmds: - > - dagger call -m github.com/purpleclay/daggerverse/docker@${DAGGER_DOCKER_SHA} + GITHUB_REF= dagger call -m github.com/purpleclay/daggerverse/docker@${DAGGER_DOCKER_SHA} --registry ghcr.io --username $REGISTRY_USER --password env:REGISTRY_PASSWORD build --dir . --file containers/Dockerfile.plugin --args GO_VERSION={{.GO_VERSION}} --platform linux/amd64 --platform linux/arm64 publish --ref {{.PLUGIN_IMAGE_NAME}} --tags {{.IMAGE_VERSION}} - > - dagger call -m github.com/purpleclay/daggerverse/docker@${DAGGER_DOCKER_SHA} + GITHUB_REF= dagger call -m github.com/purpleclay/daggerverse/docker@${DAGGER_DOCKER_SHA} --registry ghcr.io --username $REGISTRY_USER --password env:REGISTRY_PASSWORD build --dir . --file containers/Dockerfile.sidecar --args GO_VERSION={{.GO_VERSION}} --platform linux/amd64 --platform linux/arm64 publish --ref {{.SIDECAR_IMAGE_NAME}} --tags {{.IMAGE_VERSION}} @@ -381,7 +404,7 @@ tasks: run: once env: # renovate: datasource=git-refs depName=controller-gen lookupName=https://github.com/cloudnative-pg/daggerverse currentValue=main - DAGGER_CONTROLLER_GEN_SHA: 537e0ddae55ad0344af8f4454de7f27baeee48fa + DAGGER_CONTROLLER_GEN_SHA: 26cd57fb6ad66e88c036b675b0478d38df93962d cmds: - > GITHUB_REF= dagger -s call -m github.com/cloudnative-pg/daggerverse/controller-gen@${DAGGER_CONTROLLER_GEN_SHA} @@ -450,19 +473,21 @@ tasks: SIDECAR_IMAGE_NAME: ghcr.io/{{.GITHUB_REPOSITORY}}-sidecar{{if not (hasPrefix "refs/tags/v" .GITHUB_REF)}}-testing{{end}} # remove /merge suffix from the branch name. This is a workaround for the GitHub workflow on PRs, # where the branch name is suffixed with /merge. Prepend pr- to the branch name on PRs. - IMAGE_VERSION: '{{regexReplaceAll "(\\d+)/merge" .GITHUB_REF_NAME "pr-${1}"}}' + # Any remaining "/" (e.g. from namespaced branches like "dev/foo") is replaced with "-" since + # "/" is not a valid character in a Docker tag. + IMAGE_VERSION: '{{replace "/" "-" (regexReplaceAll "(\\d+)/merge" .GITHUB_REF_NAME "pr-${1}")}}' env: # renovate: datasource=git-refs depName=kustomize lookupName=https://github.com/sagikazarmark/daggerverse currentValue=main - DAGGER_KUSTOMIZE_SHA: 81b688189377135bd0cf85f3ddba88c4fbb52c2d + DAGGER_KUSTOMIZE_SHA: ff27cd50f6b4eed2e3753c520632cd6099e1ce52 cmds: - > - dagger -s call -m https://github.com/sagikazarmark/daggerverse/kustomize@${DAGGER_KUSTOMIZE_SHA} + GITHUB_REF= dagger -s call -m https://github.com/sagikazarmark/daggerverse/kustomize@${DAGGER_KUSTOMIZE_SHA} edit --source . --dir kubernetes set image --image plugin-barman-cloud={{.PLUGIN_IMAGE_NAME}}:{{.IMAGE_VERSION}} set secret --secret plugin-barman-cloud --from-literal SIDECAR_IMAGE={{.SIDECAR_IMAGE_NAME}}:{{.IMAGE_VERSION}} directory directory --path kubernetes export --path manifest-build - > - dagger -s call -m github.com/sagikazarmark/daggerverse/kustomize@${DAGGER_KUSTOMIZE_SHA} + GITHUB_REF= dagger -s call -m github.com/sagikazarmark/daggerverse/kustomize@${DAGGER_KUSTOMIZE_SHA} build --source . --dir manifest-build export --path manifest.yaml sources: - ./config/**/*.yaml @@ -483,13 +508,13 @@ tasks: - GITHUB_TOKEN env: # renovate: datasource=git-refs depName=gh lookupName=https://github.com/sagikazarmark/daggerverse - DAGGER_GH_SHA: 81b688189377135bd0cf85f3ddba88c4fbb52c2d + DAGGER_GH_SHA: ff27cd50f6b4eed2e3753c520632cd6099e1ce52 preconditions: - sh: "[[ {{.GITHUB_REF}} =~ 'refs/tags/v.*' ]]" msg: not a tag, failing cmds: - > - dagger -s call -m github.com/sagikazarmark/daggerverse/gh@${DAGGER_GH_SHA} + GITHUB_REF= dagger -s call -m github.com/sagikazarmark/daggerverse/gh@${DAGGER_GH_SHA} with-source --source . run --repo {{.GITHUB_REPOSITORY}} --token env:GITHUB_TOKEN --cmd "release upload {{.GITHUB_REF_NAME}} manifest.yaml" diff --git a/config/crd/bases/barmancloud.cnpg.io_objectstores.yaml b/config/crd/bases/barmancloud.cnpg.io_objectstores.yaml index f8688ce..bb7db1e 100644 --- a/config/crd/bases/barmancloud.cnpg.io_objectstores.yaml +++ b/config/crd/bases/barmancloud.cnpg.io_objectstores.yaml @@ -176,6 +176,25 @@ spec: format: int32 minimum: 1 type: integer + restoreAdditionalCommandArgs: + description: |- + Additional arguments that can be appended to the 'barman-cloud-restore' + command-line invocation. These arguments provide flexibility to customize + the data restore process further, according to specific requirements or + configurations. + + Example: + In a scenario where specialized restore options are required, such as setting + a specific read timeout or defining custom behavior, users can use this field + to specify additional command arguments. + + Note: + It's essential to ensure that the provided arguments are valid and supported + by the 'barman-cloud-restore' command, to avoid potential errors or unintended + behavior during execution. + items: + type: string + type: array type: object destinationPath: description: |- @@ -441,7 +460,9 @@ spec: description: Selects a key of a ConfigMap. properties: key: - description: The key to select. + description: |- + The key to select from the ConfigMap's Data field. + Keys in the BinaryData field are not currently propagated to container env vars. type: string name: default: "" diff --git a/containers/Dockerfile.sidecar b/containers/Dockerfile.sidecar index 3970bba..3ad1217 100644 --- a/containers/Dockerfile.sidecar +++ b/containers/Dockerfile.sidecar @@ -55,7 +55,7 @@ COPY containers/sidecar-requirements.txt . # Create virtualenv and install dependencies RUN python3 -m venv /venv && \ - /venv/bin/pip install --upgrade pip setuptools wheel && \ + /venv/bin/pip install --upgrade pip wheel && \ /venv/bin/pip install --no-cache-dir -r sidecar-requirements.txt # Download and extract runtime library packages and their dependencies @@ -63,6 +63,9 @@ RUN python3 -m venv /venv && \ # already present in the distroless base image. # Distroless package list from: https://github.com/GoogleContainerTools/distroless/blob/main/base/config.bzl # and https://github.com/GoogleContainerTools/distroless/blob/main/python3/config.bzl +# libselinux1/libpcre2-8-0 are pulled in transitively by python3.13-venv's apt metadata, +# but the actual distroless base does not ship them, so they are excluded from the +# "already present" set below to force them to be bundled (tar needs them at runtime). RUN mkdir -p /dependencies /build/downloads && \ cd /build/downloads && \ DISTROLESS_PACKAGES="libc6 libssl3t64 libzstd1 zlib1g libgcc-s1 libstdc++6 \ @@ -73,10 +76,11 @@ RUN mkdir -p /dependencies /build/downloads && \ libpython3.13-stdlib python3.13-minimal python3.13-venv" && \ apt-cache depends --recurse --no-recommends --no-suggests \ --no-conflicts --no-breaks --no-replaces --no-enhances \ - $DISTROLESS_PACKAGES 2>/dev/null | grep "^\w" | sort -u > /tmp/distroless.txt && \ + $DISTROLESS_PACKAGES 2>/dev/null | grep "^\w" | sort -u | \ + grep -v -x -E 'libselinux1|libpcre2-8-0' > /tmp/distroless.txt && \ apt-cache depends --recurse --no-recommends --no-suggests \ --no-conflicts --no-breaks --no-replaces --no-enhances \ - libpq5 liblz4-1 libsnappy1v5 2>/dev/null | grep "^\w" | sort -u | \ + libpq5 liblz4-1 libsnappy1v5 tar 2>/dev/null | grep "^\w" | sort -u | \ grep -v -F -x -f /tmp/distroless.txt > /tmp/packages.txt && \ apt-get download $(cat /tmp/packages.txt) && \ for deb in *.deb; do \ @@ -102,6 +106,7 @@ LABEL summary="$SUMMARY" \ COPY --from=pythonbuilder /venv /venv COPY --from=pythonbuilder /dependencies/usr/lib /usr/lib +COPY --from=pythonbuilder /dependencies/usr/bin/tar /usr/bin/tar COPY --from=gobuilder /workspace/manager /manager # Compile all Python bytecode as root to avoid runtime compilation diff --git a/containers/sidecar-requirements.in b/containers/sidecar-requirements.in index 8d6ba1f..0c8b976 100644 --- a/containers/sidecar-requirements.in +++ b/containers/sidecar-requirements.in @@ -1,3 +1,2 @@ -barman[azure,cloud,google,snappy,zstandard,lz4]==3.18.0 -setuptools==82.0.1 +barman[azure,cloud,google,snappy,zstandard,lz4]==3.20.0 zipp>=3.19.1 # not directly required, pinned by Snyk to avoid a vulnerability diff --git a/containers/sidecar-requirements.txt b/containers/sidecar-requirements.txt index 6071876..3322a29 100644 --- a/containers/sidecar-requirements.txt +++ b/containers/sidecar-requirements.txt @@ -14,458 +14,500 @@ azure-identity==1.25.3 \ --hash=sha256:ab23c0d63015f50b630ef6c6cf395e7262f439ce06e5d07a64e874c724f8d9e6 \ --hash=sha256:f4d0b956a8146f30333e071374171f3cfa7bdb8073adb8c3814b65567aa7447c # via barman -azure-storage-blob==12.29.0 \ - --hash=sha256:2824ddd7ebc9056034ebc76b17971a38e9aa5835abb0d565b9700493f2a6c657 \ - --hash=sha256:ccf8a1bcd5e49df83ab85aab793b579e5ba2eeea2ad8900b2f62ca3a37dc391f +azure-storage-blob==12.30.0 \ + --hash=sha256:2cd74d4d5731e5eb6b8d5c5056ee115a5e88f8fdf22517b739836fda685018be \ + --hash=sha256:d415ac50b67a8da6b3ae7e9f1014b1b55cd7aafa0b8d4ca9b380568dc7360423 # via barman -barman==3.18.0 \ - --hash=sha256:8e752ac93d2f3a61e86b8374185209cae477a638ece7e6f540070f36d28d6997 \ - --hash=sha256:ff90c44dafa4107b7574142771cdc2611c4cf1af818d93d3e67440a0c81164b9 +barman==3.20.0 \ + --hash=sha256:02dd8936e62c1829c78597eefedfcab0aa820f5618da2871f38b5bc684891a54 \ + --hash=sha256:1aa92df452f39c357d6547fd0abd3885a8c243ea95002e6fc0b7f66f8e8c24d5 # via -r sidecar-requirements.in -boto3==1.43.14 \ - --hash=sha256:574335744656cfed0b362a0a0467aaf2eb2bf15526edcd02d31d3c661f4b09e4 \ - --hash=sha256:5c0a994b3182061ee101812e721100717a4d664f9f4ceaf4a86b6d032ce9fc2d +boto3==1.43.81 \ + --hash=sha256:62ecf695088e06f37500d6cc49a240dc1331379bd5ae992d185fef212038ca29 \ + --hash=sha256:6e24f98974400a3845223bba77f457be92517f78e2cffadfa273e18ea1fe1944 # via barman -botocore==1.43.14 \ - --hash=sha256:1f4a2a95ea78c10398e78431e98c1fe47adb54a7b10a32975144c1f541186658 \ - --hash=sha256:b9e500737e43d2f147c9d4e23b54360335e77d4c0ba90a318f51b65e06cb8516 +botocore==1.43.81 \ + --hash=sha256:49eb02dac7eb4418ae589dc0da816d47bf40be1a7ccfdbed5f772c7a2efcf64d \ + --hash=sha256:a5d343674b63a619b7f1f3caef4eedb403500c7a8b95a9e7d8cac98b95501adb # via # boto3 # s3transfer -certifi==2026.5.20 \ - --hash=sha256:3c52e209ba0a4ad7aebe60436a4ab349c39e1e602e8c134221e546902ad25897 \ - --hash=sha256:69dea482ab64caa7b9f6aba1c6bf48bb6a5448d1c0f1b17ab42ad8c763a5344d +certifi==2026.7.22 \ + --hash=sha256:62f22742b58a1a33014a2b6b706588a8d7e2a88ae7bd1a6ebe8c992928483775 \ + --hash=sha256:741e2c3b351ddf169a738da9f2c048608ff7f2c5cc02f1ebc6b118bb090d5d55 # via requests -cffi==2.0.0 \ - --hash=sha256:00bdf7acc5f795150faa6957054fbbca2439db2f775ce831222b66f192f03beb \ - --hash=sha256:07b271772c100085dd28b74fa0cd81c8fb1a3ba18b21e03d7c27f3436a10606b \ - --hash=sha256:087067fa8953339c723661eda6b54bc98c5625757ea62e95eb4898ad5e776e9f \ - --hash=sha256:0a1527a803f0a659de1af2e1fd700213caba79377e27e4693648c2923da066f9 \ - --hash=sha256:0cf2d91ecc3fcc0625c2c530fe004f82c110405f101548512cce44322fa8ac44 \ - --hash=sha256:0f6084a0ea23d05d20c3edcda20c3d006f9b6f3fefeac38f59262e10cef47ee2 \ - --hash=sha256:12873ca6cb9b0f0d3a0da705d6086fe911591737a59f28b7936bdfed27c0d47c \ - --hash=sha256:19f705ada2530c1167abacb171925dd886168931e0a7b78f5bffcae5c6b5be75 \ - --hash=sha256:1cd13c99ce269b3ed80b417dcd591415d3372bcac067009b6e0f59c7d4015e65 \ - --hash=sha256:1e3a615586f05fc4065a8b22b8152f0c1b00cdbc60596d187c2a74f9e3036e4e \ - --hash=sha256:1f72fb8906754ac8a2cc3f9f5aaa298070652a0ffae577e0ea9bd480dc3c931a \ - --hash=sha256:1fc9ea04857caf665289b7a75923f2c6ed559b8298a1b8c49e59f7dd95c8481e \ - --hash=sha256:203a48d1fb583fc7d78a4c6655692963b860a417c0528492a6bc21f1aaefab25 \ - --hash=sha256:2081580ebb843f759b9f617314a24ed5738c51d2aee65d31e02f6f7a2b97707a \ - --hash=sha256:21d1152871b019407d8ac3985f6775c079416c282e431a4da6afe7aefd2bccbe \ - --hash=sha256:24b6f81f1983e6df8db3adc38562c83f7d4a0c36162885ec7f7b77c7dcbec97b \ - --hash=sha256:256f80b80ca3853f90c21b23ee78cd008713787b1b1e93eae9f3d6a7134abd91 \ - --hash=sha256:28a3a209b96630bca57cce802da70c266eb08c6e97e5afd61a75611ee6c64592 \ - --hash=sha256:2c8f814d84194c9ea681642fd164267891702542f028a15fc97d4674b6206187 \ - --hash=sha256:2de9a304e27f7596cd03d16f1b7c72219bd944e99cc52b84d0145aefb07cbd3c \ - --hash=sha256:38100abb9d1b1435bc4cc340bb4489635dc2f0da7456590877030c9b3d40b0c1 \ - --hash=sha256:3925dd22fa2b7699ed2617149842d2e6adde22b262fcbfada50e3d195e4b3a94 \ - --hash=sha256:3e17ed538242334bf70832644a32a7aae3d83b57567f9fd60a26257e992b79ba \ - --hash=sha256:3e837e369566884707ddaf85fc1744b47575005c0a229de3327f8f9a20f4efeb \ - --hash=sha256:3f4d46d8b35698056ec29bca21546e1551a205058ae1a181d871e278b0b28165 \ - --hash=sha256:44d1b5909021139fe36001ae048dbdde8214afa20200eda0f64c068cac5d5529 \ - --hash=sha256:45d5e886156860dc35862657e1494b9bae8dfa63bf56796f2fb56e1679fc0bca \ - --hash=sha256:4647afc2f90d1ddd33441e5b0e85b16b12ddec4fca55f0d9671fef036ecca27c \ - --hash=sha256:4671d9dd5ec934cb9a73e7ee9676f9362aba54f7f34910956b84d727b0d73fb6 \ - --hash=sha256:53f77cbe57044e88bbd5ed26ac1d0514d2acf0591dd6bb02a3ae37f76811b80c \ - --hash=sha256:5eda85d6d1879e692d546a078b44251cdd08dd1cfb98dfb77b670c97cee49ea0 \ - --hash=sha256:5fed36fccc0612a53f1d4d9a816b50a36702c28a2aa880cb8a122b3466638743 \ - --hash=sha256:61d028e90346df14fedc3d1e5441df818d095f3b87d286825dfcbd6459b7ef63 \ - --hash=sha256:66f011380d0e49ed280c789fbd08ff0d40968ee7b665575489afa95c98196ab5 \ - --hash=sha256:6824f87845e3396029f3820c206e459ccc91760e8fa24422f8b0c3d1731cbec5 \ - --hash=sha256:6c6c373cfc5c83a975506110d17457138c8c63016b563cc9ed6e056a82f13ce4 \ - --hash=sha256:6d02d6655b0e54f54c4ef0b94eb6be0607b70853c45ce98bd278dc7de718be5d \ - --hash=sha256:6d50360be4546678fc1b79ffe7a66265e28667840010348dd69a314145807a1b \ - --hash=sha256:730cacb21e1bdff3ce90babf007d0a0917cc3e6492f336c2f0134101e0944f93 \ - --hash=sha256:737fe7d37e1a1bffe70bd5754ea763a62a066dc5913ca57e957824b72a85e205 \ - --hash=sha256:74a03b9698e198d47562765773b4a8309919089150a0bb17d829ad7b44b60d27 \ - --hash=sha256:7553fb2090d71822f02c629afe6042c299edf91ba1bf94951165613553984512 \ - --hash=sha256:7a66c7204d8869299919db4d5069a82f1561581af12b11b3c9f48c584eb8743d \ - --hash=sha256:7cc09976e8b56f8cebd752f7113ad07752461f48a58cbba644139015ac24954c \ - --hash=sha256:81afed14892743bbe14dacb9e36d9e0e504cd204e0b165062c488942b9718037 \ - --hash=sha256:8941aaadaf67246224cee8c3803777eed332a19d909b47e29c9842ef1e79ac26 \ - --hash=sha256:89472c9762729b5ae1ad974b777416bfda4ac5642423fa93bd57a09204712322 \ - --hash=sha256:8ea985900c5c95ce9db1745f7933eeef5d314f0565b27625d9a10ec9881e1bfb \ - --hash=sha256:8eca2a813c1cb7ad4fb74d368c2ffbbb4789d377ee5bb8df98373c2cc0dee76c \ - --hash=sha256:92b68146a71df78564e4ef48af17551a5ddd142e5190cdf2c5624d0c3ff5b2e8 \ - --hash=sha256:9332088d75dc3241c702d852d4671613136d90fa6881da7d770a483fd05248b4 \ - --hash=sha256:94698a9c5f91f9d138526b48fe26a199609544591f859c870d477351dc7b2414 \ - --hash=sha256:9a67fc9e8eb39039280526379fb3a70023d77caec1852002b4da7e8b270c4dd9 \ - --hash=sha256:9de40a7b0323d889cf8d23d1ef214f565ab154443c42737dfe52ff82cf857664 \ - --hash=sha256:a05d0c237b3349096d3981b727493e22147f934b20f6f125a3eba8f994bec4a9 \ - --hash=sha256:afb8db5439b81cf9c9d0c80404b60c3cc9c3add93e114dcae767f1477cb53775 \ - --hash=sha256:b18a3ed7d5b3bd8d9ef7a8cb226502c6bf8308df1525e1cc676c3680e7176739 \ - --hash=sha256:b1e74d11748e7e98e2f426ab176d4ed720a64412b6a15054378afdb71e0f37dc \ - --hash=sha256:b21e08af67b8a103c71a250401c78d5e0893beff75e28c53c98f4de42f774062 \ - --hash=sha256:b4c854ef3adc177950a8dfc81a86f5115d2abd545751a304c5bcf2c2c7283cfe \ - --hash=sha256:b882b3df248017dba09d6b16defe9b5c407fe32fc7c65a9c69798e6175601be9 \ - --hash=sha256:baf5215e0ab74c16e2dd324e8ec067ef59e41125d3eade2b863d294fd5035c92 \ - --hash=sha256:c649e3a33450ec82378822b3dad03cc228b8f5963c0c12fc3b1e0ab940f768a5 \ - --hash=sha256:c654de545946e0db659b3400168c9ad31b5d29593291482c43e3564effbcee13 \ - --hash=sha256:c6638687455baf640e37344fe26d37c404db8b80d037c3d29f58fe8d1c3b194d \ - --hash=sha256:c8d3b5532fc71b7a77c09192b4a5a200ea992702734a2e9279a37f2478236f26 \ - --hash=sha256:cb527a79772e5ef98fb1d700678fe031e353e765d1ca2d409c92263c6d43e09f \ - --hash=sha256:cf364028c016c03078a23b503f02058f1814320a56ad535686f90565636a9495 \ - --hash=sha256:d48a880098c96020b02d5a1f7d9251308510ce8858940e6fa99ece33f610838b \ - --hash=sha256:d68b6cef7827e8641e8ef16f4494edda8b36104d79773a334beaa1e3521430f6 \ - --hash=sha256:d9b29c1f0ae438d5ee9acb31cadee00a58c46cc9c0b2f9038c6b0b3470877a8c \ - --hash=sha256:d9b97165e8aed9272a6bb17c01e3cc5871a594a446ebedc996e2397a1c1ea8ef \ - --hash=sha256:da68248800ad6320861f129cd9c1bf96ca849a2771a59e0344e88681905916f5 \ - --hash=sha256:da902562c3e9c550df360bfa53c035b2f241fed6d9aef119048073680ace4a18 \ - --hash=sha256:dbd5c7a25a7cb98f5ca55d258b103a2054f859a46ae11aaf23134f9cc0d356ad \ - --hash=sha256:dd4f05f54a52fb558f1ba9f528228066954fee3ebe629fc1660d874d040ae5a3 \ - --hash=sha256:de8dad4425a6ca6e4e5e297b27b5c824ecc7581910bf9aee86cb6835e6812aa7 \ - --hash=sha256:e11e82b744887154b182fd3e7e8512418446501191994dbf9c9fc1f32cc8efd5 \ - --hash=sha256:e6e73b9e02893c764e7e8d5bb5ce277f1a009cd5243f8228f75f842bf937c534 \ - --hash=sha256:f73b96c41e3b2adedc34a7356e64c8eb96e03a3782b535e043a986276ce12a49 \ - --hash=sha256:f93fd8e5c8c0a4aa1f424d6173f14a892044054871c771f8566e4008eaa359d2 \ - --hash=sha256:fc33c5141b55ed366cfaad382df24fe7dcbc686de5be719b207bb248e3053dc5 \ - --hash=sha256:fc7de24befaeae77ba923797c7c87834c73648a05a4bde34b3b7e5588973a453 \ - --hash=sha256:fe562eb1a64e67dd297ccc4f5addea2501664954f2692b69a76449ec7913ecbf +cffi==2.1.1 \ + --hash=sha256:046bfc24911b37851ee1b51aab8bffe713d89c68c6a057b09484ce9fd5f69b4e \ + --hash=sha256:06c72bb76605a4b0cd0aad6930b69d4baf7dd5d806cfc409b824191099700e66 \ + --hash=sha256:0beceaabe56af686895136a2de78db54ecd8e4046b236b8fd6d6cb61389e9bf2 \ + --hash=sha256:154852545011f779917b11c78db2358d095da62a9a172b78ad0a583ee5adc0d0 \ + --hash=sha256:194cffa889098ced9976c3fc6340305e43f6303657d298da55366907c05c22d6 \ + --hash=sha256:19ee6127ee34de7d83ce3d371ebc5ed91addbdcc39f9ab15ce4eb35a4e534971 \ + --hash=sha256:1a18a57b58cfb21fc28d72e876acf10eaed67a1ed96226f92af4df681d571c4c \ + --hash=sha256:1aa5645c30469b09530c4ebca77ebf8f17618293c58f8549cb1a543a50236e7d \ + --hash=sha256:1dea0e4d7d4f11f619fe8c1d76caf49e24405b4b5743c0e3be16a500ecd930c9 \ + --hash=sha256:208f941bb9d18e768138677f0a6d2ce01f590df56043dda1df1535ac57c88517 \ + --hash=sha256:210019b6c7cf07f081b4c54635c8cf744377001350e29cc0f81c4377b4797735 \ + --hash=sha256:246fa40ce8645a614ff682e0b70f37134e460eaf93a775e0cbe3cca585a67a80 \ + --hash=sha256:25792eac27877609e7bb06d42ff88278a6624fff2ba9bbb523c09616b117e80f \ + --hash=sha256:27350daa11d4f10c540e6e89dada4c54feb7256ad03e9a4dc075ebad7ba360d1 \ + --hash=sha256:28907ab9bfb6aa13184cfc17c6b8e1023c5ab6fd7076d8c20a35e59fe04f8f29 \ + --hash=sha256:2ae64be792b8966f2c69538199728b290e34726562896df1e5dc8ffd8d8188e8 \ + --hash=sha256:31348097ff5bbe827ccc41795d4dd099d9f0625e7def00ee653c137a490c2a6c \ + --hash=sha256:3143d81e29e1e20a9ce10901ec369012947876596f75a222235965f2b7ae832e \ + --hash=sha256:3222ba5d678f80a030e6afbcc33dc1ae5cb45facabb61cee2c7016b8432fde48 \ + --hash=sha256:3311ed60d36f83378794e1009ac6258bafbf81f7888b4caa7b35a521e3f95813 \ + --hash=sha256:334644fbac4eff73d985a17a91226df55d0f394160c4cfb880e084c8f7161cac \ + --hash=sha256:34e261f78cb6ceaaa36f42f2613f4380d94d9c759a9c73c769ee6e0247364632 \ + --hash=sha256:363e05fa78e15116c3c32c210ee36884fd6b9afa6d440e47112c3bd511d64cb6 \ + --hash=sha256:398aff33cee2767e3e781d2554c54bd0dff386bb437581e0d8011fde1a942ec1 \ + --hash=sha256:3d22a20b1fb1632cc72c22f95f7b0d2961c3e1c235f245ba4c606c4771035659 \ + --hash=sha256:42a494cee34437f05546455144f2b5d9ac09b1face62bcfce597d2e521066688 \ + --hash=sha256:42e2f76b9455f5a9a844f770bf3e200ed3da0e15f5df3db9c31fe80b04b3d004 \ + --hash=sha256:42f6930c31dc7f50732c9ae793c2786c7b6b044195967bbdde40bb9be81c4cc0 \ + --hash=sha256:456a61fa52d579ebf9df2e9552ead5129855dbaff6c1e5a9b1bc408809bdc062 \ + --hash=sha256:471cee653ae88de62096552e6d24ccb4a5adb8c8c9f10b5054d0122c15bf2779 \ + --hash=sha256:49cbc70e6542d4ccccb936558d1064a8012541e78f821f955cff24e357776c94 \ + --hash=sha256:4a7c934f7360e8cd64fe9efadcbd10c7c6364f531e432b9a4bf5ccbc9e0e8b50 \ + --hash=sha256:4be96343e422f2dfcd12ab5c9f5aebe03f82f737c6bffeca6830b3875cb44aab \ + --hash=sha256:4f42141fc14250de6dde5ee7ea4432be017252d91f19c5ad043c084cea629cac \ + --hash=sha256:507a24c282e0f42f8ed737cf048572cbf580468da5555764a8331735e9c736b6 \ + --hash=sha256:51b31d1c98274844cfd7838ce00bfc27c7423a4dc00fc0772fc3331c2cc90676 \ + --hash=sha256:58acb8ab8e295e6c5ea12f888cbb13cf21511ef2a3303a23f4325c29d17fe5c1 \ + --hash=sha256:5a59cc1c4442bc3d5c703bf720b51138d0bfc173618807c9ee2490a7541dd3d9 \ + --hash=sha256:5bb4e7ea95dcd6a014a6fef62e62467d67d8e582326443f3d68e71d6320a9fcf \ + --hash=sha256:5c58fe613dc5e5336357eff555824a314d8e43282600435c8d1cb6a7a2fedd13 \ + --hash=sha256:5e7cecbaadb83884793e05828cee59b210b24583b9c7425d0ba6a754fe22eb4e \ + --hash=sha256:616f097f2fe415bc92a247f02e11f634e1f9e9a83d327e3c915c15089c87869e \ + --hash=sha256:63bbfd5ded17c4840ac07cd8f1c21ba9d9708141f840b324f422f41b207e3973 \ + --hash=sha256:64faea20f4e2613363a1a9b9c7dd73058f3ecd00133a511e72ad7c511658f527 \ + --hash=sha256:661c298b4821edebead0c91edd2b00374d67ad7c5a1f7a91d4442633b79d6a72 \ + --hash=sha256:68e62fe11f30d5ca8289242866f0a5291402d8529ca2178ab8afc5c9694ae890 \ + --hash=sha256:6a8dddef476fab96d066d578fc88526767b836ab5ab21754e1d5bf3879c31c7c \ + --hash=sha256:6e192623c49c94421616a5778fba35cf0d5a8d000650c1967ef4448ee5cdd990 \ + --hash=sha256:7225e4514edb64eb6740324353e0da0711954fd8d7da4576755b1c6e09b697cd \ + --hash=sha256:75f80557d1389eddbd0de2681f6a390a0c5338c31ddaa821381c203fc3fd50d9 \ + --hash=sha256:770de9db11e84213beec501cfcaa013b019820ca881e03344dea5844f7876d94 \ + --hash=sha256:7750c6449dff7864bb9bb27ddfb0267756189201a3afc911d82b3caacd70dfc3 \ + --hash=sha256:7bde5e4cc5c10140859842b9d383af292b22639a4dffb725314baf45968cef80 \ + --hash=sha256:7ce713ace7c0e4520535b42b77eaa742c16dab813978064913e5a3cf82973b41 \ + --hash=sha256:7da0c5eff80f0197f3b3d1232ec5a682a9325f4ae9016a78f5f5ca35f9ced1f5 \ + --hash=sha256:7dbb61fe3a7699468030f71bbe5f8a0e326a151daa91beb11a6fc1f980c55e1c \ + --hash=sha256:811bd1e21d32de12efca32393a0ab3f5133b54fce9bd44b8bd77ab07da14bf6a \ + --hash=sha256:8ef53b2de9bcb9197d31854256575d59dbac0cba72ac627bb291ef5eceb74be4 \ + --hash=sha256:937c0052c05a31ca1daf18de3158eed4dbfcb9cc107adbea227728d647be701e \ + --hash=sha256:9d2055050ea716bd38b7f7f1579c275386646b4894c155a3e2f3cd62ed41b7c6 \ + --hash=sha256:9f8d177621de5cb38ee3e731eda45d421db093ec0739f46a5594babda7987a98 \ + --hash=sha256:a2d7755bef5a12ed488f4ef1f1b69ee9191d7396083b755a5d2295f6edb4768b \ + --hash=sha256:a48d62ab9d6f4f98c983223a547af44be6ca3691074c31cecced6facd3ba2dc1 \ + --hash=sha256:a4f00aa42f75d6e4595e8866e748cc1705adc0cddfeb2ca86d0d03993d63ba03 \ + --hash=sha256:a6e721d4b0e45d5b65e87534470e67b18dcd092c83f68fba09f152b9cbc061af \ + --hash=sha256:a730a083190634c65cca36ba5f489531576ebd79bcd5c8e172130f6453127231 \ + --hash=sha256:a931079504ecc49efed7744c476a5c343a92fabf66dec2db95edb1b2fdc770e2 \ + --hash=sha256:aa9511c62d14da7aacc9b4bf51f3f697a621e83b2d6919008243c3aad168eea3 \ + --hash=sha256:ab36d55f9ed2d067327667c2fea18dda018eb628dd6347aa01dda6cf1f5d3836 \ + --hash=sha256:ad2c86c495b899d862ea0f4b42891b8713a3bd45dd4105c7fd51c2a72f39f3a5 \ + --hash=sha256:aeae0e330c9f6acd681f647d46cefd30c29f93e3392882e792e82080c9691399 \ + --hash=sha256:b0431303acaea1089ad4b3e9ce4e6518193def1118d4073ca848635ee4ea2e96 \ + --hash=sha256:b5bdfd1c873d4e093aabc0ca84c4ca6dbc4f752afb5c86f146d9742580c9da2e \ + --hash=sha256:baed1e86cc735622097354b9d1281406caf42ff42a886d29faa8e8d1630333be \ + --hash=sha256:c1453022f490d2459a11819d83ad1d586e9ff65a12ac3e705ffebd46d3685dcf \ + --hash=sha256:c26608d2222fb1e94487e4a387d85f13eb55d5ed725cb25a0c589ac4ee60e7bc \ + --hash=sha256:c7659f22557c5a0bc4855cd635f55edec690cc008a40768527762cb9fb263455 \ + --hash=sha256:c8c69575568085ba0b1b10c0249d779a214aea6f6522e949a0fc9fb0fcb449d0 \ + --hash=sha256:c8d2c9fd1f2d16f780d15127abb050d13d1a76c03a4bd87d7e4980e45e511e12 \ + --hash=sha256:ca82be1a1d406ecfe1d25dc16cb33488e5a16bf4438c9fb590484ea29d92478b \ + --hash=sha256:cc572dace3f60ef98d7b12ff411d20f5362feb31a0439eab0085bbfd349982d7 \ + --hash=sha256:d18e5ac0f2f03f4f518d3e23db0f0cad7faa1da8620e9c09461d443bbf6e6692 \ + --hash=sha256:d28630f5854ab07ab1fd4aba756de52326c82e6be15d414b12793f1975048b54 \ + --hash=sha256:d9c275eaacd24aa73f94ffd6de08fc3f932424d8b6c376f4bed7cde376fe7bc3 \ + --hash=sha256:da0e573f9f97159390c89d9f1a9e41908b66d408cc5b58d08cf3847d844c531b \ + --hash=sha256:dd31f52ea1086513bb9df30f8fcee9b8918323ae067a3d5b78bc826a000712be \ + --hash=sha256:dddad92b554513a31f272570678ba307fb9f618f05e3d4a5eacafff9eae03e1d \ + --hash=sha256:df423d40ee8654634421812bc3b196da3f9bd7d32929da813f8394c4348a5358 \ + --hash=sha256:df913725b79db7bcf03448f36b7bf8815363417d5b58deecf9305e3e30f0f21a \ + --hash=sha256:e0bcb7e0f677f543555d2adff3bf19c05f66cdb4796e5ff602442ab2fe3c4ef7 \ + --hash=sha256:e2d65b31f36619cda3999b78b2aa9632e76b78448e7a56fc4240824200e7c4fc \ + --hash=sha256:e6e8cff14d6fb0be70a09c0bdc58096f501952d04624ebf867e0e56da2df8960 \ + --hash=sha256:f16c709686a78c727bbbf059f92b0bf41c6fc60deec706d2dc19f529175a6125 \ + --hash=sha256:f24fb43132a4c6b4cb4eb029492919b2db645be6808d738f244fd146c03c32cb \ + --hash=sha256:f53e442b08449d42821fa4a4fba000095af9f62742a500f978a9f557ec44339a \ + --hash=sha256:f5cfbc5fe74540d335175b656c725d74d90e3730c626d92575eea35029d9afaa \ + --hash=sha256:f81b3b8f3d4e343550fa4baa0e479bba9f2d29ce9c2e9b51d1ce1718d7442fcf \ + --hash=sha256:f8ec5e643a9a937f64e1999eb9f75d072263751912dc5cd06d3c85f8f44be7c3 \ + --hash=sha256:fb92203a88b3d3053034db775110081c49d28be6551923805e039924093761e4 \ + --hash=sha256:fcd22650c908d7b7da162bbfaab594a1227a15d1643a98c68b122ac642fa2264 # via cryptography -charset-normalizer==3.4.7 \ - --hash=sha256:007d05ec7321d12a40227aae9e2bc6dca73f3cb21058999a1df9e193555a9dcc \ - --hash=sha256:03853ed82eeebbce3c2abfdbc98c96dc205f32a79627688ac9a27370ea61a49c \ - --hash=sha256:07d9e39b01743c3717745f4c530a6349eadbfa043c7577eef86c502c15df2c67 \ - --hash=sha256:08e721811161356f97b4059a9ba7bafb23ea5ee2255402c42881c214e173c6b4 \ - --hash=sha256:0c96c3b819b5c3e9e165495db84d41914d6894d55181d2d108cc1a69bfc9cce0 \ - --hash=sha256:0ea948db76d31190bf08bd371623927ee1339d5f2a0b4b1b4a4439a65298703c \ - --hash=sha256:0f7eb884681e3938906ed0434f20c63046eacd0111c4ba96f27b76084cd679f5 \ - --hash=sha256:12a6fff75f6bc66711b73a2f0addfc4c8c15a20e805146a02d147a318962c444 \ - --hash=sha256:12d8baf840cc7889b37c7c770f478adea7adce3dcb3944d02ec87508e2dcf153 \ - --hash=sha256:14265bfe1f09498b9d8ec91e9ec9fa52775edf90fcbde092b25f4a33d444fea9 \ - --hash=sha256:16d971e29578a5e97d7117866d15889a4a07befe0e87e703ed63cd90cb348c01 \ - --hash=sha256:177a0ba5f0211d488e295aaf82707237e331c24788d8d76c96c5a41594723217 \ - --hash=sha256:1a87ca9d5df6fe460483d9a5bbf2b18f620cbed41b432e2bddb686228282d10b \ - --hash=sha256:1c2a768fdd44ee4a9339a9b0b130049139b8ce3c01d2ce09f67f5a68048d477c \ - --hash=sha256:1c2aed2e5e41f24ea8ef1590b8e848a79b56f3a5564a65ceec43c9d692dc7d8a \ - --hash=sha256:1dc8b0ea451d6e69735094606991f32867807881400f808a106ee1d963c46a83 \ - --hash=sha256:1efde3cae86c8c273f1eb3b287be7d8499420cf2fe7585c41d370d3e790054a5 \ - --hash=sha256:202389074300232baeb53ae2569a60901f7efadd4245cf3a3bf0617d60b439d7 \ - --hash=sha256:203104ed3e428044fd943bc4bf45fa73c0730391f9621e37fe39ecf477b128cb \ - --hash=sha256:2257141f39fe65a3fdf38aeccae4b953e5f3b3324f4ff0daf9f15b8518666a2c \ - --hash=sha256:298930cec56029e05497a76988377cbd7457ba864beeea92ad7e844fe74cd1f1 \ - --hash=sha256:2cd4a60d0e2fb04537162c62bbbb4182f53541fe0ede35cdf270a1c1e723cc42 \ - --hash=sha256:2d6eb928e13016cea4f1f21d1e10c1cebd5a421bc57ddf5b1142ae3f86824fab \ - --hash=sha256:2fe249cb4651fd12605b7288b24751d8bfd46d35f12a20b1ba33dea122e690df \ - --hash=sha256:30b8d1d8c52a48c2c5690e152c169b673487a2a58de1ec7393196753063fcd5e \ - --hash=sha256:320ade88cfb846b8cd6b4ddf5ee9e80ee0c1f52401f2456b84ae1ae6a1a5f207 \ - --hash=sha256:3534e7dcbdcf757da6b85a0bbf5b6868786d5982dd959b065e65481644817a18 \ - --hash=sha256:36836d6ff945a00b88ba1e4572d721e60b5b8c98c155d465f56ad19d68f23734 \ - --hash=sha256:38c0109396c4cfc574d502df99742a45c72c08eff0a36158b6f04000043dbf38 \ - --hash=sha256:3946fa46a0cf3e4c8cb1cc52f56bb536310d34f25f01ca9b6c16afa767dab110 \ - --hash=sha256:3bec022aec2c514d9cf199522a802bd007cd588ab17ab2525f20f9c34d067c18 \ - --hash=sha256:3c9a494bc5ec77d43cea229c4f6db1e4d8fe7e1bbffa8b6f0f0032430ff8ab44 \ - --hash=sha256:3dce51d0f5e7951f8bb4900c257dad282f49190fdbebecd4ba99bcc41fef404d \ - --hash=sha256:3dedcc22d73ec993f42055eff4fcfed9318d1eeb9a6606c55892a26964964e48 \ - --hash=sha256:4042d5c8f957e15221d423ba781e85d553722fc4113f523f2feb7b188cc34c5e \ - --hash=sha256:481551899c856c704d58119b5025793fa6730adda3571971af568f66d2424bb5 \ - --hash=sha256:4dc1e73c36828f982bfe79fadf5919923f8a6f4df2860804db9a98c48824ce8d \ - --hash=sha256:4e5163c14bffd570ef2affbfdd77bba66383890797df43dc8b4cc7d6f500bf53 \ - --hash=sha256:511ef87c8aec0783e08ac18565a16d435372bc1ac25a91e6ac7f5ef2b0bff790 \ - --hash=sha256:532bc9bf33a68613fd7d65e4b1c71a6a38d7d42604ecf239c77392e9b4e8998c \ - --hash=sha256:54523e136b8948060c0fa0bc7b1b50c32c186f2fceee897a495406bb6e311d2b \ - --hash=sha256:5649fd1c7bade02f320a462fdefd0b4bd3ce036065836d4f42e0de958038e116 \ - --hash=sha256:56be790f86bfb2c98fb742ce566dfb4816e5a83384616ab59c49e0604d49c51d \ - --hash=sha256:5b77459df20e08151cd6f8b9ef8ef1f961ef73d85c21a555c7eed5b79410ec10 \ - --hash=sha256:5ed6ab538499c8644b8a3e18debabcd7ce684f3fa91cf867521a7a0279cab2d6 \ - --hash=sha256:6178f72c5508bfc5fd446a5905e698c6212932f25bcdd4b47a757a50605a90e2 \ - --hash=sha256:6370e8686f662e6a3941ee48ed4742317cafbe5707e36406e9df792cdb535776 \ - --hash=sha256:64f02c6841d7d83f832cd97ccf8eb8a906d06eb95d5276069175c696b024b60a \ - --hash=sha256:65bcd23054beab4d166035cabbc868a09c1a49d1efe458fe8e4361215df40265 \ - --hash=sha256:66671f93accb62ed07da56613636f3641f1a12c13046ce91ffc923721f23c008 \ - --hash=sha256:6696b7688f54f5af4462118f0bfa7c1621eeb87154f77fa04b9295ce7a8f2943 \ - --hash=sha256:6785f414ae0f3c733c437e0f3929197934f526d19dfaa75e18fdb4f94c6fb374 \ - --hash=sha256:67f6279d125ca0046a7fd386d01b311c6363844deac3e5b069b514ba3e63c246 \ - --hash=sha256:6c114670c45346afedc0d947faf3c7f701051d2518b943679c8ff88befe14f8e \ - --hash=sha256:6e0d51f618228538a3e8f46bd246f87a6cd030565e015803691603f55e12afb5 \ - --hash=sha256:6ed74185b2db44f41ef35fd1617c5888e59792da9bbc9190d6c7300617182616 \ - --hash=sha256:708838739abf24b2ceb208d0e22403dd018faeef86ddac04319a62ae884c4f15 \ - --hash=sha256:715479b9a2802ecac752a3b0efa2b0b60285cf962ee38414211abdfccc233b41 \ - --hash=sha256:733784b6d6def852c814bce5f318d25da2ee65dd4839a0718641c696e09a2960 \ - --hash=sha256:750e02e074872a3fad7f233b47734166440af3cdea0add3e95163110816d6752 \ - --hash=sha256:752a45dc4a6934060b3b0dab47e04edc3326575f82be64bc4fc293914566503e \ - --hash=sha256:7579e913a5339fb8fa133f6bbcfd8e6749696206cf05acdbdca71a1b436d8e72 \ - --hash=sha256:7641bb8895e77f921102f72833904dcd9901df5d6d72a2ab8f31d04b7e51e4e7 \ - --hash=sha256:7804338df6fcc08105c7745f1502ba68d900f45fd770d5bdd5288ddccb8a42d8 \ - --hash=sha256:80d04837f55fc81da168b98de4f4b797ef007fc8a79ab71c6ec9bc4dd662b15b \ - --hash=sha256:813c0e0132266c08eb87469a642cb30aaff57c5f426255419572aaeceeaa7bf4 \ - --hash=sha256:82b271f5137d07749f7bf32f70b17ab6eaabedd297e75dce75081a24f76eb545 \ - --hash=sha256:84c018e49c3bf790f9c2771c45e9313a08c2c2a6342b162cd650258b57817706 \ - --hash=sha256:8751d2787c9131302398b11e6c8068053dcb55d5a8964e114b6e196cf16cb366 \ - --hash=sha256:8778f0c7a52e56f75d12dae53ae320fae900a8b9b4164b981b9c5ce059cd1fcb \ - --hash=sha256:87fad7d9ba98c86bcb41b2dc8dbb326619be2562af1f8ff50776a39e55721c5a \ - --hash=sha256:8d828b6667a32a728a1ad1d93957cdf37489c57b97ae6c4de2860fa749b8fc1e \ - --hash=sha256:8e385e4267ab76874ae30db04c627faaaf0b509e1ccc11a95b3fc3e83f855c00 \ - --hash=sha256:92a0a01ead5e668468e952e4238cccd7c537364eb7d851ab144ab6627dbbe12f \ - --hash=sha256:94e1885b270625a9a828c9793b4d52a64445299baa1fea5a173bf1d3dd9a1a5a \ - --hash=sha256:a180c5e59792af262bf263b21a3c49353f25945d8d9f70628e73de370d55e1e1 \ - --hash=sha256:a277ab8928b9f299723bc1a2dabb1265911b1a76341f90a510368ca44ad9ab66 \ - --hash=sha256:a5fe03b42827c13cdccd08e6c0247b6a6d4b5e3cdc53fd1749f5896adcdc2356 \ - --hash=sha256:a6c5863edfbe888d9eff9c8b8087354e27618d9da76425c119293f11712a6319 \ - --hash=sha256:a89c23ef8d2c6b27fd200a42aa4ac72786e7c60d40efdc76e6011260b6e949c4 \ - --hash=sha256:adb2597b428735679446b46c8badf467b4ca5f5056aae4d51a19f9570301b1ad \ - --hash=sha256:ae196f021b5e7c78e918242d217db021ed2a6ace2bc6ae94c0fc596221c7f58d \ - --hash=sha256:ae89db9e5f98a11a4bf50407d4363e7b09b31e55bc117b4f7d80aab97ba009e5 \ - --hash=sha256:aed52fea0513bac0ccde438c188c8a471c4e0f457c2dd20cdbf6ea7a450046c7 \ - --hash=sha256:aef65cd602a6d0e0ff6f9930fcb1c8fec60dd2cfcb6facaf4bdb0e5873042db0 \ - --hash=sha256:af21eb4409a119e365397b2adbaca4c9ccab56543a65d5dbd9f920d6ac29f686 \ - --hash=sha256:b14b2d9dac08e28bb8046a1a0434b1750eb221c8f5b87a68f4fa11a6f97b5e34 \ - --hash=sha256:bb6d88045545b26da47aa879dd4a89a71d1dce0f0e549b1abcb31dfe4a8eac49 \ - --hash=sha256:bb8cc7534f51d9a017b93e3e85b260924f909601c3df002bcdb58ddb4dc41a5c \ - --hash=sha256:bc17a677b21b3502a21f66a8cc64f5bfad4df8a0b8434d661666f8ce90ac3af1 \ - --hash=sha256:bd6c2a1c7573c64738d716488d2cdd3c00e340e4835707d8fdb8dc1a66ef164e \ - --hash=sha256:bd9b23791fe793e4968dba0c447e12f78e425c59fc0e3b97f6450f4781f3ee60 \ - --hash=sha256:c03a41a8784091e67a39648f70c5f97b5b6a37f216896d44d2cdcb82615339a0 \ - --hash=sha256:c0f081d69a6e58272819b70288d3221a6ee64b98df852631c80f293514d3b274 \ - --hash=sha256:c35abb8bfff0185efac5878da64c45dafd2b37fb0383add1be155a763c1f083d \ - --hash=sha256:c36c333c39be2dbca264d7803333c896ab8fa7d4d6f0ab7edb7dfd7aea6e98c0 \ - --hash=sha256:c45e9440fb78f8ddabcf714b68f936737a121355bf59f3907f4e17721b9d1aae \ - --hash=sha256:c593052c465475e64bbfe5dbd81680f64a67fdc752c56d7a0ae205dc8aeefe0f \ - --hash=sha256:cdd68a1fb318e290a2077696b7eb7a21a49163c455979c639bf5a5dcdc46617d \ - --hash=sha256:ce3412fbe1e31eb81ea42f4169ed94861c56e643189e1e75f0041f3fe7020abe \ - --hash=sha256:cf1493cd8607bec4d8a7b9b004e699fcf8f9103a9284cc94962cb73d20f9d4a3 \ - --hash=sha256:cf29836da5119f3c8a8a70667b0ef5fdca3bb12f80fd06487cfa575b3909b393 \ - --hash=sha256:d4a48e5b3c2a489fae013b7589308a40146ee081f6f509e047e0e096084ceca1 \ - --hash=sha256:d560742f3c0d62afaccf9f41fe485ed69bd7661a241f86a3ef0f0fb8b1a397af \ - --hash=sha256:d6038d37043bced98a66e68d3aa2b6a35505dc01328cd65217cefe82f25def44 \ - --hash=sha256:d61f00a0869d77422d9b2aba989e2d24afa6ffd552af442e0e58de4f35ea6d00 \ - --hash=sha256:d635aab80466bc95771bb78d5370e74d36d1fe31467b6b29b8b57b2a3cd7d22c \ - --hash=sha256:dca4bbc466a95ba9c0234ef56d7dd9509f63da22274589ebd4ed7f1f4d4c54e3 \ - --hash=sha256:dd915403e231e6b1809fe9b6d9fc55cf8fb5e02765ac625d9cd623342a7905d7 \ - --hash=sha256:e044c39e41b92c845bc815e5ae4230804e8e7bc29e399b0437d64222d92809dd \ - --hash=sha256:e060d01aec0a910bdccb8be71faf34e7799ce36950f8294c8bf612cba65a2c9e \ - --hash=sha256:e1421b502d83040e6d7fb2fb18dff63957f720da3d77b2fbd3187ceb63755d7b \ - --hash=sha256:e17b8d5d6a8c47c85e68ca8379def1303fd360c3e22093a807cd34a71cd082b8 \ - --hash=sha256:e5f4d355f0a2b1a31bc3edec6795b46324349c9cb25eed068049e4f472fb4259 \ - --hash=sha256:e712b419df8ba5e42b226c510472b37bd57b38e897d3eca5e8cfd410a29fa859 \ - --hash=sha256:e74327fb75de8986940def6e8dee4f127cc9752bee7355bb323cc5b2659b6d46 \ - --hash=sha256:e80c8378d8f3d83cd3164da1ad2df9e37a666cdde7b1cb2298ed0b558064be30 \ - --hash=sha256:e8ac484bf18ce6975760921bb6148041faa8fef0547200386ea0b52b5d27bf7b \ - --hash=sha256:eca9705049ad3c7345d574e3510665cb2cf844c2f2dcfe675332677f081cbd46 \ - --hash=sha256:ed065083d0898c9d5b4bbec7b026fd755ff7454e6e8b73a67f8c744b13986e24 \ - --hash=sha256:edac0f1ab77644605be2cbba52e6b7f630731fc42b34cb0f634be1a6eface56a \ - --hash=sha256:effc3f449787117233702311a1b7d8f59cba9ced946ba727bdc329ec69028e24 \ - --hash=sha256:f22dec1690b584cea26fade98b2435c132c1b5f68e39f5a0b7627cd7ae31f1dc \ - --hash=sha256:f495a1652cf3fbab2eb0639776dad966c2fb874d79d87ca07f9d5f059b8bd215 \ - --hash=sha256:f496c9c3cc02230093d8330875c4c3cdfc3b73612a5fd921c65d39cbcef08063 \ - --hash=sha256:f59099f9b66f0d7145115e6f80dd8b1d847176df89b234a5a6b3f00437aa0832 \ - --hash=sha256:f59ad4c0e8f6bba240a9bb85504faa1ab438237199d4cce5f622761507b8f6a6 \ - --hash=sha256:fbccdc05410c9ee21bbf16a35f4c1d16123dcdeb8a1d38f33654fa21d0234f79 \ - --hash=sha256:fea24543955a6a729c45a73fe90e08c743f0b3334bbf3201e6c4bc1b0c7fa464 +charset-normalizer==3.5.1 \ + --hash=sha256:00668ebb0609751758682eb0b5857e7c35b9f00e84dfdef062e103244ec94d45 \ + --hash=sha256:012a22b88a77ca2e59b98ac5889b0deb604147666032f45e6d6e217634d2550d \ + --hash=sha256:01e93745f7f219b703b60ba7afead36cfc4242782be5af484673fc500df12da5 \ + --hash=sha256:04368edf83514385ffc3e1cfd4546e595f4f1272dd23ba437a93a9cc3741d47b \ + --hash=sha256:0722590aabf9dc6a6c0343d523c05458fa2b5047dbe6302fd526bb570600753f \ + --hash=sha256:07ffd07412fc5d5e84cd8952acf9ff7e4ed7a708e69d1bada19d8ba91711353f \ + --hash=sha256:09a7bba9f739468c8e78c36a75c33768e53cb1959fc638f510454c14683f00d5 \ + --hash=sha256:0b2b1b3fa5670c127b246df1d0c059defd41f689a868a3b9d79df9b1cac42d22 \ + --hash=sha256:0c6dfb5ca6723eeed15aa8e564a014d69fcb8812f94eef11fe3631e0508199f5 \ + --hash=sha256:0d929fc574b4d6fd9e7c0f5c2ede8716a41911923aa7fa5fce38e0818aa4a1ac \ + --hash=sha256:13e3afe97712e8887cd516e960c63f0b93122971e5b5e4b2622fe7701771e838 \ + --hash=sha256:15f024313246a4ed976c60f440bb8d257815513a681d212ff74fd46f7d715a90 \ + --hash=sha256:195ce897c6153c0700078142cf8efe3e6454ca4cf4357499e4078dfd83396626 \ + --hash=sha256:19a3dd5aa73cef1c99687c4fc57db016a9c17104ae1185da88ba566a5d3bebe4 \ + --hash=sha256:1d1c7a53a6c2103925cdd6d7229f8c567379f211c869793df679f2e9f738c369 \ + --hash=sha256:1f5883d77fd409a261abb5dc8ccbe335720d798b1de4abb3b1d47ccbbc76b53b \ + --hash=sha256:21b82d8082f6f5e7f456ef0bd16323d08de1266efbfeb476e64b2a91d1471a4e \ + --hash=sha256:252d099029bcbea642f2a06c4ed5046bdf8b5a8150b64afa5e027e88b106e5ee \ + --hash=sha256:256dd4d85d9e4dc595e2bc983c980e73f62ddeb3165c58b4c3dfe78c5c8548c1 \ + --hash=sha256:26422d45fd13551cf564c58932f7d72b4f58b93b0fcf18c35ba6be12b46bb102 \ + --hash=sha256:2679de311c7946dde5d3b6f44941844133ff5c7cb86099c0061ab1e8901c20a8 \ + --hash=sha256:29880d17a8eb0b5cfdfd8944b468322928059aa35f1f5fa8ff22b149ec0b42f8 \ + --hash=sha256:2bced4061f000f7187254a02ad3433ae17eaf991747ceea2f478422590a5bba9 \ + --hash=sha256:2e9cf9253119d8e5d111f05d71626786fd3d6193817316eab1ca088cdb8593cf \ + --hash=sha256:2f06b7eae9dbe77fe1d644ca244dad508de8d302870a43f3c559b521270938a0 \ + --hash=sha256:2f293479cce755c75f1697e87c409b7ae4c555c7dfecb6e988ad13abba943031 \ + --hash=sha256:329fc3ccb63ad22d867d84c2adea759a64079a37ba4a343433b02c7a2816871e \ + --hash=sha256:343fb4f2821043bd87095f7b08a1a181febc8e36ac64212143bbfd0a0e1bc235 \ + --hash=sha256:3588e376b3ea2eea84976f67273d679f229e24c66dce7b82ae45aef04ff6e072 \ + --hash=sha256:35aea775dc2bd5f54cd84a1cd2696cc3207c479cb9cf0bd346f0d343e4300ddb \ + --hash=sha256:35fe081843b35aad20ffeccec3eeffbe637b15d14f3fb22cc1b59cd8ec17e93c \ + --hash=sha256:36047af20e17097c3bb9476c2b7655f2f7aa51322c0ba58c07695bedf755a950 \ + --hash=sha256:3617ac3cfd8b9888f145ad89dd6e692285834b0201c6074a5eeaad3fd4d668c2 \ + --hash=sha256:366ec70f5547c640d3ce1985722490f23faf4eb5216a7eeba78277490e78dacb \ + --hash=sha256:394fea06235c8543390050ed5f529187074b029fb027213f6c46ac11ab5d950e \ + --hash=sha256:3d27167433c0d5f18dc850f07d0b3816221984fecdc405d6c157a6f0b8f8e9e6 \ + --hash=sha256:3e5e1224c0a6a90e05843e07adfec669edebec17801c67072f51e59561d63c0b \ + --hash=sha256:41876ee62a3dddf48ff1121ad8f0798032aa03f2fd35f21f34a4cab14f18d8d2 \ + --hash=sha256:433c5a81eade63b47e522303bad236f59dba55ea6951746f5558355eeed8c75d \ + --hash=sha256:4582c27e8c889d64811987b5967fbd3ae0c823fe1fd933b543d55ac20bb475fa \ + --hash=sha256:485a0d363cafefcd2538a73c7c838daa2035f09b2c9f9b5e3133f80c6aeb84c2 \ + --hash=sha256:494b70049a4d69aec6e8137c13af4cf8db8c9f9820a1392ac293b0dd2987a818 \ + --hash=sha256:496846868fea80e479324862fa877f02411f2fd0f83b79ccee2607aa68b2a032 \ + --hash=sha256:4abdc5f9ad448c1ecbfae2974b820535d6bc6e7eef63babbab3d81cf46968c71 \ + --hash=sha256:4b599739b93b2cbeded49645ae3c8d1405c29ddfbceac1545c87a3f9580a9e96 \ + --hash=sha256:4bea7f8ebe90bbd7f0e4a2de42ca6924ba23e3e76418c408ff82f1d46fabd687 \ + --hash=sha256:4c4fb141a727957c93edfe5c32a26ceb6b5f6461d67146e2d39f51e16170bea8 \ + --hash=sha256:4c9548dc78002099910abaebc0a72ac58b7d30931869e0351c09b507dff4ece3 \ + --hash=sha256:4d26f14f041e83dd8edfd61f4cd4fa7285d31798b5bf1f28e70c367ba6c41d61 \ + --hash=sha256:4f298bdadb8f0b9e5672877f647d1be9373ef5320c9e2f049795e26cad28b6a9 \ + --hash=sha256:52ec005752a56ae79547a05c0139ca2501a0c866390b6115008456b9f0e7cde1 \ + --hash=sha256:55261ac0d2941c42f196dd576f543d87a8ee03cd6f5e30dfb4d807b2e3b9121a \ + --hash=sha256:56490c595a28b1bb27dfc583e816152a9767721ef58b2c03b13f954d2f707420 \ + --hash=sha256:58d3e12c88e0950bca850ae1f7c256055c097639c2edb9eb123af9807d8b15e4 \ + --hash=sha256:58d4aa13a59c969dbfdf9e6a9560e242cbfd9e8a8f50c2747714df1a423adf65 \ + --hash=sha256:59171c6e45bf07d0d5cab3b0bf81d945035530f6873398b3b531c31184d46663 \ + --hash=sha256:5b6d1386bf0096d26d3a863dc0a487a5b4eb9aa93cf5ba69683d29dde6b9d60f \ + --hash=sha256:5c0ea61a470e070686aa30892fed79e297d2c8d0ab46b8bcdf027d38c51da591 \ + --hash=sha256:5c84bec0ab5ae0c64bfe73a7d2adcb5ce73b467523fc27fd6a28ab2aa6cbe35a \ + --hash=sha256:5ca0555312ae2fe82715cada7fac375530c2f3349e1eaa1bcb33d0283ac79a18 \ + --hash=sha256:5d8531a6569d025f68e2321e7638fb7978f23db58e5f69f56913837aae03816e \ + --hash=sha256:5e2d0e146dcb57034f8b97dc58d2d512cb90aba253960ce449f695fec6a82c6f \ + --hash=sha256:5fc45d653ea8c9a20479167e11d4a0f8cb2fa3470737ab6f9c827532313187b7 \ + --hash=sha256:6117b84ea48435e5356dc737f5121485c30920ba43375fa7b434fd753df0eac3 \ + --hash=sha256:6199d5606e2bbf2b096cf64d03f8b6790c91081d5ac866b8e7bb6422738cc60c \ + --hash=sha256:62b55f6722735a6c472f88361cde6640608773d9443cebdbb51abf436a1fcdd3 \ + --hash=sha256:687c9ca3035544b113bea2055e180af96fb63c0c476e22a9180f51925186e7b7 \ + --hash=sha256:6b7430cf5728e68f6c462254009a6ef4086e1bea43cf2f57aa9c55fb4f50ff96 \ + --hash=sha256:6ba32c4d2abf1d2fe7cf27d280f4cca5664233b0f885549c7761719eb977f486 \ + --hash=sha256:6c9cdde8becb25a7fde49924511aa2644d6f8081cc8df8e9452724303348d8e3 \ + --hash=sha256:6df0ec430f9a831772c23ca5a224cba36517a58a84bb32c32bb59a9fa67c47f6 \ + --hash=sha256:6e2912d4babbc65196ac13c2f53468dc57fb8b9c25ef913e8c59ddf7c6dc0e1b \ + --hash=sha256:6e5e4d73d588ca5ed09df1b7dcd1b203d1df3c542e3f50d126c947d432b10731 \ + --hash=sha256:70055ff39b97c99e7ae40ea3e393fb62aa2e44dbd9b29f8d14f42fb0025c3959 \ + --hash=sha256:706bfd38730a5ac7a365793269a00f4e988178cec121391f4248d84ad8c972e9 \ + --hash=sha256:7235dc28fc6dd9d832ac7c7bce95367dedb85929f17368a0c2bee1e080b9acbf \ + --hash=sha256:774d157f112367ff4abd29019f38f023c24e00e56edc7829c20e358a5a913ad8 \ + --hash=sha256:77efcff2b23071c349402ac1066667a3d011f62398d81408c9b88ad991747c9e \ + --hash=sha256:789b8982559ae28dad2356519f841655756cdcd96616410590ae0b17454ee64f \ + --hash=sha256:7ac76cf9afd34929d76eb7fcb63be476a4853d8a96f0dcf2d0db68a0cbdf9885 \ + --hash=sha256:7c0c10730342b0c9b35dd1d619beb8214e520bd96a1f870f452680b238aab3e0 \ + --hash=sha256:823f82903d189af463d7df250ef1f7f696f3cee08cc8d91deb565e8d425f6506 \ + --hash=sha256:838648accb3a7fd9803fd45c87bce8509648eb0c11bc34e216141300977244f2 \ + --hash=sha256:854066be00447fa8de2ccbbe893e2ffc4b123ef16d897af794c1e18bd4a714b0 \ + --hash=sha256:85d5855daafc240cc045c026d7a15fd198a09b0fc8ff6f5ecbb5297b509cb11e \ + --hash=sha256:85de3134b5379856e323ba37c19c9256d39425f7b76a63af52b09fb4664c2e8f \ + --hash=sha256:87e4f41d375c0b9be2fb5251aee4b8a689169e134535aed81bf085c3b647451e \ + --hash=sha256:88ca277405c2d3b71c4e1c2ee0e7966e807bcba86a69d11e19ba199d18ae4491 \ + --hash=sha256:88e85ab89cb822c1e635f51d6d32e488f94e002e70e2f492bdb8b945543f345a \ + --hash=sha256:8ac8c94b6539074e0f40899301273ac8402b9b3e01c7b7ba269ff30340aaaf20 \ + --hash=sha256:8fe532b3c966d1fb794e0698e4589d0444017ae77fc0b31edea13c0e35bcc449 \ + --hash=sha256:9085f87b0e38a2b92b8923059b4e8789fe40d9279712d15dcc670048d77079af \ + --hash=sha256:90b7481fb62fbe172c558bc6fd1c4c98d82004a54a7551f20e11ac9bf0b8708c \ + --hash=sha256:92caef967d287a407085d61176fce4012b1dd62daed4eb6d5ceb26d3d2538712 \ + --hash=sha256:9362dd90aa7dab48c0054a21187791ccf05473f7dba5d92b8033ae62164675e7 \ + --hash=sha256:94d78ecec2605a8d0398b0f365d5f12a63248438516f5dac536a5eff7337df4a \ + --hash=sha256:94fbf1c0c6cc0d3d5e50f9a9313a8cdca90dd696d34b381cd1704f8c9e939f20 \ + --hash=sha256:950f23cb393f85543777b0433f082cddd25b51ab398eac7971146495679efe5f \ + --hash=sha256:96eefc178f8636b9c760c5829345307fd81cfae9ab1e80997dbddeb0f54ee9a3 \ + --hash=sha256:96fef3e886d6a9874b14f27fc193fbdc69d5d8035783d86aa4e1cea594e695f9 \ + --hash=sha256:977cdbd483a9cff38179bea4fd754289a6f2195c7abd414aba85410b3e66cc5e \ + --hash=sha256:978eab16f55b4ab2c2a745be9a0a840bf8f09a7f227d9c76eb30214d078865a5 \ + --hash=sha256:994e883d17c559cdfd38c84003c8b27d25424a1077272a17e7cd27bfe0bf57b2 \ + --hash=sha256:9ac4444d8d4fd4c4bd08bf451ed3167aa9e7ec6cdb41b648794f1d1103652e36 \ + --hash=sha256:9b5db6052055d34d41230fb78d7c439c23dc536a9896f6cb039e8dd92cfc1263 \ + --hash=sha256:9d9a0dc7cbe9bec24c3f767c9122c41fe5a1bc43f47cd099d00d393e09769de4 \ + --hash=sha256:9dbdd9205662134957cf0c324f639bdc5031c0ca056e2369e238db75187c0f11 \ + --hash=sha256:9eea3ab2597a5e65fe65296e2d6a84570845a6b55532d90333d740d48bbc850a \ + --hash=sha256:a2028475ba855475b8b4d3cfeb4994269c967aea8b9892dfba907f4263a863a3 \ + --hash=sha256:a3a370082ce34d0612f421e15fe011c53bb1feff21a26d06ad4fb244dab5a375 \ + --hash=sha256:a545775cfe815855ea32d7c27731d79da358ef2055b4a25830231b1622dd18aa \ + --hash=sha256:a5cbd90ecf0fc62e64726917ad083b73001f0563657a87ec3c0b504e277dc90d \ + --hash=sha256:a6d095662e73e74f0a49988e0593373e243e3a52e27bfeea0a859e88acf4a0f5 \ + --hash=sha256:a6dac12ff6b846103483683f60c5f8fee205121adc58ffd87e90a90a3af69e99 \ + --hash=sha256:a951ad59cad9145664a730d3036b40b844e74d2d3683da40111463cd3a83845d \ + --hash=sha256:aa1099b956fb795e686d073568f6dc002a0bb89765ea6d5b055dd7d9bf1b116c \ + --hash=sha256:aa2bb0b37202dca27175591f761108b5d34096ade1191ffe4808bdf6b1571488 \ + --hash=sha256:aae2ee51122d3ae968a3837d97dc24a0aeebb0dea23694422cd172bd30017cd6 \ + --hash=sha256:ab743e9bc90c1f73552ec33e10e3331315acd2c397b36065b591b0181de533cc \ + --hash=sha256:ac00177c4831ffa650f8609e4bdddd5fe09c03b1c0c47acece7e6ea20421598b \ + --hash=sha256:ac13b004224fb341e1e25a1ed5e19d32f57cdb2a403e01f003b46f051a550f6f \ + --hash=sha256:acaf604462bf330b0d07e7a07c1d6e4adac79e5fb13e9c5140590542cafacc00 \ + --hash=sha256:ae31a1a1db2ee6cc2942fccaf695c934bc7f3db9f2133a3fef1f367cf1a4ab10 \ + --hash=sha256:ae4a097991662cd4fff0ddc74e0fe7874f82e00042fa0ea00855645ed0c79598 \ + --hash=sha256:aea996a6aba25260827c9ea511d1addfde2da9eb686ac961838509086188b7e6 \ + --hash=sha256:b39b69b347e5e47a3b5b8cfc005c68c1ba347474e3960236c4944a8ecd174962 \ + --hash=sha256:b54e7e13267d49ffbfe68e25b3cbd774dab38fa37238f71265e91b36146eb21c \ + --hash=sha256:b9af956078716df40d985fb0dfeb2c2120c5ca92ba4ff4b388acfd01cdc14d08 \ + --hash=sha256:ba2f37ee79e6338845261a3c5b1784e5d1acdff2c0785b284f1b633033d136ab \ + --hash=sha256:ba501e667c17d8411f98e67a022d9604ef179aff0e459b7e292c796837c13573 \ + --hash=sha256:baf3775a2635e5a11fbd5e4e64ee69c7e86875d224a5c72aca4c141064589a90 \ + --hash=sha256:bb57753e36e4855b8ca375069482250a6246372331a3e4f3407eaebb007443f5 \ + --hash=sha256:bd6c173f04743d483881bffa1478d5a4624475b8cd1d2194956a75548e191c18 \ + --hash=sha256:be47f99644b208bff7766314013f9acf57b056b04191d570d68ad14022cf5b1d \ + --hash=sha256:c010f5581d9c612804cc59fcf7b524b707fbcb72828551237ab545bb5c7034af \ + --hash=sha256:c1dcc36dcb96abc02236e182d17e0f71430152a6c2c7447421da2d2dc144edea \ + --hash=sha256:c428c6c31eb5f4277d7f8eccaf767fbd548ddd5ce3c8b4f4cbbfab3d96b5904c \ + --hash=sha256:c658c50ac0c98cd755a2dd50b7977d3bca7df401dcc47fbdfa87db53ef7d4e8b \ + --hash=sha256:c71fb0d56c920c269cd3e2e3fe7c610e3f1fdb21a6ce60efa6430ff63676cea6 \ + --hash=sha256:c7b742bf31c88566b4bb6335a7f393bb322e580b6bb98df7bd0c25e6e3519ce8 \ + --hash=sha256:cc0329df4caaceb950d2f580b5ac716a377f7059624a0bafaeaf8a218c6ed774 \ + --hash=sha256:cc5d36d96478aa9c60654bd932525bf32964c62a7281eafdf16d85003a8d6004 \ + --hash=sha256:ce854f5f478050ade5a238731c4ca985a7d3b3cb53ff600a9b5c3b689b5f0a7a \ + --hash=sha256:ced3fdd71aaa83ce593746c2edb42b7a59cb4c19c8b5c407781c72e493aae55a \ + --hash=sha256:cee5dd7c6fb5dd52a0fe2a740f9bc6e3593f5f8b1788bde49de02086f30182b2 \ + --hash=sha256:cfa1c0cc3a8f9f53f1243a5a99ac36fd003880199383b37672e86ddda9cb07e2 \ + --hash=sha256:d1ee1e296209fdce05b81b663250eefa02213a2da7b41bf26f7829b8ba3545aa \ + --hash=sha256:d59b75732e9b6f27388e10c14b0259cc5f2e48c78627d185e6a177b58ad3cffe \ + --hash=sha256:d63600d620ad0064c3a748b950ac5ea38a80190e5498532efefa4b7b3f1da1f3 \ + --hash=sha256:dd732602a7009217f658d5863d12d79d373a4de0eebc111094bcdd3bb8e0a6cc \ + --hash=sha256:e06efa066f7dbadbc84ebc126a97c452a6451dfcf589d89d788484949e1cf795 \ + --hash=sha256:e199fb99720074809a7720f1c0b4d919eea8b87e88713e0f8f602f7bef543d9d \ + --hash=sha256:e4b018dc5a0eee4676e38fe84a47a427816c590b93b55d9025274ec4d6ffc2dc \ + --hash=sha256:e6621fb2a4988d6e53eedc455e5903e2679f3967b8acb3d639f1b63c14a2e893 \ + --hash=sha256:e71c909f353863b2b89c83de2ebed71ea6d0df8a6ef65a128193c5e650766bef \ + --hash=sha256:e90251c0c7bdd54a100a0dce3c07b7e637278c93af29dbf78ebb89a58c4bac7d \ + --hash=sha256:e9fbdce1e47394b09bc9f26ab117dfc8d6491977a11d86f592bb42c779db2fda \ + --hash=sha256:eb12fb2ba69ffa05f8695f61c69e591dc4b4a12ac3757ac8af8adb259bf56d17 \ + --hash=sha256:eda059b6bc8bc0812d626fd91a7ce01bf583df0a61296eff390fd94141a34e30 \ + --hash=sha256:f03ac127268b43ef4fe9e6ab6794a6794b49485a0cc0c1db79876d2f33f75bc7 \ + --hash=sha256:f298e218441525d3794428b4c8b8fb8662c6d3ea79925d4807ee6b9a96a3bca5 \ + --hash=sha256:f5542f9b941279d82d41eb0aa9f98eba36fe4df5c7086c651df7944935b37182 \ + --hash=sha256:f6f7deae3feb4edfa2efaf7c574fe88cbf055038a6abdb40188e4fff66d5699f \ + --hash=sha256:f9b1e28d0e8dbfa858abdba91d6b547beaf2df1a59bec6da6faae7b96a4991a9 \ + --hash=sha256:f9f8405c2c758532c74fed975dbee57be1f31a6e865c031870c79a6ed3212ada \ + --hash=sha256:fa48b1b63d639f9483e0633e092f5851e2348c352f1f9bb6c8182f87884ef876 \ + --hash=sha256:fb78f6e7fcd8ad785d28cd577168bc1aaee827b25bb8755638f694794ea98f0a \ + --hash=sha256:fbc597639158fd7c14d55e808718848319540f51b0e6746e3eefa59723a4a348 \ + --hash=sha256:fce8cbd4997efeb450bd298b54f755dcdff18d496f7a5ddbb4867c6d7c88fdc3 \ + --hash=sha256:fd0350afdc3aabd5576f60ea109228bd5538139713c7b094c5cd27c73a98bc6f \ + --hash=sha256:fd0a274c0e5f9a21565cd9d3dd749b61f96b7aa1e20a93aa1ba4029518f2e5c0 \ + --hash=sha256:fdb8a068947befafba9952162645dc2fecaeb400e64584829ed5e9b2fbe21a7f # via requests -cramjam==2.11.0 \ - --hash=sha256:028400d699442d40dbda02f74158c73d05cb76587a12490d0bfedd958fd49188 \ - --hash=sha256:033be66fdceb3d63b2c99b257a98380c4ec22c9e4dca54a2bfec3718cd24e184 \ - --hash=sha256:03a7316c6bf763dfa34279335b27702321da44c455a64de58112968c0818ec4a \ - --hash=sha256:045201ee17147e36cf43d8ae2fa4b4836944ac672df5874579b81cf6d40f1a1f \ - --hash=sha256:04cfa39118570e70e920a9b75c733299784b6d269733dbc791d9aaed6edd2615 \ - --hash=sha256:092a3ec26e0a679305018380e4f652eae1b6dfe3fc3b154ee76aa6b92221a17c \ - --hash=sha256:0a70ff17f8e1d13f322df616505550f0f4c39eda62290acb56f069d4857037c8 \ - --hash=sha256:0cf1b5a81b21ea175c976c3ab09e00494258f4b49b7995efc86060cced3f0b2e \ - --hash=sha256:0ee47c220f0f5179ddc923ab91fc9e282c27b29fabc60c433dfe06f08084f798 \ - --hash=sha256:11eb40722b3fcf3e6890fba46c711bf60f8dc26360a24876c85e52d76c33b25b \ - --hash=sha256:13240b3dea41b1174456cb9426843b085dc1a2bdcecd9ee2d8f65ac5703374b0 \ - --hash=sha256:1789a057b6d09acf112c1c84701fc03ba5cc0fcf2ada786ce02a7e73dd466ca5 \ - --hash=sha256:17eb39b1696179fb471eea2de958fa21f40a2cd8bf6b40d428312d5541e19dc4 \ - --hash=sha256:193c6488bd2f514cbc0bef5c18fad61a5f9c8d059dd56edf773b3b37f0e85496 \ - --hash=sha256:19eb43e21db9dc42613599703c1a8e40b0170514a313f11f4c8be380425a1019 \ - --hash=sha256:1c6cea67f6000b81f6bd27d14c8a6f62d00336ca7252fd03ee16f6b70eb5c0d2 \ - --hash=sha256:1d77b9b0aca02a3f6eeeff27fcd315ca5972616c0919ee38e522cce257bcd349 \ - --hash=sha256:1e2400c09ba620e2ca91a903dbe907d75f6a1994d8337e9f3026778daa92b08d \ - --hash=sha256:1f6449f6de52dde3e2f1038284910c8765a397a25e2d05083870f3f5e7fc682c \ - --hash=sha256:1f71989668458fc327ac15396db28d92df22f8024bb12963929798b2729d2df5 \ - --hash=sha256:20c8684d2a693e3052532b9730d4399ba2ee212cacf3b961349aad35d13b0c8c \ - --hash=sha256:244c2ed8bd7ccbb294a2abe7ca6498db7e89d7eb5e744691dc511a7dc82e65ca \ - --hash=sha256:24758375cc5414d3035ca967ebb800e8f24604ececcba3c67d6f0218201ebf2d \ - --hash=sha256:2581e82dca742b55d8b1d7f33892394c06b057a74f2853ffcb0802dcddcbf694 \ - --hash=sha256:261e9200942189d8201a005ffa1e29339479364b5b0013ab0758b03229d9ac67 \ - --hash=sha256:26cb45c47d71982d76282e303931c6dd4baee1753e5d48f9a89b3a63e690b3a3 \ - --hash=sha256:28952fbbf8b32c0cb7fa4be9bcccfca734bf0d0989f4b509dc7f2f70ba79ae06 \ - --hash=sha256:2c289729cc1c04e88bafa48b51082fb462b0a57dbc96494eab2be9b14dca62af \ - --hash=sha256:2fa2fe41f48c4d58d923803383b0737f048918b5a0d10390de9628bb6272b107 \ - --hash=sha256:309e95bf898829476bccf4fd2c358ec00e7ff73a12f95a3cdeeba4bb1d3683d5 \ - --hash=sha256:320d61938950d95da2371b46c406ec433e7955fae9f396c8e1bf148ffc187d11 \ - --hash=sha256:360c00338ecf48921492455007f904be607fc7818de3d681acbcc542aae2fb36 \ - --hash=sha256:362fcf4d6f5e1242a4540812455f5a594949190f6fbc04f2ffbfd7ae0266d788 \ - --hash=sha256:36aa5a798aa34e11813a80425a30d8e052d8de4a28f27bfc0368cfc454d1b403 \ - --hash=sha256:3705888b7acacddd46886926fa390dd3df0e1d9e6fe273fd4edb4cbf8eb64735 \ - --hash=sha256:37bed927abc4a7ae2d2669baa3675e21904d8a038ed8e4313326ea7b3be62b2b \ - --hash=sha256:382dec4f996be48ed9c6958d4e30c2b89435d7c2c4dbf32480b3b8886293dd65 \ - --hash=sha256:387f09d647a0d38dcb4539f8a14281f8eb6bb1d3e023471eb18a5974b2121c86 \ - --hash=sha256:3c1aa56aef2c8af55a21ed39040a94a12b53fb23beea290f94d19a76027e2ffb \ - --hash=sha256:3d1ba626dd5f81f7f09bbf59f70b534e2b75e0d6582b056b7bd31b397f1c13e9 \ - --hash=sha256:405f8790bad36ce0b4bbdb964ad51507bfc7942c78447f25cb828b870a1d86a0 \ - --hash=sha256:40a75b95e05e38a2a055b2446f09994ce1139151721659315151d4ad6289bbff \ - --hash=sha256:41eafc8c1653a35a5c7e75ad48138f9f60085cc05cd99d592e5298552d944e9f \ - --hash=sha256:449fca52774dc0199545fbf11f5128933e5a6833946707885cf7be8018017839 \ - --hash=sha256:4526c4313306a264049e03e6c17b4e728a0647166dddbc1af7baf8e78a65721c \ - --hash=sha256:4820516366d455b549a44d0e2210ee7c4575882dda677564ce79092588321d54 \ - --hash=sha256:4b86f8e6d9c1b3f9a75b2af870c93ceee0f1b827cd2507387540e053b35d7459 \ - --hash=sha256:4b9a46eca804a51e8eb7b243c8e4513afc3b63aa60b69bc48e0efe6c648c4de0 \ - --hash=sha256:4efe919d443c2fd112fe25fe636a52f9628250c9a50d9bddb0488d8a6c09acc6 \ - --hash=sha256:4f8d82081ed7d8fe52c982bd1f06e4c7631a73fe1fb6d4b3b3f2404f87dc40fe \ - --hash=sha256:50e4a58635fa8c6897d84847d6e065eb69f92811670fc5e9f2d9e3b6279a02b6 \ - --hash=sha256:50e7d65533857736cd56f6509cf2c4866f28ad84dd15b5bdbf2f8a81e77fa28a \ - --hash=sha256:514e2c008a8b4fa823122ca3ecab896eac41d9aa0f5fc881bd6264486c204e32 \ - --hash=sha256:5251585608778b9ac8effed544933df7ad85b4ba21ee9738b551f17798b215ac \ - --hash=sha256:529d6d667c65fd105d10bd83d1cd3f9869f8fd6c66efac9415c1812281196a92 \ - --hash=sha256:52d5db3369f95b27b9f3c14d067acb0b183333613363ed34268c9e04560f997f \ - --hash=sha256:53fed080476d5f6ad7505883ec5d1ec28ba36c2273db3b3e92d7224fe5e463db \ - --hash=sha256:54c4637122e7cfd7aac5c1d3d4c02364f446d6923ea34cf9d0e8816d6e7a4936 \ - --hash=sha256:555eb9c90c450e0f76e27d9ff064e64a8b8c6478ab1a5594c91b7bc5c82fd9f0 \ - --hash=sha256:57286b289cd557ac76c24479d8ecfb6c3d5b854cce54ccc7671f9a2f5e2a2708 \ - --hash=sha256:5c82500ed91605c2d9781380b378397012e25127e89d64f460fea6aeac4389b4 \ - --hash=sha256:5eb0603d8f8019451fc00e1daf4022dfc9df59c16d2e68f925c77ac94555493b \ - --hash=sha256:5eb4ed3cea945b164b0513fd491884993acac2153a27b93a84019c522e8eda82 \ - --hash=sha256:5edf4c9e32493035b514cf2ba0c969d81ccb31de63bd05490cc8bfe3b431674e \ - --hash=sha256:619cd195d74c9e1d2a3ad78d63451d35379c84bd851aec552811e30842e1c67a \ - --hash=sha256:62ab4971199b2270005359cdc379bc5736071dc7c9a228581c5122d9ffaac50c \ - --hash=sha256:66425bc25b5481359b12a6719b6e7c90ffe76d85d0691f1da7df304bfb8ce45c \ - --hash=sha256:665b0d8fbbb1a7f300265b43926457ec78385200133e41fef19d85790fc1e800 \ - --hash=sha256:66a18f68506290349a256375d7aa2f645b9f7993c10fc4cc211db214e4e61d2b \ - --hash=sha256:6b1b751a5411032b08fb3ac556160229ca01c6bbe4757bb3a9a40b951ebaac23 \ - --hash=sha256:6c2eea545fef1065c7dd4eda991666fd9c783fbc1d226592ccca8d8891c02f23 \ - --hash=sha256:6eb3ae5ab72edb2ed68bdc0f5710f0a6cad7fd778a610ec2c31ee15e32d3921e \ - --hash=sha256:724aa7490be50235d97f07e2ca10067927c5d7f336b786ddbc868470e822aa25 \ - --hash=sha256:72524cd27e67cf95d9c6bb5eacf47cf78473554f74685f57ccabb368988d91bc \ - --hash=sha256:753710ae1f33b1a34178d104b7e1ac0a94a3f386d14dc24305663f63dc67cabc \ - --hash=sha256:75b07d36ee034f05e3566878d83f3043d8297dad67937ada15c504ac3e50f9fd \ - --hash=sha256:7855bc4df5ed5f7fb1c98ea3fd98292e9acd3c097b1b21d596a69e1e60455400 \ - --hash=sha256:78ed2e4099812a438b545dfbca1928ec825e743cd253bc820372d6ef8c3adff4 \ - --hash=sha256:7a6ed7926a5cca28edebad7d0fedd2ad492710ae3524d25fc59a2b20546d9ce1 \ - --hash=sha256:7ba5e38c9fbd06f086f4a5a64a1a5b7b417cd3f8fc07a20e5c03651f72f36100 \ - --hash=sha256:7d5c8bfb438d94e7b892d1426da5fc4b4a5370cc360df9b8d9d77c33b896c37e \ - --hash=sha256:7d9aecd5c3845d415bd6c9957c93de8d93097e269137c2ecb0e5a5256374bdc8 \ - --hash=sha256:84265f2221e83fb1e41a8e33788c06e3ba22629e88644d0841a470cc28baa3f7 \ - --hash=sha256:86dca35d2f15ef22922411496c220f3c9e315d5512f316fe417461971cc1648d \ - --hash=sha256:9115f7a4ba2f110e9dcda72a43adaeba202f42cf181877bcf3eecca359576bfe \ - --hash=sha256:966ac9358b23d21ecd895c418c048e806fd254e46d09b1ff0cdad2eba195ea3e \ - --hash=sha256:98aa4a351b047b0f7f9e971585982065028adc2c162c5c23c5d5734c5ccc1077 \ - --hash=sha256:9ca14cf1cabdb0b77d606db1bb9e9ca593b1dbd421fcaf251ec9a5431ec449f3 \ - --hash=sha256:9f995c6b638255c9301166ed7033cb8fe0f34043a46b8e6a055a56b8a38c2114 \ - --hash=sha256:a24c61f1fad56ca68aee53bf67b6a84cd762a2c71ee4b71064378547c2411ae6 \ - --hash=sha256:a4963dac24213690183110d6b41125fdc4af871a5a213589d6c6606d49e1b949 \ - --hash=sha256:a6d9a23a35b3a105c42a8de60fc2e80281ae6e758f05a3baea0b68eb1ddcb679 \ - --hash=sha256:a88bc9b191422cd5b22a1521b28607008590628b6b2a8a7db5c54ec04dc82fa1 \ - --hash=sha256:a8949f97ab445d8aa2ccbeab244b46257114d38b6860210b2109b7e5b3ff2c5e \ - --hash=sha256:a9994a42cd12f07ece04eff94dbf6e127b3986f7af9b26db1eb4545c477a6604 \ - --hash=sha256:ab86d22f69a21961f35d1a1b02278b5bb9a95c5f5b4722c6904bca343c8d219f \ - --hash=sha256:ad52784120e7e4d8a0b5b0517d185b8bf7f74f5e17272857ddc8951a628d9be1 \ - --hash=sha256:aeb26e2898994b6e8319f19a4d37c481512acdcc6d30e1b5ecc9d8ec57e835cb \ - --hash=sha256:b1f893014f00fe5e89a660a032e813bf9f6d91de74cd1490cdb13b2b59d0c9a3 \ - --hash=sha256:b820004db8b22715cee2ef154d4b47b3d76c4677ff217c587dd46f694a3052f9 \ - --hash=sha256:b8adeee57b41fe08e4520698a4b0bd3cc76dbd81f99424b806d70a5256a391d3 \ - --hash=sha256:b96a74fa03a636c8a7d76f700d50e9a8bc17a516d6a72d28711225d641e30968 \ - --hash=sha256:bd748d3407ec63e049b3aea1595e218814fccab329b7fb10bb51120a30e9fb7e \ - --hash=sha256:bf81b2e517baadf41eb85c4762ae596dd1dd2c852988ce86a2df6aa7e31d9228 \ - --hash=sha256:c26a1eb487947010f5de24943bd7c422dad955b2b0f8650762539778c380ca89 \ - --hash=sha256:c3811a56fa32e00b377ef79121c0193311fd7501f0fb378f254c7f083cc1fbe0 \ - --hash=sha256:c54eed83726269594b9086d827decc7d2015696e31b99bf9b69b12d9063584fe \ - --hash=sha256:c5d927e87461f8a0d448e4ab5eb2bca9f31ca5d8ea86d70c6f470bb5bc666d7e \ - --hash=sha256:c71e140d5eb3145d61d59d0be0bf72f07cc4cf4b32cb136b09f712a3b1040f5f \ - --hash=sha256:c77570660abcf3b8931b258d57b600b3484795977797009bed112f0d7b6933bf \ - --hash=sha256:c9af16f0b07d851b968c54e52d19430d820bb47c26d10a09cfb5c7127de26773 \ - --hash=sha256:ca905387c7a371531b9622d93471be4d745ef715f2890c3702479cd4fc85aa51 \ - --hash=sha256:cb148b35ab20c75b19a06c27f05732e2a321adbd86fadc93f9466dbd7b1154a7 \ - --hash=sha256:cb1fb8c9337ab0da25a01c05d69a0463209c347f16512ac43be5986f3d1ebaf4 \ - --hash=sha256:ccec3524ea41b9abd5600e3e27001fd774199dbb4f7b9cb248fcee37d4bda84c \ - --hash=sha256:ccf30e3fe6d770a803dcdf3bb863fa44ba5dc2664d4610ba2746a3c73599f2e4 \ - --hash=sha256:cec977d673ad596bae6bdfc0091ee386cef05b515b23f2ce52f9fadd0156186a \ - --hash=sha256:d0859c65775e8ebf2cbc084bfd51bd0ffda10266da6f9306451123b89f8e5a63 \ - --hash=sha256:d388bd5723732c3afe1dd1d181e4213cc4e1be210b080572e7d5749f6e955656 \ - --hash=sha256:d87d37b3d476f4f7623c56a232045d25bd9b988314702ea01bd9b4a94948a778 \ - --hash=sha256:d9e5db525dc0a950a825202f84ee68d89a072479e07da98795a3469df942d301 \ - --hash=sha256:dba5c14b8b4f73ea1e65720f5a3fe4280c1d27761238378be8274135c60bbc6e \ - --hash=sha256:dca88bc8b68ce6d35dafd8c4d5d59a238a56c43fa02b74c2ce5f9dfb0d1ccb46 \ - --hash=sha256:dcc3b15b97f3054964b47e2a5fcfb4f5ff569e9af0a7af19f1d4c5f4231bbf3b \ - --hash=sha256:df7da3f4b19e3078f9635f132d31b0a8196accb2576e3213ddd7a77f93317c20 \ - --hash=sha256:e5d042c376d2025300da37d65192d06a457918b63b31140f697f85fd8e310b29 \ - --hash=sha256:e5db59c1cdfaa2ab85cc988e602d6919495f735ca8a5fd7603608eb1e23c26d5 \ - --hash=sha256:ee36348a204f0a68b03400f4736224e9f61d1c6a1582d7f875c1ca56f0254268 \ - --hash=sha256:ee77ac543f1e2b22af1e8be3ae589f729491b6090582340aacd77d1d757d9569 \ - --hash=sha256:f1f5c450121430fd89cb5767e0a9728ecc65997768fd4027d069cb0368af62f9 \ - --hash=sha256:f31fcc0d30dc3f3e94ea6b4d8e1a855071757c6abf6a7b1e284050ab7d4c299c \ - --hash=sha256:f6a32313a5fdbc4fc4fd681a1895d55ee4bf81275e88638b1643b54ecf850cbe \ - --hash=sha256:f8195006fdd0fc0a85b19df3d64a3ef8a240e483ae1dfc7ac6a4316019eb5df2 +cramjam==2.12.1 \ + --hash=sha256:008930cffbdfd2a18c4697bb61c896d7377f8c487c717ab98d9e6f6d4dec74c9 \ + --hash=sha256:00a25d19ce07fd1b61c6bd0baa37075d28a04189c7f3788ae57d0e04a4a53106 \ + --hash=sha256:0166c41fa7d2f983cb4a5ecc324c48642bb6b60aa6a8651ad08a17e3f9189049 \ + --hash=sha256:02f3a775664c0330092012e23abeaf207778da90313e17986659ab437444bac8 \ + --hash=sha256:03fdeda1720ad18f36dd18774e17080e07edc6bbefbccfaeae0b8f59ccb1dca9 \ + --hash=sha256:05085e6d5a834c5c206fdead7caa1ef6f38fd24a44b8fa2e00c8f29726b3132f \ + --hash=sha256:054ee4a23680acca4419e3303e79b41278d9dbe187f833c98ffc66cc24f10a05 \ + --hash=sha256:09ba4e60d8d7b18858966552bd5f8ea16425be634ffd31ed3b087cc17be32aff \ + --hash=sha256:0f31c95f4e2ca5c7a1af055046cffa5bfac8b437fdb251ef9aa859bfd500a9d0 \ + --hash=sha256:11437b53e8dd41024841c2c00cb1f9bccb0293f75cbd45ccea8a4c82d5d03784 \ + --hash=sha256:140e6427ba2fc57bb03b9b60b8e306217490328868320a49b94c7edda5e647f3 \ + --hash=sha256:1a04c8fd5530cece11f7f6562a7b6646201a6cd2d334daf99b1be1ab2a32f0a7 \ + --hash=sha256:1ff538a7792f79d1332f592e044f779dbbc1398a09769821791e4f287c3c3075 \ + --hash=sha256:2070ab4e49a0e55593cf4e92f94a9c276913e0d987af4ceb153a090861566333 \ + --hash=sha256:20d8e2a9a11bc9a9028fffb72c8fe001c4ff2665b028e390ecc0572859d77d93 \ + --hash=sha256:25f4870ce08440d7918e7105f48ea93cb0ffebbe458212ab6aef82c91451832c \ + --hash=sha256:28d28ea81661d0c75d0b8be1b31242ef2b7a042bcd51454981353fcf882e019c \ + --hash=sha256:28efcc63ade34a177d8a60cab6f1b3a69424bfbc9583f96f65a9aa1f464e5cbb \ + --hash=sha256:2b5f9cb05ac9b4a4a42331c3422265f4b1291a110c8cd4740085f0e5551e8227 \ + --hash=sha256:2e681c732d0370982f88695895f37be5a3f3a89475083a0f431bc1ce859b7396 \ + --hash=sha256:2f7e8960f8abc9c908a72690f17c16c214a63bba0f5e81b9f0d937b7ec191f18 \ + --hash=sha256:343fba082fa90b97f46d37430cbdef8954388e8df9754221193f70707cab7b98 \ + --hash=sha256:348e2bba38fa475852de524793bb5fb899cfee22c7999291eb8faf79f79c9b37 \ + --hash=sha256:35eb2c91a1859fe33dbf9debeb6b4d4fa208bfb2cb42647f8319d1e783f0eee5 \ + --hash=sha256:36a385c11e456fdd8dfc5d981293b377cfba2a222f296f9174160515afc67e46 \ + --hash=sha256:377ca108d47cca68c99517a4e3f194c2f3d791f99950c44646b1a96a1a4b83e8 \ + --hash=sha256:3d1888fdbd7ca1d6d96395e50bccdeb0116084c0cd228960e261a7fc8dc808f0 \ + --hash=sha256:3dc304c9dc93b762bb7be076506c2c155443272c0b7e9070d06be85bfc16dadd \ + --hash=sha256:3e6c1dbc80df326377f02695d10ebb53177dbf7922769c8f437c0fec89fbc93c \ + --hash=sha256:3f044601adee91bdf49c317525dbfb611022e40ded18ac5bacba8e807fbb472b \ + --hash=sha256:40abc3370b39dbde97c6d990eb2bc7bdd65b85f71528f6f4be827f845c151296 \ + --hash=sha256:440731ef40c3644f1b9054adc31cf09d48f02fb31ec2eb158ef6409719915fe6 \ + --hash=sha256:46565666daf5804591d43a92ac0888493e671d2555da2825120475253be73124 \ + --hash=sha256:4ad150da01eda998bae9e42020e2906bc9af97d08d905d29252f930c0472d059 \ + --hash=sha256:4b5ead26851dda08b395e670a9c040d02eddbf2cc8953e23f9d60f4ac46df336 \ + --hash=sha256:4bb60168d79f047f3bf228c5e702cd2d8e0d31c096a93b1f6054b5b964b8a2c4 \ + --hash=sha256:4f0cc6a64a708c5ee21e1fdbafd9dfcd76c7a0d574f0e21020ad3808ccfc6ce6 \ + --hash=sha256:4fbfca45193e28d9699221cd20485b8b18de15a4f96daf7ffced32e2cca2d9aa \ + --hash=sha256:5415696bcd0dfa516468fb713e7b1d05f7ded2bb75499b0e591687add4612c0f \ + --hash=sha256:5756ecb9bd8e96a0d0163f17a1282038228485da55c6010917db23cb199335c3 \ + --hash=sha256:598c4c37fe01c4f49e6faec1eb1a07bbe07b1ef552b2e5d3551835396b77f8a4 \ + --hash=sha256:599b7bbfe4103fa748e5cee63633ccdddca6cc01f2638f65386b4ac6c6344dc6 \ + --hash=sha256:5f44d68af44b21c023e9911d01a9a42ce03d3a8fb1c5317586643aad6c9147cf \ + --hash=sha256:5fcac413b41f86cf8daf8198bbc6ec8554f47f37697c73dc9b872ce6b56224aa \ + --hash=sha256:60327eb3cc88603aa734f0b42e7567fdb26659a2348847a832c9cac6eccfcf4d \ + --hash=sha256:60a8cf168e1ca1088a31392fb4f59cba8b41a5b707cc9f30d551259776c86c74 \ + --hash=sha256:62ec7747b142edf7d66c9d6be7f074cbd586d3a377aa26e675f5f1d99fba9ce5 \ + --hash=sha256:68ec92ea10901e9333ac4869c7fe40809b3a72a967b503f8dad1810e1f5c9f1d \ + --hash=sha256:690a825bbe1cb2407afcf19c4ec75a347ae51834ae2afb83649dde4f32feb152 \ + --hash=sha256:6e2a0e00123ac380db2d7394d6c0f5b22339ca20f2648810a72586d48a6bd46a \ + --hash=sha256:6ef52f454e8895bea898233a497a3c2185a2682c9da4c799589e4509b7484fbc \ + --hash=sha256:6f3e601384aa497f01f81831fffc146aca6c4800014fed7529bccbe7d5ce5c03 \ + --hash=sha256:6f809c30971a16ec3ff6993d99a9f72591b8817fdaba2c460383022015e8e02f \ + --hash=sha256:6f9a90eee999853205a8c724c479e6dec3806529a44dc8a4c4dbc94ac5ccdc23 \ + --hash=sha256:7191d2863edbb088ab5a0daad59ba0db279eccc53fe637ec071cf9a7b65927c3 \ + --hash=sha256:75187b77a84b1f457f9555604775b70d04102af312224d03c873da59011bba31 \ + --hash=sha256:764d9b861177692903ba375ec19a928141248ff003457575d037c444c7e3db53 \ + --hash=sha256:783c99558ec28169238628f978f92dafced2880d5d7f6ba0c39a915bc73ae004 \ + --hash=sha256:78dd4df4b8ff8cf61e799ea9733326316b84168bac41bb5e46d6ce787a48b581 \ + --hash=sha256:7ce9752480f74caa6c4cd04e785d797b0c59a229f6bc3f729b57f61230a2adc7 \ + --hash=sha256:7d87d950b2ec18569b41da81b2f9f69f48479a80a9277e291d7666c7bfb427f0 \ + --hash=sha256:7f09aef5c179b1e854987c38e36a396ebd7674cb6f2033bf5104c0933ac4a3a5 \ + --hash=sha256:7f41d1ecd2ced56c8bbef126de7b435261acb234ac7a5c3878869e20cbdf1615 \ + --hash=sha256:7f5bd025f16496fe09eb486cecf25e372fd72126ca68562cb6d860e51224bd69 \ + --hash=sha256:8165ccc5eb262f75313290943c70727c3dd008feb63281dc904b84bc8db719c1 \ + --hash=sha256:8437daf3e46579f491308c8aa14757654c2e3e167b727ec1292fbd5e32119dda \ + --hash=sha256:84756b4f9a1c30d360d7845f4de25c969918f45349ac1423da9341e17ee18143 \ + --hash=sha256:85fbb6e2ad6d5cab797dd2f017c221291d37b7db034ca34979c80aaddf9f26cf \ + --hash=sha256:889d80b5cc72ffeeeedd85522c8958a83b34754f578b5bc7cb6c19f55333f500 \ + --hash=sha256:8ddda5576d75095eac4066d1847a9f9904800cdf224dfea8a6e420e60661ee32 \ + --hash=sha256:8e6e9ee3086c5c0b0ef7595e39962e55c1a8b562af54bfc00c274f5ee41d8fa7 \ + --hash=sha256:914d76aa04cbda1cc7e5a0563421ade8437f801852b6d5528b43e6e82e3f7910 \ + --hash=sha256:92e2a6745e269daaacd02aeae32179e947d6a9ba8f1fa3d5262ee7bd93460165 \ + --hash=sha256:947398b58ae69fe454a71e4e97aff1eab322b3a5c4576a9736439f22a38d39b4 \ + --hash=sha256:95790cbbcf781b7c3375e3964ff6ada45b25a32dc575813c248bd43cf65ec13c \ + --hash=sha256:9590b6f9343e827f9fcb77c8f396f2631fc9c606fe6340995493f0470b91b2b1 \ + --hash=sha256:9fbe33b8db9231f33162d75ce410e83f46ae958b7d450c1c38dc67d9c595a6f3 \ + --hash=sha256:a2e8825e1e6c4d5b62bf3b230a7791524ad5298edd7f356747f30d39ebee773e \ + --hash=sha256:a62be7c3dd446f6f6eb28bdf161abd0b0c7b16bca8500f7811343226706daff4 \ + --hash=sha256:a84aec18381c50d7146053f6ccf755692a0e38c0ba6dc235fec69eb58768b0ec \ + --hash=sha256:a9ae100163d54fe8dfd6f6c7db14064201509792ac475ba1b7360f06e2e378dc \ + --hash=sha256:a9d1c23fe785aa0f64948d55cb661a29b8e5d5d9b436c69c128c98d9ced7677d \ + --hash=sha256:abdf50e656c67552a05d946990aeeb3ec4ece30ad7697f8f9e5290b2abb6eb25 \ + --hash=sha256:b007d8fe7ee73b72c937dbafcc1dc9de244ad04c94333f4c7dfa208c6388f669 \ + --hash=sha256:b14588df54bcbc92da4f85bb3eba966f8128ad2dc2804775b5ebc1a65aab44ca \ + --hash=sha256:b14c95b38cefdcaa86c9234e926e316fe12f2aae86bcf6d91ad0acb771be7dd1 \ + --hash=sha256:b38c275f30969fdb5e874f694af278b5996396912c9ed0330632e81807377d02 \ + --hash=sha256:b593485a58e6985b4e14389a4503c0ea14309ed5875cecf3b3cb8cce608bd315 \ + --hash=sha256:babc29b143bb6ba35d2e485352feee006318c8c24292998e742c2d3bbe7b00a2 \ + --hash=sha256:bbc71437302a2cb025704c80ef721c26d27cc37f0b37fcb2ee70fd456f05f1fd \ + --hash=sha256:bc7d657e59500a54ef28e392ecc8a078aef704a8336eb6065a467ea15eecc779 \ + --hash=sha256:bd2c74cf81bda2a13f1c77245a5b24987505e292731adb3c6b1d945cd9006981 \ + --hash=sha256:becebcd0107bce9771b4fbdaf2630020aea2eeacf2263ee5f47559c5248ad8f1 \ + --hash=sha256:bed5a14340fa65de61f60d92617e9431b361f2cb82e655520029e0bd7a03d68b \ + --hash=sha256:c6560234b5eee2eda62329a25d7a28ac612b1a2de5b8f5d4eed3f06223d56354 \ + --hash=sha256:cb24a349c16cd3b084a2c2c23a4c5c4f606740d451159e2dd160b3a27a5ba1bf \ + --hash=sha256:d12eb332123b6789e853ad7123f8d7a13e1d0361d507b292c6ba6ef0e1ffba39 \ + --hash=sha256:d4c3e3d7241f317957e03c4b915f90dbbbfa7570a87bffa8634138755d12b4db \ + --hash=sha256:d54e58f18148b5ac4386c77a9aa891351903ada3814a87d476583d9d0f9228bb \ + --hash=sha256:d712d547049de46635da1fb4ebfa705f626d165bade0387f568252d719e808f9 \ + --hash=sha256:d75a49543e869e7798400f9509cf90ff0c9feeba6a903df62b7f2dfe133bac7e \ + --hash=sha256:dd1521d73ed6e227c6aa23ba973495f22d8f340d5b1023771b756c7f4b9883a0 \ + --hash=sha256:e4bbf559b68390a545ce573c89f7de9b99ef69fc7e754f7c265774e26ff95a8e \ + --hash=sha256:e4ff19b7a43b81d93966b961dbc69782ea84f4d6501cd2f9b6d0e662b3d64c2a \ + --hash=sha256:e539e4abac01774cb315d9aeedba155459e6b3ece725fcc06a8a1a061a7bb7aa \ + --hash=sha256:eae41b8a4b113af20dcdf73ea16c489da59f8aaf552a6a1f5811ed90bc254365 \ + --hash=sha256:eb686cbca9d319d9abef488e45286c5e616189ed895859f1f0f04c01f541a418 \ + --hash=sha256:ec0444e1f198eba41ce69d0e75cf18042c38f348b9ca741d263e60793a4f3cbf \ + --hash=sha256:ec63d233defb2b89af03d2bfb27c1ad0409f23f923d402ba20f4d9a8bc94fe5d \ + --hash=sha256:ee0320d563f6e6b94965f32abe321b62354072b12736c49b7eb0ab398a80878e \ + --hash=sha256:f011b86eed5a4576712b89df31f36e0f1e3903dbf6b4497a0b0e224c67a9a9c6 \ + --hash=sha256:f33e61bef3b8f22986f4f5f9ca1ec547b953175d3f5bf85abcf54695394f4058 \ + --hash=sha256:f7609bd99095ca3a660c8b2061c45daab6ac1f1b277afb3dce5aeef20e9295db \ + --hash=sha256:f77e29ce051fcac3a001fc40262d456c315a27d93f5922e4f525c308479fc557 \ + --hash=sha256:f833a121f11380ad6f6970336b28e0e72fb5cd1219f71d5adefbc0d09cdd75bc \ + --hash=sha256:f8b1fa9526a3e2de5422b9775fa4e98a7abb703e5f38d408540a52195c479eb5 \ + --hash=sha256:f9bdf71a9c12907b417370f9d52924e6ce4f1d65ea437cce564a6858c5ba482e \ + --hash=sha256:fc1fd7229800ec7a33373df09762d146c67836e56648243fb1d87d205147fce6 \ + --hash=sha256:ff91934c38306c82321b56576d4dab3583fc7dd83b37d09d2906b0648c91538c # via # barman # python-snappy -cryptography==48.0.0 \ - --hash=sha256:0890f502ddf7d9c6426129c3f49f5c0a39278ed7cd6322c8755ffca6ee675a13 \ - --hash=sha256:0c558d2cdffd8f4bbb30fc7134c74d2ca9a476f830bb053074498fbc86f41ed6 \ - --hash=sha256:16cd65b9330583e4619939b3a3843eec1e6e789744bb01e7c7e2e62e33c239c8 \ - --hash=sha256:18349bbc56f4743c8b12dc32e2bccb2cf83ee8b69a3bba74ef8ae857e26b3d25 \ - --hash=sha256:1e2d54c8be6152856a36f0882ab231e70f8ec7f14e93cf87db8a2ed056bf160c \ - --hash=sha256:22a5cb272895dce158b2cacdfdc3debd299019659f42947dbdac6f32d68fe832 \ - --hash=sha256:27241b1dc9962e056062a8eef1991d02c3a24569c95975bd2322a8a52c6e5e12 \ - --hash=sha256:2b4d59804e8408e2fea7d1fbaf218e5ec984325221db76e6a241a9abd6cdd95c \ - --hash=sha256:2eb992bbd4661238c5a397594c83f5b4dc2bc5b848c365c8f991b6780efcc5c7 \ - --hash=sha256:369a6348999f94bbd53435c894377b20ab95f25a9065c283570e70150d8abc3c \ - --hash=sha256:3cb07a3ed6431663cd321ea8a000a1314c74211f823e4177fefa2255e057d1ec \ - --hash=sha256:40ba1f85eaa6959837b1d51c9767e230e14612eea4ef110ee8854ada22da1bf5 \ - --hash=sha256:4defde8685ae324a9eb9d818717e93b4638ef67070ac9bc15b8ca85f63048355 \ - --hash=sha256:55b7718303bf06a5753dcdccf2f3945cf18ad7bffde41b61226e4db31ab89a9c \ - --hash=sha256:561215ea3879cb1cbbf272867e2efda62476f240fb58c64de6b393ae19246741 \ - --hash=sha256:58d00498e8933e4a194f3076aee1b4a97dfec1a6da444535755822fe5d8b0b86 \ - --hash=sha256:59baa2cb386c4f0b9905bd6eb4c2a79a69a128408fd31d32ca4d7102d4156321 \ - --hash=sha256:5a5ed8fde7a1d09376ca0b40e68cd59c69fe23b1f9768bd5824f54681626032a \ - --hash=sha256:5b012212e08b8dd5edc78ef54da83dd9892fd9105323b3993eff6bea65dc21d7 \ - --hash=sha256:5c3932f4436d1cccb036cb0eaef46e6e2db91035166f1ad6505c3c9d5a635920 \ - --hash=sha256:614d0949f4790582d2cc25553abd09dd723025f0c0e7c67376a1d77196743d6e \ - --hash=sha256:76341972e1eff8b4bea859f09c0d3e64b96ce931b084f9b9b7db8ef364c30eff \ - --hash=sha256:77a2ccbbe917f6710e05ba9adaa25fb5075620bf3ea6fb751997875aff4ae4bd \ - --hash=sha256:7995ef305d7165c3f11ae07f2517e5a4f1d5c18da1376a0a9ed496336b69e5f3 \ - --hash=sha256:7ce4bfae76319a532a2dc68f82cc32f5676ee792a983187dac07183690e5c66f \ - --hash=sha256:7e8eac43dfca5c4cccc6dad9a80504436fca53bb9bc3100a2386d730fbe6b602 \ - --hash=sha256:84cf79f0dc8b36ac5da873481716e87aef31fcfa0444f9e1d8b4b2cece142855 \ - --hash=sha256:8c7378637d7d88016fa6791c159f698b3d3eed28ebf844ac36b9dc04a14dae18 \ - --hash=sha256:8cd666227ef7af430aa5914a9910e0ddd703e75f039cef0825cd0da71b6b711a \ - --hash=sha256:906cbf0670286c6e0044156bc7d4af9cbb0ef6db9f73e52c3ec56ba6bdde5336 \ - --hash=sha256:9071196d81abc88b3516ac8cdfad32e2b66dd4a5393a8e68a961e9161ddc6239 \ - --hash=sha256:9249e3cd978541d665967ac2cb2787fd6a62bddf1e75b3e347a594d7dacf4f74 \ - --hash=sha256:984a20b0f62a26f48a3396c72e4bc34c66e356d356bf370053066b3b6d54634a \ - --hash=sha256:9be5aafa5736574f8f15f262adc81b2a9869e2cfe9014d52a44633905b40d52c \ - --hash=sha256:9c459db21422be75e2809370b829a87eb37f74cd785fc4aa9ea1e5f43b47cda4 \ - --hash=sha256:9ccdac7d40688ecb5a3b4a604b8a88c8002e3442d6c60aead1db2a89a041560c \ - --hash=sha256:a0e692c683f4df67815a2d258b324e66f4738bd7a96a218c826dce4f4bd05d8f \ - --hash=sha256:a5da777e32ffed6f85a7b2b3f7c5cbc88c146bfcd0a1d7baf5fcc6c52ee35dd4 \ - --hash=sha256:a64697c641c7b1b2178e573cbc31c7c6684cd56883a478d75143dbb7118036db \ - --hash=sha256:ad64688338ed4bc1a6618076ba75fd7194a5f1797ac60b47afe926285adb3166 \ - --hash=sha256:bd72e68b06bb1e96913f97dd4901119bc17f39d4586a5adf2d3e47bc2b9d58b5 \ - --hash=sha256:c17dfe85494deaeddc5ce251aebd1d60bbe6afc8b62071bb0b469431a000124f \ - --hash=sha256:c18684a7f0cc9a3cb60328f496b8e3372def7c5d2df39ac267878b05565aaaae \ - --hash=sha256:cc90c0b39b2e3c65ef52c804b72e3c58f8a04ab2a1871272798e5f9572c17d20 \ - --hash=sha256:db63bf618e5dea46c07de12e900fe1cdd2541e6dc9dbae772a70b7d4d4765f6a \ - --hash=sha256:ea8990436d914540a40ab24b6a77c0969695ed52f4a4874c5137ccf7045a7057 \ - --hash=sha256:ecde28a596bead48b0cfd2a1b4416c3d43074c2d785e3a398d7ec1fc4d0f7fbb \ - --hash=sha256:f5333311663ea94f75dd408665686aaf426563556bb5283554a3539177e03b8c \ - --hash=sha256:fdfef35d751d510fcef5252703621574364fec16418c4a1e5e1055248401054b +cryptography==50.0.1 \ + --hash=sha256:01f41478cf33fc605a6a089cd56d28b45c6c0b45a1928b61797f2621a04bac71 \ + --hash=sha256:05ba322c4da95b262a212c345af888ef2c37c88c0509756ea00a0e6d68850f23 \ + --hash=sha256:16c5ecd954b3330ebfb6605eca4fd952da8bef376551d5cc264534e3770a9ee6 \ + --hash=sha256:2a93d05e34d5f67fba6f891fe85d929999baa7195e853923ea6d7576c9e68c5e \ + --hash=sha256:2b34d76a652ea2b6faf777c35df230c5637842cd904e04f16230c3f9f03e4361 \ + --hash=sha256:2ebbfb0f1fed745e91796e3e1080a1440423fdae8ece1b995a1d80883a409054 \ + --hash=sha256:30a125032e5642a21ff816e021152bd4e7e94f03eff3f4b7fca41cd22bc3110f \ + --hash=sha256:330fbb252391c596f1ae42c5754449dc924e6ad012dca8efe0d703f9f2d12ec6 \ + --hash=sha256:359e62deae718bce96170e223fdcb6357e4fbd3bb7a3a75f4430763532560e49 \ + --hash=sha256:407fe2b6db00939c05c0e945e9914238f2f0a430974839429dafc82b1ee6bee5 \ + --hash=sha256:42be3bb70596b3abe4ac097b75be223e8b3ab614a0e5de068e3dcc54d71d6149 \ + --hash=sha256:4c4188f7c0cf655be5c06342b817ed0f9595b69ffa2b12026e5353eed29dea88 \ + --hash=sha256:51593d180cf6d179bde5c5d065bed81386b1f381656ae7d042b7ffc87a9895ad \ + --hash=sha256:51afcfceb15597cf2635068e4ac9a56b2abde622edde17f37d85fd7b5306497a \ + --hash=sha256:53e279950892dc102c6b4e52af03ae5ea92fac572a1ddab78ca73a997f62b69f \ + --hash=sha256:55d16b1ef3ee0958d893a977b19777887e546c9954ea81b200c3301a864013f2 \ + --hash=sha256:5dd9bda1c12b4162f6ff568eeb5e0ff956c28d14406e875cfe8a63a2d414ff20 \ + --hash=sha256:5fe002589592ed749ce77fe0695fcbd3500dd61d7d6db5858a7544c612fa8e45 \ + --hash=sha256:5fe939deeb161024a6be98229c953b6591fef1f41214497a78fe793a244c017f \ + --hash=sha256:693c99b49bd37d0d096e4334c10232c77248c415b98d35236094cdf96d57258b \ + --hash=sha256:76de83fbd91ac49c0feaaa983d0748fd7a53176afac5fb3bf7478d244f0eb527 \ + --hash=sha256:79bf008d1f9af6071c797ad133e39915dfee7614f18f18f4db9072eb715064a3 \ + --hash=sha256:804728ce710890870f3aaa344b2e161172d258d768ac139d02cfd9092d0d94e6 \ + --hash=sha256:8921d58f426793c5f1b47f0b59575780de9a095214958d0eb37d909593db8367 \ + --hash=sha256:8df2de9102026855887e4587084f6eabd80ed0f345b8ad8a7ac27ab9bf4723e0 \ + --hash=sha256:9cb3cb952cf5a8abd50c782a98a89d71699715e802fe349704b47f2425b42a94 \ + --hash=sha256:9dde0a357190eb3b1da1bb9ab750e9c85cba82ca5977aa0836cbb94e92611239 \ + --hash=sha256:9ebcdd5519be9b652a46f507817a74591774fc3d6923ac364e4dfa64e36b291b \ + --hash=sha256:a0b1a59e3a089064a0ec309e9428c8e3ae4e161419d20ac33600767e83fc658a \ + --hash=sha256:a255449073358275b64b67d3f595f268bbef70e72b6edb65e0c70c735bf739c9 \ + --hash=sha256:a8f40ea47330e71b594a7e246898f93177c259490c63183dbaf9e571d71ed9a5 \ + --hash=sha256:ac02b07824d4d1001bd4367599f839c19cb171924c796e52c23508ac14c2c0cc \ + --hash=sha256:aed8db4f6d71c51efb89530e12d9464e7bf2923d46c3205dc794a2a93f8c0648 \ + --hash=sha256:b8f852c65863251b9e3a1b8c150ce21e59b522dbb6a7d4bc80e680d38388e986 \ + --hash=sha256:be224a65493ec5b74a158ff22a5522ce4a5ca1e543c647a3a4730d4a09e5f959 \ + --hash=sha256:ca83d00d9e69cd5eb63f2e69c3a5a59e0cecae5ae14c6ae0b35830fe3b37bad0 \ + --hash=sha256:cbf74a81765ee67413503ca6e26dcc4f6f5a519822436cc0a1b97aab6c1b8a17 \ + --hash=sha256:d63ae8f6481fec907ac0f588eee8a90aefde112c633131fe540e5711ddbb5a4e \ + --hash=sha256:e22dfed744bd4002e909464cb23d2f0b05c6f3113a79ef2e9864a53db737c733 \ + --hash=sha256:e2ca8fd1b6b4b82a1c4cb02841d0837e3c12336c2e24b520ab8ab3b969733d8f \ + --hash=sha256:e74591e283fe6eb956416c929eb58262a719fe0311fd9054c62c3350ed8760d8 \ + --hash=sha256:f74455bb086a85d5e81246412602aaa97ed095e504cd40dd261ef50be42205bf \ + --hash=sha256:fb4b9672d389c738b175c4166e78310f8a70358886aacd9173ee03a85ffdc671 \ + --hash=sha256:fc3ed7ebd2a8c96f5b166de0ab9b624996bef3b07bbeb19364dfb78222c22c80 \ + --hash=sha256:fd3718b960d0b5dd213cdf03f3bcb7000e69dda0de8b956061947ff6bcff5558 \ + --hash=sha256:ff838d62ec1bfce4f9ba7fa16f4a7b554cd8d0c299e6be37502161a660c84eef # via # azure-identity # azure-storage-blob # google-auth # msal # pyjwt -google-api-core==2.30.3 \ - --hash=sha256:a85761ba72c444dad5d611c2220633480b2b6be2521eca69cca2dbb3ffd6bfe8 \ - --hash=sha256:e601a37f148585319b26db36e219df68c5d07b6382cff2d580e83404e44d641b +google-api-core==2.34.0 \ + --hash=sha256:98a779fe72de956eb1c9c2f47ff4c4432a668ece1a002ec38bed07ec2698ae59 \ + --hash=sha256:cdf9c67e7ca2402d86ccbfde5f2503fc83e3cc3f58cc78456ae96cad24a6d2de # via # google-cloud-core # google-cloud-storage -google-auth==2.53.0 \ - --hash=sha256:6e7449917c599b35126a99ec268ec6880301f2fea41dce198fe8fd83ff642b68 \ - --hash=sha256:e7e6aa16f6bee7b2b264830fd04f08087a1d5a836df516251a5d15327b246c9c +google-auth==2.57.0 \ + --hash=sha256:180dafe015cfb62193bea26b677500fab5b9fd51a1e825ebf3ad9b182047ae59 \ + --hash=sha256:9b4f96d6a1feb5f7201231f47cfb3de08d8f176f8a61f9e461555116e95a8789 # via # google-api-core # google-cloud-core # google-cloud-storage -google-cloud-core==2.6.0 \ - --hash=sha256:6d63ac8e5eca6d9e4319d0a1e2265fadcd7f1049904378caecfa01cf52dd869e \ - --hash=sha256:e76149739f90fac1fc6757c09f47eaccb3145b54adbd7759b0f7c4b235f46c83 +google-cloud-core==2.7.0 \ + --hash=sha256:874aaf89765db87a9b911b7a2ca7c5068554868eed9e75c7766affe342a2913d \ + --hash=sha256:c18a250904cfdda021eb3ae8b8238c9f9ca272a4cbbfb5cba946b3fe3022eed1 # via google-cloud-storage -google-cloud-storage==3.10.1 \ - --hash=sha256:97db9aa4460727982040edd2bd13ff3d5e2260b5331ad22895802da1fc2a5286 \ - --hash=sha256:a72f656759b7b99bda700f901adcb3425a828d4a29f911bc26b3ea79c5b1217f +google-cloud-storage==3.13.1 \ + --hash=sha256:98208de6c21e85cecd3eb44551894efff33d98365500e178867d4305854a770a \ + --hash=sha256:a80bf8cac2794808aa61c50c5f769ecbbe2d10331bacd0d69d30e59b14b346b2 # via barman google-crc32c==1.8.0 \ --hash=sha256:014a7e68d623e9a4222d663931febc3033c5c7c9730785727de2a81f87d5bab8 \ @@ -504,17 +546,17 @@ google-crc32c==1.8.0 \ # via # google-cloud-storage # google-resumable-media -google-resumable-media==2.9.0 \ - --hash=sha256:c8901e88e389af8bed64d9696c74d8bad961865eb2236e13e0bfca9bb0a65ca3 \ - --hash=sha256:f7cfb224846a9dd444d125115dfbe8ef02a2b893e78f087762fe716a255a734b +google-resumable-media==2.10.2 \ + --hash=sha256:1de441703cd298d75a419bfdc0066e9fc7b0a1de630df96eea8ce8f5c759358c \ + --hash=sha256:e3cedc827a4ea41e216582d74346f1fb9fceb625a8c3c53912f2ca1d663334d7 # via google-cloud-storage -googleapis-common-protos==1.75.0 \ - --hash=sha256:53a062ff3c32552fbd62c11fe23768b78e4ddf0494d5e5fd97d3f4689c75fbbd \ - --hash=sha256:961ed60399c457ceb0ee8f285a84c870aabc9c6a832b9d37bb281b5bebde43ed +googleapis-common-protos==1.75.2 \ + --hash=sha256:6b83302f554ea93a0f48409c7fc2050f954bcbcddb7e3a9c76d4a823cb22920e \ + --hash=sha256:8829a3d1e4508c5b7b9a6b9525f7fccff611f8531644579a76466c29295d4bb2 # via google-api-core -idna==3.16 \ - --hash=sha256:cc246e3a3f89580c3a951b5ad298ca4638078b2cdd4f115654332b5c26daded5 \ - --hash=sha256:d7a6da03db833450fca25d2358ac9ff06cd624577a4aea3a596d5c0f77b8e03d +idna==3.19 \ + --hash=sha256:5e0811a4383b21dc5838069f801c4fb62113b7447663d2530d2bd6e77b49bf15 \ + --hash=sha256:815e7be7a7806d54abb586dc943addc79e8b2ee16915059658cbeff4b1b43bf4 # via requests isodate==0.7.2 \ --hash=sha256:28009937d8031054830160fce6d409ed342816b543597cece116d966c6d99e15 \ @@ -585,9 +627,9 @@ lz4==4.4.5 \ --hash=sha256:f9b8bde9909a010c75b3aea58ec3910393b758f3c219beed67063693df854db0 \ --hash=sha256:ff1b50aeeec64df5603f17984e4b5be6166058dcf8f1e26a3da40d7a0f6ab547 # via barman -msal==1.36.0 \ - --hash=sha256:36ecac30e2ff4322d956029aabce3c82301c29f0acb1ad89b94edcabb0e58ec4 \ - --hash=sha256:3f6a4af2b036b476a4215111c4297b4e6e236ed186cd804faefba23e4990978b +msal==1.38.0 \ + --hash=sha256:4f10ff1257bacfd1781f22e85bd2b8d43ad1b490f3b6aafd7906671cadedd464 \ + --hash=sha256:765b9b98b6aa380ee8b8f1c75636e08863edaf0a953498955bd668650dde5d49 # via # azure-identity # msal-extensions @@ -595,19 +637,19 @@ msal-extensions==1.3.1 \ --hash=sha256:96d3de4d034504e969ac5e85bae8106c8373b5c6568e4c8fa7af2eca9dbe6bca \ --hash=sha256:c5b0fd10f65ef62b5f1d62f4251d51cbcaf003fcedae8c91b040a488614be1a4 # via azure-identity -proto-plus==1.28.0 \ - --hash=sha256:38e5696342835b08fc116f30a25665b29531cda9d5d5643e9b81fc312385abd9 \ - --hash=sha256:a630604310899e73c59ec302e5765c058d412b2f090b9c79c8822589f14955b8 +proto-plus==1.28.4 \ + --hash=sha256:4b01341272f8a348db3f003b6143109f83ab43091019d5181b3fcdf500ab32aa \ + --hash=sha256:5ff7ecad828e032a491fcb86947801768e32237f99dd049b649965b892ae9a63 # via google-api-core -protobuf==7.35.0 \ - --hash=sha256:4c4617b83ade0e279d1d2bfe04025a1adb87f9ed657de038620dc0ff959357f6 \ - --hash=sha256:4cbf5cc286130e06a6c9bbefac442431173906dfcc979712183d4adcc01b37ee \ - --hash=sha256:66be6c513931c794fa92c080ffee41671390da3d79da219cf9c0c0907f035dda \ - --hash=sha256:6c0f98f10c8a05ea30f8993dfef2de093d27b490fdae78bb60c8343795d55011 \ - --hash=sha256:a2efd84605f41e559f1881b0912b44099d0a2ac9bf46b3474823f10fb393b0e6 \ - --hash=sha256:c13f325cf242bad135c350629eeb5d54b24228eb472fb3e2e9ebbd4c5dc20ca0 \ - --hash=sha256:f05bcadf9a2a6b8dda047007075135fb7d08c73d9177aabc067e1be46881a201 \ - --hash=sha256:fcbe42a4ac09d3ec9c987ddfcd956afd0b15f1ff613bd8371bde9405ffd5c8e5 +protobuf==7.36.0 \ + --hash=sha256:1781cc1de61249b750848029bca452c0a8b7e990080316b9bbc2518b2117b488 \ + --hash=sha256:3297e60abdff301e5f74393d87f6cc59dacab5f024a89548a6e8de1d26576b16 \ + --hash=sha256:53374d53fc29a67f7dbbf0ade47d7526a0f0137bf0f9c90e48d8a60790ef748c \ + --hash=sha256:70f5ec8eb0da81a44360c0dc0beac99a0d78071d21956a7076bae8bd2051841b \ + --hash=sha256:7326fd717bdc419162a735938d89d4032332bcc3408804012b24ff3a37086071 \ + --hash=sha256:9103532dffd80c6fab7e50c65a31007680a06eb57537d437bb1b35812c138a37 \ + --hash=sha256:bf94a5917c71058262de683669bc0a797a7669d3de71f0b36d058e3194f47b44 \ + --hash=sha256:e8e09cb0d794c6687926fa558a8a6e72aa10edb997d5ca61da0765f12a3e00ea # via # google-api-core # googleapis-common-protos @@ -621,9 +663,9 @@ psycopg2==2.9.12 \ --hash=sha256:a73d5513bfe929c56555006c7a9cc7ae6e4276aa99dd2b1e2544eb8bb54f8b23 \ --hash=sha256:d5fbe092315fb007c03544704e6d1e678a6c0378139d01cea433dc59edf041b4 # via barman -pyasn1==0.6.3 \ - --hash=sha256:697a8ecd6d98891189184ca1fa05d1bb00e2f84b5977c481452050549c8a72cf \ - --hash=sha256:a80184d120f0864a52a073acc6fc642847d0be408e7c7252f31390c0f4eadcde +pyasn1==0.6.4 \ + --hash=sha256:9c447d8431c947fe4c8febc4ed9e760bc29011a5b01e5c74b67025bd9fb8ce81 \ + --hash=sha256:deda9277cfd454080ec40b207fb6df82206a3a2688735233cdcd8d3d565f088b # via pyasn1-modules pyasn1-modules==0.4.2 \ --hash=sha256:29253a9207ce32b64c3ac6600edc75368f98473906e8fd1043bd6b5b1de2c14a \ @@ -657,17 +699,17 @@ requests==2.34.2 \ # google-api-core # google-cloud-storage # msal -s3transfer==0.17.0 \ - --hash=sha256:9edeb6d1c3c2f89d6050348548834ad8289610d886e5bf7b7207728bd43ce33a \ - --hash=sha256:ce3801712acf4ad3e89fb9990df97b4972e93f4b3b0004d214be5bce12814c20 +s3transfer==0.19.2 \ + --hash=sha256:ba0309fd86be3c27dbf78cdd813c13c5e1df16e5874b99d2535ebbdfb9892993 \ + --hash=sha256:d8168eccca828cbb2cd573675333f3bddd254313a9c42494b84c76b539e8ba25 # via boto3 six==1.17.0 \ --hash=sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274 \ --hash=sha256:ff70335d468e7eb6ec65b95b99d3a2836546063f63acc5171de367e834932a81 # via python-dateutil -typing-extensions==4.15.0 \ - --hash=sha256:0cea48d173cc12fa28ecabc3b837ea3cf6f38c6d1136f85cbaaf598984861466 \ - --hash=sha256:f0fa19c6845758ab08074a0cfa8b7aecb71c999ca73d62883bc25cc018c4e548 +typing-extensions==4.16.0 \ + --hash=sha256:481caa481374e813c1b176ada14e97f1f67a4539ce9cfeb3f350d78d6370c2e8 \ + --hash=sha256:dc983d19a509c94dba722ee6abd33940f7c05a89e243c47e907eb4db6f1a43e5 # via # azure-core # azure-identity @@ -783,11 +825,3 @@ zstandard==0.25.0 \ --hash=sha256:fd7a5004eb1980d3cefe26b2685bcb0b17989901a70a1040d1ac86f1d898c551 \ --hash=sha256:ffef5a74088f1e09947aecf91011136665152e0b4b359c42be3373897fb39b01 # via barman - -# The following packages are considered to be unsafe in a requirements file: -setuptools==82.0.1 \ - --hash=sha256:7d872682c5d01cfde07da7bccc7b65469d3dca203318515ada1de5eda35efbf9 \ - --hash=sha256:a59e362652f08dcd477c78bb6e7bd9d80a7995bc73ce773050228a348ce2e5bb - # via - # -r sidecar-requirements.in - # barman diff --git a/dagger/check-doc-version/dagger.json b/dagger/check-doc-version/dagger.json index 8f37cca..1e0c38c 100644 --- a/dagger/check-doc-version/dagger.json +++ b/dagger/check-doc-version/dagger.json @@ -1,6 +1,6 @@ { "name": "check-doc-version", - "engineVersion": "v0.20.6", + "engineVersion": "v0.21.8", "sdk": { "source": "go" }, diff --git a/dagger/check-doc-version/go.mod b/dagger/check-doc-version/go.mod index 57b4f76..412050d 100644 --- a/dagger/check-doc-version/go.mod +++ b/dagger/check-doc-version/go.mod @@ -1,6 +1,6 @@ module dagger/check-doc-version -go 1.25.0 +go 1.26.1 require ( github.com/Khan/genqlient v0.8.1 @@ -26,12 +26,12 @@ require ( go.opentelemetry.io/otel/sdk/metric v1.43.0 // indirect go.opentelemetry.io/proto/otlp v1.10.0 // indirect golang.org/x/sync v0.20.0 // indirect - google.golang.org/grpc v1.80.0 // indirect + google.golang.org/grpc v1.82.1 // indirect ) require ( - dagger.io/dagger v0.20.6-0.20260415192040-7058e9313c72 github.com/cespare/xxhash/v2 v2.3.0 // indirect + github.com/dagger/querybuilder v0.0.0-20260402040506-574a5e81cb59 github.com/go-logr/logr v1.4.3 // indirect github.com/go-logr/stdr v1.2.2 // indirect github.com/google/uuid v1.6.0 // indirect @@ -39,9 +39,9 @@ require ( github.com/sosodev/duration v1.4.0 // indirect go.opentelemetry.io/auto/sdk v1.2.1 // indirect go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.43.0 // indirect - golang.org/x/net v0.53.0 // indirect - golang.org/x/sys v0.43.0 // indirect - golang.org/x/text v0.36.0 // indirect + golang.org/x/net v0.55.0 // indirect + golang.org/x/sys v0.45.0 // indirect + golang.org/x/text v0.37.0 // indirect google.golang.org/genproto/googleapis/api v0.0.0-20260414002931-afd174a4e478 // indirect google.golang.org/genproto/googleapis/rpc v0.0.0-20260414002931-afd174a4e478 // indirect google.golang.org/protobuf v1.36.11 // indirect diff --git a/dagger/check-doc-version/go.sum b/dagger/check-doc-version/go.sum index 898c8fa..cc9ed5f 100644 --- a/dagger/check-doc-version/go.sum +++ b/dagger/check-doc-version/go.sum @@ -1,5 +1,3 @@ -dagger.io/dagger v0.20.6-0.20260415192040-7058e9313c72 h1:s39e07WvaUU6tLhpojK8ZEIoIbOSn5hHOJra0waenxQ= -dagger.io/dagger v0.20.6-0.20260415192040-7058e9313c72/go.mod h1:ZXg8+pQZaZUC8rAw4V/gPP8aKvKARIJZ+pfcV+RC1es= github.com/99designs/gqlgen v0.17.89 h1:KzEcxPiMgQoMw3m/E85atUEHyZyt0PbAflMia5Kw8z8= github.com/99designs/gqlgen v0.17.89/go.mod h1:GFqruTVGB7ZTdrf1uzOagpXbY7DrEt1pIxnTdhIbWvQ= github.com/Khan/genqlient v0.8.1 h1:wtOCc8N9rNynRLXN3k3CnfzheCUNKBcvXmVv5zt6WCs= @@ -14,6 +12,8 @@ github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UF github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/dagger/otel-go v1.43.0 h1:AYCnAamWmxtSxigWPTgC+8EWqiWPcDZEegh8y05gdJ8= github.com/dagger/otel-go v1.43.0/go.mod h1:83CTuXi70zcx1kaym5buqmb7RNzg1E9dEiQSFyLbLdU= +github.com/dagger/querybuilder v0.0.0-20260402040506-574a5e81cb59 h1:g6vfdGRyz6fAjfHz5FyYPZgHy8qcQ31fHrBl1iCOzxw= +github.com/dagger/querybuilder v0.0.0-20260402040506-574a5e81cb59/go.mod h1:jsdUJeYzcbyK1j/EqMGPrQgNYxl/Zfg06vvM9C/xXxs= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= @@ -75,22 +75,22 @@ go.opentelemetry.io/proto/otlp v1.10.0 h1:IQRWgT5srOCYfiWnpqUYz9CVmbO8bFmKcwYxpu go.opentelemetry.io/proto/otlp v1.10.0/go.mod h1:/CV4QoCR/S9yaPj8utp3lvQPoqMtxXdzn7ozvvozVqk= go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= -golang.org/x/net v0.53.0 h1:d+qAbo5L0orcWAr0a9JweQpjXF19LMXJE8Ey7hwOdUA= -golang.org/x/net v0.53.0/go.mod h1:JvMuJH7rrdiCfbeHoo3fCQU24Lf5JJwT9W3sJFulfgs= +golang.org/x/net v0.55.0 h1:bcvxaJn3e1U6InsFWt1JUq1aSjnRxLzT2rtD2KfkDF8= +golang.org/x/net v0.55.0/go.mod h1:L5U2KuzuOe1lY7Z+aWVIKK6qEeJXnXV9yzGA+WCHJww= golang.org/x/sync v0.20.0 h1:e0PTpb7pjO8GAtTs2dQ6jYa5BWYlMuX047Dco/pItO4= golang.org/x/sync v0.20.0/go.mod h1:9xrNwdLfx4jkKbNva9FpL6vEN7evnE43NNNJQ2LF3+0= -golang.org/x/sys v0.43.0 h1:Rlag2XtaFTxp19wS8MXlJwTvoh8ArU6ezoyFsMyCTNI= -golang.org/x/sys v0.43.0/go.mod h1:4GL1E5IUh+htKOUEOaiffhrAeqysfVGipDYzABqnCmw= -golang.org/x/text v0.36.0 h1:JfKh3XmcRPqZPKevfXVpI1wXPTqbkE5f7JA92a55Yxg= -golang.org/x/text v0.36.0/go.mod h1:NIdBknypM8iqVmPiuco0Dh6P5Jcdk8lJL0CUebqK164= +golang.org/x/sys v0.45.0 h1:dO4czNzziLiiXplLQgBCEpCvXQ3dnkn0SdaZSYdQ+FY= +golang.org/x/sys v0.45.0/go.mod h1:4GL1E5IUh+htKOUEOaiffhrAeqysfVGipDYzABqnCmw= +golang.org/x/text v0.37.0 h1:Cqjiwd9eSg8e0QAkyCaQTNHFIIzWtidPahFWR83rTrc= +golang.org/x/text v0.37.0/go.mod h1:a5sjxXGs9hsn/AJVwuElvCAo9v8QYLzvavO5z2PiM38= gonum.org/v1/gonum v0.17.0 h1:VbpOemQlsSMrYmn7T2OUvQ4dqxQXU+ouZFQsZOx50z4= gonum.org/v1/gonum v0.17.0/go.mod h1:El3tOrEuMpv2UdMrbNlKEh9vd86bmQ6vqIcDwxEOc1E= google.golang.org/genproto/googleapis/api v0.0.0-20260414002931-afd174a4e478 h1:yQugLulqltosq0B/f8l4w9VryjV+N/5gcW0jQ3N8Qec= google.golang.org/genproto/googleapis/api v0.0.0-20260414002931-afd174a4e478/go.mod h1:C6ADNqOxbgdUUeRTU+LCHDPB9ttAMCTff6auwCVa4uc= google.golang.org/genproto/googleapis/rpc v0.0.0-20260414002931-afd174a4e478 h1:RmoJA1ujG+/lRGNfUnOMfhCy5EipVMyvUE+KNbPbTlw= google.golang.org/genproto/googleapis/rpc v0.0.0-20260414002931-afd174a4e478/go.mod h1:4Hqkh8ycfw05ld/3BWL7rJOSfebL2Q+DVDeRgYgxUU8= -google.golang.org/grpc v1.80.0 h1:Xr6m2WmWZLETvUNvIUmeD5OAagMw3FiKmMlTdViWsHM= -google.golang.org/grpc v1.80.0/go.mod h1:ho/dLnxwi3EDJA4Zghp7k2Ec1+c2jqup0bFkw07bwF4= +google.golang.org/grpc v1.82.1 h1:NnAxzGRA0677vCa4BUkOAnO5+FfQqVl9iUXeD0IqcGE= +google.golang.org/grpc v1.82.1/go.mod h1:yzTZ1TB1Z3SG+LIYaI+WiE8D5+PZ3ArnrSp8zF3+/ZA= google.golang.org/protobuf v1.36.11 h1:fV6ZwhNocDyBLK0dj+fg8ektcVegBBuEolpbTQyBNVE= google.golang.org/protobuf v1.36.11/go.mod h1:HTf+CrKn2C3g5S8VImy6tdcUvCska2kB7j23XfzDpco= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= diff --git a/dagger/e2e/dagger.json b/dagger/e2e/dagger.json index 043bffb..86e6475 100644 --- a/dagger/e2e/dagger.json +++ b/dagger/e2e/dagger.json @@ -1,6 +1,6 @@ { "name": "e2e", - "engineVersion": "v0.20.6", + "engineVersion": "v0.21.8", "sdk": { "source": "go" }, diff --git a/dagger/e2e/go.mod b/dagger/e2e/go.mod index 8e419c1..513bb5d 100644 --- a/dagger/e2e/go.mod +++ b/dagger/e2e/go.mod @@ -1,37 +1,35 @@ module dagger/e-2-e -go 1.25.0 +go 1.26.1 require ( + github.com/99designs/gqlgen v0.17.89 github.com/Khan/genqlient v0.8.1 github.com/dagger/otel-go v1.43.0 github.com/vektah/gqlparser/v2 v2.5.32 go.opentelemetry.io/otel v1.43.0 + go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploggrpc v0.19.0 + go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp v0.19.0 + go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.43.0 + go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v1.43.0 + go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.43.0 + go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.43.0 + go.opentelemetry.io/otel/log v0.19.0 + go.opentelemetry.io/otel/metric v1.43.0 go.opentelemetry.io/otel/sdk v1.43.0 + go.opentelemetry.io/otel/sdk/log v0.19.0 + go.opentelemetry.io/otel/sdk/metric v1.43.0 go.opentelemetry.io/otel/trace v1.43.0 + go.opentelemetry.io/proto/otlp v1.10.0 + golang.org/x/sync v0.20.0 + google.golang.org/grpc v1.82.1 ) -require ( - github.com/99designs/gqlgen v0.17.89 // indirect - github.com/cenkalti/backoff/v5 v5.0.3 // indirect - go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploggrpc v0.19.0 // indirect - go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp v0.19.0 // indirect - go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.43.0 // indirect - go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v1.43.0 // indirect - go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.43.0 // indirect - go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.43.0 // indirect - go.opentelemetry.io/otel/log v0.19.0 // indirect - go.opentelemetry.io/otel/metric v1.43.0 // indirect - go.opentelemetry.io/otel/sdk/log v0.19.0 // indirect - go.opentelemetry.io/otel/sdk/metric v1.43.0 // indirect - go.opentelemetry.io/proto/otlp v1.10.0 // indirect - golang.org/x/sync v0.20.0 // indirect - google.golang.org/grpc v1.80.0 // indirect -) +require github.com/cenkalti/backoff/v5 v5.0.3 // indirect require ( - dagger.io/dagger v0.20.6-0.20260415192040-7058e9313c72 github.com/cespare/xxhash/v2 v2.3.0 // indirect + github.com/dagger/querybuilder v0.0.0-20260402040506-574a5e81cb59 github.com/go-logr/logr v1.4.3 // indirect github.com/go-logr/stdr v1.2.2 // indirect github.com/google/uuid v1.6.0 // indirect @@ -39,9 +37,9 @@ require ( github.com/sosodev/duration v1.4.0 // indirect go.opentelemetry.io/auto/sdk v1.2.1 // indirect go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.43.0 // indirect - golang.org/x/net v0.53.0 // indirect - golang.org/x/sys v0.43.0 // indirect - golang.org/x/text v0.36.0 // indirect + golang.org/x/net v0.55.0 // indirect + golang.org/x/sys v0.45.0 // indirect + golang.org/x/text v0.37.0 // indirect google.golang.org/genproto/googleapis/api v0.0.0-20260414002931-afd174a4e478 // indirect google.golang.org/genproto/googleapis/rpc v0.0.0-20260414002931-afd174a4e478 // indirect google.golang.org/protobuf v1.36.11 // indirect diff --git a/dagger/e2e/go.sum b/dagger/e2e/go.sum index 898c8fa..cc9ed5f 100644 --- a/dagger/e2e/go.sum +++ b/dagger/e2e/go.sum @@ -1,5 +1,3 @@ -dagger.io/dagger v0.20.6-0.20260415192040-7058e9313c72 h1:s39e07WvaUU6tLhpojK8ZEIoIbOSn5hHOJra0waenxQ= -dagger.io/dagger v0.20.6-0.20260415192040-7058e9313c72/go.mod h1:ZXg8+pQZaZUC8rAw4V/gPP8aKvKARIJZ+pfcV+RC1es= github.com/99designs/gqlgen v0.17.89 h1:KzEcxPiMgQoMw3m/E85atUEHyZyt0PbAflMia5Kw8z8= github.com/99designs/gqlgen v0.17.89/go.mod h1:GFqruTVGB7ZTdrf1uzOagpXbY7DrEt1pIxnTdhIbWvQ= github.com/Khan/genqlient v0.8.1 h1:wtOCc8N9rNynRLXN3k3CnfzheCUNKBcvXmVv5zt6WCs= @@ -14,6 +12,8 @@ github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UF github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/dagger/otel-go v1.43.0 h1:AYCnAamWmxtSxigWPTgC+8EWqiWPcDZEegh8y05gdJ8= github.com/dagger/otel-go v1.43.0/go.mod h1:83CTuXi70zcx1kaym5buqmb7RNzg1E9dEiQSFyLbLdU= +github.com/dagger/querybuilder v0.0.0-20260402040506-574a5e81cb59 h1:g6vfdGRyz6fAjfHz5FyYPZgHy8qcQ31fHrBl1iCOzxw= +github.com/dagger/querybuilder v0.0.0-20260402040506-574a5e81cb59/go.mod h1:jsdUJeYzcbyK1j/EqMGPrQgNYxl/Zfg06vvM9C/xXxs= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= @@ -75,22 +75,22 @@ go.opentelemetry.io/proto/otlp v1.10.0 h1:IQRWgT5srOCYfiWnpqUYz9CVmbO8bFmKcwYxpu go.opentelemetry.io/proto/otlp v1.10.0/go.mod h1:/CV4QoCR/S9yaPj8utp3lvQPoqMtxXdzn7ozvvozVqk= go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= -golang.org/x/net v0.53.0 h1:d+qAbo5L0orcWAr0a9JweQpjXF19LMXJE8Ey7hwOdUA= -golang.org/x/net v0.53.0/go.mod h1:JvMuJH7rrdiCfbeHoo3fCQU24Lf5JJwT9W3sJFulfgs= +golang.org/x/net v0.55.0 h1:bcvxaJn3e1U6InsFWt1JUq1aSjnRxLzT2rtD2KfkDF8= +golang.org/x/net v0.55.0/go.mod h1:L5U2KuzuOe1lY7Z+aWVIKK6qEeJXnXV9yzGA+WCHJww= golang.org/x/sync v0.20.0 h1:e0PTpb7pjO8GAtTs2dQ6jYa5BWYlMuX047Dco/pItO4= golang.org/x/sync v0.20.0/go.mod h1:9xrNwdLfx4jkKbNva9FpL6vEN7evnE43NNNJQ2LF3+0= -golang.org/x/sys v0.43.0 h1:Rlag2XtaFTxp19wS8MXlJwTvoh8ArU6ezoyFsMyCTNI= -golang.org/x/sys v0.43.0/go.mod h1:4GL1E5IUh+htKOUEOaiffhrAeqysfVGipDYzABqnCmw= -golang.org/x/text v0.36.0 h1:JfKh3XmcRPqZPKevfXVpI1wXPTqbkE5f7JA92a55Yxg= -golang.org/x/text v0.36.0/go.mod h1:NIdBknypM8iqVmPiuco0Dh6P5Jcdk8lJL0CUebqK164= +golang.org/x/sys v0.45.0 h1:dO4czNzziLiiXplLQgBCEpCvXQ3dnkn0SdaZSYdQ+FY= +golang.org/x/sys v0.45.0/go.mod h1:4GL1E5IUh+htKOUEOaiffhrAeqysfVGipDYzABqnCmw= +golang.org/x/text v0.37.0 h1:Cqjiwd9eSg8e0QAkyCaQTNHFIIzWtidPahFWR83rTrc= +golang.org/x/text v0.37.0/go.mod h1:a5sjxXGs9hsn/AJVwuElvCAo9v8QYLzvavO5z2PiM38= gonum.org/v1/gonum v0.17.0 h1:VbpOemQlsSMrYmn7T2OUvQ4dqxQXU+ouZFQsZOx50z4= gonum.org/v1/gonum v0.17.0/go.mod h1:El3tOrEuMpv2UdMrbNlKEh9vd86bmQ6vqIcDwxEOc1E= google.golang.org/genproto/googleapis/api v0.0.0-20260414002931-afd174a4e478 h1:yQugLulqltosq0B/f8l4w9VryjV+N/5gcW0jQ3N8Qec= google.golang.org/genproto/googleapis/api v0.0.0-20260414002931-afd174a4e478/go.mod h1:C6ADNqOxbgdUUeRTU+LCHDPB9ttAMCTff6auwCVa4uc= google.golang.org/genproto/googleapis/rpc v0.0.0-20260414002931-afd174a4e478 h1:RmoJA1ujG+/lRGNfUnOMfhCy5EipVMyvUE+KNbPbTlw= google.golang.org/genproto/googleapis/rpc v0.0.0-20260414002931-afd174a4e478/go.mod h1:4Hqkh8ycfw05ld/3BWL7rJOSfebL2Q+DVDeRgYgxUU8= -google.golang.org/grpc v1.80.0 h1:Xr6m2WmWZLETvUNvIUmeD5OAagMw3FiKmMlTdViWsHM= -google.golang.org/grpc v1.80.0/go.mod h1:ho/dLnxwi3EDJA4Zghp7k2Ec1+c2jqup0bFkw07bwF4= +google.golang.org/grpc v1.82.1 h1:NnAxzGRA0677vCa4BUkOAnO5+FfQqVl9iUXeD0IqcGE= +google.golang.org/grpc v1.82.1/go.mod h1:yzTZ1TB1Z3SG+LIYaI+WiE8D5+PZ3ArnrSp8zF3+/ZA= google.golang.org/protobuf v1.36.11 h1:fV6ZwhNocDyBLK0dj+fg8ektcVegBBuEolpbTQyBNVE= google.golang.org/protobuf v1.36.11/go.mod h1:HTf+CrKn2C3g5S8VImy6tdcUvCska2kB7j23XfzDpco= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= diff --git a/dagger/gotest/dagger.json b/dagger/gotest/dagger.json index 7c9937c..71d583d 100644 --- a/dagger/gotest/dagger.json +++ b/dagger/gotest/dagger.json @@ -1,6 +1,6 @@ { "name": "gotest", - "engineVersion": "v0.20.6", + "engineVersion": "v0.21.8", "sdk": { "source": "go" }, diff --git a/dagger/gotest/go.mod b/dagger/gotest/go.mod index dfc9259..ea24f64 100644 --- a/dagger/gotest/go.mod +++ b/dagger/gotest/go.mod @@ -1,6 +1,6 @@ module dagger/gotest -go 1.25.0 +go 1.26.1 require ( github.com/Khan/genqlient v0.8.1 @@ -22,12 +22,12 @@ require ( go.opentelemetry.io/otel/sdk/log v0.19.0 // indirect go.opentelemetry.io/proto/otlp v1.10.0 // indirect golang.org/x/sync v0.20.0 // indirect - google.golang.org/grpc v1.80.0 // indirect + google.golang.org/grpc v1.82.1 // indirect ) require ( - dagger.io/dagger v0.20.6-0.20260415192040-7058e9313c72 github.com/cespare/xxhash/v2 v2.3.0 // indirect + github.com/dagger/querybuilder v0.0.0-20260402040506-574a5e81cb59 github.com/go-logr/logr v1.4.3 // indirect github.com/go-logr/stdr v1.2.2 // indirect github.com/google/uuid v1.6.0 // indirect @@ -39,9 +39,9 @@ require ( go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.43.0 // indirect go.opentelemetry.io/otel/metric v1.43.0 // indirect go.opentelemetry.io/otel/sdk/metric v1.43.0 // indirect - golang.org/x/net v0.53.0 // indirect - golang.org/x/sys v0.43.0 // indirect - golang.org/x/text v0.36.0 // indirect + golang.org/x/net v0.55.0 // indirect + golang.org/x/sys v0.45.0 // indirect + golang.org/x/text v0.37.0 // indirect google.golang.org/genproto/googleapis/api v0.0.0-20260414002931-afd174a4e478 // indirect google.golang.org/genproto/googleapis/rpc v0.0.0-20260414002931-afd174a4e478 // indirect google.golang.org/protobuf v1.36.11 // indirect diff --git a/dagger/gotest/go.sum b/dagger/gotest/go.sum index 898c8fa..cc9ed5f 100644 --- a/dagger/gotest/go.sum +++ b/dagger/gotest/go.sum @@ -1,5 +1,3 @@ -dagger.io/dagger v0.20.6-0.20260415192040-7058e9313c72 h1:s39e07WvaUU6tLhpojK8ZEIoIbOSn5hHOJra0waenxQ= -dagger.io/dagger v0.20.6-0.20260415192040-7058e9313c72/go.mod h1:ZXg8+pQZaZUC8rAw4V/gPP8aKvKARIJZ+pfcV+RC1es= github.com/99designs/gqlgen v0.17.89 h1:KzEcxPiMgQoMw3m/E85atUEHyZyt0PbAflMia5Kw8z8= github.com/99designs/gqlgen v0.17.89/go.mod h1:GFqruTVGB7ZTdrf1uzOagpXbY7DrEt1pIxnTdhIbWvQ= github.com/Khan/genqlient v0.8.1 h1:wtOCc8N9rNynRLXN3k3CnfzheCUNKBcvXmVv5zt6WCs= @@ -14,6 +12,8 @@ github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UF github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/dagger/otel-go v1.43.0 h1:AYCnAamWmxtSxigWPTgC+8EWqiWPcDZEegh8y05gdJ8= github.com/dagger/otel-go v1.43.0/go.mod h1:83CTuXi70zcx1kaym5buqmb7RNzg1E9dEiQSFyLbLdU= +github.com/dagger/querybuilder v0.0.0-20260402040506-574a5e81cb59 h1:g6vfdGRyz6fAjfHz5FyYPZgHy8qcQ31fHrBl1iCOzxw= +github.com/dagger/querybuilder v0.0.0-20260402040506-574a5e81cb59/go.mod h1:jsdUJeYzcbyK1j/EqMGPrQgNYxl/Zfg06vvM9C/xXxs= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= @@ -75,22 +75,22 @@ go.opentelemetry.io/proto/otlp v1.10.0 h1:IQRWgT5srOCYfiWnpqUYz9CVmbO8bFmKcwYxpu go.opentelemetry.io/proto/otlp v1.10.0/go.mod h1:/CV4QoCR/S9yaPj8utp3lvQPoqMtxXdzn7ozvvozVqk= go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= -golang.org/x/net v0.53.0 h1:d+qAbo5L0orcWAr0a9JweQpjXF19LMXJE8Ey7hwOdUA= -golang.org/x/net v0.53.0/go.mod h1:JvMuJH7rrdiCfbeHoo3fCQU24Lf5JJwT9W3sJFulfgs= +golang.org/x/net v0.55.0 h1:bcvxaJn3e1U6InsFWt1JUq1aSjnRxLzT2rtD2KfkDF8= +golang.org/x/net v0.55.0/go.mod h1:L5U2KuzuOe1lY7Z+aWVIKK6qEeJXnXV9yzGA+WCHJww= golang.org/x/sync v0.20.0 h1:e0PTpb7pjO8GAtTs2dQ6jYa5BWYlMuX047Dco/pItO4= golang.org/x/sync v0.20.0/go.mod h1:9xrNwdLfx4jkKbNva9FpL6vEN7evnE43NNNJQ2LF3+0= -golang.org/x/sys v0.43.0 h1:Rlag2XtaFTxp19wS8MXlJwTvoh8ArU6ezoyFsMyCTNI= -golang.org/x/sys v0.43.0/go.mod h1:4GL1E5IUh+htKOUEOaiffhrAeqysfVGipDYzABqnCmw= -golang.org/x/text v0.36.0 h1:JfKh3XmcRPqZPKevfXVpI1wXPTqbkE5f7JA92a55Yxg= -golang.org/x/text v0.36.0/go.mod h1:NIdBknypM8iqVmPiuco0Dh6P5Jcdk8lJL0CUebqK164= +golang.org/x/sys v0.45.0 h1:dO4czNzziLiiXplLQgBCEpCvXQ3dnkn0SdaZSYdQ+FY= +golang.org/x/sys v0.45.0/go.mod h1:4GL1E5IUh+htKOUEOaiffhrAeqysfVGipDYzABqnCmw= +golang.org/x/text v0.37.0 h1:Cqjiwd9eSg8e0QAkyCaQTNHFIIzWtidPahFWR83rTrc= +golang.org/x/text v0.37.0/go.mod h1:a5sjxXGs9hsn/AJVwuElvCAo9v8QYLzvavO5z2PiM38= gonum.org/v1/gonum v0.17.0 h1:VbpOemQlsSMrYmn7T2OUvQ4dqxQXU+ouZFQsZOx50z4= gonum.org/v1/gonum v0.17.0/go.mod h1:El3tOrEuMpv2UdMrbNlKEh9vd86bmQ6vqIcDwxEOc1E= google.golang.org/genproto/googleapis/api v0.0.0-20260414002931-afd174a4e478 h1:yQugLulqltosq0B/f8l4w9VryjV+N/5gcW0jQ3N8Qec= google.golang.org/genproto/googleapis/api v0.0.0-20260414002931-afd174a4e478/go.mod h1:C6ADNqOxbgdUUeRTU+LCHDPB9ttAMCTff6auwCVa4uc= google.golang.org/genproto/googleapis/rpc v0.0.0-20260414002931-afd174a4e478 h1:RmoJA1ujG+/lRGNfUnOMfhCy5EipVMyvUE+KNbPbTlw= google.golang.org/genproto/googleapis/rpc v0.0.0-20260414002931-afd174a4e478/go.mod h1:4Hqkh8ycfw05ld/3BWL7rJOSfebL2Q+DVDeRgYgxUU8= -google.golang.org/grpc v1.80.0 h1:Xr6m2WmWZLETvUNvIUmeD5OAagMw3FiKmMlTdViWsHM= -google.golang.org/grpc v1.80.0/go.mod h1:ho/dLnxwi3EDJA4Zghp7k2Ec1+c2jqup0bFkw07bwF4= +google.golang.org/grpc v1.82.1 h1:NnAxzGRA0677vCa4BUkOAnO5+FfQqVl9iUXeD0IqcGE= +google.golang.org/grpc v1.82.1/go.mod h1:yzTZ1TB1Z3SG+LIYaI+WiE8D5+PZ3ArnrSp8zF3+/ZA= google.golang.org/protobuf v1.36.11 h1:fV6ZwhNocDyBLK0dj+fg8ektcVegBBuEolpbTQyBNVE= google.golang.org/protobuf v1.36.11/go.mod h1:HTf+CrKn2C3g5S8VImy6tdcUvCska2kB7j23XfzDpco= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= diff --git a/go.mod b/go.mod index a4bd7f2..84565bc 100644 --- a/go.mod +++ b/go.mod @@ -1,33 +1,33 @@ module github.com/cloudnative-pg/plugin-barman-cloud -go 1.26.3 +go 1.26.4 require ( - github.com/cert-manager/cert-manager v1.20.2 - github.com/cloudnative-pg/api v1.29.1 - github.com/cloudnative-pg/barman-cloud v0.5.1 - github.com/cloudnative-pg/cloudnative-pg v1.29.1 - github.com/cloudnative-pg/cnpg-i v0.5.0 + github.com/cert-manager/cert-manager v1.21.1 + github.com/cloudnative-pg/api v1.30.0 + github.com/cloudnative-pg/barman-cloud v0.6.0 + github.com/cloudnative-pg/cloudnative-pg v1.30.0 + github.com/cloudnative-pg/cnpg-i v0.6.0 github.com/cloudnative-pg/cnpg-i-machinery v0.4.2 - github.com/cloudnative-pg/machinery v0.4.0 - github.com/onsi/ginkgo/v2 v2.29.0 - github.com/onsi/gomega v1.41.0 + github.com/cloudnative-pg/machinery v0.6.0 + github.com/onsi/ginkgo/v2 v2.32.1 + github.com/onsi/gomega v1.43.0 github.com/spf13/cobra v1.10.2 github.com/spf13/viper v1.21.0 - google.golang.org/grpc v1.81.1 + google.golang.org/grpc v1.83.2 gopkg.in/yaml.v3 v3.0.1 - k8s.io/api v0.36.1 - k8s.io/apiextensions-apiserver v0.36.1 - k8s.io/apimachinery v0.36.1 - k8s.io/client-go v0.36.1 - k8s.io/utils v0.0.0-20260507154919-ff6756f316d2 + k8s.io/api v0.37.0 + k8s.io/apiextensions-apiserver v0.37.0 + k8s.io/apimachinery v0.37.0 + k8s.io/client-go v0.37.0 + k8s.io/utils v0.0.0-20260707023825-cf1189d6abe3 sigs.k8s.io/controller-runtime v0.24.1 sigs.k8s.io/kustomize/api v0.21.1 sigs.k8s.io/kustomize/kyaml v0.21.1 ) require ( - cel.dev/expr v0.25.1 // indirect + cel.dev/expr v0.25.2 // indirect github.com/Masterminds/semver/v3 v3.5.0 // indirect github.com/antlr4-go/antlr/v4 v4.13.1 // indirect github.com/avast/retry-go/v5 v5.0.0 // indirect @@ -40,38 +40,38 @@ require ( github.com/evanphx/json-patch/v5 v5.9.11 // indirect github.com/felixge/httpsnoop v1.0.4 // indirect github.com/fsnotify/fsnotify v1.9.0 // indirect - github.com/fxamacker/cbor/v2 v2.9.1 // indirect + github.com/fxamacker/cbor/v2 v2.9.2 // indirect github.com/go-errors/errors v1.5.1 // indirect - github.com/go-logr/logr v1.4.3 // indirect + github.com/go-logr/logr v1.4.4 // indirect github.com/go-logr/stdr v1.2.2 // indirect github.com/go-logr/zapr v1.3.0 // indirect - github.com/go-openapi/jsonpointer v0.23.1 // indirect - github.com/go-openapi/jsonreference v0.21.5 // indirect - github.com/go-openapi/swag v0.26.0 // indirect - github.com/go-openapi/swag/cmdutils v0.26.0 // indirect - github.com/go-openapi/swag/conv v0.26.0 // indirect - github.com/go-openapi/swag/fileutils v0.26.0 // indirect - github.com/go-openapi/swag/jsonname v0.26.0 // indirect - github.com/go-openapi/swag/jsonutils v0.26.0 // indirect - github.com/go-openapi/swag/loading v0.26.0 // indirect - github.com/go-openapi/swag/mangling v0.26.0 // indirect - github.com/go-openapi/swag/netutils v0.26.0 // indirect - github.com/go-openapi/swag/stringutils v0.26.0 // indirect - github.com/go-openapi/swag/typeutils v0.26.0 // indirect - github.com/go-openapi/swag/yamlutils v0.26.0 // indirect + github.com/go-openapi/jsonpointer v1.0.0 // indirect + github.com/go-openapi/jsonreference v1.0.0 // indirect + github.com/go-openapi/swag v0.27.1 // indirect + github.com/go-openapi/swag/cmdutils v0.27.1 // indirect + github.com/go-openapi/swag/conv v0.27.1 // indirect + github.com/go-openapi/swag/fileutils v0.27.1 // indirect + github.com/go-openapi/swag/jsonutils v0.27.1 // indirect + github.com/go-openapi/swag/loading v0.27.1 // indirect + github.com/go-openapi/swag/mangling v0.27.1 // indirect + github.com/go-openapi/swag/netutils v0.27.1 // indirect + github.com/go-openapi/swag/pools v0.27.1 // indirect + github.com/go-openapi/swag/stringutils v0.27.1 // indirect + github.com/go-openapi/swag/typeutils v0.27.1 // indirect + github.com/go-openapi/swag/yamlutils v0.27.1 // indirect github.com/go-task/slim-sprig/v3 v3.0.0 // indirect github.com/go-viper/mapstructure/v2 v2.4.0 // indirect - github.com/google/cel-go v0.26.0 // indirect + github.com/google/cel-go v0.29.2 // indirect github.com/google/gnostic-models v0.7.1 // indirect github.com/google/go-cmp v0.7.0 // indirect github.com/google/pprof v0.0.0-20260402051712-545e8a4df936 // indirect github.com/google/uuid v1.6.0 // indirect github.com/gorilla/websocket v1.5.4-0.20250319132907-e064f32e3674 // indirect github.com/grpc-ecosystem/go-grpc-middleware/v2 v2.3.3 // indirect - github.com/grpc-ecosystem/grpc-gateway/v2 v2.27.7 // indirect + github.com/grpc-ecosystem/grpc-gateway/v2 v2.29.0 // indirect github.com/inconshreveable/mousetrap v1.1.0 // indirect github.com/json-iterator/go v1.1.12 // indirect - github.com/kubernetes-csi/external-snapshotter/client/v8 v8.4.0 // indirect + github.com/kubernetes-csi/external-snapshotter/client/v8 v8.6.0 // indirect github.com/lib/pq v1.12.3 // indirect github.com/moby/spdystream v0.5.1 // indirect github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect @@ -80,60 +80,59 @@ require ( github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect github.com/pelletier/go-toml/v2 v2.2.4 // indirect github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect - github.com/prometheus-operator/prometheus-operator/pkg/apis/monitoring v0.87.1 // indirect - github.com/prometheus/client_golang v1.23.2 // indirect + github.com/prometheus-operator/prometheus-operator/pkg/apis/monitoring v0.92.0 // indirect + github.com/prometheus/client_golang v1.24.0 // indirect github.com/prometheus/client_model v0.6.2 // indirect - github.com/prometheus/common v0.67.5 // indirect - github.com/prometheus/procfs v0.19.2 // indirect + github.com/prometheus/common v0.70.0 // indirect + github.com/prometheus/procfs v0.21.1 // indirect github.com/sagikazarmark/locafero v0.11.0 // indirect github.com/snorwin/jsonpatch v1.5.0 // indirect github.com/sourcegraph/conc v0.3.1-0.20240121214520-5f936abd7ae8 // indirect github.com/spf13/afero v1.15.0 // indirect github.com/spf13/cast v1.10.0 // indirect github.com/spf13/pflag v1.0.10 // indirect - github.com/stoewer/go-strcase v1.3.1 // indirect github.com/subosito/gotenv v1.6.0 // indirect github.com/thoas/go-funk v0.9.3 // indirect github.com/x448/float16 v0.8.4 // indirect github.com/xlab/treeprint v1.2.0 // indirect go.opentelemetry.io/auto/sdk v1.2.1 // indirect - go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.65.0 // indirect - go.opentelemetry.io/otel v1.43.0 // indirect - go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.40.0 // indirect - go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.40.0 // indirect - go.opentelemetry.io/otel/metric v1.43.0 // indirect - go.opentelemetry.io/otel/sdk v1.43.0 // indirect - go.opentelemetry.io/otel/trace v1.43.0 // indirect - go.opentelemetry.io/proto/otlp v1.9.0 // indirect + go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.69.0 // indirect + go.opentelemetry.io/otel v1.44.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.44.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.44.0 // indirect + go.opentelemetry.io/otel/metric v1.44.0 // indirect + go.opentelemetry.io/otel/sdk v1.44.0 // indirect + go.opentelemetry.io/otel/trace v1.44.0 // indirect + go.opentelemetry.io/proto/otlp v1.10.0 // indirect go.uber.org/multierr v1.11.0 // indirect go.uber.org/zap v1.28.0 // indirect go.yaml.in/yaml/v2 v2.4.4 // indirect go.yaml.in/yaml/v3 v3.0.4 // indirect - golang.org/x/exp v0.0.0-20251219203646-944ab1f22d93 // indirect - golang.org/x/mod v0.35.0 // indirect - golang.org/x/net v0.53.0 // indirect + golang.org/x/exp v0.0.0-20260410095643-746e56fc9e2f // indirect + golang.org/x/mod v0.38.0 // indirect + golang.org/x/net v0.58.0 // indirect golang.org/x/oauth2 v0.36.0 // indirect - golang.org/x/sync v0.20.0 // indirect - golang.org/x/sys v0.43.0 // indirect - golang.org/x/term v0.42.0 // indirect - golang.org/x/text v0.36.0 // indirect + golang.org/x/sync v0.22.0 // indirect + golang.org/x/sys v0.47.0 // indirect + golang.org/x/term v0.45.0 // indirect + golang.org/x/text v0.41.0 // indirect golang.org/x/time v0.15.0 // indirect - golang.org/x/tools v0.44.0 // indirect + golang.org/x/tools v0.48.0 // indirect gomodules.xyz/jsonpatch/v2 v2.5.0 // indirect - google.golang.org/genproto/googleapis/api v0.0.0-20260226221140-a57be14db171 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20260319201613-d00831a3d3e7 // indirect + google.golang.org/genproto/googleapis/api v0.0.0-20260526163538-3dc84a4a5aaa // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20260610212136-7ab31c22f7ad // indirect google.golang.org/protobuf v1.36.12-0.20260120151049-f2248ac996af // indirect gopkg.in/evanphx/json-patch.v4 v4.13.0 // indirect gopkg.in/inf.v0 v0.9.1 // indirect - k8s.io/apiserver v0.36.1 // indirect - k8s.io/component-base v0.36.1 // indirect + k8s.io/apiserver v0.37.0 // indirect + k8s.io/component-base v0.37.0 // indirect k8s.io/klog/v2 v2.140.0 // indirect - k8s.io/kube-openapi v0.0.0-20260502001324-b7f5293f4787 // indirect - k8s.io/streaming v0.36.1 // indirect - sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.34.0 // indirect - sigs.k8s.io/gateway-api v1.5.0 // indirect + k8s.io/kube-openapi v0.0.0-20260721132016-d427ff9ee9ad // indirect + k8s.io/streaming v0.37.0 // indirect + sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.36.0 // indirect + sigs.k8s.io/gateway-api v1.6.0 // indirect sigs.k8s.io/json v0.0.0-20250730193827-2d320260d730 // indirect sigs.k8s.io/randfill v1.0.0 // indirect - sigs.k8s.io/structured-merge-diff/v6 v6.4.0 // indirect + sigs.k8s.io/structured-merge-diff/v6 v6.4.2 // indirect sigs.k8s.io/yaml v1.6.0 // indirect ) diff --git a/go.sum b/go.sum index a1d35fe..4607e0c 100644 --- a/go.sum +++ b/go.sum @@ -1,5 +1,5 @@ -cel.dev/expr v0.25.1 h1:1KrZg61W6TWSxuNZ37Xy49ps13NUovb66QLprthtwi4= -cel.dev/expr v0.25.1/go.mod h1:hrXvqGP6G6gyx8UAHSHJ5RGk//1Oj5nXQ2NI02Nrsg4= +cel.dev/expr v0.25.2 h1:K6j46C81hXtZQfuX60cVWQFBJahKSE2gfRbNuvr5bFs= +cel.dev/expr v0.25.2/go.mod h1:hrXvqGP6G6gyx8UAHSHJ5RGk//1Oj5nXQ2NI02Nrsg4= github.com/Masterminds/semver/v3 v3.5.0 h1:kQceYJfbupGfZOKZQg0kou0DgAKhzDg2NZPAwZ/2OOE= github.com/Masterminds/semver/v3 v3.5.0/go.mod h1:4V+yj/TJE1HU9XfppCwVMZq3I84lprf4nC11bSS5beM= github.com/antlr4-go/antlr/v4 v4.13.1 h1:SqQKkuVZ+zWkMMNkjy5FZe5mr5WURWnlpmOuzYWrPrQ= @@ -14,22 +14,22 @@ github.com/blang/semver/v4 v4.0.0 h1:1PFHFE6yCCTv8C1TeyNNarDzntLi7wMI5i/pzqYIsAM github.com/blang/semver/v4 v4.0.0/go.mod h1:IbckMUScFkM3pff0VJDNKRiT6TG/YpiHIM2yvyW5YoQ= github.com/cenkalti/backoff/v5 v5.0.3 h1:ZN+IMa753KfX5hd8vVaMixjnqRZ3y8CuJKRKj1xcsSM= github.com/cenkalti/backoff/v5 v5.0.3/go.mod h1:rkhZdG3JZukswDf7f0cwqPNk4K0sa+F97BxZthm/crw= -github.com/cert-manager/cert-manager v1.20.2 h1:CimnY00nLqB2lmxhoSuEC4GDMFDK7JCXqyjwMM9ndIQ= -github.com/cert-manager/cert-manager v1.20.2/go.mod h1:1g/+a/WK5zWH/dXPZa3dMD3aJQJNRXQu+PN17C6WrOw= +github.com/cert-manager/cert-manager v1.21.1 h1:0LttV37Q5c2CBNoHkjuI8sLKTXWZDC2SwQkxrBMKV9w= +github.com/cert-manager/cert-manager v1.21.1/go.mod h1:sVwmLBWoiB1BRd0rJElBGQuiu94z4k7p3Kd0FRQyfgw= github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= -github.com/cloudnative-pg/api v1.29.1 h1:FWr8S7EQeOfdhYXyr2cof8wUXLARZiiQt5Qa6ltED7w= -github.com/cloudnative-pg/api v1.29.1/go.mod h1:QtWF3yzSvIfORMHaSkPAk/o3bhCJwEHJgN3riyRiz3o= -github.com/cloudnative-pg/barman-cloud v0.5.1 h1:vjkXrrxo2DQXHT9u9usqhtaHiPZ/lTfDVs/pIWYTepQ= -github.com/cloudnative-pg/barman-cloud v0.5.1/go.mod h1:XPc5IUFP1y4cZX1sg+Pd8j9V4tmUEVnv3BGCpfQOOg8= -github.com/cloudnative-pg/cloudnative-pg v1.29.1 h1:ZNEt1TMlnQKXI1kho2UqQuqdfvIvjGln4kN7C1lsmGA= -github.com/cloudnative-pg/cloudnative-pg v1.29.1/go.mod h1:Sbgx9jVmkle4/gR2U5JHrzDd74sRPOBHDtPkvncg5v8= -github.com/cloudnative-pg/cnpg-i v0.5.0 h1:/TOzpNT6cwNgrpftTtrnLKdoHgMwd+88vZgXjlVgXeE= -github.com/cloudnative-pg/cnpg-i v0.5.0/go.mod h1:7Gh4+UzhBpGhr4DreB1GN9wGYfvxwXCXZUyVt3zE/3I= +github.com/cloudnative-pg/api v1.30.0 h1:L8hnvV/tPEQA1xYEi41FUBFA7FUNVGju8+SlgFlDDjI= +github.com/cloudnative-pg/api v1.30.0/go.mod h1:XrKBbOWObL33si0FNuwX4uHNf5JShiZyOUqd6LxbJQo= +github.com/cloudnative-pg/barman-cloud v0.6.0 h1:OtBFmCDyVUAcgFa++FIoCCJwPfd5TtqK3PH6DGPcpkA= +github.com/cloudnative-pg/barman-cloud v0.6.0/go.mod h1:eqSPRGz/s8M0Mea8mkqiVQUTkoSquAhvJF49feh+Ks4= +github.com/cloudnative-pg/cloudnative-pg v1.30.0 h1:fnhVq44xXx97MNiuvJsPrX1vSjYbgdyBK5MSGfdHdp0= +github.com/cloudnative-pg/cloudnative-pg v1.30.0/go.mod h1:QkolwBOWZ+GvAiJt6KpDSymwkpf0K19/p4Q6MQlTM8U= +github.com/cloudnative-pg/cnpg-i v0.6.0 h1:LA//DLkFOLIjU0ASOpFkydZhGir9IAIDfgSsTTX9IpU= +github.com/cloudnative-pg/cnpg-i v0.6.0/go.mod h1:4kcpLAj+feMTnh0TVadXRASdVnEhBytNSm/BvktLgmI= github.com/cloudnative-pg/cnpg-i-machinery v0.4.2 h1:0reS9MtyLYINHXQ/MfxJ9jp39hhBf8e3Qdj+T5Nsq6I= github.com/cloudnative-pg/cnpg-i-machinery v0.4.2/go.mod h1:gvrKabgxXq0zGthXGucemDdsxakLEQDMxn43M4HLW30= -github.com/cloudnative-pg/machinery v0.4.0 h1:3sfqrBptH4QQSVB4g10Z+7aiQRnh4g+6AsqsK0ibKaQ= -github.com/cloudnative-pg/machinery v0.4.0/go.mod h1:OIwaTYAnLv8PmBmBvEf0BvMK2JBX6J+naTMg9UgV1FQ= +github.com/cloudnative-pg/machinery v0.6.0 h1:faHxS1AK75XkzppOcAKdOexKmzX7iGK6jX2b9itssb4= +github.com/cloudnative-pg/machinery v0.6.0/go.mod h1:wyw9E/0uYGAixp9+0PLsJ6qHiEiFKDkeXb9O2dRi2w0= github.com/cpuguy83/go-md2man/v2 v2.0.6/go.mod h1:oOW0eioCTA6cOiMLiUPZOpcVxMig6NIQQ7OS05n1F4g= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= @@ -47,8 +47,8 @@ github.com/frankban/quicktest v1.14.6 h1:7Xjx+VpznH+oBnejlPUj8oUpdxnVs4f8XU8WnHk github.com/frankban/quicktest v1.14.6/go.mod h1:4ptaffx2x8+WTWXmUCuVU6aPUX1/Mz7zb5vbUoiM6w0= github.com/fsnotify/fsnotify v1.9.0 h1:2Ml+OJNzbYCTzsxtv8vKSFD9PbJjmhYF14k/jKC7S9k= github.com/fsnotify/fsnotify v1.9.0/go.mod h1:8jBTzvmWwFyi3Pb8djgCCO5IBqzKJ/Jwo8TRcHyHii0= -github.com/fxamacker/cbor/v2 v2.9.1 h1:2rWm8B193Ll4VdjsJY28jxs70IdDsHRWgQYAI80+rMQ= -github.com/fxamacker/cbor/v2 v2.9.1/go.mod h1:vM4b+DJCtHn+zz7h3FFp/hDAI9WNWCsZj23V5ytsSxQ= +github.com/fxamacker/cbor/v2 v2.9.2 h1:X4Ksno9+x3cz0TZv69ec1hxP/+tymuR8PXQJyDwfh78= +github.com/fxamacker/cbor/v2 v2.9.2/go.mod h1:vM4b+DJCtHn+zz7h3FFp/hDAI9WNWCsZj23V5ytsSxQ= github.com/gkampitakis/ciinfo v0.3.2 h1:JcuOPk8ZU7nZQjdUhctuhQofk7BGHuIy0c9Ez8BNhXs= github.com/gkampitakis/ciinfo v0.3.2/go.mod h1:1NIwaOcFChN4fa/B0hEBdAb6npDlFL8Bwx4dfRLRqAo= github.com/gkampitakis/go-diff v1.3.2 h1:Qyn0J9XJSDTgnsgHRdz9Zp24RaJeKMUHg2+PDZZdC4M= @@ -60,46 +60,46 @@ github.com/go-errors/errors v1.5.1/go.mod h1:sIVyrIiJhuEF+Pj9Ebtd6P/rEYROXFi3Bop github.com/go-faker/faker/v4 v4.4.1 h1:LY1jDgjVkBZWIhATCt+gkl0x9i/7wC61gZx73GTFb+Q= github.com/go-faker/faker/v4 v4.4.1/go.mod h1:HRLrjis+tYsbFtIHufEPTAIzcZiRu0rS9EYl2Ccwme4= github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-logr/logr v1.4.3 h1:CjnDlHq8ikf6E492q6eKboGOC0T8CDaOvkHCIg8idEI= -github.com/go-logr/logr v1.4.3/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= +github.com/go-logr/logr v1.4.4 h1:tG4xh9yMsRCAiodLVTxyrkzSZ9+o0L1Kg/+cPVcbP/8= +github.com/go-logr/logr v1.4.4/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= github.com/go-logr/zapr v1.3.0 h1:XGdV8XW8zdwFiwOA2Dryh1gj2KRQyOOoNmBy4EplIcQ= github.com/go-logr/zapr v1.3.0/go.mod h1:YKepepNBd1u/oyhd/yQmtjVXmm9uML4IXUgMOwR8/Gg= -github.com/go-openapi/jsonpointer v0.23.1 h1:1HBACs7XIwR2RcmItfdSFlALhGbe6S92p0ry4d1GWg4= -github.com/go-openapi/jsonpointer v0.23.1/go.mod h1:iWRmZTrGn7XwYhtPt/fvdSFj1OfNBngqRT2UG3BxSqY= -github.com/go-openapi/jsonreference v0.21.5 h1:6uCGVXU/aNF13AQNggxfysJ+5ZcU4nEAe+pJyVWRdiE= -github.com/go-openapi/jsonreference v0.21.5/go.mod h1:u25Bw85sX4E2jzFodh1FOKMTZLcfifd1Q+iKKOUxExw= -github.com/go-openapi/swag v0.26.0 h1:GVDXCmfvhfu1BxiHo8/FA+BbKmhecHnG3varjON5/RI= -github.com/go-openapi/swag v0.26.0/go.mod h1:82g3193sZJRbocs7bNCqGfIgq8pkuwVwCfhKIRlEQF0= -github.com/go-openapi/swag/cmdutils v0.26.0 h1:iowihOcvq7y4egO8cOq0dmfohz6wfeQ63U1EnuhO2TU= -github.com/go-openapi/swag/cmdutils v0.26.0/go.mod h1:Sm1MVFMkF6guJJ+pQqHnQA3N0j9qALV3NxzDSv6bETM= -github.com/go-openapi/swag/conv v0.26.0 h1:5yGGsPYI1ZCva93U0AoKi/iZrNhaJEjr324YVsiD89I= -github.com/go-openapi/swag/conv v0.26.0/go.mod h1:tpAmIL7X58VPnHHiSO4uE3jBeRamGsFsfdDeDtb5ECE= -github.com/go-openapi/swag/fileutils v0.26.0 h1:WJoPRvsA7QRiiWluowkLJa9jaYR7FCuxmDvnCgaRRxU= -github.com/go-openapi/swag/fileutils v0.26.0/go.mod h1:0WDJ7lp67eNjPMO50wAWYlKvhOb6CQ37rzR7wrgI8Tc= -github.com/go-openapi/swag/jsonname v0.26.0 h1:gV1NFX9M8avo0YSpmWogqfQISigCmpaiNci8cGECU5w= -github.com/go-openapi/swag/jsonname v0.26.0/go.mod h1:urBBR8bZNoDYGr653ynhIx+gTeIz0ARZxHkAPktJK2M= -github.com/go-openapi/swag/jsonutils v0.26.0 h1:FawFML2iAXsPqmERscuMPIHmFsoP1tOqWkxBaKNMsnA= -github.com/go-openapi/swag/jsonutils v0.26.0/go.mod h1:2VmA0CJlyFqgawOaPI9psnjFDqzyivIqLYN34t9p91E= -github.com/go-openapi/swag/jsonutils/fixtures_test v0.26.0 h1:apqeINu/ICHouqiRZbyFvuDge5jCmmLTqGQ9V95EaOM= -github.com/go-openapi/swag/jsonutils/fixtures_test v0.26.0/go.mod h1:AyM6QT8uz5IdKxk5akv0y6u4QvcL9GWERt0Jx/F/R8Y= -github.com/go-openapi/swag/loading v0.26.0 h1:Apg6zaKhCJurpJer0DCxq99qwmhFddBhaMX7kilDcko= -github.com/go-openapi/swag/loading v0.26.0/go.mod h1:dBxQ/6V2uBaAQdevN18VELE6xSpJWZxLX4txe12JwDg= -github.com/go-openapi/swag/mangling v0.26.0 h1:Du2YC4YLA/Y5m/YKQd7AnY5qq0wRKSFZTTt8ktFaXcQ= -github.com/go-openapi/swag/mangling v0.26.0/go.mod h1:jifS7W9vbg+pw63bT+GI53otluMQL3CeemuyCHKwVx0= -github.com/go-openapi/swag/netutils v0.26.0 h1:CmZp+ZT7HrmFwrC3GdGsXBq2+42T1bjKBapcqVpIs3c= -github.com/go-openapi/swag/netutils v0.26.0/go.mod h1:5iK+Ok3ZohWWex1C50BFTPexi03UaPwjW4Oj8kgrpwo= -github.com/go-openapi/swag/stringutils v0.26.0 h1:qZQngLxs5s7SLijc3N2ZO+fUq2o8LjuWAASSrJuh+xg= -github.com/go-openapi/swag/stringutils v0.26.0/go.mod h1:sWn5uY+QIIspwPhvgnqJsH8xqFT2ZbYcvbcFanRyhFE= -github.com/go-openapi/swag/typeutils v0.26.0 h1:2kdEwdiNWy+JJdOvu5MA2IIg2SylWAFuuyQIKYybfq4= -github.com/go-openapi/swag/typeutils v0.26.0/go.mod h1:oovDuIUvTrEHVMqWilQzKzV4YlSKgyZmFh7AlfABNVE= -github.com/go-openapi/swag/yamlutils v0.26.0 h1:H7O8l/8NJJQ/oiReEN+oMpnGMyt8G0hl460nRZxhLMQ= -github.com/go-openapi/swag/yamlutils v0.26.0/go.mod h1:1evKEGAtP37Pkwcc7EWMF0hedX0/x3Rkvei2wtG/TbU= -github.com/go-openapi/testify/enable/yaml/v2 v2.4.2 h1:5zRca5jw7lzVREKCZVNBpysDNBjj74rBh0N2BGQbSR0= -github.com/go-openapi/testify/enable/yaml/v2 v2.4.2/go.mod h1:XVevPw5hUXuV+5AkI1u1PeAm27EQVrhXTTCPAF85LmE= -github.com/go-openapi/testify/v2 v2.4.2 h1:tiByHpvE9uHrrKjOszax7ZvKB7QOgizBWGBLuq0ePx4= -github.com/go-openapi/testify/v2 v2.4.2/go.mod h1:SgsVHtfooshd0tublTtJ50FPKhujf47YRqauXXOUxfw= +github.com/go-openapi/jsonpointer v1.0.0 h1:kR9tHqY0CtZaOPVFm622dPVNhrvYpwr4uCxgL3h1H8s= +github.com/go-openapi/jsonpointer v1.0.0/go.mod h1:Z3rw7dWu1p9IgitXCFamSlA5lmDiklEB6vkaxcNZW5Y= +github.com/go-openapi/jsonreference v1.0.0 h1:jlmTr6torcd1YgDQvSfNmRtKzYDO4FGBkrAdlAVWnpY= +github.com/go-openapi/jsonreference v1.0.0/go.mod h1:jtwdyGbJk0Xhe5Y+rwtglQP6Sb1WZST4rT32LWB+sv0= +github.com/go-openapi/swag v0.27.1 h1:VotvOLWW8q/EAxB0YdsBBGC8XYyeL1YwBj2ungAGPNg= +github.com/go-openapi/swag v0.27.1/go.mod h1:GTkJPwHfhJp6MWr4/rCh64HVI3Ofu+tcsbfjfHmTxpE= +github.com/go-openapi/swag/cmdutils v0.27.1 h1:I7sYqaWVl5mq0NEmNQkAmFDyNin9ufvMX/p2zwtQaOE= +github.com/go-openapi/swag/cmdutils v0.27.1/go.mod h1:Sm1MVFMkF6guJJ+pQqHnQA3N0j9qALV3NxzDSv6bETM= +github.com/go-openapi/swag/conv v0.27.1 h1:8wi9ZG+olmY1wXphl93EWniPtbSPkXM/feH7FgjsvrU= +github.com/go-openapi/swag/conv v0.27.1/go.mod h1:QbqMivkpKhC3g1B1GGGOJ6ANewI3S62dbzYu3Duowqs= +github.com/go-openapi/swag/fileutils v0.27.1 h1:QQqBSoi5mW4XpU85nS0mLcA+zAE6vLzrb0QkmLKf9oM= +github.com/go-openapi/swag/fileutils v0.27.1/go.mod h1:VvJFZLTZS0AI854gEQz5tk7dBESdLjiNUMSZ/th2ry8= +github.com/go-openapi/swag/jsonutils v0.27.1 h1:SVgK3i4USzCU5mibOOS/l4ea2h9UQXy7J7RNLTjuXjU= +github.com/go-openapi/swag/jsonutils v0.27.1/go.mod h1:tdlEpZqdcQ17uj6J4YdK9vd8It5qWMwjWXOs0tjpRlk= +github.com/go-openapi/swag/jsonutils/fixtures_test v0.27.1 h1:mJu3COL9WEaZVp/Kf2PRMi7tPszPEJfSr/OO75ynCs8= +github.com/go-openapi/swag/jsonutils/fixtures_test v0.27.1/go.mod h1:mofwUWx70wvskwESqRJ//k/9kURmCgyJl5m5Ppoh5kY= +github.com/go-openapi/swag/loading v0.27.1 h1:/DxUgDXKbBX4bcn7r9uEXfJyzN5XpiJmZplzQTjrRCY= +github.com/go-openapi/swag/loading v0.27.1/go.mod h1:jvGh3iA2+zyUUycB5fgJWzeHnhrpvGnJJM0RVE9ZShE= +github.com/go-openapi/swag/mangling v0.27.1 h1:yC9D0HyUE8gbP+BfmGx9+AA89ikwZTMjESK3OnnoaqA= +github.com/go-openapi/swag/mangling v0.27.1/go.mod h1:jtBE2+V+3pILxOR7Vgce+Cwp6A2PgZbvVqfNntbVs0w= +github.com/go-openapi/swag/netutils v0.27.1 h1:mICMFoS82F5TZ4Zy3cqmcQk+BFeCp3Uyq3Np7GI0/qU= +github.com/go-openapi/swag/netutils v0.27.1/go.mod h1:J+WYyFMLtvtCGqa6jLv+YNUmIKI3ZRQRrvfNDMoQoEQ= +github.com/go-openapi/swag/pools v0.27.1 h1:9LeadcMyb2GJCbXX5hVQDbZ2Lq9TL4dCs/nx1j5DO0E= +github.com/go-openapi/swag/pools v0.27.1/go.mod h1:kVQefhSK5RWuRe7BXsL8htgBPAMpN7HDGpGEknqugeE= +github.com/go-openapi/swag/stringutils v0.27.1 h1:ZXePZ0r2p1qSjo8tD3Un4vFj8+FqlCkczxDrJIhYUp8= +github.com/go-openapi/swag/stringutils v0.27.1/go.mod h1:lzRN95CxXmA03XcDWHLOb6nOMcxCqR5rGY0lOgsfRoM= +github.com/go-openapi/swag/typeutils v0.27.1 h1:KSTdFlfnse4r6dP9IrEnwMldjE+zs71UeEB3//PtVXc= +github.com/go-openapi/swag/typeutils v0.27.1/go.mod h1:Srm0xFNRZ1Y+vCxJclo5qzx8aj+1pAKda/YfFPrG0dQ= +github.com/go-openapi/swag/yamlutils v0.27.1 h1:ftxv6xvXb1E3zohUc+okZ9nSqNb9StQX/FXnKZ98sQA= +github.com/go-openapi/swag/yamlutils v0.27.1/go.mod h1:bnxFIB1qewGRiZHypXGZ3fNgf13/0HfRgnS/iZBDrOo= +github.com/go-openapi/testify/enable/yaml/v2 v2.6.0 h1:gGHwAJ0R/5jU8BEGDbfRNR3hL68dAVi84WuOApp29B0= +github.com/go-openapi/testify/enable/yaml/v2 v2.6.0/go.mod h1:tY+St1SGq4NFl0QIqdTY4aEdbChAHxhyB77XQi9iJCo= +github.com/go-openapi/testify/v2 v2.6.0 h1:5PKH2HE7YJ/LuRPQGvSxBRlFXNQhSetBLlGAgUEu3ug= +github.com/go-openapi/testify/v2 v2.6.0/go.mod h1:SgsVHtfooshd0tublTtJ50FPKhujf47YRqauXXOUxfw= github.com/go-task/slim-sprig/v3 v3.0.0 h1:sUs3vkvUymDpBKi3qH1YSqBQk9+9D/8M2mN1vB6EwHI= github.com/go-task/slim-sprig/v3 v3.0.0/go.mod h1:W848ghGpv3Qj3dhTPRyJypKRiqCdHZiAzKg9hl15HA8= github.com/go-viper/mapstructure/v2 v2.4.0 h1:EBsztssimR/CONLSZZ04E8qAkxNYq4Qp9LvH92wZUgs= @@ -108,8 +108,8 @@ github.com/goccy/go-yaml v1.18.0 h1:8W7wMFS12Pcas7KU+VVkaiCng+kG8QiFeFwzFb+rwuw= github.com/goccy/go-yaml v1.18.0/go.mod h1:XBurs7gK8ATbW4ZPGKgcbrY1Br56PdM69F7LkFRi1kA= github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= -github.com/google/cel-go v0.26.0 h1:DPGjXackMpJWH680oGY4lZhYjIameYmR+/6RBdDGmaI= -github.com/google/cel-go v0.26.0/go.mod h1:A9O8OU9rdvrK5MQyrqfIxo1a0u4g3sF8KB6PUIaryMM= +github.com/google/cel-go v0.29.2 h1:ZtDxkeiMmz0mxbKDYiNkE5Lk7V5edMRcaaDf2jX002k= +github.com/google/cel-go v0.29.2/go.mod h1:X0bD6iVNR8pkROSOoHVdgTkzmRcosof7WQqCD6wcMc8= github.com/google/gnostic-models v0.7.1 h1:SisTfuFKJSKM5CPZkffwi6coztzzeYUhc3v4yxLWH8c= github.com/google/gnostic-models v0.7.1/go.mod h1:whL5G0m6dmc5cPxKc5bdKdEN3UjI7OUGxBlw57miDrQ= github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8= @@ -125,22 +125,22 @@ github.com/gorilla/websocket v1.5.4-0.20250319132907-e064f32e3674 h1:JeSE6pjso5T github.com/gorilla/websocket v1.5.4-0.20250319132907-e064f32e3674/go.mod h1:r4w70xmWCQKmi1ONH4KIaBptdivuRPyosB9RmPlGEwA= github.com/grpc-ecosystem/go-grpc-middleware/v2 v2.3.3 h1:B+8ClL/kCQkRiU82d9xajRPKYMrB7E0MbtzWVi1K4ns= github.com/grpc-ecosystem/go-grpc-middleware/v2 v2.3.3/go.mod h1:NbCUVmiS4foBGBHOYlCT25+YmGpJ32dZPi75pGEUpj4= -github.com/grpc-ecosystem/grpc-gateway/v2 v2.27.7 h1:X+2YciYSxvMQK0UZ7sg45ZVabVZBeBuvMkmuI2V3Fak= -github.com/grpc-ecosystem/grpc-gateway/v2 v2.27.7/go.mod h1:lW34nIZuQ8UDPdkon5fmfp2l3+ZkQ2me/+oecHYLOII= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.29.0 h1:5VipnvEpbqr2gA2VbM+nYVbkIF28c5ZQfqCBQ5g2xfk= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.29.0/go.mod h1:Hyl3n6Twe1hvtd9XUXDec4pTvgMSEixRuQKPTMH2bNs= github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8= github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= github.com/joshdk/go-junit v1.0.0 h1:S86cUKIdwBHWwA6xCmFlf3RTLfVXYQfvanM5Uh+K6GE= github.com/joshdk/go-junit v1.0.0/go.mod h1:TiiV0PqkaNfFXjEiyjWM3XXrhVyCa1K4Zfga6W52ung= github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= -github.com/klauspost/compress v1.18.0 h1:c/Cqfb0r+Yi+JtIEq73FWXVkRonBlf0CRNYc8Zttxdo= -github.com/klauspost/compress v1.18.0/go.mod h1:2Pp+KzxcywXVXMr50+X0Q/Lsb43OQHYWRCY2AiWywWQ= +github.com/klauspost/compress v1.19.0 h1:sXLILfc9jV2QYWkzFOPWStmcUVH2RHEB1JCdY2oVvCQ= +github.com/klauspost/compress v1.19.0/go.mod h1:cwPg85FWrGar70rWktvGQj8/hthj3wpl0PGDogxkrSQ= github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= -github.com/kubernetes-csi/external-snapshotter/client/v8 v8.4.0 h1:bMqrb3UHgHbP+PW9VwiejfDJU1R0PpXVZNMdeH8WYKI= -github.com/kubernetes-csi/external-snapshotter/client/v8 v8.4.0/go.mod h1:E3vdYxHj2C2q6qo8/Da4g7P+IcwqRZyy3gJBzYybV9Y= +github.com/kubernetes-csi/external-snapshotter/client/v8 v8.6.0 h1:FtGewu2k6HWw6evLGXY8JqUZ9eHpti1kd3e4amj+ilA= +github.com/kubernetes-csi/external-snapshotter/client/v8 v8.6.0/go.mod h1:Vxl89NySJ45J+ah3NTMan/KJXW+NpcGHE2Tw0GSw53k= github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc= github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= github.com/lib/pq v1.12.3 h1:tTWxr2YLKwIvK90ZXEw8GP7UFHtcbTtty8zsI+YjrfQ= @@ -161,10 +161,10 @@ github.com/monochromegane/go-gitignore v0.0.0-20200626010858-205db1a8cc00 h1:n6/ github.com/monochromegane/go-gitignore v0.0.0-20200626010858-205db1a8cc00/go.mod h1:Pm3mSP3c5uWn86xMLZ5Sa7JB9GsEZySvHYXCTK4E9q4= github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq1c1nUAm88MOHcQC9l5mIlSMApZMrHA= github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= -github.com/onsi/ginkgo/v2 v2.29.0 h1:rfh+ZFjgJhYWRoIqVf3Uwx/W20yLrcrE2h2GmYVRaag= -github.com/onsi/ginkgo/v2 v2.29.0/go.mod h1:+aXOY+vzZ5mu2iI2HpTZUPmM//oQfsNFX6gU9kNcA44= -github.com/onsi/gomega v1.41.0 h1:OwKp4pXNgVxf6sCplzYo794OFNuoL2q2SBMU5NSWOjA= -github.com/onsi/gomega v1.41.0/go.mod h1:M/Uqpu/8qTjtzCLUA2zJHX9Iilrau25x1PdoSRbWh5A= +github.com/onsi/ginkgo/v2 v2.32.1 h1:6tlvcDm/3sE8lGJbZ4+d4mO3RLy24/tQWOFzVSQNIfw= +github.com/onsi/ginkgo/v2 v2.32.1/go.mod h1:+aXOY+vzZ5mu2iI2HpTZUPmM//oQfsNFX6gU9kNcA44= +github.com/onsi/gomega v1.43.0 h1:VlG/1FxqNxhSO+lq/OHBNaaqwiBK/mO8JbVkX9Y+FeU= +github.com/onsi/gomega v1.43.0/go.mod h1:REff/hsDsodHoKlWsP2mAPhu1+5/6hVYNf9rIEBpeSg= github.com/pelletier/go-toml/v2 v2.2.4 h1:mye9XuhQ6gvn5h28+VilKrrPoQVanw5PMw/TB0t5Ec4= github.com/pelletier/go-toml/v2 v2.2.4/go.mod h1:2gIqNv+qfxSVS7cM2xJQKtLSTLUE9V8t9Stt+h56mCY= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= @@ -172,16 +172,16 @@ github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINE github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/prometheus-operator/prometheus-operator/pkg/apis/monitoring v0.87.1 h1:wyKanf+IFdbIqbDNYGt+f1dabLErLWtBaxd0KaAx4aM= -github.com/prometheus-operator/prometheus-operator/pkg/apis/monitoring v0.87.1/go.mod h1:WHiLZmOWVop/MoYvRD58LfnPeyE+dcITby/jQjg83Hw= -github.com/prometheus/client_golang v1.23.2 h1:Je96obch5RDVy3FDMndoUsjAhG5Edi49h0RJWRi/o0o= -github.com/prometheus/client_golang v1.23.2/go.mod h1:Tb1a6LWHB3/SPIzCoaDXI4I8UHKeFTEQ1YCr+0Gyqmg= +github.com/prometheus-operator/prometheus-operator/pkg/apis/monitoring v0.92.0 h1:cgcHnhpMbk86QzIe23vwUiIUNBB0kftdOA9JJA83ASA= +github.com/prometheus-operator/prometheus-operator/pkg/apis/monitoring v0.92.0/go.mod h1:eGo3VN8Kq5Fd0M7Cdx0oqbIxo753t99ojUZFVQkO1UM= +github.com/prometheus/client_golang v1.24.0 h1:5XStIklKuAtJSNpdD3s8XJj/Yv78IQmE1kbNk87JrAI= +github.com/prometheus/client_golang v1.24.0/go.mod h1:QcsNdotprC2nS4BTM2ucbcqxd2CeXTEa9jW7zHO9iDE= github.com/prometheus/client_model v0.6.2 h1:oBsgwpGs7iVziMvrGhE53c/GrLUsZdHnqNwqPLxwZyk= github.com/prometheus/client_model v0.6.2/go.mod h1:y3m2F6Gdpfy6Ut/GBsUqTWZqCUvMVzSfMLjcu6wAwpE= -github.com/prometheus/common v0.67.5 h1:pIgK94WWlQt1WLwAC5j2ynLaBRDiinoAb86HZHTUGI4= -github.com/prometheus/common v0.67.5/go.mod h1:SjE/0MzDEEAyrdr5Gqc6G+sXI67maCxzaT3A2+HqjUw= -github.com/prometheus/procfs v0.19.2 h1:zUMhqEW66Ex7OXIiDkll3tl9a1ZdilUOd/F6ZXw4Vws= -github.com/prometheus/procfs v0.19.2/go.mod h1:M0aotyiemPhBCM0z5w87kL22CxfcH05ZpYlu+b4J7mw= +github.com/prometheus/common v0.70.0 h1:bcpru3tWPVnxGnETLgOV5jbp/JRXgYEyv65CuBLAMMI= +github.com/prometheus/common v0.70.0/go.mod h1:S/SFasQmgGiYH6C81LKCtYa8QACgthGg5zxL2udV7SY= +github.com/prometheus/procfs v0.21.1 h1:GljZCt+zSTS+NZq88cyQ1LjZ+RCHp3uVuabBWA5+OJI= +github.com/prometheus/procfs v0.21.1/go.mod h1:aB55Cww9pdSJVHk0hUf0inxWyyjPogFIjmHKYgMKmtY= github.com/rogpeppe/go-internal v1.14.1 h1:UQB4HGPB6osV0SQTLymcB4TgvyWu6ZyliaW0tI/otEQ= github.com/rogpeppe/go-internal v1.14.1/go.mod h1:MaRKkUm5W0goXpeCfT7UZI6fk/L7L7so1lCWt35ZSgc= github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= @@ -204,19 +204,12 @@ github.com/spf13/pflag v1.0.10 h1:4EBh2KAYBwaONj6b2Ye1GiHfwjqyROoF4RwYO+vPwFk= github.com/spf13/pflag v1.0.10/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= github.com/spf13/viper v1.21.0 h1:x5S+0EU27Lbphp4UKm1C+1oQO+rKx36vfCoaVebLFSU= github.com/spf13/viper v1.21.0/go.mod h1:P0lhsswPGWD/1lZJ9ny3fYnVqxiegrlNrEmgLjbTCAY= -github.com/stoewer/go-strcase v1.3.1 h1:iS0MdW+kVTxgMoE1LAZyMiYJFKlOzLooE4MxjirtkAs= -github.com/stoewer/go-strcase v1.3.1/go.mod h1:fAH5hQ5pehh+j3nZfvwdk2RgEgQjAoM8wodgtPmh1xo= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= -github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= -github.com/stretchr/objx v0.5.2 h1:xuMeJ0Sdp5ZMRXx/aWO6RZxdr3beISkG5/G/aIRr3pY= -github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA= +github.com/stretchr/objx v0.5.3 h1:jmXUvGomnU1o3W/V5h2VEradbpJDwGrzugQQvL0POH4= +github.com/stretchr/objx v0.5.3/go.mod h1:rDQraq+vQZU7Fde9LOZLr8Tax6zZvy4kuNKF+QYS+U0= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= -github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U= github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U= github.com/subosito/gotenv v1.6.0 h1:9NlTDc1FTs4qu0DDq7AEtTPNw6SVm7uBMsUCUjABIf8= @@ -237,24 +230,24 @@ github.com/xlab/treeprint v1.2.0 h1:HzHnuAF1plUN2zGlAFHbSQP2qJ0ZAD3XF5XD7OesXRQ= github.com/xlab/treeprint v1.2.0/go.mod h1:gj5Gd3gPdKtR1ikdDK6fnFLdmIS0X30kTTuNd/WEJu0= go.opentelemetry.io/auto/sdk v1.2.1 h1:jXsnJ4Lmnqd11kwkBV2LgLoFMZKizbCi5fNZ/ipaZ64= go.opentelemetry.io/auto/sdk v1.2.1/go.mod h1:KRTj+aOaElaLi+wW1kO/DZRXwkF4C5xPbEe3ZiIhN7Y= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.65.0 h1:7iP2uCb7sGddAr30RRS6xjKy7AZ2JtTOPA3oolgVSw8= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.65.0/go.mod h1:c7hN3ddxs/z6q9xwvfLPk+UHlWRQyaeR1LdgfL/66l0= -go.opentelemetry.io/otel v1.43.0 h1:mYIM03dnh5zfN7HautFE4ieIig9amkNANT+xcVxAj9I= -go.opentelemetry.io/otel v1.43.0/go.mod h1:JuG+u74mvjvcm8vj8pI5XiHy1zDeoCS2LB1spIq7Ay0= -go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.40.0 h1:QKdN8ly8zEMrByybbQgv8cWBcdAarwmIPZ6FThrWXJs= -go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.40.0/go.mod h1:bTdK1nhqF76qiPoCCdyFIV+N/sRHYXYCTQc+3VCi3MI= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.40.0 h1:DvJDOPmSWQHWywQS6lKL+pb8s3gBLOZUtw4N+mavW1I= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.40.0/go.mod h1:EtekO9DEJb4/jRyN4v4Qjc2yA7AtfCBuz2FynRUWTXs= -go.opentelemetry.io/otel/metric v1.43.0 h1:d7638QeInOnuwOONPp4JAOGfbCEpYb+K6DVWvdxGzgM= -go.opentelemetry.io/otel/metric v1.43.0/go.mod h1:RDnPtIxvqlgO8GRW18W6Z/4P462ldprJtfxHxyKd2PY= -go.opentelemetry.io/otel/sdk v1.43.0 h1:pi5mE86i5rTeLXqoF/hhiBtUNcrAGHLKQdhg4h4V9Dg= -go.opentelemetry.io/otel/sdk v1.43.0/go.mod h1:P+IkVU3iWukmiit/Yf9AWvpyRDlUeBaRg6Y+C58QHzg= -go.opentelemetry.io/otel/sdk/metric v1.43.0 h1:S88dyqXjJkuBNLeMcVPRFXpRw2fuwdvfCGLEo89fDkw= -go.opentelemetry.io/otel/sdk/metric v1.43.0/go.mod h1:C/RJtwSEJ5hzTiUz5pXF1kILHStzb9zFlIEe85bhj6A= -go.opentelemetry.io/otel/trace v1.43.0 h1:BkNrHpup+4k4w+ZZ86CZoHHEkohws8AY+WTX09nk+3A= -go.opentelemetry.io/otel/trace v1.43.0/go.mod h1:/QJhyVBUUswCphDVxq+8mld+AvhXZLhe+8WVFxiFff0= -go.opentelemetry.io/proto/otlp v1.9.0 h1:l706jCMITVouPOqEnii2fIAuO3IVGBRPV5ICjceRb/A= -go.opentelemetry.io/proto/otlp v1.9.0/go.mod h1:xE+Cx5E/eEHw+ISFkwPLwCZefwVjY+pqKg1qcK03+/4= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.69.0 h1:8tvICD4vSTOOsNrsI4Ljf6C+6UKvpTEH5XY3JMoyPoo= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.69.0/go.mod h1:z9+yiacE0IHRqM4qFfkbt/JYlmYXgss8GY/jXoNuPJI= +go.opentelemetry.io/otel v1.44.0 h1:JjwHmHpA4iZ3wBxluu2fbbE7j4kqlE8jXyAyPXH7HqU= +go.opentelemetry.io/otel v1.44.0/go.mod h1:BMgjTHL9WPRlRjL2oZCBTL4whCGtXch2H4BhOPIAyYc= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.44.0 h1:4YsVu3B8+3qtWYYrsUYgn0OG78pN0rnNPRGX4SbokQI= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.44.0/go.mod h1:+wnlSn0mD1ADVMe3v9Z/WIaiz6q6gL2J/ejaAmdmv80= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.44.0 h1:qazEJlUOQzhCpzQpFETGby7EdqjI1wsd0W+6Gg1SCTU= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.44.0/go.mod h1:fOD2Yefuxixkx3ahVNf0O/PERb6r4OlbxfATVnYvzCo= +go.opentelemetry.io/otel/metric v1.44.0 h1:1w0gILTcHdr3YI+ixLyjemwrVnsMURbTZFrSYCdDdmc= +go.opentelemetry.io/otel/metric v1.44.0/go.mod h1:8O7hanEPBNgEMmybD3s2VBKcgWOCsA6tzHBPODAiquo= +go.opentelemetry.io/otel/sdk v1.44.0 h1:nHYwb9lK+fJPU/dnT6s7W7Z8itMWyqrnVfbheVYrZ58= +go.opentelemetry.io/otel/sdk v1.44.0/go.mod h1:Osuydd3Se74nqjAKxid74N5eC+jfEqfTegHRnq58oK0= +go.opentelemetry.io/otel/sdk/metric v1.44.0 h1:3LlKgI+VjbVsjNRFZJZAJ30WjXC5VkNRks6si09iEfI= +go.opentelemetry.io/otel/sdk/metric v1.44.0/go.mod h1:5B5pMARnXxKhltooO4xUuCBorl65a4EpnTalObqOigA= +go.opentelemetry.io/otel/trace v1.44.0 h1:jxF5CsGYCe74MCRx2X4g7WsY/VBKRqqpNvXlX/6gtIk= +go.opentelemetry.io/otel/trace v1.44.0/go.mod h1:oLl1jrMQAVo6v3GAggN+1VH9VIz9iUSvW53sW1Q8PIE= +go.opentelemetry.io/proto/otlp v1.10.0 h1:IQRWgT5srOCYfiWnpqUYz9CVmbO8bFmKcwYxpuCSL2g= +go.opentelemetry.io/proto/otlp v1.10.0/go.mod h1:/CV4QoCR/S9yaPj8utp3lvQPoqMtxXdzn7ozvvozVqk= go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= @@ -265,36 +258,36 @@ go.yaml.in/yaml/v2 v2.4.4 h1:tuyd0P+2Ont/d6e2rl3be67goVK4R6deVxCUX5vyPaQ= go.yaml.in/yaml/v2 v2.4.4/go.mod h1:gMZqIpDtDqOfM0uNfy0SkpRhvUryYH0Z6wdMYcacYXQ= go.yaml.in/yaml/v3 v3.0.4 h1:tfq32ie2Jv2UxXFdLJdh3jXuOzWiL1fo0bu/FbuKpbc= go.yaml.in/yaml/v3 v3.0.4/go.mod h1:DhzuOOF2ATzADvBadXxruRBLzYTpT36CKvDb3+aBEFg= -golang.org/x/exp v0.0.0-20251219203646-944ab1f22d93 h1:fQsdNF2N+/YewlRZiricy4P1iimyPKZ/xwniHj8Q2a0= -golang.org/x/exp v0.0.0-20251219203646-944ab1f22d93/go.mod h1:EPRbTFwzwjXj9NpYyyrvenVh9Y+GFeEvMNh7Xuz7xgU= -golang.org/x/mod v0.35.0 h1:Ww1D637e6Pg+Zb2KrWfHQUnH2dQRLBQyAtpr/haaJeM= -golang.org/x/mod v0.35.0/go.mod h1:+GwiRhIInF8wPm+4AoT6L0FA1QWAad3OMdTRx4tFYlU= -golang.org/x/net v0.53.0 h1:d+qAbo5L0orcWAr0a9JweQpjXF19LMXJE8Ey7hwOdUA= -golang.org/x/net v0.53.0/go.mod h1:JvMuJH7rrdiCfbeHoo3fCQU24Lf5JJwT9W3sJFulfgs= +golang.org/x/exp v0.0.0-20260410095643-746e56fc9e2f h1:W3F4c+6OLc6H2lb//N1q4WpJkhzJCK5J6kUi1NTVXfM= +golang.org/x/exp v0.0.0-20260410095643-746e56fc9e2f/go.mod h1:J1xhfL/vlindoeF/aINzNzt2Bket5bjo9sdOYzOsU80= +golang.org/x/mod v0.38.0 h1:MECBjubtXD7yj4HrhIUcywNaGeNVUdfVnxmPajOk4yk= +golang.org/x/mod v0.38.0/go.mod h1:V6Xz0pq8TQ3dGqVQ1FVHuelZpAL0uNhSkk9ogYP3c40= +golang.org/x/net v0.58.0 h1:ynWG7rqYi4ccpTEuPZ2QGWHktVEM9DMCj9yzDE0Q7To= +golang.org/x/net v0.58.0/go.mod h1:YwCddHnFlT7eLQqVprV19OnhLGtc5xOKgE0RyqgfWAU= golang.org/x/oauth2 v0.36.0 h1:peZ/1z27fi9hUOFCAZaHyrpWG5lwe0RJEEEeH0ThlIs= golang.org/x/oauth2 v0.36.0/go.mod h1:YDBUJMTkDnJS+A4BP4eZBjCqtokkg1hODuPjwiGPO7Q= -golang.org/x/sync v0.20.0 h1:e0PTpb7pjO8GAtTs2dQ6jYa5BWYlMuX047Dco/pItO4= -golang.org/x/sync v0.20.0/go.mod h1:9xrNwdLfx4jkKbNva9FpL6vEN7evnE43NNNJQ2LF3+0= -golang.org/x/sys v0.43.0 h1:Rlag2XtaFTxp19wS8MXlJwTvoh8ArU6ezoyFsMyCTNI= -golang.org/x/sys v0.43.0/go.mod h1:4GL1E5IUh+htKOUEOaiffhrAeqysfVGipDYzABqnCmw= -golang.org/x/term v0.42.0 h1:UiKe+zDFmJobeJ5ggPwOshJIVt6/Ft0rcfrXZDLWAWY= -golang.org/x/term v0.42.0/go.mod h1:Dq/D+snpsbazcBG5+F9Q1n2rXV8Ma+71xEjTRufARgY= -golang.org/x/text v0.36.0 h1:JfKh3XmcRPqZPKevfXVpI1wXPTqbkE5f7JA92a55Yxg= -golang.org/x/text v0.36.0/go.mod h1:NIdBknypM8iqVmPiuco0Dh6P5Jcdk8lJL0CUebqK164= +golang.org/x/sync v0.22.0 h1:SZjpbeLmrCk4xhRSZFNZW5gFUeCeFgjekvI/+gfScek= +golang.org/x/sync v0.22.0/go.mod h1:9xrNwdLfx4jkKbNva9FpL6vEN7evnE43NNNJQ2LF3+0= +golang.org/x/sys v0.47.0 h1:o7XGOvZQCADBQQ4Y7VNq2dRWQR7JmOUW8Kxx4ZsNgWs= +golang.org/x/sys v0.47.0/go.mod h1:4GL1E5IUh+htKOUEOaiffhrAeqysfVGipDYzABqnCmw= +golang.org/x/term v0.45.0 h1:NwWyBmoJCbfTHpxrWoZ9C6/VxOf7ic219I8xZZFdrf0= +golang.org/x/term v0.45.0/go.mod h1:9aqxs0blBcrm/n0L9QW0aRVD+ktan8ssZromtqJC43w= +golang.org/x/text v0.41.0 h1:vz/seA0lnX87Othu2f/0L24RcgrXD9/YFTSuGjj3rH8= +golang.org/x/text v0.41.0/go.mod h1:jvf1O8ajNzZqhSrQBPbutR/EB83Cc0CFrezNQIwbb5M= golang.org/x/time v0.15.0 h1:bbrp8t3bGUeFOx08pvsMYRTCVSMk89u4tKbNOZbp88U= golang.org/x/time v0.15.0/go.mod h1:Y4YMaQmXwGQZoFaVFk4YpCt4FLQMYKZe9oeV/f4MSno= -golang.org/x/tools v0.44.0 h1:UP4ajHPIcuMjT1GqzDWRlalUEoY+uzoZKnhOjbIPD2c= -golang.org/x/tools v0.44.0/go.mod h1:KA0AfVErSdxRZIsOVipbv3rQhVXTnlU6UhKxHd1seDI= +golang.org/x/tools v0.48.0 h1:3+hClM1aLL5mjMKm5ovokw9epgRXPuu2tILgismM6RE= +golang.org/x/tools v0.48.0/go.mod h1:08xX0orndb/F7jJxGDicx061tyd5pcMto75YMAXr6lk= gomodules.xyz/jsonpatch/v2 v2.5.0 h1:JELs8RLM12qJGXU4u/TO3V25KW8GreMKl9pdkk14RM0= gomodules.xyz/jsonpatch/v2 v2.5.0/go.mod h1:AH3dM2RI6uoBZxn3LVrfvJ3E0/9dG4cSrbuBJT4moAY= gonum.org/v1/gonum v0.17.0 h1:VbpOemQlsSMrYmn7T2OUvQ4dqxQXU+ouZFQsZOx50z4= gonum.org/v1/gonum v0.17.0/go.mod h1:El3tOrEuMpv2UdMrbNlKEh9vd86bmQ6vqIcDwxEOc1E= -google.golang.org/genproto/googleapis/api v0.0.0-20260226221140-a57be14db171 h1:tu/dtnW1o3wfaxCOjSLn5IRX4YDcJrtlpzYkhHhGaC4= -google.golang.org/genproto/googleapis/api v0.0.0-20260226221140-a57be14db171/go.mod h1:M5krXqk4GhBKvB596udGL3UyjL4I1+cTbK0orROM9ng= -google.golang.org/genproto/googleapis/rpc v0.0.0-20260319201613-d00831a3d3e7 h1:ndE4FoJqsIceKP2oYSnUZqhTdYufCYYkqwtFzfrhI7w= -google.golang.org/genproto/googleapis/rpc v0.0.0-20260319201613-d00831a3d3e7/go.mod h1:4Hqkh8ycfw05ld/3BWL7rJOSfebL2Q+DVDeRgYgxUU8= -google.golang.org/grpc v1.81.1 h1:VnnIIZ88UzOOKLukQi+ImGz8O1Wdp8nAGGnvOfEIWQQ= -google.golang.org/grpc v1.81.1/go.mod h1:xGH9GfzOyMTGIOXBJmXt+BX/V0kcdQbdcuwQ/zNw42I= +google.golang.org/genproto/googleapis/api v0.0.0-20260526163538-3dc84a4a5aaa h1:Kjn0N0tCrDgiAFW+lGO4JZ3ck44CehvJQMAwj9QF0G8= +google.golang.org/genproto/googleapis/api v0.0.0-20260526163538-3dc84a4a5aaa/go.mod h1:q4lMZS6kskjT5HvCPrnnypcDPVJqT/f4nfxmkE7gryY= +google.golang.org/genproto/googleapis/rpc v0.0.0-20260610212136-7ab31c22f7ad h1:45WmJvIV6C2+O/jjLkPUH+F3aOj/1miDoU2DD0+NWbg= +google.golang.org/genproto/googleapis/rpc v0.0.0-20260610212136-7ab31c22f7ad/go.mod h1:4Hqkh8ycfw05ld/3BWL7rJOSfebL2Q+DVDeRgYgxUU8= +google.golang.org/grpc v1.83.2 h1:EManeRomTObA0BU7I8vXgg/78uE5MJ9M8B39EX2WscU= +google.golang.org/grpc v1.83.2/go.mod h1:YPI1hK3kDked6iHvgX3tR0y+nX/qpMFKhPgFsokw1S8= google.golang.org/protobuf v1.36.12-0.20260120151049-f2248ac996af h1:+5/Sw3GsDNlEmu7TfklWKPdQ0Ykja5VEmq2i817+jbI= google.golang.org/protobuf v1.36.12-0.20260120151049-f2248ac996af/go.mod h1:HTf+CrKn2C3g5S8VImy6tdcUvCska2kB7j23XfzDpco= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= @@ -308,32 +301,32 @@ gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -k8s.io/api v0.36.1 h1:XbL/EMj8K2aJpJtePmqUyQMsM0D4QI2pvl7YKJ20FTY= -k8s.io/api v0.36.1/go.mod h1:KOWo4ey3TINlXjeHVuwB3i+tXXnu+UcwFBHlI/9dvEo= -k8s.io/apiextensions-apiserver v0.36.1 h1:6JfYmPUsuUIHuN+3QxutXYWj492RqF5fBSx67GYK5Ks= -k8s.io/apiextensions-apiserver v0.36.1/go.mod h1:pLzZin90riwisdzKwv/GoTwENooytoIx5zWJb4Hkby8= -k8s.io/apimachinery v0.36.1 h1:G63Gjx2W+q0YD+72Vo8oY0nDnePVwnuzTmmy5ENrVSA= -k8s.io/apimachinery v0.36.1/go.mod h1:ibYOR00vW/I1kzvi5SF0dRuJ52BvKtfvRdOn35GPQ+8= -k8s.io/apiserver v0.36.1 h1:iMS5V+rPUertv5P9RaqJgmHHTuh4quWpoxchvMUY+JY= -k8s.io/apiserver v0.36.1/go.mod h1:Cby1PbLWztu0GDOxoO6iFOyyqIsziHNEW+w9zVQ22Kw= -k8s.io/client-go v0.36.1 h1:FN/K8QIT2CEDt+2WB2HnWrUANZ50AP5GII43/SP2JR0= -k8s.io/client-go v0.36.1/go.mod h1:s6rAnCtTGYDQnpNjEhSaISV+2O8jwruZ6m3QOYBFbtU= -k8s.io/component-base v0.36.1 h1:iG6GsELftXqTNG9HG6kiVjatSgAw1sf5pJ6R5a6N0kA= -k8s.io/component-base v0.36.1/go.mod h1:nf9XPlntRdqO6WMeEWAA5F93Y4ICZQdeT9GeqLDB3JI= +k8s.io/api v0.37.0 h1:Z//Vj9N7RA/yS2sDmxyeo7h+RR4zbUrd2vrd3Z0TbB4= +k8s.io/api v0.37.0/go.mod h1:LKXgcJWMc+f4OLbP5SFR8rulEg07zZhpi/zMULiBImk= +k8s.io/apiextensions-apiserver v0.37.0 h1:zRMQ3+/LIE5oZ0tVvXwYHC+dIkSP5cjNWju7AZU1LOI= +k8s.io/apiextensions-apiserver v0.37.0/go.mod h1:HU0PfSBwchHL5iDau6jjt9zU6ryWkDDlaVUiq91NK80= +k8s.io/apimachinery v0.37.0 h1:Np2AbDtf8x6RDHiD8T9LbKJ9gaegeVNa8yNm5FuGKm0= +k8s.io/apimachinery v0.37.0/go.mod h1:RN3nhprFSCxOi5Selxd7oMTXOe/c+ZbcE7Im+TS2zkE= +k8s.io/apiserver v0.37.0 h1:TXg7OxsOWrAH8J4Zi/gBAZuMw1Dfdd+6cca2h4qjRqo= +k8s.io/apiserver v0.37.0/go.mod h1:OddHDF4gy9qyIb8o/3+qaeP6S0vEObWLgOygVqXksv0= +k8s.io/client-go v0.37.0 h1:nsN31fy8wBySuZ+QRnKmrjRSQLOG2rvoGN0tKd12zhQ= +k8s.io/client-go v0.37.0/go.mod h1:FcGqw+Ll/gNQiq+nPGY1Oyt9y7SgDh1d3MW3RFDEbn0= +k8s.io/component-base v0.37.0 h1:3SdSa4+itMdFTDFTeR8CxKGmSTSMXFlKL4ky8OqjguM= +k8s.io/component-base v0.37.0/go.mod h1:LjOebp4R9y6LODWZQv102ZQxGheLcDO2ZJLAw6bbh4I= k8s.io/klog/v2 v2.140.0 h1:Tf+J3AH7xnUzZyVVXhTgGhEKnFqye14aadWv7bzXdzc= k8s.io/klog/v2 v2.140.0/go.mod h1:o+/RWfJ6PwpnFn7OyAG3QnO47BFsymfEfrz6XyYSSp0= -k8s.io/kube-openapi v0.0.0-20260502001324-b7f5293f4787 h1:kHv8PETbPIVHfqKBYwTNNSjqChf/7xn3JOS3re+NWs8= -k8s.io/kube-openapi v0.0.0-20260502001324-b7f5293f4787/go.mod h1:Cyq7UE0QtGe+Zo+/6XFrxiS4Mq0tLyQEONkFzSkfp9o= -k8s.io/streaming v0.36.1 h1:L+K68n4Gg940BGNNYtUBvL1WTLL0YnKT3s+P1MNAmR4= -k8s.io/streaming v0.36.1/go.mod h1:z6fV3D+NVkoeqRMtWwlUZK6U17SY/LqNzOxWL6GyR/s= -k8s.io/utils v0.0.0-20260507154919-ff6756f316d2 h1:wU4tMEhLGgIbLvXQb1cfN+EcM0wf7zC6CPF+C79jroc= -k8s.io/utils v0.0.0-20260507154919-ff6756f316d2/go.mod h1:xDxuJ0whA3d0I4mf/C4ppKHxXynQ+fxnkmQH0vTHnuk= -sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.34.0 h1:hSfpvjjTQXQY2Fol2CS0QHMNs/WI1MOSGzCm1KhM5ec= -sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.34.0/go.mod h1:Ve9uj1L+deCXFrPOk1LpFXqTg7LCFzFso6PA48q/XZw= +k8s.io/kube-openapi v0.0.0-20260721132016-d427ff9ee9ad h1:oXImqH8mQNk7PmvzKhmN3ddJoY6OnyM225MXwGHPm0A= +k8s.io/kube-openapi v0.0.0-20260721132016-d427ff9ee9ad/go.mod h1:0/mqHCVhlumdJ3BhCfnjSZQE037nAhNodh1/hK0T8/I= +k8s.io/streaming v0.37.0 h1:iPBUZLZiKt5bV+lxJurASMOV07VuBhNpiwJt2//AWrM= +k8s.io/streaming v0.37.0/go.mod h1:APlJR26ZWRcVy5bIEj0QRrKUXROtBHPcxl2NT7EAzPU= +k8s.io/utils v0.0.0-20260707023825-cf1189d6abe3 h1:jVkFFVfXdXP74B/zbO3hM3hpSFD0xvhQ5U686DPurkE= +k8s.io/utils v0.0.0-20260707023825-cf1189d6abe3/go.mod h1:M2s5JB1lIYP3jzZdorPLHXIPJzt9vv2muW5a6L9DtNM= +sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.36.0 h1:/YpDJ4vReG7ZmzSpBGxduXgywWkJU9zHubgJG03MT+Y= +sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.36.0/go.mod h1:tJo1aepTXyR+8Xs3sUsGBDk4Ub2AM5dPAPKJx0mpm5c= sigs.k8s.io/controller-runtime v0.24.1 h1:miPEwrmirImAvgME1L9qebGHrOnGJoVmVdtOU9fRfo4= sigs.k8s.io/controller-runtime v0.24.1/go.mod h1:vFkfY5fGt5xAC/sKb8IBFKgWPNKG9OUG29dR8Y2wImw= -sigs.k8s.io/gateway-api v1.5.0 h1:duoo14Ky/fJXpjpmyMISE2RTBGnfCg8zICfTYLTnBJA= -sigs.k8s.io/gateway-api v1.5.0/go.mod h1:GvCETiaMAlLym5CovLxGjS0NysqFk3+Yuq3/rh6QL2o= +sigs.k8s.io/gateway-api v1.6.0 h1:735YBRj5NXFrOGX0GoSjwzUIzbz8kiEOfADsqHFmHgE= +sigs.k8s.io/gateway-api v1.6.0/go.mod h1:FVfx3t389ybeXOqvDghLbdvJdSCfI/PReqCUI3lu3mY= sigs.k8s.io/json v0.0.0-20250730193827-2d320260d730 h1:IpInykpT6ceI+QxKBbEflcR5EXP7sU1kvOlxwZh5txg= sigs.k8s.io/json v0.0.0-20250730193827-2d320260d730/go.mod h1:mdzfpAEoE6DHQEN0uh9ZbOCuHbLK5wOm7dK4ctXE9Tg= sigs.k8s.io/kustomize/api v0.21.1 h1:lzqbzvz2CSvsjIUZUBNFKtIMsEw7hVLJp0JeSIVmuJs= @@ -342,7 +335,7 @@ sigs.k8s.io/kustomize/kyaml v0.21.1 h1:IVlbmhC076nf6foyL6Taw4BkrLuEsXUXNpsE+ScX7 sigs.k8s.io/kustomize/kyaml v0.21.1/go.mod h1:hmxADesM3yUN2vbA5z1/YTBnzLJ1dajdqpQonwBL1FQ= sigs.k8s.io/randfill v1.0.0 h1:JfjMILfT8A6RbawdsK2JXGBR5AQVfd+9TbzrlneTyrU= sigs.k8s.io/randfill v1.0.0/go.mod h1:XeLlZ/jmk4i1HRopwe7/aU3H5n1zNUcX6TM94b3QxOY= -sigs.k8s.io/structured-merge-diff/v6 v6.4.0 h1:qmp2e3ZfFi1/jJbDGpD4mt3wyp6PE1NfKHCYLqgNQJo= -sigs.k8s.io/structured-merge-diff/v6 v6.4.0/go.mod h1:M3W8sfWvn2HhQDIbGWj3S099YozAsymCo/wrT5ohRUE= +sigs.k8s.io/structured-merge-diff/v6 v6.4.2 h1:qdOxHwrl2Kaag1aQEarlYcOA9vSyGCp3CIki3aW8c4Q= +sigs.k8s.io/structured-merge-diff/v6 v6.4.2/go.mod h1:M3W8sfWvn2HhQDIbGWj3S099YozAsymCo/wrT5ohRUE= sigs.k8s.io/yaml v1.6.0 h1:G8fkbMSAFqgEFgh4b1wmtzDnioxFCUgTZhlbj5P9QYs= sigs.k8s.io/yaml v1.6.0/go.mod h1:796bPqUfzR/0jLAl6XjHl3Ck7MiyVv8dbTdyT3/pMf4= diff --git a/hack/examples/cluster-replica-streaming.yaml b/hack/examples/cluster-replica-streaming.yaml new file mode 100644 index 0000000..1fba84c --- /dev/null +++ b/hack/examples/cluster-replica-streaming.yaml @@ -0,0 +1,36 @@ +apiVersion: postgresql.cnpg.io/v1 +kind: Cluster +metadata: + name: cluster-replica +spec: + instances: 3 + bootstrap: + pg_basebackup: + source: source + replica: + enabled: true + source: source + externalClusters: + - name: source + connectionParameters: + host: cluster-example-rw.default.svc + user: streaming_replica + sslmode: verify-full + dbname: postgres + sslKey: + name: cluster-example-replication + key: tls.key + sslCert: + name: cluster-example-replication + key: tls.crt + sslRootCert: + name: cluster-example-ca + key: ca.crt + plugin: + name: barman-cloud.cloudnative-pg.io + parameters: + barmanObjectName: minio-store + serverName: cluster-example + storage: + size: 1Gi + diff --git a/internal/cnpgi/common/common.go b/internal/cnpgi/common/common.go index 9526d7e..8329d64 100644 --- a/internal/cnpgi/common/common.go +++ b/internal/cnpgi/common/common.go @@ -52,6 +52,11 @@ const ( // BarmanEndpointCACertificateFileName is the name of the file in which the barman endpoint // CA certificate is stored. BarmanEndpointCACertificateFileName = "barman-ca.crt" + + // PgWalVolumePgWalPath is the path of the pg_wal directory inside the WAL volume, + // used when a separate WAL storage is configured. During a restore the pg_wal + // directory is moved here and symlinked back into PGDATA. + PgWalVolumePgWalPath = "/var/lib/postgresql/wal/pg_wal" ) // GetRestoreCABundleEnv gets the enveronment variables to be used when custom diff --git a/internal/cnpgi/common/errors.go b/internal/cnpgi/common/errors.go index 2adff8d..b006f95 100644 --- a/internal/cnpgi/common/errors.go +++ b/internal/cnpgi/common/errors.go @@ -20,10 +20,38 @@ SPDX-License-Identifier: Apache-2.0 package common import ( + "errors" + + barmanRestorer "github.com/cloudnative-pg/barman-cloud/pkg/restorer" "google.golang.org/grpc/codes" "google.golang.org/grpc/status" ) +// classifyWALRestoreError maps an error returned by the WAL +// restorer to a gRPC-coded error so the caller can tell terminal +// failures apart from transient ones via the status code. +func classifyWALRestoreError(walName string, walErr error) error { + switch { + case errors.Is(walErr, barmanRestorer.ErrWALNotFound): + return newWALNotFoundError(walName) + case errors.Is(walErr, barmanRestorer.ErrInvalidWALName): + // A malformed WAL name will never become valid on retry. + return newInvalidWALNameError(walName, walErr) + case errors.Is(walErr, barmanRestorer.ErrConnectivity), + errors.Is(walErr, barmanRestorer.ErrGeneric): + // barman-cloud exit codes 2 (connectivity) and 4 + // (generic) both surface conditions that are retryable + // in practice — barman uses the "generic" bucket for + // some connection-class failures too, not just exit 2. + return newUnavailableError(walName, walErr) + default: + // Unrecognized exit codes and unexpected failures (e.g. + // the barman-cloud command could not be executed). No + // positive signal that retry would help. + return newInternalWALRestoreError(walName, walErr) + } +} + // ErrEndOfWALStreamReached is returned when end of WAL is detected in the cloud archive. var ErrEndOfWALStreamReached = status.Errorf(codes.OutOfRange, "end of WAL reached") @@ -35,10 +63,48 @@ var ErrEndOfWALStreamReached = status.Errorf(codes.OutOfRange, "end of WAL reach var ErrMissingPermissions = status.Errorf(codes.FailedPrecondition, "no permission to download the backup credentials, retrying") -// newWALNotFoundError returns a error that states that a -// certain WAL file has not been found. This error is -// compatible with GRPC status codes, resulting in a 404 -// being used as a response code. +// newWALNotFoundError reports that the requested WAL file is not +// present in the object store. Emits codes.NotFound: this is a +// terminal condition (the file won't appear on retry). func newWALNotFoundError(walName string) error { return status.Errorf(codes.NotFound, "wal %q not found", walName) } + +// newUnavailableError reports that downloading the WAL file failed +// for a reason expected to be transient (a barman-cloud connectivity +// blip, or a generic exit code that in practice covers retryable +// conditions too). Emits codes.Unavailable: per gRPC conventions, +// the canonical signal for "retry may succeed". +func newUnavailableError(walName string, err error) error { + return status.Errorf( + codes.Unavailable, + "transient error while downloading %q: %s", + walName, + err.Error(), + ) +} + +// newInvalidWALNameError reports that the requested WAL name is +// not a valid name. Emits codes.InvalidArgument: this is a +// terminal condition (the same name won't become valid on retry). +func newInvalidWALNameError(walName string, err error) error { + return status.Errorf( + codes.InvalidArgument, + "invalid WAL name %q: %s", + walName, + err.Error(), + ) +} + +// newInternalWALRestoreError reports that downloading the WAL +// file failed for an unclassified reason. Emits codes.Internal: +// we have no positive signal that retry would help, so by gRPC +// convention this is treated as terminal. +func newInternalWALRestoreError(walName string, err error) error { + return status.Errorf( + codes.Internal, + "internal error while downloading %q: %s", + walName, + err.Error(), + ) +} diff --git a/internal/cnpgi/common/errors_test.go b/internal/cnpgi/common/errors_test.go new file mode 100644 index 0000000..d2647b0 --- /dev/null +++ b/internal/cnpgi/common/errors_test.go @@ -0,0 +1,86 @@ +/* +Copyright © contributors to CloudNativePG, established as +CloudNativePG a Series of LF Projects, LLC. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. + +SPDX-License-Identifier: Apache-2.0 +*/ + +package common + +import ( + "errors" + "fmt" + + barmanRestorer "github.com/cloudnative-pg/barman-cloud/pkg/restorer" + . "github.com/onsi/ginkgo/v2" + . "github.com/onsi/gomega" + "google.golang.org/grpc/codes" + "google.golang.org/grpc/status" +) + +var _ = Describe("classifyWALRestoreError", func() { + const walName = "000000010000000000000001" + + DescribeTable( + "maps barman restorer sentinels to gRPC status codes", + func(walErr error, expectedCode codes.Code) { + got := classifyWALRestoreError(walName, walErr) + Expect(got).To(HaveOccurred()) + + st, ok := status.FromError(got) + Expect(ok).To(BeTrue(), "returned error must carry a gRPC status") + Expect(st.Code()).To(Equal(expectedCode)) + Expect(st.Message()).To(ContainSubstring(walName)) + }, + Entry("ErrWALNotFound -> NotFound", + fmt.Errorf("object storage or file not found: %w", barmanRestorer.ErrWALNotFound), + codes.NotFound), + Entry("ErrInvalidWALName -> InvalidArgument", + fmt.Errorf("invalid name for a WAL file: %w", barmanRestorer.ErrInvalidWALName), + codes.InvalidArgument), + Entry("ErrConnectivity -> Unavailable", + fmt.Errorf("connectivity failure, retrying: %w", barmanRestorer.ErrConnectivity), + codes.Unavailable), + Entry("ErrGeneric -> Unavailable (barman uses exit 4 for some retryable cases too)", + fmt.Errorf("generic error: %w", barmanRestorer.ErrGeneric), + codes.Unavailable), + Entry("unknown error -> Internal", + errors.New("something we did not classify"), + codes.Internal), + ) + + It("matches the sentinel even through several wrapping layers", func() { + // The plugin wraps barman errors via fmt.Errorf("...: %w", ...); + // classification must keep working if more wraps appear above. + inner := fmt.Errorf("connectivity failure, retrying: %w", barmanRestorer.ErrConnectivity) + wrapped := fmt.Errorf("while restoring WAL %s: %w", walName, inner) + + got := classifyWALRestoreError(walName, wrapped) + st, ok := status.FromError(got) + Expect(ok).To(BeTrue()) + Expect(st.Code()).To(Equal(codes.Unavailable)) + }) + + It("treats ErrWALNotFound as terminal even when the error chain mentions other sentinels in its message", func() { + // Defensive: if the underlying error stringifies to something + // resembling another sentinel's message, the switch must still + // match by identity (errors.Is), not by substring. + walErr := fmt.Errorf("not found, looks like a connectivity failure: %w", barmanRestorer.ErrWALNotFound) + + got := classifyWALRestoreError(walName, walErr) + st, _ := status.FromError(got) + Expect(st.Code()).To(Equal(codes.NotFound)) + }) +}) diff --git a/internal/cnpgi/common/scheme.go b/internal/cnpgi/common/scheme.go index 8f74015..b2acb53 100644 --- a/internal/cnpgi/common/scheme.go +++ b/internal/cnpgi/common/scheme.go @@ -25,6 +25,7 @@ import ( cnpgv1 "github.com/cloudnative-pg/cloudnative-pg/api/v1" "github.com/cloudnative-pg/machinery/pkg/log" "github.com/spf13/viper" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/runtime/schema" utilruntime "k8s.io/apimachinery/pkg/util/runtime" @@ -58,6 +59,7 @@ func GenerateScheme(ctx context.Context) *runtime.Scheme { &cnpgv1.Backup{}, &cnpgv1.BackupList{}, &cnpgv1.ScheduledBackup{}, &cnpgv1.ScheduledBackupList{}, ) + metav1.AddToGroupVersion(result, schemeGroupVersion) schemeLog := log.FromContext(ctx) schemeLog.Info("CNPG types registration", "schemeGroupVersion", schemeGroupVersion) diff --git a/internal/cnpgi/common/suite_test.go b/internal/cnpgi/common/suite_test.go new file mode 100644 index 0000000..52a9375 --- /dev/null +++ b/internal/cnpgi/common/suite_test.go @@ -0,0 +1,32 @@ +/* +Copyright © contributors to CloudNativePG, established as +CloudNativePG a Series of LF Projects, LLC. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. + +SPDX-License-Identifier: Apache-2.0 +*/ + +package common + +import ( + "testing" + + . "github.com/onsi/ginkgo/v2" + . "github.com/onsi/gomega" +) + +func TestCommon(t *testing.T) { + RegisterFailHandler(Fail) + RunSpecs(t, "Common Suite") +} diff --git a/internal/cnpgi/common/wal.go b/internal/cnpgi/common/wal.go index 8e58cb4..537fa34 100644 --- a/internal/cnpgi/common/wal.go +++ b/internal/cnpgi/common/wal.go @@ -27,6 +27,7 @@ import ( "path" "time" + barmanapi "github.com/cloudnative-pg/barman-cloud/pkg/api" "github.com/cloudnative-pg/barman-cloud/pkg/archiver" barmanCommand "github.com/cloudnative-pg/barman-cloud/pkg/command" barmanCredentials "github.com/cloudnative-pg/barman-cloud/pkg/credentials" @@ -155,13 +156,17 @@ func (w WALServiceImplementation) Archive( return nil, err } - // Step 2: Check if the archive location is safe to perform archiving - checkFileExisting, err := fileutils.FileExists(emptyWalArchiveFile) + // Step 2: Check if the archive location is safe to perform archiving. + checkEmptyWalArchive, err := resolveArchiveEmptyWalArchiveCheck( + request.CheckEmptyWalArchive, + configuration.Cluster, + emptyWalArchiveFile, + ) if err != nil { - return nil, fmt.Errorf("while checking for empty wal archive check file %q: %w", emptyWalArchiveFile, err) + return nil, err } - if utils.IsEmptyWalArchiveCheckEnabled(&configuration.Cluster.ObjectMeta) && checkFileExisting { + if checkEmptyWalArchive { if err := CheckBackupDestination( ctx, &objectStore.Spec.Configuration, @@ -223,8 +228,32 @@ func (w WALServiceImplementation) Archive( return &wal.WALArchiveResult{}, nil } +// resolveArchiveEmptyWalArchiveCheck reports whether the WAL archive +// destination must be verified before archiving this segment. +// +// The operator owns the marker file's lifecycle, so when it sets the decision +// (non-nil) that value already accounts for the marker and is obeyed as-is. A +// nil value comes from an operator that predates this field, so we fall back to +// the previous logic: the Cluster annotation combined with the on-disk marker +// file. +func resolveArchiveEmptyWalArchiveCheck( + operatorDecision *bool, + cluster *cnpgv1.Cluster, + markerFilePath string, +) (bool, error) { + if operatorDecision != nil { + return *operatorDecision, nil + } + + markerFilePresent, err := fileutils.FileExists(markerFilePath) + if err != nil { + return false, fmt.Errorf("while checking for empty wal archive check file %q: %w", markerFilePath, err) + } + + return utils.IsEmptyWalArchiveCheckEnabled(&cluster.ObjectMeta) && markerFilePresent, nil +} + // Restore implements the WALService interface -// nolint: gocognit func (w WALServiceImplementation) Restore( ctx context.Context, request *wal.WALRestoreRequest, @@ -239,36 +268,7 @@ func (w WALServiceImplementation) Restore( return nil, err } - var serverName string - var objectStoreKey types.NamespacedName - - var promotionToken string - if configuration.Cluster.Spec.ReplicaCluster != nil { - promotionToken = configuration.Cluster.Spec.ReplicaCluster.PromotionToken - } - - switch { - case promotionToken != "" && configuration.Cluster.Status.LastPromotionToken != promotionToken: - // This is a replica cluster that is being promoted to a primary cluster - // Recover from the replica source object store - serverName = configuration.ReplicaSourceServerName - objectStoreKey = configuration.GetReplicaSourceBarmanObjectKey() - - case configuration.Cluster.IsReplica() && configuration.Cluster.Status.CurrentPrimary == w.InstanceName: - // Designated primary on replica cluster, using replica source object store - serverName = configuration.ReplicaSourceServerName - objectStoreKey = configuration.GetReplicaSourceBarmanObjectKey() - - case configuration.Cluster.Status.CurrentPrimary == "": - // Recovery from object store, using recovery object store - serverName = configuration.RecoveryServerName - objectStoreKey = configuration.GetRecoveryBarmanObjectKey() - - default: - // Using cluster object store - serverName = configuration.ServerName - objectStoreKey = configuration.GetBarmanObjectKey() - } + serverName, objectStoreKey := resolveRestoreObjectStore(configuration, w.InstanceName) var objectStore barmancloudv1.ObjectStore if err := w.Client.Get(ctx, objectStoreKey, &objectStore); err != nil { @@ -279,9 +279,38 @@ func (w WALServiceImplementation) Restore( "Restoring WAL file", "objectStore", objectStore.Name, "serverName", serverName, - "walName", walName) + "walName", walName, + "mode", request.GetMode()) return &wal.WALRestoreResult{}, w.restoreFromBarmanObjectStore( - ctx, configuration.Cluster, &objectStore, serverName, walName, destinationPath) + ctx, configuration.Cluster, &objectStore, serverName, walName, destinationPath, + request.GetMode() == wal.WALRestoreRequest_MODE_REWIND) +} + +// resolveRestoreObjectStore selects the object store and server name to use when +// restoring a WAL file, based on the role this instance plays in the cluster. +func resolveRestoreObjectStore( + configuration *config.PluginConfiguration, + instanceName string, +) (serverName string, objectStoreKey types.NamespacedName) { + switch { + case configuration.Cluster.Status.CurrentPrimary == instanceName && + len(configuration.ReplicaSourceBarmanObjectName) > 0: + // PostgreSQL never runs restore_command on a live primary; it runs only while + // the instance is in recovery (a genuine standby, restoring from a backup, or + // being rewound by pg_rewind). So a current primary that still has a replica + // source configured can only be a designated primary that has not finished + // promoting, and it must keep fetching WAL from the replica source. + // Token-agnostic: covers both switchover and failover. + return configuration.ReplicaSourceServerName, configuration.GetReplicaSourceBarmanObjectKey() + + case configuration.Cluster.Status.CurrentPrimary == "": + // Recovery from object store, using recovery object store + return configuration.RecoveryServerName, configuration.GetRecoveryBarmanObjectKey() + + default: + // Using cluster object store + return configuration.ServerName, configuration.GetBarmanObjectKey() + } } func (w WALServiceImplementation) restoreFromBarmanObjectStore( @@ -291,6 +320,7 @@ func (w WALServiceImplementation) restoreFromBarmanObjectStore( serverName string, walName string, destinationPath string, + rewindMode bool, ) error { contextLogger := log.FromContext(ctx) startTime := time.Now() @@ -322,6 +352,20 @@ func (w WALServiceImplementation) restoreFromBarmanObjectStore( return fmt.Errorf("while creating the restorer: %w", err) } + // A flag left over from a normal-recovery invocation that ran before this pod + // was demoted must not survive into a pg_rewind restore: the flag machinery + // does not apply while restoring on behalf of pg_rewind (see + // shouldUseEndOfWALStreamFlag below), so it is never checked here, but left + // untouched it would resurface and wrongly abort the first normal-recovery + // invocation that runs once the rewind is done. This runs unconditionally, + // before the spool short-circuit in Step 1, so a request for a WAL file that + // happens to already be staged in the spool cannot skip the clear. + if rewindMode { + if err := clearEndOfWALStreamFlag(walRestorer); err != nil { + return err + } + } + // Step 1: check if this WAL file is not already in the spool var wasInSpool bool if wasInSpool, err = walRestorer.RestoreFromSpool(walName, destinationPath); err != nil { @@ -334,8 +378,10 @@ func (w WALServiceImplementation) restoreFromBarmanObjectStore( return nil } - // We skip this step if streaming connection is not available - if isStreamingAvailable(cluster, w.InstanceName) { + // Step 2: return error if the end-of-wal-stream flag is set. + // We skip this step if the flag machinery does not apply to this invocation + useEndOfWALStreamFlag := shouldUseEndOfWALStreamFlag(cluster, w.InstanceName, rewindMode) + if useEndOfWALStreamFlag { if err := checkEndOfWALStreamFlag(walRestorer); err != nil { return err } @@ -343,10 +389,7 @@ func (w WALServiceImplementation) restoreFromBarmanObjectStore( // Step 3: gather the WAL files names to restore. If the required file isn't a regular WAL, we download it directly. var walFilesList []string - maxParallel := 1 - if barmanConfiguration.Wal != nil && barmanConfiguration.Wal.MaxParallel > 1 { - maxParallel = barmanConfiguration.Wal.MaxParallel - } + maxParallel := maxWALFilesPerInvocation(barmanConfiguration, rewindMode) if IsWALFile(walName) { // If this is a regular WAL file, we try to prefetch if walFilesList, err = gatherWALFilesToRestore(walName, maxParallel); err != nil { @@ -365,16 +408,12 @@ func (w WALServiceImplementation) restoreFromBarmanObjectStore( // is the one that PostgreSQL has requested to restore. // The failure has already been logged in walRestorer.RestoreList method if walStatus[0].Err != nil { - if errors.Is(walStatus[0].Err, barmanRestorer.ErrWALNotFound) { - return newWALNotFoundError(walStatus[0].WalName) - } - - return walStatus[0].Err + return classifyWALRestoreError(walStatus[0].WalName, walStatus[0].Err) } - // We skip this step if streaming connection is not available + // We skip this step if the flag machinery does not apply to this invocation endOfWALStream := isEndOfWALStream(walStatus) - if isStreamingAvailable(cluster, w.InstanceName) && endOfWALStream { + if useEndOfWALStreamFlag && endOfWALStream { contextLogger.Info( "Set end-of-wal-stream flag as one of the WAL files to be prefetched was not found") @@ -422,6 +461,38 @@ func (w WALServiceImplementation) SetFirstRequired( panic("implement me") } +// maxWALFilesPerInvocation returns how many WAL files a single restore +// invocation is allowed to fetch, the requested one included. Prefetching is +// disabled when restoring on behalf of pg_rewind, which walks the WAL +// backward: the following segments would never be requested, and past the end +// of the timeline they do not even exist +func maxWALFilesPerInvocation(barmanConfiguration *barmanapi.BarmanObjectStoreConfiguration, rewindMode bool) int { + if rewindMode { + return 1 + } + + if barmanConfiguration.Wal != nil && barmanConfiguration.Wal.MaxParallel > 1 { + return barmanConfiguration.Wal.MaxParallel + } + + return 1 +} + +// shouldUseEndOfWALStreamFlag returns true when the end-of-wal-stream flag +// machinery applies to the current invocation. The flag makes the following +// invocation fail, so that PostgreSQL stops polling the WAL archive and +// switches to streaming replication. It does not apply when no streaming +// connection is available, nor when restoring on behalf of pg_rewind: +// pg_rewind cannot fall back to streaming replication, and a stale flag would +// make it abort on a segment that is available in the archive +func shouldUseEndOfWALStreamFlag(cluster *cnpgv1.Cluster, podName string, rewindMode bool) bool { + if rewindMode { + return false + } + + return isStreamingAvailable(cluster, podName) +} + // isStreamingAvailable checks if this pod can replicate via streaming connection. func isStreamingAvailable(cluster *cnpgv1.Cluster, podName string) bool { if cluster == nil { @@ -498,6 +569,22 @@ func checkEndOfWALStreamFlag(walRestorer *barmanRestorer.WALRestorer) error { return nil } +// clearEndOfWALStreamFlag removes the end-of-wal-stream flag, if present, without +// treating it as an error. It is used instead of checkEndOfWALStreamFlag when +// restoring on behalf of pg_rewind, which must not abort on a flag it did not +// set itself. +func clearEndOfWALStreamFlag(walRestorer *barmanRestorer.WALRestorer) error { + contain, err := walRestorer.IsEndOfWALStream() + if err != nil { + return err + } + + if contain { + return walRestorer.ResetEndOfWalStream() + } + return nil +} + // isEndOfWALStream returns true if one of the downloads has returned // a file-not-found error. func isEndOfWALStream(results []barmanRestorer.Result) bool { diff --git a/internal/cnpgi/common/wal_test.go b/internal/cnpgi/common/wal_test.go new file mode 100644 index 0000000..0ce2dfd --- /dev/null +++ b/internal/cnpgi/common/wal_test.go @@ -0,0 +1,246 @@ +/* +Copyright © contributors to CloudNativePG, established as +CloudNativePG a Series of LF Projects, LLC. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. + +SPDX-License-Identifier: Apache-2.0 +*/ + +package common + +import ( + "context" + "os" + "path/filepath" + + barmanapi "github.com/cloudnative-pg/barman-cloud/pkg/api" + barmanRestorer "github.com/cloudnative-pg/barman-cloud/pkg/restorer" + cnpgv1 "github.com/cloudnative-pg/cloudnative-pg/api/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/utils/ptr" + + "github.com/cloudnative-pg/plugin-barman-cloud/internal/cnpgi/metadata" + "github.com/cloudnative-pg/plugin-barman-cloud/internal/cnpgi/operator/config" + + . "github.com/onsi/ginkgo/v2" + . "github.com/onsi/gomega" +) + +var _ = Describe("resolveRestoreObjectStore", func() { + const ( + namespace = "test-ns" + instance = "cluster-1" + ) + + // newConfig builds a PluginConfiguration with distinct, recognizable names + // for every candidate object store, so each test can assert exactly which + // one the routing selected. + newConfig := func(currentPrimary, replicaSourceObject string) *config.PluginConfiguration { + return &config.PluginConfiguration{ + Cluster: &cnpgv1.Cluster{ + ObjectMeta: metav1.ObjectMeta{Namespace: namespace}, + Status: cnpgv1.ClusterStatus{CurrentPrimary: currentPrimary}, + }, + BarmanObjectName: "cluster-store", + ServerName: "cluster-server", + RecoveryBarmanObjectName: "recovery-store", + RecoveryServerName: "recovery-server", + ReplicaSourceBarmanObjectName: replicaSourceObject, + ReplicaSourceServerName: "replica-server", + } + } + + DescribeTable( + "selects the correct object store for restoring WAL files", + func(cfg *config.PluginConfiguration, wantServer, wantObject string) { + gotServer, gotKey := resolveRestoreObjectStore(cfg, instance) + + Expect(gotServer).To(Equal(wantServer)) + Expect(gotKey.Name).To(Equal(wantObject)) + Expect(gotKey.Namespace).To(Equal(namespace)) + }, + + // The regression this guards: during a designated-primary promotion the + // instance is already the current primary while still in recovery, and it + // must pull remaining WALs from the replica source. The routing decision does + // not depend on the promotion token, so this single case covers both + // switchover and failover. + Entry("designated primary in promotion -> replica source", + newConfig(instance, "replica-store"), + "replica-server", "replica-store"), + + // Guards the len(ReplicaSourceBarmanObjectName) > 0 gate: a current primary + // without a barman-backed replica source (plain HA primary, or a replica + // cluster whose source is streaming-only) must use the cluster store, not + // an empty-named replica source key. + Entry("current primary without a replica source -> cluster store", + newConfig(instance, ""), + "cluster-server", "cluster-store"), + + // Bootstrap / PITR: no current primary yet. Recovery wins even if a replica + // source happens to be configured. + Entry("no current primary -> recovery store", + newConfig("", "replica-store"), + "recovery-server", "recovery-store"), + + Entry("ordinary standby -> cluster store", + newConfig("cluster-2", ""), + "cluster-server", "cluster-store"), + + // A non-primary instance must never route to the replica source, even when + // one is configured: only the designated primary catches up from the source. + Entry("standby in a replica cluster -> cluster store", + newConfig("cluster-2", "replica-store"), + "cluster-server", "cluster-store"), + ) +}) + +var _ = Describe("maxWALFilesPerInvocation", func() { + configWithMaxParallel := func(maxParallel int) *barmanapi.BarmanObjectStoreConfiguration { + return &barmanapi.BarmanObjectStoreConfiguration{ + Wal: &barmanapi.WalBackupConfiguration{MaxParallel: maxParallel}, + } + } + + DescribeTable( + "computes how many WAL files a single invocation may fetch", + func(cfg *barmanapi.BarmanObjectStoreConfiguration, rewindMode bool, want int) { + Expect(maxWALFilesPerInvocation(cfg, rewindMode)).To(Equal(want)) + }, + + Entry("no WAL configuration", &barmanapi.BarmanObjectStoreConfiguration{}, false, 1), + Entry("parallel restore configured", configWithMaxParallel(8), false, 8), + + // pg_rewind walks the timeline backwards: prefetching must stay off no + // matter what the object store configuration asks for + Entry("rewind mode overrides the configured parallelism", configWithMaxParallel(8), true, 1), + ) +}) + +var _ = Describe("shouldUseEndOfWALStreamFlag", func() { + clusterWithPrimary := func(currentPrimary string) *cnpgv1.Cluster { + return &cnpgv1.Cluster{ + Status: cnpgv1.ClusterStatus{CurrentPrimary: currentPrimary}, + } + } + + DescribeTable( + "decides whether the end-of-wal-stream flag machinery applies", + func(cluster *cnpgv1.Cluster, podName string, rewindMode bool, want bool) { + Expect(shouldUseEndOfWALStreamFlag(cluster, podName, rewindMode)).To(Equal(want)) + }, + + Entry("replica with streaming available", clusterWithPrimary("cluster-1"), "cluster-2", false, true), + Entry("primary cannot stream from anyone", clusterWithPrimary("cluster-1"), "cluster-1", false, false), + + // pg_rewind cannot fall back to streaming replication: the flag machinery + // must stay off even where a standby would use it + Entry("rewind mode wins over streaming availability", clusterWithPrimary("cluster-1"), "cluster-2", true, false), + ) +}) + +var _ = Describe("clearEndOfWALStreamFlag", func() { + newRestorer := func() *barmanRestorer.WALRestorer { + restorer, err := barmanRestorer.New(context.Background(), nil, GinkgoT().TempDir()) + Expect(err).ToNot(HaveOccurred()) + return restorer + } + + It("is a no-op when the flag is not set", func() { + restorer := newRestorer() + + Expect(clearEndOfWALStreamFlag(restorer)).To(Succeed()) + + isEOS, err := restorer.IsEndOfWALStream() + Expect(err).ToNot(HaveOccurred()) + Expect(isEOS).To(BeFalse()) + }) + + // Regression guard: a flag left over from a normal-recovery invocation that + // ran before this pod was demoted must not survive a pg_rewind restore, or + // it would resurface and wrongly abort the first normal-recovery invocation + // that runs once the rewind is done. + It("removes a pre-existing flag without returning an error", func() { + restorer := newRestorer() + Expect(restorer.SetEndOfWALStream()).To(Succeed()) + + Expect(clearEndOfWALStreamFlag(restorer)).To(Succeed()) + + isEOS, err := restorer.IsEndOfWALStream() + Expect(err).ToNot(HaveOccurred()) + Expect(isEOS).To(BeFalse()) + }) +}) + +var _ = Describe("resolveArchiveEmptyWalArchiveCheck", func() { + // skipAnnotation mirrors the unexported constant in cloudnative-pg's + // pkg/utils; hard-coding the literal makes a divergence surface as a + // failing test rather than silently disabling the check. + const skipAnnotation = "cnpg.io/skipEmptyWalArchiveCheck" + + clusterWith := func(annotationValue *string) *cnpgv1.Cluster { + cluster := &cnpgv1.Cluster{} + if annotationValue != nil { + cluster.Annotations = map[string]string{skipAnnotation: *annotationValue} + } + return cluster + } + + // markerPath returns the marker file path inside a fresh temp dir, + // creating the file there when present is true. + markerPath := func(present bool) string { + filePath := filepath.Join(GinkgoT().TempDir(), metadata.CheckEmptyWalArchiveFile) + if present { + Expect(os.WriteFile(filePath, []byte{}, 0o600)).To(Succeed()) + } + return filePath + } + + When("the operator sets the decision", func() { + It("obeys true, ignoring the annotation and the marker file", func() { + // annotation would skip the check and the marker is absent, yet the + // operator's explicit true must still win. + got, err := resolveArchiveEmptyWalArchiveCheck( + ptr.To(true), clusterWith(ptr.To("enabled")), markerPath(false)) + Expect(err).NotTo(HaveOccurred()) + Expect(got).To(BeTrue()) + }) + + It("obeys false, ignoring the annotation and the marker file", func() { + // annotation would keep the check on and the marker is present, yet the + // operator's explicit false must still win. + got, err := resolveArchiveEmptyWalArchiveCheck( + ptr.To(false), clusterWith(nil), markerPath(true)) + Expect(err).NotTo(HaveOccurred()) + Expect(got).To(BeFalse()) + }) + }) + + When("the operator predates the field (nil decision)", func() { + DescribeTable( + "falls back to the annotation combined with the marker file", + func(annotationValue *string, markerPresent bool, expected bool) { + got, err := resolveArchiveEmptyWalArchiveCheck( + nil, clusterWith(annotationValue), markerPath(markerPresent)) + Expect(err).NotTo(HaveOccurred()) + Expect(got).To(Equal(expected)) + }, + Entry("no annotation and marker present: check runs", nil, true, true), + Entry("no annotation and marker absent: check skipped", nil, false, false), + Entry("opt-out annotation and marker present: check skipped", ptr.To("enabled"), true, false), + Entry("unrelated annotation value and marker present: check runs", ptr.To("something-else"), true, true), + Entry("empty annotation value and marker present: check runs", ptr.To(""), true, true), + ) + }) +}) diff --git a/internal/cnpgi/instance/identity.go b/internal/cnpgi/instance/identity.go index ea3b2fd..7563de3 100644 --- a/internal/cnpgi/instance/identity.go +++ b/internal/cnpgi/instance/identity.go @@ -70,6 +70,13 @@ func (i IdentityImplementation) GetPluginCapabilities( }, }, }, + { + Type: &identity.PluginCapability_Service_{ + Service: &identity.PluginCapability_Service{ + Type: identity.PluginCapability_Service_TYPE_RESTORE_JOB, + }, + }, + }, }, }, nil } diff --git a/internal/cnpgi/instance/identity_test.go b/internal/cnpgi/instance/identity_test.go new file mode 100644 index 0000000..b4ab5bb --- /dev/null +++ b/internal/cnpgi/instance/identity_test.go @@ -0,0 +1,51 @@ +/* +Copyright © contributors to CloudNativePG, established as +CloudNativePG a Series of LF Projects, LLC. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. + +SPDX-License-Identifier: Apache-2.0 +*/ + +package instance + +import ( + "github.com/cloudnative-pg/cnpg-i/pkg/identity" + + . "github.com/onsi/ginkgo/v2" + . "github.com/onsi/gomega" +) + +var _ = Describe("IdentityImplementation", func() { + Describe("GetPluginCapabilities", func() { + It("declares the WAL, backup, metrics and restore-job services", func(ctx SpecContext) { + impl := IdentityImplementation{} + response, err := impl.GetPluginCapabilities(ctx, &identity.GetPluginCapabilitiesRequest{}) + Expect(err).NotTo(HaveOccurred()) + Expect(response).NotTo(BeNil()) + + var serviceTypes []identity.PluginCapability_Service_Type + for _, capability := range response.GetCapabilities() { + serviceTypes = append(serviceTypes, capability.GetService().GetType()) + } + + // Runs the phase-0 restore in-process now, hence TYPE_RESTORE_JOB below. + Expect(serviceTypes).To(ConsistOf( + identity.PluginCapability_Service_TYPE_WAL_SERVICE, + identity.PluginCapability_Service_TYPE_BACKUP_SERVICE, + identity.PluginCapability_Service_TYPE_METRICS, + identity.PluginCapability_Service_TYPE_RESTORE_JOB, + )) + }) + }) +}) diff --git a/internal/cnpgi/instance/start.go b/internal/cnpgi/instance/start.go index b222653..a68cda2 100644 --- a/internal/cnpgi/instance/start.go +++ b/internal/cnpgi/instance/start.go @@ -25,11 +25,13 @@ import ( "github.com/cloudnative-pg/cnpg-i-machinery/pkg/pluginhelper/http" "github.com/cloudnative-pg/cnpg-i/pkg/backup" "github.com/cloudnative-pg/cnpg-i/pkg/metrics" + restore "github.com/cloudnative-pg/cnpg-i/pkg/restore/job" "github.com/cloudnative-pg/cnpg-i/pkg/wal" "google.golang.org/grpc" "sigs.k8s.io/controller-runtime/pkg/client" "github.com/cloudnative-pg/plugin-barman-cloud/internal/cnpgi/common" + barmanrestore "github.com/cloudnative-pg/plugin-barman-cloud/internal/cnpgi/restore" ) // CNPGI is the implementation of the PostgreSQL sidecar @@ -60,6 +62,15 @@ func (c *CNPGI) Start(ctx context.Context) error { metrics.RegisterMetricsServer(server, &metricsImpl{ Client: c.Client, }) + // The instance pod runs the phase-0 bootstrap in-process (no separate + // recovery Job), so the same sidecar must answer the Restore RPC that + // initializes PGDATA from the object store before PostgreSQL starts. + restore.RegisterRestoreJobHooksServer(server, &barmanrestore.JobHookImpl{ + Client: c.Client, + SpoolDirectory: c.SpoolDirectory, + PgDataPath: c.PGDataPath, + PgWalFolderToSymlink: common.PgWalVolumePgWalPath, + }) common.AddHealthCheck(server) return nil } diff --git a/internal/cnpgi/metadata/constants.go b/internal/cnpgi/metadata/constants.go index fb45da6..ed9bb8a 100644 --- a/internal/cnpgi/metadata/constants.go +++ b/internal/cnpgi/metadata/constants.go @@ -63,7 +63,7 @@ const ( // Data is the metadata of this plugin. var Data = identity.GetPluginMetadataResponse{ Name: PluginName, - Version: "0.12.0", // x-release-please-version + Version: "0.15.0", // x-release-please-version DisplayName: "BarmanCloudInstance", ProjectUrl: "https://github.com/cloudnative-pg/plugin-barman-cloud", RepositoryUrl: "https://github.com/cloudnative-pg/plugin-barman-cloud", diff --git a/internal/cnpgi/operator/config/config.go b/internal/cnpgi/operator/config/config.go index 61c7063..db9ca41 100644 --- a/internal/cnpgi/operator/config/config.go +++ b/internal/cnpgi/operator/config/config.go @@ -102,6 +102,13 @@ func (config *PluginConfiguration) GetReplicaSourceBarmanObjectKey() types.Names } } +// HasAnyBarmanObjectStore reports whether any barman object store is configured. +func (config *PluginConfiguration) HasAnyBarmanObjectStore() bool { + return len(config.BarmanObjectName) > 0 || + len(config.RecoveryBarmanObjectName) > 0 || + len(config.ReplicaSourceBarmanObjectName) > 0 +} + // GetReferredBarmanObjectsKey gets the list of barman objects referred by this // plugin configuration func (config *PluginConfiguration) GetReferredBarmanObjectsKey() []types.NamespacedName { @@ -263,7 +270,7 @@ func getReplicaSourcePlugin(cluster *cnpgv1.Cluster) *cnpgv1.PluginConfiguration func (config *PluginConfiguration) Validate() error { err := NewConfigurationError() - if len(config.BarmanObjectName) == 0 && len(config.RecoveryBarmanObjectName) == 0 { + if !config.HasAnyBarmanObjectStore() { return err.WithMessage("no reference to barmanObjectName have been included") } diff --git a/internal/cnpgi/operator/config/config_test.go b/internal/cnpgi/operator/config/config_test.go new file mode 100644 index 0000000..3697875 --- /dev/null +++ b/internal/cnpgi/operator/config/config_test.go @@ -0,0 +1,126 @@ +/* +Copyright © contributors to CloudNativePG, established as +CloudNativePG a Series of LF Projects, LLC. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. + +SPDX-License-Identifier: Apache-2.0 +*/ + +package config + +import ( + cnpgv1 "github.com/cloudnative-pg/cloudnative-pg/api/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + + . "github.com/onsi/ginkgo/v2" + . "github.com/onsi/gomega" + + "github.com/cloudnative-pg/plugin-barman-cloud/internal/cnpgi/metadata" +) + +var _ = Describe("PluginConfiguration.Validate", func() { + It("fails when no barman object name is set", func() { + cfg := &PluginConfiguration{} + Expect(cfg.Validate()).To(HaveOccurred()) + }) + + It("passes when only BarmanObjectName is set (backup/archive)", func() { + cfg := &PluginConfiguration{BarmanObjectName: "my-store"} + Expect(cfg.Validate()).To(Succeed()) + }) + + It("passes when only RecoveryBarmanObjectName is set (recovery bootstrap)", func() { + cfg := &PluginConfiguration{RecoveryBarmanObjectName: "my-store"} + Expect(cfg.Validate()).To(Succeed()) + }) + + It("passes when only ReplicaSourceBarmanObjectName is set (pg_basebackup replica cluster)", func() { + cfg := &PluginConfiguration{ReplicaSourceBarmanObjectName: "my-store"} + Expect(cfg.Validate()).To(Succeed()) + }) +}) + +var _ = Describe("NewFromCluster", func() { + enabled := true + + It("derives the replica source object store for a pg_basebackup replica cluster", func() { + cluster := &cnpgv1.Cluster{ + ObjectMeta: metav1.ObjectMeta{Name: "cluster-replica", Namespace: "test-ns"}, + Spec: cnpgv1.ClusterSpec{ + Bootstrap: &cnpgv1.BootstrapConfiguration{ + PgBaseBackup: &cnpgv1.BootstrapPgBaseBackup{Source: "source"}, + }, + ReplicaCluster: &cnpgv1.ReplicaClusterConfiguration{ + Enabled: &enabled, + Source: "source", + }, + ExternalClusters: []cnpgv1.ExternalCluster{ + { + Name: "source", + PluginConfiguration: &cnpgv1.PluginConfiguration{ + Name: metadata.PluginName, + Parameters: map[string]string{ + "barmanObjectName": "minio-store", + "serverName": "cluster-example", + }, + }, + }, + }, + }, + } + + cfg := NewFromCluster(cluster) + + // The replica source object store is derived from the external cluster plugin, + // while the backup/archive and recovery object stores remain empty: this is the + // distinguishing trait of a pg_basebackup replica cluster (a recovery-bootstrapped + // replica would also populate RecoveryBarmanObjectName). + Expect(cfg.ReplicaSourceBarmanObjectName).To(Equal("minio-store")) + Expect(cfg.ReplicaSourceServerName).To(Equal("cluster-example")) + Expect(cfg.BarmanObjectName).To(BeEmpty()) + Expect(cfg.RecoveryBarmanObjectName).To(BeEmpty()) + + // Validate must accept it, otherwise the lifecycle hook skips sidecar injection. + Expect(cfg.Validate()).To(Succeed()) + }) + + It("ignores a replica source backed by a different plugin", func() { + cluster := &cnpgv1.Cluster{ + ObjectMeta: metav1.ObjectMeta{Name: "cluster-replica", Namespace: "test-ns"}, + Spec: cnpgv1.ClusterSpec{ + Bootstrap: &cnpgv1.BootstrapConfiguration{ + PgBaseBackup: &cnpgv1.BootstrapPgBaseBackup{Source: "source"}, + }, + ReplicaCluster: &cnpgv1.ReplicaClusterConfiguration{ + Enabled: &enabled, + Source: "source", + }, + ExternalClusters: []cnpgv1.ExternalCluster{ + { + Name: "source", + PluginConfiguration: &cnpgv1.PluginConfiguration{ + Name: "some-other-plugin.cloudnative-pg.io", + Parameters: map[string]string{"barmanObjectName": "minio-store"}, + }, + }, + }, + }, + } + + cfg := NewFromCluster(cluster) + + Expect(cfg.ReplicaSourceBarmanObjectName).To(BeEmpty()) + Expect(cfg.Validate()).NotTo(Succeed()) + }) +}) diff --git a/internal/cnpgi/operator/config/suite_test.go b/internal/cnpgi/operator/config/suite_test.go new file mode 100644 index 0000000..5448bb3 --- /dev/null +++ b/internal/cnpgi/operator/config/suite_test.go @@ -0,0 +1,32 @@ +/* +Copyright © contributors to CloudNativePG, established as +CloudNativePG a Series of LF Projects, LLC. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. + +SPDX-License-Identifier: Apache-2.0 +*/ + +package config + +import ( + "testing" + + . "github.com/onsi/ginkgo/v2" + . "github.com/onsi/gomega" +) + +func TestConfig(t *testing.T) { + RegisterFailHandler(Fail) + RunSpecs(t, "Config Suite") +} diff --git a/internal/cnpgi/operator/lifecycle.go b/internal/cnpgi/operator/lifecycle.go index b25af55..18730fd 100644 --- a/internal/cnpgi/operator/lifecycle.go +++ b/internal/cnpgi/operator/lifecycle.go @@ -273,8 +273,10 @@ func (impl LifecycleImplementation) collectAdditionalInstanceArgs( return args } - // Prefer the cluster object store (backup/archive). If not set, fallback to the recovery object store. - // If neither is configured, no additional args are provided. + // Only one object store provides the sidecar arguments, with precedence: + // BarmanObjectName (backup/archive) > RecoveryBarmanObjectName (recovery + // bootstrap) > ReplicaSourceBarmanObjectName (pg_basebackup replica). + // If none is configured, no additional args are provided. if len(pluginConfiguration.BarmanObjectName) > 0 { var barmanObjectStore barmancloudv1.ObjectStore if err := impl.Client.Get(ctx, pluginConfiguration.GetBarmanObjectKey(), &barmanObjectStore); err != nil { @@ -303,9 +305,59 @@ func (impl LifecycleImplementation) collectAdditionalInstanceArgs( return args, nil } + if len(pluginConfiguration.ReplicaSourceBarmanObjectName) > 0 { + key := pluginConfiguration.GetReplicaSourceBarmanObjectKey() + var barmanObjectStore barmancloudv1.ObjectStore + if err := impl.Client.Get(ctx, key, &barmanObjectStore); err != nil { + return nil, fmt.Errorf("while getting replica source barman object store %s: %w", key.String(), err) + } + args := barmanObjectStore.Spec.InstanceSidecarConfiguration.AdditionalContainerArgs + args = append( + args, + collectTypedAdditionalArgs(&barmanObjectStore)..., + ) + return args, nil + } + return nil, nil } +// shouldInjectBarmanSidecar decides whether an instance pod needs the +// plugin-barman-cloud sidecar. +// +// Backup/archiving and replica-source configs need it for as long as the +// cluster exists, so those always inject it. A recovery-only cluster (only +// RecoveryBarmanObjectName set, mirroring pluginConfiguration.Validate()) +// only needs it for the one-time bootstrap restore, so it's gated on +// cluster.Status.CurrentPrimary instead. +// +// CurrentPrimary is set by the instance manager itself, from inside the pod, +// only once bootstrap completes (see instance_startup.go in cloudnative-pg). +// cluster.Status.Instances / IsInitialized() looks equivalent but flips as +// soon as the instance's PVC exists, before the pod is even created - using +// it here would mean the sidecar never reaches the pod that needs it. +// +// Once CurrentPrimary is set, the operator's drift-check +// (checkPodSpecIsOutdated) sees the running pod's spec as outdated and rolls +// it out to drop the sidecar. Accepted deliberately: one deterministic +// rollout via the same machinery used for any other pod-spec change +// (switchover if a replica exists, in-place restart otherwise), not a new +// risk. +func shouldInjectBarmanSidecar( + cluster *cnpgv1.Cluster, + pluginConfiguration *config.PluginConfiguration, +) bool { + if len(pluginConfiguration.BarmanObjectName) != 0 || len(pluginConfiguration.ReplicaSourceBarmanObjectName) != 0 { + return true + } + + if len(pluginConfiguration.RecoveryBarmanObjectName) == 0 { + return false + } + + return cluster.Status.CurrentPrimary == "" +} + func reconcileInstancePod( ctx context.Context, cluster *cnpgv1.Cluster, @@ -323,8 +375,7 @@ func reconcileInstancePod( mutatedPod := pod.DeepCopy() - if len(pluginConfiguration.BarmanObjectName) != 0 || - len(pluginConfiguration.ReplicaSourceBarmanObjectName) != 0 { + if shouldInjectBarmanSidecar(cluster, pluginConfiguration) { if err := reconcilePodSpec( cluster, &mutatedPod.Spec, @@ -337,7 +388,7 @@ func reconcileInstancePod( return nil, fmt.Errorf("while reconciling pod spec for pod: %w", err) } } else { - contextLogger.Debug("No need to mutate instance with no backup & archiving configuration") + contextLogger.Debug("No need to mutate instance, sidecar not required for this configuration and pod") } patch, err := object.CreatePatch(mutatedPod, pod) @@ -387,8 +438,9 @@ func reconcilePodSpec( envs = append(envs, config.env...) baseProbe := &corev1.Probe{ - FailureThreshold: 10, - TimeoutSeconds: 10, + PeriodSeconds: 1, + FailureThreshold: 30, + TimeoutSeconds: 5, ProbeHandler: corev1.ProbeHandler{ Exec: &corev1.ExecAction{ Command: []string{"/manager", "healthcheck", "unix"}, diff --git a/internal/cnpgi/operator/lifecycle_resources.go b/internal/cnpgi/operator/lifecycle_resources.go index 12498ee..02b7b43 100644 --- a/internal/cnpgi/operator/lifecycle_resources.go +++ b/internal/cnpgi/operator/lifecycle_resources.go @@ -48,6 +48,9 @@ func (impl LifecycleImplementation) collectSidecarResourcesForPod( ctx context.Context, configuration *config.PluginConfiguration, ) (corev1.ResourceRequirements, error) { + // Only one object store provides the sidecar resources, with precedence: + // BarmanObjectName (backup/archive) > RecoveryBarmanObjectName (recovery + // bootstrap) > ReplicaSourceBarmanObjectName (pg_basebackup replica). if len(configuration.BarmanObjectName) > 0 { // On a replica cluster that also archives, the designated primary // will use both the replica source object store and the object store @@ -64,10 +67,10 @@ func (impl LifecycleImplementation) collectSidecarResourcesForPod( } if len(configuration.RecoveryBarmanObjectName) > 0 { - // On a replica cluster that doesn't archive, the designated primary - // uses only the replica source object store. - // In this case, we use the replica source object store for configuring - // the resources of the sidecar container. + // On a cluster recovering from an object store (including log-shipping + // replica clusters, where the recovery and replica source object stores + // coincide), we use the recovery object store for configuring the + // resources of the sidecar container. var barmanObjectStore barmancloudv1.ObjectStore if err := impl.Client.Get(ctx, configuration.GetRecoveryBarmanObjectKey(), &barmanObjectStore); err != nil { return corev1.ResourceRequirements{}, err @@ -76,5 +79,18 @@ func (impl LifecycleImplementation) collectSidecarResourcesForPod( return barmanObjectStore.Spec.InstanceSidecarConfiguration.Resources, nil } + if len(configuration.ReplicaSourceBarmanObjectName) > 0 { + // On a replica cluster bootstrapped via pg_basebackup, the designated + // primary uses only the replica source object store. + // In this case, we use the replica source object store for configuring + // the resources of the sidecar container. + var barmanObjectStore barmancloudv1.ObjectStore + if err := impl.Client.Get(ctx, configuration.GetReplicaSourceBarmanObjectKey(), &barmanObjectStore); err != nil { + return corev1.ResourceRequirements{}, err + } + + return barmanObjectStore.Spec.InstanceSidecarConfiguration.Resources, nil + } + return corev1.ResourceRequirements{}, nil } diff --git a/internal/cnpgi/operator/lifecycle_test.go b/internal/cnpgi/operator/lifecycle_test.go index d2755ed..5b3264e 100644 --- a/internal/cnpgi/operator/lifecycle_test.go +++ b/internal/cnpgi/operator/lifecycle_test.go @@ -28,6 +28,7 @@ import ( barmancloudv1 "github.com/cloudnative-pg/plugin-barman-cloud/api/v1" batchv1 "k8s.io/api/batch/v1" corev1 "k8s.io/api/core/v1" + "k8s.io/apimachinery/pkg/api/resource" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/runtime" "sigs.k8s.io/controller-runtime/pkg/client/fake" @@ -241,6 +242,69 @@ var _ = Describe("LifecycleImplementation", func() { HaveKey("value"))) }) + It("injects the sidecar for a recovery-only cluster", func(ctx SpecContext) { + recoveryOnlyConfig := &config.PluginConfiguration{ + RecoveryBarmanObjectName: "minio-store-recovery", + } + pod := &corev1.Pod{ + TypeMeta: podTypeMeta, + ObjectMeta: metav1.ObjectMeta{Name: "test-pod"}, + Spec: corev1.PodSpec{Containers: []corev1.Container{{Name: "postgres"}}}, + } + podJSON, _ := json.Marshal(pod) + request := &lifecycle.OperatorLifecycleRequest{ + ObjectDefinition: podJSON, + } + + response, err := reconcileInstancePod(ctx, cluster, request, recoveryOnlyConfig, sidecarConfiguration{}) + Expect(err).NotTo(HaveOccurred()) + Expect(response).NotTo(BeNil()) + Expect(response.JsonPatch).NotTo(BeEmpty()) + var patch []map[string]interface{} + Expect(json.Unmarshal(response.JsonPatch, &patch)).To(Succeed()) + Expect(patch).To(ContainElement(HaveKeyWithValue("path", "/spec/initContainers"))) + }) + + It("does not inject the sidecar for a recovery-only cluster that has "+ + "already completed its initial bootstrap", func(ctx SpecContext) { + recoveryOnlyConfig := &config.PluginConfiguration{ + RecoveryBarmanObjectName: "minio-store-recovery", + } + cluster.Status.CurrentPrimary = "test-pod" + pod := &corev1.Pod{ + TypeMeta: podTypeMeta, + ObjectMeta: metav1.ObjectMeta{Name: "test-pod"}, + Spec: corev1.PodSpec{Containers: []corev1.Container{{Name: "postgres"}}}, + } + podJSON, _ := json.Marshal(pod) + request := &lifecycle.OperatorLifecycleRequest{ + ObjectDefinition: podJSON, + } + + response, err := reconcileInstancePod(ctx, cluster, request, recoveryOnlyConfig, sidecarConfiguration{}) + Expect(err).NotTo(HaveOccurred()) + Expect(response).NotTo(BeNil()) + Expect(response.JsonPatch).To(BeEmpty()) + }) + + It("does not mutate the pod when no object store is configured", func(ctx SpecContext) { + emptyConfig := &config.PluginConfiguration{} + pod := &corev1.Pod{ + TypeMeta: podTypeMeta, + ObjectMeta: metav1.ObjectMeta{Name: "test-pod"}, + Spec: corev1.PodSpec{Containers: []corev1.Container{{Name: "postgres"}}}, + } + podJSON, _ := json.Marshal(pod) + request := &lifecycle.OperatorLifecycleRequest{ + ObjectDefinition: podJSON, + } + + response, err := reconcileInstancePod(ctx, cluster, request, emptyConfig, sidecarConfiguration{}) + Expect(err).NotTo(HaveOccurred()) + Expect(response).NotTo(BeNil()) + Expect(response.JsonPatch).To(BeEmpty()) + }) + It("returns an error for invalid pod definition", func(ctx SpecContext) { request := &lifecycle.OperatorLifecycleRequest{ ObjectDefinition: []byte("invalid-json"), @@ -293,6 +357,24 @@ var _ = Describe("LifecycleImplementation", func() { Expect(args).To(Equal(recoveryArgs)) }) + It("falls back to replica source object store when primary and recovery not set", func(ctx SpecContext) { + ns := "test-ns" + cluster := &cnpgv1.Cluster{ObjectMeta: metav1.ObjectMeta{Name: "c", Namespace: ns}} + pc := &config.PluginConfiguration{ + Cluster: cluster, + ReplicaSourceBarmanObjectName: "replica-source-store", + } + replicaArgs := []string{"--replica-a", "--replica-b"} + cli := buildClientFunc( + makeStoreFunc(ns, pc.ReplicaSourceBarmanObjectName, replicaArgs), + ).Build() + + impl := LifecycleImplementation{Client: cli} + args, err := impl.collectAdditionalInstanceArgs(ctx, pc) + Expect(err).NotTo(HaveOccurred()) + Expect(args).To(Equal(replicaArgs)) + }) + It("returns nil when neither object name is configured", func(ctx SpecContext) { ns := "test-ns" cluster := &cnpgv1.Cluster{ObjectMeta: metav1.ObjectMeta{Name: "c", Namespace: ns}} @@ -386,6 +468,117 @@ var _ = Describe("LifecycleImplementation", func() { Expect(err).NotTo(HaveOccurred()) Expect(args).To(Equal([]string{"--log-level=info"})) }) + + It("includes --log-level from replica source object store when only replica source set", func(ctx SpecContext) { + ns := "test-ns" + cluster := &cnpgv1.Cluster{ObjectMeta: metav1.ObjectMeta{Name: "c", Namespace: ns}} + pc := &config.PluginConfiguration{ + Cluster: cluster, + ReplicaSourceBarmanObjectName: "replica-source-store", + } + store := &barmancloudv1.ObjectStore{ + TypeMeta: metav1.TypeMeta{Kind: "ObjectStore", APIVersion: barmancloudv1.GroupVersion.String()}, + ObjectMeta: metav1.ObjectMeta{Name: pc.ReplicaSourceBarmanObjectName, Namespace: ns}, + Spec: barmancloudv1.ObjectStoreSpec{ + InstanceSidecarConfiguration: barmancloudv1.InstanceSidecarConfiguration{ + LogLevel: "warning", + }, + }, + } + s := runtime.NewScheme() + barmancloudv1.AddKnownTypes(s) + cli := fake.NewClientBuilder().WithScheme(s).WithRuntimeObjects(store).Build() + + impl := LifecycleImplementation{Client: cli} + args, err := impl.collectAdditionalInstanceArgs(ctx, pc) + Expect(err).NotTo(HaveOccurred()) + Expect(args).To(Equal([]string{"--log-level=warning"})) + }) + }) + + Describe("collectSidecarResourcesForPod", func() { + makeStoreWithResourcesFunc := func(ns, name string, res corev1.ResourceRequirements) *barmancloudv1.ObjectStore { + return &barmancloudv1.ObjectStore{ + TypeMeta: metav1.TypeMeta{Kind: "ObjectStore", APIVersion: barmancloudv1.GroupVersion.String()}, + ObjectMeta: metav1.ObjectMeta{Name: name, Namespace: ns}, + Spec: barmancloudv1.ObjectStoreSpec{ + InstanceSidecarConfiguration: barmancloudv1.InstanceSidecarConfiguration{ + Resources: res, + }, + }, + } + } + + It("uses the cluster object store resources when set", func(ctx SpecContext) { + ns := "test-ns" + cluster := &cnpgv1.Cluster{ObjectMeta: metav1.ObjectMeta{Name: "c", Namespace: ns}} + pc := &config.PluginConfiguration{Cluster: cluster, BarmanObjectName: "primary-store"} + res := corev1.ResourceRequirements{ + Requests: corev1.ResourceList{corev1.ResourceMemory: resource.MustParse("64Mi")}, + } + cli := buildClientFunc(makeStoreWithResourcesFunc(ns, pc.BarmanObjectName, res)).Build() + + impl := LifecycleImplementation{Client: cli} + got, err := impl.collectSidecarResourcesForPod(ctx, pc) + Expect(err).NotTo(HaveOccurred()) + gotMem := got.Requests[corev1.ResourceMemory] + Expect(gotMem.String()).To(Equal("64Mi")) + }) + + It("uses the recovery object store resources when only recovery is set", func(ctx SpecContext) { + ns := "test-ns" + cluster := &cnpgv1.Cluster{ObjectMeta: metav1.ObjectMeta{Name: "c", Namespace: ns}} + pc := &config.PluginConfiguration{Cluster: cluster, RecoveryBarmanObjectName: "recovery-store"} + res := corev1.ResourceRequirements{ + Requests: corev1.ResourceList{corev1.ResourceMemory: resource.MustParse("128Mi")}, + } + cli := buildClientFunc(makeStoreWithResourcesFunc(ns, pc.RecoveryBarmanObjectName, res)).Build() + + impl := LifecycleImplementation{Client: cli} + got, err := impl.collectSidecarResourcesForPod(ctx, pc) + Expect(err).NotTo(HaveOccurred()) + gotMem := got.Requests[corev1.ResourceMemory] + Expect(gotMem.String()).To(Equal("128Mi")) + }) + + It("uses the replica source object store resources when only replica source is set", func(ctx SpecContext) { + ns := "test-ns" + cluster := &cnpgv1.Cluster{ObjectMeta: metav1.ObjectMeta{Name: "c", Namespace: ns}} + pc := &config.PluginConfiguration{Cluster: cluster, ReplicaSourceBarmanObjectName: "replica-source-store"} + res := corev1.ResourceRequirements{ + Requests: corev1.ResourceList{corev1.ResourceMemory: resource.MustParse("256Mi")}, + } + cli := buildClientFunc(makeStoreWithResourcesFunc(ns, pc.ReplicaSourceBarmanObjectName, res)).Build() + + impl := LifecycleImplementation{Client: cli} + got, err := impl.collectSidecarResourcesForPod(ctx, pc) + Expect(err).NotTo(HaveOccurred()) + gotMem := got.Requests[corev1.ResourceMemory] + Expect(gotMem.String()).To(Equal("256Mi")) + }) + + It("returns empty resources when no object store is configured", func(ctx SpecContext) { + ns := "test-ns" + cluster := &cnpgv1.Cluster{ObjectMeta: metav1.ObjectMeta{Name: "c", Namespace: ns}} + pc := &config.PluginConfiguration{Cluster: cluster} + cli := buildClientFunc().Build() + + impl := LifecycleImplementation{Client: cli} + got, err := impl.collectSidecarResourcesForPod(ctx, pc) + Expect(err).NotTo(HaveOccurred()) + Expect(got).To(Equal(corev1.ResourceRequirements{})) + }) + + It("returns an error if the replica source object store cannot be retrieved", func(ctx SpecContext) { + ns := "test-ns" + cluster := &cnpgv1.Cluster{ObjectMeta: metav1.ObjectMeta{Name: "c", Namespace: ns}} + pc := &config.PluginConfiguration{Cluster: cluster, ReplicaSourceBarmanObjectName: "missing-store"} + cli := buildClientFunc().Build() + + impl := LifecycleImplementation{Client: cli} + _, err := impl.collectSidecarResourcesForPod(ctx, pc) + Expect(err).To(HaveOccurred()) + }) }) }) diff --git a/internal/cnpgi/restore/restore.go b/internal/cnpgi/restore/restore.go index 0aad1e5..9ee7354 100644 --- a/internal/cnpgi/restore/restore.go +++ b/internal/cnpgi/restore/restore.go @@ -113,6 +113,7 @@ func (impl JobHookImpl) Restore( configuration.Cluster, &targetObjectStore.Spec.Configuration, targetObjectStore.Name, + req.CheckEmptyWalArchive, ); err != nil { return nil, err } @@ -181,6 +182,9 @@ func (impl JobHookImpl) restoreDataDir( if backup.Status.EndpointURL != "" { options = append(options, "--endpoint-url", backup.Status.EndpointURL) } + + options = barmanConfiguration.Data.AppendRestoreAdditionalCommandArgs(options) + options = append(options, backup.Status.DestinationPath) options = append(options, backup.Status.ServerName) options = append(options, backup.Status.BackupID) @@ -247,6 +251,7 @@ func (impl *JobHookImpl) checkBackupDestination( cluster *cnpgv1.Cluster, barmanConfiguration *cnpgv1.BarmanObjectStoreConfiguration, objectStoreName string, + operatorCheckEmptyWalArchive *bool, ) error { // Get environment from cache env, err := barmanCredentials.EnvSetCloudCredentialsAndCertificates(ctx, @@ -285,14 +290,26 @@ func (impl *JobHookImpl) checkBackupDestination( } } - // Check if we're ok to archive in the desired destination - if utils.IsEmptyWalArchiveCheckEnabled(&cluster.ObjectMeta) { + if resolveRestoreEmptyWalArchiveCheck(operatorCheckEmptyWalArchive, cluster) { return common.CheckBackupDestination(ctx, barmanConfiguration, walArchiver, serverName) } return nil } +// resolveRestoreEmptyWalArchiveCheck reports whether the destination must be +// verified before restoring. When the operator sets the decision (non-nil) it +// is obeyed as-is; a nil value comes from an operator that predates this field, +// so we fall back to the Cluster annotation. Unlike archiving, restore is a +// one-shot operation that has never been gated on the first-archive marker +// file, so the annotation is the only fallback needed. +func resolveRestoreEmptyWalArchiveCheck(operatorDecision *bool, cluster *cnpgv1.Cluster) bool { + if operatorDecision != nil { + return *operatorDecision + } + return utils.IsEmptyWalArchiveCheckEnabled(&cluster.ObjectMeta) +} + // restoreCustomWalDir moves the current pg_wal data to the specified custom wal dir and applies the symlink // returns indicating if any changes were made and any error encountered in the process func (impl JobHookImpl) restoreCustomWalDir(ctx context.Context) (bool, error) { diff --git a/internal/cnpgi/restore/restore_test.go b/internal/cnpgi/restore/restore_test.go new file mode 100644 index 0000000..a88a7f3 --- /dev/null +++ b/internal/cnpgi/restore/restore_test.go @@ -0,0 +1,66 @@ +/* +Copyright © contributors to CloudNativePG, established as +CloudNativePG a Series of LF Projects, LLC. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. + +SPDX-License-Identifier: Apache-2.0 +*/ + +package restore + +import ( + cnpgv1 "github.com/cloudnative-pg/cloudnative-pg/api/v1" + "k8s.io/utils/ptr" + + . "github.com/onsi/ginkgo/v2" + . "github.com/onsi/gomega" +) + +var _ = Describe("resolveRestoreEmptyWalArchiveCheck", func() { + // skipAnnotation mirrors the unexported constant in cloudnative-pg's + // pkg/utils; hard-coding the literal makes a divergence surface as a + // failing test rather than silently disabling the check. + const skipAnnotation = "cnpg.io/skipEmptyWalArchiveCheck" + + clusterWith := func(annotationValue *string) *cnpgv1.Cluster { + cluster := &cnpgv1.Cluster{} + if annotationValue != nil { + cluster.Annotations = map[string]string{skipAnnotation: *annotationValue} + } + return cluster + } + + When("the operator sets the decision", func() { + It("obeys true even when the annotation would skip the check", func() { + Expect(resolveRestoreEmptyWalArchiveCheck(ptr.To(true), clusterWith(ptr.To("enabled")))).To(BeTrue()) + }) + + It("obeys false even when the annotation would keep the check on", func() { + Expect(resolveRestoreEmptyWalArchiveCheck(ptr.To(false), clusterWith(nil))).To(BeFalse()) + }) + }) + + When("the operator predates the field (nil decision)", func() { + DescribeTable( + "falls back to the Cluster annotation, never to a marker file", + func(annotationValue *string, expected bool) { + Expect(resolveRestoreEmptyWalArchiveCheck(nil, clusterWith(annotationValue))).To(Equal(expected)) + }, + Entry("no annotation: check runs", nil, true), + Entry("opt-out annotation: check skipped", ptr.To("enabled"), false), + Entry("unrelated annotation value: check runs", ptr.To("something-else"), true), + Entry("empty annotation value: check runs", ptr.To(""), true), + ) + }) +}) diff --git a/internal/cnpgi/restore/start.go b/internal/cnpgi/restore/start.go index efb7828..0f78f90 100644 --- a/internal/cnpgi/restore/start.go +++ b/internal/cnpgi/restore/start.go @@ -44,9 +44,6 @@ type CNPGI struct { // Start starts the GRPC service func (c *CNPGI) Start(ctx context.Context) error { - // PgWalVolumePgWalPath is the path of pg_wal directory inside the WAL volume when present - const PgWalVolumePgWalPath = "/var/lib/postgresql/wal/pg_wal" - enrich := func(server *grpc.Server) error { wal.RegisterWALServer(server, common.WALServiceImplementation{ InstanceName: c.InstanceName, @@ -60,7 +57,7 @@ func (c *CNPGI) Start(ctx context.Context) error { Client: c.Client, SpoolDirectory: c.SpoolDirectory, PgDataPath: c.PGDataPath, - PgWalFolderToSymlink: PgWalVolumePgWalPath, + PgWalFolderToSymlink: common.PgWalVolumePgWalPath, }) common.AddHealthCheck(server) diff --git a/internal/cnpgi/restore/suite_test.go b/internal/cnpgi/restore/suite_test.go new file mode 100644 index 0000000..b110bef --- /dev/null +++ b/internal/cnpgi/restore/suite_test.go @@ -0,0 +1,32 @@ +/* +Copyright © contributors to CloudNativePG, established as +CloudNativePG a Series of LF Projects, LLC. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. + +SPDX-License-Identifier: Apache-2.0 +*/ + +package restore + +import ( + "testing" + + . "github.com/onsi/ginkgo/v2" + . "github.com/onsi/gomega" +) + +func TestRestore(t *testing.T) { + RegisterFailHandler(Fail) + RunSpecs(t, "Restore job hook test suite") +} diff --git a/internal/scheme/cnpg.go b/internal/scheme/cnpg.go index 43146c3..c6d436a 100644 --- a/internal/scheme/cnpg.go +++ b/internal/scheme/cnpg.go @@ -25,6 +25,7 @@ import ( cnpgv1 "github.com/cloudnative-pg/cloudnative-pg/api/v1" "github.com/cloudnative-pg/machinery/pkg/log" "github.com/spf13/viper" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/runtime/schema" ) @@ -49,6 +50,7 @@ func AddCNPGToScheme(ctx context.Context, s *runtime.Scheme) { &cnpgv1.Backup{}, &cnpgv1.BackupList{}, &cnpgv1.ScheduledBackup{}, &cnpgv1.ScheduledBackupList{}, ) + metav1.AddToGroupVersion(s, schemeGroupVersion) log.FromContext(ctx).Info("CNPG types registration", "schemeGroupVersion", schemeGroupVersion) } diff --git a/manifest.yaml b/manifest.yaml index 3b99c39..118beaf 100644 --- a/manifest.yaml +++ b/manifest.yaml @@ -175,6 +175,25 @@ spec: format: int32 minimum: 1 type: integer + restoreAdditionalCommandArgs: + description: |- + Additional arguments that can be appended to the 'barman-cloud-restore' + command-line invocation. These arguments provide flexibility to customize + the data restore process further, according to specific requirements or + configurations. + + Example: + In a scenario where specialized restore options are required, such as setting + a specific read timeout or defining custom behavior, users can use this field + to specify additional command arguments. + + Note: + It's essential to ensure that the provided arguments are valid and supported + by the 'barman-cloud-restore' command, to avoid potential errors or unintended + behavior during execution. + items: + type: string + type: array type: object destinationPath: description: |- @@ -440,7 +459,9 @@ spec: description: Selects a key of a ConfigMap. properties: key: - description: The key to select. + description: |- + The key to select from the ConfigMap's Data field. + Keys in the BinaryData field are not currently propagated to container env vars. type: string name: default: "" diff --git a/renovate.json5 b/renovate.json5 index 1aaa515..132ff19 100644 --- a/renovate.json5 +++ b/renovate.json5 @@ -12,14 +12,14 @@ rebaseWhen: 'never', prConcurrentLimit: 5, // Override default ignorePaths to scan test/e2e for emulator image dependencies - // Removed: '**/test/**' + // Removed: '**/test/**', '**/tests/**' (this repo's e2e Ginkgo packages live + // under test/e2e/internal/tests/**, which the plural pattern was excluding) ignorePaths: [ '**/node_modules/**', '**/bower_components/**', '**/vendor/**', '**/examples/**', '**/__tests__/**', - '**/tests/**', '**/__fixtures__/**', ], lockFileMaintenance: { @@ -53,6 +53,7 @@ ], matchStrings: [ '//\\s*renovate:\\s*datasource=(?[a-z-.]+?)\\s+depName=(?[^\\s]+?)(?:\\s+versioning=(?[^\\s]+?))?\\s*\\n\\s*//\\s*Version:\\s*(?[^\\s]+?)\\s*\\n\\s*Image:\\s*"[^@]+@(?sha256:[a-f0-9]+)"', + '//\\s*renovate:\\s*datasource=(?[a-z-.]+?)\\s+depName=(?[^\\s]+?)(?:\\s+versioning=(?[^\\s]+?))?\\s*\\n\\s*const\\s+\\w+\\s*=\\s*"(?[^"]+?)"', ], }, { diff --git a/test/e2e/e2e_suite_test.go b/test/e2e/e2e_suite_test.go index bbf7b90..0f2bfdf 100644 --- a/test/e2e/e2e_suite_test.go +++ b/test/e2e/e2e_suite_test.go @@ -39,6 +39,7 @@ import ( _ "github.com/cloudnative-pg/plugin-barman-cloud/test/e2e/internal/tests/backup" _ "github.com/cloudnative-pg/plugin-barman-cloud/test/e2e/internal/tests/credentialrotation" _ "github.com/cloudnative-pg/plugin-barman-cloud/test/e2e/internal/tests/replicacluster" + _ "github.com/cloudnative-pg/plugin-barman-cloud/test/e2e/internal/tests/walrestore" . "github.com/onsi/ginkgo/v2" . "github.com/onsi/gomega" diff --git a/test/e2e/internal/certmanager/certmanager.go b/test/e2e/internal/certmanager/certmanager.go index 02d0466..ba95db3 100644 --- a/test/e2e/internal/certmanager/certmanager.go +++ b/test/e2e/internal/certmanager/certmanager.go @@ -55,10 +55,10 @@ func WithIgnoreExistingResources(ignore bool) InstallOption { } } -// TODO: renovate - // DefaultVersion is the default version of cert-manager to install. -const DefaultVersion = "v1.15.1" +// +// renovate: datasource=github-releases depName=cert-manager/cert-manager +const DefaultVersion = "v1.21.1" // Install installs cert-manager using kubectl. func Install(ctx context.Context, cl client.Client, opts ...InstallOption) error { diff --git a/test/e2e/internal/e2etestenv/main.go b/test/e2e/internal/e2etestenv/main.go index 17b4ae0..5400d36 100644 --- a/test/e2e/internal/e2etestenv/main.go +++ b/test/e2e/internal/e2etestenv/main.go @@ -97,9 +97,8 @@ func WithIgnoreExistingResources(ignore bool) SetupOption { } func defaultSetupOptions() SetupOptions { - // TODO: renovate return SetupOptions{ - CertManagerVersion: "v1.15.1", + CertManagerVersion: certmanager.DefaultVersion, } } diff --git a/test/e2e/internal/objectstore/azurite.go b/test/e2e/internal/objectstore/azurite.go index d9d4e64..d0b94aa 100644 --- a/test/e2e/internal/objectstore/azurite.go +++ b/test/e2e/internal/objectstore/azurite.go @@ -72,8 +72,8 @@ func newAzuriteDeployment(namespace, name string) *appsv1.Deployment { { Name: name, // renovate: datasource=docker depName=mcr.microsoft.com/azure-storage/azurite versioning=docker - // Version: 3.35.0 - Image: "mcr.microsoft.com/azure-storage/azurite@sha256:647c63a91102a9d8e8000aab803436e1fc85fbb285e7ce830a82ee5d6661cf37", + // Version: 3.37.0 + Image: "mcr.microsoft.com/azure-storage/azurite@sha256:830430c1da1a2d537e08f3e6764dd1f5ae00cf0346bcaf625b968ec3f0971fd5", Args: []string{ "azurite-blob", "--blobHost", diff --git a/test/e2e/internal/objectstore/fakegcsserver.go b/test/e2e/internal/objectstore/fakegcsserver.go index a9abafa..7474a6b 100644 --- a/test/e2e/internal/objectstore/fakegcsserver.go +++ b/test/e2e/internal/objectstore/fakegcsserver.go @@ -72,8 +72,8 @@ func newGCSDeployment(namespace, name string) *appsv1.Deployment { { Name: name, // renovate: datasource=docker depName=fsouza/fake-gcs-server versioning=docker - // Version: 1.54.0 - Image: "fsouza/fake-gcs-server@sha256:3730da0e31f7e5186a90ec4899dc2c336104e7599df400411392ef17e684c31f", + // Version: 1.56.1 + Image: "fsouza/fake-gcs-server@sha256:797ce226d62f947c009dc40246b30cfb456b8473d8241407f9d6f2c04e4d69ef", Ports: []corev1.ContainerPort{ { ContainerPort: 4443, diff --git a/test/e2e/internal/tests/backup/backup_restore.go b/test/e2e/internal/tests/backup/backup_restore.go index 09892d0..c0f9b91 100644 --- a/test/e2e/internal/tests/backup/backup_restore.go +++ b/test/e2e/internal/tests/backup/backup_restore.go @@ -56,6 +56,12 @@ var _ = Describe("Backup and restore", func() { ctx SpecContext, factory testCaseFactory, ) { + switch factory.(type) { + case *gcsBackupPluginBackupPluginRestore, *gcsBackupPluginBackupInTreeRestore, + *gcsBackupPluginInTreeBackupPluginRestore: + Skip("GCS e2e tests are disabled until https://github.com/EnterpriseDB/barman/issues/1218 is fixed") + } + testResources := factory.createBackupRestoreTestResources(namespace.Name) By("starting the ObjectStore deployment") diff --git a/test/e2e/internal/tests/replicacluster/replica_cluster.go b/test/e2e/internal/tests/replicacluster/replica_cluster.go index 8888334..e4cf598 100644 --- a/test/e2e/internal/tests/replicacluster/replica_cluster.go +++ b/test/e2e/internal/tests/replicacluster/replica_cluster.go @@ -57,6 +57,11 @@ var _ = Describe("Replica cluster", func() { ctx SpecContext, factory testCaseFactory, ) { + switch factory.(type) { + case gcsReplicaClusterFactory: + Skip("GCS e2e tests are disabled until https://github.com/EnterpriseDB/barman/issues/1218 is fixed") + } + testResources := factory.createReplicaClusterTestResources(namespace.Name) By("starting the ObjectStore deployments") diff --git a/test/e2e/internal/tests/walrestore/doc.go b/test/e2e/internal/tests/walrestore/doc.go new file mode 100644 index 0000000..00fbafb --- /dev/null +++ b/test/e2e/internal/tests/walrestore/doc.go @@ -0,0 +1,24 @@ +/* +Copyright © contributors to CloudNativePG, established as +CloudNativePG a Series of LF Projects, LLC. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. + +SPDX-License-Identifier: Apache-2.0 +*/ + +// Package walrestore contains the end-to-end test for the parallel WAL restore +// behaviour of the Barman Cloud Plugin: prefetching upcoming segments into the +// spool directory, serving later requests from the spool, and tracking the +// end-of-wal-stream sentinel. +package walrestore diff --git a/test/e2e/internal/tests/walrestore/fixtures.go b/test/e2e/internal/tests/walrestore/fixtures.go new file mode 100644 index 0000000..c0634ad --- /dev/null +++ b/test/e2e/internal/tests/walrestore/fixtures.go @@ -0,0 +1,178 @@ +/* +Copyright © contributors to CloudNativePG, established as +CloudNativePG a Series of LF Projects, LLC. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. + +SPDX-License-Identifier: Apache-2.0 +*/ + +package walrestore + +import ( + cloudnativepgv1 "github.com/cloudnative-pg/api/pkg/api/v1" + barmanapi "github.com/cloudnative-pg/barman-cloud/pkg/api" + appsv1 "k8s.io/api/apps/v1" + corev1 "k8s.io/api/core/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/utils/ptr" + + pluginBarmanCloudV1 "github.com/cloudnative-pg/plugin-barman-cloud/api/v1" + "github.com/cloudnative-pg/plugin-barman-cloud/test/e2e/internal/objectstore" +) + +const ( + minioName = "minio" + objectStoreName = "source" + clusterName = "source" + s3ClientName = "s3-client" + storageSize = "1Gi" + // walMaxParallel is the prefetch parallelism under test: for a regular WAL + // request the plugin restores the requested segment and prefetches the next + // ones, up to this many segments in total. + walMaxParallel = 3 +) + +// newObjectStoreResources returns the minio server Deployment/Service/Secret/PVC. +func newObjectStoreResources(namespace string) *objectstore.Resources { + return objectstore.NewMinioObjectStoreResources(namespace, minioName) +} + +// newObjectStore returns a minio-backed ObjectStore configured with the WAL +// prefetch parallelism (maxParallel) under test. Archiving with gzip makes the +// archived segments carry the ".gz" suffix that forged segments are copied from. +func newObjectStore(namespace string) *pluginBarmanCloudV1.ObjectStore { + store := objectstore.NewMinioObjectStore(namespace, objectStoreName, minioName) + store.Spec.Configuration.Wal = &barmanapi.WalBackupConfiguration{ + MaxParallel: walMaxParallel, + Compression: barmanapi.CompressionTypeGzip, + } + return store +} + +// newCluster returns a 2-instance cluster that uses the plugin as its WAL +// archiver, so the standby drives WAL restore (and its prefetch/spool/ +// end-of-wal-stream state machine) through the plugin. +func newCluster(namespace string) *cloudnativepgv1.Cluster { + return &cloudnativepgv1.Cluster{ + TypeMeta: metav1.TypeMeta{ + Kind: "Cluster", + APIVersion: "postgresql.cnpg.io/v1", + }, + ObjectMeta: metav1.ObjectMeta{ + Name: clusterName, + Namespace: namespace, + }, + Spec: cloudnativepgv1.ClusterSpec{ + Instances: 2, + ImagePullPolicy: corev1.PullAlways, + Plugins: []cloudnativepgv1.PluginConfiguration{ + { + Name: "barman-cloud.cloudnative-pg.io", + Parameters: map[string]string{ + "barmanObjectName": objectStoreName, + }, + IsWALArchiver: ptr.To(true), + }, + }, + PostgresConfiguration: cloudnativepgv1.PostgresConfiguration{ + Parameters: map[string]string{ + "log_min_messages": "DEBUG4", + }, + }, + StorageConfiguration: cloudnativepgv1.StorageConfiguration{ + Size: storageSize, + }, + }, + } +} + +// newS3ClientDeployment returns a deployment running the AWS CLI configured to +// talk to the in-namespace minio service. The test execs `aws s3` commands in +// it to forge WAL segments on the object store and to check their presence. +func newS3ClientDeployment(namespace string) *appsv1.Deployment { + labels := map[string]string{"app": s3ClientName} + return &appsv1.Deployment{ + TypeMeta: metav1.TypeMeta{ + Kind: "Deployment", + APIVersion: "apps/v1", + }, + ObjectMeta: metav1.ObjectMeta{ + Name: s3ClientName, + Namespace: namespace, + }, + Spec: appsv1.DeploymentSpec{ + Replicas: ptr.To(int32(1)), + Selector: &metav1.LabelSelector{MatchLabels: labels}, + Template: corev1.PodTemplateSpec{ + ObjectMeta: metav1.ObjectMeta{Labels: labels}, + Spec: corev1.PodSpec{ + Containers: []corev1.Container{ + { + Name: s3ClientName, + // renovate: datasource=docker depName=amazon/aws-cli versioning=docker + // Version: 2.36.32 + Image: "docker.io/amazon/aws-cli@sha256:f630107e3eadb6479fa441631bbf50d15cf354a6ace85b6028bf6b3e5c69c605", + Command: []string{"sleep", "infinity"}, + Env: []corev1.EnvVar{ + { + Name: "AWS_ENDPOINT_URL", + Value: "http://" + minioName + ":9000", + }, + { + Name: "AWS_ACCESS_KEY_ID", + ValueFrom: &corev1.EnvVarSource{ + SecretKeyRef: &corev1.SecretKeySelector{ + LocalObjectReference: corev1.LocalObjectReference{Name: minioName}, + Key: "ACCESS_KEY_ID", + }, + }, + }, + { + Name: "AWS_SECRET_ACCESS_KEY", + ValueFrom: &corev1.EnvVarSource{ + SecretKeyRef: &corev1.SecretKeySelector{ + LocalObjectReference: corev1.LocalObjectReference{Name: minioName}, + Key: "ACCESS_SECRET_KEY", + }, + }, + }, + { + Name: "AWS_DEFAULT_REGION", + Value: "us-east-1", + }, + // The CRC-based default checksums introduced in AWS + // CLI 2.23 are not supported by every S3-compatible + // object store, minio included. + { + Name: "AWS_REQUEST_CHECKSUM_CALCULATION", + Value: "when_required", + }, + { + Name: "AWS_RESPONSE_CHECKSUM_VALIDATION", + Value: "when_required", + }, + }, + SecurityContext: &corev1.SecurityContext{ + AllowPrivilegeEscalation: ptr.To(false), + SeccompProfile: &corev1.SeccompProfile{ + Type: corev1.SeccompProfileTypeRuntimeDefault, + }, + }, + }, + }, + }, + }, + }, + } +} diff --git a/test/e2e/internal/tests/walrestore/walrestore.go b/test/e2e/internal/tests/walrestore/walrestore.go new file mode 100644 index 0000000..287748f --- /dev/null +++ b/test/e2e/internal/tests/walrestore/walrestore.go @@ -0,0 +1,312 @@ +/* +Copyright © contributors to CloudNativePG, established as +CloudNativePG a Series of LF Projects, LLC. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. + +SPDX-License-Identifier: Apache-2.0 +*/ + +package walrestore + +import ( + "context" + "errors" + "fmt" + "strconv" + "strings" + "time" + + corev1 "k8s.io/api/core/v1" + apitypes "k8s.io/apimachinery/pkg/types" + "k8s.io/client-go/kubernetes" + "k8s.io/client-go/rest" + executil "k8s.io/client-go/util/exec" + "sigs.k8s.io/controller-runtime/pkg/client" + + internalClient "github.com/cloudnative-pg/plugin-barman-cloud/test/e2e/internal/client" + internalCluster "github.com/cloudnative-pg/plugin-barman-cloud/test/e2e/internal/cluster" + "github.com/cloudnative-pg/plugin-barman-cloud/test/e2e/internal/command" + "github.com/cloudnative-pg/plugin-barman-cloud/test/e2e/internal/deployment" + nmsp "github.com/cloudnative-pg/plugin-barman-cloud/test/e2e/internal/namespace" + + . "github.com/onsi/ginkgo/v2" + . "github.com/onsi/gomega" +) + +const ( + // spoolDirectory is where the plugin sidecar prefetches WAL segments and + // records the end-of-wal-stream sentinel. It must match the SPOOL_DIRECTORY + // the operator injects on the sidecar (internal/cnpgi/operator/lifecycle.go), + // which lives on the CloudNativePG scratch-data volume shared with the + // postgres container, so the path is visible from the postgres container too. + spoolDirectory = "/controller/wal-restore-spool" + // pgWalPath is PgDataPath + "/pg_wal" in the CloudNativePG operand image. + pgWalPath = "/var/lib/postgresql/data/pgdata/pg_wal" + // endOfWALStreamFlag is the sentinel file the barman-cloud restorer writes in + // the spool to record that the archive ran out of segments. + endOfWALStreamFlag = "end-of-wal-stream" + // managerExecutable is the CloudNativePG instance manager. Its wal-restore + // subcommand delegates to the plugin when the cluster uses it as WAL archiver. + managerExecutable = "/controller/manager" + // postgresContainer is the container we exec into on instance pods. + postgresContainer = "postgres" + // walLogDir is the WALs subdirectory (timeline + log id) the forged segments + // live under; a freshly bootstrapped, idle cluster stays within it. + walLogDir = "0000000100000000" + // bucket is the destination bucket of the minio ObjectStore. + bucket = "backups" +) + +// walFile returns the name of the n-th forged WAL segment (segment 0xF0+n on +// timeline 1, log 0, for n <= 15). The high segment number keeps it out of the +// range an idle PostgreSQL would archive on its own. +func walFile(n int) string { + return fmt.Sprintf("0000000100000000%08X", 0xF0+n) +} + +// walObjectURI returns the s3 URI of a wals object (by file name) in the store. +func walObjectURI(name string) string { + return fmt.Sprintf("s3://%s/%s/wals/%s/%s", bucket, clusterName, walLogDir, name) +} + +// execInPod runs a command in the given container and returns stdout, stderr +// and the error (non-nil for a non-zero exit code). +func execInPod( + ctx context.Context, + clientSet *kubernetes.Clientset, + cfg *rest.Config, + namespace, pod, container string, + args ...string, +) (string, string, error) { + return command.ExecuteInContainer( + ctx, + *clientSet, + cfg, + command.ContainerLocator{ + NamespaceName: namespace, + PodName: pod, + ContainerName: container, + }, + nil, + args, + ) +} + +// This test drives the plugin's parallel WAL restore directly: it invokes the +// instance-manager wal-restore command on the standby (which delegates to the +// plugin) and asserts the prefetch/spool/end-of-wal-stream state machine with +// maxParallel = 3. To control the archive deterministically, it forges WAL +// segments on the object store by copying a real archived segment under new +// names. +var _ = Describe("Parallel WAL restore", func() { + var ( + namespace *corev1.Namespace + cl client.Client + clientSet *kubernetes.Clientset + cfg *rest.Config + ) + + BeforeEach(func(ctx SpecContext) { + var err error + cl, _, err = internalClient.NewClient() + Expect(err).NotTo(HaveOccurred()) + clientSet, cfg, err = internalClient.NewClientSet() + Expect(err).NotTo(HaveOccurred()) + namespace, err = nmsp.CreateUniqueNamespace(ctx, cl, "wal-restore-parallel") + Expect(err).NotTo(HaveOccurred()) + }) + + AfterEach(func(ctx SpecContext) { + Expect(cl.Delete(ctx, namespace)).To(Succeed()) + }) + + It("prefetches segments, serves them from the spool and tracks end-of-wal-stream", + func(ctx SpecContext) { + ns := namespace.Name + + By("creating the object store backing resources") + Expect(newObjectStoreResources(ns).Create(ctx, cl)).To(Succeed()) + + By("creating the ObjectStore with WAL maxParallel") + Expect(cl.Create(ctx, newObjectStore(ns))).To(Succeed()) + + By("deploying the S3 client used to forge and inspect WAL segments") + Expect(cl.Create(ctx, newS3ClientDeployment(ns))).To(Succeed()) + + By("creating the cluster using the plugin as WAL archiver") + cluster := newCluster(ns) + Expect(cl.Create(ctx, cluster)).To(Succeed()) + + By("waiting for the cluster to become ready") + Eventually(func(g Gomega) { + g.Expect(cl.Get(ctx, + apitypes.NamespacedName{Name: clusterName, Namespace: ns}, + cluster)).To(Succeed()) + g.Expect(internalCluster.IsReady(*cluster)).To(BeTrue()) + }).WithTimeout(10 * time.Minute).WithPolling(10 * time.Second).Should(Succeed()) + + By("waiting for the S3 client to become ready") + Eventually(func(g Gomega) { + ready, err := deployment.IsReady(ctx, cl, + apitypes.NamespacedName{Name: s3ClientName, Namespace: ns}) + g.Expect(err).NotTo(HaveOccurred()) + g.Expect(ready).To(BeTrue()) + }).WithTimeout(2 * time.Minute).WithPolling(5 * time.Second).Should(Succeed()) + + primary := cluster.Status.CurrentPrimary + Expect(primary).NotTo(BeEmpty()) + standby := clusterName + "-2" + + var s3ClientPods corev1.PodList + Expect(cl.List(ctx, &s3ClientPods, + client.InNamespace(ns), + client.MatchingLabels{"app": s3ClientName})).To(Succeed()) + Expect(s3ClientPods.Items).NotTo(BeEmpty()) + s3Client := s3ClientPods.Items[0].Name + + // Operations scoped to the fixed pods/clients, kept as closures so the + // step assertions below read like the original state-machine table. + restore := func(name string) error { + _, _, err := execInPod(ctx, clientSet, cfg, ns, standby, postgresContainer, + managerExecutable, "wal-restore", name, pgWalPath+"/"+name) + return err + } + existsIn := func(dir, name string) bool { + _, _, err := execInPod(ctx, clientSet, cfg, ns, standby, postgresContainer, + "test", "-f", dir+"/"+name) + return err == nil + } + flagSet := func() bool { return existsIn(spoolDirectory, endOfWALStreamFlag) } + spoolSegments := func() int { + out, _, _ := execInPod(ctx, clientSet, cfg, ns, standby, postgresContainer, + "sh", "-c", + "ls -1 "+spoolDirectory+" 2>/dev/null | grep -Ec '^[0-9A-F]{24}$' || true") + n, _ := strconv.Atoi(strings.TrimSpace(out)) + return n + } + purgeSpool := func() { + _, _, _ = execInPod(ctx, clientSet, cfg, ns, standby, postgresContainer, + "sh", "-c", "rm -f "+spoolDirectory+"/* 2>/dev/null; true") + } + forge := func(src, dst string) { + // ExecuteInContainer drops stdout/stderr on a non-zero exit, so on + // failure this only reports the exit code, not the aws CLI's error text. + _, _, err := execInPod(ctx, clientSet, cfg, ns, s3Client, s3ClientName, + "aws", "s3", "cp", walObjectURI(src), walObjectURI(dst)) + Expect(err).NotTo(HaveOccurred(), "forging %s -> %s", src, dst) + } + objectExists := func(name string) bool { + out, _, err := execInPod(ctx, clientSet, cfg, ns, s3Client, s3ClientName, + "aws", "s3", "ls", walObjectURI(name)) + return err == nil && strings.TrimSpace(out) != "" + } + + By("archiving a real WAL on the primary and learning its name") + _, _, err := execInPod(ctx, clientSet, cfg, ns, primary, postgresContainer, + "psql", "-tAc", "CHECKPOINT") + Expect(err).NotTo(HaveOccurred(), "CHECKPOINT on the primary failed") + out, _, err := execInPod(ctx, clientSet, cfg, ns, primary, postgresContainer, + "psql", "-tAc", "SELECT pg_walfile_name(pg_switch_wal())") + Expect(err).NotTo(HaveOccurred(), "switching WAL on the primary failed") + latestWAL := strings.TrimSpace(out) + Expect(latestWAL).To(HavePrefix(walLogDir), + "the freshly bootstrapped cluster should still be on the first WAL log") + + By("waiting for the archived WAL to land on the object store") + Eventually(func() bool { + return objectExists(latestWAL + ".gz") + }).WithTimeout(2 * time.Minute).WithPolling(5 * time.Second).Should(BeTrue()) + + By("forging WAL segments #1 to #5 from the archived WAL") + for n := 1; n <= 5; n++ { + forge(latestWAL+".gz", walFile(n)) + } + + By("ensuring the spool directory is empty on the standby") + purgeSpool() + + // #1: served fresh; #2 and #3 prefetched into the spool; flag unset. + By("requesting WAL #1: #1 restored, #2 and #3 prefetched") + Expect(restore(walFile(1))).To(Succeed()) + Eventually(func(g Gomega) { + g.Expect(existsIn(pgWalPath, walFile(1))).To(BeTrue(), "#1 in pg_wal") + g.Expect(existsIn(spoolDirectory, walFile(2))).To(BeTrue(), "#2 in spool") + g.Expect(existsIn(spoolDirectory, walFile(3))).To(BeTrue(), "#3 in spool") + g.Expect(flagSet()).To(BeFalse(), "end-of-wal-stream unset") + }).WithTimeout(time.Minute).WithPolling(2 * time.Second).Should(Succeed()) + + // #2: served from the spool; #3 stays prefetched; no new prefetch; flag unset. + By("requesting WAL #2: served from the spool, #3 still prefetched") + Expect(restore(walFile(2))).To(Succeed()) + Eventually(func(g Gomega) { + g.Expect(existsIn(pgWalPath, walFile(2))).To(BeTrue(), "#2 in pg_wal") + g.Expect(existsIn(spoolDirectory, walFile(3))).To(BeTrue(), "#3 in spool") + g.Expect(flagSet()).To(BeFalse(), "end-of-wal-stream unset") + }).WithTimeout(time.Minute).WithPolling(2 * time.Second).Should(Succeed()) + + // #3: served from the spool; spool now empty; flag unset. + By("requesting WAL #3: served from the spool, spool now empty") + Expect(restore(walFile(3))).To(Succeed()) + Eventually(func(g Gomega) { + g.Expect(existsIn(pgWalPath, walFile(3))).To(BeTrue(), "#3 in pg_wal") + g.Expect(spoolSegments()).To(Equal(0), "no WAL segments in spool") + g.Expect(flagSet()).To(BeFalse(), "end-of-wal-stream unset") + }).WithTimeout(time.Minute).WithPolling(2 * time.Second).Should(Succeed()) + + // #4: served fresh; #5 prefetched; #6 absent so end-of-wal-stream is set. + By("requesting WAL #4: #4 restored, #5 prefetched, end-of-wal-stream set") + Expect(restore(walFile(4))).To(Succeed()) + Eventually(func(g Gomega) { + g.Expect(existsIn(pgWalPath, walFile(4))).To(BeTrue(), "#4 in pg_wal") + g.Expect(existsIn(spoolDirectory, walFile(5))).To(BeTrue(), "#5 in spool") + g.Expect(flagSet()).To(BeTrue(), "end-of-wal-stream set (#6 absent)") + }).WithTimeout(time.Minute).WithPolling(2 * time.Second).Should(Succeed()) + + By("forging WAL segment #6 on the object store") + forge(latestWAL+".gz", walFile(6)) + + // #5: served from the spool; flag untouched (served before it is checked). + By("requesting WAL #5: served from the spool, end-of-wal-stream still set") + Expect(restore(walFile(5))).To(Succeed()) + Eventually(func(g Gomega) { + g.Expect(existsIn(pgWalPath, walFile(5))).To(BeTrue(), "#5 in pg_wal") + g.Expect(spoolSegments()).To(Equal(0), "no WAL segments in spool") + g.Expect(flagSet()).To(BeTrue(), "end-of-wal-stream still set") + }).WithTimeout(time.Minute).WithPolling(2 * time.Second).Should(Succeed()) + + // #6 (first): flag is set, so the request fails fast (exit 1) and the + // flag is consumed, leaving an empty spool. + By("requesting WAL #6: fails fast on the end-of-wal-stream flag, spool cleared") + restoreErr := restore(walFile(6)) + var exitErr executil.CodeExitError + Expect(errors.As(restoreErr, &exitErr)).To(BeTrue(), + "expected a CodeExitError, got %T: %v", restoreErr, restoreErr) + Expect(exitErr.ExitStatus()).To(Equal(1), "exit code should be 1") + Eventually(func(g Gomega) { + g.Expect(existsIn(pgWalPath, walFile(6))).To(BeFalse(), "#6 not restored") + g.Expect(spoolSegments()).To(Equal(0), "no WAL segments in spool") + g.Expect(flagSet()).To(BeFalse(), "end-of-wal-stream consumed") + }).WithTimeout(time.Minute).WithPolling(2 * time.Second).Should(Succeed()) + + // #6 (second): now present, restored; #7 and #8 absent so the flag is + // set again. + By("requesting WAL #6 again: #6 restored, end-of-wal-stream set again") + Expect(restore(walFile(6))).To(Succeed()) + Eventually(func(g Gomega) { + g.Expect(existsIn(pgWalPath, walFile(6))).To(BeTrue(), "#6 in pg_wal") + g.Expect(spoolSegments()).To(Equal(0), "no WAL segments in spool") + g.Expect(flagSet()).To(BeTrue(), "end-of-wal-stream set (#7/#8 absent)") + }).WithTimeout(time.Minute).WithPolling(2 * time.Second).Should(Succeed()) + }) +}) diff --git a/web/docs/concepts.md b/web/docs/concepts.md index 3832df3..b2f2ce6 100644 --- a/web/docs/concepts.md +++ b/web/docs/concepts.md @@ -35,7 +35,7 @@ object storage system. It allows you to configure: - **Base backup options**—with similar settings for compression, concurrency, and encryption—under `.spec.configuration.data` - **Retention policies** to manage the life-cycle of archived WALs and backups - via `.spec.configuration.retentionPolicy` + via `.spec.retentionPolicy` WAL files are archived in the `wals` directory, while base backups are stored as **tarballs** in the `base` directory, following the @@ -43,7 +43,7 @@ as **tarballs** in the `base` directory, following the The plugin also offers advanced capabilities, including [backup tagging](misc.md#backup-object-tagging) and -[extra options for backups and WAL archiving](misc.md#extra-options-for-backup-and-wal-archiving). +[extra options for backups and WAL archiving](misc.md#extra-options-for-backup-wal-archiving-and-restore). :::tip For details, refer to the diff --git a/web/docs/installation.mdx b/web/docs/installation.mdx index 027d1e8..bff100b 100644 --- a/web/docs/installation.mdx +++ b/web/docs/installation.mdx @@ -54,10 +54,49 @@ Both checks are required before proceeding with the installation. ## Installing the Barman Cloud Plugin -import { InstallationSnippet } from '@site/src/components/Installation'; +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import { InstallationSnippet, ManifestVersion } from '@site/src/components/Installation'; +import { HelmInstallationSnippet } from '@site/src/components/HelmInstallation'; -Install the plugin using `kubectl` by applying the manifest for the latest -release: + + + +The plugin can be installed using the provided [Helm chart](https://github.com/cloudnative-pg/charts/tree/main/charts/plugin-barman-cloud). +This installs the latest published chart release; to test an unreleased +development snapshot instead, switch to the [**Manifest (kubectl)**](./?install-method=kubectl#installing-the-barman-cloud-plugin) tab. + + + +Example output: + +```output +Release "plugin-barman-cloud" does not exist. Installing it now. +NAME: plugin-barman-cloud +LAST DEPLOYED: Wed Jul 1 09:05:16 2026 +NAMESPACE: cnpg-system +STATUS: deployed +REVISION: 1 +DESCRIPTION: Install complete +TEST SUITE: None +``` + +Finally, check that the deployment is up and running: + +```sh +kubectl -n cnpg-system rollout status deploy/plugin-barman-cloud +``` + +Example output: + +```output +deployment "plugin-barman-cloud" successfully rolled out +``` + + + + +Install the plugin using `kubectl` by applying the manifest for : @@ -86,8 +125,7 @@ issuer.cert-manager.io/selfsigned-issuer created Finally, check that the deployment is up and running: ```sh -kubectl rollout status deployment \ - -n cnpg-system barman-cloud +kubectl -n cnpg-system rollout status deploy/barman-cloud ``` Example output: @@ -96,14 +134,15 @@ Example output: deployment "barman-cloud" successfully rolled out ``` + + + +--- + This confirms that the plugin is deployed and ready to use. ## Testing the latest development snapshot -You can also test the latest development snapshot of the plugin with the -following command: +import { DevSnapshotSection } from '@site/src/components/Installation'; -```sh -kubectl apply -f \ - https://raw.githubusercontent.com/cloudnative-pg/plugin-barman-cloud/refs/heads/main/manifest.yaml -``` + diff --git a/web/docs/misc.md b/web/docs/misc.md index 0f03b28..e6594df 100644 --- a/web/docs/misc.md +++ b/web/docs/misc.md @@ -32,17 +32,20 @@ spec: [...] ``` -## Extra Options for Backup and WAL Archiving +## Extra Options for Backup, WAL Archiving, and Restore -You can pass additional command-line arguments to `barman-cloud-backup` and -`barman-cloud-wal-archive` using the `additionalCommandArgs` field in the -`ObjectStore` configuration. +You can pass additional command-line arguments to the underlying +`barman-cloud-*` commands using the corresponding fields in the `ObjectStore` +configuration. - `.spec.configuration.data.additionalCommandArgs`: for `barman-cloud-backup` +- `.spec.configuration.data.restoreAdditionalCommandArgs`: for `barman-cloud-restore` - `.spec.configuration.wal.archiveAdditionalCommandArgs`: for `barman-cloud-wal-archive` +- `.spec.configuration.wal.restoreAdditionalCommandArgs`: for `barman-cloud-wal-restore` -Each field accepts a list of string arguments. If an argument is already -configured elsewhere in the plugin, the duplicate will be ignored. +Each field accepts a list of string arguments. If an argument conflicts with +one already set by the plugin, the user-provided value will be ignored. These +fields are intended to pass options the plugin does not configure automatically. ### Example: Extra Backup Options @@ -58,6 +61,19 @@ spec: - "--read-timeout=60" ``` +### Example: Extra Restore Options + +```yaml +kind: ObjectStore +metadata: + name: my-store +spec: + configuration: + data: + restoreAdditionalCommandArgs: + - "--read-timeout=900" +``` + ### Example: Extra WAL Archive Options ```yaml @@ -72,6 +88,19 @@ spec: - "--read-timeout=60" ``` +### Example: Extra WAL Restore Options + +```yaml +kind: ObjectStore +metadata: + name: my-store +spec: + configuration: + wal: + restoreAdditionalCommandArgs: + - "--read-timeout=60" +``` + For a complete list of supported options, refer to the [official Barman Cloud documentation](https://docs.pgbarman.org/release/latest/). diff --git a/web/docs/troubleshooting.md b/web/docs/troubleshooting.md index fe57262..c57a81e 100644 --- a/web/docs/troubleshooting.md +++ b/web/docs/troubleshooting.md @@ -485,14 +485,10 @@ If problems persist: ### Plugin Limitations -1. **Installation method**: Currently only supports manifest and Kustomize - installation ([#351](https://github.com/cloudnative-pg/plugin-barman-cloud/issues/351) - - Helm chart requested) - -2. **Sidecar resource sharing**: The plugin sidecar container shares pod +1. **Sidecar resource sharing**: The plugin sidecar container shares pod resources with PostgreSQL -3. **Plugin restart behavior**: Restarting the sidecar container requires +2. **Plugin restart behavior**: Restarting the sidecar container requires restarting the entire PostgreSQL pod ## Recap of General Debugging Steps @@ -588,4 +584,3 @@ kubectl get secret -n -o jsonpath='{.data}' | jq 'keys * **"NoSuchBucket"** — Verify the bucket exists and the endpoint URL is correct. * **"Connection timeout"** — Check network connectivity and firewall rules. * **"SSL certificate problem"** — For self-signed certificates, verify the CA bundle configuration. - diff --git a/web/docusaurus.config.ts b/web/docusaurus.config.ts index a319f1b..d90f8da 100644 --- a/web/docusaurus.config.ts +++ b/web/docusaurus.config.ts @@ -21,7 +21,12 @@ const config: Config = { deploymentBranch: 'gh-pages', onBrokenLinks: 'throw', - onBrokenMarkdownLinks: 'throw', + + markdown: { + hooks: { + onBrokenMarkdownLinks: 'throw', + }, + }, // Even if you don't use internationalization, you can use this field to set // useful metadata like html lang. For example, if your site is Chinese, you diff --git a/web/package.json b/web/package.json index 0844a88..b8f157d 100644 --- a/web/package.json +++ b/web/package.json @@ -15,8 +15,8 @@ "typecheck": "tsc" }, "dependencies": { - "@docusaurus/core": "3.10.1", - "@docusaurus/preset-classic": "3.10.1", + "@docusaurus/core": "3.10.2", + "@docusaurus/preset-classic": "3.10.2", "@easyops-cn/docusaurus-search-local": "^0.55.0", "@mdx-js/react": "^3.0.0", "clsx": "^2.0.0", @@ -25,10 +25,10 @@ "react-dom": "^19.0.0" }, "devDependencies": { - "@docusaurus/module-type-aliases": "3.10.1", - "@docusaurus/tsconfig": "3.10.1", - "@docusaurus/types": "3.10.1", - "typescript": "~6.0.0" + "@docusaurus/module-type-aliases": "3.10.2", + "@docusaurus/tsconfig": "3.10.2", + "@docusaurus/types": "3.10.2", + "typescript": "~7.0.0" }, "browserslist": { "production": [ @@ -47,6 +47,7 @@ }, "resolutions": { "webpackbar": "^7.0.0", - "serialize-javascript": ">=7.0.5" + "serialize-javascript": ">=7.0.5", + "uuid": ">=11.1.1" } } diff --git a/web/src/components/HelmInstallation/index.tsx b/web/src/components/HelmInstallation/index.tsx new file mode 100644 index 0000000..af5f79b --- /dev/null +++ b/web/src/components/HelmInstallation/index.tsx @@ -0,0 +1,36 @@ +import {ReactElement} from 'react'; +import CodeBlock from '@theme/CodeBlock'; +import {useActiveVersion, useLatestVersion} from '@docusaurus/plugin-content-docs/client'; + +// HelmInstallationSnippet is the Helm command to install the plugin. +// +// - Latest release: no override. The chart already defaults to +// itself. +// - Older release: pin image.tag and sidecarImage.tag to that +// version. We check this again on every build using +// useLatestVersion, so an old page updates itself once a newer +// version ships. +// - Dev docs: also no override, but this does NOT install a dev +// build. Setting the tag alone would not be enough, since the +// chart's own templates (CRDs, RBAC...) can be older than what +// main needs. Use the kubectl method to test a dev build. +export function HelmInstallationSnippet(): ReactElement { + const activeVersion = useActiveVersion('default'); + const latestVersion = useLatestVersion('default'); + const isOlderRelease = activeVersion + && activeVersion.name !== 'current' + && activeVersion.name !== latestVersion.name; + const setArgs = isOlderRelease + ? ` \\ + --set image.tag=v${activeVersion.name} \\ + --set sidecarImage.tag=v${activeVersion.name}` + : ''; + return ( + + {`helm repo add cnpg https://cloudnative-pg.github.io/charts --force-update +helm upgrade --install plugin-barman-cloud \\ + --namespace cnpg-system${setArgs} \\ + cnpg/plugin-barman-cloud`} + + ); +} diff --git a/web/src/components/Installation/index.tsx b/web/src/components/Installation/index.tsx index 064a0ea..787c73f 100644 --- a/web/src/components/Installation/index.tsx +++ b/web/src/components/Installation/index.tsx @@ -1,16 +1,60 @@ import {ReactElement} from 'react'; import CodeBlock from '@theme/CodeBlock'; -import {useCurrentVersion} from '@site/src/hooks/versions'; +import Link from '@docusaurus/Link'; +import {useLocation} from '@docusaurus/router'; +import {useActiveVersion} from '@docusaurus/plugin-content-docs/client'; -// InstallationSnippet is the kubectl incantation to install the lastest -// available version of the Barman Cloud Plugin. +// DEV_MANIFEST_URL is the URL of the manifest.yaml on the main branch of the plugin repo. +const DEV_MANIFEST_URL = + 'https://raw.githubusercontent.com/cloudnative-pg/plugin-barman-cloud/refs/heads/main/manifest.yaml'; + +// InstallationSnippet is the kubectl incantation to install the Barman +// Cloud Plugin: the manifest matching the doc version being viewed, or +// (on the unreleased "current" docs) the latest manifest on main. export function InstallationSnippet(): ReactElement { - const latest = useCurrentVersion('latestReleased'); + const activeVersion = useActiveVersion('default'); + const url = activeVersion && activeVersion.name !== 'current' + ? `https://github.com/cloudnative-pg/plugin-barman-cloud/releases/download/v${activeVersion.name}/manifest.yaml` + : DEV_MANIFEST_URL; return ( {`kubectl apply -f \\ - https://github.com/cloudnative-pg/plugin-barman-cloud/releases/download/v${latest}/manifest.yaml`} + ${url}`} ); } +// ManifestVersion names the manifest the snippet below installs: the +// release tag for a versioned docs page, or the main branch on Dev docs. +export function ManifestVersion(): ReactElement { + const activeVersion = useActiveVersion('default'); + return activeVersion && activeVersion.name !== 'current' + ? v{activeVersion.name} + : <>the latest development snapshot from the main branch; +} + +// DevSnapshotSection shows how to test the main-branch manifest. On +// the Dev docs, the kubectl install above already does that, so we +// hide this section there. (The Helm tab there installs the latest +// release, not a dev build.) +export function DevSnapshotSection(): ReactElement { + const activeVersion = useActiveVersion('default'); + const {pathname} = useLocation(); + if (!activeVersion || activeVersion.name === 'current') { + return ( +

The kubectl + install command above already applies the latest development + snapshot from the main branch.

+ ); + } + return ( + <> +

You can also test the latest development snapshot of the plugin + with the following command:

+ + {`kubectl apply -f \\ + ${DEV_MANIFEST_URL}`} + + + ); +} diff --git a/web/src/hooks/versions.ts b/web/src/hooks/versions.ts deleted file mode 100644 index 785cc2f..0000000 --- a/web/src/hooks/versions.ts +++ /dev/null @@ -1,36 +0,0 @@ -import {useActiveVersion, useLatestVersion, useVersions} from '@docusaurus/plugin-content-docs/client'; - - -export function useCurrentVersion(fallback: 'latest' | 'latestReleased' = 'latest'): string { - switch (fallback) { - case 'latestReleased': - return useLatestReleasedVersion(); - case 'latest': { - const version = useActiveVersion('default'); - return version?.name ?? useLatestVersion('default')?.name; - } - default: - // The following line ensures that if `fallback` is not 'latest' or 'latestReleased', - // an error is thrown. This can be useful for catching unexpected states. - throw new Error(`Unhandled fallback type: ${fallback}`); - } -} - -export function useLatestReleasedVersion(): string { - const allVersions = useVersions('default'); - - // Filter out "current" to only consider versioned docs - const versionedDocs = allVersions.filter(version => version.name !== 'current'); - - // Handle the case where no versioned documents are found - if (versionedDocs.length === 0) { - return "unknown_version"; - } - - const sortedVersions = versionedDocs.sort((a, b) => { - return b.name.localeCompare(a.name, undefined, { numeric: true, sensitivity: 'base' }); - }); - - // The latest version is the first in the sorted list since versionedDocs was not empty, - return sortedVersions[0].name; -} diff --git a/web/versioned_docs/version-0.10.0/installation.mdx b/web/versioned_docs/version-0.10.0/installation.mdx deleted file mode 100644 index 027d1e8..0000000 --- a/web/versioned_docs/version-0.10.0/installation.mdx +++ /dev/null @@ -1,109 +0,0 @@ ---- -sidebar_position: 20 ---- - -# Installation - -:::important -1. The plugin **must** be installed in the same namespace as the CloudNativePG - operator (typically `cnpg-system`). - -2. Keep in mind that the operator's **listening namespaces** may differ from its - installation namespace. Double-check this to avoid configuration issues. -::: - -## Verifying the Requirements - -Before installing the plugin, make sure the [requirements](intro.md#requirements) are met. - -### CloudNativePG Version - -Ensure you're running a version of CloudNativePG that is compatible with the -plugin. If installed in the default `cnpg-system` namespace, you can verify the -version with: - -```sh -kubectl get deployment -n cnpg-system cnpg-controller-manager \ - -o jsonpath="{.spec.template.spec.containers[*].image}" -``` - -Example output: - -```output -ghcr.io/cloudnative-pg/cloudnative-pg:1.26.0 -``` - -The version **must be 1.26 or newer**. - -### cert-manager - -Use the [cmctl](https://cert-manager.io/docs/reference/cmctl/#installation) -tool to confirm that `cert-manager` is installed and available: - -```sh -cmctl check api -``` - -Example output: - -```output -The cert-manager API is ready -``` - -Both checks are required before proceeding with the installation. - -## Installing the Barman Cloud Plugin - -import { InstallationSnippet } from '@site/src/components/Installation'; - -Install the plugin using `kubectl` by applying the manifest for the latest -release: - - - -Example output: - -```output -customresourcedefinition.apiextensions.k8s.io/objectstores.barmancloud.cnpg.io created -serviceaccount/plugin-barman-cloud created -role.rbac.authorization.k8s.io/leader-election-role created -clusterrole.rbac.authorization.k8s.io/metrics-auth-role created -clusterrole.rbac.authorization.k8s.io/metrics-reader created -clusterrole.rbac.authorization.k8s.io/objectstore-editor-role created -clusterrole.rbac.authorization.k8s.io/objectstore-viewer-role created -clusterrole.rbac.authorization.k8s.io/plugin-barman-cloud created -rolebinding.rbac.authorization.k8s.io/leader-election-rolebinding created -clusterrolebinding.rbac.authorization.k8s.io/metrics-auth-rolebinding created -clusterrolebinding.rbac.authorization.k8s.io/plugin-barman-cloud-binding created -secret/plugin-barman-cloud-8tfddg42gf created -service/barman-cloud created -deployment.apps/barman-cloud configured -certificate.cert-manager.io/barman-cloud-client created -certificate.cert-manager.io/barman-cloud-server created -issuer.cert-manager.io/selfsigned-issuer created -``` - -Finally, check that the deployment is up and running: - -```sh -kubectl rollout status deployment \ - -n cnpg-system barman-cloud -``` - -Example output: - -```output -deployment "barman-cloud" successfully rolled out -``` - -This confirms that the plugin is deployed and ready to use. - -## Testing the latest development snapshot - -You can also test the latest development snapshot of the plugin with the -following command: - -```sh -kubectl apply -f \ - https://raw.githubusercontent.com/cloudnative-pg/plugin-barman-cloud/refs/heads/main/manifest.yaml -``` diff --git a/web/versioned_docs/version-0.11.0/compression.md b/web/versioned_docs/version-0.13.0/compression.md similarity index 88% rename from web/versioned_docs/version-0.11.0/compression.md rename to web/versioned_docs/version-0.13.0/compression.md index 2abbede..cfc6355 100644 --- a/web/versioned_docs/version-0.11.0/compression.md +++ b/web/versioned_docs/version-0.13.0/compression.md @@ -15,7 +15,7 @@ for space, speed, or a balance of both. - `bzip2` - `gzip` -- `lz4` (WAL only) +- `lz4` - `snappy` - `xz` (WAL only) - `zstd` (WAL only) @@ -41,3 +41,5 @@ network throughput. | bzip2 | 25,404 | 13,886 | 395 | 67 | 5.9:1 | | gzip | 116,281 | 3,077 | 395 | 91 | 4.3:1 | | snappy | 8,134 | 8,341 | 395 | 166 | 2.4:1 | + +Numbers come from a 2021 Barman proof of concept ([EnterpriseDB/barman#344](https://github.com/EnterpriseDB/barman/issues/344#issuecomment-992547396)), which predates `lz4` support for base backups. `lz4` is not yet benchmarked. diff --git a/web/versioned_docs/version-0.11.0/concepts.md b/web/versioned_docs/version-0.13.0/concepts.md similarity index 99% rename from web/versioned_docs/version-0.11.0/concepts.md rename to web/versioned_docs/version-0.13.0/concepts.md index 3832df3..388714a 100644 --- a/web/versioned_docs/version-0.11.0/concepts.md +++ b/web/versioned_docs/version-0.13.0/concepts.md @@ -43,7 +43,7 @@ as **tarballs** in the `base` directory, following the The plugin also offers advanced capabilities, including [backup tagging](misc.md#backup-object-tagging) and -[extra options for backups and WAL archiving](misc.md#extra-options-for-backup-and-wal-archiving). +[extra options for backups and WAL archiving](misc.md#extra-options-for-backup-wal-archiving-and-restore). :::tip For details, refer to the diff --git a/web/versioned_docs/version-0.10.0/images.md b/web/versioned_docs/version-0.13.0/images.md similarity index 100% rename from web/versioned_docs/version-0.10.0/images.md rename to web/versioned_docs/version-0.13.0/images.md diff --git a/web/versioned_docs/version-0.11.0/installation.mdx b/web/versioned_docs/version-0.13.0/installation.mdx similarity index 68% rename from web/versioned_docs/version-0.11.0/installation.mdx rename to web/versioned_docs/version-0.13.0/installation.mdx index 027d1e8..9df96d1 100644 --- a/web/versioned_docs/version-0.11.0/installation.mdx +++ b/web/versioned_docs/version-0.13.0/installation.mdx @@ -54,10 +54,47 @@ Both checks are required before proceeding with the installation. ## Installing the Barman Cloud Plugin -import { InstallationSnippet } from '@site/src/components/Installation'; +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import { InstallationSnippet, ManifestVersion } from '@site/src/components/Installation'; +import { HelmInstallationSnippet } from '@site/src/components/HelmInstallation'; -Install the plugin using `kubectl` by applying the manifest for the latest -release: + + + +The plugin can be installed using the provided [Helm chart](https://github.com/cloudnative-pg/charts/tree/main/charts/plugin-barman-cloud): + + + +Example output: + +```output +Release "plugin-barman-cloud" does not exist. Installing it now. +NAME: plugin-barman-cloud +LAST DEPLOYED: Wed Jul 1 09:05:16 2026 +NAMESPACE: cnpg-system +STATUS: deployed +REVISION: 1 +DESCRIPTION: Install complete +TEST SUITE: None +``` + +Finally, check that the deployment is up and running: + +```sh +kubectl -n cnpg-system rollout status deploy/plugin-barman-cloud +``` + +Example output: + +```output +deployment "plugin-barman-cloud" successfully rolled out +``` + + + + +Install the plugin using `kubectl` by applying the manifest for : @@ -86,8 +123,7 @@ issuer.cert-manager.io/selfsigned-issuer created Finally, check that the deployment is up and running: ```sh -kubectl rollout status deployment \ - -n cnpg-system barman-cloud +kubectl -n cnpg-system rollout status deploy/barman-cloud ``` Example output: @@ -96,14 +132,15 @@ Example output: deployment "barman-cloud" successfully rolled out ``` + + + +--- + This confirms that the plugin is deployed and ready to use. ## Testing the latest development snapshot -You can also test the latest development snapshot of the plugin with the -following command: +import { DevSnapshotSection } from '@site/src/components/Installation'; -```sh -kubectl apply -f \ - https://raw.githubusercontent.com/cloudnative-pg/plugin-barman-cloud/refs/heads/main/manifest.yaml -``` + diff --git a/web/versioned_docs/version-0.10.0/intro.md b/web/versioned_docs/version-0.13.0/intro.md similarity index 100% rename from web/versioned_docs/version-0.10.0/intro.md rename to web/versioned_docs/version-0.13.0/intro.md diff --git a/web/versioned_docs/version-0.10.0/migration.md b/web/versioned_docs/version-0.13.0/migration.md similarity index 100% rename from web/versioned_docs/version-0.10.0/migration.md rename to web/versioned_docs/version-0.13.0/migration.md diff --git a/web/versioned_docs/version-0.10.0/misc.md b/web/versioned_docs/version-0.13.0/misc.md similarity index 66% rename from web/versioned_docs/version-0.10.0/misc.md rename to web/versioned_docs/version-0.13.0/misc.md index 0f03b28..e6594df 100644 --- a/web/versioned_docs/version-0.10.0/misc.md +++ b/web/versioned_docs/version-0.13.0/misc.md @@ -32,17 +32,20 @@ spec: [...] ``` -## Extra Options for Backup and WAL Archiving +## Extra Options for Backup, WAL Archiving, and Restore -You can pass additional command-line arguments to `barman-cloud-backup` and -`barman-cloud-wal-archive` using the `additionalCommandArgs` field in the -`ObjectStore` configuration. +You can pass additional command-line arguments to the underlying +`barman-cloud-*` commands using the corresponding fields in the `ObjectStore` +configuration. - `.spec.configuration.data.additionalCommandArgs`: for `barman-cloud-backup` +- `.spec.configuration.data.restoreAdditionalCommandArgs`: for `barman-cloud-restore` - `.spec.configuration.wal.archiveAdditionalCommandArgs`: for `barman-cloud-wal-archive` +- `.spec.configuration.wal.restoreAdditionalCommandArgs`: for `barman-cloud-wal-restore` -Each field accepts a list of string arguments. If an argument is already -configured elsewhere in the plugin, the duplicate will be ignored. +Each field accepts a list of string arguments. If an argument conflicts with +one already set by the plugin, the user-provided value will be ignored. These +fields are intended to pass options the plugin does not configure automatically. ### Example: Extra Backup Options @@ -58,6 +61,19 @@ spec: - "--read-timeout=60" ``` +### Example: Extra Restore Options + +```yaml +kind: ObjectStore +metadata: + name: my-store +spec: + configuration: + data: + restoreAdditionalCommandArgs: + - "--read-timeout=900" +``` + ### Example: Extra WAL Archive Options ```yaml @@ -72,6 +88,19 @@ spec: - "--read-timeout=60" ``` +### Example: Extra WAL Restore Options + +```yaml +kind: ObjectStore +metadata: + name: my-store +spec: + configuration: + wal: + restoreAdditionalCommandArgs: + - "--read-timeout=60" +``` + For a complete list of supported options, refer to the [official Barman Cloud documentation](https://docs.pgbarman.org/release/latest/). diff --git a/web/versioned_docs/version-0.12.0/object_stores.md b/web/versioned_docs/version-0.13.0/object_stores.md similarity index 100% rename from web/versioned_docs/version-0.12.0/object_stores.md rename to web/versioned_docs/version-0.13.0/object_stores.md diff --git a/web/versioned_docs/version-0.10.0/observability.md b/web/versioned_docs/version-0.13.0/observability.md similarity index 100% rename from web/versioned_docs/version-0.10.0/observability.md rename to web/versioned_docs/version-0.13.0/observability.md diff --git a/web/versioned_docs/version-0.10.0/parameters.md b/web/versioned_docs/version-0.13.0/parameters.md similarity index 100% rename from web/versioned_docs/version-0.10.0/parameters.md rename to web/versioned_docs/version-0.13.0/parameters.md diff --git a/web/versioned_docs/version-0.10.0/plugin-barman-cloud.v1.md b/web/versioned_docs/version-0.13.0/plugin-barman-cloud.v1.md similarity index 100% rename from web/versioned_docs/version-0.10.0/plugin-barman-cloud.v1.md rename to web/versioned_docs/version-0.13.0/plugin-barman-cloud.v1.md diff --git a/web/versioned_docs/version-0.10.0/resource-name-migration.md b/web/versioned_docs/version-0.13.0/resource-name-migration.md similarity index 100% rename from web/versioned_docs/version-0.10.0/resource-name-migration.md rename to web/versioned_docs/version-0.13.0/resource-name-migration.md diff --git a/web/versioned_docs/version-0.10.0/retention.md b/web/versioned_docs/version-0.13.0/retention.md similarity index 100% rename from web/versioned_docs/version-0.10.0/retention.md rename to web/versioned_docs/version-0.13.0/retention.md diff --git a/web/versioned_docs/version-0.12.0/troubleshooting.md b/web/versioned_docs/version-0.13.0/troubleshooting.md similarity index 98% rename from web/versioned_docs/version-0.12.0/troubleshooting.md rename to web/versioned_docs/version-0.13.0/troubleshooting.md index fe57262..c57a81e 100644 --- a/web/versioned_docs/version-0.12.0/troubleshooting.md +++ b/web/versioned_docs/version-0.13.0/troubleshooting.md @@ -485,14 +485,10 @@ If problems persist: ### Plugin Limitations -1. **Installation method**: Currently only supports manifest and Kustomize - installation ([#351](https://github.com/cloudnative-pg/plugin-barman-cloud/issues/351) - - Helm chart requested) - -2. **Sidecar resource sharing**: The plugin sidecar container shares pod +1. **Sidecar resource sharing**: The plugin sidecar container shares pod resources with PostgreSQL -3. **Plugin restart behavior**: Restarting the sidecar container requires +2. **Plugin restart behavior**: Restarting the sidecar container requires restarting the entire PostgreSQL pod ## Recap of General Debugging Steps @@ -588,4 +584,3 @@ kubectl get secret -n -o jsonpath='{.data}' | jq 'keys * **"NoSuchBucket"** — Verify the bucket exists and the endpoint URL is correct. * **"Connection timeout"** — Check network connectivity and firewall rules. * **"SSL certificate problem"** — For self-signed certificates, verify the CA bundle configuration. - diff --git a/web/versioned_docs/version-0.10.0/upgrades.mdx b/web/versioned_docs/version-0.13.0/upgrades.mdx similarity index 100% rename from web/versioned_docs/version-0.10.0/upgrades.mdx rename to web/versioned_docs/version-0.13.0/upgrades.mdx diff --git a/web/versioned_docs/version-0.10.0/usage.md b/web/versioned_docs/version-0.13.0/usage.md similarity index 100% rename from web/versioned_docs/version-0.10.0/usage.md rename to web/versioned_docs/version-0.13.0/usage.md diff --git a/web/versioned_docs/version-0.10.0/compression.md b/web/versioned_docs/version-0.14.0/compression.md similarity index 88% rename from web/versioned_docs/version-0.10.0/compression.md rename to web/versioned_docs/version-0.14.0/compression.md index 2abbede..cfc6355 100644 --- a/web/versioned_docs/version-0.10.0/compression.md +++ b/web/versioned_docs/version-0.14.0/compression.md @@ -15,7 +15,7 @@ for space, speed, or a balance of both. - `bzip2` - `gzip` -- `lz4` (WAL only) +- `lz4` - `snappy` - `xz` (WAL only) - `zstd` (WAL only) @@ -41,3 +41,5 @@ network throughput. | bzip2 | 25,404 | 13,886 | 395 | 67 | 5.9:1 | | gzip | 116,281 | 3,077 | 395 | 91 | 4.3:1 | | snappy | 8,134 | 8,341 | 395 | 166 | 2.4:1 | + +Numbers come from a 2021 Barman proof of concept ([EnterpriseDB/barman#344](https://github.com/EnterpriseDB/barman/issues/344#issuecomment-992547396)), which predates `lz4` support for base backups. `lz4` is not yet benchmarked. diff --git a/web/versioned_docs/version-0.12.0/concepts.md b/web/versioned_docs/version-0.14.0/concepts.md similarity index 99% rename from web/versioned_docs/version-0.12.0/concepts.md rename to web/versioned_docs/version-0.14.0/concepts.md index 3832df3..388714a 100644 --- a/web/versioned_docs/version-0.12.0/concepts.md +++ b/web/versioned_docs/version-0.14.0/concepts.md @@ -43,7 +43,7 @@ as **tarballs** in the `base` directory, following the The plugin also offers advanced capabilities, including [backup tagging](misc.md#backup-object-tagging) and -[extra options for backups and WAL archiving](misc.md#extra-options-for-backup-and-wal-archiving). +[extra options for backups and WAL archiving](misc.md#extra-options-for-backup-wal-archiving-and-restore). :::tip For details, refer to the diff --git a/web/versioned_docs/version-0.11.0/images.md b/web/versioned_docs/version-0.14.0/images.md similarity index 100% rename from web/versioned_docs/version-0.11.0/images.md rename to web/versioned_docs/version-0.14.0/images.md diff --git a/web/versioned_docs/version-0.12.0/installation.mdx b/web/versioned_docs/version-0.14.0/installation.mdx similarity index 68% rename from web/versioned_docs/version-0.12.0/installation.mdx rename to web/versioned_docs/version-0.14.0/installation.mdx index 027d1e8..a4cb684 100644 --- a/web/versioned_docs/version-0.12.0/installation.mdx +++ b/web/versioned_docs/version-0.14.0/installation.mdx @@ -54,10 +54,47 @@ Both checks are required before proceeding with the installation. ## Installing the Barman Cloud Plugin -import { InstallationSnippet } from '@site/src/components/Installation'; +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import { InstallationSnippet, ManifestVersion } from '@site/src/components/Installation'; +import { HelmInstallationSnippet } from '@site/src/components/HelmInstallation'; -Install the plugin using `kubectl` by applying the manifest for the latest -release: + + + +The plugin can be installed using the provided [Helm chart](https://github.com/cloudnative-pg/charts/tree/main/charts/plugin-barman-cloud): + + + +Example output: + +```output +Release "plugin-barman-cloud" does not exist. Installing it now. +NAME: plugin-barman-cloud +LAST DEPLOYED: Wed Jul 1 09:05:16 2026 +NAMESPACE: cnpg-system +STATUS: deployed +REVISION: 1 +DESCRIPTION: Install complete +TEST SUITE: None +``` + +Finally, check that the deployment is up and running: + +```sh +kubectl -n cnpg-system rollout status deploy/plugin-barman-cloud +``` + +Example output: + +```output +deployment "plugin-barman-cloud" successfully rolled out +``` + + + + +Install the plugin using `kubectl` by applying the manifest for : @@ -86,8 +123,7 @@ issuer.cert-manager.io/selfsigned-issuer created Finally, check that the deployment is up and running: ```sh -kubectl rollout status deployment \ - -n cnpg-system barman-cloud +kubectl -n cnpg-system rollout status deploy/barman-cloud ``` Example output: @@ -96,14 +132,13 @@ Example output: deployment "barman-cloud" successfully rolled out ``` + + + This confirms that the plugin is deployed and ready to use. ## Testing the latest development snapshot -You can also test the latest development snapshot of the plugin with the -following command: +import { DevSnapshotSection } from '@site/src/components/Installation'; -```sh -kubectl apply -f \ - https://raw.githubusercontent.com/cloudnative-pg/plugin-barman-cloud/refs/heads/main/manifest.yaml -``` + diff --git a/web/versioned_docs/version-0.11.0/intro.md b/web/versioned_docs/version-0.14.0/intro.md similarity index 100% rename from web/versioned_docs/version-0.11.0/intro.md rename to web/versioned_docs/version-0.14.0/intro.md diff --git a/web/versioned_docs/version-0.11.0/migration.md b/web/versioned_docs/version-0.14.0/migration.md similarity index 100% rename from web/versioned_docs/version-0.11.0/migration.md rename to web/versioned_docs/version-0.14.0/migration.md diff --git a/web/versioned_docs/version-0.12.0/misc.md b/web/versioned_docs/version-0.14.0/misc.md similarity index 66% rename from web/versioned_docs/version-0.12.0/misc.md rename to web/versioned_docs/version-0.14.0/misc.md index 0f03b28..e6594df 100644 --- a/web/versioned_docs/version-0.12.0/misc.md +++ b/web/versioned_docs/version-0.14.0/misc.md @@ -32,17 +32,20 @@ spec: [...] ``` -## Extra Options for Backup and WAL Archiving +## Extra Options for Backup, WAL Archiving, and Restore -You can pass additional command-line arguments to `barman-cloud-backup` and -`barman-cloud-wal-archive` using the `additionalCommandArgs` field in the -`ObjectStore` configuration. +You can pass additional command-line arguments to the underlying +`barman-cloud-*` commands using the corresponding fields in the `ObjectStore` +configuration. - `.spec.configuration.data.additionalCommandArgs`: for `barman-cloud-backup` +- `.spec.configuration.data.restoreAdditionalCommandArgs`: for `barman-cloud-restore` - `.spec.configuration.wal.archiveAdditionalCommandArgs`: for `barman-cloud-wal-archive` +- `.spec.configuration.wal.restoreAdditionalCommandArgs`: for `barman-cloud-wal-restore` -Each field accepts a list of string arguments. If an argument is already -configured elsewhere in the plugin, the duplicate will be ignored. +Each field accepts a list of string arguments. If an argument conflicts with +one already set by the plugin, the user-provided value will be ignored. These +fields are intended to pass options the plugin does not configure automatically. ### Example: Extra Backup Options @@ -58,6 +61,19 @@ spec: - "--read-timeout=60" ``` +### Example: Extra Restore Options + +```yaml +kind: ObjectStore +metadata: + name: my-store +spec: + configuration: + data: + restoreAdditionalCommandArgs: + - "--read-timeout=900" +``` + ### Example: Extra WAL Archive Options ```yaml @@ -72,6 +88,19 @@ spec: - "--read-timeout=60" ``` +### Example: Extra WAL Restore Options + +```yaml +kind: ObjectStore +metadata: + name: my-store +spec: + configuration: + wal: + restoreAdditionalCommandArgs: + - "--read-timeout=60" +``` + For a complete list of supported options, refer to the [official Barman Cloud documentation](https://docs.pgbarman.org/release/latest/). diff --git a/web/versioned_docs/version-0.11.0/object_stores.md b/web/versioned_docs/version-0.14.0/object_stores.md similarity index 99% rename from web/versioned_docs/version-0.11.0/object_stores.md rename to web/versioned_docs/version-0.14.0/object_stores.md index 69a83f6..11b1ff8 100644 --- a/web/versioned_docs/version-0.11.0/object_stores.md +++ b/web/versioned_docs/version-0.14.0/object_stores.md @@ -129,7 +129,6 @@ These strategies help you safeguard backups without requiring broad delete permissions, ensuring both security and compliance with minimal operational overhead. - ### S3-Compatible Storage Providers You can use S3-compatible services like **MinIO**, **Linode (Akamai) Object Storage**, diff --git a/web/versioned_docs/version-0.11.0/observability.md b/web/versioned_docs/version-0.14.0/observability.md similarity index 100% rename from web/versioned_docs/version-0.11.0/observability.md rename to web/versioned_docs/version-0.14.0/observability.md diff --git a/web/versioned_docs/version-0.11.0/parameters.md b/web/versioned_docs/version-0.14.0/parameters.md similarity index 100% rename from web/versioned_docs/version-0.11.0/parameters.md rename to web/versioned_docs/version-0.14.0/parameters.md diff --git a/web/versioned_docs/version-0.11.0/plugin-barman-cloud.v1.md b/web/versioned_docs/version-0.14.0/plugin-barman-cloud.v1.md similarity index 100% rename from web/versioned_docs/version-0.11.0/plugin-barman-cloud.v1.md rename to web/versioned_docs/version-0.14.0/plugin-barman-cloud.v1.md diff --git a/web/versioned_docs/version-0.11.0/resource-name-migration.md b/web/versioned_docs/version-0.14.0/resource-name-migration.md similarity index 100% rename from web/versioned_docs/version-0.11.0/resource-name-migration.md rename to web/versioned_docs/version-0.14.0/resource-name-migration.md diff --git a/web/versioned_docs/version-0.11.0/retention.md b/web/versioned_docs/version-0.14.0/retention.md similarity index 100% rename from web/versioned_docs/version-0.11.0/retention.md rename to web/versioned_docs/version-0.14.0/retention.md diff --git a/web/versioned_docs/version-0.11.0/troubleshooting.md b/web/versioned_docs/version-0.14.0/troubleshooting.md similarity index 98% rename from web/versioned_docs/version-0.11.0/troubleshooting.md rename to web/versioned_docs/version-0.14.0/troubleshooting.md index fe57262..c57a81e 100644 --- a/web/versioned_docs/version-0.11.0/troubleshooting.md +++ b/web/versioned_docs/version-0.14.0/troubleshooting.md @@ -485,14 +485,10 @@ If problems persist: ### Plugin Limitations -1. **Installation method**: Currently only supports manifest and Kustomize - installation ([#351](https://github.com/cloudnative-pg/plugin-barman-cloud/issues/351) - - Helm chart requested) - -2. **Sidecar resource sharing**: The plugin sidecar container shares pod +1. **Sidecar resource sharing**: The plugin sidecar container shares pod resources with PostgreSQL -3. **Plugin restart behavior**: Restarting the sidecar container requires +2. **Plugin restart behavior**: Restarting the sidecar container requires restarting the entire PostgreSQL pod ## Recap of General Debugging Steps @@ -588,4 +584,3 @@ kubectl get secret -n -o jsonpath='{.data}' | jq 'keys * **"NoSuchBucket"** — Verify the bucket exists and the endpoint URL is correct. * **"Connection timeout"** — Check network connectivity and firewall rules. * **"SSL certificate problem"** — For self-signed certificates, verify the CA bundle configuration. - diff --git a/web/versioned_docs/version-0.11.0/upgrades.mdx b/web/versioned_docs/version-0.14.0/upgrades.mdx similarity index 100% rename from web/versioned_docs/version-0.11.0/upgrades.mdx rename to web/versioned_docs/version-0.14.0/upgrades.mdx diff --git a/web/versioned_docs/version-0.11.0/usage.md b/web/versioned_docs/version-0.14.0/usage.md similarity index 100% rename from web/versioned_docs/version-0.11.0/usage.md rename to web/versioned_docs/version-0.14.0/usage.md diff --git a/web/versioned_docs/version-0.12.0/compression.md b/web/versioned_docs/version-0.15.0/compression.md similarity index 88% rename from web/versioned_docs/version-0.12.0/compression.md rename to web/versioned_docs/version-0.15.0/compression.md index 2abbede..cfc6355 100644 --- a/web/versioned_docs/version-0.12.0/compression.md +++ b/web/versioned_docs/version-0.15.0/compression.md @@ -15,7 +15,7 @@ for space, speed, or a balance of both. - `bzip2` - `gzip` -- `lz4` (WAL only) +- `lz4` - `snappy` - `xz` (WAL only) - `zstd` (WAL only) @@ -41,3 +41,5 @@ network throughput. | bzip2 | 25,404 | 13,886 | 395 | 67 | 5.9:1 | | gzip | 116,281 | 3,077 | 395 | 91 | 4.3:1 | | snappy | 8,134 | 8,341 | 395 | 166 | 2.4:1 | + +Numbers come from a 2021 Barman proof of concept ([EnterpriseDB/barman#344](https://github.com/EnterpriseDB/barman/issues/344#issuecomment-992547396)), which predates `lz4` support for base backups. `lz4` is not yet benchmarked. diff --git a/web/versioned_docs/version-0.10.0/concepts.md b/web/versioned_docs/version-0.15.0/concepts.md similarity index 98% rename from web/versioned_docs/version-0.10.0/concepts.md rename to web/versioned_docs/version-0.15.0/concepts.md index 3832df3..b2f2ce6 100644 --- a/web/versioned_docs/version-0.10.0/concepts.md +++ b/web/versioned_docs/version-0.15.0/concepts.md @@ -35,7 +35,7 @@ object storage system. It allows you to configure: - **Base backup options**—with similar settings for compression, concurrency, and encryption—under `.spec.configuration.data` - **Retention policies** to manage the life-cycle of archived WALs and backups - via `.spec.configuration.retentionPolicy` + via `.spec.retentionPolicy` WAL files are archived in the `wals` directory, while base backups are stored as **tarballs** in the `base` directory, following the @@ -43,7 +43,7 @@ as **tarballs** in the `base` directory, following the The plugin also offers advanced capabilities, including [backup tagging](misc.md#backup-object-tagging) and -[extra options for backups and WAL archiving](misc.md#extra-options-for-backup-and-wal-archiving). +[extra options for backups and WAL archiving](misc.md#extra-options-for-backup-wal-archiving-and-restore). :::tip For details, refer to the diff --git a/web/versioned_docs/version-0.12.0/images.md b/web/versioned_docs/version-0.15.0/images.md similarity index 100% rename from web/versioned_docs/version-0.12.0/images.md rename to web/versioned_docs/version-0.15.0/images.md diff --git a/web/versioned_docs/version-0.6.0/installation.mdx b/web/versioned_docs/version-0.15.0/installation.mdx similarity index 64% rename from web/versioned_docs/version-0.6.0/installation.mdx rename to web/versioned_docs/version-0.15.0/installation.mdx index 027d1e8..bff100b 100644 --- a/web/versioned_docs/version-0.6.0/installation.mdx +++ b/web/versioned_docs/version-0.15.0/installation.mdx @@ -54,10 +54,49 @@ Both checks are required before proceeding with the installation. ## Installing the Barman Cloud Plugin -import { InstallationSnippet } from '@site/src/components/Installation'; +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import { InstallationSnippet, ManifestVersion } from '@site/src/components/Installation'; +import { HelmInstallationSnippet } from '@site/src/components/HelmInstallation'; -Install the plugin using `kubectl` by applying the manifest for the latest -release: + + + +The plugin can be installed using the provided [Helm chart](https://github.com/cloudnative-pg/charts/tree/main/charts/plugin-barman-cloud). +This installs the latest published chart release; to test an unreleased +development snapshot instead, switch to the [**Manifest (kubectl)**](./?install-method=kubectl#installing-the-barman-cloud-plugin) tab. + + + +Example output: + +```output +Release "plugin-barman-cloud" does not exist. Installing it now. +NAME: plugin-barman-cloud +LAST DEPLOYED: Wed Jul 1 09:05:16 2026 +NAMESPACE: cnpg-system +STATUS: deployed +REVISION: 1 +DESCRIPTION: Install complete +TEST SUITE: None +``` + +Finally, check that the deployment is up and running: + +```sh +kubectl -n cnpg-system rollout status deploy/plugin-barman-cloud +``` + +Example output: + +```output +deployment "plugin-barman-cloud" successfully rolled out +``` + + + + +Install the plugin using `kubectl` by applying the manifest for : @@ -86,8 +125,7 @@ issuer.cert-manager.io/selfsigned-issuer created Finally, check that the deployment is up and running: ```sh -kubectl rollout status deployment \ - -n cnpg-system barman-cloud +kubectl -n cnpg-system rollout status deploy/barman-cloud ``` Example output: @@ -96,14 +134,15 @@ Example output: deployment "barman-cloud" successfully rolled out ``` + + + +--- + This confirms that the plugin is deployed and ready to use. ## Testing the latest development snapshot -You can also test the latest development snapshot of the plugin with the -following command: +import { DevSnapshotSection } from '@site/src/components/Installation'; -```sh -kubectl apply -f \ - https://raw.githubusercontent.com/cloudnative-pg/plugin-barman-cloud/refs/heads/main/manifest.yaml -``` + diff --git a/web/versioned_docs/version-0.12.0/intro.md b/web/versioned_docs/version-0.15.0/intro.md similarity index 100% rename from web/versioned_docs/version-0.12.0/intro.md rename to web/versioned_docs/version-0.15.0/intro.md diff --git a/web/versioned_docs/version-0.12.0/migration.md b/web/versioned_docs/version-0.15.0/migration.md similarity index 100% rename from web/versioned_docs/version-0.12.0/migration.md rename to web/versioned_docs/version-0.15.0/migration.md diff --git a/web/versioned_docs/version-0.11.0/misc.md b/web/versioned_docs/version-0.15.0/misc.md similarity index 66% rename from web/versioned_docs/version-0.11.0/misc.md rename to web/versioned_docs/version-0.15.0/misc.md index 0f03b28..e6594df 100644 --- a/web/versioned_docs/version-0.11.0/misc.md +++ b/web/versioned_docs/version-0.15.0/misc.md @@ -32,17 +32,20 @@ spec: [...] ``` -## Extra Options for Backup and WAL Archiving +## Extra Options for Backup, WAL Archiving, and Restore -You can pass additional command-line arguments to `barman-cloud-backup` and -`barman-cloud-wal-archive` using the `additionalCommandArgs` field in the -`ObjectStore` configuration. +You can pass additional command-line arguments to the underlying +`barman-cloud-*` commands using the corresponding fields in the `ObjectStore` +configuration. - `.spec.configuration.data.additionalCommandArgs`: for `barman-cloud-backup` +- `.spec.configuration.data.restoreAdditionalCommandArgs`: for `barman-cloud-restore` - `.spec.configuration.wal.archiveAdditionalCommandArgs`: for `barman-cloud-wal-archive` +- `.spec.configuration.wal.restoreAdditionalCommandArgs`: for `barman-cloud-wal-restore` -Each field accepts a list of string arguments. If an argument is already -configured elsewhere in the plugin, the duplicate will be ignored. +Each field accepts a list of string arguments. If an argument conflicts with +one already set by the plugin, the user-provided value will be ignored. These +fields are intended to pass options the plugin does not configure automatically. ### Example: Extra Backup Options @@ -58,6 +61,19 @@ spec: - "--read-timeout=60" ``` +### Example: Extra Restore Options + +```yaml +kind: ObjectStore +metadata: + name: my-store +spec: + configuration: + data: + restoreAdditionalCommandArgs: + - "--read-timeout=900" +``` + ### Example: Extra WAL Archive Options ```yaml @@ -72,6 +88,19 @@ spec: - "--read-timeout=60" ``` +### Example: Extra WAL Restore Options + +```yaml +kind: ObjectStore +metadata: + name: my-store +spec: + configuration: + wal: + restoreAdditionalCommandArgs: + - "--read-timeout=60" +``` + For a complete list of supported options, refer to the [official Barman Cloud documentation](https://docs.pgbarman.org/release/latest/). diff --git a/web/versioned_docs/version-0.10.0/object_stores.md b/web/versioned_docs/version-0.15.0/object_stores.md similarity index 80% rename from web/versioned_docs/version-0.10.0/object_stores.md rename to web/versioned_docs/version-0.15.0/object_stores.md index 74e0473..11b1ff8 100644 --- a/web/versioned_docs/version-0.10.0/object_stores.md +++ b/web/versioned_docs/version-0.15.0/object_stores.md @@ -29,6 +29,16 @@ the specific object storage provider you are using. The following sections detail the setup for each. +:::note Authentication Methods +The Barman Cloud Plugin does not independently test all authentication methods +supported by `barman-cloud`. The plugin's responsibility is limited to passing +the provided credentials to `barman-cloud`, which then handles authentication +according to its own implementation. Users should refer to the +[Barman Cloud documentation](https://docs.pgbarman.org/release/latest/) to +verify that their chosen authentication method is supported and properly +configured. +::: + --- ## AWS S3 @@ -119,7 +129,6 @@ These strategies help you safeguard backups without requiring broad delete permissions, ensuring both security and compliance with minimal operational overhead. - ### S3-Compatible Storage Providers You can use S3-compatible services like **MinIO**, **Linode (Akamai) Object Storage**, @@ -230,14 +239,18 @@ is Microsoft’s cloud-based object storage solution. Barman Cloud supports the following authentication methods: - [Connection String](https://learn.microsoft.com/en-us/azure/storage/common/storage-configure-connection-string) -- Storage Account Name + [Access Key](https://learn.microsoft.com/en-us/azure/storage/common/storage-account-keys-manage) -- Storage Account Name + [SAS Token](https://learn.microsoft.com/en-us/azure/storage/blobs/sas-service-create) -- [Azure AD Workload Identity](https://azure.github.io/azure-workload-identity/docs/introduction.html) +- Storage Account Name + [Storage Account Access Key](https://learn.microsoft.com/en-us/azure/storage/common/storage-account-keys-manage) +- Storage Account Name + [Storage Account SAS Token](https://learn.microsoft.com/en-us/azure/storage/blobs/sas-service-create) +- [Azure AD Managed Identity](https://learn.microsoft.com/en-us/entra/identity/managed-identities-azure-resources/overview) +- [Default Azure Credentials](https://learn.microsoft.com/en-us/dotnet/api/azure.identity.defaultazurecredential?view=azure-dotnet) -### Azure AD Workload Identity +### Azure AD Managed Identity -This method avoids storing credentials in Kubernetes via the -`.spec.configuration.inheritFromAzureAD` option: +This method avoids storing credentials in Kubernetes by enabling the +usage of [Azure Managed Identities](https://learn.microsoft.com/en-us/entra/identity/managed-identities-azure-resources/overview) authentication mechanism. +This can be enabled by setting the `inheritFromAzureAD` option to `true`. +Managed Identity can be configured for the AKS Cluster by following +the [Azure documentation](https://learn.microsoft.com/en-us/azure/aks/use-managed-identity?pivots=system-assigned). ```yaml apiVersion: barmancloud.cnpg.io/v1 @@ -252,6 +265,36 @@ spec: [...] ``` +### Default Azure Credentials + +The `useDefaultAzureCredentials` option enables the default Azure credentials +flow, which uses [`DefaultAzureCredential`](https://learn.microsoft.com/en-us/python/api/azure-identity/azure.identity.defaultazurecredential) +to automatically discover and use available credentials in the following order: + +1. **Environment Variables** — `AZURE_CLIENT_ID`, `AZURE_CLIENT_SECRET`, and `AZURE_TENANT_ID` for Service Principal authentication +2. **Managed Identity** — Uses the managed identity assigned to the pod +3. **Azure CLI** — Uses credentials from the Azure CLI if available +4. **Azure PowerShell** — Uses credentials from Azure PowerShell if available + +This approach is particularly useful for getting started with development and testing; it allows +the SDK to attempt multiple authentication mechanisms seamlessly across different environments. +However, this is not recommended for production. Please refer to the +[official Azure guidance](https://learn.microsoft.com/en-us/dotnet/azure/sdk/authentication/credential-chains?tabs=dac#usage-guidance-for-defaultazurecredential) +for a comprehensive understanding of `DefaultAzureCredential`. + +```yaml +apiVersion: barmancloud.cnpg.io/v1 +kind: ObjectStore +metadata: + name: azure-store +spec: + configuration: + destinationPath: "" + azureCredentials: + useDefaultAzureCredentials: true + [...] +``` + ### Access Key, SAS Token, or Connection String Store credentials in a Kubernetes secret: diff --git a/web/versioned_docs/version-0.12.0/observability.md b/web/versioned_docs/version-0.15.0/observability.md similarity index 100% rename from web/versioned_docs/version-0.12.0/observability.md rename to web/versioned_docs/version-0.15.0/observability.md diff --git a/web/versioned_docs/version-0.12.0/parameters.md b/web/versioned_docs/version-0.15.0/parameters.md similarity index 100% rename from web/versioned_docs/version-0.12.0/parameters.md rename to web/versioned_docs/version-0.15.0/parameters.md diff --git a/web/versioned_docs/version-0.12.0/plugin-barman-cloud.v1.md b/web/versioned_docs/version-0.15.0/plugin-barman-cloud.v1.md similarity index 100% rename from web/versioned_docs/version-0.12.0/plugin-barman-cloud.v1.md rename to web/versioned_docs/version-0.15.0/plugin-barman-cloud.v1.md diff --git a/web/versioned_docs/version-0.12.0/resource-name-migration.md b/web/versioned_docs/version-0.15.0/resource-name-migration.md similarity index 100% rename from web/versioned_docs/version-0.12.0/resource-name-migration.md rename to web/versioned_docs/version-0.15.0/resource-name-migration.md diff --git a/web/versioned_docs/version-0.12.0/retention.md b/web/versioned_docs/version-0.15.0/retention.md similarity index 100% rename from web/versioned_docs/version-0.12.0/retention.md rename to web/versioned_docs/version-0.15.0/retention.md diff --git a/web/versioned_docs/version-0.10.0/troubleshooting.md b/web/versioned_docs/version-0.15.0/troubleshooting.md similarity index 97% rename from web/versioned_docs/version-0.10.0/troubleshooting.md rename to web/versioned_docs/version-0.15.0/troubleshooting.md index 2e3cb4d..c57a81e 100644 --- a/web/versioned_docs/version-0.10.0/troubleshooting.md +++ b/web/versioned_docs/version-0.15.0/troubleshooting.md @@ -406,7 +406,7 @@ For detailed PITR configuration and WAL management, see the 3. **Adjust provider-specific settings (endpoint, path style, etc.)** - See [Object Store Configuration](object_stores.md) for provider-specific settings - - Ensure `endpointURL` match your storage type + - Ensure `endpointURL` is set correctly for your storage provider - Verify network policies allow egress to your storage provider ## Diagnostic Commands @@ -485,14 +485,10 @@ If problems persist: ### Plugin Limitations -1. **Installation method**: Currently only supports manifest and Kustomize - installation ([#351](https://github.com/cloudnative-pg/plugin-barman-cloud/issues/351) - - Helm chart requested) - -2. **Sidecar resource sharing**: The plugin sidecar container shares pod +1. **Sidecar resource sharing**: The plugin sidecar container shares pod resources with PostgreSQL -3. **Plugin restart behavior**: Restarting the sidecar container requires +2. **Plugin restart behavior**: Restarting the sidecar container requires restarting the entire PostgreSQL pod ## Recap of General Debugging Steps @@ -588,4 +584,3 @@ kubectl get secret -n -o jsonpath='{.data}' | jq 'keys * **"NoSuchBucket"** — Verify the bucket exists and the endpoint URL is correct. * **"Connection timeout"** — Check network connectivity and firewall rules. * **"SSL certificate problem"** — For self-signed certificates, verify the CA bundle configuration. - diff --git a/web/versioned_docs/version-0.12.0/upgrades.mdx b/web/versioned_docs/version-0.15.0/upgrades.mdx similarity index 100% rename from web/versioned_docs/version-0.12.0/upgrades.mdx rename to web/versioned_docs/version-0.15.0/upgrades.mdx diff --git a/web/versioned_docs/version-0.12.0/usage.md b/web/versioned_docs/version-0.15.0/usage.md similarity index 100% rename from web/versioned_docs/version-0.12.0/usage.md rename to web/versioned_docs/version-0.15.0/usage.md diff --git a/web/versioned_docs/version-0.3.0/welcome.md b/web/versioned_docs/version-0.3.0/welcome.md deleted file mode 100644 index 7dc7115..0000000 --- a/web/versioned_docs/version-0.3.0/welcome.md +++ /dev/null @@ -1,15 +0,0 @@ ---- -sidebar_position: 1 -sidebar_label: "Welcome" ---- - -# Barman Cloud CNPG-I plugin - -**Status:** EXPERIMENTAL - -Welcome to the documentation of the [barman-cloud](https://pgbarman.org/) CNPG-I -plugin for [CloudNativePG](https://cloudnative-pg.io/). - -Documentation for version **0.3.0** of the plugin is available in the -[README](https://github.com/cloudnative-pg/plugin-barman-cloud/blob/v0.3.0/README.md) -on GitHub. diff --git a/web/versioned_docs/version-0.4.0/compression.md b/web/versioned_docs/version-0.4.0/compression.md deleted file mode 100644 index 2abbede..0000000 --- a/web/versioned_docs/version-0.4.0/compression.md +++ /dev/null @@ -1,43 +0,0 @@ ---- -sidebar_position: 80 ---- - -# Compression - - - -By default, backups and WAL files are archived **uncompressed**. However, the -Barman Cloud Plugin supports multiple compression algorithms via -`barman-cloud-backup` and `barman-cloud-wal-archive`, allowing you to optimize -for space, speed, or a balance of both. - -### Supported Compression Algorithms - -- `bzip2` -- `gzip` -- `lz4` (WAL only) -- `snappy` -- `xz` (WAL only) -- `zstd` (WAL only) - -Compression settings for base backups and WAL archives are configured -independently. For implementation details, refer to the corresponding API -definitions: - -- [`DataBackupConfiguration`](https://pkg.go.dev/github.com/cloudnative-pg/barman-cloud/pkg/api#DataBackupConfiguration) -- [`WALBackupConfiguration`](https://pkg.go.dev/github.com/cloudnative-pg/barman-cloud/pkg/api#WalBackupConfiguration) - -:::important -Compression impacts both performance and storage efficiency. Choose the right -algorithm based on your recovery time objectives (RTO), storage capacity, and -network throughput. -::: - -## Compression Benchmark (on MinIO) - -| Compression | Backup Time (ms) | Restore Time (ms) | Uncompressed Size (MB) | Compressed Size (MB) | Ratio | -| ----------- | ---------------- | ----------------- | ---------------------- | -------------------- | ----- | -| None | 10,927 | 7,553 | 395 | 395 | 1.0:1 | -| bzip2 | 25,404 | 13,886 | 395 | 67 | 5.9:1 | -| gzip | 116,281 | 3,077 | 395 | 91 | 4.3:1 | -| snappy | 8,134 | 8,341 | 395 | 166 | 2.4:1 | diff --git a/web/versioned_docs/version-0.4.0/concepts.md b/web/versioned_docs/version-0.4.0/concepts.md deleted file mode 100644 index 3832df3..0000000 --- a/web/versioned_docs/version-0.4.0/concepts.md +++ /dev/null @@ -1,177 +0,0 @@ ---- -sidebar_position: 10 ---- - -# Main Concepts - - - -:::important -Before proceeding, make sure to review the following sections of the -CloudNativePG documentation: - -- [**Backup**](https://cloudnative-pg.io/documentation/current/backup/) -- [**WAL Archiving**](https://cloudnative-pg.io/documentation/current/wal_archiving/) -- [**Recovery**](https://cloudnative-pg.io/documentation/current/recovery/) -::: - -The **Barman Cloud Plugin** enables **hot (online) backups** of PostgreSQL -clusters in CloudNativePG through [`barman-cloud`](https://pgbarman.org), -supporting continuous physical backups and WAL archiving to an **object -store**—without interrupting write operations. - -It also supports both **full recovery** and **Point-in-Time Recovery (PITR)** -of a PostgreSQL cluster. - -## The Object Store - -At the core is the [`ObjectStore` custom resource (CRD)](plugin-barman-cloud.v1.md#objectstorespec), -which acts as the interface between the PostgreSQL cluster and the target -object storage system. It allows you to configure: - -- **Authentication and bucket location** via the `.spec.configuration` section -- **WAL archiving** settings—such as compression type, parallelism, and - server-side encryption—under `.spec.configuration.wal` -- **Base backup options**—with similar settings for compression, concurrency, - and encryption—under `.spec.configuration.data` -- **Retention policies** to manage the life-cycle of archived WALs and backups - via `.spec.configuration.retentionPolicy` - -WAL files are archived in the `wals` directory, while base backups are stored -as **tarballs** in the `base` directory, following the -[Barman Cloud convention](https://docs.pgbarman.org/cloud/latest/usage/#object-store-layout). - -The plugin also offers advanced capabilities, including -[backup tagging](misc.md#backup-object-tagging) and -[extra options for backups and WAL archiving](misc.md#extra-options-for-backup-and-wal-archiving). - -:::tip -For details, refer to the -[API reference for the `ObjectStore` resource](plugin-barman-cloud.v1.md#objectstorespec). -::: - -## Integration with a CloudNativePG Cluster - -CloudNativePG can delegate continuous backup and recovery responsibilities to -the **Barman Cloud Plugin** by configuring the `.spec.plugins` section of a -`Cluster` resource. This setup requires a corresponding `ObjectStore` resource -to be defined. - -:::important -While it is technically possible to reuse the same `ObjectStore` for multiple -`Cluster` resources within the same namespace, it is strongly recommended to -dedicate one object store per PostgreSQL cluster to ensure data isolation and -operational clarity. -::: - -The following example demonstrates how to configure a CloudNativePG cluster -named `cluster-example` to use a previously defined `ObjectStore` (also named -`cluster-example`) in the same namespace. Setting `isWALArchiver: true` enables -WAL archiving through the plugin: - -```yaml -apiVersion: postgresql.cnpg.io/v1 -kind: Cluster -metadata: - name: cluster-example -spec: - # Other cluster settings... - plugins: - - name: barman-cloud.cloudnative-pg.io - isWALArchiver: true - parameters: - barmanObjectName: cluster-example -``` - -## Backup of a Postgres Cluster - -Once the object store is defined and the `Cluster` is configured to use the -Barman Cloud Plugin, **WAL archiving is activated immediately** on the -PostgreSQL primary. - -Physical base backups are seamlessly managed by CloudNativePG using the -`Backup` and `ScheduledBackup` resources, respectively for -[on-demand](https://cloudnative-pg.io/documentation/current/backup/#on-demand-backups) -and -[scheduled](https://cloudnative-pg.io/documentation/current/backup/#scheduled-backups) -backups. - -To use the Barman Cloud Plugin, you must set the `method` to `plugin` and -configure the `pluginConfiguration` section as shown: - -```yaml -[...] -spec: - method: plugin - pluginConfiguration: - name: barman-cloud.cloudnative-pg.io - [...] -``` - -With this configuration, CloudNativePG supports: - -- Backups from both **primary** and **standby** instances -- Backups from **designated primaries** in a distributed topology using - [replica clusters](https://cloudnative-pg.io/documentation/current/replica_cluster/) - -:::tip -For details on how to back up from a standby, refer to the official documentation: -[Backup from a standby](https://cloudnative-pg.io/documentation/current/backup/#backup-from-a-standby). -::: - -:::important -Both backup and WAL archiving operations are executed by sidecar containers -running in the same pod as the PostgreSQL `Cluster` primary instance—except -when backups are taken from a standby, in which case the sidecar runs alongside -the standby pod. -The sidecar containers use a [dedicated container image](images.md) that -includes only the supported version of Barman Cloud. -::: - -## Recovery of a Postgres Cluster - -In PostgreSQL, *recovery* refers to the process of starting a database instance -from an existing backup. The Barman Cloud Plugin integrates with CloudNativePG -to support both **full recovery** and **Point-in-Time Recovery (PITR)** from an -object store. - -Recovery in this context is *not in-place*: it bootstraps a brand-new -PostgreSQL cluster from a backup and replays the necessary WAL files to reach -the desired recovery target. - -To perform a recovery, define an *external cluster* that references the -appropriate `ObjectStore`, and use it as the source in the `bootstrap` section -of the target cluster: - -```yaml -[...] -spec: - [...] - bootstrap: - recovery: - source: source - externalClusters: - - name: source - plugin: - name: barman-cloud.cloudnative-pg.io - parameters: - barmanObjectName: cluster-example - serverName: cluster-example - [...] -``` - -The critical element here is the `externalClusters` section of the `Cluster` -resource, where the `plugin` stanza instructs CloudNativePG to use the Barman -Cloud Plugin to access the object store for recovery. - -This same mechanism can be used for a variety of scenarios enabled by the -CloudNativePG API, including: - -* **Full cluster recovery** from the latest backup -* **Point-in-Time Recovery (PITR)** -* Bootstrapping **replica clusters** in a distributed topology - -:::tip -For complete instructions and advanced use cases, refer to the official -[Recovery documentation](https://cloudnative-pg.io/documentation/current/recovery/). -::: diff --git a/web/versioned_docs/version-0.4.0/images.md b/web/versioned_docs/version-0.4.0/images.md deleted file mode 100644 index f6c32d3..0000000 --- a/web/versioned_docs/version-0.4.0/images.md +++ /dev/null @@ -1,37 +0,0 @@ ---- -sidebar_position: 99 ---- - -# Container Images - - - -The Barman Cloud Plugin is distributed using two container images: - -- One for deploying the plugin components -- One for the sidecar that runs alongside each PostgreSQL instance in a - CloudNativePG `Cluster` using the plugin - -## Plugin Container Image - -The plugin image contains the logic required to operate the Barman Cloud Plugin -within your Kubernetes environment with CloudNativePG. It is published on the -GitHub Container Registry at `ghcr.io/cloudnative-pg/plugin-barman-cloud`. - -This image is built from the -[`Dockerfile.plugin`](https://github.com/cloudnative-pg/plugin-barman-cloud/blob/main/containers/Dockerfile.plugin) -in the plugin repository. - -## Sidecar Container Image - -The sidecar image is used within each PostgreSQL pod in the cluster. It -includes the latest supported version of Barman Cloud and is responsible for -performing WAL archiving and backups on behalf of CloudNativePG. - -It is available at `ghcr.io/cloudnative-pg/plugin-barman-cloud-sidecar` and is -built from the -[`Dockerfile.sidecar`](https://github.com/cloudnative-pg/plugin-barman-cloud/blob/main/containers/Dockerfile.sidecar). - -These sidecar images are designed to work seamlessly with the -[`minimal` PostgreSQL container images](https://github.com/cloudnative-pg/postgres-containers?tab=readme-ov-file#minimal-images) -maintained by the CloudNativePG Community. diff --git a/web/versioned_docs/version-0.4.0/installation.md b/web/versioned_docs/version-0.4.0/installation.md deleted file mode 100644 index 7dfa73c..0000000 --- a/web/versioned_docs/version-0.4.0/installation.md +++ /dev/null @@ -1,117 +0,0 @@ ---- -sidebar_position: 20 ---- - -# Installation - - - -:::important -1. The plugin **must** be installed in the same namespace as the CloudNativePG - operator (typically `cnpg-system`). - -2. Keep in mind that the operator's **listening namespaces** may differ from its - installation namespace. Double-check this to avoid configuration issues. -::: - -## Verifying the Requirements - -Before installing the plugin, make sure the [requirements](intro.md#requirements) are met. - -### CloudNativePG Version - -Ensure you're running a version of CloudNativePG that is compatible with the -plugin. If installed in the default `cnpg-system` namespace, you can verify the -version with: - -```sh -kubectl get deployment -n cnpg-system cnpg-controller-manager -o yaml \ - | grep ghcr.io/cloudnative-pg/cloudnative-pg -``` - -Example output: - -```output -image: ghcr.io/cloudnative-pg/cloudnative-pg:1.26.0 -``` - -The version **must be 1.26 or newer**. - -### cert-manager - -Use the [cmctl](https://cert-manager.io/docs/reference/cmctl/#installation) -tool to confirm that `cert-manager` is installed and available: - -```sh -cmctl check api -``` - -Example output: - -```output -The cert-manager API is ready -``` - -Both checks are required before proceeding with the installation. - -## Installing the Barman Cloud Plugin - -Install the plugin using `kubectl` by applying the manifest for the latest -release: - - - -```sh -kubectl apply -f \ - https://github.com/cloudnative-pg/plugin-barman-cloud/releases/download/v0.4.0/manifest.yaml -``` - - - -Example output: - -```output -customresourcedefinition.apiextensions.k8s.io/objectstores.barmancloud.cnpg.io created -serviceaccount/plugin-barman-cloud created -role.rbac.authorization.k8s.io/leader-election-role created -clusterrole.rbac.authorization.k8s.io/metrics-auth-role created -clusterrole.rbac.authorization.k8s.io/metrics-reader created -clusterrole.rbac.authorization.k8s.io/objectstore-editor-role created -clusterrole.rbac.authorization.k8s.io/objectstore-viewer-role created -clusterrole.rbac.authorization.k8s.io/plugin-barman-cloud created -rolebinding.rbac.authorization.k8s.io/leader-election-rolebinding created -clusterrolebinding.rbac.authorization.k8s.io/metrics-auth-rolebinding created -clusterrolebinding.rbac.authorization.k8s.io/plugin-barman-cloud-binding created -secret/plugin-barman-cloud-8tfddg42gf created -service/barman-cloud created -deployment.apps/barman-cloud configured -certificate.cert-manager.io/barman-cloud-client created -certificate.cert-manager.io/barman-cloud-server created -issuer.cert-manager.io/selfsigned-issuer created -``` - -Finally, check that the deployment is up and running: - -```sh -kubectl rollout status deployment \ - -n cnpg-system barman-cloud -``` - -Example output: - -```output -deployment "barman-cloud" successfully rolled out -``` - -This confirms that the plugin is deployed and ready to use. - -## Testing the latest development snapshot - -You can also test the latest development snapshot of the plugin with the -following command: - -```sh -kubectl apply -f \ - https://raw.githubusercontent.com/cloudnative-pg/plugin-barman-cloud/refs/heads/main/manifest.yaml -``` - diff --git a/web/versioned_docs/version-0.4.0/intro.md b/web/versioned_docs/version-0.4.0/intro.md deleted file mode 100644 index f22f383..0000000 --- a/web/versioned_docs/version-0.4.0/intro.md +++ /dev/null @@ -1,67 +0,0 @@ ---- -sidebar_position: 1 -sidebar_label: "Introduction" ---- - -# Barman Cloud Plugin - - - -The **Barman Cloud Plugin** for [CloudNativePG](https://cloudnative-pg.io/) -enables online continuous physical backups of PostgreSQL clusters to object storage -using the `barman-cloud` suite from the [Barman](https://docs.pgbarman.org/release/latest/) -project. - -:::important -If you plan to migrate your existing CloudNativePG cluster to the new -plugin-based approach using the Barman Cloud Plugin, see -["Migrating from Built-in CloudNativePG Backup"](migration.md) -for detailed instructions. -::: - -## Requirements - -To use the Barman Cloud Plugin, you need: - -- [CloudNativePG](https://cloudnative-pg.io) version **1.26** -- [cert-manager](https://cert-manager.io/) to enable TLS communication between - the plugin and the operator - -## Key Features - -This plugin provides the following capabilities: - -- Physical online backup of the data directory -- Physical restore of the data directory -- Write-Ahead Log (WAL) archiving -- WAL restore -- Full cluster recovery -- Point-in-Time Recovery (PITR) -- Seamless integration with replica clusters for bootstrap and WAL restore from archive - -:::important -The Barman Cloud Plugin is designed to **replace the in-tree object storage support** -previously provided via the `.spec.backup.barmanObjectStore` section in the -`Cluster` resource. -Backups created using the in-tree approach are fully supported and compatible -with this plugin. -::: - -## Supported Object Storage Providers - -The plugin works with all storage backends supported by `barman-cloud`, including: - -- **Amazon S3** -- **Google Cloud Storage** -- **Microsoft Azure Blob Storage** - -In addition, the following S3-compatible and simulator solutions have been -tested and verified: - -- [MinIO](https://min.io/) – An S3-compatible storage solution -- [Azurite](https://github.com/Azure/Azurite) – A simulator for Azure Blob Storage -- [fake-gcs-server](https://github.com/fsouza/fake-gcs-server) – A simulator for Google Cloud Storage - -:::tip -For more details, refer to [Object Store Providers](object_stores.md). -::: diff --git a/web/versioned_docs/version-0.4.0/migration.md b/web/versioned_docs/version-0.4.0/migration.md deleted file mode 100644 index 3c4ba98..0000000 --- a/web/versioned_docs/version-0.4.0/migration.md +++ /dev/null @@ -1,259 +0,0 @@ ---- -sidebar_position: 40 ---- - -# Migrating from Built-in CloudNativePG Backup - - - -The in-tree support for Barman Cloud in CloudNativePG is **deprecated starting -from version 1.26** and will be removed in a future release. - -If you're currently relying on the built-in Barman Cloud integration, you can -migrate seamlessly to the new **plugin-based architecture** using the Barman -Cloud Plugin, with **no downtime**. Follow these steps: - -- [Install the Barman Cloud Plugin](installation.md) -- Create an `ObjectStore` resource by translating the contents of the - `.spec.backup.barmanObjectStore` section from your existing `Cluster` - definition -- Modify the `Cluster` resource in a single atomic change to switch from - in-tree backup to the plugin -- Update any `ScheduledBackup` resources to use the plugin -- Update the `externalClusters` configuration, where applicable - -:::tip -For a working example, refer to [this commit](https://github.com/cloudnative-pg/cnpg-playground/commit/596f30e252896edf8f734991c3538df87630f6f7) -from the [CloudNativePG Playground project](https://github.com/cloudnative-pg/cnpg-playground), -which demonstrates a full migration. -::: - ---- - -## Step 1: Define the `ObjectStore` - -Begin by creating an `ObjectStore` resource in the same namespace as your -PostgreSQL `Cluster`. - -There is a **direct mapping** between the `.spec.backup.barmanObjectStore` -section in CloudNativePG and the `.spec.configuration` field in the -`ObjectStore` CR. The conversion is mostly mechanical, with one key difference: - -:::warning -In the plugin architecture, retention policies are defined as part of the `ObjectStore`. -In contrast, the in-tree implementation defined them at the `Cluster` level. -::: - -If your `Cluster` used `.spec.backup.retentionPolicy`, move that configuration -to `.spec.retentionPolicy` in the `ObjectStore`. - ---- - -### Example - -Here’s an excerpt from a traditional in-tree CloudNativePG backup configuration -taken from the CloudNativePG Playground project: - -```yaml -apiVersion: postgresql.cnpg.io/v1 -kind: Cluster -metadata: - name: pg-eu -spec: - # [...] - backup: - barmanObjectStore: - destinationPath: s3://backups/ - endpointURL: http://minio-eu:9000 - s3Credentials: - accessKeyId: - name: minio-eu - key: ACCESS_KEY_ID - secretAccessKey: - name: minio-eu - key: ACCESS_SECRET_KEY - wal: - compression: gzip -``` - -This configuration translates to the following `ObjectStore` resource for the -plugin: - -```yaml -apiVersion: barmancloud.cnpg.io/v1 -kind: ObjectStore -metadata: - name: minio-eu -spec: - configuration: - destinationPath: s3://backups/ - endpointURL: http://minio-eu:9000 - s3Credentials: - accessKeyId: - name: minio-eu - key: ACCESS_KEY_ID - secretAccessKey: - name: minio-eu - key: ACCESS_SECRET_KEY - wal: - compression: gzip -``` - -As you can see, the contents of `barmanObjectStore` have been copied directly -under the `configuration` field of the `ObjectStore` resource, using the same -secret references. - -## Step 2: Update the `Cluster` for plugin WAL archiving - -Once the `ObjectStore` resource is in place, update the `Cluster` resource as -follows in a single atomic change: - -- Remove the `.spec.backup.barmanObjectStore` section -- Remove `.spec.backup.retentionPolicy` if it was defined (as it is now in the - `ObjectStore`) -- Remove the entire `spec.backup` section if it is now empty -- Add `barman-cloud.cloudnative-pg.io` to the `plugins` list, as described in - [Configuring WAL archiving](usage.md#configuring-wal-archiving) - -This will trigger a rolling update of the `Cluster`, switching continuous -backup from the in-tree implementation to the plugin-based approach. - -### Example - -The updated `pg-eu` cluster will have this configuration instead of the -previous `backup` section: - -```yaml - plugins: - - name: barman-cloud.cloudnative-pg.io - isWALArchiver: true - parameters: - barmanObjectName: minio-eu -``` - ---- - -## Step 3: Update the `ScheduledBackup` - -After switching the `Cluster` to use the plugin, update your `ScheduledBackup` -resources to match. - -Set the backup `method` to `plugin` and reference the plugin name via -`pluginConfiguration`, as shown in ["Performing a base backup"](usage.md#performing-a-base-backup). - -### Example - -Original in-tree `ScheduledBackup`: - -```yaml -apiVersion: postgresql.cnpg.io/v1 -kind: ScheduledBackup -metadata: - name: pg-eu-backup -spec: - cluster: - name: pg-eu - schedule: '0 0 0 * * *' - backupOwnerReference: self -``` - -Updated version using the plugin: - -```yaml -apiVersion: postgresql.cnpg.io/v1 -kind: ScheduledBackup -metadata: - name: pg-eu-backup -spec: - cluster: - name: pg-eu - schedule: '0 0 0 * * *' - backupOwnerReference: self - method: plugin - pluginConfiguration: - name: barman-cloud.cloudnative-pg.io -``` - ---- - -## Step 4: Update the `externalClusters` configuration - -If your `Cluster` relies on one or more external clusters that use the in-tree -Barman Cloud integration, you need to update those configurations to use the -plugin-based architecture. - -When a replica cluster fetches WAL files or base backups from an external -source that used the built-in backup method, follow these steps: - -1. Create a corresponding `ObjectStore` resource for the external cluster, as - shown in [Step 1](#step-1-define-the-objectstore) -2. Update the `externalClusters` section of your replica cluster to use the - plugin instead of the in-tree `barmanObjectStore` field - -### Example - -Consider the original configuration using in-tree Barman Cloud: - -```yaml -apiVersion: postgresql.cnpg.io/v1 -kind: Cluster -metadata: - name: pg-us -spec: - # [...] - externalClusters: - - name: pg-eu - barmanObjectStore: - destinationPath: s3://backups/ - endpointURL: http://minio-eu:9000 - serverName: pg-eu - s3Credentials: - accessKeyId: - name: minio-eu - key: ACCESS_KEY_ID - secretAccessKey: - name: minio-eu - key: ACCESS_SECRET_KEY - wal: - compression: gzip -``` - -Create the `ObjectStore` resource for the external cluster: - -```yaml -apiVersion: barmancloud.cnpg.io/v1 -kind: ObjectStore -metadata: - name: minio-eu -spec: - configuration: - destinationPath: s3://backups/ - endpointURL: http://minio-eu:9000 - s3Credentials: - accessKeyId: - name: minio-eu - key: ACCESS_KEY_ID - secretAccessKey: - name: minio-eu - key: ACCESS_SECRET_KEY - wal: - compression: gzip -``` - -Update the external cluster configuration to use the plugin: - -```yaml -apiVersion: postgresql.cnpg.io/v1 -kind: Cluster -metadata: - name: pg-us -spec: - # [...] - externalClusters: - - name: pg-eu - plugin: - name: barman-cloud.cloudnative-pg.io - parameters: - barmanObjectName: minio-eu - serverName: pg-eu -``` diff --git a/web/versioned_docs/version-0.4.0/misc.md b/web/versioned_docs/version-0.4.0/misc.md deleted file mode 100644 index 4d3cefc..0000000 --- a/web/versioned_docs/version-0.4.0/misc.md +++ /dev/null @@ -1,76 +0,0 @@ ---- -sidebar_position: 90 ---- - -# Miscellaneous - - - -## Backup Object Tagging - -You can attach key-value metadata tags to backup artifacts—such as base -backups, WAL files, and history files—via the `.spec.configuration` section of -the `ObjectStore` resource. - -- `tags`: applied to base backups and WAL files -- `historyTags`: applied to history files only - -### Example - -```yaml -apiVersion: barmancloud.cnpg.io/v1 -kind: ObjectStore -metadata: - name: my-store -spec: - configuration: - [...] - tags: - backupRetentionPolicy: "expire" - historyTags: - backupRetentionPolicy: "keep" - [...] -``` - -## Extra Options for Backup and WAL Archiving - -You can pass additional command-line arguments to `barman-cloud-backup` and -`barman-cloud-wal-archive` using the `additionalCommandArgs` field in the -`ObjectStore` configuration. - -- `.spec.configuration.data.additionalCommandArgs`: for `barman-cloud-backup` -- `.spec.configuration.wal.additionalCommandArgs`: for `barman-cloud-wal-archive` - -Each field accepts a list of string arguments. If an argument is already -configured elsewhere in the plugin, the duplicate will be ignored. - -### Example: Extra Backup Options - -```yaml -kind: ObjectStore -metadata: - name: my-store -spec: - configuration: - data: - additionalCommandArgs: - - "--min-chunk-size=5MB" - - "--read-timeout=60" -``` - -### Example: Extra WAL Archive Options - -```yaml -kind: ObjectStore -metadata: - name: my-store -spec: - configuration: - wal: - additionalCommandArgs: - - "--max-concurrency=1" - - "--read-timeout=60" -``` - -For a complete list of supported options, refer to the -[official Barman Cloud documentation](https://docs.pgbarman.org/release/latest/). diff --git a/web/versioned_docs/version-0.4.0/object_stores.md b/web/versioned_docs/version-0.4.0/object_stores.md deleted file mode 100644 index 29e7b35..0000000 --- a/web/versioned_docs/version-0.4.0/object_stores.md +++ /dev/null @@ -1,465 +0,0 @@ ---- -sidebar_position: 50 ---- - -# Object Store Providers - - - -The Barman Cloud Plugin enables the storage of PostgreSQL cluster backup files -in any object storage service supported by the -[Barman Cloud infrastructure](https://docs.pgbarman.org/release/latest/). - -Currently, Barman Cloud supports the following providers: - -- [Amazon S3](#aws-s3) -- [Microsoft Azure Blob Storage](#azure-blob-storage) -- [Google Cloud Storage](#google-cloud-storage) - -You may also use any S3- or Azure-compatible implementation of the above -services. - -To configure object storage with Barman Cloud, you must define an -[`ObjectStore` object](plugin-barman-cloud.v1.md#objectstore), which -establishes the connection between your PostgreSQL cluster and the object -storage backend. - -Configuration details — particularly around authentication — will vary depending on -the specific object storage provider you are using. - -The following sections detail the setup for each. - ---- - -## AWS S3 - -[AWS Simple Storage Service (S3)](https://aws.amazon.com/s3/) is one of the -most widely adopted object storage solutions. - -The Barman Cloud plugin for CloudNativePG integrates with S3 through two -primary authentication mechanisms: - -- [IAM Roles for Service Accounts (IRSA)](https://docs.aws.amazon.com/eks/latest/userguide/iam-roles-for-service-accounts.html) — - recommended for clusters running on EKS -- Access keys — using `ACCESS_KEY_ID` and `ACCESS_SECRET_KEY` credentials - -### Access Keys - -To authenticate using access keys, you’ll need: - -- `ACCESS_KEY_ID`: the public key used to authenticate to S3 -- `ACCESS_SECRET_KEY`: the corresponding secret key -- `ACCESS_SESSION_TOKEN`: (optional) a temporary session token, if required - -These credentials must be stored securely in a Kubernetes secret: - -```sh -kubectl create secret generic aws-creds \ - --from-literal=ACCESS_KEY_ID= \ - --from-literal=ACCESS_SECRET_KEY= -# --from-literal=ACCESS_SESSION_TOKEN= # if required -``` - -The credentials will be encrypted at rest if your Kubernetes environment -supports it. - -You can then reference the secret in your `ObjectStore` definition: - -```yaml -apiVersion: barmancloud.cnpg.io/v1 -kind: ObjectStore -metadata: - name: aws-store -spec: - configuration: - destinationPath: "s3://BUCKET_NAME/path/to/folder" - s3Credentials: - accessKeyId: - name: aws-creds - key: ACCESS_KEY_ID - secretAccessKey: - name: aws-creds - key: ACCESS_SECRET_KEY - [...] -``` - -### IAM Role for Service Account (IRSA) - -To use IRSA with EKS, configure the service account of the PostgreSQL cluster -with the appropriate annotation: - -```yaml -apiVersion: postgresql.cnpg.io/v1 -kind: Cluster -metadata: - [...] -spec: - serviceAccountTemplate: - metadata: - annotations: - eks.amazonaws.com/role-arn: arn:[...] - [...] -``` - -### S3 Lifecycle Policy - -Barman Cloud uploads backup files to S3 but does not modify them afterward. -To enhance data durability and protect against accidental or malicious loss, -it's recommended to implement the following best practices: - -- Enable object versioning -- Enable object locking to prevent objects from being deleted or overwritten - for a defined period or indefinitely (this provides an additional layer of - protection against accidental deletion and ransomware attacks) -- Set lifecycle rules to expire current versions a few days after your Barman - retention window -- Expire non-current versions after a longer period - -These strategies help you safeguard backups without requiring broad delete -permissions, ensuring both security and compliance with minimal operational -overhead. - - -### S3-Compatible Storage Providers - -You can use S3-compatible services like **MinIO**, **Linode (Akamai) Object Storage**, -or **DigitalOcean Spaces** by specifying a custom `endpointURL`. - -Example with Linode (Akamai) Object Storage (`us-east1`): - -```yaml -apiVersion: barmancloud.cnpg.io/v1 -kind: ObjectStore -metadata: - name: linode-store -spec: - configuration: - destinationPath: "s3://BUCKET_NAME/" - endpointURL: "https://us-east1.linodeobjects.com" - s3Credentials: - [...] - [...] -``` - -Example with DigitalOcean Spaces (SFO3, path-style): - -```yaml -apiVersion: barmancloud.cnpg.io/v1 -kind: ObjectStore -metadata: - name: digitalocean-store -spec: - configuration: - destinationPath: "s3://BUCKET_NAME/path/to/folder" - endpointURL: "https://sfo3.digitaloceanspaces.com" - s3Credentials: - [...] - [...] -``` - -### Using Object Storage with a Private CA - -For object storage services (e.g., MinIO) that use HTTPS with certificates -signed by a private CA, set the `endpointCA` field in the `ObjectStore` -definition. Unless you already have it, create a Kubernetes `Secret` with the -CA bundle: - -```sh -kubectl create secret generic my-ca-secret --from-file=ca.crt -``` - -Then reference it: - -```yaml -apiVersion: barmancloud.cnpg.io/v1 -kind: ObjectStore -metadata: - name: minio-store -spec: - configuration: - endpointURL: - endpointCA: - name: my-ca-secret - key: ca.crt - [...] -``` - - -:::note -If you want `ConfigMaps` and `Secrets` to be **automatically** reloaded by -instances, you can add a label with the key `cnpg.io/reload` to the -`Secrets`/`ConfigMaps`. Otherwise, you will have to reload the instances using the -`kubectl cnpg reload` subcommand. -::: - ---- - -## Azure Blob Storage - -[Azure Blob Storage](https://azure.microsoft.com/en-us/services/storage/blobs/) -is Microsoft’s cloud-based object storage solution. - -Barman Cloud supports the following authentication methods: - -- [Connection String](https://learn.microsoft.com/en-us/azure/storage/common/storage-configure-connection-string) -- Storage Account Name + [Access Key](https://learn.microsoft.com/en-us/azure/storage/common/storage-account-keys-manage) -- Storage Account Name + [SAS Token](https://learn.microsoft.com/en-us/azure/storage/blobs/sas-service-create) -- [Azure AD Workload Identity](https://azure.github.io/azure-workload-identity/docs/introduction.html) - -### Azure AD Workload Identity - -This method avoids storing credentials in Kubernetes via the -`.spec.configuration.inheritFromAzureAD` option: - -```yaml -apiVersion: barmancloud.cnpg.io/v1 -kind: ObjectStore -metadata: - name: azure-store -spec: - configuration: - destinationPath: "" - azureCredentials: - inheritFromAzureAD: true - [...] -``` - -### Access Key, SAS Token, or Connection String - -Store credentials in a Kubernetes secret: - -```sh -kubectl create secret generic azure-creds \ - --from-literal=AZURE_STORAGE_ACCOUNT= \ - --from-literal=AZURE_STORAGE_KEY= \ - --from-literal=AZURE_STORAGE_SAS_TOKEN= \ - --from-literal=AZURE_STORAGE_CONNECTION_STRING= -``` - -Then reference the required keys in your `ObjectStore`: - -```yaml -apiVersion: barmancloud.cnpg.io/v1 -kind: ObjectStore -metadata: - name: azure-store -spec: - configuration: - destinationPath: "" - azureCredentials: - connectionString: - name: azure-creds - key: AZURE_CONNECTION_STRING - storageAccount: - name: azure-creds - key: AZURE_STORAGE_ACCOUNT - storageKey: - name: azure-creds - key: AZURE_STORAGE_KEY - storageSasToken: - name: azure-creds - key: AZURE_STORAGE_SAS_TOKEN - [...] -``` - -For Azure Blob, the destination path format is: - -``` -://..core.windows.net// -``` - -### Azure-Compatible Providers - -If you're using a different implementation (e.g., Azurite or emulator): - -``` -://:/// -``` - ---- - -## Google Cloud Storage - -[Google Cloud Storage](https://cloud.google.com/storage/) is supported with two -authentication modes: - -- **GKE Workload Identity** (recommended inside Google Kubernetes Engine) -- **Service Account JSON key** via the `GOOGLE_APPLICATION_CREDENTIALS` environment variable - -### GKE Workload Identity - -Use the [Workload Identity authentication](https://cloud.google.com/kubernetes-engine/docs/how-to/workload-identity) -when running in GKE: - -1. Set `googleCredentials.gkeEnvironment` to `true` in the `ObjectStore` - resource -2. Annotate the `serviceAccountTemplate` in the `Cluster` resource with the GCP - service account - -For example, in the `ObjectStore` resource: - -```yaml -apiVersion: barmancloud.cnpg.io/v1 -kind: ObjectStore -metadata: - name: google-store -spec: - configuration: - destinationPath: "gs:///" - googleCredentials: - gkeEnvironment: true -``` - -And in the `Cluster` resource: - -```yaml -apiVersion: postgresql.cnpg.io/v1 -kind: Cluster -spec: - serviceAccountTemplate: - metadata: - annotations: - iam.gke.io/gcp-service-account: [...].iam.gserviceaccount.com -``` - -### Service Account JSON Key - -Follow Google’s [authentication setup](https://cloud.google.com/docs/authentication/getting-started), -then: - -```sh -kubectl create secret generic backup-creds --from-file=gcsCredentials=gcs_credentials_file.json -``` - -```yaml -apiVersion: barmancloud.cnpg.io/v1 -kind: ObjectStore -metadata: - name: google-store -spec: - configuration: - destinationPath: "gs:///" - googleCredentials: - applicationCredentials: - name: backup-creds - key: gcsCredentials - [...] -``` - -:::important -This authentication method generates a JSON file within the container -with all the credentials required to access your Google Cloud Storage -bucket. As a result, if someone gains access to the `Pod`, they will also have -write permissions to the bucket. -::: - ---- - - -## MinIO Gateway - -MinIO Gateway can proxy requests to cloud object storage providers like S3 or GCS. -For more information, refer to [MinIO official documentation](https://docs.min.io/). - -### Setup - -Create MinIO access credentials: - -```sh -kubectl create secret generic minio-creds \ - --from-literal=MINIO_ACCESS_KEY= \ - --from-literal=MINIO_SECRET_KEY= -``` - -:::note -Cloud Object Storage credentials will be used only by MinIO Gateway in this -case. -::: - -Expose MinIO Gateway via `ClusterIP`: - -```yaml -apiVersion: v1 -kind: Service -metadata: - name: minio-gateway-service -spec: - type: ClusterIP - ports: - - port: 9000 - targetPort: 9000 - protocol: TCP - selector: - app: minio -``` - -Here follows an excerpt of an example of deployment relaying to S3: - -```yaml -apiVersion: apps/v1 -kind: Deployment -[...] -spec: - containers: - - name: minio - image: minio/minio:RELEASE.2020-06-03T22-13-49Z - args: ["gateway", "s3"] - ports: - - containerPort: 9000 - env: - - name: MINIO_ACCESS_KEY - valueFrom: - secretKeyRef: - name: minio-creds - key: MINIO_ACCESS_KEY - - name: MINIO_SECRET_KEY - valueFrom: - secretKeyRef: - name: minio-creds - key: MINIO_SECRET_KEY - - name: AWS_ACCESS_KEY_ID - valueFrom: - secretKeyRef: - name: aws-creds - key: ACCESS_KEY_ID - - name: AWS_SECRET_ACCESS_KEY - valueFrom: - secretKeyRef: - name: aws-creds - key: ACCESS_SECRET_KEY -# Uncomment the below section if session token is required -# - name: AWS_SESSION_TOKEN -# valueFrom: -# secretKeyRef: -# name: aws-creds -# key: ACCESS_SESSION_TOKEN -``` - -Proceed by configuring MinIO Gateway service as the `endpointURL` in the -`ObjectStore` definition, then choose a bucket name to replace `BUCKET_NAME`: - -```yaml -apiVersion: barmancloud.cnpg.io/v1 -kind: ObjectStore -metadata: - name: minio-store -spec: - configuration: - destinationPath: s3://BUCKET_NAME/ - endpointURL: http://minio-gateway-service:9000 - s3Credentials: - accessKeyId: - name: minio-creds - key: MINIO_ACCESS_KEY - secretAccessKey: - name: minio-creds - key: MINIO_SECRET_KEY - [...] -``` - -:::important -Verify on `s3://BUCKET_NAME/` the presence of archived WAL files before -proceeding with a backup. -::: - ---- diff --git a/web/versioned_docs/version-0.4.0/parameters.md b/web/versioned_docs/version-0.4.0/parameters.md deleted file mode 100644 index ca0cd2b..0000000 --- a/web/versioned_docs/version-0.4.0/parameters.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -sidebar_position: 100 ---- - -# Parameters - - - -The following parameters are available for the Barman Cloud Plugin: - -- `barmanObjectName`: references the `ObjectStore` resource to be used by the - plugin. -- `serverName`: Specifies the server name in the object store. - -:::important -The `serverName` parameter in the `ObjectStore` resource is retained solely for -API compatibility with the in-tree `barmanObjectStore` and must always be left empty. -When needed, use the `serverName` plugin parameter in the Cluster configuration instead. -::: diff --git a/web/versioned_docs/version-0.4.0/plugin-barman-cloud.v1.md b/web/versioned_docs/version-0.4.0/plugin-barman-cloud.v1.md deleted file mode 100644 index 552dc27..0000000 --- a/web/versioned_docs/version-0.4.0/plugin-barman-cloud.v1.md +++ /dev/null @@ -1,105 +0,0 @@ -# API Reference - -## Packages -- [barmancloud.cnpg.io/v1](#barmancloudcnpgiov1) - - -## barmancloud.cnpg.io/v1 - -Package v1 contains API Schema definitions for the barmancloud v1 API group - -### Resource Types -- [ObjectStore](#objectstore) - - - -#### InstanceSidecarConfiguration - - - -InstanceSidecarConfiguration defines the configuration for the sidecar that runs in the instance pods. - - - -_Appears in:_ -- [ObjectStoreSpec](#objectstorespec) - -| Field | Description | Required | Default | Validation | -| --- | --- | --- | --- | --- | -| `env` _[EnvVar](https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.32/#envvar-v1-core) array_ | The environment to be explicitly passed to the sidecar | | | | -| `retentionPolicyIntervalSeconds` _integer_ | The retentionCheckInterval defines the frequency at which the
system checks and enforces retention policies. | | 1800 | | -| `resources` _[ResourceRequirements](https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.32/#resourcerequirements-v1-core)_ | Resources define cpu/memory requests and limits for the sidecar that runs in the instance pods. | | | | - - -#### ObjectStore - - - -ObjectStore is the Schema for the objectstores API. - - - - - -| Field | Description | Required | Default | Validation | -| --- | --- | --- | --- | --- | -| `apiVersion` _string_ | `barmancloud.cnpg.io/v1` | True | | | -| `kind` _string_ | `ObjectStore` | True | | | -| `metadata` _[ObjectMeta](https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.32/#objectmeta-v1-meta)_ | Refer to Kubernetes API documentation for fields of `metadata`. | True | | | -| `spec` _[ObjectStoreSpec](#objectstorespec)_ | Specification of the desired behavior of the ObjectStore.
More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#spec-and-status | True | | | -| `status` _[ObjectStoreStatus](#objectstorestatus)_ | Most recently observed status of the ObjectStore. This data may not be up to
date. Populated by the system. Read-only.
More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#spec-and-status | | | | - - -#### ObjectStoreSpec - - - -ObjectStoreSpec defines the desired state of ObjectStore. - - - -_Appears in:_ -- [ObjectStore](#objectstore) - -| Field | Description | Required | Default | Validation | -| --- | --- | --- | --- | --- | -| `configuration` _[BarmanObjectStoreConfiguration](https://pkg.go.dev/github.com/cloudnative-pg/barman-cloud/pkg/api#BarmanObjectStoreConfiguration)_ | The configuration for the barman-cloud tool suite | True | | | -| `retentionPolicy` _string_ | RetentionPolicy is the retention policy to be used for backups
and WALs (i.e. '60d'). The retention policy is expressed in the form
of `XXu` where `XX` is a positive integer and `u` is in `[dwm]` -
days, weeks, months. | | | Pattern: `^[1-9][0-9]*[dwm]$`
| -| `instanceSidecarConfiguration` _[InstanceSidecarConfiguration](#instancesidecarconfiguration)_ | The configuration for the sidecar that runs in the instance pods | | | | - - -#### ObjectStoreStatus - - - -ObjectStoreStatus defines the observed state of ObjectStore. - - - -_Appears in:_ -- [ObjectStore](#objectstore) - -| Field | Description | Required | Default | Validation | -| --- | --- | --- | --- | --- | -| `serverRecoveryWindow` _object (keys:string, values:[RecoveryWindow](#recoverywindow))_ | ServerRecoveryWindow maps each server to its recovery window | True | | | - - -#### RecoveryWindow - - - -RecoveryWindow represents the time span between the first -recoverability point and the last successful backup of a PostgreSQL -server, defining the period during which data can be restored. - - - -_Appears in:_ -- [ObjectStoreStatus](#objectstorestatus) - -| Field | Description | Required | Default | Validation | -| --- | --- | --- | --- | --- | -| `firstRecoverabilityPoint` _[Time](https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.32/#time-v1-meta)_ | The first recoverability point in a PostgreSQL server refers to
the earliest point in time to which the database can be
restored. | True | | | -| `lastSuccussfulBackupTime` _[Time](https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.32/#time-v1-meta)_ | The last successful backup time | True | | | - - diff --git a/web/versioned_docs/version-0.4.0/retention.md b/web/versioned_docs/version-0.4.0/retention.md deleted file mode 100644 index fefbd08..0000000 --- a/web/versioned_docs/version-0.4.0/retention.md +++ /dev/null @@ -1,38 +0,0 @@ ---- -sidebar_position: 60 ---- - -# Retention Policies - - - -The Barman Cloud Plugin supports **automated cleanup of obsolete backups** via -retention policies, configured in the `.spec.retentionPolicy` field of the -`ObjectStore` resource. - -:::note -This feature uses the `barman-cloud-backup-delete` command with the -`--retention-policy "RECOVERY WINDOW OF {{ value }} {{ unit }}"` syntax. -::: - -#### Example: 30-Day Retention Policy - -```yaml -apiVersion: barmancloud.cnpg.io/v1 -kind: ObjectStore -metadata: - name: my-store -spec: - [...] - retentionPolicy: "30d" -```` - -:::note -A **recovery window retention policy** ensures the cluster can be restored to -any point in time between the calculated *Point of Recoverability* (PoR) and -the latest WAL archive. The PoR is defined as `current time - recovery window`. -The **first valid backup** is the most recent backup completed before the PoR. -Backups older than that are marked as *obsolete* and deleted after the next -backup completes. -::: - diff --git a/web/versioned_docs/version-0.4.0/usage.md b/web/versioned_docs/version-0.4.0/usage.md deleted file mode 100644 index 8c9f8b7..0000000 --- a/web/versioned_docs/version-0.4.0/usage.md +++ /dev/null @@ -1,258 +0,0 @@ ---- -sidebar_position: 30 ---- - -# Using the Barman Cloud Plugin - - - -After [installing the plugin](installation.md) in the same namespace as the -CloudNativePG operator, enabling your PostgreSQL cluster to use the Barman -Cloud Plugin involves just a few steps: - -- Defining the object store containing your WAL archive and base backups, using - your preferred [provider](object_stores.md) -- Instructing the Postgres cluster to use the Barman Cloud Plugin - -From that moment, you’ll be able to issue on-demand backups or define a backup -schedule, as well as rely on the object store for recovery operations. - -The rest of this page details each step, using MinIO as object store provider. - -## Defining the `ObjectStore` - -An `ObjectStore` resource must be created for each object store used in your -PostgreSQL architecture. Here's an example configuration using MinIO: - -```yaml -apiVersion: barmancloud.cnpg.io/v1 -kind: ObjectStore -metadata: - name: minio-store -spec: - configuration: - destinationPath: s3://backups/ - endpointURL: http://minio:9000 - s3Credentials: - accessKeyId: - name: minio - key: ACCESS_KEY_ID - secretAccessKey: - name: minio - key: ACCESS_SECRET_KEY - wal: - compression: gzip -``` - -The `.spec.configuration` schema follows the same format as the -[in-tree barman-cloud support](https://pkg.go.dev/github.com/cloudnative-pg/barman-cloud/pkg/api#BarmanObjectStoreConfiguration). -Refer to [the CloudNativePG documentation](https://cloudnative-pg.io/documentation/current/appendixes/backup_barmanobjectstore/) -for additional details. - -:::important -The `serverName` parameter in the `ObjectStore` resource is retained solely for -API compatibility with the in-tree `barmanObjectStore` and must always be left empty. -When needed, use the `serverName` plugin parameter in the Cluster configuration instead. -::: - -## Configuring WAL Archiving - -Once the `ObjectStore` is defined, you can configure your PostgreSQL cluster -to archive WALs by referencing the store in the `.spec.plugins` section: - -```yaml -apiVersion: postgresql.cnpg.io/v1 -kind: Cluster -metadata: - name: cluster-example -spec: - instances: 3 - imagePullPolicy: Always - plugins: - - name: barman-cloud.cloudnative-pg.io - isWALArchiver: true - parameters: - barmanObjectName: minio-store - storage: - size: 1Gi -``` - -This configuration enables both WAL archiving and data directory backups. - -## Performing a Base Backup - -Once WAL archiving is enabled, the cluster is ready for backups. To issue an -on-demand backup, use the following configuration with the plugin method: - -```yaml -apiVersion: postgresql.cnpg.io/v1 -kind: Backup -metadata: - name: backup-example -spec: - cluster: - name: cluster-example - method: plugin - pluginConfiguration: - name: barman-cloud.cloudnative-pg.io -``` - -:::note -You can apply the same concept to the `ScheduledBackup` resource. -::: - -## Restoring a Cluster - -To restore a cluster from an object store, create a new `Cluster` resource that -references the store containing the backup. Below is an example configuration: - -```yaml -apiVersion: postgresql.cnpg.io/v1 -kind: Cluster -metadata: - name: cluster-restore -spec: - instances: 3 - imagePullPolicy: IfNotPresent - bootstrap: - recovery: - source: source - externalClusters: - - name: source - plugin: - name: barman-cloud.cloudnative-pg.io - parameters: - barmanObjectName: minio-store - serverName: cluster-example - storage: - size: 1Gi -``` - -:::important -The above configuration does **not** enable WAL archiving for the restored cluster. -::: - -To enable WAL archiving for the restored cluster, include the `.spec.plugins` -section alongside the `externalClusters.plugin` section, as shown below: - -```yaml -apiVersion: postgresql.cnpg.io/v1 -kind: Cluster -metadata: - name: cluster-restore -spec: - instances: 3 - imagePullPolicy: IfNotPresent - bootstrap: - recovery: - source: source - plugins: - - name: barman-cloud.cloudnative-pg.io - isWALArchiver: true - parameters: - # Backup Object Store (push, read-write) - barmanObjectName: minio-store-bis - externalClusters: - - name: source - plugin: - name: barman-cloud.cloudnative-pg.io - parameters: - # Recovery Object Store (pull, read-only) - barmanObjectName: minio-store - serverName: cluster-example - storage: - size: 1Gi -``` - -The same object store may be used for both transaction log archiving and -restoring a cluster, or you can configure separate stores for these purposes. - -## Configuring Replica Clusters - -You can set up a distributed topology by combining the previously defined -configurations with the `.spec.replica` section. Below is an example of how to -define a replica cluster: - -```yaml -apiVersion: postgresql.cnpg.io/v1 -kind: Cluster -metadata: - name: cluster-dc-a -spec: - instances: 3 - primaryUpdateStrategy: unsupervised - - storage: - storageClass: csi-hostpath-sc - size: 1Gi - - plugins: - - name: barman-cloud.cloudnative-pg.io - isWALArchiver: true - parameters: - barmanObjectName: minio-store-a - - replica: - self: cluster-dc-a - primary: cluster-dc-a - source: cluster-dc-b - - externalClusters: - - name: cluster-dc-a - plugin: - name: barman-cloud.cloudnative-pg.io - parameters: - barmanObjectName: minio-store-a - - - name: cluster-dc-b - plugin: - name: barman-cloud.cloudnative-pg.io - parameters: - barmanObjectName: minio-store-b -``` - -## Configuring the plugin instance sidecar - -The Barman Cloud Plugin runs as a sidecar container next to each PostgreSQL -instance pod. It manages backup, WAL archiving, and restore processes. - -Configuration comes from multiple `ObjectStore` resources: - -1. The one referenced in the - `.spec.plugins` section of the `Cluster`. This is the - object store used for WAL archiving and base backups. -2. The one referenced in the external cluster - used in the `.spec.replica.source` section of the `Cluster`. This is - used by the log-shipping designated primary to get the WAL files. -3. The one referenced in the - `.spec.bootstrap.recovery.source` section of the `Cluster`. Used by - the initial recovery job to create the cluster from an existing backup. - -You can fine-tune sidecar behavior in the `.spec.instanceSidecarConfiguration` -of your ObjectStore. These settings apply to all PostgreSQL instances that use -this object store. Any updates take effect at the next `Cluster` reconciliation, -and could generate a rollout of the `Cluster`. - -```yaml -apiVersion: barmancloud.cnpg.io/v1 -kind: ObjectStore -metadata: - name: minio-store -spec: - configuration: - # [...] - instanceSidecarConfiguration: - retentionPolicyIntervalSeconds: 1800 - resources: - requests: - memory: "XXX" - cpu: "YYY" - limits: - memory: "XXX" - cpu: "YYY" -``` - -:::note -If more than one `ObjectStore` applies, the `instanceSidecarConfiguration` of -the one set in `.spec.plugins` has priority. -::: diff --git a/web/versioned_docs/version-0.4.1/compression.md b/web/versioned_docs/version-0.4.1/compression.md deleted file mode 100644 index 2abbede..0000000 --- a/web/versioned_docs/version-0.4.1/compression.md +++ /dev/null @@ -1,43 +0,0 @@ ---- -sidebar_position: 80 ---- - -# Compression - - - -By default, backups and WAL files are archived **uncompressed**. However, the -Barman Cloud Plugin supports multiple compression algorithms via -`barman-cloud-backup` and `barman-cloud-wal-archive`, allowing you to optimize -for space, speed, or a balance of both. - -### Supported Compression Algorithms - -- `bzip2` -- `gzip` -- `lz4` (WAL only) -- `snappy` -- `xz` (WAL only) -- `zstd` (WAL only) - -Compression settings for base backups and WAL archives are configured -independently. For implementation details, refer to the corresponding API -definitions: - -- [`DataBackupConfiguration`](https://pkg.go.dev/github.com/cloudnative-pg/barman-cloud/pkg/api#DataBackupConfiguration) -- [`WALBackupConfiguration`](https://pkg.go.dev/github.com/cloudnative-pg/barman-cloud/pkg/api#WalBackupConfiguration) - -:::important -Compression impacts both performance and storage efficiency. Choose the right -algorithm based on your recovery time objectives (RTO), storage capacity, and -network throughput. -::: - -## Compression Benchmark (on MinIO) - -| Compression | Backup Time (ms) | Restore Time (ms) | Uncompressed Size (MB) | Compressed Size (MB) | Ratio | -| ----------- | ---------------- | ----------------- | ---------------------- | -------------------- | ----- | -| None | 10,927 | 7,553 | 395 | 395 | 1.0:1 | -| bzip2 | 25,404 | 13,886 | 395 | 67 | 5.9:1 | -| gzip | 116,281 | 3,077 | 395 | 91 | 4.3:1 | -| snappy | 8,134 | 8,341 | 395 | 166 | 2.4:1 | diff --git a/web/versioned_docs/version-0.4.1/concepts.md b/web/versioned_docs/version-0.4.1/concepts.md deleted file mode 100644 index 3832df3..0000000 --- a/web/versioned_docs/version-0.4.1/concepts.md +++ /dev/null @@ -1,177 +0,0 @@ ---- -sidebar_position: 10 ---- - -# Main Concepts - - - -:::important -Before proceeding, make sure to review the following sections of the -CloudNativePG documentation: - -- [**Backup**](https://cloudnative-pg.io/documentation/current/backup/) -- [**WAL Archiving**](https://cloudnative-pg.io/documentation/current/wal_archiving/) -- [**Recovery**](https://cloudnative-pg.io/documentation/current/recovery/) -::: - -The **Barman Cloud Plugin** enables **hot (online) backups** of PostgreSQL -clusters in CloudNativePG through [`barman-cloud`](https://pgbarman.org), -supporting continuous physical backups and WAL archiving to an **object -store**—without interrupting write operations. - -It also supports both **full recovery** and **Point-in-Time Recovery (PITR)** -of a PostgreSQL cluster. - -## The Object Store - -At the core is the [`ObjectStore` custom resource (CRD)](plugin-barman-cloud.v1.md#objectstorespec), -which acts as the interface between the PostgreSQL cluster and the target -object storage system. It allows you to configure: - -- **Authentication and bucket location** via the `.spec.configuration` section -- **WAL archiving** settings—such as compression type, parallelism, and - server-side encryption—under `.spec.configuration.wal` -- **Base backup options**—with similar settings for compression, concurrency, - and encryption—under `.spec.configuration.data` -- **Retention policies** to manage the life-cycle of archived WALs and backups - via `.spec.configuration.retentionPolicy` - -WAL files are archived in the `wals` directory, while base backups are stored -as **tarballs** in the `base` directory, following the -[Barman Cloud convention](https://docs.pgbarman.org/cloud/latest/usage/#object-store-layout). - -The plugin also offers advanced capabilities, including -[backup tagging](misc.md#backup-object-tagging) and -[extra options for backups and WAL archiving](misc.md#extra-options-for-backup-and-wal-archiving). - -:::tip -For details, refer to the -[API reference for the `ObjectStore` resource](plugin-barman-cloud.v1.md#objectstorespec). -::: - -## Integration with a CloudNativePG Cluster - -CloudNativePG can delegate continuous backup and recovery responsibilities to -the **Barman Cloud Plugin** by configuring the `.spec.plugins` section of a -`Cluster` resource. This setup requires a corresponding `ObjectStore` resource -to be defined. - -:::important -While it is technically possible to reuse the same `ObjectStore` for multiple -`Cluster` resources within the same namespace, it is strongly recommended to -dedicate one object store per PostgreSQL cluster to ensure data isolation and -operational clarity. -::: - -The following example demonstrates how to configure a CloudNativePG cluster -named `cluster-example` to use a previously defined `ObjectStore` (also named -`cluster-example`) in the same namespace. Setting `isWALArchiver: true` enables -WAL archiving through the plugin: - -```yaml -apiVersion: postgresql.cnpg.io/v1 -kind: Cluster -metadata: - name: cluster-example -spec: - # Other cluster settings... - plugins: - - name: barman-cloud.cloudnative-pg.io - isWALArchiver: true - parameters: - barmanObjectName: cluster-example -``` - -## Backup of a Postgres Cluster - -Once the object store is defined and the `Cluster` is configured to use the -Barman Cloud Plugin, **WAL archiving is activated immediately** on the -PostgreSQL primary. - -Physical base backups are seamlessly managed by CloudNativePG using the -`Backup` and `ScheduledBackup` resources, respectively for -[on-demand](https://cloudnative-pg.io/documentation/current/backup/#on-demand-backups) -and -[scheduled](https://cloudnative-pg.io/documentation/current/backup/#scheduled-backups) -backups. - -To use the Barman Cloud Plugin, you must set the `method` to `plugin` and -configure the `pluginConfiguration` section as shown: - -```yaml -[...] -spec: - method: plugin - pluginConfiguration: - name: barman-cloud.cloudnative-pg.io - [...] -``` - -With this configuration, CloudNativePG supports: - -- Backups from both **primary** and **standby** instances -- Backups from **designated primaries** in a distributed topology using - [replica clusters](https://cloudnative-pg.io/documentation/current/replica_cluster/) - -:::tip -For details on how to back up from a standby, refer to the official documentation: -[Backup from a standby](https://cloudnative-pg.io/documentation/current/backup/#backup-from-a-standby). -::: - -:::important -Both backup and WAL archiving operations are executed by sidecar containers -running in the same pod as the PostgreSQL `Cluster` primary instance—except -when backups are taken from a standby, in which case the sidecar runs alongside -the standby pod. -The sidecar containers use a [dedicated container image](images.md) that -includes only the supported version of Barman Cloud. -::: - -## Recovery of a Postgres Cluster - -In PostgreSQL, *recovery* refers to the process of starting a database instance -from an existing backup. The Barman Cloud Plugin integrates with CloudNativePG -to support both **full recovery** and **Point-in-Time Recovery (PITR)** from an -object store. - -Recovery in this context is *not in-place*: it bootstraps a brand-new -PostgreSQL cluster from a backup and replays the necessary WAL files to reach -the desired recovery target. - -To perform a recovery, define an *external cluster* that references the -appropriate `ObjectStore`, and use it as the source in the `bootstrap` section -of the target cluster: - -```yaml -[...] -spec: - [...] - bootstrap: - recovery: - source: source - externalClusters: - - name: source - plugin: - name: barman-cloud.cloudnative-pg.io - parameters: - barmanObjectName: cluster-example - serverName: cluster-example - [...] -``` - -The critical element here is the `externalClusters` section of the `Cluster` -resource, where the `plugin` stanza instructs CloudNativePG to use the Barman -Cloud Plugin to access the object store for recovery. - -This same mechanism can be used for a variety of scenarios enabled by the -CloudNativePG API, including: - -* **Full cluster recovery** from the latest backup -* **Point-in-Time Recovery (PITR)** -* Bootstrapping **replica clusters** in a distributed topology - -:::tip -For complete instructions and advanced use cases, refer to the official -[Recovery documentation](https://cloudnative-pg.io/documentation/current/recovery/). -::: diff --git a/web/versioned_docs/version-0.4.1/images.md b/web/versioned_docs/version-0.4.1/images.md deleted file mode 100644 index f6c32d3..0000000 --- a/web/versioned_docs/version-0.4.1/images.md +++ /dev/null @@ -1,37 +0,0 @@ ---- -sidebar_position: 99 ---- - -# Container Images - - - -The Barman Cloud Plugin is distributed using two container images: - -- One for deploying the plugin components -- One for the sidecar that runs alongside each PostgreSQL instance in a - CloudNativePG `Cluster` using the plugin - -## Plugin Container Image - -The plugin image contains the logic required to operate the Barman Cloud Plugin -within your Kubernetes environment with CloudNativePG. It is published on the -GitHub Container Registry at `ghcr.io/cloudnative-pg/plugin-barman-cloud`. - -This image is built from the -[`Dockerfile.plugin`](https://github.com/cloudnative-pg/plugin-barman-cloud/blob/main/containers/Dockerfile.plugin) -in the plugin repository. - -## Sidecar Container Image - -The sidecar image is used within each PostgreSQL pod in the cluster. It -includes the latest supported version of Barman Cloud and is responsible for -performing WAL archiving and backups on behalf of CloudNativePG. - -It is available at `ghcr.io/cloudnative-pg/plugin-barman-cloud-sidecar` and is -built from the -[`Dockerfile.sidecar`](https://github.com/cloudnative-pg/plugin-barman-cloud/blob/main/containers/Dockerfile.sidecar). - -These sidecar images are designed to work seamlessly with the -[`minimal` PostgreSQL container images](https://github.com/cloudnative-pg/postgres-containers?tab=readme-ov-file#minimal-images) -maintained by the CloudNativePG Community. diff --git a/web/versioned_docs/version-0.4.1/installation.mdx b/web/versioned_docs/version-0.4.1/installation.mdx deleted file mode 100644 index 85bd41b..0000000 --- a/web/versioned_docs/version-0.4.1/installation.mdx +++ /dev/null @@ -1,109 +0,0 @@ ---- -sidebar_position: 20 ---- - -# Installation - -:::important -1. The plugin **must** be installed in the same namespace as the CloudNativePG - operator (typically `cnpg-system`). - -2. Keep in mind that the operator's **listening namespaces** may differ from its - installation namespace. Double-check this to avoid configuration issues. -::: - -## Verifying the Requirements - -Before installing the plugin, make sure the [requirements](intro.md#requirements) are met. - -### CloudNativePG Version - -Ensure you're running a version of CloudNativePG that is compatible with the -plugin. If installed in the default `cnpg-system` namespace, you can verify the -version with: - -```sh -kubectl get deployment -n cnpg-system cnpg-controller-manager -o yaml \ - | grep ghcr.io/cloudnative-pg/cloudnative-pg -``` - -Example output: - -```output -image: ghcr.io/cloudnative-pg/cloudnative-pg:1.26.0 -``` - -The version **must be 1.26 or newer**. - -### cert-manager - -Use the [cmctl](https://cert-manager.io/docs/reference/cmctl/#installation) -tool to confirm that `cert-manager` is installed and available: - -```sh -cmctl check api -``` - -Example output: - -```output -The cert-manager API is ready -``` - -Both checks are required before proceeding with the installation. - -## Installing the Barman Cloud Plugin - -import { InstallationSnippet } from '@site/src/components/Installation'; - -Install the plugin using `kubectl` by applying the manifest for the latest -release: - - - -Example output: - -```output -customresourcedefinition.apiextensions.k8s.io/objectstores.barmancloud.cnpg.io created -serviceaccount/plugin-barman-cloud created -role.rbac.authorization.k8s.io/leader-election-role created -clusterrole.rbac.authorization.k8s.io/metrics-auth-role created -clusterrole.rbac.authorization.k8s.io/metrics-reader created -clusterrole.rbac.authorization.k8s.io/objectstore-editor-role created -clusterrole.rbac.authorization.k8s.io/objectstore-viewer-role created -clusterrole.rbac.authorization.k8s.io/plugin-barman-cloud created -rolebinding.rbac.authorization.k8s.io/leader-election-rolebinding created -clusterrolebinding.rbac.authorization.k8s.io/metrics-auth-rolebinding created -clusterrolebinding.rbac.authorization.k8s.io/plugin-barman-cloud-binding created -secret/plugin-barman-cloud-8tfddg42gf created -service/barman-cloud created -deployment.apps/barman-cloud configured -certificate.cert-manager.io/barman-cloud-client created -certificate.cert-manager.io/barman-cloud-server created -issuer.cert-manager.io/selfsigned-issuer created -``` - -Finally, check that the deployment is up and running: - -```sh -kubectl rollout status deployment \ - -n cnpg-system barman-cloud -``` - -Example output: - -```output -deployment "barman-cloud" successfully rolled out -``` - -This confirms that the plugin is deployed and ready to use. - -## Testing the latest development snapshot - -You can also test the latest development snapshot of the plugin with the -following command: - -```sh -kubectl apply -f \ - https://raw.githubusercontent.com/cloudnative-pg/plugin-barman-cloud/refs/heads/main/manifest.yaml -``` diff --git a/web/versioned_docs/version-0.4.1/intro.md b/web/versioned_docs/version-0.4.1/intro.md deleted file mode 100644 index f22f383..0000000 --- a/web/versioned_docs/version-0.4.1/intro.md +++ /dev/null @@ -1,67 +0,0 @@ ---- -sidebar_position: 1 -sidebar_label: "Introduction" ---- - -# Barman Cloud Plugin - - - -The **Barman Cloud Plugin** for [CloudNativePG](https://cloudnative-pg.io/) -enables online continuous physical backups of PostgreSQL clusters to object storage -using the `barman-cloud` suite from the [Barman](https://docs.pgbarman.org/release/latest/) -project. - -:::important -If you plan to migrate your existing CloudNativePG cluster to the new -plugin-based approach using the Barman Cloud Plugin, see -["Migrating from Built-in CloudNativePG Backup"](migration.md) -for detailed instructions. -::: - -## Requirements - -To use the Barman Cloud Plugin, you need: - -- [CloudNativePG](https://cloudnative-pg.io) version **1.26** -- [cert-manager](https://cert-manager.io/) to enable TLS communication between - the plugin and the operator - -## Key Features - -This plugin provides the following capabilities: - -- Physical online backup of the data directory -- Physical restore of the data directory -- Write-Ahead Log (WAL) archiving -- WAL restore -- Full cluster recovery -- Point-in-Time Recovery (PITR) -- Seamless integration with replica clusters for bootstrap and WAL restore from archive - -:::important -The Barman Cloud Plugin is designed to **replace the in-tree object storage support** -previously provided via the `.spec.backup.barmanObjectStore` section in the -`Cluster` resource. -Backups created using the in-tree approach are fully supported and compatible -with this plugin. -::: - -## Supported Object Storage Providers - -The plugin works with all storage backends supported by `barman-cloud`, including: - -- **Amazon S3** -- **Google Cloud Storage** -- **Microsoft Azure Blob Storage** - -In addition, the following S3-compatible and simulator solutions have been -tested and verified: - -- [MinIO](https://min.io/) – An S3-compatible storage solution -- [Azurite](https://github.com/Azure/Azurite) – A simulator for Azure Blob Storage -- [fake-gcs-server](https://github.com/fsouza/fake-gcs-server) – A simulator for Google Cloud Storage - -:::tip -For more details, refer to [Object Store Providers](object_stores.md). -::: diff --git a/web/versioned_docs/version-0.4.1/migration.md b/web/versioned_docs/version-0.4.1/migration.md deleted file mode 100644 index 43c4b80..0000000 --- a/web/versioned_docs/version-0.4.1/migration.md +++ /dev/null @@ -1,259 +0,0 @@ ---- -sidebar_position: 40 ---- - -# Migrating from Built-in CloudNativePG Backup - - - -The in-tree support for Barman Cloud in CloudNativePG is **deprecated starting -from version 1.26** and will be removed in a future release. - -If you're currently relying on the built-in Barman Cloud integration, you can -migrate seamlessly to the new **plugin-based architecture** using the Barman -Cloud Plugin, without data loss. Follow these steps: - -- [Install the Barman Cloud Plugin](installation.mdx) -- Create an `ObjectStore` resource by translating the contents of the - `.spec.backup.barmanObjectStore` section from your existing `Cluster` - definition -- Modify the `Cluster` resource in a single atomic change to switch from - in-tree backup to the plugin -- Update any `ScheduledBackup` resources to use the plugin -- Update the `externalClusters` configuration, where applicable - -:::tip -For a working example, refer to [this commit](https://github.com/cloudnative-pg/cnpg-playground/commit/596f30e252896edf8f734991c3538df87630f6f7) -from the [CloudNativePG Playground project](https://github.com/cloudnative-pg/cnpg-playground), -which demonstrates a full migration. -::: - ---- - -## Step 1: Define the `ObjectStore` - -Begin by creating an `ObjectStore` resource in the same namespace as your -PostgreSQL `Cluster`. - -There is a **direct mapping** between the `.spec.backup.barmanObjectStore` -section in CloudNativePG and the `.spec.configuration` field in the -`ObjectStore` CR. The conversion is mostly mechanical, with one key difference: - -:::warning -In the plugin architecture, retention policies are defined as part of the `ObjectStore`. -In contrast, the in-tree implementation defined them at the `Cluster` level. -::: - -If your `Cluster` used `.spec.backup.retentionPolicy`, move that configuration -to `.spec.retentionPolicy` in the `ObjectStore`. - ---- - -### Example - -Here’s an excerpt from a traditional in-tree CloudNativePG backup configuration -taken from the CloudNativePG Playground project: - -```yaml -apiVersion: postgresql.cnpg.io/v1 -kind: Cluster -metadata: - name: pg-eu -spec: - # [...] - backup: - barmanObjectStore: - destinationPath: s3://backups/ - endpointURL: http://minio-eu:9000 - s3Credentials: - accessKeyId: - name: minio-eu - key: ACCESS_KEY_ID - secretAccessKey: - name: minio-eu - key: ACCESS_SECRET_KEY - wal: - compression: gzip -``` - -This configuration translates to the following `ObjectStore` resource for the -plugin: - -```yaml -apiVersion: barmancloud.cnpg.io/v1 -kind: ObjectStore -metadata: - name: minio-eu -spec: - configuration: - destinationPath: s3://backups/ - endpointURL: http://minio-eu:9000 - s3Credentials: - accessKeyId: - name: minio-eu - key: ACCESS_KEY_ID - secretAccessKey: - name: minio-eu - key: ACCESS_SECRET_KEY - wal: - compression: gzip -``` - -As you can see, the contents of `barmanObjectStore` have been copied directly -under the `configuration` field of the `ObjectStore` resource, using the same -secret references. - -## Step 2: Update the `Cluster` for plugin WAL archiving - -Once the `ObjectStore` resource is in place, update the `Cluster` resource as -follows in a single atomic change: - -- Remove the `.spec.backup.barmanObjectStore` section -- Remove `.spec.backup.retentionPolicy` if it was defined (as it is now in the - `ObjectStore`) -- Remove the entire `spec.backup` section if it is now empty -- Add `barman-cloud.cloudnative-pg.io` to the `plugins` list, as described in - [Configuring WAL archiving](usage.md#configuring-wal-archiving) - -This will trigger a rolling update of the `Cluster`, switching continuous -backup from the in-tree implementation to the plugin-based approach. - -### Example - -The updated `pg-eu` cluster will have this configuration instead of the -previous `backup` section: - -```yaml - plugins: - - name: barman-cloud.cloudnative-pg.io - isWALArchiver: true - parameters: - barmanObjectName: minio-eu -``` - ---- - -## Step 3: Update the `ScheduledBackup` - -After switching the `Cluster` to use the plugin, update your `ScheduledBackup` -resources to match. - -Set the backup `method` to `plugin` and reference the plugin name via -`pluginConfiguration`, as shown in ["Performing a base backup"](usage.md#performing-a-base-backup). - -### Example - -Original in-tree `ScheduledBackup`: - -```yaml -apiVersion: postgresql.cnpg.io/v1 -kind: ScheduledBackup -metadata: - name: pg-eu-backup -spec: - cluster: - name: pg-eu - schedule: '0 0 0 * * *' - backupOwnerReference: self -``` - -Updated version using the plugin: - -```yaml -apiVersion: postgresql.cnpg.io/v1 -kind: ScheduledBackup -metadata: - name: pg-eu-backup -spec: - cluster: - name: pg-eu - schedule: '0 0 0 * * *' - backupOwnerReference: self - method: plugin - pluginConfiguration: - name: barman-cloud.cloudnative-pg.io -``` - ---- - -## Step 4: Update the `externalClusters` configuration - -If your `Cluster` relies on one or more external clusters that use the in-tree -Barman Cloud integration, you need to update those configurations to use the -plugin-based architecture. - -When a replica cluster fetches WAL files or base backups from an external -source that used the built-in backup method, follow these steps: - -1. Create a corresponding `ObjectStore` resource for the external cluster, as - shown in [Step 1](#step-1-define-the-objectstore) -2. Update the `externalClusters` section of your replica cluster to use the - plugin instead of the in-tree `barmanObjectStore` field - -### Example - -Consider the original configuration using in-tree Barman Cloud: - -```yaml -apiVersion: postgresql.cnpg.io/v1 -kind: Cluster -metadata: - name: pg-us -spec: - # [...] - externalClusters: - - name: pg-eu - barmanObjectStore: - destinationPath: s3://backups/ - endpointURL: http://minio-eu:9000 - serverName: pg-eu - s3Credentials: - accessKeyId: - name: minio-eu - key: ACCESS_KEY_ID - secretAccessKey: - name: minio-eu - key: ACCESS_SECRET_KEY - wal: - compression: gzip -``` - -Create the `ObjectStore` resource for the external cluster: - -```yaml -apiVersion: barmancloud.cnpg.io/v1 -kind: ObjectStore -metadata: - name: minio-eu -spec: - configuration: - destinationPath: s3://backups/ - endpointURL: http://minio-eu:9000 - s3Credentials: - accessKeyId: - name: minio-eu - key: ACCESS_KEY_ID - secretAccessKey: - name: minio-eu - key: ACCESS_SECRET_KEY - wal: - compression: gzip -``` - -Update the external cluster configuration to use the plugin: - -```yaml -apiVersion: postgresql.cnpg.io/v1 -kind: Cluster -metadata: - name: pg-us -spec: - # [...] - externalClusters: - - name: pg-eu - plugin: - name: barman-cloud.cloudnative-pg.io - parameters: - barmanObjectName: minio-eu - serverName: pg-eu -``` diff --git a/web/versioned_docs/version-0.4.1/misc.md b/web/versioned_docs/version-0.4.1/misc.md deleted file mode 100644 index 4d3cefc..0000000 --- a/web/versioned_docs/version-0.4.1/misc.md +++ /dev/null @@ -1,76 +0,0 @@ ---- -sidebar_position: 90 ---- - -# Miscellaneous - - - -## Backup Object Tagging - -You can attach key-value metadata tags to backup artifacts—such as base -backups, WAL files, and history files—via the `.spec.configuration` section of -the `ObjectStore` resource. - -- `tags`: applied to base backups and WAL files -- `historyTags`: applied to history files only - -### Example - -```yaml -apiVersion: barmancloud.cnpg.io/v1 -kind: ObjectStore -metadata: - name: my-store -spec: - configuration: - [...] - tags: - backupRetentionPolicy: "expire" - historyTags: - backupRetentionPolicy: "keep" - [...] -``` - -## Extra Options for Backup and WAL Archiving - -You can pass additional command-line arguments to `barman-cloud-backup` and -`barman-cloud-wal-archive` using the `additionalCommandArgs` field in the -`ObjectStore` configuration. - -- `.spec.configuration.data.additionalCommandArgs`: for `barman-cloud-backup` -- `.spec.configuration.wal.additionalCommandArgs`: for `barman-cloud-wal-archive` - -Each field accepts a list of string arguments. If an argument is already -configured elsewhere in the plugin, the duplicate will be ignored. - -### Example: Extra Backup Options - -```yaml -kind: ObjectStore -metadata: - name: my-store -spec: - configuration: - data: - additionalCommandArgs: - - "--min-chunk-size=5MB" - - "--read-timeout=60" -``` - -### Example: Extra WAL Archive Options - -```yaml -kind: ObjectStore -metadata: - name: my-store -spec: - configuration: - wal: - additionalCommandArgs: - - "--max-concurrency=1" - - "--read-timeout=60" -``` - -For a complete list of supported options, refer to the -[official Barman Cloud documentation](https://docs.pgbarman.org/release/latest/). diff --git a/web/versioned_docs/version-0.4.1/object_stores.md b/web/versioned_docs/version-0.4.1/object_stores.md deleted file mode 100644 index 29e7b35..0000000 --- a/web/versioned_docs/version-0.4.1/object_stores.md +++ /dev/null @@ -1,465 +0,0 @@ ---- -sidebar_position: 50 ---- - -# Object Store Providers - - - -The Barman Cloud Plugin enables the storage of PostgreSQL cluster backup files -in any object storage service supported by the -[Barman Cloud infrastructure](https://docs.pgbarman.org/release/latest/). - -Currently, Barman Cloud supports the following providers: - -- [Amazon S3](#aws-s3) -- [Microsoft Azure Blob Storage](#azure-blob-storage) -- [Google Cloud Storage](#google-cloud-storage) - -You may also use any S3- or Azure-compatible implementation of the above -services. - -To configure object storage with Barman Cloud, you must define an -[`ObjectStore` object](plugin-barman-cloud.v1.md#objectstore), which -establishes the connection between your PostgreSQL cluster and the object -storage backend. - -Configuration details — particularly around authentication — will vary depending on -the specific object storage provider you are using. - -The following sections detail the setup for each. - ---- - -## AWS S3 - -[AWS Simple Storage Service (S3)](https://aws.amazon.com/s3/) is one of the -most widely adopted object storage solutions. - -The Barman Cloud plugin for CloudNativePG integrates with S3 through two -primary authentication mechanisms: - -- [IAM Roles for Service Accounts (IRSA)](https://docs.aws.amazon.com/eks/latest/userguide/iam-roles-for-service-accounts.html) — - recommended for clusters running on EKS -- Access keys — using `ACCESS_KEY_ID` and `ACCESS_SECRET_KEY` credentials - -### Access Keys - -To authenticate using access keys, you’ll need: - -- `ACCESS_KEY_ID`: the public key used to authenticate to S3 -- `ACCESS_SECRET_KEY`: the corresponding secret key -- `ACCESS_SESSION_TOKEN`: (optional) a temporary session token, if required - -These credentials must be stored securely in a Kubernetes secret: - -```sh -kubectl create secret generic aws-creds \ - --from-literal=ACCESS_KEY_ID= \ - --from-literal=ACCESS_SECRET_KEY= -# --from-literal=ACCESS_SESSION_TOKEN= # if required -``` - -The credentials will be encrypted at rest if your Kubernetes environment -supports it. - -You can then reference the secret in your `ObjectStore` definition: - -```yaml -apiVersion: barmancloud.cnpg.io/v1 -kind: ObjectStore -metadata: - name: aws-store -spec: - configuration: - destinationPath: "s3://BUCKET_NAME/path/to/folder" - s3Credentials: - accessKeyId: - name: aws-creds - key: ACCESS_KEY_ID - secretAccessKey: - name: aws-creds - key: ACCESS_SECRET_KEY - [...] -``` - -### IAM Role for Service Account (IRSA) - -To use IRSA with EKS, configure the service account of the PostgreSQL cluster -with the appropriate annotation: - -```yaml -apiVersion: postgresql.cnpg.io/v1 -kind: Cluster -metadata: - [...] -spec: - serviceAccountTemplate: - metadata: - annotations: - eks.amazonaws.com/role-arn: arn:[...] - [...] -``` - -### S3 Lifecycle Policy - -Barman Cloud uploads backup files to S3 but does not modify them afterward. -To enhance data durability and protect against accidental or malicious loss, -it's recommended to implement the following best practices: - -- Enable object versioning -- Enable object locking to prevent objects from being deleted or overwritten - for a defined period or indefinitely (this provides an additional layer of - protection against accidental deletion and ransomware attacks) -- Set lifecycle rules to expire current versions a few days after your Barman - retention window -- Expire non-current versions after a longer period - -These strategies help you safeguard backups without requiring broad delete -permissions, ensuring both security and compliance with minimal operational -overhead. - - -### S3-Compatible Storage Providers - -You can use S3-compatible services like **MinIO**, **Linode (Akamai) Object Storage**, -or **DigitalOcean Spaces** by specifying a custom `endpointURL`. - -Example with Linode (Akamai) Object Storage (`us-east1`): - -```yaml -apiVersion: barmancloud.cnpg.io/v1 -kind: ObjectStore -metadata: - name: linode-store -spec: - configuration: - destinationPath: "s3://BUCKET_NAME/" - endpointURL: "https://us-east1.linodeobjects.com" - s3Credentials: - [...] - [...] -``` - -Example with DigitalOcean Spaces (SFO3, path-style): - -```yaml -apiVersion: barmancloud.cnpg.io/v1 -kind: ObjectStore -metadata: - name: digitalocean-store -spec: - configuration: - destinationPath: "s3://BUCKET_NAME/path/to/folder" - endpointURL: "https://sfo3.digitaloceanspaces.com" - s3Credentials: - [...] - [...] -``` - -### Using Object Storage with a Private CA - -For object storage services (e.g., MinIO) that use HTTPS with certificates -signed by a private CA, set the `endpointCA` field in the `ObjectStore` -definition. Unless you already have it, create a Kubernetes `Secret` with the -CA bundle: - -```sh -kubectl create secret generic my-ca-secret --from-file=ca.crt -``` - -Then reference it: - -```yaml -apiVersion: barmancloud.cnpg.io/v1 -kind: ObjectStore -metadata: - name: minio-store -spec: - configuration: - endpointURL: - endpointCA: - name: my-ca-secret - key: ca.crt - [...] -``` - - -:::note -If you want `ConfigMaps` and `Secrets` to be **automatically** reloaded by -instances, you can add a label with the key `cnpg.io/reload` to the -`Secrets`/`ConfigMaps`. Otherwise, you will have to reload the instances using the -`kubectl cnpg reload` subcommand. -::: - ---- - -## Azure Blob Storage - -[Azure Blob Storage](https://azure.microsoft.com/en-us/services/storage/blobs/) -is Microsoft’s cloud-based object storage solution. - -Barman Cloud supports the following authentication methods: - -- [Connection String](https://learn.microsoft.com/en-us/azure/storage/common/storage-configure-connection-string) -- Storage Account Name + [Access Key](https://learn.microsoft.com/en-us/azure/storage/common/storage-account-keys-manage) -- Storage Account Name + [SAS Token](https://learn.microsoft.com/en-us/azure/storage/blobs/sas-service-create) -- [Azure AD Workload Identity](https://azure.github.io/azure-workload-identity/docs/introduction.html) - -### Azure AD Workload Identity - -This method avoids storing credentials in Kubernetes via the -`.spec.configuration.inheritFromAzureAD` option: - -```yaml -apiVersion: barmancloud.cnpg.io/v1 -kind: ObjectStore -metadata: - name: azure-store -spec: - configuration: - destinationPath: "" - azureCredentials: - inheritFromAzureAD: true - [...] -``` - -### Access Key, SAS Token, or Connection String - -Store credentials in a Kubernetes secret: - -```sh -kubectl create secret generic azure-creds \ - --from-literal=AZURE_STORAGE_ACCOUNT= \ - --from-literal=AZURE_STORAGE_KEY= \ - --from-literal=AZURE_STORAGE_SAS_TOKEN= \ - --from-literal=AZURE_STORAGE_CONNECTION_STRING= -``` - -Then reference the required keys in your `ObjectStore`: - -```yaml -apiVersion: barmancloud.cnpg.io/v1 -kind: ObjectStore -metadata: - name: azure-store -spec: - configuration: - destinationPath: "" - azureCredentials: - connectionString: - name: azure-creds - key: AZURE_CONNECTION_STRING - storageAccount: - name: azure-creds - key: AZURE_STORAGE_ACCOUNT - storageKey: - name: azure-creds - key: AZURE_STORAGE_KEY - storageSasToken: - name: azure-creds - key: AZURE_STORAGE_SAS_TOKEN - [...] -``` - -For Azure Blob, the destination path format is: - -``` -://..core.windows.net// -``` - -### Azure-Compatible Providers - -If you're using a different implementation (e.g., Azurite or emulator): - -``` -://:/// -``` - ---- - -## Google Cloud Storage - -[Google Cloud Storage](https://cloud.google.com/storage/) is supported with two -authentication modes: - -- **GKE Workload Identity** (recommended inside Google Kubernetes Engine) -- **Service Account JSON key** via the `GOOGLE_APPLICATION_CREDENTIALS` environment variable - -### GKE Workload Identity - -Use the [Workload Identity authentication](https://cloud.google.com/kubernetes-engine/docs/how-to/workload-identity) -when running in GKE: - -1. Set `googleCredentials.gkeEnvironment` to `true` in the `ObjectStore` - resource -2. Annotate the `serviceAccountTemplate` in the `Cluster` resource with the GCP - service account - -For example, in the `ObjectStore` resource: - -```yaml -apiVersion: barmancloud.cnpg.io/v1 -kind: ObjectStore -metadata: - name: google-store -spec: - configuration: - destinationPath: "gs:///" - googleCredentials: - gkeEnvironment: true -``` - -And in the `Cluster` resource: - -```yaml -apiVersion: postgresql.cnpg.io/v1 -kind: Cluster -spec: - serviceAccountTemplate: - metadata: - annotations: - iam.gke.io/gcp-service-account: [...].iam.gserviceaccount.com -``` - -### Service Account JSON Key - -Follow Google’s [authentication setup](https://cloud.google.com/docs/authentication/getting-started), -then: - -```sh -kubectl create secret generic backup-creds --from-file=gcsCredentials=gcs_credentials_file.json -``` - -```yaml -apiVersion: barmancloud.cnpg.io/v1 -kind: ObjectStore -metadata: - name: google-store -spec: - configuration: - destinationPath: "gs:///" - googleCredentials: - applicationCredentials: - name: backup-creds - key: gcsCredentials - [...] -``` - -:::important -This authentication method generates a JSON file within the container -with all the credentials required to access your Google Cloud Storage -bucket. As a result, if someone gains access to the `Pod`, they will also have -write permissions to the bucket. -::: - ---- - - -## MinIO Gateway - -MinIO Gateway can proxy requests to cloud object storage providers like S3 or GCS. -For more information, refer to [MinIO official documentation](https://docs.min.io/). - -### Setup - -Create MinIO access credentials: - -```sh -kubectl create secret generic minio-creds \ - --from-literal=MINIO_ACCESS_KEY= \ - --from-literal=MINIO_SECRET_KEY= -``` - -:::note -Cloud Object Storage credentials will be used only by MinIO Gateway in this -case. -::: - -Expose MinIO Gateway via `ClusterIP`: - -```yaml -apiVersion: v1 -kind: Service -metadata: - name: minio-gateway-service -spec: - type: ClusterIP - ports: - - port: 9000 - targetPort: 9000 - protocol: TCP - selector: - app: minio -``` - -Here follows an excerpt of an example of deployment relaying to S3: - -```yaml -apiVersion: apps/v1 -kind: Deployment -[...] -spec: - containers: - - name: minio - image: minio/minio:RELEASE.2020-06-03T22-13-49Z - args: ["gateway", "s3"] - ports: - - containerPort: 9000 - env: - - name: MINIO_ACCESS_KEY - valueFrom: - secretKeyRef: - name: minio-creds - key: MINIO_ACCESS_KEY - - name: MINIO_SECRET_KEY - valueFrom: - secretKeyRef: - name: minio-creds - key: MINIO_SECRET_KEY - - name: AWS_ACCESS_KEY_ID - valueFrom: - secretKeyRef: - name: aws-creds - key: ACCESS_KEY_ID - - name: AWS_SECRET_ACCESS_KEY - valueFrom: - secretKeyRef: - name: aws-creds - key: ACCESS_SECRET_KEY -# Uncomment the below section if session token is required -# - name: AWS_SESSION_TOKEN -# valueFrom: -# secretKeyRef: -# name: aws-creds -# key: ACCESS_SESSION_TOKEN -``` - -Proceed by configuring MinIO Gateway service as the `endpointURL` in the -`ObjectStore` definition, then choose a bucket name to replace `BUCKET_NAME`: - -```yaml -apiVersion: barmancloud.cnpg.io/v1 -kind: ObjectStore -metadata: - name: minio-store -spec: - configuration: - destinationPath: s3://BUCKET_NAME/ - endpointURL: http://minio-gateway-service:9000 - s3Credentials: - accessKeyId: - name: minio-creds - key: MINIO_ACCESS_KEY - secretAccessKey: - name: minio-creds - key: MINIO_SECRET_KEY - [...] -``` - -:::important -Verify on `s3://BUCKET_NAME/` the presence of archived WAL files before -proceeding with a backup. -::: - ---- diff --git a/web/versioned_docs/version-0.4.1/parameters.md b/web/versioned_docs/version-0.4.1/parameters.md deleted file mode 100644 index ca0cd2b..0000000 --- a/web/versioned_docs/version-0.4.1/parameters.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -sidebar_position: 100 ---- - -# Parameters - - - -The following parameters are available for the Barman Cloud Plugin: - -- `barmanObjectName`: references the `ObjectStore` resource to be used by the - plugin. -- `serverName`: Specifies the server name in the object store. - -:::important -The `serverName` parameter in the `ObjectStore` resource is retained solely for -API compatibility with the in-tree `barmanObjectStore` and must always be left empty. -When needed, use the `serverName` plugin parameter in the Cluster configuration instead. -::: diff --git a/web/versioned_docs/version-0.4.1/plugin-barman-cloud.v1.md b/web/versioned_docs/version-0.4.1/plugin-barman-cloud.v1.md deleted file mode 100644 index 552dc27..0000000 --- a/web/versioned_docs/version-0.4.1/plugin-barman-cloud.v1.md +++ /dev/null @@ -1,105 +0,0 @@ -# API Reference - -## Packages -- [barmancloud.cnpg.io/v1](#barmancloudcnpgiov1) - - -## barmancloud.cnpg.io/v1 - -Package v1 contains API Schema definitions for the barmancloud v1 API group - -### Resource Types -- [ObjectStore](#objectstore) - - - -#### InstanceSidecarConfiguration - - - -InstanceSidecarConfiguration defines the configuration for the sidecar that runs in the instance pods. - - - -_Appears in:_ -- [ObjectStoreSpec](#objectstorespec) - -| Field | Description | Required | Default | Validation | -| --- | --- | --- | --- | --- | -| `env` _[EnvVar](https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.32/#envvar-v1-core) array_ | The environment to be explicitly passed to the sidecar | | | | -| `retentionPolicyIntervalSeconds` _integer_ | The retentionCheckInterval defines the frequency at which the
system checks and enforces retention policies. | | 1800 | | -| `resources` _[ResourceRequirements](https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.32/#resourcerequirements-v1-core)_ | Resources define cpu/memory requests and limits for the sidecar that runs in the instance pods. | | | | - - -#### ObjectStore - - - -ObjectStore is the Schema for the objectstores API. - - - - - -| Field | Description | Required | Default | Validation | -| --- | --- | --- | --- | --- | -| `apiVersion` _string_ | `barmancloud.cnpg.io/v1` | True | | | -| `kind` _string_ | `ObjectStore` | True | | | -| `metadata` _[ObjectMeta](https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.32/#objectmeta-v1-meta)_ | Refer to Kubernetes API documentation for fields of `metadata`. | True | | | -| `spec` _[ObjectStoreSpec](#objectstorespec)_ | Specification of the desired behavior of the ObjectStore.
More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#spec-and-status | True | | | -| `status` _[ObjectStoreStatus](#objectstorestatus)_ | Most recently observed status of the ObjectStore. This data may not be up to
date. Populated by the system. Read-only.
More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#spec-and-status | | | | - - -#### ObjectStoreSpec - - - -ObjectStoreSpec defines the desired state of ObjectStore. - - - -_Appears in:_ -- [ObjectStore](#objectstore) - -| Field | Description | Required | Default | Validation | -| --- | --- | --- | --- | --- | -| `configuration` _[BarmanObjectStoreConfiguration](https://pkg.go.dev/github.com/cloudnative-pg/barman-cloud/pkg/api#BarmanObjectStoreConfiguration)_ | The configuration for the barman-cloud tool suite | True | | | -| `retentionPolicy` _string_ | RetentionPolicy is the retention policy to be used for backups
and WALs (i.e. '60d'). The retention policy is expressed in the form
of `XXu` where `XX` is a positive integer and `u` is in `[dwm]` -
days, weeks, months. | | | Pattern: `^[1-9][0-9]*[dwm]$`
| -| `instanceSidecarConfiguration` _[InstanceSidecarConfiguration](#instancesidecarconfiguration)_ | The configuration for the sidecar that runs in the instance pods | | | | - - -#### ObjectStoreStatus - - - -ObjectStoreStatus defines the observed state of ObjectStore. - - - -_Appears in:_ -- [ObjectStore](#objectstore) - -| Field | Description | Required | Default | Validation | -| --- | --- | --- | --- | --- | -| `serverRecoveryWindow` _object (keys:string, values:[RecoveryWindow](#recoverywindow))_ | ServerRecoveryWindow maps each server to its recovery window | True | | | - - -#### RecoveryWindow - - - -RecoveryWindow represents the time span between the first -recoverability point and the last successful backup of a PostgreSQL -server, defining the period during which data can be restored. - - - -_Appears in:_ -- [ObjectStoreStatus](#objectstorestatus) - -| Field | Description | Required | Default | Validation | -| --- | --- | --- | --- | --- | -| `firstRecoverabilityPoint` _[Time](https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.32/#time-v1-meta)_ | The first recoverability point in a PostgreSQL server refers to
the earliest point in time to which the database can be
restored. | True | | | -| `lastSuccussfulBackupTime` _[Time](https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.32/#time-v1-meta)_ | The last successful backup time | True | | | - - diff --git a/web/versioned_docs/version-0.4.1/retention.md b/web/versioned_docs/version-0.4.1/retention.md deleted file mode 100644 index fefbd08..0000000 --- a/web/versioned_docs/version-0.4.1/retention.md +++ /dev/null @@ -1,38 +0,0 @@ ---- -sidebar_position: 60 ---- - -# Retention Policies - - - -The Barman Cloud Plugin supports **automated cleanup of obsolete backups** via -retention policies, configured in the `.spec.retentionPolicy` field of the -`ObjectStore` resource. - -:::note -This feature uses the `barman-cloud-backup-delete` command with the -`--retention-policy "RECOVERY WINDOW OF {{ value }} {{ unit }}"` syntax. -::: - -#### Example: 30-Day Retention Policy - -```yaml -apiVersion: barmancloud.cnpg.io/v1 -kind: ObjectStore -metadata: - name: my-store -spec: - [...] - retentionPolicy: "30d" -```` - -:::note -A **recovery window retention policy** ensures the cluster can be restored to -any point in time between the calculated *Point of Recoverability* (PoR) and -the latest WAL archive. The PoR is defined as `current time - recovery window`. -The **first valid backup** is the most recent backup completed before the PoR. -Backups older than that are marked as *obsolete* and deleted after the next -backup completes. -::: - diff --git a/web/versioned_docs/version-0.4.1/usage.md b/web/versioned_docs/version-0.4.1/usage.md deleted file mode 100644 index 5a82229..0000000 --- a/web/versioned_docs/version-0.4.1/usage.md +++ /dev/null @@ -1,258 +0,0 @@ ---- -sidebar_position: 30 ---- - -# Using the Barman Cloud Plugin - - - -After [installing the plugin](installation.mdx) in the same namespace as the -CloudNativePG operator, enabling your PostgreSQL cluster to use the Barman -Cloud Plugin involves just a few steps: - -- Defining the object store containing your WAL archive and base backups, using - your preferred [provider](object_stores.md) -- Instructing the Postgres cluster to use the Barman Cloud Plugin - -From that moment, you’ll be able to issue on-demand backups or define a backup -schedule, as well as rely on the object store for recovery operations. - -The rest of this page details each step, using MinIO as object store provider. - -## Defining the `ObjectStore` - -An `ObjectStore` resource must be created for each object store used in your -PostgreSQL architecture. Here's an example configuration using MinIO: - -```yaml -apiVersion: barmancloud.cnpg.io/v1 -kind: ObjectStore -metadata: - name: minio-store -spec: - configuration: - destinationPath: s3://backups/ - endpointURL: http://minio:9000 - s3Credentials: - accessKeyId: - name: minio - key: ACCESS_KEY_ID - secretAccessKey: - name: minio - key: ACCESS_SECRET_KEY - wal: - compression: gzip -``` - -The `.spec.configuration` schema follows the same format as the -[in-tree barman-cloud support](https://pkg.go.dev/github.com/cloudnative-pg/barman-cloud/pkg/api#BarmanObjectStoreConfiguration). -Refer to [the CloudNativePG documentation](https://cloudnative-pg.io/documentation/current/appendixes/backup_barmanobjectstore/) -for additional details. - -:::important -The `serverName` parameter in the `ObjectStore` resource is retained solely for -API compatibility with the in-tree `barmanObjectStore` and must always be left empty. -When needed, use the `serverName` plugin parameter in the Cluster configuration instead. -::: - -## Configuring WAL Archiving - -Once the `ObjectStore` is defined, you can configure your PostgreSQL cluster -to archive WALs by referencing the store in the `.spec.plugins` section: - -```yaml -apiVersion: postgresql.cnpg.io/v1 -kind: Cluster -metadata: - name: cluster-example -spec: - instances: 3 - imagePullPolicy: Always - plugins: - - name: barman-cloud.cloudnative-pg.io - isWALArchiver: true - parameters: - barmanObjectName: minio-store - storage: - size: 1Gi -``` - -This configuration enables both WAL archiving and data directory backups. - -## Performing a Base Backup - -Once WAL archiving is enabled, the cluster is ready for backups. To issue an -on-demand backup, use the following configuration with the plugin method: - -```yaml -apiVersion: postgresql.cnpg.io/v1 -kind: Backup -metadata: - name: backup-example -spec: - cluster: - name: cluster-example - method: plugin - pluginConfiguration: - name: barman-cloud.cloudnative-pg.io -``` - -:::note -You can apply the same concept to the `ScheduledBackup` resource. -::: - -## Restoring a Cluster - -To restore a cluster from an object store, create a new `Cluster` resource that -references the store containing the backup. Below is an example configuration: - -```yaml -apiVersion: postgresql.cnpg.io/v1 -kind: Cluster -metadata: - name: cluster-restore -spec: - instances: 3 - imagePullPolicy: IfNotPresent - bootstrap: - recovery: - source: source - externalClusters: - - name: source - plugin: - name: barman-cloud.cloudnative-pg.io - parameters: - barmanObjectName: minio-store - serverName: cluster-example - storage: - size: 1Gi -``` - -:::important -The above configuration does **not** enable WAL archiving for the restored cluster. -::: - -To enable WAL archiving for the restored cluster, include the `.spec.plugins` -section alongside the `externalClusters.plugin` section, as shown below: - -```yaml -apiVersion: postgresql.cnpg.io/v1 -kind: Cluster -metadata: - name: cluster-restore -spec: - instances: 3 - imagePullPolicy: IfNotPresent - bootstrap: - recovery: - source: source - plugins: - - name: barman-cloud.cloudnative-pg.io - isWALArchiver: true - parameters: - # Backup Object Store (push, read-write) - barmanObjectName: minio-store-bis - externalClusters: - - name: source - plugin: - name: barman-cloud.cloudnative-pg.io - parameters: - # Recovery Object Store (pull, read-only) - barmanObjectName: minio-store - serverName: cluster-example - storage: - size: 1Gi -``` - -The same object store may be used for both transaction log archiving and -restoring a cluster, or you can configure separate stores for these purposes. - -## Configuring Replica Clusters - -You can set up a distributed topology by combining the previously defined -configurations with the `.spec.replica` section. Below is an example of how to -define a replica cluster: - -```yaml -apiVersion: postgresql.cnpg.io/v1 -kind: Cluster -metadata: - name: cluster-dc-a -spec: - instances: 3 - primaryUpdateStrategy: unsupervised - - storage: - storageClass: csi-hostpath-sc - size: 1Gi - - plugins: - - name: barman-cloud.cloudnative-pg.io - isWALArchiver: true - parameters: - barmanObjectName: minio-store-a - - replica: - self: cluster-dc-a - primary: cluster-dc-a - source: cluster-dc-b - - externalClusters: - - name: cluster-dc-a - plugin: - name: barman-cloud.cloudnative-pg.io - parameters: - barmanObjectName: minio-store-a - - - name: cluster-dc-b - plugin: - name: barman-cloud.cloudnative-pg.io - parameters: - barmanObjectName: minio-store-b -``` - -## Configuring the plugin instance sidecar - -The Barman Cloud Plugin runs as a sidecar container next to each PostgreSQL -instance pod. It manages backup, WAL archiving, and restore processes. - -Configuration comes from multiple `ObjectStore` resources: - -1. The one referenced in the - `.spec.plugins` section of the `Cluster`. This is the - object store used for WAL archiving and base backups. -2. The one referenced in the external cluster - used in the `.spec.replica.source` section of the `Cluster`. This is - used by the log-shipping designated primary to get the WAL files. -3. The one referenced in the - `.spec.bootstrap.recovery.source` section of the `Cluster`. Used by - the initial recovery job to create the cluster from an existing backup. - -You can fine-tune sidecar behavior in the `.spec.instanceSidecarConfiguration` -of your ObjectStore. These settings apply to all PostgreSQL instances that use -this object store. Any updates take effect at the next `Cluster` reconciliation, -and could generate a rollout of the `Cluster`. - -```yaml -apiVersion: barmancloud.cnpg.io/v1 -kind: ObjectStore -metadata: - name: minio-store -spec: - configuration: - # [...] - instanceSidecarConfiguration: - retentionPolicyIntervalSeconds: 1800 - resources: - requests: - memory: "XXX" - cpu: "YYY" - limits: - memory: "XXX" - cpu: "YYY" -``` - -:::note -If more than one `ObjectStore` applies, the `instanceSidecarConfiguration` of -the one set in `.spec.plugins` has priority. -::: diff --git a/web/versioned_docs/version-0.5.0/compression.md b/web/versioned_docs/version-0.5.0/compression.md deleted file mode 100644 index 2abbede..0000000 --- a/web/versioned_docs/version-0.5.0/compression.md +++ /dev/null @@ -1,43 +0,0 @@ ---- -sidebar_position: 80 ---- - -# Compression - - - -By default, backups and WAL files are archived **uncompressed**. However, the -Barman Cloud Plugin supports multiple compression algorithms via -`barman-cloud-backup` and `barman-cloud-wal-archive`, allowing you to optimize -for space, speed, or a balance of both. - -### Supported Compression Algorithms - -- `bzip2` -- `gzip` -- `lz4` (WAL only) -- `snappy` -- `xz` (WAL only) -- `zstd` (WAL only) - -Compression settings for base backups and WAL archives are configured -independently. For implementation details, refer to the corresponding API -definitions: - -- [`DataBackupConfiguration`](https://pkg.go.dev/github.com/cloudnative-pg/barman-cloud/pkg/api#DataBackupConfiguration) -- [`WALBackupConfiguration`](https://pkg.go.dev/github.com/cloudnative-pg/barman-cloud/pkg/api#WalBackupConfiguration) - -:::important -Compression impacts both performance and storage efficiency. Choose the right -algorithm based on your recovery time objectives (RTO), storage capacity, and -network throughput. -::: - -## Compression Benchmark (on MinIO) - -| Compression | Backup Time (ms) | Restore Time (ms) | Uncompressed Size (MB) | Compressed Size (MB) | Ratio | -| ----------- | ---------------- | ----------------- | ---------------------- | -------------------- | ----- | -| None | 10,927 | 7,553 | 395 | 395 | 1.0:1 | -| bzip2 | 25,404 | 13,886 | 395 | 67 | 5.9:1 | -| gzip | 116,281 | 3,077 | 395 | 91 | 4.3:1 | -| snappy | 8,134 | 8,341 | 395 | 166 | 2.4:1 | diff --git a/web/versioned_docs/version-0.5.0/concepts.md b/web/versioned_docs/version-0.5.0/concepts.md deleted file mode 100644 index 3832df3..0000000 --- a/web/versioned_docs/version-0.5.0/concepts.md +++ /dev/null @@ -1,177 +0,0 @@ ---- -sidebar_position: 10 ---- - -# Main Concepts - - - -:::important -Before proceeding, make sure to review the following sections of the -CloudNativePG documentation: - -- [**Backup**](https://cloudnative-pg.io/documentation/current/backup/) -- [**WAL Archiving**](https://cloudnative-pg.io/documentation/current/wal_archiving/) -- [**Recovery**](https://cloudnative-pg.io/documentation/current/recovery/) -::: - -The **Barman Cloud Plugin** enables **hot (online) backups** of PostgreSQL -clusters in CloudNativePG through [`barman-cloud`](https://pgbarman.org), -supporting continuous physical backups and WAL archiving to an **object -store**—without interrupting write operations. - -It also supports both **full recovery** and **Point-in-Time Recovery (PITR)** -of a PostgreSQL cluster. - -## The Object Store - -At the core is the [`ObjectStore` custom resource (CRD)](plugin-barman-cloud.v1.md#objectstorespec), -which acts as the interface between the PostgreSQL cluster and the target -object storage system. It allows you to configure: - -- **Authentication and bucket location** via the `.spec.configuration` section -- **WAL archiving** settings—such as compression type, parallelism, and - server-side encryption—under `.spec.configuration.wal` -- **Base backup options**—with similar settings for compression, concurrency, - and encryption—under `.spec.configuration.data` -- **Retention policies** to manage the life-cycle of archived WALs and backups - via `.spec.configuration.retentionPolicy` - -WAL files are archived in the `wals` directory, while base backups are stored -as **tarballs** in the `base` directory, following the -[Barman Cloud convention](https://docs.pgbarman.org/cloud/latest/usage/#object-store-layout). - -The plugin also offers advanced capabilities, including -[backup tagging](misc.md#backup-object-tagging) and -[extra options for backups and WAL archiving](misc.md#extra-options-for-backup-and-wal-archiving). - -:::tip -For details, refer to the -[API reference for the `ObjectStore` resource](plugin-barman-cloud.v1.md#objectstorespec). -::: - -## Integration with a CloudNativePG Cluster - -CloudNativePG can delegate continuous backup and recovery responsibilities to -the **Barman Cloud Plugin** by configuring the `.spec.plugins` section of a -`Cluster` resource. This setup requires a corresponding `ObjectStore` resource -to be defined. - -:::important -While it is technically possible to reuse the same `ObjectStore` for multiple -`Cluster` resources within the same namespace, it is strongly recommended to -dedicate one object store per PostgreSQL cluster to ensure data isolation and -operational clarity. -::: - -The following example demonstrates how to configure a CloudNativePG cluster -named `cluster-example` to use a previously defined `ObjectStore` (also named -`cluster-example`) in the same namespace. Setting `isWALArchiver: true` enables -WAL archiving through the plugin: - -```yaml -apiVersion: postgresql.cnpg.io/v1 -kind: Cluster -metadata: - name: cluster-example -spec: - # Other cluster settings... - plugins: - - name: barman-cloud.cloudnative-pg.io - isWALArchiver: true - parameters: - barmanObjectName: cluster-example -``` - -## Backup of a Postgres Cluster - -Once the object store is defined and the `Cluster` is configured to use the -Barman Cloud Plugin, **WAL archiving is activated immediately** on the -PostgreSQL primary. - -Physical base backups are seamlessly managed by CloudNativePG using the -`Backup` and `ScheduledBackup` resources, respectively for -[on-demand](https://cloudnative-pg.io/documentation/current/backup/#on-demand-backups) -and -[scheduled](https://cloudnative-pg.io/documentation/current/backup/#scheduled-backups) -backups. - -To use the Barman Cloud Plugin, you must set the `method` to `plugin` and -configure the `pluginConfiguration` section as shown: - -```yaml -[...] -spec: - method: plugin - pluginConfiguration: - name: barman-cloud.cloudnative-pg.io - [...] -``` - -With this configuration, CloudNativePG supports: - -- Backups from both **primary** and **standby** instances -- Backups from **designated primaries** in a distributed topology using - [replica clusters](https://cloudnative-pg.io/documentation/current/replica_cluster/) - -:::tip -For details on how to back up from a standby, refer to the official documentation: -[Backup from a standby](https://cloudnative-pg.io/documentation/current/backup/#backup-from-a-standby). -::: - -:::important -Both backup and WAL archiving operations are executed by sidecar containers -running in the same pod as the PostgreSQL `Cluster` primary instance—except -when backups are taken from a standby, in which case the sidecar runs alongside -the standby pod. -The sidecar containers use a [dedicated container image](images.md) that -includes only the supported version of Barman Cloud. -::: - -## Recovery of a Postgres Cluster - -In PostgreSQL, *recovery* refers to the process of starting a database instance -from an existing backup. The Barman Cloud Plugin integrates with CloudNativePG -to support both **full recovery** and **Point-in-Time Recovery (PITR)** from an -object store. - -Recovery in this context is *not in-place*: it bootstraps a brand-new -PostgreSQL cluster from a backup and replays the necessary WAL files to reach -the desired recovery target. - -To perform a recovery, define an *external cluster* that references the -appropriate `ObjectStore`, and use it as the source in the `bootstrap` section -of the target cluster: - -```yaml -[...] -spec: - [...] - bootstrap: - recovery: - source: source - externalClusters: - - name: source - plugin: - name: barman-cloud.cloudnative-pg.io - parameters: - barmanObjectName: cluster-example - serverName: cluster-example - [...] -``` - -The critical element here is the `externalClusters` section of the `Cluster` -resource, where the `plugin` stanza instructs CloudNativePG to use the Barman -Cloud Plugin to access the object store for recovery. - -This same mechanism can be used for a variety of scenarios enabled by the -CloudNativePG API, including: - -* **Full cluster recovery** from the latest backup -* **Point-in-Time Recovery (PITR)** -* Bootstrapping **replica clusters** in a distributed topology - -:::tip -For complete instructions and advanced use cases, refer to the official -[Recovery documentation](https://cloudnative-pg.io/documentation/current/recovery/). -::: diff --git a/web/versioned_docs/version-0.5.0/images.md b/web/versioned_docs/version-0.5.0/images.md deleted file mode 100644 index f6c32d3..0000000 --- a/web/versioned_docs/version-0.5.0/images.md +++ /dev/null @@ -1,37 +0,0 @@ ---- -sidebar_position: 99 ---- - -# Container Images - - - -The Barman Cloud Plugin is distributed using two container images: - -- One for deploying the plugin components -- One for the sidecar that runs alongside each PostgreSQL instance in a - CloudNativePG `Cluster` using the plugin - -## Plugin Container Image - -The plugin image contains the logic required to operate the Barman Cloud Plugin -within your Kubernetes environment with CloudNativePG. It is published on the -GitHub Container Registry at `ghcr.io/cloudnative-pg/plugin-barman-cloud`. - -This image is built from the -[`Dockerfile.plugin`](https://github.com/cloudnative-pg/plugin-barman-cloud/blob/main/containers/Dockerfile.plugin) -in the plugin repository. - -## Sidecar Container Image - -The sidecar image is used within each PostgreSQL pod in the cluster. It -includes the latest supported version of Barman Cloud and is responsible for -performing WAL archiving and backups on behalf of CloudNativePG. - -It is available at `ghcr.io/cloudnative-pg/plugin-barman-cloud-sidecar` and is -built from the -[`Dockerfile.sidecar`](https://github.com/cloudnative-pg/plugin-barman-cloud/blob/main/containers/Dockerfile.sidecar). - -These sidecar images are designed to work seamlessly with the -[`minimal` PostgreSQL container images](https://github.com/cloudnative-pg/postgres-containers?tab=readme-ov-file#minimal-images) -maintained by the CloudNativePG Community. diff --git a/web/versioned_docs/version-0.5.0/installation.mdx b/web/versioned_docs/version-0.5.0/installation.mdx deleted file mode 100644 index 85bd41b..0000000 --- a/web/versioned_docs/version-0.5.0/installation.mdx +++ /dev/null @@ -1,109 +0,0 @@ ---- -sidebar_position: 20 ---- - -# Installation - -:::important -1. The plugin **must** be installed in the same namespace as the CloudNativePG - operator (typically `cnpg-system`). - -2. Keep in mind that the operator's **listening namespaces** may differ from its - installation namespace. Double-check this to avoid configuration issues. -::: - -## Verifying the Requirements - -Before installing the plugin, make sure the [requirements](intro.md#requirements) are met. - -### CloudNativePG Version - -Ensure you're running a version of CloudNativePG that is compatible with the -plugin. If installed in the default `cnpg-system` namespace, you can verify the -version with: - -```sh -kubectl get deployment -n cnpg-system cnpg-controller-manager -o yaml \ - | grep ghcr.io/cloudnative-pg/cloudnative-pg -``` - -Example output: - -```output -image: ghcr.io/cloudnative-pg/cloudnative-pg:1.26.0 -``` - -The version **must be 1.26 or newer**. - -### cert-manager - -Use the [cmctl](https://cert-manager.io/docs/reference/cmctl/#installation) -tool to confirm that `cert-manager` is installed and available: - -```sh -cmctl check api -``` - -Example output: - -```output -The cert-manager API is ready -``` - -Both checks are required before proceeding with the installation. - -## Installing the Barman Cloud Plugin - -import { InstallationSnippet } from '@site/src/components/Installation'; - -Install the plugin using `kubectl` by applying the manifest for the latest -release: - - - -Example output: - -```output -customresourcedefinition.apiextensions.k8s.io/objectstores.barmancloud.cnpg.io created -serviceaccount/plugin-barman-cloud created -role.rbac.authorization.k8s.io/leader-election-role created -clusterrole.rbac.authorization.k8s.io/metrics-auth-role created -clusterrole.rbac.authorization.k8s.io/metrics-reader created -clusterrole.rbac.authorization.k8s.io/objectstore-editor-role created -clusterrole.rbac.authorization.k8s.io/objectstore-viewer-role created -clusterrole.rbac.authorization.k8s.io/plugin-barman-cloud created -rolebinding.rbac.authorization.k8s.io/leader-election-rolebinding created -clusterrolebinding.rbac.authorization.k8s.io/metrics-auth-rolebinding created -clusterrolebinding.rbac.authorization.k8s.io/plugin-barman-cloud-binding created -secret/plugin-barman-cloud-8tfddg42gf created -service/barman-cloud created -deployment.apps/barman-cloud configured -certificate.cert-manager.io/barman-cloud-client created -certificate.cert-manager.io/barman-cloud-server created -issuer.cert-manager.io/selfsigned-issuer created -``` - -Finally, check that the deployment is up and running: - -```sh -kubectl rollout status deployment \ - -n cnpg-system barman-cloud -``` - -Example output: - -```output -deployment "barman-cloud" successfully rolled out -``` - -This confirms that the plugin is deployed and ready to use. - -## Testing the latest development snapshot - -You can also test the latest development snapshot of the plugin with the -following command: - -```sh -kubectl apply -f \ - https://raw.githubusercontent.com/cloudnative-pg/plugin-barman-cloud/refs/heads/main/manifest.yaml -``` diff --git a/web/versioned_docs/version-0.5.0/intro.md b/web/versioned_docs/version-0.5.0/intro.md deleted file mode 100644 index f22f383..0000000 --- a/web/versioned_docs/version-0.5.0/intro.md +++ /dev/null @@ -1,67 +0,0 @@ ---- -sidebar_position: 1 -sidebar_label: "Introduction" ---- - -# Barman Cloud Plugin - - - -The **Barman Cloud Plugin** for [CloudNativePG](https://cloudnative-pg.io/) -enables online continuous physical backups of PostgreSQL clusters to object storage -using the `barman-cloud` suite from the [Barman](https://docs.pgbarman.org/release/latest/) -project. - -:::important -If you plan to migrate your existing CloudNativePG cluster to the new -plugin-based approach using the Barman Cloud Plugin, see -["Migrating from Built-in CloudNativePG Backup"](migration.md) -for detailed instructions. -::: - -## Requirements - -To use the Barman Cloud Plugin, you need: - -- [CloudNativePG](https://cloudnative-pg.io) version **1.26** -- [cert-manager](https://cert-manager.io/) to enable TLS communication between - the plugin and the operator - -## Key Features - -This plugin provides the following capabilities: - -- Physical online backup of the data directory -- Physical restore of the data directory -- Write-Ahead Log (WAL) archiving -- WAL restore -- Full cluster recovery -- Point-in-Time Recovery (PITR) -- Seamless integration with replica clusters for bootstrap and WAL restore from archive - -:::important -The Barman Cloud Plugin is designed to **replace the in-tree object storage support** -previously provided via the `.spec.backup.barmanObjectStore` section in the -`Cluster` resource. -Backups created using the in-tree approach are fully supported and compatible -with this plugin. -::: - -## Supported Object Storage Providers - -The plugin works with all storage backends supported by `barman-cloud`, including: - -- **Amazon S3** -- **Google Cloud Storage** -- **Microsoft Azure Blob Storage** - -In addition, the following S3-compatible and simulator solutions have been -tested and verified: - -- [MinIO](https://min.io/) – An S3-compatible storage solution -- [Azurite](https://github.com/Azure/Azurite) – A simulator for Azure Blob Storage -- [fake-gcs-server](https://github.com/fsouza/fake-gcs-server) – A simulator for Google Cloud Storage - -:::tip -For more details, refer to [Object Store Providers](object_stores.md). -::: diff --git a/web/versioned_docs/version-0.5.0/migration.md b/web/versioned_docs/version-0.5.0/migration.md deleted file mode 100644 index 43c4b80..0000000 --- a/web/versioned_docs/version-0.5.0/migration.md +++ /dev/null @@ -1,259 +0,0 @@ ---- -sidebar_position: 40 ---- - -# Migrating from Built-in CloudNativePG Backup - - - -The in-tree support for Barman Cloud in CloudNativePG is **deprecated starting -from version 1.26** and will be removed in a future release. - -If you're currently relying on the built-in Barman Cloud integration, you can -migrate seamlessly to the new **plugin-based architecture** using the Barman -Cloud Plugin, without data loss. Follow these steps: - -- [Install the Barman Cloud Plugin](installation.mdx) -- Create an `ObjectStore` resource by translating the contents of the - `.spec.backup.barmanObjectStore` section from your existing `Cluster` - definition -- Modify the `Cluster` resource in a single atomic change to switch from - in-tree backup to the plugin -- Update any `ScheduledBackup` resources to use the plugin -- Update the `externalClusters` configuration, where applicable - -:::tip -For a working example, refer to [this commit](https://github.com/cloudnative-pg/cnpg-playground/commit/596f30e252896edf8f734991c3538df87630f6f7) -from the [CloudNativePG Playground project](https://github.com/cloudnative-pg/cnpg-playground), -which demonstrates a full migration. -::: - ---- - -## Step 1: Define the `ObjectStore` - -Begin by creating an `ObjectStore` resource in the same namespace as your -PostgreSQL `Cluster`. - -There is a **direct mapping** between the `.spec.backup.barmanObjectStore` -section in CloudNativePG and the `.spec.configuration` field in the -`ObjectStore` CR. The conversion is mostly mechanical, with one key difference: - -:::warning -In the plugin architecture, retention policies are defined as part of the `ObjectStore`. -In contrast, the in-tree implementation defined them at the `Cluster` level. -::: - -If your `Cluster` used `.spec.backup.retentionPolicy`, move that configuration -to `.spec.retentionPolicy` in the `ObjectStore`. - ---- - -### Example - -Here’s an excerpt from a traditional in-tree CloudNativePG backup configuration -taken from the CloudNativePG Playground project: - -```yaml -apiVersion: postgresql.cnpg.io/v1 -kind: Cluster -metadata: - name: pg-eu -spec: - # [...] - backup: - barmanObjectStore: - destinationPath: s3://backups/ - endpointURL: http://minio-eu:9000 - s3Credentials: - accessKeyId: - name: minio-eu - key: ACCESS_KEY_ID - secretAccessKey: - name: minio-eu - key: ACCESS_SECRET_KEY - wal: - compression: gzip -``` - -This configuration translates to the following `ObjectStore` resource for the -plugin: - -```yaml -apiVersion: barmancloud.cnpg.io/v1 -kind: ObjectStore -metadata: - name: minio-eu -spec: - configuration: - destinationPath: s3://backups/ - endpointURL: http://minio-eu:9000 - s3Credentials: - accessKeyId: - name: minio-eu - key: ACCESS_KEY_ID - secretAccessKey: - name: minio-eu - key: ACCESS_SECRET_KEY - wal: - compression: gzip -``` - -As you can see, the contents of `barmanObjectStore` have been copied directly -under the `configuration` field of the `ObjectStore` resource, using the same -secret references. - -## Step 2: Update the `Cluster` for plugin WAL archiving - -Once the `ObjectStore` resource is in place, update the `Cluster` resource as -follows in a single atomic change: - -- Remove the `.spec.backup.barmanObjectStore` section -- Remove `.spec.backup.retentionPolicy` if it was defined (as it is now in the - `ObjectStore`) -- Remove the entire `spec.backup` section if it is now empty -- Add `barman-cloud.cloudnative-pg.io` to the `plugins` list, as described in - [Configuring WAL archiving](usage.md#configuring-wal-archiving) - -This will trigger a rolling update of the `Cluster`, switching continuous -backup from the in-tree implementation to the plugin-based approach. - -### Example - -The updated `pg-eu` cluster will have this configuration instead of the -previous `backup` section: - -```yaml - plugins: - - name: barman-cloud.cloudnative-pg.io - isWALArchiver: true - parameters: - barmanObjectName: minio-eu -``` - ---- - -## Step 3: Update the `ScheduledBackup` - -After switching the `Cluster` to use the plugin, update your `ScheduledBackup` -resources to match. - -Set the backup `method` to `plugin` and reference the plugin name via -`pluginConfiguration`, as shown in ["Performing a base backup"](usage.md#performing-a-base-backup). - -### Example - -Original in-tree `ScheduledBackup`: - -```yaml -apiVersion: postgresql.cnpg.io/v1 -kind: ScheduledBackup -metadata: - name: pg-eu-backup -spec: - cluster: - name: pg-eu - schedule: '0 0 0 * * *' - backupOwnerReference: self -``` - -Updated version using the plugin: - -```yaml -apiVersion: postgresql.cnpg.io/v1 -kind: ScheduledBackup -metadata: - name: pg-eu-backup -spec: - cluster: - name: pg-eu - schedule: '0 0 0 * * *' - backupOwnerReference: self - method: plugin - pluginConfiguration: - name: barman-cloud.cloudnative-pg.io -``` - ---- - -## Step 4: Update the `externalClusters` configuration - -If your `Cluster` relies on one or more external clusters that use the in-tree -Barman Cloud integration, you need to update those configurations to use the -plugin-based architecture. - -When a replica cluster fetches WAL files or base backups from an external -source that used the built-in backup method, follow these steps: - -1. Create a corresponding `ObjectStore` resource for the external cluster, as - shown in [Step 1](#step-1-define-the-objectstore) -2. Update the `externalClusters` section of your replica cluster to use the - plugin instead of the in-tree `barmanObjectStore` field - -### Example - -Consider the original configuration using in-tree Barman Cloud: - -```yaml -apiVersion: postgresql.cnpg.io/v1 -kind: Cluster -metadata: - name: pg-us -spec: - # [...] - externalClusters: - - name: pg-eu - barmanObjectStore: - destinationPath: s3://backups/ - endpointURL: http://minio-eu:9000 - serverName: pg-eu - s3Credentials: - accessKeyId: - name: minio-eu - key: ACCESS_KEY_ID - secretAccessKey: - name: minio-eu - key: ACCESS_SECRET_KEY - wal: - compression: gzip -``` - -Create the `ObjectStore` resource for the external cluster: - -```yaml -apiVersion: barmancloud.cnpg.io/v1 -kind: ObjectStore -metadata: - name: minio-eu -spec: - configuration: - destinationPath: s3://backups/ - endpointURL: http://minio-eu:9000 - s3Credentials: - accessKeyId: - name: minio-eu - key: ACCESS_KEY_ID - secretAccessKey: - name: minio-eu - key: ACCESS_SECRET_KEY - wal: - compression: gzip -``` - -Update the external cluster configuration to use the plugin: - -```yaml -apiVersion: postgresql.cnpg.io/v1 -kind: Cluster -metadata: - name: pg-us -spec: - # [...] - externalClusters: - - name: pg-eu - plugin: - name: barman-cloud.cloudnative-pg.io - parameters: - barmanObjectName: minio-eu - serverName: pg-eu -``` diff --git a/web/versioned_docs/version-0.5.0/misc.md b/web/versioned_docs/version-0.5.0/misc.md deleted file mode 100644 index 4d3cefc..0000000 --- a/web/versioned_docs/version-0.5.0/misc.md +++ /dev/null @@ -1,76 +0,0 @@ ---- -sidebar_position: 90 ---- - -# Miscellaneous - - - -## Backup Object Tagging - -You can attach key-value metadata tags to backup artifacts—such as base -backups, WAL files, and history files—via the `.spec.configuration` section of -the `ObjectStore` resource. - -- `tags`: applied to base backups and WAL files -- `historyTags`: applied to history files only - -### Example - -```yaml -apiVersion: barmancloud.cnpg.io/v1 -kind: ObjectStore -metadata: - name: my-store -spec: - configuration: - [...] - tags: - backupRetentionPolicy: "expire" - historyTags: - backupRetentionPolicy: "keep" - [...] -``` - -## Extra Options for Backup and WAL Archiving - -You can pass additional command-line arguments to `barman-cloud-backup` and -`barman-cloud-wal-archive` using the `additionalCommandArgs` field in the -`ObjectStore` configuration. - -- `.spec.configuration.data.additionalCommandArgs`: for `barman-cloud-backup` -- `.spec.configuration.wal.additionalCommandArgs`: for `barman-cloud-wal-archive` - -Each field accepts a list of string arguments. If an argument is already -configured elsewhere in the plugin, the duplicate will be ignored. - -### Example: Extra Backup Options - -```yaml -kind: ObjectStore -metadata: - name: my-store -spec: - configuration: - data: - additionalCommandArgs: - - "--min-chunk-size=5MB" - - "--read-timeout=60" -``` - -### Example: Extra WAL Archive Options - -```yaml -kind: ObjectStore -metadata: - name: my-store -spec: - configuration: - wal: - additionalCommandArgs: - - "--max-concurrency=1" - - "--read-timeout=60" -``` - -For a complete list of supported options, refer to the -[official Barman Cloud documentation](https://docs.pgbarman.org/release/latest/). diff --git a/web/versioned_docs/version-0.5.0/object_stores.md b/web/versioned_docs/version-0.5.0/object_stores.md deleted file mode 100644 index 29e7b35..0000000 --- a/web/versioned_docs/version-0.5.0/object_stores.md +++ /dev/null @@ -1,465 +0,0 @@ ---- -sidebar_position: 50 ---- - -# Object Store Providers - - - -The Barman Cloud Plugin enables the storage of PostgreSQL cluster backup files -in any object storage service supported by the -[Barman Cloud infrastructure](https://docs.pgbarman.org/release/latest/). - -Currently, Barman Cloud supports the following providers: - -- [Amazon S3](#aws-s3) -- [Microsoft Azure Blob Storage](#azure-blob-storage) -- [Google Cloud Storage](#google-cloud-storage) - -You may also use any S3- or Azure-compatible implementation of the above -services. - -To configure object storage with Barman Cloud, you must define an -[`ObjectStore` object](plugin-barman-cloud.v1.md#objectstore), which -establishes the connection between your PostgreSQL cluster and the object -storage backend. - -Configuration details — particularly around authentication — will vary depending on -the specific object storage provider you are using. - -The following sections detail the setup for each. - ---- - -## AWS S3 - -[AWS Simple Storage Service (S3)](https://aws.amazon.com/s3/) is one of the -most widely adopted object storage solutions. - -The Barman Cloud plugin for CloudNativePG integrates with S3 through two -primary authentication mechanisms: - -- [IAM Roles for Service Accounts (IRSA)](https://docs.aws.amazon.com/eks/latest/userguide/iam-roles-for-service-accounts.html) — - recommended for clusters running on EKS -- Access keys — using `ACCESS_KEY_ID` and `ACCESS_SECRET_KEY` credentials - -### Access Keys - -To authenticate using access keys, you’ll need: - -- `ACCESS_KEY_ID`: the public key used to authenticate to S3 -- `ACCESS_SECRET_KEY`: the corresponding secret key -- `ACCESS_SESSION_TOKEN`: (optional) a temporary session token, if required - -These credentials must be stored securely in a Kubernetes secret: - -```sh -kubectl create secret generic aws-creds \ - --from-literal=ACCESS_KEY_ID= \ - --from-literal=ACCESS_SECRET_KEY= -# --from-literal=ACCESS_SESSION_TOKEN= # if required -``` - -The credentials will be encrypted at rest if your Kubernetes environment -supports it. - -You can then reference the secret in your `ObjectStore` definition: - -```yaml -apiVersion: barmancloud.cnpg.io/v1 -kind: ObjectStore -metadata: - name: aws-store -spec: - configuration: - destinationPath: "s3://BUCKET_NAME/path/to/folder" - s3Credentials: - accessKeyId: - name: aws-creds - key: ACCESS_KEY_ID - secretAccessKey: - name: aws-creds - key: ACCESS_SECRET_KEY - [...] -``` - -### IAM Role for Service Account (IRSA) - -To use IRSA with EKS, configure the service account of the PostgreSQL cluster -with the appropriate annotation: - -```yaml -apiVersion: postgresql.cnpg.io/v1 -kind: Cluster -metadata: - [...] -spec: - serviceAccountTemplate: - metadata: - annotations: - eks.amazonaws.com/role-arn: arn:[...] - [...] -``` - -### S3 Lifecycle Policy - -Barman Cloud uploads backup files to S3 but does not modify them afterward. -To enhance data durability and protect against accidental or malicious loss, -it's recommended to implement the following best practices: - -- Enable object versioning -- Enable object locking to prevent objects from being deleted or overwritten - for a defined period or indefinitely (this provides an additional layer of - protection against accidental deletion and ransomware attacks) -- Set lifecycle rules to expire current versions a few days after your Barman - retention window -- Expire non-current versions after a longer period - -These strategies help you safeguard backups without requiring broad delete -permissions, ensuring both security and compliance with minimal operational -overhead. - - -### S3-Compatible Storage Providers - -You can use S3-compatible services like **MinIO**, **Linode (Akamai) Object Storage**, -or **DigitalOcean Spaces** by specifying a custom `endpointURL`. - -Example with Linode (Akamai) Object Storage (`us-east1`): - -```yaml -apiVersion: barmancloud.cnpg.io/v1 -kind: ObjectStore -metadata: - name: linode-store -spec: - configuration: - destinationPath: "s3://BUCKET_NAME/" - endpointURL: "https://us-east1.linodeobjects.com" - s3Credentials: - [...] - [...] -``` - -Example with DigitalOcean Spaces (SFO3, path-style): - -```yaml -apiVersion: barmancloud.cnpg.io/v1 -kind: ObjectStore -metadata: - name: digitalocean-store -spec: - configuration: - destinationPath: "s3://BUCKET_NAME/path/to/folder" - endpointURL: "https://sfo3.digitaloceanspaces.com" - s3Credentials: - [...] - [...] -``` - -### Using Object Storage with a Private CA - -For object storage services (e.g., MinIO) that use HTTPS with certificates -signed by a private CA, set the `endpointCA` field in the `ObjectStore` -definition. Unless you already have it, create a Kubernetes `Secret` with the -CA bundle: - -```sh -kubectl create secret generic my-ca-secret --from-file=ca.crt -``` - -Then reference it: - -```yaml -apiVersion: barmancloud.cnpg.io/v1 -kind: ObjectStore -metadata: - name: minio-store -spec: - configuration: - endpointURL: - endpointCA: - name: my-ca-secret - key: ca.crt - [...] -``` - - -:::note -If you want `ConfigMaps` and `Secrets` to be **automatically** reloaded by -instances, you can add a label with the key `cnpg.io/reload` to the -`Secrets`/`ConfigMaps`. Otherwise, you will have to reload the instances using the -`kubectl cnpg reload` subcommand. -::: - ---- - -## Azure Blob Storage - -[Azure Blob Storage](https://azure.microsoft.com/en-us/services/storage/blobs/) -is Microsoft’s cloud-based object storage solution. - -Barman Cloud supports the following authentication methods: - -- [Connection String](https://learn.microsoft.com/en-us/azure/storage/common/storage-configure-connection-string) -- Storage Account Name + [Access Key](https://learn.microsoft.com/en-us/azure/storage/common/storage-account-keys-manage) -- Storage Account Name + [SAS Token](https://learn.microsoft.com/en-us/azure/storage/blobs/sas-service-create) -- [Azure AD Workload Identity](https://azure.github.io/azure-workload-identity/docs/introduction.html) - -### Azure AD Workload Identity - -This method avoids storing credentials in Kubernetes via the -`.spec.configuration.inheritFromAzureAD` option: - -```yaml -apiVersion: barmancloud.cnpg.io/v1 -kind: ObjectStore -metadata: - name: azure-store -spec: - configuration: - destinationPath: "" - azureCredentials: - inheritFromAzureAD: true - [...] -``` - -### Access Key, SAS Token, or Connection String - -Store credentials in a Kubernetes secret: - -```sh -kubectl create secret generic azure-creds \ - --from-literal=AZURE_STORAGE_ACCOUNT= \ - --from-literal=AZURE_STORAGE_KEY= \ - --from-literal=AZURE_STORAGE_SAS_TOKEN= \ - --from-literal=AZURE_STORAGE_CONNECTION_STRING= -``` - -Then reference the required keys in your `ObjectStore`: - -```yaml -apiVersion: barmancloud.cnpg.io/v1 -kind: ObjectStore -metadata: - name: azure-store -spec: - configuration: - destinationPath: "" - azureCredentials: - connectionString: - name: azure-creds - key: AZURE_CONNECTION_STRING - storageAccount: - name: azure-creds - key: AZURE_STORAGE_ACCOUNT - storageKey: - name: azure-creds - key: AZURE_STORAGE_KEY - storageSasToken: - name: azure-creds - key: AZURE_STORAGE_SAS_TOKEN - [...] -``` - -For Azure Blob, the destination path format is: - -``` -://..core.windows.net// -``` - -### Azure-Compatible Providers - -If you're using a different implementation (e.g., Azurite or emulator): - -``` -://:/// -``` - ---- - -## Google Cloud Storage - -[Google Cloud Storage](https://cloud.google.com/storage/) is supported with two -authentication modes: - -- **GKE Workload Identity** (recommended inside Google Kubernetes Engine) -- **Service Account JSON key** via the `GOOGLE_APPLICATION_CREDENTIALS` environment variable - -### GKE Workload Identity - -Use the [Workload Identity authentication](https://cloud.google.com/kubernetes-engine/docs/how-to/workload-identity) -when running in GKE: - -1. Set `googleCredentials.gkeEnvironment` to `true` in the `ObjectStore` - resource -2. Annotate the `serviceAccountTemplate` in the `Cluster` resource with the GCP - service account - -For example, in the `ObjectStore` resource: - -```yaml -apiVersion: barmancloud.cnpg.io/v1 -kind: ObjectStore -metadata: - name: google-store -spec: - configuration: - destinationPath: "gs:///" - googleCredentials: - gkeEnvironment: true -``` - -And in the `Cluster` resource: - -```yaml -apiVersion: postgresql.cnpg.io/v1 -kind: Cluster -spec: - serviceAccountTemplate: - metadata: - annotations: - iam.gke.io/gcp-service-account: [...].iam.gserviceaccount.com -``` - -### Service Account JSON Key - -Follow Google’s [authentication setup](https://cloud.google.com/docs/authentication/getting-started), -then: - -```sh -kubectl create secret generic backup-creds --from-file=gcsCredentials=gcs_credentials_file.json -``` - -```yaml -apiVersion: barmancloud.cnpg.io/v1 -kind: ObjectStore -metadata: - name: google-store -spec: - configuration: - destinationPath: "gs:///" - googleCredentials: - applicationCredentials: - name: backup-creds - key: gcsCredentials - [...] -``` - -:::important -This authentication method generates a JSON file within the container -with all the credentials required to access your Google Cloud Storage -bucket. As a result, if someone gains access to the `Pod`, they will also have -write permissions to the bucket. -::: - ---- - - -## MinIO Gateway - -MinIO Gateway can proxy requests to cloud object storage providers like S3 or GCS. -For more information, refer to [MinIO official documentation](https://docs.min.io/). - -### Setup - -Create MinIO access credentials: - -```sh -kubectl create secret generic minio-creds \ - --from-literal=MINIO_ACCESS_KEY= \ - --from-literal=MINIO_SECRET_KEY= -``` - -:::note -Cloud Object Storage credentials will be used only by MinIO Gateway in this -case. -::: - -Expose MinIO Gateway via `ClusterIP`: - -```yaml -apiVersion: v1 -kind: Service -metadata: - name: minio-gateway-service -spec: - type: ClusterIP - ports: - - port: 9000 - targetPort: 9000 - protocol: TCP - selector: - app: minio -``` - -Here follows an excerpt of an example of deployment relaying to S3: - -```yaml -apiVersion: apps/v1 -kind: Deployment -[...] -spec: - containers: - - name: minio - image: minio/minio:RELEASE.2020-06-03T22-13-49Z - args: ["gateway", "s3"] - ports: - - containerPort: 9000 - env: - - name: MINIO_ACCESS_KEY - valueFrom: - secretKeyRef: - name: minio-creds - key: MINIO_ACCESS_KEY - - name: MINIO_SECRET_KEY - valueFrom: - secretKeyRef: - name: minio-creds - key: MINIO_SECRET_KEY - - name: AWS_ACCESS_KEY_ID - valueFrom: - secretKeyRef: - name: aws-creds - key: ACCESS_KEY_ID - - name: AWS_SECRET_ACCESS_KEY - valueFrom: - secretKeyRef: - name: aws-creds - key: ACCESS_SECRET_KEY -# Uncomment the below section if session token is required -# - name: AWS_SESSION_TOKEN -# valueFrom: -# secretKeyRef: -# name: aws-creds -# key: ACCESS_SESSION_TOKEN -``` - -Proceed by configuring MinIO Gateway service as the `endpointURL` in the -`ObjectStore` definition, then choose a bucket name to replace `BUCKET_NAME`: - -```yaml -apiVersion: barmancloud.cnpg.io/v1 -kind: ObjectStore -metadata: - name: minio-store -spec: - configuration: - destinationPath: s3://BUCKET_NAME/ - endpointURL: http://minio-gateway-service:9000 - s3Credentials: - accessKeyId: - name: minio-creds - key: MINIO_ACCESS_KEY - secretAccessKey: - name: minio-creds - key: MINIO_SECRET_KEY - [...] -``` - -:::important -Verify on `s3://BUCKET_NAME/` the presence of archived WAL files before -proceeding with a backup. -::: - ---- diff --git a/web/versioned_docs/version-0.5.0/parameters.md b/web/versioned_docs/version-0.5.0/parameters.md deleted file mode 100644 index ca0cd2b..0000000 --- a/web/versioned_docs/version-0.5.0/parameters.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -sidebar_position: 100 ---- - -# Parameters - - - -The following parameters are available for the Barman Cloud Plugin: - -- `barmanObjectName`: references the `ObjectStore` resource to be used by the - plugin. -- `serverName`: Specifies the server name in the object store. - -:::important -The `serverName` parameter in the `ObjectStore` resource is retained solely for -API compatibility with the in-tree `barmanObjectStore` and must always be left empty. -When needed, use the `serverName` plugin parameter in the Cluster configuration instead. -::: diff --git a/web/versioned_docs/version-0.5.0/plugin-barman-cloud.v1.md b/web/versioned_docs/version-0.5.0/plugin-barman-cloud.v1.md deleted file mode 100644 index 552dc27..0000000 --- a/web/versioned_docs/version-0.5.0/plugin-barman-cloud.v1.md +++ /dev/null @@ -1,105 +0,0 @@ -# API Reference - -## Packages -- [barmancloud.cnpg.io/v1](#barmancloudcnpgiov1) - - -## barmancloud.cnpg.io/v1 - -Package v1 contains API Schema definitions for the barmancloud v1 API group - -### Resource Types -- [ObjectStore](#objectstore) - - - -#### InstanceSidecarConfiguration - - - -InstanceSidecarConfiguration defines the configuration for the sidecar that runs in the instance pods. - - - -_Appears in:_ -- [ObjectStoreSpec](#objectstorespec) - -| Field | Description | Required | Default | Validation | -| --- | --- | --- | --- | --- | -| `env` _[EnvVar](https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.32/#envvar-v1-core) array_ | The environment to be explicitly passed to the sidecar | | | | -| `retentionPolicyIntervalSeconds` _integer_ | The retentionCheckInterval defines the frequency at which the
system checks and enforces retention policies. | | 1800 | | -| `resources` _[ResourceRequirements](https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.32/#resourcerequirements-v1-core)_ | Resources define cpu/memory requests and limits for the sidecar that runs in the instance pods. | | | | - - -#### ObjectStore - - - -ObjectStore is the Schema for the objectstores API. - - - - - -| Field | Description | Required | Default | Validation | -| --- | --- | --- | --- | --- | -| `apiVersion` _string_ | `barmancloud.cnpg.io/v1` | True | | | -| `kind` _string_ | `ObjectStore` | True | | | -| `metadata` _[ObjectMeta](https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.32/#objectmeta-v1-meta)_ | Refer to Kubernetes API documentation for fields of `metadata`. | True | | | -| `spec` _[ObjectStoreSpec](#objectstorespec)_ | Specification of the desired behavior of the ObjectStore.
More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#spec-and-status | True | | | -| `status` _[ObjectStoreStatus](#objectstorestatus)_ | Most recently observed status of the ObjectStore. This data may not be up to
date. Populated by the system. Read-only.
More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#spec-and-status | | | | - - -#### ObjectStoreSpec - - - -ObjectStoreSpec defines the desired state of ObjectStore. - - - -_Appears in:_ -- [ObjectStore](#objectstore) - -| Field | Description | Required | Default | Validation | -| --- | --- | --- | --- | --- | -| `configuration` _[BarmanObjectStoreConfiguration](https://pkg.go.dev/github.com/cloudnative-pg/barman-cloud/pkg/api#BarmanObjectStoreConfiguration)_ | The configuration for the barman-cloud tool suite | True | | | -| `retentionPolicy` _string_ | RetentionPolicy is the retention policy to be used for backups
and WALs (i.e. '60d'). The retention policy is expressed in the form
of `XXu` where `XX` is a positive integer and `u` is in `[dwm]` -
days, weeks, months. | | | Pattern: `^[1-9][0-9]*[dwm]$`
| -| `instanceSidecarConfiguration` _[InstanceSidecarConfiguration](#instancesidecarconfiguration)_ | The configuration for the sidecar that runs in the instance pods | | | | - - -#### ObjectStoreStatus - - - -ObjectStoreStatus defines the observed state of ObjectStore. - - - -_Appears in:_ -- [ObjectStore](#objectstore) - -| Field | Description | Required | Default | Validation | -| --- | --- | --- | --- | --- | -| `serverRecoveryWindow` _object (keys:string, values:[RecoveryWindow](#recoverywindow))_ | ServerRecoveryWindow maps each server to its recovery window | True | | | - - -#### RecoveryWindow - - - -RecoveryWindow represents the time span between the first -recoverability point and the last successful backup of a PostgreSQL -server, defining the period during which data can be restored. - - - -_Appears in:_ -- [ObjectStoreStatus](#objectstorestatus) - -| Field | Description | Required | Default | Validation | -| --- | --- | --- | --- | --- | -| `firstRecoverabilityPoint` _[Time](https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.32/#time-v1-meta)_ | The first recoverability point in a PostgreSQL server refers to
the earliest point in time to which the database can be
restored. | True | | | -| `lastSuccussfulBackupTime` _[Time](https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.32/#time-v1-meta)_ | The last successful backup time | True | | | - - diff --git a/web/versioned_docs/version-0.5.0/retention.md b/web/versioned_docs/version-0.5.0/retention.md deleted file mode 100644 index fefbd08..0000000 --- a/web/versioned_docs/version-0.5.0/retention.md +++ /dev/null @@ -1,38 +0,0 @@ ---- -sidebar_position: 60 ---- - -# Retention Policies - - - -The Barman Cloud Plugin supports **automated cleanup of obsolete backups** via -retention policies, configured in the `.spec.retentionPolicy` field of the -`ObjectStore` resource. - -:::note -This feature uses the `barman-cloud-backup-delete` command with the -`--retention-policy "RECOVERY WINDOW OF {{ value }} {{ unit }}"` syntax. -::: - -#### Example: 30-Day Retention Policy - -```yaml -apiVersion: barmancloud.cnpg.io/v1 -kind: ObjectStore -metadata: - name: my-store -spec: - [...] - retentionPolicy: "30d" -```` - -:::note -A **recovery window retention policy** ensures the cluster can be restored to -any point in time between the calculated *Point of Recoverability* (PoR) and -the latest WAL archive. The PoR is defined as `current time - recovery window`. -The **first valid backup** is the most recent backup completed before the PoR. -Backups older than that are marked as *obsolete* and deleted after the next -backup completes. -::: - diff --git a/web/versioned_docs/version-0.5.0/usage.md b/web/versioned_docs/version-0.5.0/usage.md deleted file mode 100644 index 5a82229..0000000 --- a/web/versioned_docs/version-0.5.0/usage.md +++ /dev/null @@ -1,258 +0,0 @@ ---- -sidebar_position: 30 ---- - -# Using the Barman Cloud Plugin - - - -After [installing the plugin](installation.mdx) in the same namespace as the -CloudNativePG operator, enabling your PostgreSQL cluster to use the Barman -Cloud Plugin involves just a few steps: - -- Defining the object store containing your WAL archive and base backups, using - your preferred [provider](object_stores.md) -- Instructing the Postgres cluster to use the Barman Cloud Plugin - -From that moment, you’ll be able to issue on-demand backups or define a backup -schedule, as well as rely on the object store for recovery operations. - -The rest of this page details each step, using MinIO as object store provider. - -## Defining the `ObjectStore` - -An `ObjectStore` resource must be created for each object store used in your -PostgreSQL architecture. Here's an example configuration using MinIO: - -```yaml -apiVersion: barmancloud.cnpg.io/v1 -kind: ObjectStore -metadata: - name: minio-store -spec: - configuration: - destinationPath: s3://backups/ - endpointURL: http://minio:9000 - s3Credentials: - accessKeyId: - name: minio - key: ACCESS_KEY_ID - secretAccessKey: - name: minio - key: ACCESS_SECRET_KEY - wal: - compression: gzip -``` - -The `.spec.configuration` schema follows the same format as the -[in-tree barman-cloud support](https://pkg.go.dev/github.com/cloudnative-pg/barman-cloud/pkg/api#BarmanObjectStoreConfiguration). -Refer to [the CloudNativePG documentation](https://cloudnative-pg.io/documentation/current/appendixes/backup_barmanobjectstore/) -for additional details. - -:::important -The `serverName` parameter in the `ObjectStore` resource is retained solely for -API compatibility with the in-tree `barmanObjectStore` and must always be left empty. -When needed, use the `serverName` plugin parameter in the Cluster configuration instead. -::: - -## Configuring WAL Archiving - -Once the `ObjectStore` is defined, you can configure your PostgreSQL cluster -to archive WALs by referencing the store in the `.spec.plugins` section: - -```yaml -apiVersion: postgresql.cnpg.io/v1 -kind: Cluster -metadata: - name: cluster-example -spec: - instances: 3 - imagePullPolicy: Always - plugins: - - name: barman-cloud.cloudnative-pg.io - isWALArchiver: true - parameters: - barmanObjectName: minio-store - storage: - size: 1Gi -``` - -This configuration enables both WAL archiving and data directory backups. - -## Performing a Base Backup - -Once WAL archiving is enabled, the cluster is ready for backups. To issue an -on-demand backup, use the following configuration with the plugin method: - -```yaml -apiVersion: postgresql.cnpg.io/v1 -kind: Backup -metadata: - name: backup-example -spec: - cluster: - name: cluster-example - method: plugin - pluginConfiguration: - name: barman-cloud.cloudnative-pg.io -``` - -:::note -You can apply the same concept to the `ScheduledBackup` resource. -::: - -## Restoring a Cluster - -To restore a cluster from an object store, create a new `Cluster` resource that -references the store containing the backup. Below is an example configuration: - -```yaml -apiVersion: postgresql.cnpg.io/v1 -kind: Cluster -metadata: - name: cluster-restore -spec: - instances: 3 - imagePullPolicy: IfNotPresent - bootstrap: - recovery: - source: source - externalClusters: - - name: source - plugin: - name: barman-cloud.cloudnative-pg.io - parameters: - barmanObjectName: minio-store - serverName: cluster-example - storage: - size: 1Gi -``` - -:::important -The above configuration does **not** enable WAL archiving for the restored cluster. -::: - -To enable WAL archiving for the restored cluster, include the `.spec.plugins` -section alongside the `externalClusters.plugin` section, as shown below: - -```yaml -apiVersion: postgresql.cnpg.io/v1 -kind: Cluster -metadata: - name: cluster-restore -spec: - instances: 3 - imagePullPolicy: IfNotPresent - bootstrap: - recovery: - source: source - plugins: - - name: barman-cloud.cloudnative-pg.io - isWALArchiver: true - parameters: - # Backup Object Store (push, read-write) - barmanObjectName: minio-store-bis - externalClusters: - - name: source - plugin: - name: barman-cloud.cloudnative-pg.io - parameters: - # Recovery Object Store (pull, read-only) - barmanObjectName: minio-store - serverName: cluster-example - storage: - size: 1Gi -``` - -The same object store may be used for both transaction log archiving and -restoring a cluster, or you can configure separate stores for these purposes. - -## Configuring Replica Clusters - -You can set up a distributed topology by combining the previously defined -configurations with the `.spec.replica` section. Below is an example of how to -define a replica cluster: - -```yaml -apiVersion: postgresql.cnpg.io/v1 -kind: Cluster -metadata: - name: cluster-dc-a -spec: - instances: 3 - primaryUpdateStrategy: unsupervised - - storage: - storageClass: csi-hostpath-sc - size: 1Gi - - plugins: - - name: barman-cloud.cloudnative-pg.io - isWALArchiver: true - parameters: - barmanObjectName: minio-store-a - - replica: - self: cluster-dc-a - primary: cluster-dc-a - source: cluster-dc-b - - externalClusters: - - name: cluster-dc-a - plugin: - name: barman-cloud.cloudnative-pg.io - parameters: - barmanObjectName: minio-store-a - - - name: cluster-dc-b - plugin: - name: barman-cloud.cloudnative-pg.io - parameters: - barmanObjectName: minio-store-b -``` - -## Configuring the plugin instance sidecar - -The Barman Cloud Plugin runs as a sidecar container next to each PostgreSQL -instance pod. It manages backup, WAL archiving, and restore processes. - -Configuration comes from multiple `ObjectStore` resources: - -1. The one referenced in the - `.spec.plugins` section of the `Cluster`. This is the - object store used for WAL archiving and base backups. -2. The one referenced in the external cluster - used in the `.spec.replica.source` section of the `Cluster`. This is - used by the log-shipping designated primary to get the WAL files. -3. The one referenced in the - `.spec.bootstrap.recovery.source` section of the `Cluster`. Used by - the initial recovery job to create the cluster from an existing backup. - -You can fine-tune sidecar behavior in the `.spec.instanceSidecarConfiguration` -of your ObjectStore. These settings apply to all PostgreSQL instances that use -this object store. Any updates take effect at the next `Cluster` reconciliation, -and could generate a rollout of the `Cluster`. - -```yaml -apiVersion: barmancloud.cnpg.io/v1 -kind: ObjectStore -metadata: - name: minio-store -spec: - configuration: - # [...] - instanceSidecarConfiguration: - retentionPolicyIntervalSeconds: 1800 - resources: - requests: - memory: "XXX" - cpu: "YYY" - limits: - memory: "XXX" - cpu: "YYY" -``` - -:::note -If more than one `ObjectStore` applies, the `instanceSidecarConfiguration` of -the one set in `.spec.plugins` has priority. -::: diff --git a/web/versioned_docs/version-0.6.0/compression.md b/web/versioned_docs/version-0.6.0/compression.md deleted file mode 100644 index 2abbede..0000000 --- a/web/versioned_docs/version-0.6.0/compression.md +++ /dev/null @@ -1,43 +0,0 @@ ---- -sidebar_position: 80 ---- - -# Compression - - - -By default, backups and WAL files are archived **uncompressed**. However, the -Barman Cloud Plugin supports multiple compression algorithms via -`barman-cloud-backup` and `barman-cloud-wal-archive`, allowing you to optimize -for space, speed, or a balance of both. - -### Supported Compression Algorithms - -- `bzip2` -- `gzip` -- `lz4` (WAL only) -- `snappy` -- `xz` (WAL only) -- `zstd` (WAL only) - -Compression settings for base backups and WAL archives are configured -independently. For implementation details, refer to the corresponding API -definitions: - -- [`DataBackupConfiguration`](https://pkg.go.dev/github.com/cloudnative-pg/barman-cloud/pkg/api#DataBackupConfiguration) -- [`WALBackupConfiguration`](https://pkg.go.dev/github.com/cloudnative-pg/barman-cloud/pkg/api#WalBackupConfiguration) - -:::important -Compression impacts both performance and storage efficiency. Choose the right -algorithm based on your recovery time objectives (RTO), storage capacity, and -network throughput. -::: - -## Compression Benchmark (on MinIO) - -| Compression | Backup Time (ms) | Restore Time (ms) | Uncompressed Size (MB) | Compressed Size (MB) | Ratio | -| ----------- | ---------------- | ----------------- | ---------------------- | -------------------- | ----- | -| None | 10,927 | 7,553 | 395 | 395 | 1.0:1 | -| bzip2 | 25,404 | 13,886 | 395 | 67 | 5.9:1 | -| gzip | 116,281 | 3,077 | 395 | 91 | 4.3:1 | -| snappy | 8,134 | 8,341 | 395 | 166 | 2.4:1 | diff --git a/web/versioned_docs/version-0.6.0/concepts.md b/web/versioned_docs/version-0.6.0/concepts.md deleted file mode 100644 index 3832df3..0000000 --- a/web/versioned_docs/version-0.6.0/concepts.md +++ /dev/null @@ -1,177 +0,0 @@ ---- -sidebar_position: 10 ---- - -# Main Concepts - - - -:::important -Before proceeding, make sure to review the following sections of the -CloudNativePG documentation: - -- [**Backup**](https://cloudnative-pg.io/documentation/current/backup/) -- [**WAL Archiving**](https://cloudnative-pg.io/documentation/current/wal_archiving/) -- [**Recovery**](https://cloudnative-pg.io/documentation/current/recovery/) -::: - -The **Barman Cloud Plugin** enables **hot (online) backups** of PostgreSQL -clusters in CloudNativePG through [`barman-cloud`](https://pgbarman.org), -supporting continuous physical backups and WAL archiving to an **object -store**—without interrupting write operations. - -It also supports both **full recovery** and **Point-in-Time Recovery (PITR)** -of a PostgreSQL cluster. - -## The Object Store - -At the core is the [`ObjectStore` custom resource (CRD)](plugin-barman-cloud.v1.md#objectstorespec), -which acts as the interface between the PostgreSQL cluster and the target -object storage system. It allows you to configure: - -- **Authentication and bucket location** via the `.spec.configuration` section -- **WAL archiving** settings—such as compression type, parallelism, and - server-side encryption—under `.spec.configuration.wal` -- **Base backup options**—with similar settings for compression, concurrency, - and encryption—under `.spec.configuration.data` -- **Retention policies** to manage the life-cycle of archived WALs and backups - via `.spec.configuration.retentionPolicy` - -WAL files are archived in the `wals` directory, while base backups are stored -as **tarballs** in the `base` directory, following the -[Barman Cloud convention](https://docs.pgbarman.org/cloud/latest/usage/#object-store-layout). - -The plugin also offers advanced capabilities, including -[backup tagging](misc.md#backup-object-tagging) and -[extra options for backups and WAL archiving](misc.md#extra-options-for-backup-and-wal-archiving). - -:::tip -For details, refer to the -[API reference for the `ObjectStore` resource](plugin-barman-cloud.v1.md#objectstorespec). -::: - -## Integration with a CloudNativePG Cluster - -CloudNativePG can delegate continuous backup and recovery responsibilities to -the **Barman Cloud Plugin** by configuring the `.spec.plugins` section of a -`Cluster` resource. This setup requires a corresponding `ObjectStore` resource -to be defined. - -:::important -While it is technically possible to reuse the same `ObjectStore` for multiple -`Cluster` resources within the same namespace, it is strongly recommended to -dedicate one object store per PostgreSQL cluster to ensure data isolation and -operational clarity. -::: - -The following example demonstrates how to configure a CloudNativePG cluster -named `cluster-example` to use a previously defined `ObjectStore` (also named -`cluster-example`) in the same namespace. Setting `isWALArchiver: true` enables -WAL archiving through the plugin: - -```yaml -apiVersion: postgresql.cnpg.io/v1 -kind: Cluster -metadata: - name: cluster-example -spec: - # Other cluster settings... - plugins: - - name: barman-cloud.cloudnative-pg.io - isWALArchiver: true - parameters: - barmanObjectName: cluster-example -``` - -## Backup of a Postgres Cluster - -Once the object store is defined and the `Cluster` is configured to use the -Barman Cloud Plugin, **WAL archiving is activated immediately** on the -PostgreSQL primary. - -Physical base backups are seamlessly managed by CloudNativePG using the -`Backup` and `ScheduledBackup` resources, respectively for -[on-demand](https://cloudnative-pg.io/documentation/current/backup/#on-demand-backups) -and -[scheduled](https://cloudnative-pg.io/documentation/current/backup/#scheduled-backups) -backups. - -To use the Barman Cloud Plugin, you must set the `method` to `plugin` and -configure the `pluginConfiguration` section as shown: - -```yaml -[...] -spec: - method: plugin - pluginConfiguration: - name: barman-cloud.cloudnative-pg.io - [...] -``` - -With this configuration, CloudNativePG supports: - -- Backups from both **primary** and **standby** instances -- Backups from **designated primaries** in a distributed topology using - [replica clusters](https://cloudnative-pg.io/documentation/current/replica_cluster/) - -:::tip -For details on how to back up from a standby, refer to the official documentation: -[Backup from a standby](https://cloudnative-pg.io/documentation/current/backup/#backup-from-a-standby). -::: - -:::important -Both backup and WAL archiving operations are executed by sidecar containers -running in the same pod as the PostgreSQL `Cluster` primary instance—except -when backups are taken from a standby, in which case the sidecar runs alongside -the standby pod. -The sidecar containers use a [dedicated container image](images.md) that -includes only the supported version of Barman Cloud. -::: - -## Recovery of a Postgres Cluster - -In PostgreSQL, *recovery* refers to the process of starting a database instance -from an existing backup. The Barman Cloud Plugin integrates with CloudNativePG -to support both **full recovery** and **Point-in-Time Recovery (PITR)** from an -object store. - -Recovery in this context is *not in-place*: it bootstraps a brand-new -PostgreSQL cluster from a backup and replays the necessary WAL files to reach -the desired recovery target. - -To perform a recovery, define an *external cluster* that references the -appropriate `ObjectStore`, and use it as the source in the `bootstrap` section -of the target cluster: - -```yaml -[...] -spec: - [...] - bootstrap: - recovery: - source: source - externalClusters: - - name: source - plugin: - name: barman-cloud.cloudnative-pg.io - parameters: - barmanObjectName: cluster-example - serverName: cluster-example - [...] -``` - -The critical element here is the `externalClusters` section of the `Cluster` -resource, where the `plugin` stanza instructs CloudNativePG to use the Barman -Cloud Plugin to access the object store for recovery. - -This same mechanism can be used for a variety of scenarios enabled by the -CloudNativePG API, including: - -* **Full cluster recovery** from the latest backup -* **Point-in-Time Recovery (PITR)** -* Bootstrapping **replica clusters** in a distributed topology - -:::tip -For complete instructions and advanced use cases, refer to the official -[Recovery documentation](https://cloudnative-pg.io/documentation/current/recovery/). -::: diff --git a/web/versioned_docs/version-0.6.0/images.md b/web/versioned_docs/version-0.6.0/images.md deleted file mode 100644 index f6c32d3..0000000 --- a/web/versioned_docs/version-0.6.0/images.md +++ /dev/null @@ -1,37 +0,0 @@ ---- -sidebar_position: 99 ---- - -# Container Images - - - -The Barman Cloud Plugin is distributed using two container images: - -- One for deploying the plugin components -- One for the sidecar that runs alongside each PostgreSQL instance in a - CloudNativePG `Cluster` using the plugin - -## Plugin Container Image - -The plugin image contains the logic required to operate the Barman Cloud Plugin -within your Kubernetes environment with CloudNativePG. It is published on the -GitHub Container Registry at `ghcr.io/cloudnative-pg/plugin-barman-cloud`. - -This image is built from the -[`Dockerfile.plugin`](https://github.com/cloudnative-pg/plugin-barman-cloud/blob/main/containers/Dockerfile.plugin) -in the plugin repository. - -## Sidecar Container Image - -The sidecar image is used within each PostgreSQL pod in the cluster. It -includes the latest supported version of Barman Cloud and is responsible for -performing WAL archiving and backups on behalf of CloudNativePG. - -It is available at `ghcr.io/cloudnative-pg/plugin-barman-cloud-sidecar` and is -built from the -[`Dockerfile.sidecar`](https://github.com/cloudnative-pg/plugin-barman-cloud/blob/main/containers/Dockerfile.sidecar). - -These sidecar images are designed to work seamlessly with the -[`minimal` PostgreSQL container images](https://github.com/cloudnative-pg/postgres-containers?tab=readme-ov-file#minimal-images) -maintained by the CloudNativePG Community. diff --git a/web/versioned_docs/version-0.6.0/intro.md b/web/versioned_docs/version-0.6.0/intro.md deleted file mode 100644 index f22f383..0000000 --- a/web/versioned_docs/version-0.6.0/intro.md +++ /dev/null @@ -1,67 +0,0 @@ ---- -sidebar_position: 1 -sidebar_label: "Introduction" ---- - -# Barman Cloud Plugin - - - -The **Barman Cloud Plugin** for [CloudNativePG](https://cloudnative-pg.io/) -enables online continuous physical backups of PostgreSQL clusters to object storage -using the `barman-cloud` suite from the [Barman](https://docs.pgbarman.org/release/latest/) -project. - -:::important -If you plan to migrate your existing CloudNativePG cluster to the new -plugin-based approach using the Barman Cloud Plugin, see -["Migrating from Built-in CloudNativePG Backup"](migration.md) -for detailed instructions. -::: - -## Requirements - -To use the Barman Cloud Plugin, you need: - -- [CloudNativePG](https://cloudnative-pg.io) version **1.26** -- [cert-manager](https://cert-manager.io/) to enable TLS communication between - the plugin and the operator - -## Key Features - -This plugin provides the following capabilities: - -- Physical online backup of the data directory -- Physical restore of the data directory -- Write-Ahead Log (WAL) archiving -- WAL restore -- Full cluster recovery -- Point-in-Time Recovery (PITR) -- Seamless integration with replica clusters for bootstrap and WAL restore from archive - -:::important -The Barman Cloud Plugin is designed to **replace the in-tree object storage support** -previously provided via the `.spec.backup.barmanObjectStore` section in the -`Cluster` resource. -Backups created using the in-tree approach are fully supported and compatible -with this plugin. -::: - -## Supported Object Storage Providers - -The plugin works with all storage backends supported by `barman-cloud`, including: - -- **Amazon S3** -- **Google Cloud Storage** -- **Microsoft Azure Blob Storage** - -In addition, the following S3-compatible and simulator solutions have been -tested and verified: - -- [MinIO](https://min.io/) – An S3-compatible storage solution -- [Azurite](https://github.com/Azure/Azurite) – A simulator for Azure Blob Storage -- [fake-gcs-server](https://github.com/fsouza/fake-gcs-server) – A simulator for Google Cloud Storage - -:::tip -For more details, refer to [Object Store Providers](object_stores.md). -::: diff --git a/web/versioned_docs/version-0.6.0/migration.md b/web/versioned_docs/version-0.6.0/migration.md deleted file mode 100644 index 43c4b80..0000000 --- a/web/versioned_docs/version-0.6.0/migration.md +++ /dev/null @@ -1,259 +0,0 @@ ---- -sidebar_position: 40 ---- - -# Migrating from Built-in CloudNativePG Backup - - - -The in-tree support for Barman Cloud in CloudNativePG is **deprecated starting -from version 1.26** and will be removed in a future release. - -If you're currently relying on the built-in Barman Cloud integration, you can -migrate seamlessly to the new **plugin-based architecture** using the Barman -Cloud Plugin, without data loss. Follow these steps: - -- [Install the Barman Cloud Plugin](installation.mdx) -- Create an `ObjectStore` resource by translating the contents of the - `.spec.backup.barmanObjectStore` section from your existing `Cluster` - definition -- Modify the `Cluster` resource in a single atomic change to switch from - in-tree backup to the plugin -- Update any `ScheduledBackup` resources to use the plugin -- Update the `externalClusters` configuration, where applicable - -:::tip -For a working example, refer to [this commit](https://github.com/cloudnative-pg/cnpg-playground/commit/596f30e252896edf8f734991c3538df87630f6f7) -from the [CloudNativePG Playground project](https://github.com/cloudnative-pg/cnpg-playground), -which demonstrates a full migration. -::: - ---- - -## Step 1: Define the `ObjectStore` - -Begin by creating an `ObjectStore` resource in the same namespace as your -PostgreSQL `Cluster`. - -There is a **direct mapping** between the `.spec.backup.barmanObjectStore` -section in CloudNativePG and the `.spec.configuration` field in the -`ObjectStore` CR. The conversion is mostly mechanical, with one key difference: - -:::warning -In the plugin architecture, retention policies are defined as part of the `ObjectStore`. -In contrast, the in-tree implementation defined them at the `Cluster` level. -::: - -If your `Cluster` used `.spec.backup.retentionPolicy`, move that configuration -to `.spec.retentionPolicy` in the `ObjectStore`. - ---- - -### Example - -Here’s an excerpt from a traditional in-tree CloudNativePG backup configuration -taken from the CloudNativePG Playground project: - -```yaml -apiVersion: postgresql.cnpg.io/v1 -kind: Cluster -metadata: - name: pg-eu -spec: - # [...] - backup: - barmanObjectStore: - destinationPath: s3://backups/ - endpointURL: http://minio-eu:9000 - s3Credentials: - accessKeyId: - name: minio-eu - key: ACCESS_KEY_ID - secretAccessKey: - name: minio-eu - key: ACCESS_SECRET_KEY - wal: - compression: gzip -``` - -This configuration translates to the following `ObjectStore` resource for the -plugin: - -```yaml -apiVersion: barmancloud.cnpg.io/v1 -kind: ObjectStore -metadata: - name: minio-eu -spec: - configuration: - destinationPath: s3://backups/ - endpointURL: http://minio-eu:9000 - s3Credentials: - accessKeyId: - name: minio-eu - key: ACCESS_KEY_ID - secretAccessKey: - name: minio-eu - key: ACCESS_SECRET_KEY - wal: - compression: gzip -``` - -As you can see, the contents of `barmanObjectStore` have been copied directly -under the `configuration` field of the `ObjectStore` resource, using the same -secret references. - -## Step 2: Update the `Cluster` for plugin WAL archiving - -Once the `ObjectStore` resource is in place, update the `Cluster` resource as -follows in a single atomic change: - -- Remove the `.spec.backup.barmanObjectStore` section -- Remove `.spec.backup.retentionPolicy` if it was defined (as it is now in the - `ObjectStore`) -- Remove the entire `spec.backup` section if it is now empty -- Add `barman-cloud.cloudnative-pg.io` to the `plugins` list, as described in - [Configuring WAL archiving](usage.md#configuring-wal-archiving) - -This will trigger a rolling update of the `Cluster`, switching continuous -backup from the in-tree implementation to the plugin-based approach. - -### Example - -The updated `pg-eu` cluster will have this configuration instead of the -previous `backup` section: - -```yaml - plugins: - - name: barman-cloud.cloudnative-pg.io - isWALArchiver: true - parameters: - barmanObjectName: minio-eu -``` - ---- - -## Step 3: Update the `ScheduledBackup` - -After switching the `Cluster` to use the plugin, update your `ScheduledBackup` -resources to match. - -Set the backup `method` to `plugin` and reference the plugin name via -`pluginConfiguration`, as shown in ["Performing a base backup"](usage.md#performing-a-base-backup). - -### Example - -Original in-tree `ScheduledBackup`: - -```yaml -apiVersion: postgresql.cnpg.io/v1 -kind: ScheduledBackup -metadata: - name: pg-eu-backup -spec: - cluster: - name: pg-eu - schedule: '0 0 0 * * *' - backupOwnerReference: self -``` - -Updated version using the plugin: - -```yaml -apiVersion: postgresql.cnpg.io/v1 -kind: ScheduledBackup -metadata: - name: pg-eu-backup -spec: - cluster: - name: pg-eu - schedule: '0 0 0 * * *' - backupOwnerReference: self - method: plugin - pluginConfiguration: - name: barman-cloud.cloudnative-pg.io -``` - ---- - -## Step 4: Update the `externalClusters` configuration - -If your `Cluster` relies on one or more external clusters that use the in-tree -Barman Cloud integration, you need to update those configurations to use the -plugin-based architecture. - -When a replica cluster fetches WAL files or base backups from an external -source that used the built-in backup method, follow these steps: - -1. Create a corresponding `ObjectStore` resource for the external cluster, as - shown in [Step 1](#step-1-define-the-objectstore) -2. Update the `externalClusters` section of your replica cluster to use the - plugin instead of the in-tree `barmanObjectStore` field - -### Example - -Consider the original configuration using in-tree Barman Cloud: - -```yaml -apiVersion: postgresql.cnpg.io/v1 -kind: Cluster -metadata: - name: pg-us -spec: - # [...] - externalClusters: - - name: pg-eu - barmanObjectStore: - destinationPath: s3://backups/ - endpointURL: http://minio-eu:9000 - serverName: pg-eu - s3Credentials: - accessKeyId: - name: minio-eu - key: ACCESS_KEY_ID - secretAccessKey: - name: minio-eu - key: ACCESS_SECRET_KEY - wal: - compression: gzip -``` - -Create the `ObjectStore` resource for the external cluster: - -```yaml -apiVersion: barmancloud.cnpg.io/v1 -kind: ObjectStore -metadata: - name: minio-eu -spec: - configuration: - destinationPath: s3://backups/ - endpointURL: http://minio-eu:9000 - s3Credentials: - accessKeyId: - name: minio-eu - key: ACCESS_KEY_ID - secretAccessKey: - name: minio-eu - key: ACCESS_SECRET_KEY - wal: - compression: gzip -``` - -Update the external cluster configuration to use the plugin: - -```yaml -apiVersion: postgresql.cnpg.io/v1 -kind: Cluster -metadata: - name: pg-us -spec: - # [...] - externalClusters: - - name: pg-eu - plugin: - name: barman-cloud.cloudnative-pg.io - parameters: - barmanObjectName: minio-eu - serverName: pg-eu -``` diff --git a/web/versioned_docs/version-0.6.0/misc.md b/web/versioned_docs/version-0.6.0/misc.md deleted file mode 100644 index 4d3cefc..0000000 --- a/web/versioned_docs/version-0.6.0/misc.md +++ /dev/null @@ -1,76 +0,0 @@ ---- -sidebar_position: 90 ---- - -# Miscellaneous - - - -## Backup Object Tagging - -You can attach key-value metadata tags to backup artifacts—such as base -backups, WAL files, and history files—via the `.spec.configuration` section of -the `ObjectStore` resource. - -- `tags`: applied to base backups and WAL files -- `historyTags`: applied to history files only - -### Example - -```yaml -apiVersion: barmancloud.cnpg.io/v1 -kind: ObjectStore -metadata: - name: my-store -spec: - configuration: - [...] - tags: - backupRetentionPolicy: "expire" - historyTags: - backupRetentionPolicy: "keep" - [...] -``` - -## Extra Options for Backup and WAL Archiving - -You can pass additional command-line arguments to `barman-cloud-backup` and -`barman-cloud-wal-archive` using the `additionalCommandArgs` field in the -`ObjectStore` configuration. - -- `.spec.configuration.data.additionalCommandArgs`: for `barman-cloud-backup` -- `.spec.configuration.wal.additionalCommandArgs`: for `barman-cloud-wal-archive` - -Each field accepts a list of string arguments. If an argument is already -configured elsewhere in the plugin, the duplicate will be ignored. - -### Example: Extra Backup Options - -```yaml -kind: ObjectStore -metadata: - name: my-store -spec: - configuration: - data: - additionalCommandArgs: - - "--min-chunk-size=5MB" - - "--read-timeout=60" -``` - -### Example: Extra WAL Archive Options - -```yaml -kind: ObjectStore -metadata: - name: my-store -spec: - configuration: - wal: - additionalCommandArgs: - - "--max-concurrency=1" - - "--read-timeout=60" -``` - -For a complete list of supported options, refer to the -[official Barman Cloud documentation](https://docs.pgbarman.org/release/latest/). diff --git a/web/versioned_docs/version-0.6.0/object_stores.md b/web/versioned_docs/version-0.6.0/object_stores.md deleted file mode 100644 index b9d4824..0000000 --- a/web/versioned_docs/version-0.6.0/object_stores.md +++ /dev/null @@ -1,493 +0,0 @@ ---- -sidebar_position: 50 ---- - -# Object Store Providers - - - -The Barman Cloud Plugin enables the storage of PostgreSQL cluster backup files -in any object storage service supported by the -[Barman Cloud infrastructure](https://docs.pgbarman.org/release/latest/). - -Currently, Barman Cloud supports the following providers: - -- [Amazon S3](#aws-s3) -- [Microsoft Azure Blob Storage](#azure-blob-storage) -- [Google Cloud Storage](#google-cloud-storage) - -You may also use any S3- or Azure-compatible implementation of the above -services. - -To configure object storage with Barman Cloud, you must define an -[`ObjectStore` object](plugin-barman-cloud.v1.md#objectstore), which -establishes the connection between your PostgreSQL cluster and the object -storage backend. - -Configuration details — particularly around authentication — will vary depending on -the specific object storage provider you are using. - -The following sections detail the setup for each. - ---- - -## AWS S3 - -[AWS Simple Storage Service (S3)](https://aws.amazon.com/s3/) is one of the -most widely adopted object storage solutions. - -The Barman Cloud plugin for CloudNativePG integrates with S3 through two -primary authentication mechanisms: - -- [IAM Roles for Service Accounts (IRSA)](https://docs.aws.amazon.com/eks/latest/userguide/iam-roles-for-service-accounts.html) — - recommended for clusters running on EKS -- Access keys — using `ACCESS_KEY_ID` and `ACCESS_SECRET_KEY` credentials - -### Access Keys - -To authenticate using access keys, you’ll need: - -- `ACCESS_KEY_ID`: the public key used to authenticate to S3 -- `ACCESS_SECRET_KEY`: the corresponding secret key -- `ACCESS_SESSION_TOKEN`: (optional) a temporary session token, if required - -These credentials must be stored securely in a Kubernetes secret: - -```sh -kubectl create secret generic aws-creds \ - --from-literal=ACCESS_KEY_ID= \ - --from-literal=ACCESS_SECRET_KEY= -# --from-literal=ACCESS_SESSION_TOKEN= # if required -``` - -The credentials will be encrypted at rest if your Kubernetes environment -supports it. - -You can then reference the secret in your `ObjectStore` definition: - -```yaml -apiVersion: barmancloud.cnpg.io/v1 -kind: ObjectStore -metadata: - name: aws-store -spec: - configuration: - destinationPath: "s3://BUCKET_NAME/path/to/folder" - s3Credentials: - accessKeyId: - name: aws-creds - key: ACCESS_KEY_ID - secretAccessKey: - name: aws-creds - key: ACCESS_SECRET_KEY - [...] -``` - -### IAM Role for Service Account (IRSA) - -To use IRSA with EKS, configure the service account of the PostgreSQL cluster -with the appropriate annotation: - -```yaml -apiVersion: postgresql.cnpg.io/v1 -kind: Cluster -metadata: - [...] -spec: - serviceAccountTemplate: - metadata: - annotations: - eks.amazonaws.com/role-arn: arn:[...] - [...] -``` - -### S3 Lifecycle Policy - -Barman Cloud uploads backup files to S3 but does not modify them afterward. -To enhance data durability and protect against accidental or malicious loss, -it's recommended to implement the following best practices: - -- Enable object versioning -- Enable object locking to prevent objects from being deleted or overwritten - for a defined period or indefinitely (this provides an additional layer of - protection against accidental deletion and ransomware attacks) -- Set lifecycle rules to expire current versions a few days after your Barman - retention window -- Expire non-current versions after a longer period - -These strategies help you safeguard backups without requiring broad delete -permissions, ensuring both security and compliance with minimal operational -overhead. - - -### S3-Compatible Storage Providers - -You can use S3-compatible services like **MinIO**, **Linode (Akamai) Object Storage**, -or **DigitalOcean Spaces** by specifying a custom `endpointURL`. - -Example with Linode (Akamai) Object Storage (`us-east1`): - -```yaml -apiVersion: barmancloud.cnpg.io/v1 -kind: ObjectStore -metadata: - name: linode-store -spec: - configuration: - destinationPath: "s3://BUCKET_NAME/" - endpointURL: "https://us-east1.linodeobjects.com" - s3Credentials: - [...] - [...] -``` - -Recent changes to the [boto3 implementation](https://github.com/boto/boto3/issues/4392) -of [Amazon S3 Data Integrity Protections](https://docs.aws.amazon.com/sdkref/latest/guide/feature-dataintegrity.html) -may lead to the `x-amz-content-sha256` error when using the Barman Cloud -Plugin. - -If you encounter this issue (see [GitHub issue #393](https://github.com/cloudnative-pg/plugin-barman-cloud/issues/393)), -you can apply the following workaround by setting specific environment -variables in the `ObjectStore` resource: - -```yaml -apiVersion: barmancloud.cnpg.io/v1 -kind: ObjectStore -metadata: - name: linode-store -spec: - instanceSidecarConfiguration: - env: - - name: AWS_REQUEST_CHECKSUM_CALCULATION - value: when_required - - name: AWS_RESPONSE_CHECKSUM_VALIDATION - value: when_required - [...] -``` - -These settings ensure that checksum calculations and validations are only -applied when explicitly required, avoiding compatibility issues with certain -S3-compatible storage providers. - -Example with DigitalOcean Spaces (SFO3, path-style): - -```yaml -apiVersion: barmancloud.cnpg.io/v1 -kind: ObjectStore -metadata: - name: digitalocean-store -spec: - configuration: - destinationPath: "s3://BUCKET_NAME/path/to/folder" - endpointURL: "https://sfo3.digitaloceanspaces.com" - s3Credentials: - [...] - [...] -``` - -### Using Object Storage with a Private CA - -For object storage services (e.g., MinIO) that use HTTPS with certificates -signed by a private CA, set the `endpointCA` field in the `ObjectStore` -definition. Unless you already have it, create a Kubernetes `Secret` with the -CA bundle: - -```sh -kubectl create secret generic my-ca-secret --from-file=ca.crt -``` - -Then reference it: - -```yaml -apiVersion: barmancloud.cnpg.io/v1 -kind: ObjectStore -metadata: - name: minio-store -spec: - configuration: - endpointURL: - endpointCA: - name: my-ca-secret - key: ca.crt - [...] -``` - - -:::note -If you want `ConfigMaps` and `Secrets` to be **automatically** reloaded by -instances, you can add a label with the key `cnpg.io/reload` to the -`Secrets`/`ConfigMaps`. Otherwise, you will have to reload the instances using the -`kubectl cnpg reload` subcommand. -::: - ---- - -## Azure Blob Storage - -[Azure Blob Storage](https://azure.microsoft.com/en-us/services/storage/blobs/) -is Microsoft’s cloud-based object storage solution. - -Barman Cloud supports the following authentication methods: - -- [Connection String](https://learn.microsoft.com/en-us/azure/storage/common/storage-configure-connection-string) -- Storage Account Name + [Access Key](https://learn.microsoft.com/en-us/azure/storage/common/storage-account-keys-manage) -- Storage Account Name + [SAS Token](https://learn.microsoft.com/en-us/azure/storage/blobs/sas-service-create) -- [Azure AD Workload Identity](https://azure.github.io/azure-workload-identity/docs/introduction.html) - -### Azure AD Workload Identity - -This method avoids storing credentials in Kubernetes via the -`.spec.configuration.inheritFromAzureAD` option: - -```yaml -apiVersion: barmancloud.cnpg.io/v1 -kind: ObjectStore -metadata: - name: azure-store -spec: - configuration: - destinationPath: "" - azureCredentials: - inheritFromAzureAD: true - [...] -``` - -### Access Key, SAS Token, or Connection String - -Store credentials in a Kubernetes secret: - -```sh -kubectl create secret generic azure-creds \ - --from-literal=AZURE_STORAGE_ACCOUNT= \ - --from-literal=AZURE_STORAGE_KEY= \ - --from-literal=AZURE_STORAGE_SAS_TOKEN= \ - --from-literal=AZURE_STORAGE_CONNECTION_STRING= -``` - -Then reference the required keys in your `ObjectStore`: - -```yaml -apiVersion: barmancloud.cnpg.io/v1 -kind: ObjectStore -metadata: - name: azure-store -spec: - configuration: - destinationPath: "" - azureCredentials: - connectionString: - name: azure-creds - key: AZURE_CONNECTION_STRING - storageAccount: - name: azure-creds - key: AZURE_STORAGE_ACCOUNT - storageKey: - name: azure-creds - key: AZURE_STORAGE_KEY - storageSasToken: - name: azure-creds - key: AZURE_STORAGE_SAS_TOKEN - [...] -``` - -For Azure Blob, the destination path format is: - -``` -://..core.windows.net// -``` - -### Azure-Compatible Providers - -If you're using a different implementation (e.g., Azurite or emulator): - -``` -://:/// -``` - ---- - -## Google Cloud Storage - -[Google Cloud Storage](https://cloud.google.com/storage/) is supported with two -authentication modes: - -- **GKE Workload Identity** (recommended inside Google Kubernetes Engine) -- **Service Account JSON key** via the `GOOGLE_APPLICATION_CREDENTIALS` environment variable - -### GKE Workload Identity - -Use the [Workload Identity authentication](https://cloud.google.com/kubernetes-engine/docs/how-to/workload-identity) -when running in GKE: - -1. Set `googleCredentials.gkeEnvironment` to `true` in the `ObjectStore` - resource -2. Annotate the `serviceAccountTemplate` in the `Cluster` resource with the GCP - service account - -For example, in the `ObjectStore` resource: - -```yaml -apiVersion: barmancloud.cnpg.io/v1 -kind: ObjectStore -metadata: - name: google-store -spec: - configuration: - destinationPath: "gs:///" - googleCredentials: - gkeEnvironment: true -``` - -And in the `Cluster` resource: - -```yaml -apiVersion: postgresql.cnpg.io/v1 -kind: Cluster -spec: - serviceAccountTemplate: - metadata: - annotations: - iam.gke.io/gcp-service-account: [...].iam.gserviceaccount.com -``` - -### Service Account JSON Key - -Follow Google’s [authentication setup](https://cloud.google.com/docs/authentication/getting-started), -then: - -```sh -kubectl create secret generic backup-creds --from-file=gcsCredentials=gcs_credentials_file.json -``` - -```yaml -apiVersion: barmancloud.cnpg.io/v1 -kind: ObjectStore -metadata: - name: google-store -spec: - configuration: - destinationPath: "gs:///" - googleCredentials: - applicationCredentials: - name: backup-creds - key: gcsCredentials - [...] -``` - -:::important -This authentication method generates a JSON file within the container -with all the credentials required to access your Google Cloud Storage -bucket. As a result, if someone gains access to the `Pod`, they will also have -write permissions to the bucket. -::: - ---- - - -## MinIO Gateway - -MinIO Gateway can proxy requests to cloud object storage providers like S3 or GCS. -For more information, refer to [MinIO official documentation](https://docs.min.io/). - -### Setup - -Create MinIO access credentials: - -```sh -kubectl create secret generic minio-creds \ - --from-literal=MINIO_ACCESS_KEY= \ - --from-literal=MINIO_SECRET_KEY= -``` - -:::note -Cloud Object Storage credentials will be used only by MinIO Gateway in this -case. -::: - -Expose MinIO Gateway via `ClusterIP`: - -```yaml -apiVersion: v1 -kind: Service -metadata: - name: minio-gateway-service -spec: - type: ClusterIP - ports: - - port: 9000 - targetPort: 9000 - protocol: TCP - selector: - app: minio -``` - -Here follows an excerpt of an example of deployment relaying to S3: - -```yaml -apiVersion: apps/v1 -kind: Deployment -[...] -spec: - containers: - - name: minio - image: minio/minio:RELEASE.2020-06-03T22-13-49Z - args: ["gateway", "s3"] - ports: - - containerPort: 9000 - env: - - name: MINIO_ACCESS_KEY - valueFrom: - secretKeyRef: - name: minio-creds - key: MINIO_ACCESS_KEY - - name: MINIO_SECRET_KEY - valueFrom: - secretKeyRef: - name: minio-creds - key: MINIO_SECRET_KEY - - name: AWS_ACCESS_KEY_ID - valueFrom: - secretKeyRef: - name: aws-creds - key: ACCESS_KEY_ID - - name: AWS_SECRET_ACCESS_KEY - valueFrom: - secretKeyRef: - name: aws-creds - key: ACCESS_SECRET_KEY -# Uncomment the below section if session token is required -# - name: AWS_SESSION_TOKEN -# valueFrom: -# secretKeyRef: -# name: aws-creds -# key: ACCESS_SESSION_TOKEN -``` - -Proceed by configuring MinIO Gateway service as the `endpointURL` in the -`ObjectStore` definition, then choose a bucket name to replace `BUCKET_NAME`: - -```yaml -apiVersion: barmancloud.cnpg.io/v1 -kind: ObjectStore -metadata: - name: minio-store -spec: - configuration: - destinationPath: s3://BUCKET_NAME/ - endpointURL: http://minio-gateway-service:9000 - s3Credentials: - accessKeyId: - name: minio-creds - key: MINIO_ACCESS_KEY - secretAccessKey: - name: minio-creds - key: MINIO_SECRET_KEY - [...] -``` - -:::important -Verify on `s3://BUCKET_NAME/` the presence of archived WAL files before -proceeding with a backup. -::: - ---- diff --git a/web/versioned_docs/version-0.6.0/parameters.md b/web/versioned_docs/version-0.6.0/parameters.md deleted file mode 100644 index ca0cd2b..0000000 --- a/web/versioned_docs/version-0.6.0/parameters.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -sidebar_position: 100 ---- - -# Parameters - - - -The following parameters are available for the Barman Cloud Plugin: - -- `barmanObjectName`: references the `ObjectStore` resource to be used by the - plugin. -- `serverName`: Specifies the server name in the object store. - -:::important -The `serverName` parameter in the `ObjectStore` resource is retained solely for -API compatibility with the in-tree `barmanObjectStore` and must always be left empty. -When needed, use the `serverName` plugin parameter in the Cluster configuration instead. -::: diff --git a/web/versioned_docs/version-0.6.0/plugin-barman-cloud.v1.md b/web/versioned_docs/version-0.6.0/plugin-barman-cloud.v1.md deleted file mode 100644 index 552dc27..0000000 --- a/web/versioned_docs/version-0.6.0/plugin-barman-cloud.v1.md +++ /dev/null @@ -1,105 +0,0 @@ -# API Reference - -## Packages -- [barmancloud.cnpg.io/v1](#barmancloudcnpgiov1) - - -## barmancloud.cnpg.io/v1 - -Package v1 contains API Schema definitions for the barmancloud v1 API group - -### Resource Types -- [ObjectStore](#objectstore) - - - -#### InstanceSidecarConfiguration - - - -InstanceSidecarConfiguration defines the configuration for the sidecar that runs in the instance pods. - - - -_Appears in:_ -- [ObjectStoreSpec](#objectstorespec) - -| Field | Description | Required | Default | Validation | -| --- | --- | --- | --- | --- | -| `env` _[EnvVar](https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.32/#envvar-v1-core) array_ | The environment to be explicitly passed to the sidecar | | | | -| `retentionPolicyIntervalSeconds` _integer_ | The retentionCheckInterval defines the frequency at which the
system checks and enforces retention policies. | | 1800 | | -| `resources` _[ResourceRequirements](https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.32/#resourcerequirements-v1-core)_ | Resources define cpu/memory requests and limits for the sidecar that runs in the instance pods. | | | | - - -#### ObjectStore - - - -ObjectStore is the Schema for the objectstores API. - - - - - -| Field | Description | Required | Default | Validation | -| --- | --- | --- | --- | --- | -| `apiVersion` _string_ | `barmancloud.cnpg.io/v1` | True | | | -| `kind` _string_ | `ObjectStore` | True | | | -| `metadata` _[ObjectMeta](https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.32/#objectmeta-v1-meta)_ | Refer to Kubernetes API documentation for fields of `metadata`. | True | | | -| `spec` _[ObjectStoreSpec](#objectstorespec)_ | Specification of the desired behavior of the ObjectStore.
More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#spec-and-status | True | | | -| `status` _[ObjectStoreStatus](#objectstorestatus)_ | Most recently observed status of the ObjectStore. This data may not be up to
date. Populated by the system. Read-only.
More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#spec-and-status | | | | - - -#### ObjectStoreSpec - - - -ObjectStoreSpec defines the desired state of ObjectStore. - - - -_Appears in:_ -- [ObjectStore](#objectstore) - -| Field | Description | Required | Default | Validation | -| --- | --- | --- | --- | --- | -| `configuration` _[BarmanObjectStoreConfiguration](https://pkg.go.dev/github.com/cloudnative-pg/barman-cloud/pkg/api#BarmanObjectStoreConfiguration)_ | The configuration for the barman-cloud tool suite | True | | | -| `retentionPolicy` _string_ | RetentionPolicy is the retention policy to be used for backups
and WALs (i.e. '60d'). The retention policy is expressed in the form
of `XXu` where `XX` is a positive integer and `u` is in `[dwm]` -
days, weeks, months. | | | Pattern: `^[1-9][0-9]*[dwm]$`
| -| `instanceSidecarConfiguration` _[InstanceSidecarConfiguration](#instancesidecarconfiguration)_ | The configuration for the sidecar that runs in the instance pods | | | | - - -#### ObjectStoreStatus - - - -ObjectStoreStatus defines the observed state of ObjectStore. - - - -_Appears in:_ -- [ObjectStore](#objectstore) - -| Field | Description | Required | Default | Validation | -| --- | --- | --- | --- | --- | -| `serverRecoveryWindow` _object (keys:string, values:[RecoveryWindow](#recoverywindow))_ | ServerRecoveryWindow maps each server to its recovery window | True | | | - - -#### RecoveryWindow - - - -RecoveryWindow represents the time span between the first -recoverability point and the last successful backup of a PostgreSQL -server, defining the period during which data can be restored. - - - -_Appears in:_ -- [ObjectStoreStatus](#objectstorestatus) - -| Field | Description | Required | Default | Validation | -| --- | --- | --- | --- | --- | -| `firstRecoverabilityPoint` _[Time](https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.32/#time-v1-meta)_ | The first recoverability point in a PostgreSQL server refers to
the earliest point in time to which the database can be
restored. | True | | | -| `lastSuccussfulBackupTime` _[Time](https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.32/#time-v1-meta)_ | The last successful backup time | True | | | - - diff --git a/web/versioned_docs/version-0.6.0/retention.md b/web/versioned_docs/version-0.6.0/retention.md deleted file mode 100644 index fefbd08..0000000 --- a/web/versioned_docs/version-0.6.0/retention.md +++ /dev/null @@ -1,38 +0,0 @@ ---- -sidebar_position: 60 ---- - -# Retention Policies - - - -The Barman Cloud Plugin supports **automated cleanup of obsolete backups** via -retention policies, configured in the `.spec.retentionPolicy` field of the -`ObjectStore` resource. - -:::note -This feature uses the `barman-cloud-backup-delete` command with the -`--retention-policy "RECOVERY WINDOW OF {{ value }} {{ unit }}"` syntax. -::: - -#### Example: 30-Day Retention Policy - -```yaml -apiVersion: barmancloud.cnpg.io/v1 -kind: ObjectStore -metadata: - name: my-store -spec: - [...] - retentionPolicy: "30d" -```` - -:::note -A **recovery window retention policy** ensures the cluster can be restored to -any point in time between the calculated *Point of Recoverability* (PoR) and -the latest WAL archive. The PoR is defined as `current time - recovery window`. -The **first valid backup** is the most recent backup completed before the PoR. -Backups older than that are marked as *obsolete* and deleted after the next -backup completes. -::: - diff --git a/web/versioned_docs/version-0.6.0/usage.md b/web/versioned_docs/version-0.6.0/usage.md deleted file mode 100644 index 5a82229..0000000 --- a/web/versioned_docs/version-0.6.0/usage.md +++ /dev/null @@ -1,258 +0,0 @@ ---- -sidebar_position: 30 ---- - -# Using the Barman Cloud Plugin - - - -After [installing the plugin](installation.mdx) in the same namespace as the -CloudNativePG operator, enabling your PostgreSQL cluster to use the Barman -Cloud Plugin involves just a few steps: - -- Defining the object store containing your WAL archive and base backups, using - your preferred [provider](object_stores.md) -- Instructing the Postgres cluster to use the Barman Cloud Plugin - -From that moment, you’ll be able to issue on-demand backups or define a backup -schedule, as well as rely on the object store for recovery operations. - -The rest of this page details each step, using MinIO as object store provider. - -## Defining the `ObjectStore` - -An `ObjectStore` resource must be created for each object store used in your -PostgreSQL architecture. Here's an example configuration using MinIO: - -```yaml -apiVersion: barmancloud.cnpg.io/v1 -kind: ObjectStore -metadata: - name: minio-store -spec: - configuration: - destinationPath: s3://backups/ - endpointURL: http://minio:9000 - s3Credentials: - accessKeyId: - name: minio - key: ACCESS_KEY_ID - secretAccessKey: - name: minio - key: ACCESS_SECRET_KEY - wal: - compression: gzip -``` - -The `.spec.configuration` schema follows the same format as the -[in-tree barman-cloud support](https://pkg.go.dev/github.com/cloudnative-pg/barman-cloud/pkg/api#BarmanObjectStoreConfiguration). -Refer to [the CloudNativePG documentation](https://cloudnative-pg.io/documentation/current/appendixes/backup_barmanobjectstore/) -for additional details. - -:::important -The `serverName` parameter in the `ObjectStore` resource is retained solely for -API compatibility with the in-tree `barmanObjectStore` and must always be left empty. -When needed, use the `serverName` plugin parameter in the Cluster configuration instead. -::: - -## Configuring WAL Archiving - -Once the `ObjectStore` is defined, you can configure your PostgreSQL cluster -to archive WALs by referencing the store in the `.spec.plugins` section: - -```yaml -apiVersion: postgresql.cnpg.io/v1 -kind: Cluster -metadata: - name: cluster-example -spec: - instances: 3 - imagePullPolicy: Always - plugins: - - name: barman-cloud.cloudnative-pg.io - isWALArchiver: true - parameters: - barmanObjectName: minio-store - storage: - size: 1Gi -``` - -This configuration enables both WAL archiving and data directory backups. - -## Performing a Base Backup - -Once WAL archiving is enabled, the cluster is ready for backups. To issue an -on-demand backup, use the following configuration with the plugin method: - -```yaml -apiVersion: postgresql.cnpg.io/v1 -kind: Backup -metadata: - name: backup-example -spec: - cluster: - name: cluster-example - method: plugin - pluginConfiguration: - name: barman-cloud.cloudnative-pg.io -``` - -:::note -You can apply the same concept to the `ScheduledBackup` resource. -::: - -## Restoring a Cluster - -To restore a cluster from an object store, create a new `Cluster` resource that -references the store containing the backup. Below is an example configuration: - -```yaml -apiVersion: postgresql.cnpg.io/v1 -kind: Cluster -metadata: - name: cluster-restore -spec: - instances: 3 - imagePullPolicy: IfNotPresent - bootstrap: - recovery: - source: source - externalClusters: - - name: source - plugin: - name: barman-cloud.cloudnative-pg.io - parameters: - barmanObjectName: minio-store - serverName: cluster-example - storage: - size: 1Gi -``` - -:::important -The above configuration does **not** enable WAL archiving for the restored cluster. -::: - -To enable WAL archiving for the restored cluster, include the `.spec.plugins` -section alongside the `externalClusters.plugin` section, as shown below: - -```yaml -apiVersion: postgresql.cnpg.io/v1 -kind: Cluster -metadata: - name: cluster-restore -spec: - instances: 3 - imagePullPolicy: IfNotPresent - bootstrap: - recovery: - source: source - plugins: - - name: barman-cloud.cloudnative-pg.io - isWALArchiver: true - parameters: - # Backup Object Store (push, read-write) - barmanObjectName: minio-store-bis - externalClusters: - - name: source - plugin: - name: barman-cloud.cloudnative-pg.io - parameters: - # Recovery Object Store (pull, read-only) - barmanObjectName: minio-store - serverName: cluster-example - storage: - size: 1Gi -``` - -The same object store may be used for both transaction log archiving and -restoring a cluster, or you can configure separate stores for these purposes. - -## Configuring Replica Clusters - -You can set up a distributed topology by combining the previously defined -configurations with the `.spec.replica` section. Below is an example of how to -define a replica cluster: - -```yaml -apiVersion: postgresql.cnpg.io/v1 -kind: Cluster -metadata: - name: cluster-dc-a -spec: - instances: 3 - primaryUpdateStrategy: unsupervised - - storage: - storageClass: csi-hostpath-sc - size: 1Gi - - plugins: - - name: barman-cloud.cloudnative-pg.io - isWALArchiver: true - parameters: - barmanObjectName: minio-store-a - - replica: - self: cluster-dc-a - primary: cluster-dc-a - source: cluster-dc-b - - externalClusters: - - name: cluster-dc-a - plugin: - name: barman-cloud.cloudnative-pg.io - parameters: - barmanObjectName: minio-store-a - - - name: cluster-dc-b - plugin: - name: barman-cloud.cloudnative-pg.io - parameters: - barmanObjectName: minio-store-b -``` - -## Configuring the plugin instance sidecar - -The Barman Cloud Plugin runs as a sidecar container next to each PostgreSQL -instance pod. It manages backup, WAL archiving, and restore processes. - -Configuration comes from multiple `ObjectStore` resources: - -1. The one referenced in the - `.spec.plugins` section of the `Cluster`. This is the - object store used for WAL archiving and base backups. -2. The one referenced in the external cluster - used in the `.spec.replica.source` section of the `Cluster`. This is - used by the log-shipping designated primary to get the WAL files. -3. The one referenced in the - `.spec.bootstrap.recovery.source` section of the `Cluster`. Used by - the initial recovery job to create the cluster from an existing backup. - -You can fine-tune sidecar behavior in the `.spec.instanceSidecarConfiguration` -of your ObjectStore. These settings apply to all PostgreSQL instances that use -this object store. Any updates take effect at the next `Cluster` reconciliation, -and could generate a rollout of the `Cluster`. - -```yaml -apiVersion: barmancloud.cnpg.io/v1 -kind: ObjectStore -metadata: - name: minio-store -spec: - configuration: - # [...] - instanceSidecarConfiguration: - retentionPolicyIntervalSeconds: 1800 - resources: - requests: - memory: "XXX" - cpu: "YYY" - limits: - memory: "XXX" - cpu: "YYY" -``` - -:::note -If more than one `ObjectStore` applies, the `instanceSidecarConfiguration` of -the one set in `.spec.plugins` has priority. -::: diff --git a/web/versioned_docs/version-0.7.0/compression.md b/web/versioned_docs/version-0.7.0/compression.md deleted file mode 100644 index 2abbede..0000000 --- a/web/versioned_docs/version-0.7.0/compression.md +++ /dev/null @@ -1,43 +0,0 @@ ---- -sidebar_position: 80 ---- - -# Compression - - - -By default, backups and WAL files are archived **uncompressed**. However, the -Barman Cloud Plugin supports multiple compression algorithms via -`barman-cloud-backup` and `barman-cloud-wal-archive`, allowing you to optimize -for space, speed, or a balance of both. - -### Supported Compression Algorithms - -- `bzip2` -- `gzip` -- `lz4` (WAL only) -- `snappy` -- `xz` (WAL only) -- `zstd` (WAL only) - -Compression settings for base backups and WAL archives are configured -independently. For implementation details, refer to the corresponding API -definitions: - -- [`DataBackupConfiguration`](https://pkg.go.dev/github.com/cloudnative-pg/barman-cloud/pkg/api#DataBackupConfiguration) -- [`WALBackupConfiguration`](https://pkg.go.dev/github.com/cloudnative-pg/barman-cloud/pkg/api#WalBackupConfiguration) - -:::important -Compression impacts both performance and storage efficiency. Choose the right -algorithm based on your recovery time objectives (RTO), storage capacity, and -network throughput. -::: - -## Compression Benchmark (on MinIO) - -| Compression | Backup Time (ms) | Restore Time (ms) | Uncompressed Size (MB) | Compressed Size (MB) | Ratio | -| ----------- | ---------------- | ----------------- | ---------------------- | -------------------- | ----- | -| None | 10,927 | 7,553 | 395 | 395 | 1.0:1 | -| bzip2 | 25,404 | 13,886 | 395 | 67 | 5.9:1 | -| gzip | 116,281 | 3,077 | 395 | 91 | 4.3:1 | -| snappy | 8,134 | 8,341 | 395 | 166 | 2.4:1 | diff --git a/web/versioned_docs/version-0.7.0/concepts.md b/web/versioned_docs/version-0.7.0/concepts.md deleted file mode 100644 index 3832df3..0000000 --- a/web/versioned_docs/version-0.7.0/concepts.md +++ /dev/null @@ -1,177 +0,0 @@ ---- -sidebar_position: 10 ---- - -# Main Concepts - - - -:::important -Before proceeding, make sure to review the following sections of the -CloudNativePG documentation: - -- [**Backup**](https://cloudnative-pg.io/documentation/current/backup/) -- [**WAL Archiving**](https://cloudnative-pg.io/documentation/current/wal_archiving/) -- [**Recovery**](https://cloudnative-pg.io/documentation/current/recovery/) -::: - -The **Barman Cloud Plugin** enables **hot (online) backups** of PostgreSQL -clusters in CloudNativePG through [`barman-cloud`](https://pgbarman.org), -supporting continuous physical backups and WAL archiving to an **object -store**—without interrupting write operations. - -It also supports both **full recovery** and **Point-in-Time Recovery (PITR)** -of a PostgreSQL cluster. - -## The Object Store - -At the core is the [`ObjectStore` custom resource (CRD)](plugin-barman-cloud.v1.md#objectstorespec), -which acts as the interface between the PostgreSQL cluster and the target -object storage system. It allows you to configure: - -- **Authentication and bucket location** via the `.spec.configuration` section -- **WAL archiving** settings—such as compression type, parallelism, and - server-side encryption—under `.spec.configuration.wal` -- **Base backup options**—with similar settings for compression, concurrency, - and encryption—under `.spec.configuration.data` -- **Retention policies** to manage the life-cycle of archived WALs and backups - via `.spec.configuration.retentionPolicy` - -WAL files are archived in the `wals` directory, while base backups are stored -as **tarballs** in the `base` directory, following the -[Barman Cloud convention](https://docs.pgbarman.org/cloud/latest/usage/#object-store-layout). - -The plugin also offers advanced capabilities, including -[backup tagging](misc.md#backup-object-tagging) and -[extra options for backups and WAL archiving](misc.md#extra-options-for-backup-and-wal-archiving). - -:::tip -For details, refer to the -[API reference for the `ObjectStore` resource](plugin-barman-cloud.v1.md#objectstorespec). -::: - -## Integration with a CloudNativePG Cluster - -CloudNativePG can delegate continuous backup and recovery responsibilities to -the **Barman Cloud Plugin** by configuring the `.spec.plugins` section of a -`Cluster` resource. This setup requires a corresponding `ObjectStore` resource -to be defined. - -:::important -While it is technically possible to reuse the same `ObjectStore` for multiple -`Cluster` resources within the same namespace, it is strongly recommended to -dedicate one object store per PostgreSQL cluster to ensure data isolation and -operational clarity. -::: - -The following example demonstrates how to configure a CloudNativePG cluster -named `cluster-example` to use a previously defined `ObjectStore` (also named -`cluster-example`) in the same namespace. Setting `isWALArchiver: true` enables -WAL archiving through the plugin: - -```yaml -apiVersion: postgresql.cnpg.io/v1 -kind: Cluster -metadata: - name: cluster-example -spec: - # Other cluster settings... - plugins: - - name: barman-cloud.cloudnative-pg.io - isWALArchiver: true - parameters: - barmanObjectName: cluster-example -``` - -## Backup of a Postgres Cluster - -Once the object store is defined and the `Cluster` is configured to use the -Barman Cloud Plugin, **WAL archiving is activated immediately** on the -PostgreSQL primary. - -Physical base backups are seamlessly managed by CloudNativePG using the -`Backup` and `ScheduledBackup` resources, respectively for -[on-demand](https://cloudnative-pg.io/documentation/current/backup/#on-demand-backups) -and -[scheduled](https://cloudnative-pg.io/documentation/current/backup/#scheduled-backups) -backups. - -To use the Barman Cloud Plugin, you must set the `method` to `plugin` and -configure the `pluginConfiguration` section as shown: - -```yaml -[...] -spec: - method: plugin - pluginConfiguration: - name: barman-cloud.cloudnative-pg.io - [...] -``` - -With this configuration, CloudNativePG supports: - -- Backups from both **primary** and **standby** instances -- Backups from **designated primaries** in a distributed topology using - [replica clusters](https://cloudnative-pg.io/documentation/current/replica_cluster/) - -:::tip -For details on how to back up from a standby, refer to the official documentation: -[Backup from a standby](https://cloudnative-pg.io/documentation/current/backup/#backup-from-a-standby). -::: - -:::important -Both backup and WAL archiving operations are executed by sidecar containers -running in the same pod as the PostgreSQL `Cluster` primary instance—except -when backups are taken from a standby, in which case the sidecar runs alongside -the standby pod. -The sidecar containers use a [dedicated container image](images.md) that -includes only the supported version of Barman Cloud. -::: - -## Recovery of a Postgres Cluster - -In PostgreSQL, *recovery* refers to the process of starting a database instance -from an existing backup. The Barman Cloud Plugin integrates with CloudNativePG -to support both **full recovery** and **Point-in-Time Recovery (PITR)** from an -object store. - -Recovery in this context is *not in-place*: it bootstraps a brand-new -PostgreSQL cluster from a backup and replays the necessary WAL files to reach -the desired recovery target. - -To perform a recovery, define an *external cluster* that references the -appropriate `ObjectStore`, and use it as the source in the `bootstrap` section -of the target cluster: - -```yaml -[...] -spec: - [...] - bootstrap: - recovery: - source: source - externalClusters: - - name: source - plugin: - name: barman-cloud.cloudnative-pg.io - parameters: - barmanObjectName: cluster-example - serverName: cluster-example - [...] -``` - -The critical element here is the `externalClusters` section of the `Cluster` -resource, where the `plugin` stanza instructs CloudNativePG to use the Barman -Cloud Plugin to access the object store for recovery. - -This same mechanism can be used for a variety of scenarios enabled by the -CloudNativePG API, including: - -* **Full cluster recovery** from the latest backup -* **Point-in-Time Recovery (PITR)** -* Bootstrapping **replica clusters** in a distributed topology - -:::tip -For complete instructions and advanced use cases, refer to the official -[Recovery documentation](https://cloudnative-pg.io/documentation/current/recovery/). -::: diff --git a/web/versioned_docs/version-0.7.0/images.md b/web/versioned_docs/version-0.7.0/images.md deleted file mode 100644 index f6c32d3..0000000 --- a/web/versioned_docs/version-0.7.0/images.md +++ /dev/null @@ -1,37 +0,0 @@ ---- -sidebar_position: 99 ---- - -# Container Images - - - -The Barman Cloud Plugin is distributed using two container images: - -- One for deploying the plugin components -- One for the sidecar that runs alongside each PostgreSQL instance in a - CloudNativePG `Cluster` using the plugin - -## Plugin Container Image - -The plugin image contains the logic required to operate the Barman Cloud Plugin -within your Kubernetes environment with CloudNativePG. It is published on the -GitHub Container Registry at `ghcr.io/cloudnative-pg/plugin-barman-cloud`. - -This image is built from the -[`Dockerfile.plugin`](https://github.com/cloudnative-pg/plugin-barman-cloud/blob/main/containers/Dockerfile.plugin) -in the plugin repository. - -## Sidecar Container Image - -The sidecar image is used within each PostgreSQL pod in the cluster. It -includes the latest supported version of Barman Cloud and is responsible for -performing WAL archiving and backups on behalf of CloudNativePG. - -It is available at `ghcr.io/cloudnative-pg/plugin-barman-cloud-sidecar` and is -built from the -[`Dockerfile.sidecar`](https://github.com/cloudnative-pg/plugin-barman-cloud/blob/main/containers/Dockerfile.sidecar). - -These sidecar images are designed to work seamlessly with the -[`minimal` PostgreSQL container images](https://github.com/cloudnative-pg/postgres-containers?tab=readme-ov-file#minimal-images) -maintained by the CloudNativePG Community. diff --git a/web/versioned_docs/version-0.7.0/installation.mdx b/web/versioned_docs/version-0.7.0/installation.mdx deleted file mode 100644 index 027d1e8..0000000 --- a/web/versioned_docs/version-0.7.0/installation.mdx +++ /dev/null @@ -1,109 +0,0 @@ ---- -sidebar_position: 20 ---- - -# Installation - -:::important -1. The plugin **must** be installed in the same namespace as the CloudNativePG - operator (typically `cnpg-system`). - -2. Keep in mind that the operator's **listening namespaces** may differ from its - installation namespace. Double-check this to avoid configuration issues. -::: - -## Verifying the Requirements - -Before installing the plugin, make sure the [requirements](intro.md#requirements) are met. - -### CloudNativePG Version - -Ensure you're running a version of CloudNativePG that is compatible with the -plugin. If installed in the default `cnpg-system` namespace, you can verify the -version with: - -```sh -kubectl get deployment -n cnpg-system cnpg-controller-manager \ - -o jsonpath="{.spec.template.spec.containers[*].image}" -``` - -Example output: - -```output -ghcr.io/cloudnative-pg/cloudnative-pg:1.26.0 -``` - -The version **must be 1.26 or newer**. - -### cert-manager - -Use the [cmctl](https://cert-manager.io/docs/reference/cmctl/#installation) -tool to confirm that `cert-manager` is installed and available: - -```sh -cmctl check api -``` - -Example output: - -```output -The cert-manager API is ready -``` - -Both checks are required before proceeding with the installation. - -## Installing the Barman Cloud Plugin - -import { InstallationSnippet } from '@site/src/components/Installation'; - -Install the plugin using `kubectl` by applying the manifest for the latest -release: - - - -Example output: - -```output -customresourcedefinition.apiextensions.k8s.io/objectstores.barmancloud.cnpg.io created -serviceaccount/plugin-barman-cloud created -role.rbac.authorization.k8s.io/leader-election-role created -clusterrole.rbac.authorization.k8s.io/metrics-auth-role created -clusterrole.rbac.authorization.k8s.io/metrics-reader created -clusterrole.rbac.authorization.k8s.io/objectstore-editor-role created -clusterrole.rbac.authorization.k8s.io/objectstore-viewer-role created -clusterrole.rbac.authorization.k8s.io/plugin-barman-cloud created -rolebinding.rbac.authorization.k8s.io/leader-election-rolebinding created -clusterrolebinding.rbac.authorization.k8s.io/metrics-auth-rolebinding created -clusterrolebinding.rbac.authorization.k8s.io/plugin-barman-cloud-binding created -secret/plugin-barman-cloud-8tfddg42gf created -service/barman-cloud created -deployment.apps/barman-cloud configured -certificate.cert-manager.io/barman-cloud-client created -certificate.cert-manager.io/barman-cloud-server created -issuer.cert-manager.io/selfsigned-issuer created -``` - -Finally, check that the deployment is up and running: - -```sh -kubectl rollout status deployment \ - -n cnpg-system barman-cloud -``` - -Example output: - -```output -deployment "barman-cloud" successfully rolled out -``` - -This confirms that the plugin is deployed and ready to use. - -## Testing the latest development snapshot - -You can also test the latest development snapshot of the plugin with the -following command: - -```sh -kubectl apply -f \ - https://raw.githubusercontent.com/cloudnative-pg/plugin-barman-cloud/refs/heads/main/manifest.yaml -``` diff --git a/web/versioned_docs/version-0.7.0/intro.md b/web/versioned_docs/version-0.7.0/intro.md deleted file mode 100644 index 9781d0d..0000000 --- a/web/versioned_docs/version-0.7.0/intro.md +++ /dev/null @@ -1,86 +0,0 @@ ---- -sidebar_position: 1 -sidebar_label: "Introduction" ---- - -# Barman Cloud Plugin - - - -The **Barman Cloud Plugin** for [CloudNativePG](https://cloudnative-pg.io/) -enables online continuous physical backups of PostgreSQL clusters to object storage -using the `barman-cloud` suite from the [Barman](https://docs.pgbarman.org/release/latest/) -project. - -:::important -If you plan to migrate your existing CloudNativePG cluster to the new -plugin-based approach using the Barman Cloud Plugin, see -["Migrating from Built-in CloudNativePG Backup"](migration.md) -for detailed instructions. -::: - -## Requirements - -Before using the Barman Cloud Plugin, ensure that the following components are -installed and properly configured: - -- [CloudNativePG](https://cloudnative-pg.io) version 1.26 or later - - - We strongly recommend version 1.27.0 or later, which includes improved - error handling and status reporting for the plugin. - - If you are running an earlier release, refer to the - [upgrade guide](https://cloudnative-pg.io/documentation/current/installation_upgrade). - -- [cert-manager](https://cert-manager.io/) - - - The recommended way to enable secure TLS communication between the plugin - and the operator. - - Alternatively, you can provide your own certificate bundles. See the - [CloudNativePG documentation on TLS configuration](https://cloudnative-pg.io/documentation/current/cnpg_i/#configuring-tls-certificates). - -- [`kubectl-cnpg`](https://cloudnative-pg.io/documentation/current/kubectl-plugin/) - plugin (optional but recommended) - - - Simplifies debugging and monitoring with additional status and inspection - commands. - - Multiple installation options are available in the - [installation guide](https://cloudnative-pg.io/documentation/current/kubectl-plugin/#install). - -## Key Features - -This plugin provides the following capabilities: - -- Physical online backup of the data directory -- Physical restore of the data directory -- Write-Ahead Log (WAL) archiving -- WAL restore -- Full cluster recovery -- Point-in-Time Recovery (PITR) -- Seamless integration with replica clusters for bootstrap and WAL restore from archive - -:::important -The Barman Cloud Plugin is designed to **replace the in-tree object storage support** -previously provided via the `.spec.backup.barmanObjectStore` section in the -`Cluster` resource. -Backups created using the in-tree approach are fully supported and compatible -with this plugin. -::: - -## Supported Object Storage Providers - -The plugin works with all storage backends supported by `barman-cloud`, including: - -- **Amazon S3** -- **Google Cloud Storage** -- **Microsoft Azure Blob Storage** - -In addition, the following S3-compatible and simulator solutions have been -tested and verified: - -- [MinIO](https://min.io/) – An S3-compatible storage solution -- [Azurite](https://github.com/Azure/Azurite) – A simulator for Azure Blob Storage -- [fake-gcs-server](https://github.com/fsouza/fake-gcs-server) – A simulator for Google Cloud Storage - -:::tip -For more details, refer to [Object Store Providers](object_stores.md). -::: diff --git a/web/versioned_docs/version-0.7.0/migration.md b/web/versioned_docs/version-0.7.0/migration.md deleted file mode 100644 index 43c4b80..0000000 --- a/web/versioned_docs/version-0.7.0/migration.md +++ /dev/null @@ -1,259 +0,0 @@ ---- -sidebar_position: 40 ---- - -# Migrating from Built-in CloudNativePG Backup - - - -The in-tree support for Barman Cloud in CloudNativePG is **deprecated starting -from version 1.26** and will be removed in a future release. - -If you're currently relying on the built-in Barman Cloud integration, you can -migrate seamlessly to the new **plugin-based architecture** using the Barman -Cloud Plugin, without data loss. Follow these steps: - -- [Install the Barman Cloud Plugin](installation.mdx) -- Create an `ObjectStore` resource by translating the contents of the - `.spec.backup.barmanObjectStore` section from your existing `Cluster` - definition -- Modify the `Cluster` resource in a single atomic change to switch from - in-tree backup to the plugin -- Update any `ScheduledBackup` resources to use the plugin -- Update the `externalClusters` configuration, where applicable - -:::tip -For a working example, refer to [this commit](https://github.com/cloudnative-pg/cnpg-playground/commit/596f30e252896edf8f734991c3538df87630f6f7) -from the [CloudNativePG Playground project](https://github.com/cloudnative-pg/cnpg-playground), -which demonstrates a full migration. -::: - ---- - -## Step 1: Define the `ObjectStore` - -Begin by creating an `ObjectStore` resource in the same namespace as your -PostgreSQL `Cluster`. - -There is a **direct mapping** between the `.spec.backup.barmanObjectStore` -section in CloudNativePG and the `.spec.configuration` field in the -`ObjectStore` CR. The conversion is mostly mechanical, with one key difference: - -:::warning -In the plugin architecture, retention policies are defined as part of the `ObjectStore`. -In contrast, the in-tree implementation defined them at the `Cluster` level. -::: - -If your `Cluster` used `.spec.backup.retentionPolicy`, move that configuration -to `.spec.retentionPolicy` in the `ObjectStore`. - ---- - -### Example - -Here’s an excerpt from a traditional in-tree CloudNativePG backup configuration -taken from the CloudNativePG Playground project: - -```yaml -apiVersion: postgresql.cnpg.io/v1 -kind: Cluster -metadata: - name: pg-eu -spec: - # [...] - backup: - barmanObjectStore: - destinationPath: s3://backups/ - endpointURL: http://minio-eu:9000 - s3Credentials: - accessKeyId: - name: minio-eu - key: ACCESS_KEY_ID - secretAccessKey: - name: minio-eu - key: ACCESS_SECRET_KEY - wal: - compression: gzip -``` - -This configuration translates to the following `ObjectStore` resource for the -plugin: - -```yaml -apiVersion: barmancloud.cnpg.io/v1 -kind: ObjectStore -metadata: - name: minio-eu -spec: - configuration: - destinationPath: s3://backups/ - endpointURL: http://minio-eu:9000 - s3Credentials: - accessKeyId: - name: minio-eu - key: ACCESS_KEY_ID - secretAccessKey: - name: minio-eu - key: ACCESS_SECRET_KEY - wal: - compression: gzip -``` - -As you can see, the contents of `barmanObjectStore` have been copied directly -under the `configuration` field of the `ObjectStore` resource, using the same -secret references. - -## Step 2: Update the `Cluster` for plugin WAL archiving - -Once the `ObjectStore` resource is in place, update the `Cluster` resource as -follows in a single atomic change: - -- Remove the `.spec.backup.barmanObjectStore` section -- Remove `.spec.backup.retentionPolicy` if it was defined (as it is now in the - `ObjectStore`) -- Remove the entire `spec.backup` section if it is now empty -- Add `barman-cloud.cloudnative-pg.io` to the `plugins` list, as described in - [Configuring WAL archiving](usage.md#configuring-wal-archiving) - -This will trigger a rolling update of the `Cluster`, switching continuous -backup from the in-tree implementation to the plugin-based approach. - -### Example - -The updated `pg-eu` cluster will have this configuration instead of the -previous `backup` section: - -```yaml - plugins: - - name: barman-cloud.cloudnative-pg.io - isWALArchiver: true - parameters: - barmanObjectName: minio-eu -``` - ---- - -## Step 3: Update the `ScheduledBackup` - -After switching the `Cluster` to use the plugin, update your `ScheduledBackup` -resources to match. - -Set the backup `method` to `plugin` and reference the plugin name via -`pluginConfiguration`, as shown in ["Performing a base backup"](usage.md#performing-a-base-backup). - -### Example - -Original in-tree `ScheduledBackup`: - -```yaml -apiVersion: postgresql.cnpg.io/v1 -kind: ScheduledBackup -metadata: - name: pg-eu-backup -spec: - cluster: - name: pg-eu - schedule: '0 0 0 * * *' - backupOwnerReference: self -``` - -Updated version using the plugin: - -```yaml -apiVersion: postgresql.cnpg.io/v1 -kind: ScheduledBackup -metadata: - name: pg-eu-backup -spec: - cluster: - name: pg-eu - schedule: '0 0 0 * * *' - backupOwnerReference: self - method: plugin - pluginConfiguration: - name: barman-cloud.cloudnative-pg.io -``` - ---- - -## Step 4: Update the `externalClusters` configuration - -If your `Cluster` relies on one or more external clusters that use the in-tree -Barman Cloud integration, you need to update those configurations to use the -plugin-based architecture. - -When a replica cluster fetches WAL files or base backups from an external -source that used the built-in backup method, follow these steps: - -1. Create a corresponding `ObjectStore` resource for the external cluster, as - shown in [Step 1](#step-1-define-the-objectstore) -2. Update the `externalClusters` section of your replica cluster to use the - plugin instead of the in-tree `barmanObjectStore` field - -### Example - -Consider the original configuration using in-tree Barman Cloud: - -```yaml -apiVersion: postgresql.cnpg.io/v1 -kind: Cluster -metadata: - name: pg-us -spec: - # [...] - externalClusters: - - name: pg-eu - barmanObjectStore: - destinationPath: s3://backups/ - endpointURL: http://minio-eu:9000 - serverName: pg-eu - s3Credentials: - accessKeyId: - name: minio-eu - key: ACCESS_KEY_ID - secretAccessKey: - name: minio-eu - key: ACCESS_SECRET_KEY - wal: - compression: gzip -``` - -Create the `ObjectStore` resource for the external cluster: - -```yaml -apiVersion: barmancloud.cnpg.io/v1 -kind: ObjectStore -metadata: - name: minio-eu -spec: - configuration: - destinationPath: s3://backups/ - endpointURL: http://minio-eu:9000 - s3Credentials: - accessKeyId: - name: minio-eu - key: ACCESS_KEY_ID - secretAccessKey: - name: minio-eu - key: ACCESS_SECRET_KEY - wal: - compression: gzip -``` - -Update the external cluster configuration to use the plugin: - -```yaml -apiVersion: postgresql.cnpg.io/v1 -kind: Cluster -metadata: - name: pg-us -spec: - # [...] - externalClusters: - - name: pg-eu - plugin: - name: barman-cloud.cloudnative-pg.io - parameters: - barmanObjectName: minio-eu - serverName: pg-eu -``` diff --git a/web/versioned_docs/version-0.7.0/misc.md b/web/versioned_docs/version-0.7.0/misc.md deleted file mode 100644 index 4d3cefc..0000000 --- a/web/versioned_docs/version-0.7.0/misc.md +++ /dev/null @@ -1,76 +0,0 @@ ---- -sidebar_position: 90 ---- - -# Miscellaneous - - - -## Backup Object Tagging - -You can attach key-value metadata tags to backup artifacts—such as base -backups, WAL files, and history files—via the `.spec.configuration` section of -the `ObjectStore` resource. - -- `tags`: applied to base backups and WAL files -- `historyTags`: applied to history files only - -### Example - -```yaml -apiVersion: barmancloud.cnpg.io/v1 -kind: ObjectStore -metadata: - name: my-store -spec: - configuration: - [...] - tags: - backupRetentionPolicy: "expire" - historyTags: - backupRetentionPolicy: "keep" - [...] -``` - -## Extra Options for Backup and WAL Archiving - -You can pass additional command-line arguments to `barman-cloud-backup` and -`barman-cloud-wal-archive` using the `additionalCommandArgs` field in the -`ObjectStore` configuration. - -- `.spec.configuration.data.additionalCommandArgs`: for `barman-cloud-backup` -- `.spec.configuration.wal.additionalCommandArgs`: for `barman-cloud-wal-archive` - -Each field accepts a list of string arguments. If an argument is already -configured elsewhere in the plugin, the duplicate will be ignored. - -### Example: Extra Backup Options - -```yaml -kind: ObjectStore -metadata: - name: my-store -spec: - configuration: - data: - additionalCommandArgs: - - "--min-chunk-size=5MB" - - "--read-timeout=60" -``` - -### Example: Extra WAL Archive Options - -```yaml -kind: ObjectStore -metadata: - name: my-store -spec: - configuration: - wal: - additionalCommandArgs: - - "--max-concurrency=1" - - "--read-timeout=60" -``` - -For a complete list of supported options, refer to the -[official Barman Cloud documentation](https://docs.pgbarman.org/release/latest/). diff --git a/web/versioned_docs/version-0.7.0/object_stores.md b/web/versioned_docs/version-0.7.0/object_stores.md deleted file mode 100644 index 74e0473..0000000 --- a/web/versioned_docs/version-0.7.0/object_stores.md +++ /dev/null @@ -1,454 +0,0 @@ ---- -sidebar_position: 50 ---- - -# Object Store Providers - - - -The Barman Cloud Plugin enables the storage of PostgreSQL cluster backup files -in any object storage service supported by the -[Barman Cloud infrastructure](https://docs.pgbarman.org/release/latest/). - -Currently, Barman Cloud supports the following providers: - -- [Amazon S3](#aws-s3) -- [Microsoft Azure Blob Storage](#azure-blob-storage) -- [Google Cloud Storage](#google-cloud-storage) - -You may also use any S3- or Azure-compatible implementation of the above -services. - -To configure object storage with Barman Cloud, you must define an -[`ObjectStore` object](plugin-barman-cloud.v1.md#objectstore), which -establishes the connection between your PostgreSQL cluster and the object -storage backend. - -Configuration details — particularly around authentication — will vary depending on -the specific object storage provider you are using. - -The following sections detail the setup for each. - ---- - -## AWS S3 - -[AWS Simple Storage Service (S3)](https://aws.amazon.com/s3/) is one of the -most widely adopted object storage solutions. - -The Barman Cloud plugin for CloudNativePG integrates with S3 through two -primary authentication mechanisms: - -- [IAM Roles for Service Accounts (IRSA)](https://docs.aws.amazon.com/eks/latest/userguide/iam-roles-for-service-accounts.html) — - recommended for clusters running on EKS -- Access keys — using `ACCESS_KEY_ID` and `ACCESS_SECRET_KEY` credentials - -### Access Keys - -To authenticate using access keys, you’ll need: - -- `ACCESS_KEY_ID`: the public key used to authenticate to S3 -- `ACCESS_SECRET_KEY`: the corresponding secret key -- `ACCESS_SESSION_TOKEN`: (optional) a temporary session token, if required - -These credentials must be stored securely in a Kubernetes secret: - -```sh -kubectl create secret generic aws-creds \ - --from-literal=ACCESS_KEY_ID= \ - --from-literal=ACCESS_SECRET_KEY= -# --from-literal=ACCESS_SESSION_TOKEN= # if required -``` - -The credentials will be encrypted at rest if your Kubernetes environment -supports it. - -You can then reference the secret in your `ObjectStore` definition: - -```yaml -apiVersion: barmancloud.cnpg.io/v1 -kind: ObjectStore -metadata: - name: aws-store -spec: - configuration: - destinationPath: "s3://BUCKET_NAME/path/to/folder" - s3Credentials: - accessKeyId: - name: aws-creds - key: ACCESS_KEY_ID - secretAccessKey: - name: aws-creds - key: ACCESS_SECRET_KEY - [...] -``` - -### IAM Role for Service Account (IRSA) - -To use IRSA with EKS, configure the service account of the PostgreSQL cluster -with the appropriate annotation: - -```yaml -apiVersion: postgresql.cnpg.io/v1 -kind: Cluster -metadata: - [...] -spec: - serviceAccountTemplate: - metadata: - annotations: - eks.amazonaws.com/role-arn: arn:[...] - [...] -``` - -### S3 Lifecycle Policy - -Barman Cloud uploads backup files to S3 but does not modify them afterward. -To enhance data durability and protect against accidental or malicious loss, -it's recommended to implement the following best practices: - -- Enable object versioning -- Enable object locking to prevent objects from being deleted or overwritten - for a defined period or indefinitely (this provides an additional layer of - protection against accidental deletion and ransomware attacks) -- Set lifecycle rules to expire current versions a few days after your Barman - retention window -- Expire non-current versions after a longer period - -These strategies help you safeguard backups without requiring broad delete -permissions, ensuring both security and compliance with minimal operational -overhead. - - -### S3-Compatible Storage Providers - -You can use S3-compatible services like **MinIO**, **Linode (Akamai) Object Storage**, -or **DigitalOcean Spaces** by specifying a custom `endpointURL`. - -Example with Linode (Akamai) Object Storage (`us-east1`): - -```yaml -apiVersion: barmancloud.cnpg.io/v1 -kind: ObjectStore -metadata: - name: linode-store -spec: - configuration: - destinationPath: "s3://BUCKET_NAME/" - endpointURL: "https://us-east1.linodeobjects.com" - s3Credentials: - [...] - [...] -``` - -Recent changes to the [boto3 implementation](https://github.com/boto/boto3/issues/4392) -of [Amazon S3 Data Integrity Protections](https://docs.aws.amazon.com/sdkref/latest/guide/feature-dataintegrity.html) -may lead to the `x-amz-content-sha256` error when using the Barman Cloud -Plugin. - -If you encounter this issue (see [GitHub issue #393](https://github.com/cloudnative-pg/plugin-barman-cloud/issues/393)), -you can apply the following workaround by setting specific environment -variables in the `ObjectStore` resource: - -```yaml -apiVersion: barmancloud.cnpg.io/v1 -kind: ObjectStore -metadata: - name: linode-store -spec: - instanceSidecarConfiguration: - env: - - name: AWS_REQUEST_CHECKSUM_CALCULATION - value: when_required - - name: AWS_RESPONSE_CHECKSUM_VALIDATION - value: when_required - [...] -``` - -These settings ensure that checksum calculations and validations are only -applied when explicitly required, avoiding compatibility issues with certain -S3-compatible storage providers. - -Example with DigitalOcean Spaces (SFO3, path-style): - -```yaml -apiVersion: barmancloud.cnpg.io/v1 -kind: ObjectStore -metadata: - name: digitalocean-store -spec: - configuration: - destinationPath: "s3://BUCKET_NAME/path/to/folder" - endpointURL: "https://sfo3.digitaloceanspaces.com" - s3Credentials: - [...] - [...] -``` - -### Using Object Storage with a Private CA - -For object storage services (e.g., MinIO) that use HTTPS with certificates -signed by a private CA, set the `endpointCA` field in the `ObjectStore` -definition. Unless you already have it, create a Kubernetes `Secret` with the -CA bundle: - -```sh -kubectl create secret generic my-ca-secret --from-file=ca.crt -``` - -Then reference it: - -```yaml -apiVersion: barmancloud.cnpg.io/v1 -kind: ObjectStore -metadata: - name: minio-store -spec: - configuration: - endpointURL: - endpointCA: - name: my-ca-secret - key: ca.crt - [...] -``` - - -:::note -If you want `ConfigMaps` and `Secrets` to be **automatically** reloaded by -instances, you can add a label with the key `cnpg.io/reload` to the -`Secrets`/`ConfigMaps`. Otherwise, you will have to reload the instances using the -`kubectl cnpg reload` subcommand. -::: - ---- - -## Azure Blob Storage - -[Azure Blob Storage](https://azure.microsoft.com/en-us/services/storage/blobs/) -is Microsoft’s cloud-based object storage solution. - -Barman Cloud supports the following authentication methods: - -- [Connection String](https://learn.microsoft.com/en-us/azure/storage/common/storage-configure-connection-string) -- Storage Account Name + [Access Key](https://learn.microsoft.com/en-us/azure/storage/common/storage-account-keys-manage) -- Storage Account Name + [SAS Token](https://learn.microsoft.com/en-us/azure/storage/blobs/sas-service-create) -- [Azure AD Workload Identity](https://azure.github.io/azure-workload-identity/docs/introduction.html) - -### Azure AD Workload Identity - -This method avoids storing credentials in Kubernetes via the -`.spec.configuration.inheritFromAzureAD` option: - -```yaml -apiVersion: barmancloud.cnpg.io/v1 -kind: ObjectStore -metadata: - name: azure-store -spec: - configuration: - destinationPath: "" - azureCredentials: - inheritFromAzureAD: true - [...] -``` - -### Access Key, SAS Token, or Connection String - -Store credentials in a Kubernetes secret: - -```sh -kubectl create secret generic azure-creds \ - --from-literal=AZURE_STORAGE_ACCOUNT= \ - --from-literal=AZURE_STORAGE_KEY= \ - --from-literal=AZURE_STORAGE_SAS_TOKEN= \ - --from-literal=AZURE_STORAGE_CONNECTION_STRING= -``` - -Then reference the required keys in your `ObjectStore`: - -```yaml -apiVersion: barmancloud.cnpg.io/v1 -kind: ObjectStore -metadata: - name: azure-store -spec: - configuration: - destinationPath: "" - azureCredentials: - connectionString: - name: azure-creds - key: AZURE_CONNECTION_STRING - storageAccount: - name: azure-creds - key: AZURE_STORAGE_ACCOUNT - storageKey: - name: azure-creds - key: AZURE_STORAGE_KEY - storageSasToken: - name: azure-creds - key: AZURE_STORAGE_SAS_TOKEN - [...] -``` - -For Azure Blob, the destination path format is: - -``` -://..core.windows.net// -``` - -### Azure-Compatible Providers - -If you're using a different implementation (e.g., Azurite or emulator): - -``` -://:/// -``` - ---- - -## Google Cloud Storage - -[Google Cloud Storage](https://cloud.google.com/storage/) is supported with two -authentication modes: - -- **GKE Workload Identity** (recommended inside Google Kubernetes Engine) -- **Service Account JSON key** via the `GOOGLE_APPLICATION_CREDENTIALS` environment variable - -### GKE Workload Identity - -Use the [Workload Identity authentication](https://cloud.google.com/kubernetes-engine/docs/how-to/workload-identity) -when running in GKE: - -1. Set `googleCredentials.gkeEnvironment` to `true` in the `ObjectStore` - resource -2. Annotate the `serviceAccountTemplate` in the `Cluster` resource with the GCP - service account - -For example, in the `ObjectStore` resource: - -```yaml -apiVersion: barmancloud.cnpg.io/v1 -kind: ObjectStore -metadata: - name: google-store -spec: - configuration: - destinationPath: "gs:///" - googleCredentials: - gkeEnvironment: true -``` - -And in the `Cluster` resource: - -```yaml -apiVersion: postgresql.cnpg.io/v1 -kind: Cluster -spec: - serviceAccountTemplate: - metadata: - annotations: - iam.gke.io/gcp-service-account: [...].iam.gserviceaccount.com -``` - -### Service Account JSON Key - -Follow Google’s [authentication setup](https://cloud.google.com/docs/authentication/getting-started), -then: - -```sh -kubectl create secret generic backup-creds --from-file=gcsCredentials=gcs_credentials_file.json -``` - -```yaml -apiVersion: barmancloud.cnpg.io/v1 -kind: ObjectStore -metadata: - name: google-store -spec: - configuration: - destinationPath: "gs:///" - googleCredentials: - applicationCredentials: - name: backup-creds - key: gcsCredentials - [...] -``` - -:::important -This authentication method generates a JSON file within the container -with all the credentials required to access your Google Cloud Storage -bucket. As a result, if someone gains access to the `Pod`, they will also have -write permissions to the bucket. -::: - ---- - - -## MinIO Object Store - -In order to use the Tenant resource you first need to deploy the -[MinIO operator](https://docs.min.io/community/minio-object-store/operations/deployments/installation.html). -For the latest documentation of MinIO, please refer to the -[MinIO official documentation](https://docs.min.io/community/minio-object-store/). - -MinIO Object Store's API is compatible with S3, and the default configuration of the Tenant -will create these services: -- `-console` on port 9090 (with autocert) or 9443 (without autocert) -- `-hl` on port 9000 -Where `` is the `metadata.name` you assigned to your Tenant resource. - -:::note -The `-console` service will only be available if you have enabled the -[MinIO Console](https://docs.min.io/community/minio-object-store/administration/minio-console.html). - -For example, the following Tenant: -```yml -apiVersion: minio.min.io/v2 -kind: Tenant -metadata: - name: cnpg-backups -spec: - [...] -``` -would have services called `cnpg-backups-console` and `cnpg-backups-hl` respectively. - -The `console` service is for managing the tenant, while the `hl` service exposes the S3 -compatible API. If your tenant is configured with `requestAutoCert` you will communicate -to these services over HTTPS, if not you will use HTTP. - -For authentication you can use your username and password, or create an access key. -Whichever method you choose, it has to be stored as a secret. - -```sh -kubectl create secret generic minio-creds \ - --from-literal=MINIO_ACCESS_KEY= \ - --from-literal=MINIO_SECRET_KEY= -``` - -Finally, create the Barman ObjectStore: - -```yaml -apiVersion: barmancloud.cnpg.io/v1 -kind: ObjectStore -metadata: - name: minio-store -spec: - configuration: - destinationPath: s3://BUCKET_NAME/ - endpointURL: http://-hl:9000 - s3Credentials: - accessKeyId: - name: minio-creds - key: MINIO_ACCESS_KEY - secretAccessKey: - name: minio-creds - key: MINIO_SECRET_KEY - [...] -``` - -:::important -Verify on `s3://BUCKET_NAME/` the presence of archived WAL files before -proceeding with a backup. -::: - ---- diff --git a/web/versioned_docs/version-0.7.0/parameters.md b/web/versioned_docs/version-0.7.0/parameters.md deleted file mode 100644 index ca0cd2b..0000000 --- a/web/versioned_docs/version-0.7.0/parameters.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -sidebar_position: 100 ---- - -# Parameters - - - -The following parameters are available for the Barman Cloud Plugin: - -- `barmanObjectName`: references the `ObjectStore` resource to be used by the - plugin. -- `serverName`: Specifies the server name in the object store. - -:::important -The `serverName` parameter in the `ObjectStore` resource is retained solely for -API compatibility with the in-tree `barmanObjectStore` and must always be left empty. -When needed, use the `serverName` plugin parameter in the Cluster configuration instead. -::: diff --git a/web/versioned_docs/version-0.7.0/plugin-barman-cloud.v1.md b/web/versioned_docs/version-0.7.0/plugin-barman-cloud.v1.md deleted file mode 100644 index 7bd607c..0000000 --- a/web/versioned_docs/version-0.7.0/plugin-barman-cloud.v1.md +++ /dev/null @@ -1,108 +0,0 @@ -# API Reference - -## Packages -- [barmancloud.cnpg.io/v1](#barmancloudcnpgiov1) - - -## barmancloud.cnpg.io/v1 - -Package v1 contains API Schema definitions for the barmancloud v1 API group - -### Resource Types -- [ObjectStore](#objectstore) - - - -#### InstanceSidecarConfiguration - - - -InstanceSidecarConfiguration defines the configuration for the sidecar that runs in the instance pods. - - - -_Appears in:_ -- [ObjectStoreSpec](#objectstorespec) - -| Field | Description | Required | Default | Validation | -| --- | --- | --- | --- | --- | -| `env` _[EnvVar](https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.32/#envvar-v1-core) array_ | The environment to be explicitly passed to the sidecar | | | | -| `retentionPolicyIntervalSeconds` _integer_ | The retentionCheckInterval defines the frequency at which the
system checks and enforces retention policies. | | 1800 | | -| `resources` _[ResourceRequirements](https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.32/#resourcerequirements-v1-core)_ | Resources define cpu/memory requests and limits for the sidecar that runs in the instance pods. | | | | -| `additionalContainerArgs` _string array_ | AdditionalContainerArgs is an optional list of command-line arguments
to be passed to the sidecar container when it starts.
The provided arguments are appended to the container’s default arguments. | | | | -| `logLevel` _string_ | The log level for PostgreSQL instances. Valid values are: `error`, `warning`, `info` (default), `debug`, `trace` | | info | Enum: [error warning info debug trace]
| - - -#### ObjectStore - - - -ObjectStore is the Schema for the objectstores API. - - - - - -| Field | Description | Required | Default | Validation | -| --- | --- | --- | --- | --- | -| `apiVersion` _string_ | `barmancloud.cnpg.io/v1` | True | | | -| `kind` _string_ | `ObjectStore` | True | | | -| `metadata` _[ObjectMeta](https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.32/#objectmeta-v1-meta)_ | Refer to Kubernetes API documentation for fields of `metadata`. | True | | | -| `spec` _[ObjectStoreSpec](#objectstorespec)_ | Specification of the desired behavior of the ObjectStore.
More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#spec-and-status | True | | | -| `status` _[ObjectStoreStatus](#objectstorestatus)_ | Most recently observed status of the ObjectStore. This data may not be up to
date. Populated by the system. Read-only.
More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#spec-and-status | | | | - - -#### ObjectStoreSpec - - - -ObjectStoreSpec defines the desired state of ObjectStore. - - - -_Appears in:_ -- [ObjectStore](#objectstore) - -| Field | Description | Required | Default | Validation | -| --- | --- | --- | --- | --- | -| `configuration` _[BarmanObjectStoreConfiguration](https://pkg.go.dev/github.com/cloudnative-pg/barman-cloud/pkg/api#BarmanObjectStoreConfiguration)_ | The configuration for the barman-cloud tool suite | True | | | -| `retentionPolicy` _string_ | RetentionPolicy is the retention policy to be used for backups
and WALs (i.e. '60d'). The retention policy is expressed in the form
of `XXu` where `XX` is a positive integer and `u` is in `[dwm]` -
days, weeks, months. | | | Pattern: `^[1-9][0-9]*[dwm]$`
| -| `instanceSidecarConfiguration` _[InstanceSidecarConfiguration](#instancesidecarconfiguration)_ | The configuration for the sidecar that runs in the instance pods | | | | - - -#### ObjectStoreStatus - - - -ObjectStoreStatus defines the observed state of ObjectStore. - - - -_Appears in:_ -- [ObjectStore](#objectstore) - -| Field | Description | Required | Default | Validation | -| --- | --- | --- | --- | --- | -| `serverRecoveryWindow` _object (keys:string, values:[RecoveryWindow](#recoverywindow))_ | ServerRecoveryWindow maps each server to its recovery window | True | | | - - -#### RecoveryWindow - - - -RecoveryWindow represents the time span between the first -recoverability point and the last successful backup of a PostgreSQL -server, defining the period during which data can be restored. - - - -_Appears in:_ -- [ObjectStoreStatus](#objectstorestatus) - -| Field | Description | Required | Default | Validation | -| --- | --- | --- | --- | --- | -| `firstRecoverabilityPoint` _[Time](https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.32/#time-v1-meta)_ | The first recoverability point in a PostgreSQL server refers to
the earliest point in time to which the database can be
restored. | True | | | -| `lastSuccessfulBackupTime` _[Time](https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.32/#time-v1-meta)_ | The last successful backup time | True | | | -| `lastFailedBackupTime` _[Time](https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.32/#time-v1-meta)_ | The last failed backup time | True | | | - - diff --git a/web/versioned_docs/version-0.7.0/retention.md b/web/versioned_docs/version-0.7.0/retention.md deleted file mode 100644 index fefbd08..0000000 --- a/web/versioned_docs/version-0.7.0/retention.md +++ /dev/null @@ -1,38 +0,0 @@ ---- -sidebar_position: 60 ---- - -# Retention Policies - - - -The Barman Cloud Plugin supports **automated cleanup of obsolete backups** via -retention policies, configured in the `.spec.retentionPolicy` field of the -`ObjectStore` resource. - -:::note -This feature uses the `barman-cloud-backup-delete` command with the -`--retention-policy "RECOVERY WINDOW OF {{ value }} {{ unit }}"` syntax. -::: - -#### Example: 30-Day Retention Policy - -```yaml -apiVersion: barmancloud.cnpg.io/v1 -kind: ObjectStore -metadata: - name: my-store -spec: - [...] - retentionPolicy: "30d" -```` - -:::note -A **recovery window retention policy** ensures the cluster can be restored to -any point in time between the calculated *Point of Recoverability* (PoR) and -the latest WAL archive. The PoR is defined as `current time - recovery window`. -The **first valid backup** is the most recent backup completed before the PoR. -Backups older than that are marked as *obsolete* and deleted after the next -backup completes. -::: - diff --git a/web/versioned_docs/version-0.7.0/troubleshooting.md b/web/versioned_docs/version-0.7.0/troubleshooting.md deleted file mode 100644 index 0d9852c..0000000 --- a/web/versioned_docs/version-0.7.0/troubleshooting.md +++ /dev/null @@ -1,580 +0,0 @@ ---- -sidebar_position: 90 ---- - -# Troubleshooting - - - -This guide helps you diagnose and resolve common issues with the Barman Cloud -plugin. - -:::important -We are continuously improving the integration between CloudNativePG and the -Barman Cloud plugin as it moves toward greater stability and maturity. For this -reason, we recommend using the latest available version of both components. -See the [*Requirements* section](intro.md#requirements) for details. -::: - -:::note -The following commands assume you installed the CloudNativePG operator in -the default `cnpg-system` namespace. If you installed it in a different -namespace, adjust the commands accordingly. -::: - -## Viewing Logs - -To troubleshoot effectively, you’ll often need to review logs from multiple -sources: - -```sh -# View operator logs (includes plugin interaction logs) -kubectl logs -n cnpg-system deployment/cnpg-controller-manager -f - -# View plugin manager logs -kubectl logs -n cnpg-system deployment/barman-cloud -f - -# View sidecar container logs (Barman Cloud operations) -kubectl logs -n -c plugin-barman-cloud -f - -# View all containers in a pod -kubectl logs -n --all-containers=true - -# View previous container logs (if container restarted) -kubectl logs -n -c plugin-barman-cloud --previous -``` - -## Common Issues - -### Plugin Installation Issues - -#### Plugin pods not starting - -**Symptoms:** - -- Plugin pods stuck in `CrashLoopBackOff` or `Error` -- Plugin deployment not ready - -**Possible causes and solutions:** - -1. **Certificate issues** - - ```sh - # Check if cert-manager is installed and running - kubectl get pods -n cert-manager - - # Check if the plugin certificate is created - kubectl get certificates -n cnpg-system - ``` - - If cert-manager is not installed, install it first: - - ```sh - # Note: other installation methods for cert-manager are available - kubectl apply -f \ - https://github.com/cert-manager/cert-manager/releases/latest/download/cert-manager.yaml - ``` - - If you are using your own certificates without cert-manager, you will need - to verify the entire certificate chain yourself. - - -2. **Image pull errors** - - ```sh - # Check pod events for image pull errors - kubectl describe pod -n cnpg-system -l app=barman-cloud - ``` - - Verify the image exists and you have proper credentials if using a private - registry. - - -3. **Resource constraints** - - ```sh - # Check node resources - kubectl top nodes - kubectl describe nodes - ``` - - Make sure your cluster has sufficient CPU and memory resources. - -### Backup Failures - -#### Quick Backup Troubleshooting Checklist - -When a backup fails, follow these steps in order: - -1. **Check backup status**: - - ```sh - kubectl get backups.postgresql.cnpg.io -n - ``` -2. **Get error details and target pod**: - - ```sh - kubectl describe backups.postgresql.cnpg.io \ - -n - - kubectl get backups.postgresql.cnpg.io \ - -n \ - -o jsonpath='{.status.instanceID.podName}' - ``` -3. **Check the target pod’s sidecar logs**: - - ```sh - TARGET_POD=$(kubectl get backups.postgresql.cnpg.io \ - -n \ - -o jsonpath='{.status.instanceID.podName}') - - kubectl logs \ - -n $TARGET_POD -c plugin-barman-cloud \ - --tail=100 | grep -E "ERROR|FATAL|panic" - ``` -4. **Check cluster events**: - - ```sh - kubectl get events -n \ - --field-selector involvedObject.name= \ - --sort-by='.lastTimestamp' - ``` -5. **Verify plugin is running**: - - ```sh - kubectl get pods \ - -n cnpg-system -l app=barman-cloud - ``` -6. **Check operator logs**: - - ```sh - kubectl logs \ - -n cnpg-system deployment/cnpg-controller-manager \ - --tail=100 | grep -i "backup\|plugin" - ``` -7. **Check plugin manager logs**: - - ```sh - kubectl logs \ - -n cnpg-system deployment/barman-cloud --tail=100 - ``` - -#### Backup job fails immediately - -**Symptoms:** - -- Backup pods terminate with error -- No backup files appear in object storage -- Backup shows `failed` phase with various error messages - -**Common failure modes and solutions:** - -1. **"requested plugin is not available" errors** - - ``` - requested plugin is not available: barman - requested plugin is not available: barman-cloud - requested plugin is not available: barman-cloud.cloudnative-pg.io - ``` - - **Cause:** The plugin name in the Cluster configuration doesn’t match the - deployed plugin, or the plugin isn’t registered. - - **Solution:** - - a. **Check plugin registration:** - - ```sh - # If you have the `cnpg` plugin installed (v1.27.0+) - kubectl cnpg status -n - ``` - - Look for the "Plugins status" section: - ``` - Plugins status - Name Version Status Reported Operator Capabilities - ---- ------- ------ ------------------------------ - barman-cloud.cloudnative-pg.io 0.6.0 N/A Reconciler Hooks, Lifecycle Service - ``` - - b. **Verify plugin name in `Cluster` spec**: - - ```yaml - apiVersion: postgresql.cnpg.io/v1 - kind: Cluster - spec: - plugins: - - name: barman-cloud.cloudnative-pg.io - parameters: - barmanObjectName: - ``` - - c. **Check plugin deployment is running**: - - ```sh - kubectl get deployment -n cnpg-system barman-cloud - ``` - -2. **"rpc error: code = Unknown desc = panic caught: assignment to entry in nil map" errors** - - **Cause:** Misconfiguration in the `ObjectStore` (e.g., typo or missing field). - - **Solution:** - - - Review sidecar logs for details - - Verify `ObjectStore` configuration and secrets - - Common issues include: - - Missing or incorrect secret references - - Typos in configuration parameters - - Missing required environment variables in secrets - -#### Backup performance issues - -**Symptoms:** - -- Backups take extremely long -- Backups timeout - -**Plugin-specific considerations:** - -1. **Check `ObjectStore` parallelism settings** - - Adjust `maxParallel` in `ObjectStore` configuration - - Monitor sidecar container resource usage during backups - -2. **Verify plugin resource allocation** - - Check if the sidecar container has sufficient CPU/memory - - Review plugin container logs for resource-related warnings - -:::tip -For Barman-specific features like compression, encryption, and performance -tuning, refer to the [Barman documentation](https://docs.pgbarman.org/latest/). -::: - -### WAL Archiving Issues - -#### WAL archiving stops - -**Symptoms:** - -- WAL files accumulate on the primary -- Cluster shows WAL archiving warnings -- Sidecar logs show WAL errors - -**Debugging steps:** - -1. **Check plugin sidecar logs for WAL archiving errors** - ```sh - # Check recent WAL archive operations in sidecar - kubectl logs -n -c plugin-barman-cloud \ - --tail=50 | grep -i wal - ``` - -2. **Check ObjectStore configuration for WAL settings** - - Ensure ObjectStore has proper WAL retention settings - - Verify credentials have permissions for WAL operations - -### Restore Issues - -#### Restore fails during recovery - -**Symptoms:** - -- New cluster stuck in recovery -- Plugin sidecar shows restore errors -- PostgreSQL won’t start - -**Debugging steps:** - -1. **Check plugin sidecar logs during restore** - - ```sh - # Check the sidecar logs on the recovering cluster pods - kubectl logs -n \ - -c plugin-barman-cloud --tail=100 - - # Look for restore-related errors - kubectl logs -n \ - -c plugin-barman-cloud | grep -E "restore|recovery|ERROR" - ``` - -2. **Verify plugin can access backups** - - ```sh - # Check if `ObjectStore` is properly configured for restore - kubectl get objectstores.barmancloud.cnpg.io \ - -n -o yaml - - # Check PostgreSQL recovery logs - kubectl logs -n \ - -c postgres | grep -i recovery - ``` - -:::tip -For detailed Barman restore operations and troubleshooting, refer to the -[Barman documentation](https://docs.pgbarman.org/latest/barman-cloud-restore.html). -::: - -#### Point-in-time recovery (PITR) configuration issues - -**Symptoms:** - -- PITR doesn’t reach target time -- WAL access errors -- Recovery halts early - -**Debugging steps:** - -1. **Verify PITR configuration in the `Cluster` spec** - - ```yaml - apiVersion: postgresql.cnpg.io/v1 - kind: Cluster - metadata: - name: - spec: - storage: - size: 1Gi - - bootstrap: - recovery: - source: origin - recoveryTarget: - targetTime: "2024-01-15 10:30:00" - - externalClusters: - - name: origin - plugin: - enabled: true - name: barman-cloud.cloudnative-pg.io - parameters: - barmanObjectName: - serverName: - ``` - -2. **Check sidecar logs for WAL-related errors** - - ```sh - kubectl logs -n \ - -c plugin-barman-cloud | grep -i wal - ``` - -:::note -For detailed PITR configuration and WAL management, see the -[Barman PITR documentation](https://docs.pgbarman.org/latest/). -::: - -### Plugin Configuration Issues - -#### Plugin cannot connect to object storage - -**Symptoms:** - -- Sidecar logs show connection errors -- Backups fail with authentication or network errors -- `ObjectStore` resource reports errors - -**Solution:** - -1. **Verify `ObjectStore` CRD configuration and secrets** - - ```sh - # Check ObjectStore resource status - kubectl get objectstores.barmancloud.cnpg.io \ - -n -o yaml - - # Verify the secret exists and has correct keys for your provider - kubectl get secret -n \ - -o jsonpath='{.data}' | jq 'keys' - ``` - -2. **Check sidecar logs for connectivity issues** - ```sh - kubectl logs -n \ - -c plugin-barman-cloud | grep -E "connect|timeout|SSL|cert" - ``` - -3. **Adjust provider-specific settings (endpoint, path style, etc.)** - - See [Object Store Configuration](object_stores.md) for provider-specific settings - - Ensure `endpointURL` match your storage type - - Verify network policies allow egress to your storage provider - -## Diagnostic Commands - -### Using the `cnpg` plugin for `kubectl` - -The `cnpg` plugin for `kubectl` provides extended debugging capabilities. -Keep it updated: - -```sh -# Install or update the `cnpg` plugin -kubectl krew install cnpg -# Or using an alternative method: https://cloudnative-pg.io/documentation/current/kubectl-plugin/#install - -# Check plugin status (requires CNPG 1.27.0+) -kubectl cnpg status -n - -# View cluster status in detail -kubectl cnpg status -n --verbose -``` - -## Getting Help - -If problems persist: - -1. **Check the documentation** - - - [Installation Guide](installation.mdx) - - [Object Store Configuration](object_stores.md) (for provider-specific settings) - - [Usage Examples](usage.md) - - -2. **Gather diagnostic information** - - ```sh - # Create a diagnostic bundle (⚠️ sanitize these before sharing!) - kubectl get objectstores.barmancloud.cnpg.io -A -o yaml > /tmp/objectstores.yaml - kubectl get clusters.postgresql.cnpg.io -A -o yaml > /tmp/clusters.yaml - kubectl logs -n cnpg-system deployment/barman-cloud --tail=1000 > /tmp/plugin.log - ``` - - -3. **Community support** - - - CloudNativePG Slack: [#cloudnativepg-users](https://cloud-native.slack.com/messages/cloudnativepg-users) - - GitHub Issues: [plugin-barman-cloud](https://github.com/cloudnative-pg/plugin-barman-cloud/issues) - - -4. **Include when reporting** - - - CloudNativePG version - - Plugin version - - Kubernetes version - - Cloud provider and region - - Relevant configuration (⚠️ sanitize/redact sensitive information) - - Error messages and logs - - Steps to reproduce - -## Known Issues and Limitations - -### Current Known Issues - -1. **Migration compatibility**: After migrating from in-tree backup to the - plugin, the `kubectl cnpg backup` command syntax has changed - ([#353](https://github.com/cloudnative-pg/plugin-barman-cloud/issues/353)): - - ```sh - # Old command (in-tree, no longer works after migration) - kubectl cnpg backup -n \ - --method=barmanObjectStore - - # New command (plugin-based) - kubectl cnpg backup -n \ - --method=plugin --plugin-name=barman-cloud.cloudnative-pg.io - ``` - -### Plugin Limitations - -1. **Installation method**: Currently only supports manifest and Kustomize - installation ([#351](https://github.com/cloudnative-pg/plugin-barman-cloud/issues/351) - - Helm chart requested) - -2. **Sidecar resource sharing**: The plugin sidecar container shares pod - resources with PostgreSQL - -3. **Plugin restart behavior**: Restarting the sidecar container requires - restarting the entire PostgreSQL pod - -## Recap of General Debugging Steps - -### Check Backup Status and Identify the Target Instance - -```sh -# List all backups and their status -kubectl get backups.postgresql.cnpg.io -n - -# Get detailed backup information including error messages and target instance -kubectl describe backups.postgresql.cnpg.io \ - -n - -# Extract the target pod name from a failed backup -kubectl get backups.postgresql.cnpg.io \ - -n \ - -o jsonpath='{.status.instanceID.podName}' - -# Get more details including the target pod, method, phase, and error -kubectl get backups.postgresql.cnpg.io \ - -n \ - -o jsonpath='Pod: {.status.instanceID.podName}{"\n"}Method: {.status.method}{"\n"}Phase: {.status.phase}{"\n"}Error: {.status.error}{"\n"}' - -# Check the cluster status for backup-related information -kubectl cnpg status -n --verbose -``` - -### Check Sidecar Logs on the Backup Target Pod - -```sh -# Identify which pod was the backup target (from the previous step) -TARGET_POD=$(kubectl get backups.postgresql.cnpg.io \ - -n \ - -o jsonpath='{.status.instanceID.podName}') -echo "Backup target pod: $TARGET_POD" - -# Check the sidecar logs on the specific target pod -kubectl logs -n $TARGET_POD \ - -c plugin-barman-cloud --tail=100 - -# Follow the logs in real time -kubectl logs -n $TARGET_POD \ - -c plugin-barman-cloud -f - -# Check for specific errors in the target pod around the backup time -kubectl logs -n $TARGET_POD \ - -c plugin-barman-cloud --since=10m | grep -E "ERROR|FATAL|panic|failed" - -# Alternative: List all cluster pods and their roles -kubectl get pods -n -l cnpg.io/cluster= \ - -o custom-columns=NAME:.metadata.name,ROLE:.metadata.labels.cnpg\\.io/instanceRole,INSTANCE:.metadata.labels.cnpg\\.io/instanceName - -# Check sidecar logs on ALL cluster pods (if the target is unclear) -for pod in $(kubectl get pods -n -l cnpg.io/cluster= -o name); do - echo "=== Checking $pod ===" - kubectl logs -n $pod -c plugin-barman-cloud \ - --tail=20 | grep -i error || echo "No errors found" -done -``` - -### Check Events for Backup-Related Issues - -```sh -# Check events for the cluster -kubectl get events -n \ - --field-selector involvedObject.name= - -# Check events for failed backups -kubectl get events -n \ - --field-selector involvedObject.kind=Backup - -# Get all recent events in the namespace -kubectl get events -n --sort-by='.lastTimestamp' | tail -20 -``` - -### Verify `ObjectStore` Configuration - -```sh -# Check the ObjectStore resource -kubectl get objectstores.barmancloud.cnpg.io \ - -n -o yaml - -# Verify the secret exists and has the correct keys -kubectl get secret -n -o yaml -# Alternatively -kubectl get secret -n -o jsonpath='{.data}' | jq 'keys' -``` - -### Common Error Messages and Solutions - -* **"AccessDenied" or "403 Forbidden"** — Check cloud credentials and bucket permissions. -* **"NoSuchBucket"** — Verify the bucket exists and the endpoint URL is correct. -* **"Connection timeout"** — Check network connectivity and firewall rules. -* **"SSL certificate problem"** — For self-signed certificates, verify the CA bundle configuration. - diff --git a/web/versioned_docs/version-0.7.0/usage.md b/web/versioned_docs/version-0.7.0/usage.md deleted file mode 100644 index 6406d38..0000000 --- a/web/versioned_docs/version-0.7.0/usage.md +++ /dev/null @@ -1,283 +0,0 @@ ---- -sidebar_position: 30 ---- - -# Using the Barman Cloud Plugin - - - -After [installing the plugin](installation.mdx) in the same namespace as the -CloudNativePG operator, enabling your PostgreSQL cluster to use the Barman -Cloud Plugin involves just a few steps: - -- Defining the object store containing your WAL archive and base backups, using - your preferred [provider](object_stores.md) -- Instructing the Postgres cluster to use the Barman Cloud Plugin - -From that moment, you’ll be able to issue on-demand backups or define a backup -schedule, as well as rely on the object store for recovery operations. - -The rest of this page details each step, using MinIO as object store provider. - -## Defining the `ObjectStore` - -An `ObjectStore` resource must be created for each object store used in your -PostgreSQL architecture. Here's an example configuration using MinIO: - -```yaml -apiVersion: barmancloud.cnpg.io/v1 -kind: ObjectStore -metadata: - name: minio-store -spec: - configuration: - destinationPath: s3://backups/ - endpointURL: http://minio:9000 - s3Credentials: - accessKeyId: - name: minio - key: ACCESS_KEY_ID - secretAccessKey: - name: minio - key: ACCESS_SECRET_KEY - wal: - compression: gzip -``` - -The `.spec.configuration` schema follows the same format as the -[in-tree barman-cloud support](https://pkg.go.dev/github.com/cloudnative-pg/barman-cloud/pkg/api#BarmanObjectStoreConfiguration). -Refer to [the CloudNativePG documentation](https://cloudnative-pg.io/documentation/current/appendixes/backup_barmanobjectstore/) -for additional details. - -:::important -The `serverName` parameter in the `ObjectStore` resource is retained solely for -API compatibility with the in-tree `barmanObjectStore` and must always be left empty. -When needed, use the `serverName` plugin parameter in the Cluster configuration instead. -::: - -## Configuring WAL Archiving - -Once the `ObjectStore` is defined, you can configure your PostgreSQL cluster -to archive WALs by referencing the store in the `.spec.plugins` section: - -```yaml -apiVersion: postgresql.cnpg.io/v1 -kind: Cluster -metadata: - name: cluster-example -spec: - instances: 3 - imagePullPolicy: Always - plugins: - - name: barman-cloud.cloudnative-pg.io - isWALArchiver: true - parameters: - barmanObjectName: minio-store - storage: - size: 1Gi -``` - -This configuration enables both WAL archiving and data directory backups. - -## Performing a Base Backup - -Once WAL archiving is enabled, the cluster is ready for backups. Backups can be -created either declaratively (with YAML manifests) or imperatively (with the -`cnpg` plugin). - -### Declarative approach (YAML manifest) - -Create a backup resource by applying a YAML manifest: - -```yaml -apiVersion: postgresql.cnpg.io/v1 -kind: Backup -metadata: - name: backup-example -spec: - cluster: - name: cluster-example - method: plugin - pluginConfiguration: - name: barman-cloud.cloudnative-pg.io -``` - -### Imperative approach (using the `cnpg` plugin) - -The quickest way to trigger an on-demand backup is with the `cnpg` plugin: - -```bash -kubectl cnpg backup -n \ - --method=plugin \ - --plugin-name=barman-cloud.cloudnative-pg.io -``` - -:::note Migration from in-tree backups -If you are migrating from the in-tree backup system, note the change in syntax: - -```bash -# Old command (in-tree backup) -kubectl cnpg backup -n --method=barmanObjectStore - -# New command (plugin-based backup) -kubectl cnpg backup -n \ - --method=plugin \ - --plugin-name=barman-cloud.cloudnative-pg.io -``` -::: - -## Restoring a Cluster - -To restore a cluster from an object store, create a new `Cluster` resource that -references the store containing the backup. Below is an example configuration: - -```yaml -apiVersion: postgresql.cnpg.io/v1 -kind: Cluster -metadata: - name: cluster-restore -spec: - instances: 3 - imagePullPolicy: IfNotPresent - bootstrap: - recovery: - source: source - externalClusters: - - name: source - plugin: - name: barman-cloud.cloudnative-pg.io - parameters: - barmanObjectName: minio-store - serverName: cluster-example - storage: - size: 1Gi -``` - -:::important -The above configuration does **not** enable WAL archiving for the restored cluster. -::: - -To enable WAL archiving for the restored cluster, include the `.spec.plugins` -section alongside the `externalClusters.plugin` section, as shown below: - -```yaml -apiVersion: postgresql.cnpg.io/v1 -kind: Cluster -metadata: - name: cluster-restore -spec: - instances: 3 - imagePullPolicy: IfNotPresent - bootstrap: - recovery: - source: source - plugins: - - name: barman-cloud.cloudnative-pg.io - isWALArchiver: true - parameters: - # Backup Object Store (push, read-write) - barmanObjectName: minio-store-bis - externalClusters: - - name: source - plugin: - name: barman-cloud.cloudnative-pg.io - parameters: - # Recovery Object Store (pull, read-only) - barmanObjectName: minio-store - serverName: cluster-example - storage: - size: 1Gi -``` - -The same object store may be used for both transaction log archiving and -restoring a cluster, or you can configure separate stores for these purposes. - -## Configuring Replica Clusters - -You can set up a distributed topology by combining the previously defined -configurations with the `.spec.replica` section. Below is an example of how to -define a replica cluster: - -```yaml -apiVersion: postgresql.cnpg.io/v1 -kind: Cluster -metadata: - name: cluster-dc-a -spec: - instances: 3 - primaryUpdateStrategy: unsupervised - - storage: - storageClass: csi-hostpath-sc - size: 1Gi - - plugins: - - name: barman-cloud.cloudnative-pg.io - isWALArchiver: true - parameters: - barmanObjectName: minio-store-a - - replica: - self: cluster-dc-a - primary: cluster-dc-a - source: cluster-dc-b - - externalClusters: - - name: cluster-dc-a - plugin: - name: barman-cloud.cloudnative-pg.io - parameters: - barmanObjectName: minio-store-a - - - name: cluster-dc-b - plugin: - name: barman-cloud.cloudnative-pg.io - parameters: - barmanObjectName: minio-store-b -``` - -## Configuring the plugin instance sidecar - -The Barman Cloud Plugin runs as a sidecar container next to each PostgreSQL -instance pod. It manages backup, WAL archiving, and restore processes. - -Configuration comes from multiple `ObjectStore` resources: - -1. The one referenced in the - `.spec.plugins` section of the `Cluster`. This is the - object store used for WAL archiving and base backups. -2. The one referenced in the external cluster - used in the `.spec.replica.source` section of the `Cluster`. This is - used by the log-shipping designated primary to get the WAL files. -3. The one referenced in the - `.spec.bootstrap.recovery.source` section of the `Cluster`. Used by - the initial recovery job to create the cluster from an existing backup. - -You can fine-tune sidecar behavior in the `.spec.instanceSidecarConfiguration` -of your ObjectStore. These settings apply to all PostgreSQL instances that use -this object store. Any updates take effect at the next `Cluster` reconciliation, -and could generate a rollout of the `Cluster`. - -```yaml -apiVersion: barmancloud.cnpg.io/v1 -kind: ObjectStore -metadata: - name: minio-store -spec: - configuration: - # [...] - instanceSidecarConfiguration: - retentionPolicyIntervalSeconds: 1800 - resources: - requests: - memory: "XXX" - cpu: "YYY" - limits: - memory: "XXX" - cpu: "YYY" -``` - -:::note -If more than one `ObjectStore` applies, the `instanceSidecarConfiguration` of -the one set in `.spec.plugins` has priority. -::: diff --git a/web/versioned_docs/version-0.8.0/compression.md b/web/versioned_docs/version-0.8.0/compression.md deleted file mode 100644 index 2abbede..0000000 --- a/web/versioned_docs/version-0.8.0/compression.md +++ /dev/null @@ -1,43 +0,0 @@ ---- -sidebar_position: 80 ---- - -# Compression - - - -By default, backups and WAL files are archived **uncompressed**. However, the -Barman Cloud Plugin supports multiple compression algorithms via -`barman-cloud-backup` and `barman-cloud-wal-archive`, allowing you to optimize -for space, speed, or a balance of both. - -### Supported Compression Algorithms - -- `bzip2` -- `gzip` -- `lz4` (WAL only) -- `snappy` -- `xz` (WAL only) -- `zstd` (WAL only) - -Compression settings for base backups and WAL archives are configured -independently. For implementation details, refer to the corresponding API -definitions: - -- [`DataBackupConfiguration`](https://pkg.go.dev/github.com/cloudnative-pg/barman-cloud/pkg/api#DataBackupConfiguration) -- [`WALBackupConfiguration`](https://pkg.go.dev/github.com/cloudnative-pg/barman-cloud/pkg/api#WalBackupConfiguration) - -:::important -Compression impacts both performance and storage efficiency. Choose the right -algorithm based on your recovery time objectives (RTO), storage capacity, and -network throughput. -::: - -## Compression Benchmark (on MinIO) - -| Compression | Backup Time (ms) | Restore Time (ms) | Uncompressed Size (MB) | Compressed Size (MB) | Ratio | -| ----------- | ---------------- | ----------------- | ---------------------- | -------------------- | ----- | -| None | 10,927 | 7,553 | 395 | 395 | 1.0:1 | -| bzip2 | 25,404 | 13,886 | 395 | 67 | 5.9:1 | -| gzip | 116,281 | 3,077 | 395 | 91 | 4.3:1 | -| snappy | 8,134 | 8,341 | 395 | 166 | 2.4:1 | diff --git a/web/versioned_docs/version-0.8.0/concepts.md b/web/versioned_docs/version-0.8.0/concepts.md deleted file mode 100644 index 3832df3..0000000 --- a/web/versioned_docs/version-0.8.0/concepts.md +++ /dev/null @@ -1,177 +0,0 @@ ---- -sidebar_position: 10 ---- - -# Main Concepts - - - -:::important -Before proceeding, make sure to review the following sections of the -CloudNativePG documentation: - -- [**Backup**](https://cloudnative-pg.io/documentation/current/backup/) -- [**WAL Archiving**](https://cloudnative-pg.io/documentation/current/wal_archiving/) -- [**Recovery**](https://cloudnative-pg.io/documentation/current/recovery/) -::: - -The **Barman Cloud Plugin** enables **hot (online) backups** of PostgreSQL -clusters in CloudNativePG through [`barman-cloud`](https://pgbarman.org), -supporting continuous physical backups and WAL archiving to an **object -store**—without interrupting write operations. - -It also supports both **full recovery** and **Point-in-Time Recovery (PITR)** -of a PostgreSQL cluster. - -## The Object Store - -At the core is the [`ObjectStore` custom resource (CRD)](plugin-barman-cloud.v1.md#objectstorespec), -which acts as the interface between the PostgreSQL cluster and the target -object storage system. It allows you to configure: - -- **Authentication and bucket location** via the `.spec.configuration` section -- **WAL archiving** settings—such as compression type, parallelism, and - server-side encryption—under `.spec.configuration.wal` -- **Base backup options**—with similar settings for compression, concurrency, - and encryption—under `.spec.configuration.data` -- **Retention policies** to manage the life-cycle of archived WALs and backups - via `.spec.configuration.retentionPolicy` - -WAL files are archived in the `wals` directory, while base backups are stored -as **tarballs** in the `base` directory, following the -[Barman Cloud convention](https://docs.pgbarman.org/cloud/latest/usage/#object-store-layout). - -The plugin also offers advanced capabilities, including -[backup tagging](misc.md#backup-object-tagging) and -[extra options for backups and WAL archiving](misc.md#extra-options-for-backup-and-wal-archiving). - -:::tip -For details, refer to the -[API reference for the `ObjectStore` resource](plugin-barman-cloud.v1.md#objectstorespec). -::: - -## Integration with a CloudNativePG Cluster - -CloudNativePG can delegate continuous backup and recovery responsibilities to -the **Barman Cloud Plugin** by configuring the `.spec.plugins` section of a -`Cluster` resource. This setup requires a corresponding `ObjectStore` resource -to be defined. - -:::important -While it is technically possible to reuse the same `ObjectStore` for multiple -`Cluster` resources within the same namespace, it is strongly recommended to -dedicate one object store per PostgreSQL cluster to ensure data isolation and -operational clarity. -::: - -The following example demonstrates how to configure a CloudNativePG cluster -named `cluster-example` to use a previously defined `ObjectStore` (also named -`cluster-example`) in the same namespace. Setting `isWALArchiver: true` enables -WAL archiving through the plugin: - -```yaml -apiVersion: postgresql.cnpg.io/v1 -kind: Cluster -metadata: - name: cluster-example -spec: - # Other cluster settings... - plugins: - - name: barman-cloud.cloudnative-pg.io - isWALArchiver: true - parameters: - barmanObjectName: cluster-example -``` - -## Backup of a Postgres Cluster - -Once the object store is defined and the `Cluster` is configured to use the -Barman Cloud Plugin, **WAL archiving is activated immediately** on the -PostgreSQL primary. - -Physical base backups are seamlessly managed by CloudNativePG using the -`Backup` and `ScheduledBackup` resources, respectively for -[on-demand](https://cloudnative-pg.io/documentation/current/backup/#on-demand-backups) -and -[scheduled](https://cloudnative-pg.io/documentation/current/backup/#scheduled-backups) -backups. - -To use the Barman Cloud Plugin, you must set the `method` to `plugin` and -configure the `pluginConfiguration` section as shown: - -```yaml -[...] -spec: - method: plugin - pluginConfiguration: - name: barman-cloud.cloudnative-pg.io - [...] -``` - -With this configuration, CloudNativePG supports: - -- Backups from both **primary** and **standby** instances -- Backups from **designated primaries** in a distributed topology using - [replica clusters](https://cloudnative-pg.io/documentation/current/replica_cluster/) - -:::tip -For details on how to back up from a standby, refer to the official documentation: -[Backup from a standby](https://cloudnative-pg.io/documentation/current/backup/#backup-from-a-standby). -::: - -:::important -Both backup and WAL archiving operations are executed by sidecar containers -running in the same pod as the PostgreSQL `Cluster` primary instance—except -when backups are taken from a standby, in which case the sidecar runs alongside -the standby pod. -The sidecar containers use a [dedicated container image](images.md) that -includes only the supported version of Barman Cloud. -::: - -## Recovery of a Postgres Cluster - -In PostgreSQL, *recovery* refers to the process of starting a database instance -from an existing backup. The Barman Cloud Plugin integrates with CloudNativePG -to support both **full recovery** and **Point-in-Time Recovery (PITR)** from an -object store. - -Recovery in this context is *not in-place*: it bootstraps a brand-new -PostgreSQL cluster from a backup and replays the necessary WAL files to reach -the desired recovery target. - -To perform a recovery, define an *external cluster* that references the -appropriate `ObjectStore`, and use it as the source in the `bootstrap` section -of the target cluster: - -```yaml -[...] -spec: - [...] - bootstrap: - recovery: - source: source - externalClusters: - - name: source - plugin: - name: barman-cloud.cloudnative-pg.io - parameters: - barmanObjectName: cluster-example - serverName: cluster-example - [...] -``` - -The critical element here is the `externalClusters` section of the `Cluster` -resource, where the `plugin` stanza instructs CloudNativePG to use the Barman -Cloud Plugin to access the object store for recovery. - -This same mechanism can be used for a variety of scenarios enabled by the -CloudNativePG API, including: - -* **Full cluster recovery** from the latest backup -* **Point-in-Time Recovery (PITR)** -* Bootstrapping **replica clusters** in a distributed topology - -:::tip -For complete instructions and advanced use cases, refer to the official -[Recovery documentation](https://cloudnative-pg.io/documentation/current/recovery/). -::: diff --git a/web/versioned_docs/version-0.8.0/images.md b/web/versioned_docs/version-0.8.0/images.md deleted file mode 100644 index f6c32d3..0000000 --- a/web/versioned_docs/version-0.8.0/images.md +++ /dev/null @@ -1,37 +0,0 @@ ---- -sidebar_position: 99 ---- - -# Container Images - - - -The Barman Cloud Plugin is distributed using two container images: - -- One for deploying the plugin components -- One for the sidecar that runs alongside each PostgreSQL instance in a - CloudNativePG `Cluster` using the plugin - -## Plugin Container Image - -The plugin image contains the logic required to operate the Barman Cloud Plugin -within your Kubernetes environment with CloudNativePG. It is published on the -GitHub Container Registry at `ghcr.io/cloudnative-pg/plugin-barman-cloud`. - -This image is built from the -[`Dockerfile.plugin`](https://github.com/cloudnative-pg/plugin-barman-cloud/blob/main/containers/Dockerfile.plugin) -in the plugin repository. - -## Sidecar Container Image - -The sidecar image is used within each PostgreSQL pod in the cluster. It -includes the latest supported version of Barman Cloud and is responsible for -performing WAL archiving and backups on behalf of CloudNativePG. - -It is available at `ghcr.io/cloudnative-pg/plugin-barman-cloud-sidecar` and is -built from the -[`Dockerfile.sidecar`](https://github.com/cloudnative-pg/plugin-barman-cloud/blob/main/containers/Dockerfile.sidecar). - -These sidecar images are designed to work seamlessly with the -[`minimal` PostgreSQL container images](https://github.com/cloudnative-pg/postgres-containers?tab=readme-ov-file#minimal-images) -maintained by the CloudNativePG Community. diff --git a/web/versioned_docs/version-0.8.0/installation.mdx b/web/versioned_docs/version-0.8.0/installation.mdx deleted file mode 100644 index 027d1e8..0000000 --- a/web/versioned_docs/version-0.8.0/installation.mdx +++ /dev/null @@ -1,109 +0,0 @@ ---- -sidebar_position: 20 ---- - -# Installation - -:::important -1. The plugin **must** be installed in the same namespace as the CloudNativePG - operator (typically `cnpg-system`). - -2. Keep in mind that the operator's **listening namespaces** may differ from its - installation namespace. Double-check this to avoid configuration issues. -::: - -## Verifying the Requirements - -Before installing the plugin, make sure the [requirements](intro.md#requirements) are met. - -### CloudNativePG Version - -Ensure you're running a version of CloudNativePG that is compatible with the -plugin. If installed in the default `cnpg-system` namespace, you can verify the -version with: - -```sh -kubectl get deployment -n cnpg-system cnpg-controller-manager \ - -o jsonpath="{.spec.template.spec.containers[*].image}" -``` - -Example output: - -```output -ghcr.io/cloudnative-pg/cloudnative-pg:1.26.0 -``` - -The version **must be 1.26 or newer**. - -### cert-manager - -Use the [cmctl](https://cert-manager.io/docs/reference/cmctl/#installation) -tool to confirm that `cert-manager` is installed and available: - -```sh -cmctl check api -``` - -Example output: - -```output -The cert-manager API is ready -``` - -Both checks are required before proceeding with the installation. - -## Installing the Barman Cloud Plugin - -import { InstallationSnippet } from '@site/src/components/Installation'; - -Install the plugin using `kubectl` by applying the manifest for the latest -release: - - - -Example output: - -```output -customresourcedefinition.apiextensions.k8s.io/objectstores.barmancloud.cnpg.io created -serviceaccount/plugin-barman-cloud created -role.rbac.authorization.k8s.io/leader-election-role created -clusterrole.rbac.authorization.k8s.io/metrics-auth-role created -clusterrole.rbac.authorization.k8s.io/metrics-reader created -clusterrole.rbac.authorization.k8s.io/objectstore-editor-role created -clusterrole.rbac.authorization.k8s.io/objectstore-viewer-role created -clusterrole.rbac.authorization.k8s.io/plugin-barman-cloud created -rolebinding.rbac.authorization.k8s.io/leader-election-rolebinding created -clusterrolebinding.rbac.authorization.k8s.io/metrics-auth-rolebinding created -clusterrolebinding.rbac.authorization.k8s.io/plugin-barman-cloud-binding created -secret/plugin-barman-cloud-8tfddg42gf created -service/barman-cloud created -deployment.apps/barman-cloud configured -certificate.cert-manager.io/barman-cloud-client created -certificate.cert-manager.io/barman-cloud-server created -issuer.cert-manager.io/selfsigned-issuer created -``` - -Finally, check that the deployment is up and running: - -```sh -kubectl rollout status deployment \ - -n cnpg-system barman-cloud -``` - -Example output: - -```output -deployment "barman-cloud" successfully rolled out -``` - -This confirms that the plugin is deployed and ready to use. - -## Testing the latest development snapshot - -You can also test the latest development snapshot of the plugin with the -following command: - -```sh -kubectl apply -f \ - https://raw.githubusercontent.com/cloudnative-pg/plugin-barman-cloud/refs/heads/main/manifest.yaml -``` diff --git a/web/versioned_docs/version-0.8.0/intro.md b/web/versioned_docs/version-0.8.0/intro.md deleted file mode 100644 index 9781d0d..0000000 --- a/web/versioned_docs/version-0.8.0/intro.md +++ /dev/null @@ -1,86 +0,0 @@ ---- -sidebar_position: 1 -sidebar_label: "Introduction" ---- - -# Barman Cloud Plugin - - - -The **Barman Cloud Plugin** for [CloudNativePG](https://cloudnative-pg.io/) -enables online continuous physical backups of PostgreSQL clusters to object storage -using the `barman-cloud` suite from the [Barman](https://docs.pgbarman.org/release/latest/) -project. - -:::important -If you plan to migrate your existing CloudNativePG cluster to the new -plugin-based approach using the Barman Cloud Plugin, see -["Migrating from Built-in CloudNativePG Backup"](migration.md) -for detailed instructions. -::: - -## Requirements - -Before using the Barman Cloud Plugin, ensure that the following components are -installed and properly configured: - -- [CloudNativePG](https://cloudnative-pg.io) version 1.26 or later - - - We strongly recommend version 1.27.0 or later, which includes improved - error handling and status reporting for the plugin. - - If you are running an earlier release, refer to the - [upgrade guide](https://cloudnative-pg.io/documentation/current/installation_upgrade). - -- [cert-manager](https://cert-manager.io/) - - - The recommended way to enable secure TLS communication between the plugin - and the operator. - - Alternatively, you can provide your own certificate bundles. See the - [CloudNativePG documentation on TLS configuration](https://cloudnative-pg.io/documentation/current/cnpg_i/#configuring-tls-certificates). - -- [`kubectl-cnpg`](https://cloudnative-pg.io/documentation/current/kubectl-plugin/) - plugin (optional but recommended) - - - Simplifies debugging and monitoring with additional status and inspection - commands. - - Multiple installation options are available in the - [installation guide](https://cloudnative-pg.io/documentation/current/kubectl-plugin/#install). - -## Key Features - -This plugin provides the following capabilities: - -- Physical online backup of the data directory -- Physical restore of the data directory -- Write-Ahead Log (WAL) archiving -- WAL restore -- Full cluster recovery -- Point-in-Time Recovery (PITR) -- Seamless integration with replica clusters for bootstrap and WAL restore from archive - -:::important -The Barman Cloud Plugin is designed to **replace the in-tree object storage support** -previously provided via the `.spec.backup.barmanObjectStore` section in the -`Cluster` resource. -Backups created using the in-tree approach are fully supported and compatible -with this plugin. -::: - -## Supported Object Storage Providers - -The plugin works with all storage backends supported by `barman-cloud`, including: - -- **Amazon S3** -- **Google Cloud Storage** -- **Microsoft Azure Blob Storage** - -In addition, the following S3-compatible and simulator solutions have been -tested and verified: - -- [MinIO](https://min.io/) – An S3-compatible storage solution -- [Azurite](https://github.com/Azure/Azurite) – A simulator for Azure Blob Storage -- [fake-gcs-server](https://github.com/fsouza/fake-gcs-server) – A simulator for Google Cloud Storage - -:::tip -For more details, refer to [Object Store Providers](object_stores.md). -::: diff --git a/web/versioned_docs/version-0.8.0/migration.md b/web/versioned_docs/version-0.8.0/migration.md deleted file mode 100644 index 2c99ada..0000000 --- a/web/versioned_docs/version-0.8.0/migration.md +++ /dev/null @@ -1,274 +0,0 @@ ---- -sidebar_position: 40 ---- - -# Migrating from Built-in CloudNativePG Backup - - - -The in-tree support for Barman Cloud in CloudNativePG is **deprecated starting -from version 1.26** and will be removed in a future release. - -If you're currently relying on the built-in Barman Cloud integration, you can -migrate seamlessly to the new **plugin-based architecture** using the Barman -Cloud Plugin, without data loss. Follow these steps: - -- [Install the Barman Cloud Plugin](installation.mdx) -- Create an `ObjectStore` resource by translating the contents of the - `.spec.backup.barmanObjectStore` section from your existing `Cluster` - definition -- Modify the `Cluster` resource in a single atomic change to switch from - in-tree backup to the plugin -- Update any `ScheduledBackup` resources to use the plugin -- Update the `externalClusters` configuration, where applicable - -:::tip -For a working example, refer to [this commit](https://github.com/cloudnative-pg/cnpg-playground/commit/596f30e252896edf8f734991c3538df87630f6f7) -from the [CloudNativePG Playground project](https://github.com/cloudnative-pg/cnpg-playground), -which demonstrates a full migration. -::: - ---- - -## Step 1: Define the `ObjectStore` - -Begin by creating an `ObjectStore` resource in the same namespace as your -PostgreSQL `Cluster`. - -There is a **direct mapping** between the `.spec.backup.barmanObjectStore` -section in CloudNativePG and the `.spec.configuration` field in the -`ObjectStore` CR. The conversion is mostly mechanical, with one key difference: - -:::warning -In the plugin architecture, retention policies are defined as part of the `ObjectStore`. -In contrast, the in-tree implementation defined them at the `Cluster` level. -::: - -If your `Cluster` used `.spec.backup.retentionPolicy`, move that configuration -to `.spec.retentionPolicy` in the `ObjectStore`. - ---- - -### Example - -Here’s an excerpt from a traditional in-tree CloudNativePG backup configuration -taken from the CloudNativePG Playground project: - -```yaml -apiVersion: postgresql.cnpg.io/v1 -kind: Cluster -metadata: - name: pg-eu -spec: - # [...] - backup: - barmanObjectStore: - destinationPath: s3://backups/ - endpointURL: http://minio-eu:9000 - s3Credentials: - accessKeyId: - name: minio-eu - key: ACCESS_KEY_ID - secretAccessKey: - name: minio-eu - key: ACCESS_SECRET_KEY - wal: - compression: gzip -``` - -This configuration translates to the following `ObjectStore` resource for the -plugin: - -```yaml -apiVersion: barmancloud.cnpg.io/v1 -kind: ObjectStore -metadata: - name: minio-eu -spec: - configuration: - destinationPath: s3://backups/ - endpointURL: http://minio-eu:9000 - s3Credentials: - accessKeyId: - name: minio-eu - key: ACCESS_KEY_ID - secretAccessKey: - name: minio-eu - key: ACCESS_SECRET_KEY - wal: - compression: gzip -``` - -As you can see, the contents of `barmanObjectStore` have been copied directly -under the `configuration` field of the `ObjectStore` resource, using the same -secret references. - -## Step 2: Update the `Cluster` for plugin WAL archiving - -Once the `ObjectStore` resource is in place, update the `Cluster` resource as -follows in a single atomic change: - -- Remove the `.spec.backup.barmanObjectStore` section -- Remove `.spec.backup.retentionPolicy` if it was defined (as it is now in the - `ObjectStore`) -- Remove the entire `spec.backup` section if it is now empty -- Add `barman-cloud.cloudnative-pg.io` to the `plugins` list, as described in - [Configuring WAL archiving](usage.md#configuring-wal-archiving) - -This will trigger a rolling update of the `Cluster`, switching continuous -backup from the in-tree implementation to the plugin-based approach. - -### Example - -The updated `pg-eu` cluster will have this configuration instead of the -previous `backup` section: - -```yaml - plugins: - - name: barman-cloud.cloudnative-pg.io - isWALArchiver: true - parameters: - barmanObjectName: minio-eu -``` - ---- - -## Step 3: Update the `ScheduledBackup` - -After switching the `Cluster` to use the plugin, update your `ScheduledBackup` -resources to match. - -Set the backup `method` to `plugin` and reference the plugin name via -`pluginConfiguration`, as shown in ["Performing a base backup"](usage.md#performing-a-base-backup). - -### Example - -Original in-tree `ScheduledBackup`: - -```yaml -apiVersion: postgresql.cnpg.io/v1 -kind: ScheduledBackup -metadata: - name: pg-eu-backup -spec: - cluster: - name: pg-eu - schedule: '0 0 0 * * *' - backupOwnerReference: self -``` - -Updated version using the plugin: - -```yaml -apiVersion: postgresql.cnpg.io/v1 -kind: ScheduledBackup -metadata: - name: pg-eu-backup -spec: - cluster: - name: pg-eu - schedule: '0 0 0 * * *' - backupOwnerReference: self - method: plugin - pluginConfiguration: - name: barman-cloud.cloudnative-pg.io -``` - ---- - -## Step 4: Update the `externalClusters` configuration - -If your `Cluster` relies on one or more external clusters that use the in-tree -Barman Cloud integration, you need to update those configurations to use the -plugin-based architecture. - -When a replica cluster fetches WAL files or base backups from an external -source that used the built-in backup method, follow these steps: - -1. Create a corresponding `ObjectStore` resource for the external cluster, as - shown in [Step 1](#step-1-define-the-objectstore) -2. Update the `externalClusters` section of your replica cluster to use the - plugin instead of the in-tree `barmanObjectStore` field - -### Example - -Consider the original configuration using in-tree Barman Cloud: - -```yaml -apiVersion: postgresql.cnpg.io/v1 -kind: Cluster -metadata: - name: pg-us -spec: - # [...] - externalClusters: - - name: pg-eu - barmanObjectStore: - destinationPath: s3://backups/ - endpointURL: http://minio-eu:9000 - serverName: pg-eu - s3Credentials: - accessKeyId: - name: minio-eu - key: ACCESS_KEY_ID - secretAccessKey: - name: minio-eu - key: ACCESS_SECRET_KEY - wal: - compression: gzip -``` - -Create the `ObjectStore` resource for the external cluster: - -```yaml -apiVersion: barmancloud.cnpg.io/v1 -kind: ObjectStore -metadata: - name: minio-eu -spec: - configuration: - destinationPath: s3://backups/ - endpointURL: http://minio-eu:9000 - s3Credentials: - accessKeyId: - name: minio-eu - key: ACCESS_KEY_ID - secretAccessKey: - name: minio-eu - key: ACCESS_SECRET_KEY - wal: - compression: gzip -``` - -Update the external cluster configuration to use the plugin: - -```yaml -apiVersion: postgresql.cnpg.io/v1 -kind: Cluster -metadata: - name: pg-us -spec: - # [...] - externalClusters: - - name: pg-eu - plugin: - name: barman-cloud.cloudnative-pg.io - parameters: - barmanObjectName: minio-eu - serverName: pg-eu -``` - -## Step 5: Verify your metrics - -When migrating from the in-core solution to the plugin-based approach, you need -to monitor a different set of metrics, as described in the -["Observability"](observability.md) section. - -The table below summarizes the name changes between the old in-core metrics and -the new plugin-based ones: - -| Old metric name | New metric name | -| ------------------------------------------------ | ---------------------------------------------------------------- | -| `cnpg_collector_last_failed_backup_timestamp` | `barman_cloud_cloudnative_pg_io_last_failed_backup_timestamp` | -| `cnpg_collector_last_available_backup_timestamp` | `barman_cloud_cloudnative_pg_io_last_available_backup_timestamp` | -| `cnpg_collector_first_recoverability_point` | `barman_cloud_cloudnative_pg_io_first_recoverability_point` | diff --git a/web/versioned_docs/version-0.8.0/misc.md b/web/versioned_docs/version-0.8.0/misc.md deleted file mode 100644 index 4d3cefc..0000000 --- a/web/versioned_docs/version-0.8.0/misc.md +++ /dev/null @@ -1,76 +0,0 @@ ---- -sidebar_position: 90 ---- - -# Miscellaneous - - - -## Backup Object Tagging - -You can attach key-value metadata tags to backup artifacts—such as base -backups, WAL files, and history files—via the `.spec.configuration` section of -the `ObjectStore` resource. - -- `tags`: applied to base backups and WAL files -- `historyTags`: applied to history files only - -### Example - -```yaml -apiVersion: barmancloud.cnpg.io/v1 -kind: ObjectStore -metadata: - name: my-store -spec: - configuration: - [...] - tags: - backupRetentionPolicy: "expire" - historyTags: - backupRetentionPolicy: "keep" - [...] -``` - -## Extra Options for Backup and WAL Archiving - -You can pass additional command-line arguments to `barman-cloud-backup` and -`barman-cloud-wal-archive` using the `additionalCommandArgs` field in the -`ObjectStore` configuration. - -- `.spec.configuration.data.additionalCommandArgs`: for `barman-cloud-backup` -- `.spec.configuration.wal.additionalCommandArgs`: for `barman-cloud-wal-archive` - -Each field accepts a list of string arguments. If an argument is already -configured elsewhere in the plugin, the duplicate will be ignored. - -### Example: Extra Backup Options - -```yaml -kind: ObjectStore -metadata: - name: my-store -spec: - configuration: - data: - additionalCommandArgs: - - "--min-chunk-size=5MB" - - "--read-timeout=60" -``` - -### Example: Extra WAL Archive Options - -```yaml -kind: ObjectStore -metadata: - name: my-store -spec: - configuration: - wal: - additionalCommandArgs: - - "--max-concurrency=1" - - "--read-timeout=60" -``` - -For a complete list of supported options, refer to the -[official Barman Cloud documentation](https://docs.pgbarman.org/release/latest/). diff --git a/web/versioned_docs/version-0.8.0/object_stores.md b/web/versioned_docs/version-0.8.0/object_stores.md deleted file mode 100644 index 74e0473..0000000 --- a/web/versioned_docs/version-0.8.0/object_stores.md +++ /dev/null @@ -1,454 +0,0 @@ ---- -sidebar_position: 50 ---- - -# Object Store Providers - - - -The Barman Cloud Plugin enables the storage of PostgreSQL cluster backup files -in any object storage service supported by the -[Barman Cloud infrastructure](https://docs.pgbarman.org/release/latest/). - -Currently, Barman Cloud supports the following providers: - -- [Amazon S3](#aws-s3) -- [Microsoft Azure Blob Storage](#azure-blob-storage) -- [Google Cloud Storage](#google-cloud-storage) - -You may also use any S3- or Azure-compatible implementation of the above -services. - -To configure object storage with Barman Cloud, you must define an -[`ObjectStore` object](plugin-barman-cloud.v1.md#objectstore), which -establishes the connection between your PostgreSQL cluster and the object -storage backend. - -Configuration details — particularly around authentication — will vary depending on -the specific object storage provider you are using. - -The following sections detail the setup for each. - ---- - -## AWS S3 - -[AWS Simple Storage Service (S3)](https://aws.amazon.com/s3/) is one of the -most widely adopted object storage solutions. - -The Barman Cloud plugin for CloudNativePG integrates with S3 through two -primary authentication mechanisms: - -- [IAM Roles for Service Accounts (IRSA)](https://docs.aws.amazon.com/eks/latest/userguide/iam-roles-for-service-accounts.html) — - recommended for clusters running on EKS -- Access keys — using `ACCESS_KEY_ID` and `ACCESS_SECRET_KEY` credentials - -### Access Keys - -To authenticate using access keys, you’ll need: - -- `ACCESS_KEY_ID`: the public key used to authenticate to S3 -- `ACCESS_SECRET_KEY`: the corresponding secret key -- `ACCESS_SESSION_TOKEN`: (optional) a temporary session token, if required - -These credentials must be stored securely in a Kubernetes secret: - -```sh -kubectl create secret generic aws-creds \ - --from-literal=ACCESS_KEY_ID= \ - --from-literal=ACCESS_SECRET_KEY= -# --from-literal=ACCESS_SESSION_TOKEN= # if required -``` - -The credentials will be encrypted at rest if your Kubernetes environment -supports it. - -You can then reference the secret in your `ObjectStore` definition: - -```yaml -apiVersion: barmancloud.cnpg.io/v1 -kind: ObjectStore -metadata: - name: aws-store -spec: - configuration: - destinationPath: "s3://BUCKET_NAME/path/to/folder" - s3Credentials: - accessKeyId: - name: aws-creds - key: ACCESS_KEY_ID - secretAccessKey: - name: aws-creds - key: ACCESS_SECRET_KEY - [...] -``` - -### IAM Role for Service Account (IRSA) - -To use IRSA with EKS, configure the service account of the PostgreSQL cluster -with the appropriate annotation: - -```yaml -apiVersion: postgresql.cnpg.io/v1 -kind: Cluster -metadata: - [...] -spec: - serviceAccountTemplate: - metadata: - annotations: - eks.amazonaws.com/role-arn: arn:[...] - [...] -``` - -### S3 Lifecycle Policy - -Barman Cloud uploads backup files to S3 but does not modify them afterward. -To enhance data durability and protect against accidental or malicious loss, -it's recommended to implement the following best practices: - -- Enable object versioning -- Enable object locking to prevent objects from being deleted or overwritten - for a defined period or indefinitely (this provides an additional layer of - protection against accidental deletion and ransomware attacks) -- Set lifecycle rules to expire current versions a few days after your Barman - retention window -- Expire non-current versions after a longer period - -These strategies help you safeguard backups without requiring broad delete -permissions, ensuring both security and compliance with minimal operational -overhead. - - -### S3-Compatible Storage Providers - -You can use S3-compatible services like **MinIO**, **Linode (Akamai) Object Storage**, -or **DigitalOcean Spaces** by specifying a custom `endpointURL`. - -Example with Linode (Akamai) Object Storage (`us-east1`): - -```yaml -apiVersion: barmancloud.cnpg.io/v1 -kind: ObjectStore -metadata: - name: linode-store -spec: - configuration: - destinationPath: "s3://BUCKET_NAME/" - endpointURL: "https://us-east1.linodeobjects.com" - s3Credentials: - [...] - [...] -``` - -Recent changes to the [boto3 implementation](https://github.com/boto/boto3/issues/4392) -of [Amazon S3 Data Integrity Protections](https://docs.aws.amazon.com/sdkref/latest/guide/feature-dataintegrity.html) -may lead to the `x-amz-content-sha256` error when using the Barman Cloud -Plugin. - -If you encounter this issue (see [GitHub issue #393](https://github.com/cloudnative-pg/plugin-barman-cloud/issues/393)), -you can apply the following workaround by setting specific environment -variables in the `ObjectStore` resource: - -```yaml -apiVersion: barmancloud.cnpg.io/v1 -kind: ObjectStore -metadata: - name: linode-store -spec: - instanceSidecarConfiguration: - env: - - name: AWS_REQUEST_CHECKSUM_CALCULATION - value: when_required - - name: AWS_RESPONSE_CHECKSUM_VALIDATION - value: when_required - [...] -``` - -These settings ensure that checksum calculations and validations are only -applied when explicitly required, avoiding compatibility issues with certain -S3-compatible storage providers. - -Example with DigitalOcean Spaces (SFO3, path-style): - -```yaml -apiVersion: barmancloud.cnpg.io/v1 -kind: ObjectStore -metadata: - name: digitalocean-store -spec: - configuration: - destinationPath: "s3://BUCKET_NAME/path/to/folder" - endpointURL: "https://sfo3.digitaloceanspaces.com" - s3Credentials: - [...] - [...] -``` - -### Using Object Storage with a Private CA - -For object storage services (e.g., MinIO) that use HTTPS with certificates -signed by a private CA, set the `endpointCA` field in the `ObjectStore` -definition. Unless you already have it, create a Kubernetes `Secret` with the -CA bundle: - -```sh -kubectl create secret generic my-ca-secret --from-file=ca.crt -``` - -Then reference it: - -```yaml -apiVersion: barmancloud.cnpg.io/v1 -kind: ObjectStore -metadata: - name: minio-store -spec: - configuration: - endpointURL: - endpointCA: - name: my-ca-secret - key: ca.crt - [...] -``` - - -:::note -If you want `ConfigMaps` and `Secrets` to be **automatically** reloaded by -instances, you can add a label with the key `cnpg.io/reload` to the -`Secrets`/`ConfigMaps`. Otherwise, you will have to reload the instances using the -`kubectl cnpg reload` subcommand. -::: - ---- - -## Azure Blob Storage - -[Azure Blob Storage](https://azure.microsoft.com/en-us/services/storage/blobs/) -is Microsoft’s cloud-based object storage solution. - -Barman Cloud supports the following authentication methods: - -- [Connection String](https://learn.microsoft.com/en-us/azure/storage/common/storage-configure-connection-string) -- Storage Account Name + [Access Key](https://learn.microsoft.com/en-us/azure/storage/common/storage-account-keys-manage) -- Storage Account Name + [SAS Token](https://learn.microsoft.com/en-us/azure/storage/blobs/sas-service-create) -- [Azure AD Workload Identity](https://azure.github.io/azure-workload-identity/docs/introduction.html) - -### Azure AD Workload Identity - -This method avoids storing credentials in Kubernetes via the -`.spec.configuration.inheritFromAzureAD` option: - -```yaml -apiVersion: barmancloud.cnpg.io/v1 -kind: ObjectStore -metadata: - name: azure-store -spec: - configuration: - destinationPath: "" - azureCredentials: - inheritFromAzureAD: true - [...] -``` - -### Access Key, SAS Token, or Connection String - -Store credentials in a Kubernetes secret: - -```sh -kubectl create secret generic azure-creds \ - --from-literal=AZURE_STORAGE_ACCOUNT= \ - --from-literal=AZURE_STORAGE_KEY= \ - --from-literal=AZURE_STORAGE_SAS_TOKEN= \ - --from-literal=AZURE_STORAGE_CONNECTION_STRING= -``` - -Then reference the required keys in your `ObjectStore`: - -```yaml -apiVersion: barmancloud.cnpg.io/v1 -kind: ObjectStore -metadata: - name: azure-store -spec: - configuration: - destinationPath: "" - azureCredentials: - connectionString: - name: azure-creds - key: AZURE_CONNECTION_STRING - storageAccount: - name: azure-creds - key: AZURE_STORAGE_ACCOUNT - storageKey: - name: azure-creds - key: AZURE_STORAGE_KEY - storageSasToken: - name: azure-creds - key: AZURE_STORAGE_SAS_TOKEN - [...] -``` - -For Azure Blob, the destination path format is: - -``` -://..core.windows.net// -``` - -### Azure-Compatible Providers - -If you're using a different implementation (e.g., Azurite or emulator): - -``` -://:/// -``` - ---- - -## Google Cloud Storage - -[Google Cloud Storage](https://cloud.google.com/storage/) is supported with two -authentication modes: - -- **GKE Workload Identity** (recommended inside Google Kubernetes Engine) -- **Service Account JSON key** via the `GOOGLE_APPLICATION_CREDENTIALS` environment variable - -### GKE Workload Identity - -Use the [Workload Identity authentication](https://cloud.google.com/kubernetes-engine/docs/how-to/workload-identity) -when running in GKE: - -1. Set `googleCredentials.gkeEnvironment` to `true` in the `ObjectStore` - resource -2. Annotate the `serviceAccountTemplate` in the `Cluster` resource with the GCP - service account - -For example, in the `ObjectStore` resource: - -```yaml -apiVersion: barmancloud.cnpg.io/v1 -kind: ObjectStore -metadata: - name: google-store -spec: - configuration: - destinationPath: "gs:///" - googleCredentials: - gkeEnvironment: true -``` - -And in the `Cluster` resource: - -```yaml -apiVersion: postgresql.cnpg.io/v1 -kind: Cluster -spec: - serviceAccountTemplate: - metadata: - annotations: - iam.gke.io/gcp-service-account: [...].iam.gserviceaccount.com -``` - -### Service Account JSON Key - -Follow Google’s [authentication setup](https://cloud.google.com/docs/authentication/getting-started), -then: - -```sh -kubectl create secret generic backup-creds --from-file=gcsCredentials=gcs_credentials_file.json -``` - -```yaml -apiVersion: barmancloud.cnpg.io/v1 -kind: ObjectStore -metadata: - name: google-store -spec: - configuration: - destinationPath: "gs:///" - googleCredentials: - applicationCredentials: - name: backup-creds - key: gcsCredentials - [...] -``` - -:::important -This authentication method generates a JSON file within the container -with all the credentials required to access your Google Cloud Storage -bucket. As a result, if someone gains access to the `Pod`, they will also have -write permissions to the bucket. -::: - ---- - - -## MinIO Object Store - -In order to use the Tenant resource you first need to deploy the -[MinIO operator](https://docs.min.io/community/minio-object-store/operations/deployments/installation.html). -For the latest documentation of MinIO, please refer to the -[MinIO official documentation](https://docs.min.io/community/minio-object-store/). - -MinIO Object Store's API is compatible with S3, and the default configuration of the Tenant -will create these services: -- `-console` on port 9090 (with autocert) or 9443 (without autocert) -- `-hl` on port 9000 -Where `` is the `metadata.name` you assigned to your Tenant resource. - -:::note -The `-console` service will only be available if you have enabled the -[MinIO Console](https://docs.min.io/community/minio-object-store/administration/minio-console.html). - -For example, the following Tenant: -```yml -apiVersion: minio.min.io/v2 -kind: Tenant -metadata: - name: cnpg-backups -spec: - [...] -``` -would have services called `cnpg-backups-console` and `cnpg-backups-hl` respectively. - -The `console` service is for managing the tenant, while the `hl` service exposes the S3 -compatible API. If your tenant is configured with `requestAutoCert` you will communicate -to these services over HTTPS, if not you will use HTTP. - -For authentication you can use your username and password, or create an access key. -Whichever method you choose, it has to be stored as a secret. - -```sh -kubectl create secret generic minio-creds \ - --from-literal=MINIO_ACCESS_KEY= \ - --from-literal=MINIO_SECRET_KEY= -``` - -Finally, create the Barman ObjectStore: - -```yaml -apiVersion: barmancloud.cnpg.io/v1 -kind: ObjectStore -metadata: - name: minio-store -spec: - configuration: - destinationPath: s3://BUCKET_NAME/ - endpointURL: http://-hl:9000 - s3Credentials: - accessKeyId: - name: minio-creds - key: MINIO_ACCESS_KEY - secretAccessKey: - name: minio-creds - key: MINIO_SECRET_KEY - [...] -``` - -:::important -Verify on `s3://BUCKET_NAME/` the presence of archived WAL files before -proceeding with a backup. -::: - ---- diff --git a/web/versioned_docs/version-0.8.0/observability.md b/web/versioned_docs/version-0.8.0/observability.md deleted file mode 100644 index 274b973..0000000 --- a/web/versioned_docs/version-0.8.0/observability.md +++ /dev/null @@ -1,24 +0,0 @@ ---- -sidebar_position: 55 ---- - -# Observability - - - -The Barman Cloud Plugin exposes the following metrics through the native -Prometheus exporter of the instance manager: - -- `barman_cloud_cloudnative_pg_io_last_failed_backup_timestamp`: - the UNIX timestamp of the most recent failed backup. - -- `barman_cloud_cloudnative_pg_io_last_available_backup_timestamp`: - the UNIX timestamp of the most recent successfully available backup. - -- `barman_cloud_cloudnative_pg_io_first_recoverability_point`: - the UNIX timestamp representing the earliest point in time from which the - cluster can be recovered. - -These metrics supersede the previously available in-core metrics that used the -`cnpg_collector` prefix. The new metrics are exposed under the -`barman_cloud_cloudnative_pg_io` prefix instead. diff --git a/web/versioned_docs/version-0.8.0/parameters.md b/web/versioned_docs/version-0.8.0/parameters.md deleted file mode 100644 index ca0cd2b..0000000 --- a/web/versioned_docs/version-0.8.0/parameters.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -sidebar_position: 100 ---- - -# Parameters - - - -The following parameters are available for the Barman Cloud Plugin: - -- `barmanObjectName`: references the `ObjectStore` resource to be used by the - plugin. -- `serverName`: Specifies the server name in the object store. - -:::important -The `serverName` parameter in the `ObjectStore` resource is retained solely for -API compatibility with the in-tree `barmanObjectStore` and must always be left empty. -When needed, use the `serverName` plugin parameter in the Cluster configuration instead. -::: diff --git a/web/versioned_docs/version-0.8.0/plugin-barman-cloud.v1.md b/web/versioned_docs/version-0.8.0/plugin-barman-cloud.v1.md deleted file mode 100644 index 7bd607c..0000000 --- a/web/versioned_docs/version-0.8.0/plugin-barman-cloud.v1.md +++ /dev/null @@ -1,108 +0,0 @@ -# API Reference - -## Packages -- [barmancloud.cnpg.io/v1](#barmancloudcnpgiov1) - - -## barmancloud.cnpg.io/v1 - -Package v1 contains API Schema definitions for the barmancloud v1 API group - -### Resource Types -- [ObjectStore](#objectstore) - - - -#### InstanceSidecarConfiguration - - - -InstanceSidecarConfiguration defines the configuration for the sidecar that runs in the instance pods. - - - -_Appears in:_ -- [ObjectStoreSpec](#objectstorespec) - -| Field | Description | Required | Default | Validation | -| --- | --- | --- | --- | --- | -| `env` _[EnvVar](https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.32/#envvar-v1-core) array_ | The environment to be explicitly passed to the sidecar | | | | -| `retentionPolicyIntervalSeconds` _integer_ | The retentionCheckInterval defines the frequency at which the
system checks and enforces retention policies. | | 1800 | | -| `resources` _[ResourceRequirements](https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.32/#resourcerequirements-v1-core)_ | Resources define cpu/memory requests and limits for the sidecar that runs in the instance pods. | | | | -| `additionalContainerArgs` _string array_ | AdditionalContainerArgs is an optional list of command-line arguments
to be passed to the sidecar container when it starts.
The provided arguments are appended to the container’s default arguments. | | | | -| `logLevel` _string_ | The log level for PostgreSQL instances. Valid values are: `error`, `warning`, `info` (default), `debug`, `trace` | | info | Enum: [error warning info debug trace]
| - - -#### ObjectStore - - - -ObjectStore is the Schema for the objectstores API. - - - - - -| Field | Description | Required | Default | Validation | -| --- | --- | --- | --- | --- | -| `apiVersion` _string_ | `barmancloud.cnpg.io/v1` | True | | | -| `kind` _string_ | `ObjectStore` | True | | | -| `metadata` _[ObjectMeta](https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.32/#objectmeta-v1-meta)_ | Refer to Kubernetes API documentation for fields of `metadata`. | True | | | -| `spec` _[ObjectStoreSpec](#objectstorespec)_ | Specification of the desired behavior of the ObjectStore.
More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#spec-and-status | True | | | -| `status` _[ObjectStoreStatus](#objectstorestatus)_ | Most recently observed status of the ObjectStore. This data may not be up to
date. Populated by the system. Read-only.
More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#spec-and-status | | | | - - -#### ObjectStoreSpec - - - -ObjectStoreSpec defines the desired state of ObjectStore. - - - -_Appears in:_ -- [ObjectStore](#objectstore) - -| Field | Description | Required | Default | Validation | -| --- | --- | --- | --- | --- | -| `configuration` _[BarmanObjectStoreConfiguration](https://pkg.go.dev/github.com/cloudnative-pg/barman-cloud/pkg/api#BarmanObjectStoreConfiguration)_ | The configuration for the barman-cloud tool suite | True | | | -| `retentionPolicy` _string_ | RetentionPolicy is the retention policy to be used for backups
and WALs (i.e. '60d'). The retention policy is expressed in the form
of `XXu` where `XX` is a positive integer and `u` is in `[dwm]` -
days, weeks, months. | | | Pattern: `^[1-9][0-9]*[dwm]$`
| -| `instanceSidecarConfiguration` _[InstanceSidecarConfiguration](#instancesidecarconfiguration)_ | The configuration for the sidecar that runs in the instance pods | | | | - - -#### ObjectStoreStatus - - - -ObjectStoreStatus defines the observed state of ObjectStore. - - - -_Appears in:_ -- [ObjectStore](#objectstore) - -| Field | Description | Required | Default | Validation | -| --- | --- | --- | --- | --- | -| `serverRecoveryWindow` _object (keys:string, values:[RecoveryWindow](#recoverywindow))_ | ServerRecoveryWindow maps each server to its recovery window | True | | | - - -#### RecoveryWindow - - - -RecoveryWindow represents the time span between the first -recoverability point and the last successful backup of a PostgreSQL -server, defining the period during which data can be restored. - - - -_Appears in:_ -- [ObjectStoreStatus](#objectstorestatus) - -| Field | Description | Required | Default | Validation | -| --- | --- | --- | --- | --- | -| `firstRecoverabilityPoint` _[Time](https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.32/#time-v1-meta)_ | The first recoverability point in a PostgreSQL server refers to
the earliest point in time to which the database can be
restored. | True | | | -| `lastSuccessfulBackupTime` _[Time](https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.32/#time-v1-meta)_ | The last successful backup time | True | | | -| `lastFailedBackupTime` _[Time](https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.32/#time-v1-meta)_ | The last failed backup time | True | | | - - diff --git a/web/versioned_docs/version-0.8.0/resource-name-migration.md b/web/versioned_docs/version-0.8.0/resource-name-migration.md deleted file mode 100644 index f5c1cc3..0000000 --- a/web/versioned_docs/version-0.8.0/resource-name-migration.md +++ /dev/null @@ -1,219 +0,0 @@ ---- -sidebar_position: 90 ---- - -# Resource name migration guide - - - -:::warning -Before proceeding with the migration process, please: -1. **Read this guide in its entirety** to understand what changes will be made -2. **Test in a non-production environment** first if possible -3. **Ensure you have proper backups** of your cluster configuration - -This migration will delete old RBAC resources only after the -`plugin-barman-cloud` upgrade. While the operation is designed to be safe, you -should review and understand the changes before proceeding. The maintainers of -this project are not responsible for any issues that may arise during -migration. - -**Note:** This guide assumes you are using the default `cnpg-system` namespace. -::: - -## Overview - -Starting from version **0.8.0**, the `plugin-barman-cloud` deployment manifests -use more specific, prefixed resource names to avoid conflicts with other -components deployed in the same Kubernetes cluster. - -## What Changed - -The following resources have been renamed to use proper prefixes. - -### Cluster-scoped Resources - -| Old Name | New Name | -|----------------------------|------------------------------------------| -| `metrics-auth-role` | `barman-plugin-metrics-auth-role` | -| `metrics-auth-rolebinding` | `barman-plugin-metrics-auth-rolebinding` | -| `metrics-reader` | `barman-plugin-metrics-reader` | -| `objectstore-viewer-role` | `barman-plugin-objectstore-viewer-role` | -| `objectstore-editor-role` | `barman-plugin-objectstore-editor-role` | - -### Namespace-scoped Resources - -| Old Name | New Name | Namespace | -|-------------------------------|---------------------------------------------|---------------| -| `leader-election-role` | `barman-plugin-leader-election-role` | `cnpg-system` | -| `leader-election-rolebinding` | `barman-plugin-leader-election-rolebinding` | `cnpg-system` | - -## Why This Change? - -Using generic names for cluster-wide resources is discouraged as they may -conflict with other components deployed in the same cluster. The new names make -it clear that these resources belong to the Barman Cloud plugin and help avoid -naming collisions. - -## Migration Instructions - -This three steps migration process is straightforward and can be completed with -a few `kubectl` commands. - -### Step 1: Upgrade plugin-barman-cloud - -Please refer to the [Installation](installation.mdx) section to deploy the new -`plugin-barman-cloud` release. - -### Step 2: Delete Old Cluster-scoped Resources - -:::danger Verify Resources Before Deletion -**IMPORTANT**: The old resource names are generic and could potentially belong -to other components in your cluster. - -**Before deleting each resource, verify it belongs to the Barman Cloud plugin -by checking:** -- For `objectstore-*` roles: Look for `barmancloud.cnpg.io` in the API groups -- For `metrics-*` roles: Check if they reference the `plugin-barman-cloud` - ServiceAccount in `cnpg-system` namespace -- For other roles: Look for labels like `app.kubernetes.io/name: plugin-barman-cloud` - -If a resource doesn't have these indicators, **DO NOT DELETE IT** as it may -belong to another application. - -Carefully review the output of each verification command before proceeding with -the `delete`. -::: - -:::tip Dry Run First -You can add `--dry-run=client` to any `kubectl delete` command to preview what -would be deleted without actually removing anything. -::: - -**Only proceed if you've verified these resources belong to the Barman Cloud -plugin (see warning above).** - -For each resource below, first verify it belongs to Barman Cloud, then delete -it: - -```bash -# 1. Check metrics-auth-rolebinding FIRST (we'll check the role after) -# Look for references to plugin-barman-cloud ServiceAccount -kubectl describe clusterrolebinding metrics-auth-rolebinding -# If it references plugin-barman-cloud ServiceAccount in cnpg-system namespace, -# delete it: -kubectl delete clusterrolebinding metrics-auth-rolebinding - -# 2. Check metrics-auth-role -# Look for references to authentication.k8s.io and authorization.k8s.io -kubectl describe clusterrole metrics-auth-role -# Verify it's not being used by any other rolebindings: -kubectl get clusterrolebinding -o json \ - | jq -r '.items[] | select(.roleRef.name=="metrics-auth-role") \ - | .metadata.name' -# If the above returns nothing (role is not in use) and the role looks like the -# Barman Cloud one, delete it (see warnings section): -kubectl delete clusterrole metrics-auth-role - -# 3. Check objectstore-viewer-role -# Look for barmancloud.cnpg.io API group or -# for `app.kubernetes.io/name: plugin-barman-cloud` label -kubectl describe clusterrole objectstore-viewer-role -# If it shows barmancloud.cnpg.io in API groups, delete it: -kubectl delete clusterrole objectstore-viewer-role - -# 4. Check objectstore-editor-role -# Look for barmancloud.cnpg.io API group or -# for `app.kubernetes.io/name: plugin-barman-cloud` label -kubectl describe clusterrole objectstore-editor-role -# If it shows barmancloud.cnpg.io in API groups, delete it: -kubectl delete clusterrole objectstore-editor-role - -# 5. Check metrics-reader (MOST DANGEROUS - very generic name) -# First, check if it's being used by any rolebindings OTHER than barman's: -kubectl get clusterrolebinding -o json | jq -r '.items[] \ - | select(.roleRef.name=="metrics-reader") \ - | "\(.metadata.name) -> \(.subjects[0].name) in \(.subjects[0].namespace)"' -# If this shows ANY rolebindings, review them carefully. Only proceed if -# they're all Barman-related. Then check the role itself: -kubectl describe clusterrole metrics-reader -# If it ONLY has nonResourceURLs: /metrics and NO other rolebindings use it, -# delete it: -kubectl delete clusterrole metrics-reader -``` - -:::warning -The `metrics-reader` role is particularly dangerous to delete blindly. Many -monitoring systems use this exact name. Only delete it if: - -1. You've verified it ONLY grants access to `/metrics` -2. No other rolebindings reference it (checked with the jq command above) -3. You're certain it was created by the Barman Cloud plugin - -If you're unsure, it's safer to leave it and let the new -`barman-plugin-metrics-reader` role coexist with it. -::: - -If any resource is not found during the `describe` command, that's okay - it -means it was never created or already deleted. Simply skip the delete command -for that resource. - -### Step 3: Delete Old Namespace-scoped Resources - -Delete the old namespace-scoped resources in the `cnpg-system` namespace: - -```bash -# Delete the old leader-election resources -kubectl delete role leader-election-role -n cnpg-system -kubectl delete rolebinding leader-election-rolebinding -n cnpg-system -``` - -If any resource is not found, that's okay - it means it was never created or -already deleted. - -## Impact - -- **Permissions:** If you have custom RBAC rules or tools that reference the - old resource names, they will need to be updated. -- **External Users:** If end users have been granted the - `objectstore-viewer-role` or `objectstore-editor-role`, they will need to be - re-granted the new role names (`barman-plugin-objectstore-viewer-role` and - `barman-plugin-objectstore-editor-role`). - -## Verification - -After migration, verify that the new resources are created: - -```bash -# Check cluster-scoped resources -kubectl get clusterrole | grep barman -kubectl get clusterrolebinding | grep barman - -# Check namespace-scoped resources -kubectl get role,rolebinding -n cnpg-system | grep barman -``` - -You should see the new prefixed resource names. - -## Troubleshooting - -### Plugin Not Starting After Migration - -If the plugin fails to start after migration, check: - -1. **ServiceAccount permissions:** Ensure the `plugin-barman-cloud` ServiceAccount is bound to the new roles: - ```bash - kubectl get clusterrolebinding barman-plugin-metrics-auth-rolebinding -o yaml - kubectl get rolebinding barman-plugin-leader-election-rolebinding -n cnpg-system -o yaml - ``` - -2. **Role references:** Verify that the rolebindings reference the correct role names: - ```bash - kubectl describe rolebinding barman-plugin-leader-election-rolebinding -n cnpg-system - kubectl describe clusterrolebinding barman-plugin-metrics-auth-rolebinding - ``` - -## Support - -If you encounter issues during migration, please open an issue on the [GitHub -repository](https://github.com/cloudnative-pg/plugin-barman-cloud/issues). diff --git a/web/versioned_docs/version-0.8.0/retention.md b/web/versioned_docs/version-0.8.0/retention.md deleted file mode 100644 index fefbd08..0000000 --- a/web/versioned_docs/version-0.8.0/retention.md +++ /dev/null @@ -1,38 +0,0 @@ ---- -sidebar_position: 60 ---- - -# Retention Policies - - - -The Barman Cloud Plugin supports **automated cleanup of obsolete backups** via -retention policies, configured in the `.spec.retentionPolicy` field of the -`ObjectStore` resource. - -:::note -This feature uses the `barman-cloud-backup-delete` command with the -`--retention-policy "RECOVERY WINDOW OF {{ value }} {{ unit }}"` syntax. -::: - -#### Example: 30-Day Retention Policy - -```yaml -apiVersion: barmancloud.cnpg.io/v1 -kind: ObjectStore -metadata: - name: my-store -spec: - [...] - retentionPolicy: "30d" -```` - -:::note -A **recovery window retention policy** ensures the cluster can be restored to -any point in time between the calculated *Point of Recoverability* (PoR) and -the latest WAL archive. The PoR is defined as `current time - recovery window`. -The **first valid backup** is the most recent backup completed before the PoR. -Backups older than that are marked as *obsolete* and deleted after the next -backup completes. -::: - diff --git a/web/versioned_docs/version-0.8.0/troubleshooting.md b/web/versioned_docs/version-0.8.0/troubleshooting.md deleted file mode 100644 index 0d9852c..0000000 --- a/web/versioned_docs/version-0.8.0/troubleshooting.md +++ /dev/null @@ -1,580 +0,0 @@ ---- -sidebar_position: 90 ---- - -# Troubleshooting - - - -This guide helps you diagnose and resolve common issues with the Barman Cloud -plugin. - -:::important -We are continuously improving the integration between CloudNativePG and the -Barman Cloud plugin as it moves toward greater stability and maturity. For this -reason, we recommend using the latest available version of both components. -See the [*Requirements* section](intro.md#requirements) for details. -::: - -:::note -The following commands assume you installed the CloudNativePG operator in -the default `cnpg-system` namespace. If you installed it in a different -namespace, adjust the commands accordingly. -::: - -## Viewing Logs - -To troubleshoot effectively, you’ll often need to review logs from multiple -sources: - -```sh -# View operator logs (includes plugin interaction logs) -kubectl logs -n cnpg-system deployment/cnpg-controller-manager -f - -# View plugin manager logs -kubectl logs -n cnpg-system deployment/barman-cloud -f - -# View sidecar container logs (Barman Cloud operations) -kubectl logs -n -c plugin-barman-cloud -f - -# View all containers in a pod -kubectl logs -n --all-containers=true - -# View previous container logs (if container restarted) -kubectl logs -n -c plugin-barman-cloud --previous -``` - -## Common Issues - -### Plugin Installation Issues - -#### Plugin pods not starting - -**Symptoms:** - -- Plugin pods stuck in `CrashLoopBackOff` or `Error` -- Plugin deployment not ready - -**Possible causes and solutions:** - -1. **Certificate issues** - - ```sh - # Check if cert-manager is installed and running - kubectl get pods -n cert-manager - - # Check if the plugin certificate is created - kubectl get certificates -n cnpg-system - ``` - - If cert-manager is not installed, install it first: - - ```sh - # Note: other installation methods for cert-manager are available - kubectl apply -f \ - https://github.com/cert-manager/cert-manager/releases/latest/download/cert-manager.yaml - ``` - - If you are using your own certificates without cert-manager, you will need - to verify the entire certificate chain yourself. - - -2. **Image pull errors** - - ```sh - # Check pod events for image pull errors - kubectl describe pod -n cnpg-system -l app=barman-cloud - ``` - - Verify the image exists and you have proper credentials if using a private - registry. - - -3. **Resource constraints** - - ```sh - # Check node resources - kubectl top nodes - kubectl describe nodes - ``` - - Make sure your cluster has sufficient CPU and memory resources. - -### Backup Failures - -#### Quick Backup Troubleshooting Checklist - -When a backup fails, follow these steps in order: - -1. **Check backup status**: - - ```sh - kubectl get backups.postgresql.cnpg.io -n - ``` -2. **Get error details and target pod**: - - ```sh - kubectl describe backups.postgresql.cnpg.io \ - -n - - kubectl get backups.postgresql.cnpg.io \ - -n \ - -o jsonpath='{.status.instanceID.podName}' - ``` -3. **Check the target pod’s sidecar logs**: - - ```sh - TARGET_POD=$(kubectl get backups.postgresql.cnpg.io \ - -n \ - -o jsonpath='{.status.instanceID.podName}') - - kubectl logs \ - -n $TARGET_POD -c plugin-barman-cloud \ - --tail=100 | grep -E "ERROR|FATAL|panic" - ``` -4. **Check cluster events**: - - ```sh - kubectl get events -n \ - --field-selector involvedObject.name= \ - --sort-by='.lastTimestamp' - ``` -5. **Verify plugin is running**: - - ```sh - kubectl get pods \ - -n cnpg-system -l app=barman-cloud - ``` -6. **Check operator logs**: - - ```sh - kubectl logs \ - -n cnpg-system deployment/cnpg-controller-manager \ - --tail=100 | grep -i "backup\|plugin" - ``` -7. **Check plugin manager logs**: - - ```sh - kubectl logs \ - -n cnpg-system deployment/barman-cloud --tail=100 - ``` - -#### Backup job fails immediately - -**Symptoms:** - -- Backup pods terminate with error -- No backup files appear in object storage -- Backup shows `failed` phase with various error messages - -**Common failure modes and solutions:** - -1. **"requested plugin is not available" errors** - - ``` - requested plugin is not available: barman - requested plugin is not available: barman-cloud - requested plugin is not available: barman-cloud.cloudnative-pg.io - ``` - - **Cause:** The plugin name in the Cluster configuration doesn’t match the - deployed plugin, or the plugin isn’t registered. - - **Solution:** - - a. **Check plugin registration:** - - ```sh - # If you have the `cnpg` plugin installed (v1.27.0+) - kubectl cnpg status -n - ``` - - Look for the "Plugins status" section: - ``` - Plugins status - Name Version Status Reported Operator Capabilities - ---- ------- ------ ------------------------------ - barman-cloud.cloudnative-pg.io 0.6.0 N/A Reconciler Hooks, Lifecycle Service - ``` - - b. **Verify plugin name in `Cluster` spec**: - - ```yaml - apiVersion: postgresql.cnpg.io/v1 - kind: Cluster - spec: - plugins: - - name: barman-cloud.cloudnative-pg.io - parameters: - barmanObjectName: - ``` - - c. **Check plugin deployment is running**: - - ```sh - kubectl get deployment -n cnpg-system barman-cloud - ``` - -2. **"rpc error: code = Unknown desc = panic caught: assignment to entry in nil map" errors** - - **Cause:** Misconfiguration in the `ObjectStore` (e.g., typo or missing field). - - **Solution:** - - - Review sidecar logs for details - - Verify `ObjectStore` configuration and secrets - - Common issues include: - - Missing or incorrect secret references - - Typos in configuration parameters - - Missing required environment variables in secrets - -#### Backup performance issues - -**Symptoms:** - -- Backups take extremely long -- Backups timeout - -**Plugin-specific considerations:** - -1. **Check `ObjectStore` parallelism settings** - - Adjust `maxParallel` in `ObjectStore` configuration - - Monitor sidecar container resource usage during backups - -2. **Verify plugin resource allocation** - - Check if the sidecar container has sufficient CPU/memory - - Review plugin container logs for resource-related warnings - -:::tip -For Barman-specific features like compression, encryption, and performance -tuning, refer to the [Barman documentation](https://docs.pgbarman.org/latest/). -::: - -### WAL Archiving Issues - -#### WAL archiving stops - -**Symptoms:** - -- WAL files accumulate on the primary -- Cluster shows WAL archiving warnings -- Sidecar logs show WAL errors - -**Debugging steps:** - -1. **Check plugin sidecar logs for WAL archiving errors** - ```sh - # Check recent WAL archive operations in sidecar - kubectl logs -n -c plugin-barman-cloud \ - --tail=50 | grep -i wal - ``` - -2. **Check ObjectStore configuration for WAL settings** - - Ensure ObjectStore has proper WAL retention settings - - Verify credentials have permissions for WAL operations - -### Restore Issues - -#### Restore fails during recovery - -**Symptoms:** - -- New cluster stuck in recovery -- Plugin sidecar shows restore errors -- PostgreSQL won’t start - -**Debugging steps:** - -1. **Check plugin sidecar logs during restore** - - ```sh - # Check the sidecar logs on the recovering cluster pods - kubectl logs -n \ - -c plugin-barman-cloud --tail=100 - - # Look for restore-related errors - kubectl logs -n \ - -c plugin-barman-cloud | grep -E "restore|recovery|ERROR" - ``` - -2. **Verify plugin can access backups** - - ```sh - # Check if `ObjectStore` is properly configured for restore - kubectl get objectstores.barmancloud.cnpg.io \ - -n -o yaml - - # Check PostgreSQL recovery logs - kubectl logs -n \ - -c postgres | grep -i recovery - ``` - -:::tip -For detailed Barman restore operations and troubleshooting, refer to the -[Barman documentation](https://docs.pgbarman.org/latest/barman-cloud-restore.html). -::: - -#### Point-in-time recovery (PITR) configuration issues - -**Symptoms:** - -- PITR doesn’t reach target time -- WAL access errors -- Recovery halts early - -**Debugging steps:** - -1. **Verify PITR configuration in the `Cluster` spec** - - ```yaml - apiVersion: postgresql.cnpg.io/v1 - kind: Cluster - metadata: - name: - spec: - storage: - size: 1Gi - - bootstrap: - recovery: - source: origin - recoveryTarget: - targetTime: "2024-01-15 10:30:00" - - externalClusters: - - name: origin - plugin: - enabled: true - name: barman-cloud.cloudnative-pg.io - parameters: - barmanObjectName: - serverName: - ``` - -2. **Check sidecar logs for WAL-related errors** - - ```sh - kubectl logs -n \ - -c plugin-barman-cloud | grep -i wal - ``` - -:::note -For detailed PITR configuration and WAL management, see the -[Barman PITR documentation](https://docs.pgbarman.org/latest/). -::: - -### Plugin Configuration Issues - -#### Plugin cannot connect to object storage - -**Symptoms:** - -- Sidecar logs show connection errors -- Backups fail with authentication or network errors -- `ObjectStore` resource reports errors - -**Solution:** - -1. **Verify `ObjectStore` CRD configuration and secrets** - - ```sh - # Check ObjectStore resource status - kubectl get objectstores.barmancloud.cnpg.io \ - -n -o yaml - - # Verify the secret exists and has correct keys for your provider - kubectl get secret -n \ - -o jsonpath='{.data}' | jq 'keys' - ``` - -2. **Check sidecar logs for connectivity issues** - ```sh - kubectl logs -n \ - -c plugin-barman-cloud | grep -E "connect|timeout|SSL|cert" - ``` - -3. **Adjust provider-specific settings (endpoint, path style, etc.)** - - See [Object Store Configuration](object_stores.md) for provider-specific settings - - Ensure `endpointURL` match your storage type - - Verify network policies allow egress to your storage provider - -## Diagnostic Commands - -### Using the `cnpg` plugin for `kubectl` - -The `cnpg` plugin for `kubectl` provides extended debugging capabilities. -Keep it updated: - -```sh -# Install or update the `cnpg` plugin -kubectl krew install cnpg -# Or using an alternative method: https://cloudnative-pg.io/documentation/current/kubectl-plugin/#install - -# Check plugin status (requires CNPG 1.27.0+) -kubectl cnpg status -n - -# View cluster status in detail -kubectl cnpg status -n --verbose -``` - -## Getting Help - -If problems persist: - -1. **Check the documentation** - - - [Installation Guide](installation.mdx) - - [Object Store Configuration](object_stores.md) (for provider-specific settings) - - [Usage Examples](usage.md) - - -2. **Gather diagnostic information** - - ```sh - # Create a diagnostic bundle (⚠️ sanitize these before sharing!) - kubectl get objectstores.barmancloud.cnpg.io -A -o yaml > /tmp/objectstores.yaml - kubectl get clusters.postgresql.cnpg.io -A -o yaml > /tmp/clusters.yaml - kubectl logs -n cnpg-system deployment/barman-cloud --tail=1000 > /tmp/plugin.log - ``` - - -3. **Community support** - - - CloudNativePG Slack: [#cloudnativepg-users](https://cloud-native.slack.com/messages/cloudnativepg-users) - - GitHub Issues: [plugin-barman-cloud](https://github.com/cloudnative-pg/plugin-barman-cloud/issues) - - -4. **Include when reporting** - - - CloudNativePG version - - Plugin version - - Kubernetes version - - Cloud provider and region - - Relevant configuration (⚠️ sanitize/redact sensitive information) - - Error messages and logs - - Steps to reproduce - -## Known Issues and Limitations - -### Current Known Issues - -1. **Migration compatibility**: After migrating from in-tree backup to the - plugin, the `kubectl cnpg backup` command syntax has changed - ([#353](https://github.com/cloudnative-pg/plugin-barman-cloud/issues/353)): - - ```sh - # Old command (in-tree, no longer works after migration) - kubectl cnpg backup -n \ - --method=barmanObjectStore - - # New command (plugin-based) - kubectl cnpg backup -n \ - --method=plugin --plugin-name=barman-cloud.cloudnative-pg.io - ``` - -### Plugin Limitations - -1. **Installation method**: Currently only supports manifest and Kustomize - installation ([#351](https://github.com/cloudnative-pg/plugin-barman-cloud/issues/351) - - Helm chart requested) - -2. **Sidecar resource sharing**: The plugin sidecar container shares pod - resources with PostgreSQL - -3. **Plugin restart behavior**: Restarting the sidecar container requires - restarting the entire PostgreSQL pod - -## Recap of General Debugging Steps - -### Check Backup Status and Identify the Target Instance - -```sh -# List all backups and their status -kubectl get backups.postgresql.cnpg.io -n - -# Get detailed backup information including error messages and target instance -kubectl describe backups.postgresql.cnpg.io \ - -n - -# Extract the target pod name from a failed backup -kubectl get backups.postgresql.cnpg.io \ - -n \ - -o jsonpath='{.status.instanceID.podName}' - -# Get more details including the target pod, method, phase, and error -kubectl get backups.postgresql.cnpg.io \ - -n \ - -o jsonpath='Pod: {.status.instanceID.podName}{"\n"}Method: {.status.method}{"\n"}Phase: {.status.phase}{"\n"}Error: {.status.error}{"\n"}' - -# Check the cluster status for backup-related information -kubectl cnpg status -n --verbose -``` - -### Check Sidecar Logs on the Backup Target Pod - -```sh -# Identify which pod was the backup target (from the previous step) -TARGET_POD=$(kubectl get backups.postgresql.cnpg.io \ - -n \ - -o jsonpath='{.status.instanceID.podName}') -echo "Backup target pod: $TARGET_POD" - -# Check the sidecar logs on the specific target pod -kubectl logs -n $TARGET_POD \ - -c plugin-barman-cloud --tail=100 - -# Follow the logs in real time -kubectl logs -n $TARGET_POD \ - -c plugin-barman-cloud -f - -# Check for specific errors in the target pod around the backup time -kubectl logs -n $TARGET_POD \ - -c plugin-barman-cloud --since=10m | grep -E "ERROR|FATAL|panic|failed" - -# Alternative: List all cluster pods and their roles -kubectl get pods -n -l cnpg.io/cluster= \ - -o custom-columns=NAME:.metadata.name,ROLE:.metadata.labels.cnpg\\.io/instanceRole,INSTANCE:.metadata.labels.cnpg\\.io/instanceName - -# Check sidecar logs on ALL cluster pods (if the target is unclear) -for pod in $(kubectl get pods -n -l cnpg.io/cluster= -o name); do - echo "=== Checking $pod ===" - kubectl logs -n $pod -c plugin-barman-cloud \ - --tail=20 | grep -i error || echo "No errors found" -done -``` - -### Check Events for Backup-Related Issues - -```sh -# Check events for the cluster -kubectl get events -n \ - --field-selector involvedObject.name= - -# Check events for failed backups -kubectl get events -n \ - --field-selector involvedObject.kind=Backup - -# Get all recent events in the namespace -kubectl get events -n --sort-by='.lastTimestamp' | tail -20 -``` - -### Verify `ObjectStore` Configuration - -```sh -# Check the ObjectStore resource -kubectl get objectstores.barmancloud.cnpg.io \ - -n -o yaml - -# Verify the secret exists and has the correct keys -kubectl get secret -n -o yaml -# Alternatively -kubectl get secret -n -o jsonpath='{.data}' | jq 'keys' -``` - -### Common Error Messages and Solutions - -* **"AccessDenied" or "403 Forbidden"** — Check cloud credentials and bucket permissions. -* **"NoSuchBucket"** — Verify the bucket exists and the endpoint URL is correct. -* **"Connection timeout"** — Check network connectivity and firewall rules. -* **"SSL certificate problem"** — For self-signed certificates, verify the CA bundle configuration. - diff --git a/web/versioned_docs/version-0.8.0/upgrades.mdx b/web/versioned_docs/version-0.8.0/upgrades.mdx deleted file mode 100644 index 0ab9ddb..0000000 --- a/web/versioned_docs/version-0.8.0/upgrades.mdx +++ /dev/null @@ -1,16 +0,0 @@ ---- -sidebar_position: 25 ---- - -# Upgrades - - - -You can upgrade the plugin simply by installing the new version. Unless -explicitly stated below or in the release notes, no special steps are required. - -## Upgrading to version 0.8.x from previous versions - -Version **0.8.0** introduces breaking changes to resource naming. -To complete the upgrade successfully, follow the instructions in the -["Resource name migration guide"](resource-name-migration.md). diff --git a/web/versioned_docs/version-0.8.0/usage.md b/web/versioned_docs/version-0.8.0/usage.md deleted file mode 100644 index 6406d38..0000000 --- a/web/versioned_docs/version-0.8.0/usage.md +++ /dev/null @@ -1,283 +0,0 @@ ---- -sidebar_position: 30 ---- - -# Using the Barman Cloud Plugin - - - -After [installing the plugin](installation.mdx) in the same namespace as the -CloudNativePG operator, enabling your PostgreSQL cluster to use the Barman -Cloud Plugin involves just a few steps: - -- Defining the object store containing your WAL archive and base backups, using - your preferred [provider](object_stores.md) -- Instructing the Postgres cluster to use the Barman Cloud Plugin - -From that moment, you’ll be able to issue on-demand backups or define a backup -schedule, as well as rely on the object store for recovery operations. - -The rest of this page details each step, using MinIO as object store provider. - -## Defining the `ObjectStore` - -An `ObjectStore` resource must be created for each object store used in your -PostgreSQL architecture. Here's an example configuration using MinIO: - -```yaml -apiVersion: barmancloud.cnpg.io/v1 -kind: ObjectStore -metadata: - name: minio-store -spec: - configuration: - destinationPath: s3://backups/ - endpointURL: http://minio:9000 - s3Credentials: - accessKeyId: - name: minio - key: ACCESS_KEY_ID - secretAccessKey: - name: minio - key: ACCESS_SECRET_KEY - wal: - compression: gzip -``` - -The `.spec.configuration` schema follows the same format as the -[in-tree barman-cloud support](https://pkg.go.dev/github.com/cloudnative-pg/barman-cloud/pkg/api#BarmanObjectStoreConfiguration). -Refer to [the CloudNativePG documentation](https://cloudnative-pg.io/documentation/current/appendixes/backup_barmanobjectstore/) -for additional details. - -:::important -The `serverName` parameter in the `ObjectStore` resource is retained solely for -API compatibility with the in-tree `barmanObjectStore` and must always be left empty. -When needed, use the `serverName` plugin parameter in the Cluster configuration instead. -::: - -## Configuring WAL Archiving - -Once the `ObjectStore` is defined, you can configure your PostgreSQL cluster -to archive WALs by referencing the store in the `.spec.plugins` section: - -```yaml -apiVersion: postgresql.cnpg.io/v1 -kind: Cluster -metadata: - name: cluster-example -spec: - instances: 3 - imagePullPolicy: Always - plugins: - - name: barman-cloud.cloudnative-pg.io - isWALArchiver: true - parameters: - barmanObjectName: minio-store - storage: - size: 1Gi -``` - -This configuration enables both WAL archiving and data directory backups. - -## Performing a Base Backup - -Once WAL archiving is enabled, the cluster is ready for backups. Backups can be -created either declaratively (with YAML manifests) or imperatively (with the -`cnpg` plugin). - -### Declarative approach (YAML manifest) - -Create a backup resource by applying a YAML manifest: - -```yaml -apiVersion: postgresql.cnpg.io/v1 -kind: Backup -metadata: - name: backup-example -spec: - cluster: - name: cluster-example - method: plugin - pluginConfiguration: - name: barman-cloud.cloudnative-pg.io -``` - -### Imperative approach (using the `cnpg` plugin) - -The quickest way to trigger an on-demand backup is with the `cnpg` plugin: - -```bash -kubectl cnpg backup -n \ - --method=plugin \ - --plugin-name=barman-cloud.cloudnative-pg.io -``` - -:::note Migration from in-tree backups -If you are migrating from the in-tree backup system, note the change in syntax: - -```bash -# Old command (in-tree backup) -kubectl cnpg backup -n --method=barmanObjectStore - -# New command (plugin-based backup) -kubectl cnpg backup -n \ - --method=plugin \ - --plugin-name=barman-cloud.cloudnative-pg.io -``` -::: - -## Restoring a Cluster - -To restore a cluster from an object store, create a new `Cluster` resource that -references the store containing the backup. Below is an example configuration: - -```yaml -apiVersion: postgresql.cnpg.io/v1 -kind: Cluster -metadata: - name: cluster-restore -spec: - instances: 3 - imagePullPolicy: IfNotPresent - bootstrap: - recovery: - source: source - externalClusters: - - name: source - plugin: - name: barman-cloud.cloudnative-pg.io - parameters: - barmanObjectName: minio-store - serverName: cluster-example - storage: - size: 1Gi -``` - -:::important -The above configuration does **not** enable WAL archiving for the restored cluster. -::: - -To enable WAL archiving for the restored cluster, include the `.spec.plugins` -section alongside the `externalClusters.plugin` section, as shown below: - -```yaml -apiVersion: postgresql.cnpg.io/v1 -kind: Cluster -metadata: - name: cluster-restore -spec: - instances: 3 - imagePullPolicy: IfNotPresent - bootstrap: - recovery: - source: source - plugins: - - name: barman-cloud.cloudnative-pg.io - isWALArchiver: true - parameters: - # Backup Object Store (push, read-write) - barmanObjectName: minio-store-bis - externalClusters: - - name: source - plugin: - name: barman-cloud.cloudnative-pg.io - parameters: - # Recovery Object Store (pull, read-only) - barmanObjectName: minio-store - serverName: cluster-example - storage: - size: 1Gi -``` - -The same object store may be used for both transaction log archiving and -restoring a cluster, or you can configure separate stores for these purposes. - -## Configuring Replica Clusters - -You can set up a distributed topology by combining the previously defined -configurations with the `.spec.replica` section. Below is an example of how to -define a replica cluster: - -```yaml -apiVersion: postgresql.cnpg.io/v1 -kind: Cluster -metadata: - name: cluster-dc-a -spec: - instances: 3 - primaryUpdateStrategy: unsupervised - - storage: - storageClass: csi-hostpath-sc - size: 1Gi - - plugins: - - name: barman-cloud.cloudnative-pg.io - isWALArchiver: true - parameters: - barmanObjectName: minio-store-a - - replica: - self: cluster-dc-a - primary: cluster-dc-a - source: cluster-dc-b - - externalClusters: - - name: cluster-dc-a - plugin: - name: barman-cloud.cloudnative-pg.io - parameters: - barmanObjectName: minio-store-a - - - name: cluster-dc-b - plugin: - name: barman-cloud.cloudnative-pg.io - parameters: - barmanObjectName: minio-store-b -``` - -## Configuring the plugin instance sidecar - -The Barman Cloud Plugin runs as a sidecar container next to each PostgreSQL -instance pod. It manages backup, WAL archiving, and restore processes. - -Configuration comes from multiple `ObjectStore` resources: - -1. The one referenced in the - `.spec.plugins` section of the `Cluster`. This is the - object store used for WAL archiving and base backups. -2. The one referenced in the external cluster - used in the `.spec.replica.source` section of the `Cluster`. This is - used by the log-shipping designated primary to get the WAL files. -3. The one referenced in the - `.spec.bootstrap.recovery.source` section of the `Cluster`. Used by - the initial recovery job to create the cluster from an existing backup. - -You can fine-tune sidecar behavior in the `.spec.instanceSidecarConfiguration` -of your ObjectStore. These settings apply to all PostgreSQL instances that use -this object store. Any updates take effect at the next `Cluster` reconciliation, -and could generate a rollout of the `Cluster`. - -```yaml -apiVersion: barmancloud.cnpg.io/v1 -kind: ObjectStore -metadata: - name: minio-store -spec: - configuration: - # [...] - instanceSidecarConfiguration: - retentionPolicyIntervalSeconds: 1800 - resources: - requests: - memory: "XXX" - cpu: "YYY" - limits: - memory: "XXX" - cpu: "YYY" -``` - -:::note -If more than one `ObjectStore` applies, the `instanceSidecarConfiguration` of -the one set in `.spec.plugins` has priority. -::: diff --git a/web/versioned_docs/version-0.9.0/compression.md b/web/versioned_docs/version-0.9.0/compression.md deleted file mode 100644 index 2abbede..0000000 --- a/web/versioned_docs/version-0.9.0/compression.md +++ /dev/null @@ -1,43 +0,0 @@ ---- -sidebar_position: 80 ---- - -# Compression - - - -By default, backups and WAL files are archived **uncompressed**. However, the -Barman Cloud Plugin supports multiple compression algorithms via -`barman-cloud-backup` and `barman-cloud-wal-archive`, allowing you to optimize -for space, speed, or a balance of both. - -### Supported Compression Algorithms - -- `bzip2` -- `gzip` -- `lz4` (WAL only) -- `snappy` -- `xz` (WAL only) -- `zstd` (WAL only) - -Compression settings for base backups and WAL archives are configured -independently. For implementation details, refer to the corresponding API -definitions: - -- [`DataBackupConfiguration`](https://pkg.go.dev/github.com/cloudnative-pg/barman-cloud/pkg/api#DataBackupConfiguration) -- [`WALBackupConfiguration`](https://pkg.go.dev/github.com/cloudnative-pg/barman-cloud/pkg/api#WalBackupConfiguration) - -:::important -Compression impacts both performance and storage efficiency. Choose the right -algorithm based on your recovery time objectives (RTO), storage capacity, and -network throughput. -::: - -## Compression Benchmark (on MinIO) - -| Compression | Backup Time (ms) | Restore Time (ms) | Uncompressed Size (MB) | Compressed Size (MB) | Ratio | -| ----------- | ---------------- | ----------------- | ---------------------- | -------------------- | ----- | -| None | 10,927 | 7,553 | 395 | 395 | 1.0:1 | -| bzip2 | 25,404 | 13,886 | 395 | 67 | 5.9:1 | -| gzip | 116,281 | 3,077 | 395 | 91 | 4.3:1 | -| snappy | 8,134 | 8,341 | 395 | 166 | 2.4:1 | diff --git a/web/versioned_docs/version-0.9.0/concepts.md b/web/versioned_docs/version-0.9.0/concepts.md deleted file mode 100644 index 3832df3..0000000 --- a/web/versioned_docs/version-0.9.0/concepts.md +++ /dev/null @@ -1,177 +0,0 @@ ---- -sidebar_position: 10 ---- - -# Main Concepts - - - -:::important -Before proceeding, make sure to review the following sections of the -CloudNativePG documentation: - -- [**Backup**](https://cloudnative-pg.io/documentation/current/backup/) -- [**WAL Archiving**](https://cloudnative-pg.io/documentation/current/wal_archiving/) -- [**Recovery**](https://cloudnative-pg.io/documentation/current/recovery/) -::: - -The **Barman Cloud Plugin** enables **hot (online) backups** of PostgreSQL -clusters in CloudNativePG through [`barman-cloud`](https://pgbarman.org), -supporting continuous physical backups and WAL archiving to an **object -store**—without interrupting write operations. - -It also supports both **full recovery** and **Point-in-Time Recovery (PITR)** -of a PostgreSQL cluster. - -## The Object Store - -At the core is the [`ObjectStore` custom resource (CRD)](plugin-barman-cloud.v1.md#objectstorespec), -which acts as the interface between the PostgreSQL cluster and the target -object storage system. It allows you to configure: - -- **Authentication and bucket location** via the `.spec.configuration` section -- **WAL archiving** settings—such as compression type, parallelism, and - server-side encryption—under `.spec.configuration.wal` -- **Base backup options**—with similar settings for compression, concurrency, - and encryption—under `.spec.configuration.data` -- **Retention policies** to manage the life-cycle of archived WALs and backups - via `.spec.configuration.retentionPolicy` - -WAL files are archived in the `wals` directory, while base backups are stored -as **tarballs** in the `base` directory, following the -[Barman Cloud convention](https://docs.pgbarman.org/cloud/latest/usage/#object-store-layout). - -The plugin also offers advanced capabilities, including -[backup tagging](misc.md#backup-object-tagging) and -[extra options for backups and WAL archiving](misc.md#extra-options-for-backup-and-wal-archiving). - -:::tip -For details, refer to the -[API reference for the `ObjectStore` resource](plugin-barman-cloud.v1.md#objectstorespec). -::: - -## Integration with a CloudNativePG Cluster - -CloudNativePG can delegate continuous backup and recovery responsibilities to -the **Barman Cloud Plugin** by configuring the `.spec.plugins` section of a -`Cluster` resource. This setup requires a corresponding `ObjectStore` resource -to be defined. - -:::important -While it is technically possible to reuse the same `ObjectStore` for multiple -`Cluster` resources within the same namespace, it is strongly recommended to -dedicate one object store per PostgreSQL cluster to ensure data isolation and -operational clarity. -::: - -The following example demonstrates how to configure a CloudNativePG cluster -named `cluster-example` to use a previously defined `ObjectStore` (also named -`cluster-example`) in the same namespace. Setting `isWALArchiver: true` enables -WAL archiving through the plugin: - -```yaml -apiVersion: postgresql.cnpg.io/v1 -kind: Cluster -metadata: - name: cluster-example -spec: - # Other cluster settings... - plugins: - - name: barman-cloud.cloudnative-pg.io - isWALArchiver: true - parameters: - barmanObjectName: cluster-example -``` - -## Backup of a Postgres Cluster - -Once the object store is defined and the `Cluster` is configured to use the -Barman Cloud Plugin, **WAL archiving is activated immediately** on the -PostgreSQL primary. - -Physical base backups are seamlessly managed by CloudNativePG using the -`Backup` and `ScheduledBackup` resources, respectively for -[on-demand](https://cloudnative-pg.io/documentation/current/backup/#on-demand-backups) -and -[scheduled](https://cloudnative-pg.io/documentation/current/backup/#scheduled-backups) -backups. - -To use the Barman Cloud Plugin, you must set the `method` to `plugin` and -configure the `pluginConfiguration` section as shown: - -```yaml -[...] -spec: - method: plugin - pluginConfiguration: - name: barman-cloud.cloudnative-pg.io - [...] -``` - -With this configuration, CloudNativePG supports: - -- Backups from both **primary** and **standby** instances -- Backups from **designated primaries** in a distributed topology using - [replica clusters](https://cloudnative-pg.io/documentation/current/replica_cluster/) - -:::tip -For details on how to back up from a standby, refer to the official documentation: -[Backup from a standby](https://cloudnative-pg.io/documentation/current/backup/#backup-from-a-standby). -::: - -:::important -Both backup and WAL archiving operations are executed by sidecar containers -running in the same pod as the PostgreSQL `Cluster` primary instance—except -when backups are taken from a standby, in which case the sidecar runs alongside -the standby pod. -The sidecar containers use a [dedicated container image](images.md) that -includes only the supported version of Barman Cloud. -::: - -## Recovery of a Postgres Cluster - -In PostgreSQL, *recovery* refers to the process of starting a database instance -from an existing backup. The Barman Cloud Plugin integrates with CloudNativePG -to support both **full recovery** and **Point-in-Time Recovery (PITR)** from an -object store. - -Recovery in this context is *not in-place*: it bootstraps a brand-new -PostgreSQL cluster from a backup and replays the necessary WAL files to reach -the desired recovery target. - -To perform a recovery, define an *external cluster* that references the -appropriate `ObjectStore`, and use it as the source in the `bootstrap` section -of the target cluster: - -```yaml -[...] -spec: - [...] - bootstrap: - recovery: - source: source - externalClusters: - - name: source - plugin: - name: barman-cloud.cloudnative-pg.io - parameters: - barmanObjectName: cluster-example - serverName: cluster-example - [...] -``` - -The critical element here is the `externalClusters` section of the `Cluster` -resource, where the `plugin` stanza instructs CloudNativePG to use the Barman -Cloud Plugin to access the object store for recovery. - -This same mechanism can be used for a variety of scenarios enabled by the -CloudNativePG API, including: - -* **Full cluster recovery** from the latest backup -* **Point-in-Time Recovery (PITR)** -* Bootstrapping **replica clusters** in a distributed topology - -:::tip -For complete instructions and advanced use cases, refer to the official -[Recovery documentation](https://cloudnative-pg.io/documentation/current/recovery/). -::: diff --git a/web/versioned_docs/version-0.9.0/images.md b/web/versioned_docs/version-0.9.0/images.md deleted file mode 100644 index f6c32d3..0000000 --- a/web/versioned_docs/version-0.9.0/images.md +++ /dev/null @@ -1,37 +0,0 @@ ---- -sidebar_position: 99 ---- - -# Container Images - - - -The Barman Cloud Plugin is distributed using two container images: - -- One for deploying the plugin components -- One for the sidecar that runs alongside each PostgreSQL instance in a - CloudNativePG `Cluster` using the plugin - -## Plugin Container Image - -The plugin image contains the logic required to operate the Barman Cloud Plugin -within your Kubernetes environment with CloudNativePG. It is published on the -GitHub Container Registry at `ghcr.io/cloudnative-pg/plugin-barman-cloud`. - -This image is built from the -[`Dockerfile.plugin`](https://github.com/cloudnative-pg/plugin-barman-cloud/blob/main/containers/Dockerfile.plugin) -in the plugin repository. - -## Sidecar Container Image - -The sidecar image is used within each PostgreSQL pod in the cluster. It -includes the latest supported version of Barman Cloud and is responsible for -performing WAL archiving and backups on behalf of CloudNativePG. - -It is available at `ghcr.io/cloudnative-pg/plugin-barman-cloud-sidecar` and is -built from the -[`Dockerfile.sidecar`](https://github.com/cloudnative-pg/plugin-barman-cloud/blob/main/containers/Dockerfile.sidecar). - -These sidecar images are designed to work seamlessly with the -[`minimal` PostgreSQL container images](https://github.com/cloudnative-pg/postgres-containers?tab=readme-ov-file#minimal-images) -maintained by the CloudNativePG Community. diff --git a/web/versioned_docs/version-0.9.0/installation.mdx b/web/versioned_docs/version-0.9.0/installation.mdx deleted file mode 100644 index 027d1e8..0000000 --- a/web/versioned_docs/version-0.9.0/installation.mdx +++ /dev/null @@ -1,109 +0,0 @@ ---- -sidebar_position: 20 ---- - -# Installation - -:::important -1. The plugin **must** be installed in the same namespace as the CloudNativePG - operator (typically `cnpg-system`). - -2. Keep in mind that the operator's **listening namespaces** may differ from its - installation namespace. Double-check this to avoid configuration issues. -::: - -## Verifying the Requirements - -Before installing the plugin, make sure the [requirements](intro.md#requirements) are met. - -### CloudNativePG Version - -Ensure you're running a version of CloudNativePG that is compatible with the -plugin. If installed in the default `cnpg-system` namespace, you can verify the -version with: - -```sh -kubectl get deployment -n cnpg-system cnpg-controller-manager \ - -o jsonpath="{.spec.template.spec.containers[*].image}" -``` - -Example output: - -```output -ghcr.io/cloudnative-pg/cloudnative-pg:1.26.0 -``` - -The version **must be 1.26 or newer**. - -### cert-manager - -Use the [cmctl](https://cert-manager.io/docs/reference/cmctl/#installation) -tool to confirm that `cert-manager` is installed and available: - -```sh -cmctl check api -``` - -Example output: - -```output -The cert-manager API is ready -``` - -Both checks are required before proceeding with the installation. - -## Installing the Barman Cloud Plugin - -import { InstallationSnippet } from '@site/src/components/Installation'; - -Install the plugin using `kubectl` by applying the manifest for the latest -release: - - - -Example output: - -```output -customresourcedefinition.apiextensions.k8s.io/objectstores.barmancloud.cnpg.io created -serviceaccount/plugin-barman-cloud created -role.rbac.authorization.k8s.io/leader-election-role created -clusterrole.rbac.authorization.k8s.io/metrics-auth-role created -clusterrole.rbac.authorization.k8s.io/metrics-reader created -clusterrole.rbac.authorization.k8s.io/objectstore-editor-role created -clusterrole.rbac.authorization.k8s.io/objectstore-viewer-role created -clusterrole.rbac.authorization.k8s.io/plugin-barman-cloud created -rolebinding.rbac.authorization.k8s.io/leader-election-rolebinding created -clusterrolebinding.rbac.authorization.k8s.io/metrics-auth-rolebinding created -clusterrolebinding.rbac.authorization.k8s.io/plugin-barman-cloud-binding created -secret/plugin-barman-cloud-8tfddg42gf created -service/barman-cloud created -deployment.apps/barman-cloud configured -certificate.cert-manager.io/barman-cloud-client created -certificate.cert-manager.io/barman-cloud-server created -issuer.cert-manager.io/selfsigned-issuer created -``` - -Finally, check that the deployment is up and running: - -```sh -kubectl rollout status deployment \ - -n cnpg-system barman-cloud -``` - -Example output: - -```output -deployment "barman-cloud" successfully rolled out -``` - -This confirms that the plugin is deployed and ready to use. - -## Testing the latest development snapshot - -You can also test the latest development snapshot of the plugin with the -following command: - -```sh -kubectl apply -f \ - https://raw.githubusercontent.com/cloudnative-pg/plugin-barman-cloud/refs/heads/main/manifest.yaml -``` diff --git a/web/versioned_docs/version-0.9.0/intro.md b/web/versioned_docs/version-0.9.0/intro.md deleted file mode 100644 index 9781d0d..0000000 --- a/web/versioned_docs/version-0.9.0/intro.md +++ /dev/null @@ -1,86 +0,0 @@ ---- -sidebar_position: 1 -sidebar_label: "Introduction" ---- - -# Barman Cloud Plugin - - - -The **Barman Cloud Plugin** for [CloudNativePG](https://cloudnative-pg.io/) -enables online continuous physical backups of PostgreSQL clusters to object storage -using the `barman-cloud` suite from the [Barman](https://docs.pgbarman.org/release/latest/) -project. - -:::important -If you plan to migrate your existing CloudNativePG cluster to the new -plugin-based approach using the Barman Cloud Plugin, see -["Migrating from Built-in CloudNativePG Backup"](migration.md) -for detailed instructions. -::: - -## Requirements - -Before using the Barman Cloud Plugin, ensure that the following components are -installed and properly configured: - -- [CloudNativePG](https://cloudnative-pg.io) version 1.26 or later - - - We strongly recommend version 1.27.0 or later, which includes improved - error handling and status reporting for the plugin. - - If you are running an earlier release, refer to the - [upgrade guide](https://cloudnative-pg.io/documentation/current/installation_upgrade). - -- [cert-manager](https://cert-manager.io/) - - - The recommended way to enable secure TLS communication between the plugin - and the operator. - - Alternatively, you can provide your own certificate bundles. See the - [CloudNativePG documentation on TLS configuration](https://cloudnative-pg.io/documentation/current/cnpg_i/#configuring-tls-certificates). - -- [`kubectl-cnpg`](https://cloudnative-pg.io/documentation/current/kubectl-plugin/) - plugin (optional but recommended) - - - Simplifies debugging and monitoring with additional status and inspection - commands. - - Multiple installation options are available in the - [installation guide](https://cloudnative-pg.io/documentation/current/kubectl-plugin/#install). - -## Key Features - -This plugin provides the following capabilities: - -- Physical online backup of the data directory -- Physical restore of the data directory -- Write-Ahead Log (WAL) archiving -- WAL restore -- Full cluster recovery -- Point-in-Time Recovery (PITR) -- Seamless integration with replica clusters for bootstrap and WAL restore from archive - -:::important -The Barman Cloud Plugin is designed to **replace the in-tree object storage support** -previously provided via the `.spec.backup.barmanObjectStore` section in the -`Cluster` resource. -Backups created using the in-tree approach are fully supported and compatible -with this plugin. -::: - -## Supported Object Storage Providers - -The plugin works with all storage backends supported by `barman-cloud`, including: - -- **Amazon S3** -- **Google Cloud Storage** -- **Microsoft Azure Blob Storage** - -In addition, the following S3-compatible and simulator solutions have been -tested and verified: - -- [MinIO](https://min.io/) – An S3-compatible storage solution -- [Azurite](https://github.com/Azure/Azurite) – A simulator for Azure Blob Storage -- [fake-gcs-server](https://github.com/fsouza/fake-gcs-server) – A simulator for Google Cloud Storage - -:::tip -For more details, refer to [Object Store Providers](object_stores.md). -::: diff --git a/web/versioned_docs/version-0.9.0/migration.md b/web/versioned_docs/version-0.9.0/migration.md deleted file mode 100644 index 2c99ada..0000000 --- a/web/versioned_docs/version-0.9.0/migration.md +++ /dev/null @@ -1,274 +0,0 @@ ---- -sidebar_position: 40 ---- - -# Migrating from Built-in CloudNativePG Backup - - - -The in-tree support for Barman Cloud in CloudNativePG is **deprecated starting -from version 1.26** and will be removed in a future release. - -If you're currently relying on the built-in Barman Cloud integration, you can -migrate seamlessly to the new **plugin-based architecture** using the Barman -Cloud Plugin, without data loss. Follow these steps: - -- [Install the Barman Cloud Plugin](installation.mdx) -- Create an `ObjectStore` resource by translating the contents of the - `.spec.backup.barmanObjectStore` section from your existing `Cluster` - definition -- Modify the `Cluster` resource in a single atomic change to switch from - in-tree backup to the plugin -- Update any `ScheduledBackup` resources to use the plugin -- Update the `externalClusters` configuration, where applicable - -:::tip -For a working example, refer to [this commit](https://github.com/cloudnative-pg/cnpg-playground/commit/596f30e252896edf8f734991c3538df87630f6f7) -from the [CloudNativePG Playground project](https://github.com/cloudnative-pg/cnpg-playground), -which demonstrates a full migration. -::: - ---- - -## Step 1: Define the `ObjectStore` - -Begin by creating an `ObjectStore` resource in the same namespace as your -PostgreSQL `Cluster`. - -There is a **direct mapping** between the `.spec.backup.barmanObjectStore` -section in CloudNativePG and the `.spec.configuration` field in the -`ObjectStore` CR. The conversion is mostly mechanical, with one key difference: - -:::warning -In the plugin architecture, retention policies are defined as part of the `ObjectStore`. -In contrast, the in-tree implementation defined them at the `Cluster` level. -::: - -If your `Cluster` used `.spec.backup.retentionPolicy`, move that configuration -to `.spec.retentionPolicy` in the `ObjectStore`. - ---- - -### Example - -Here’s an excerpt from a traditional in-tree CloudNativePG backup configuration -taken from the CloudNativePG Playground project: - -```yaml -apiVersion: postgresql.cnpg.io/v1 -kind: Cluster -metadata: - name: pg-eu -spec: - # [...] - backup: - barmanObjectStore: - destinationPath: s3://backups/ - endpointURL: http://minio-eu:9000 - s3Credentials: - accessKeyId: - name: minio-eu - key: ACCESS_KEY_ID - secretAccessKey: - name: minio-eu - key: ACCESS_SECRET_KEY - wal: - compression: gzip -``` - -This configuration translates to the following `ObjectStore` resource for the -plugin: - -```yaml -apiVersion: barmancloud.cnpg.io/v1 -kind: ObjectStore -metadata: - name: minio-eu -spec: - configuration: - destinationPath: s3://backups/ - endpointURL: http://minio-eu:9000 - s3Credentials: - accessKeyId: - name: minio-eu - key: ACCESS_KEY_ID - secretAccessKey: - name: minio-eu - key: ACCESS_SECRET_KEY - wal: - compression: gzip -``` - -As you can see, the contents of `barmanObjectStore` have been copied directly -under the `configuration` field of the `ObjectStore` resource, using the same -secret references. - -## Step 2: Update the `Cluster` for plugin WAL archiving - -Once the `ObjectStore` resource is in place, update the `Cluster` resource as -follows in a single atomic change: - -- Remove the `.spec.backup.barmanObjectStore` section -- Remove `.spec.backup.retentionPolicy` if it was defined (as it is now in the - `ObjectStore`) -- Remove the entire `spec.backup` section if it is now empty -- Add `barman-cloud.cloudnative-pg.io` to the `plugins` list, as described in - [Configuring WAL archiving](usage.md#configuring-wal-archiving) - -This will trigger a rolling update of the `Cluster`, switching continuous -backup from the in-tree implementation to the plugin-based approach. - -### Example - -The updated `pg-eu` cluster will have this configuration instead of the -previous `backup` section: - -```yaml - plugins: - - name: barman-cloud.cloudnative-pg.io - isWALArchiver: true - parameters: - barmanObjectName: minio-eu -``` - ---- - -## Step 3: Update the `ScheduledBackup` - -After switching the `Cluster` to use the plugin, update your `ScheduledBackup` -resources to match. - -Set the backup `method` to `plugin` and reference the plugin name via -`pluginConfiguration`, as shown in ["Performing a base backup"](usage.md#performing-a-base-backup). - -### Example - -Original in-tree `ScheduledBackup`: - -```yaml -apiVersion: postgresql.cnpg.io/v1 -kind: ScheduledBackup -metadata: - name: pg-eu-backup -spec: - cluster: - name: pg-eu - schedule: '0 0 0 * * *' - backupOwnerReference: self -``` - -Updated version using the plugin: - -```yaml -apiVersion: postgresql.cnpg.io/v1 -kind: ScheduledBackup -metadata: - name: pg-eu-backup -spec: - cluster: - name: pg-eu - schedule: '0 0 0 * * *' - backupOwnerReference: self - method: plugin - pluginConfiguration: - name: barman-cloud.cloudnative-pg.io -``` - ---- - -## Step 4: Update the `externalClusters` configuration - -If your `Cluster` relies on one or more external clusters that use the in-tree -Barman Cloud integration, you need to update those configurations to use the -plugin-based architecture. - -When a replica cluster fetches WAL files or base backups from an external -source that used the built-in backup method, follow these steps: - -1. Create a corresponding `ObjectStore` resource for the external cluster, as - shown in [Step 1](#step-1-define-the-objectstore) -2. Update the `externalClusters` section of your replica cluster to use the - plugin instead of the in-tree `barmanObjectStore` field - -### Example - -Consider the original configuration using in-tree Barman Cloud: - -```yaml -apiVersion: postgresql.cnpg.io/v1 -kind: Cluster -metadata: - name: pg-us -spec: - # [...] - externalClusters: - - name: pg-eu - barmanObjectStore: - destinationPath: s3://backups/ - endpointURL: http://minio-eu:9000 - serverName: pg-eu - s3Credentials: - accessKeyId: - name: minio-eu - key: ACCESS_KEY_ID - secretAccessKey: - name: minio-eu - key: ACCESS_SECRET_KEY - wal: - compression: gzip -``` - -Create the `ObjectStore` resource for the external cluster: - -```yaml -apiVersion: barmancloud.cnpg.io/v1 -kind: ObjectStore -metadata: - name: minio-eu -spec: - configuration: - destinationPath: s3://backups/ - endpointURL: http://minio-eu:9000 - s3Credentials: - accessKeyId: - name: minio-eu - key: ACCESS_KEY_ID - secretAccessKey: - name: minio-eu - key: ACCESS_SECRET_KEY - wal: - compression: gzip -``` - -Update the external cluster configuration to use the plugin: - -```yaml -apiVersion: postgresql.cnpg.io/v1 -kind: Cluster -metadata: - name: pg-us -spec: - # [...] - externalClusters: - - name: pg-eu - plugin: - name: barman-cloud.cloudnative-pg.io - parameters: - barmanObjectName: minio-eu - serverName: pg-eu -``` - -## Step 5: Verify your metrics - -When migrating from the in-core solution to the plugin-based approach, you need -to monitor a different set of metrics, as described in the -["Observability"](observability.md) section. - -The table below summarizes the name changes between the old in-core metrics and -the new plugin-based ones: - -| Old metric name | New metric name | -| ------------------------------------------------ | ---------------------------------------------------------------- | -| `cnpg_collector_last_failed_backup_timestamp` | `barman_cloud_cloudnative_pg_io_last_failed_backup_timestamp` | -| `cnpg_collector_last_available_backup_timestamp` | `barman_cloud_cloudnative_pg_io_last_available_backup_timestamp` | -| `cnpg_collector_first_recoverability_point` | `barman_cloud_cloudnative_pg_io_first_recoverability_point` | diff --git a/web/versioned_docs/version-0.9.0/misc.md b/web/versioned_docs/version-0.9.0/misc.md deleted file mode 100644 index 168ff29..0000000 --- a/web/versioned_docs/version-0.9.0/misc.md +++ /dev/null @@ -1,76 +0,0 @@ ---- -sidebar_position: 90 ---- - -# Miscellaneous - - - -## Backup Object Tagging - -You can attach key-value metadata tags to backup artifacts—such as base -backups, WAL files, and history files—via the `.spec.configuration` section of -the `ObjectStore` resource. - -- `tags`: applied to base backups and WAL files -- `historyTags`: applied to history files only - -### Example - -```yaml -apiVersion: barmancloud.cnpg.io/v1 -kind: ObjectStore -metadata: - name: my-store -spec: - configuration: - [...] - tags: - backupRetentionPolicy: "expire" - historyTags: - backupRetentionPolicy: "keep" - [...] -``` - -## Extra Options for Backup and WAL Archiving - -You can pass additional command-line arguments to `barman-cloud-backup` and -`barman-cloud-wal-archive` using the `additionalCommandArgs` field in the -`ObjectStore` configuration. - -- `.spec.configuration.data.additionalCommandArgs`: for `barman-cloud-backup` -- `.spec.configuration.wal.archiveAdditionalCommandArgs`: for `barman-cloud-wal-archive` - -Each field accepts a list of string arguments. If an argument is already -configured elsewhere in the plugin, the duplicate will be ignored. - -### Example: Extra Backup Options - -```yaml -kind: ObjectStore -metadata: - name: my-store -spec: - configuration: - data: - additionalCommandArgs: - - "--min-chunk-size=5MB" - - "--read-timeout=60" -``` - -### Example: Extra WAL Archive Options - -```yaml -kind: ObjectStore -metadata: - name: my-store -spec: - configuration: - wal: - archiveAdditionalCommandArgs: - - "--max-concurrency=1" - - "--read-timeout=60" -``` - -For a complete list of supported options, refer to the -[official Barman Cloud documentation](https://docs.pgbarman.org/release/latest/). diff --git a/web/versioned_docs/version-0.9.0/object_stores.md b/web/versioned_docs/version-0.9.0/object_stores.md deleted file mode 100644 index 74e0473..0000000 --- a/web/versioned_docs/version-0.9.0/object_stores.md +++ /dev/null @@ -1,454 +0,0 @@ ---- -sidebar_position: 50 ---- - -# Object Store Providers - - - -The Barman Cloud Plugin enables the storage of PostgreSQL cluster backup files -in any object storage service supported by the -[Barman Cloud infrastructure](https://docs.pgbarman.org/release/latest/). - -Currently, Barman Cloud supports the following providers: - -- [Amazon S3](#aws-s3) -- [Microsoft Azure Blob Storage](#azure-blob-storage) -- [Google Cloud Storage](#google-cloud-storage) - -You may also use any S3- or Azure-compatible implementation of the above -services. - -To configure object storage with Barman Cloud, you must define an -[`ObjectStore` object](plugin-barman-cloud.v1.md#objectstore), which -establishes the connection between your PostgreSQL cluster and the object -storage backend. - -Configuration details — particularly around authentication — will vary depending on -the specific object storage provider you are using. - -The following sections detail the setup for each. - ---- - -## AWS S3 - -[AWS Simple Storage Service (S3)](https://aws.amazon.com/s3/) is one of the -most widely adopted object storage solutions. - -The Barman Cloud plugin for CloudNativePG integrates with S3 through two -primary authentication mechanisms: - -- [IAM Roles for Service Accounts (IRSA)](https://docs.aws.amazon.com/eks/latest/userguide/iam-roles-for-service-accounts.html) — - recommended for clusters running on EKS -- Access keys — using `ACCESS_KEY_ID` and `ACCESS_SECRET_KEY` credentials - -### Access Keys - -To authenticate using access keys, you’ll need: - -- `ACCESS_KEY_ID`: the public key used to authenticate to S3 -- `ACCESS_SECRET_KEY`: the corresponding secret key -- `ACCESS_SESSION_TOKEN`: (optional) a temporary session token, if required - -These credentials must be stored securely in a Kubernetes secret: - -```sh -kubectl create secret generic aws-creds \ - --from-literal=ACCESS_KEY_ID= \ - --from-literal=ACCESS_SECRET_KEY= -# --from-literal=ACCESS_SESSION_TOKEN= # if required -``` - -The credentials will be encrypted at rest if your Kubernetes environment -supports it. - -You can then reference the secret in your `ObjectStore` definition: - -```yaml -apiVersion: barmancloud.cnpg.io/v1 -kind: ObjectStore -metadata: - name: aws-store -spec: - configuration: - destinationPath: "s3://BUCKET_NAME/path/to/folder" - s3Credentials: - accessKeyId: - name: aws-creds - key: ACCESS_KEY_ID - secretAccessKey: - name: aws-creds - key: ACCESS_SECRET_KEY - [...] -``` - -### IAM Role for Service Account (IRSA) - -To use IRSA with EKS, configure the service account of the PostgreSQL cluster -with the appropriate annotation: - -```yaml -apiVersion: postgresql.cnpg.io/v1 -kind: Cluster -metadata: - [...] -spec: - serviceAccountTemplate: - metadata: - annotations: - eks.amazonaws.com/role-arn: arn:[...] - [...] -``` - -### S3 Lifecycle Policy - -Barman Cloud uploads backup files to S3 but does not modify them afterward. -To enhance data durability and protect against accidental or malicious loss, -it's recommended to implement the following best practices: - -- Enable object versioning -- Enable object locking to prevent objects from being deleted or overwritten - for a defined period or indefinitely (this provides an additional layer of - protection against accidental deletion and ransomware attacks) -- Set lifecycle rules to expire current versions a few days after your Barman - retention window -- Expire non-current versions after a longer period - -These strategies help you safeguard backups without requiring broad delete -permissions, ensuring both security and compliance with minimal operational -overhead. - - -### S3-Compatible Storage Providers - -You can use S3-compatible services like **MinIO**, **Linode (Akamai) Object Storage**, -or **DigitalOcean Spaces** by specifying a custom `endpointURL`. - -Example with Linode (Akamai) Object Storage (`us-east1`): - -```yaml -apiVersion: barmancloud.cnpg.io/v1 -kind: ObjectStore -metadata: - name: linode-store -spec: - configuration: - destinationPath: "s3://BUCKET_NAME/" - endpointURL: "https://us-east1.linodeobjects.com" - s3Credentials: - [...] - [...] -``` - -Recent changes to the [boto3 implementation](https://github.com/boto/boto3/issues/4392) -of [Amazon S3 Data Integrity Protections](https://docs.aws.amazon.com/sdkref/latest/guide/feature-dataintegrity.html) -may lead to the `x-amz-content-sha256` error when using the Barman Cloud -Plugin. - -If you encounter this issue (see [GitHub issue #393](https://github.com/cloudnative-pg/plugin-barman-cloud/issues/393)), -you can apply the following workaround by setting specific environment -variables in the `ObjectStore` resource: - -```yaml -apiVersion: barmancloud.cnpg.io/v1 -kind: ObjectStore -metadata: - name: linode-store -spec: - instanceSidecarConfiguration: - env: - - name: AWS_REQUEST_CHECKSUM_CALCULATION - value: when_required - - name: AWS_RESPONSE_CHECKSUM_VALIDATION - value: when_required - [...] -``` - -These settings ensure that checksum calculations and validations are only -applied when explicitly required, avoiding compatibility issues with certain -S3-compatible storage providers. - -Example with DigitalOcean Spaces (SFO3, path-style): - -```yaml -apiVersion: barmancloud.cnpg.io/v1 -kind: ObjectStore -metadata: - name: digitalocean-store -spec: - configuration: - destinationPath: "s3://BUCKET_NAME/path/to/folder" - endpointURL: "https://sfo3.digitaloceanspaces.com" - s3Credentials: - [...] - [...] -``` - -### Using Object Storage with a Private CA - -For object storage services (e.g., MinIO) that use HTTPS with certificates -signed by a private CA, set the `endpointCA` field in the `ObjectStore` -definition. Unless you already have it, create a Kubernetes `Secret` with the -CA bundle: - -```sh -kubectl create secret generic my-ca-secret --from-file=ca.crt -``` - -Then reference it: - -```yaml -apiVersion: barmancloud.cnpg.io/v1 -kind: ObjectStore -metadata: - name: minio-store -spec: - configuration: - endpointURL: - endpointCA: - name: my-ca-secret - key: ca.crt - [...] -``` - - -:::note -If you want `ConfigMaps` and `Secrets` to be **automatically** reloaded by -instances, you can add a label with the key `cnpg.io/reload` to the -`Secrets`/`ConfigMaps`. Otherwise, you will have to reload the instances using the -`kubectl cnpg reload` subcommand. -::: - ---- - -## Azure Blob Storage - -[Azure Blob Storage](https://azure.microsoft.com/en-us/services/storage/blobs/) -is Microsoft’s cloud-based object storage solution. - -Barman Cloud supports the following authentication methods: - -- [Connection String](https://learn.microsoft.com/en-us/azure/storage/common/storage-configure-connection-string) -- Storage Account Name + [Access Key](https://learn.microsoft.com/en-us/azure/storage/common/storage-account-keys-manage) -- Storage Account Name + [SAS Token](https://learn.microsoft.com/en-us/azure/storage/blobs/sas-service-create) -- [Azure AD Workload Identity](https://azure.github.io/azure-workload-identity/docs/introduction.html) - -### Azure AD Workload Identity - -This method avoids storing credentials in Kubernetes via the -`.spec.configuration.inheritFromAzureAD` option: - -```yaml -apiVersion: barmancloud.cnpg.io/v1 -kind: ObjectStore -metadata: - name: azure-store -spec: - configuration: - destinationPath: "" - azureCredentials: - inheritFromAzureAD: true - [...] -``` - -### Access Key, SAS Token, or Connection String - -Store credentials in a Kubernetes secret: - -```sh -kubectl create secret generic azure-creds \ - --from-literal=AZURE_STORAGE_ACCOUNT= \ - --from-literal=AZURE_STORAGE_KEY= \ - --from-literal=AZURE_STORAGE_SAS_TOKEN= \ - --from-literal=AZURE_STORAGE_CONNECTION_STRING= -``` - -Then reference the required keys in your `ObjectStore`: - -```yaml -apiVersion: barmancloud.cnpg.io/v1 -kind: ObjectStore -metadata: - name: azure-store -spec: - configuration: - destinationPath: "" - azureCredentials: - connectionString: - name: azure-creds - key: AZURE_CONNECTION_STRING - storageAccount: - name: azure-creds - key: AZURE_STORAGE_ACCOUNT - storageKey: - name: azure-creds - key: AZURE_STORAGE_KEY - storageSasToken: - name: azure-creds - key: AZURE_STORAGE_SAS_TOKEN - [...] -``` - -For Azure Blob, the destination path format is: - -``` -://..core.windows.net// -``` - -### Azure-Compatible Providers - -If you're using a different implementation (e.g., Azurite or emulator): - -``` -://:/// -``` - ---- - -## Google Cloud Storage - -[Google Cloud Storage](https://cloud.google.com/storage/) is supported with two -authentication modes: - -- **GKE Workload Identity** (recommended inside Google Kubernetes Engine) -- **Service Account JSON key** via the `GOOGLE_APPLICATION_CREDENTIALS` environment variable - -### GKE Workload Identity - -Use the [Workload Identity authentication](https://cloud.google.com/kubernetes-engine/docs/how-to/workload-identity) -when running in GKE: - -1. Set `googleCredentials.gkeEnvironment` to `true` in the `ObjectStore` - resource -2. Annotate the `serviceAccountTemplate` in the `Cluster` resource with the GCP - service account - -For example, in the `ObjectStore` resource: - -```yaml -apiVersion: barmancloud.cnpg.io/v1 -kind: ObjectStore -metadata: - name: google-store -spec: - configuration: - destinationPath: "gs:///" - googleCredentials: - gkeEnvironment: true -``` - -And in the `Cluster` resource: - -```yaml -apiVersion: postgresql.cnpg.io/v1 -kind: Cluster -spec: - serviceAccountTemplate: - metadata: - annotations: - iam.gke.io/gcp-service-account: [...].iam.gserviceaccount.com -``` - -### Service Account JSON Key - -Follow Google’s [authentication setup](https://cloud.google.com/docs/authentication/getting-started), -then: - -```sh -kubectl create secret generic backup-creds --from-file=gcsCredentials=gcs_credentials_file.json -``` - -```yaml -apiVersion: barmancloud.cnpg.io/v1 -kind: ObjectStore -metadata: - name: google-store -spec: - configuration: - destinationPath: "gs:///" - googleCredentials: - applicationCredentials: - name: backup-creds - key: gcsCredentials - [...] -``` - -:::important -This authentication method generates a JSON file within the container -with all the credentials required to access your Google Cloud Storage -bucket. As a result, if someone gains access to the `Pod`, they will also have -write permissions to the bucket. -::: - ---- - - -## MinIO Object Store - -In order to use the Tenant resource you first need to deploy the -[MinIO operator](https://docs.min.io/community/minio-object-store/operations/deployments/installation.html). -For the latest documentation of MinIO, please refer to the -[MinIO official documentation](https://docs.min.io/community/minio-object-store/). - -MinIO Object Store's API is compatible with S3, and the default configuration of the Tenant -will create these services: -- `-console` on port 9090 (with autocert) or 9443 (without autocert) -- `-hl` on port 9000 -Where `` is the `metadata.name` you assigned to your Tenant resource. - -:::note -The `-console` service will only be available if you have enabled the -[MinIO Console](https://docs.min.io/community/minio-object-store/administration/minio-console.html). - -For example, the following Tenant: -```yml -apiVersion: minio.min.io/v2 -kind: Tenant -metadata: - name: cnpg-backups -spec: - [...] -``` -would have services called `cnpg-backups-console` and `cnpg-backups-hl` respectively. - -The `console` service is for managing the tenant, while the `hl` service exposes the S3 -compatible API. If your tenant is configured with `requestAutoCert` you will communicate -to these services over HTTPS, if not you will use HTTP. - -For authentication you can use your username and password, or create an access key. -Whichever method you choose, it has to be stored as a secret. - -```sh -kubectl create secret generic minio-creds \ - --from-literal=MINIO_ACCESS_KEY= \ - --from-literal=MINIO_SECRET_KEY= -``` - -Finally, create the Barman ObjectStore: - -```yaml -apiVersion: barmancloud.cnpg.io/v1 -kind: ObjectStore -metadata: - name: minio-store -spec: - configuration: - destinationPath: s3://BUCKET_NAME/ - endpointURL: http://-hl:9000 - s3Credentials: - accessKeyId: - name: minio-creds - key: MINIO_ACCESS_KEY - secretAccessKey: - name: minio-creds - key: MINIO_SECRET_KEY - [...] -``` - -:::important -Verify on `s3://BUCKET_NAME/` the presence of archived WAL files before -proceeding with a backup. -::: - ---- diff --git a/web/versioned_docs/version-0.9.0/observability.md b/web/versioned_docs/version-0.9.0/observability.md deleted file mode 100644 index 274b973..0000000 --- a/web/versioned_docs/version-0.9.0/observability.md +++ /dev/null @@ -1,24 +0,0 @@ ---- -sidebar_position: 55 ---- - -# Observability - - - -The Barman Cloud Plugin exposes the following metrics through the native -Prometheus exporter of the instance manager: - -- `barman_cloud_cloudnative_pg_io_last_failed_backup_timestamp`: - the UNIX timestamp of the most recent failed backup. - -- `barman_cloud_cloudnative_pg_io_last_available_backup_timestamp`: - the UNIX timestamp of the most recent successfully available backup. - -- `barman_cloud_cloudnative_pg_io_first_recoverability_point`: - the UNIX timestamp representing the earliest point in time from which the - cluster can be recovered. - -These metrics supersede the previously available in-core metrics that used the -`cnpg_collector` prefix. The new metrics are exposed under the -`barman_cloud_cloudnative_pg_io` prefix instead. diff --git a/web/versioned_docs/version-0.9.0/parameters.md b/web/versioned_docs/version-0.9.0/parameters.md deleted file mode 100644 index ca0cd2b..0000000 --- a/web/versioned_docs/version-0.9.0/parameters.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -sidebar_position: 100 ---- - -# Parameters - - - -The following parameters are available for the Barman Cloud Plugin: - -- `barmanObjectName`: references the `ObjectStore` resource to be used by the - plugin. -- `serverName`: Specifies the server name in the object store. - -:::important -The `serverName` parameter in the `ObjectStore` resource is retained solely for -API compatibility with the in-tree `barmanObjectStore` and must always be left empty. -When needed, use the `serverName` plugin parameter in the Cluster configuration instead. -::: diff --git a/web/versioned_docs/version-0.9.0/plugin-barman-cloud.v1.md b/web/versioned_docs/version-0.9.0/plugin-barman-cloud.v1.md deleted file mode 100644 index 7bd607c..0000000 --- a/web/versioned_docs/version-0.9.0/plugin-barman-cloud.v1.md +++ /dev/null @@ -1,108 +0,0 @@ -# API Reference - -## Packages -- [barmancloud.cnpg.io/v1](#barmancloudcnpgiov1) - - -## barmancloud.cnpg.io/v1 - -Package v1 contains API Schema definitions for the barmancloud v1 API group - -### Resource Types -- [ObjectStore](#objectstore) - - - -#### InstanceSidecarConfiguration - - - -InstanceSidecarConfiguration defines the configuration for the sidecar that runs in the instance pods. - - - -_Appears in:_ -- [ObjectStoreSpec](#objectstorespec) - -| Field | Description | Required | Default | Validation | -| --- | --- | --- | --- | --- | -| `env` _[EnvVar](https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.32/#envvar-v1-core) array_ | The environment to be explicitly passed to the sidecar | | | | -| `retentionPolicyIntervalSeconds` _integer_ | The retentionCheckInterval defines the frequency at which the
system checks and enforces retention policies. | | 1800 | | -| `resources` _[ResourceRequirements](https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.32/#resourcerequirements-v1-core)_ | Resources define cpu/memory requests and limits for the sidecar that runs in the instance pods. | | | | -| `additionalContainerArgs` _string array_ | AdditionalContainerArgs is an optional list of command-line arguments
to be passed to the sidecar container when it starts.
The provided arguments are appended to the container’s default arguments. | | | | -| `logLevel` _string_ | The log level for PostgreSQL instances. Valid values are: `error`, `warning`, `info` (default), `debug`, `trace` | | info | Enum: [error warning info debug trace]
| - - -#### ObjectStore - - - -ObjectStore is the Schema for the objectstores API. - - - - - -| Field | Description | Required | Default | Validation | -| --- | --- | --- | --- | --- | -| `apiVersion` _string_ | `barmancloud.cnpg.io/v1` | True | | | -| `kind` _string_ | `ObjectStore` | True | | | -| `metadata` _[ObjectMeta](https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.32/#objectmeta-v1-meta)_ | Refer to Kubernetes API documentation for fields of `metadata`. | True | | | -| `spec` _[ObjectStoreSpec](#objectstorespec)_ | Specification of the desired behavior of the ObjectStore.
More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#spec-and-status | True | | | -| `status` _[ObjectStoreStatus](#objectstorestatus)_ | Most recently observed status of the ObjectStore. This data may not be up to
date. Populated by the system. Read-only.
More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#spec-and-status | | | | - - -#### ObjectStoreSpec - - - -ObjectStoreSpec defines the desired state of ObjectStore. - - - -_Appears in:_ -- [ObjectStore](#objectstore) - -| Field | Description | Required | Default | Validation | -| --- | --- | --- | --- | --- | -| `configuration` _[BarmanObjectStoreConfiguration](https://pkg.go.dev/github.com/cloudnative-pg/barman-cloud/pkg/api#BarmanObjectStoreConfiguration)_ | The configuration for the barman-cloud tool suite | True | | | -| `retentionPolicy` _string_ | RetentionPolicy is the retention policy to be used for backups
and WALs (i.e. '60d'). The retention policy is expressed in the form
of `XXu` where `XX` is a positive integer and `u` is in `[dwm]` -
days, weeks, months. | | | Pattern: `^[1-9][0-9]*[dwm]$`
| -| `instanceSidecarConfiguration` _[InstanceSidecarConfiguration](#instancesidecarconfiguration)_ | The configuration for the sidecar that runs in the instance pods | | | | - - -#### ObjectStoreStatus - - - -ObjectStoreStatus defines the observed state of ObjectStore. - - - -_Appears in:_ -- [ObjectStore](#objectstore) - -| Field | Description | Required | Default | Validation | -| --- | --- | --- | --- | --- | -| `serverRecoveryWindow` _object (keys:string, values:[RecoveryWindow](#recoverywindow))_ | ServerRecoveryWindow maps each server to its recovery window | True | | | - - -#### RecoveryWindow - - - -RecoveryWindow represents the time span between the first -recoverability point and the last successful backup of a PostgreSQL -server, defining the period during which data can be restored. - - - -_Appears in:_ -- [ObjectStoreStatus](#objectstorestatus) - -| Field | Description | Required | Default | Validation | -| --- | --- | --- | --- | --- | -| `firstRecoverabilityPoint` _[Time](https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.32/#time-v1-meta)_ | The first recoverability point in a PostgreSQL server refers to
the earliest point in time to which the database can be
restored. | True | | | -| `lastSuccessfulBackupTime` _[Time](https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.32/#time-v1-meta)_ | The last successful backup time | True | | | -| `lastFailedBackupTime` _[Time](https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.32/#time-v1-meta)_ | The last failed backup time | True | | | - - diff --git a/web/versioned_docs/version-0.9.0/resource-name-migration.md b/web/versioned_docs/version-0.9.0/resource-name-migration.md deleted file mode 100644 index f5c1cc3..0000000 --- a/web/versioned_docs/version-0.9.0/resource-name-migration.md +++ /dev/null @@ -1,219 +0,0 @@ ---- -sidebar_position: 90 ---- - -# Resource name migration guide - - - -:::warning -Before proceeding with the migration process, please: -1. **Read this guide in its entirety** to understand what changes will be made -2. **Test in a non-production environment** first if possible -3. **Ensure you have proper backups** of your cluster configuration - -This migration will delete old RBAC resources only after the -`plugin-barman-cloud` upgrade. While the operation is designed to be safe, you -should review and understand the changes before proceeding. The maintainers of -this project are not responsible for any issues that may arise during -migration. - -**Note:** This guide assumes you are using the default `cnpg-system` namespace. -::: - -## Overview - -Starting from version **0.8.0**, the `plugin-barman-cloud` deployment manifests -use more specific, prefixed resource names to avoid conflicts with other -components deployed in the same Kubernetes cluster. - -## What Changed - -The following resources have been renamed to use proper prefixes. - -### Cluster-scoped Resources - -| Old Name | New Name | -|----------------------------|------------------------------------------| -| `metrics-auth-role` | `barman-plugin-metrics-auth-role` | -| `metrics-auth-rolebinding` | `barman-plugin-metrics-auth-rolebinding` | -| `metrics-reader` | `barman-plugin-metrics-reader` | -| `objectstore-viewer-role` | `barman-plugin-objectstore-viewer-role` | -| `objectstore-editor-role` | `barman-plugin-objectstore-editor-role` | - -### Namespace-scoped Resources - -| Old Name | New Name | Namespace | -|-------------------------------|---------------------------------------------|---------------| -| `leader-election-role` | `barman-plugin-leader-election-role` | `cnpg-system` | -| `leader-election-rolebinding` | `barman-plugin-leader-election-rolebinding` | `cnpg-system` | - -## Why This Change? - -Using generic names for cluster-wide resources is discouraged as they may -conflict with other components deployed in the same cluster. The new names make -it clear that these resources belong to the Barman Cloud plugin and help avoid -naming collisions. - -## Migration Instructions - -This three steps migration process is straightforward and can be completed with -a few `kubectl` commands. - -### Step 1: Upgrade plugin-barman-cloud - -Please refer to the [Installation](installation.mdx) section to deploy the new -`plugin-barman-cloud` release. - -### Step 2: Delete Old Cluster-scoped Resources - -:::danger Verify Resources Before Deletion -**IMPORTANT**: The old resource names are generic and could potentially belong -to other components in your cluster. - -**Before deleting each resource, verify it belongs to the Barman Cloud plugin -by checking:** -- For `objectstore-*` roles: Look for `barmancloud.cnpg.io` in the API groups -- For `metrics-*` roles: Check if they reference the `plugin-barman-cloud` - ServiceAccount in `cnpg-system` namespace -- For other roles: Look for labels like `app.kubernetes.io/name: plugin-barman-cloud` - -If a resource doesn't have these indicators, **DO NOT DELETE IT** as it may -belong to another application. - -Carefully review the output of each verification command before proceeding with -the `delete`. -::: - -:::tip Dry Run First -You can add `--dry-run=client` to any `kubectl delete` command to preview what -would be deleted without actually removing anything. -::: - -**Only proceed if you've verified these resources belong to the Barman Cloud -plugin (see warning above).** - -For each resource below, first verify it belongs to Barman Cloud, then delete -it: - -```bash -# 1. Check metrics-auth-rolebinding FIRST (we'll check the role after) -# Look for references to plugin-barman-cloud ServiceAccount -kubectl describe clusterrolebinding metrics-auth-rolebinding -# If it references plugin-barman-cloud ServiceAccount in cnpg-system namespace, -# delete it: -kubectl delete clusterrolebinding metrics-auth-rolebinding - -# 2. Check metrics-auth-role -# Look for references to authentication.k8s.io and authorization.k8s.io -kubectl describe clusterrole metrics-auth-role -# Verify it's not being used by any other rolebindings: -kubectl get clusterrolebinding -o json \ - | jq -r '.items[] | select(.roleRef.name=="metrics-auth-role") \ - | .metadata.name' -# If the above returns nothing (role is not in use) and the role looks like the -# Barman Cloud one, delete it (see warnings section): -kubectl delete clusterrole metrics-auth-role - -# 3. Check objectstore-viewer-role -# Look for barmancloud.cnpg.io API group or -# for `app.kubernetes.io/name: plugin-barman-cloud` label -kubectl describe clusterrole objectstore-viewer-role -# If it shows barmancloud.cnpg.io in API groups, delete it: -kubectl delete clusterrole objectstore-viewer-role - -# 4. Check objectstore-editor-role -# Look for barmancloud.cnpg.io API group or -# for `app.kubernetes.io/name: plugin-barman-cloud` label -kubectl describe clusterrole objectstore-editor-role -# If it shows barmancloud.cnpg.io in API groups, delete it: -kubectl delete clusterrole objectstore-editor-role - -# 5. Check metrics-reader (MOST DANGEROUS - very generic name) -# First, check if it's being used by any rolebindings OTHER than barman's: -kubectl get clusterrolebinding -o json | jq -r '.items[] \ - | select(.roleRef.name=="metrics-reader") \ - | "\(.metadata.name) -> \(.subjects[0].name) in \(.subjects[0].namespace)"' -# If this shows ANY rolebindings, review them carefully. Only proceed if -# they're all Barman-related. Then check the role itself: -kubectl describe clusterrole metrics-reader -# If it ONLY has nonResourceURLs: /metrics and NO other rolebindings use it, -# delete it: -kubectl delete clusterrole metrics-reader -``` - -:::warning -The `metrics-reader` role is particularly dangerous to delete blindly. Many -monitoring systems use this exact name. Only delete it if: - -1. You've verified it ONLY grants access to `/metrics` -2. No other rolebindings reference it (checked with the jq command above) -3. You're certain it was created by the Barman Cloud plugin - -If you're unsure, it's safer to leave it and let the new -`barman-plugin-metrics-reader` role coexist with it. -::: - -If any resource is not found during the `describe` command, that's okay - it -means it was never created or already deleted. Simply skip the delete command -for that resource. - -### Step 3: Delete Old Namespace-scoped Resources - -Delete the old namespace-scoped resources in the `cnpg-system` namespace: - -```bash -# Delete the old leader-election resources -kubectl delete role leader-election-role -n cnpg-system -kubectl delete rolebinding leader-election-rolebinding -n cnpg-system -``` - -If any resource is not found, that's okay - it means it was never created or -already deleted. - -## Impact - -- **Permissions:** If you have custom RBAC rules or tools that reference the - old resource names, they will need to be updated. -- **External Users:** If end users have been granted the - `objectstore-viewer-role` or `objectstore-editor-role`, they will need to be - re-granted the new role names (`barman-plugin-objectstore-viewer-role` and - `barman-plugin-objectstore-editor-role`). - -## Verification - -After migration, verify that the new resources are created: - -```bash -# Check cluster-scoped resources -kubectl get clusterrole | grep barman -kubectl get clusterrolebinding | grep barman - -# Check namespace-scoped resources -kubectl get role,rolebinding -n cnpg-system | grep barman -``` - -You should see the new prefixed resource names. - -## Troubleshooting - -### Plugin Not Starting After Migration - -If the plugin fails to start after migration, check: - -1. **ServiceAccount permissions:** Ensure the `plugin-barman-cloud` ServiceAccount is bound to the new roles: - ```bash - kubectl get clusterrolebinding barman-plugin-metrics-auth-rolebinding -o yaml - kubectl get rolebinding barman-plugin-leader-election-rolebinding -n cnpg-system -o yaml - ``` - -2. **Role references:** Verify that the rolebindings reference the correct role names: - ```bash - kubectl describe rolebinding barman-plugin-leader-election-rolebinding -n cnpg-system - kubectl describe clusterrolebinding barman-plugin-metrics-auth-rolebinding - ``` - -## Support - -If you encounter issues during migration, please open an issue on the [GitHub -repository](https://github.com/cloudnative-pg/plugin-barman-cloud/issues). diff --git a/web/versioned_docs/version-0.9.0/retention.md b/web/versioned_docs/version-0.9.0/retention.md deleted file mode 100644 index fefbd08..0000000 --- a/web/versioned_docs/version-0.9.0/retention.md +++ /dev/null @@ -1,38 +0,0 @@ ---- -sidebar_position: 60 ---- - -# Retention Policies - - - -The Barman Cloud Plugin supports **automated cleanup of obsolete backups** via -retention policies, configured in the `.spec.retentionPolicy` field of the -`ObjectStore` resource. - -:::note -This feature uses the `barman-cloud-backup-delete` command with the -`--retention-policy "RECOVERY WINDOW OF {{ value }} {{ unit }}"` syntax. -::: - -#### Example: 30-Day Retention Policy - -```yaml -apiVersion: barmancloud.cnpg.io/v1 -kind: ObjectStore -metadata: - name: my-store -spec: - [...] - retentionPolicy: "30d" -```` - -:::note -A **recovery window retention policy** ensures the cluster can be restored to -any point in time between the calculated *Point of Recoverability* (PoR) and -the latest WAL archive. The PoR is defined as `current time - recovery window`. -The **first valid backup** is the most recent backup completed before the PoR. -Backups older than that are marked as *obsolete* and deleted after the next -backup completes. -::: - diff --git a/web/versioned_docs/version-0.9.0/troubleshooting.md b/web/versioned_docs/version-0.9.0/troubleshooting.md deleted file mode 100644 index 0d9852c..0000000 --- a/web/versioned_docs/version-0.9.0/troubleshooting.md +++ /dev/null @@ -1,580 +0,0 @@ ---- -sidebar_position: 90 ---- - -# Troubleshooting - - - -This guide helps you diagnose and resolve common issues with the Barman Cloud -plugin. - -:::important -We are continuously improving the integration between CloudNativePG and the -Barman Cloud plugin as it moves toward greater stability and maturity. For this -reason, we recommend using the latest available version of both components. -See the [*Requirements* section](intro.md#requirements) for details. -::: - -:::note -The following commands assume you installed the CloudNativePG operator in -the default `cnpg-system` namespace. If you installed it in a different -namespace, adjust the commands accordingly. -::: - -## Viewing Logs - -To troubleshoot effectively, you’ll often need to review logs from multiple -sources: - -```sh -# View operator logs (includes plugin interaction logs) -kubectl logs -n cnpg-system deployment/cnpg-controller-manager -f - -# View plugin manager logs -kubectl logs -n cnpg-system deployment/barman-cloud -f - -# View sidecar container logs (Barman Cloud operations) -kubectl logs -n -c plugin-barman-cloud -f - -# View all containers in a pod -kubectl logs -n --all-containers=true - -# View previous container logs (if container restarted) -kubectl logs -n -c plugin-barman-cloud --previous -``` - -## Common Issues - -### Plugin Installation Issues - -#### Plugin pods not starting - -**Symptoms:** - -- Plugin pods stuck in `CrashLoopBackOff` or `Error` -- Plugin deployment not ready - -**Possible causes and solutions:** - -1. **Certificate issues** - - ```sh - # Check if cert-manager is installed and running - kubectl get pods -n cert-manager - - # Check if the plugin certificate is created - kubectl get certificates -n cnpg-system - ``` - - If cert-manager is not installed, install it first: - - ```sh - # Note: other installation methods for cert-manager are available - kubectl apply -f \ - https://github.com/cert-manager/cert-manager/releases/latest/download/cert-manager.yaml - ``` - - If you are using your own certificates without cert-manager, you will need - to verify the entire certificate chain yourself. - - -2. **Image pull errors** - - ```sh - # Check pod events for image pull errors - kubectl describe pod -n cnpg-system -l app=barman-cloud - ``` - - Verify the image exists and you have proper credentials if using a private - registry. - - -3. **Resource constraints** - - ```sh - # Check node resources - kubectl top nodes - kubectl describe nodes - ``` - - Make sure your cluster has sufficient CPU and memory resources. - -### Backup Failures - -#### Quick Backup Troubleshooting Checklist - -When a backup fails, follow these steps in order: - -1. **Check backup status**: - - ```sh - kubectl get backups.postgresql.cnpg.io -n - ``` -2. **Get error details and target pod**: - - ```sh - kubectl describe backups.postgresql.cnpg.io \ - -n - - kubectl get backups.postgresql.cnpg.io \ - -n \ - -o jsonpath='{.status.instanceID.podName}' - ``` -3. **Check the target pod’s sidecar logs**: - - ```sh - TARGET_POD=$(kubectl get backups.postgresql.cnpg.io \ - -n \ - -o jsonpath='{.status.instanceID.podName}') - - kubectl logs \ - -n $TARGET_POD -c plugin-barman-cloud \ - --tail=100 | grep -E "ERROR|FATAL|panic" - ``` -4. **Check cluster events**: - - ```sh - kubectl get events -n \ - --field-selector involvedObject.name= \ - --sort-by='.lastTimestamp' - ``` -5. **Verify plugin is running**: - - ```sh - kubectl get pods \ - -n cnpg-system -l app=barman-cloud - ``` -6. **Check operator logs**: - - ```sh - kubectl logs \ - -n cnpg-system deployment/cnpg-controller-manager \ - --tail=100 | grep -i "backup\|plugin" - ``` -7. **Check plugin manager logs**: - - ```sh - kubectl logs \ - -n cnpg-system deployment/barman-cloud --tail=100 - ``` - -#### Backup job fails immediately - -**Symptoms:** - -- Backup pods terminate with error -- No backup files appear in object storage -- Backup shows `failed` phase with various error messages - -**Common failure modes and solutions:** - -1. **"requested plugin is not available" errors** - - ``` - requested plugin is not available: barman - requested plugin is not available: barman-cloud - requested plugin is not available: barman-cloud.cloudnative-pg.io - ``` - - **Cause:** The plugin name in the Cluster configuration doesn’t match the - deployed plugin, or the plugin isn’t registered. - - **Solution:** - - a. **Check plugin registration:** - - ```sh - # If you have the `cnpg` plugin installed (v1.27.0+) - kubectl cnpg status -n - ``` - - Look for the "Plugins status" section: - ``` - Plugins status - Name Version Status Reported Operator Capabilities - ---- ------- ------ ------------------------------ - barman-cloud.cloudnative-pg.io 0.6.0 N/A Reconciler Hooks, Lifecycle Service - ``` - - b. **Verify plugin name in `Cluster` spec**: - - ```yaml - apiVersion: postgresql.cnpg.io/v1 - kind: Cluster - spec: - plugins: - - name: barman-cloud.cloudnative-pg.io - parameters: - barmanObjectName: - ``` - - c. **Check plugin deployment is running**: - - ```sh - kubectl get deployment -n cnpg-system barman-cloud - ``` - -2. **"rpc error: code = Unknown desc = panic caught: assignment to entry in nil map" errors** - - **Cause:** Misconfiguration in the `ObjectStore` (e.g., typo or missing field). - - **Solution:** - - - Review sidecar logs for details - - Verify `ObjectStore` configuration and secrets - - Common issues include: - - Missing or incorrect secret references - - Typos in configuration parameters - - Missing required environment variables in secrets - -#### Backup performance issues - -**Symptoms:** - -- Backups take extremely long -- Backups timeout - -**Plugin-specific considerations:** - -1. **Check `ObjectStore` parallelism settings** - - Adjust `maxParallel` in `ObjectStore` configuration - - Monitor sidecar container resource usage during backups - -2. **Verify plugin resource allocation** - - Check if the sidecar container has sufficient CPU/memory - - Review plugin container logs for resource-related warnings - -:::tip -For Barman-specific features like compression, encryption, and performance -tuning, refer to the [Barman documentation](https://docs.pgbarman.org/latest/). -::: - -### WAL Archiving Issues - -#### WAL archiving stops - -**Symptoms:** - -- WAL files accumulate on the primary -- Cluster shows WAL archiving warnings -- Sidecar logs show WAL errors - -**Debugging steps:** - -1. **Check plugin sidecar logs for WAL archiving errors** - ```sh - # Check recent WAL archive operations in sidecar - kubectl logs -n -c plugin-barman-cloud \ - --tail=50 | grep -i wal - ``` - -2. **Check ObjectStore configuration for WAL settings** - - Ensure ObjectStore has proper WAL retention settings - - Verify credentials have permissions for WAL operations - -### Restore Issues - -#### Restore fails during recovery - -**Symptoms:** - -- New cluster stuck in recovery -- Plugin sidecar shows restore errors -- PostgreSQL won’t start - -**Debugging steps:** - -1. **Check plugin sidecar logs during restore** - - ```sh - # Check the sidecar logs on the recovering cluster pods - kubectl logs -n \ - -c plugin-barman-cloud --tail=100 - - # Look for restore-related errors - kubectl logs -n \ - -c plugin-barman-cloud | grep -E "restore|recovery|ERROR" - ``` - -2. **Verify plugin can access backups** - - ```sh - # Check if `ObjectStore` is properly configured for restore - kubectl get objectstores.barmancloud.cnpg.io \ - -n -o yaml - - # Check PostgreSQL recovery logs - kubectl logs -n \ - -c postgres | grep -i recovery - ``` - -:::tip -For detailed Barman restore operations and troubleshooting, refer to the -[Barman documentation](https://docs.pgbarman.org/latest/barman-cloud-restore.html). -::: - -#### Point-in-time recovery (PITR) configuration issues - -**Symptoms:** - -- PITR doesn’t reach target time -- WAL access errors -- Recovery halts early - -**Debugging steps:** - -1. **Verify PITR configuration in the `Cluster` spec** - - ```yaml - apiVersion: postgresql.cnpg.io/v1 - kind: Cluster - metadata: - name: - spec: - storage: - size: 1Gi - - bootstrap: - recovery: - source: origin - recoveryTarget: - targetTime: "2024-01-15 10:30:00" - - externalClusters: - - name: origin - plugin: - enabled: true - name: barman-cloud.cloudnative-pg.io - parameters: - barmanObjectName: - serverName: - ``` - -2. **Check sidecar logs for WAL-related errors** - - ```sh - kubectl logs -n \ - -c plugin-barman-cloud | grep -i wal - ``` - -:::note -For detailed PITR configuration and WAL management, see the -[Barman PITR documentation](https://docs.pgbarman.org/latest/). -::: - -### Plugin Configuration Issues - -#### Plugin cannot connect to object storage - -**Symptoms:** - -- Sidecar logs show connection errors -- Backups fail with authentication or network errors -- `ObjectStore` resource reports errors - -**Solution:** - -1. **Verify `ObjectStore` CRD configuration and secrets** - - ```sh - # Check ObjectStore resource status - kubectl get objectstores.barmancloud.cnpg.io \ - -n -o yaml - - # Verify the secret exists and has correct keys for your provider - kubectl get secret -n \ - -o jsonpath='{.data}' | jq 'keys' - ``` - -2. **Check sidecar logs for connectivity issues** - ```sh - kubectl logs -n \ - -c plugin-barman-cloud | grep -E "connect|timeout|SSL|cert" - ``` - -3. **Adjust provider-specific settings (endpoint, path style, etc.)** - - See [Object Store Configuration](object_stores.md) for provider-specific settings - - Ensure `endpointURL` match your storage type - - Verify network policies allow egress to your storage provider - -## Diagnostic Commands - -### Using the `cnpg` plugin for `kubectl` - -The `cnpg` plugin for `kubectl` provides extended debugging capabilities. -Keep it updated: - -```sh -# Install or update the `cnpg` plugin -kubectl krew install cnpg -# Or using an alternative method: https://cloudnative-pg.io/documentation/current/kubectl-plugin/#install - -# Check plugin status (requires CNPG 1.27.0+) -kubectl cnpg status -n - -# View cluster status in detail -kubectl cnpg status -n --verbose -``` - -## Getting Help - -If problems persist: - -1. **Check the documentation** - - - [Installation Guide](installation.mdx) - - [Object Store Configuration](object_stores.md) (for provider-specific settings) - - [Usage Examples](usage.md) - - -2. **Gather diagnostic information** - - ```sh - # Create a diagnostic bundle (⚠️ sanitize these before sharing!) - kubectl get objectstores.barmancloud.cnpg.io -A -o yaml > /tmp/objectstores.yaml - kubectl get clusters.postgresql.cnpg.io -A -o yaml > /tmp/clusters.yaml - kubectl logs -n cnpg-system deployment/barman-cloud --tail=1000 > /tmp/plugin.log - ``` - - -3. **Community support** - - - CloudNativePG Slack: [#cloudnativepg-users](https://cloud-native.slack.com/messages/cloudnativepg-users) - - GitHub Issues: [plugin-barman-cloud](https://github.com/cloudnative-pg/plugin-barman-cloud/issues) - - -4. **Include when reporting** - - - CloudNativePG version - - Plugin version - - Kubernetes version - - Cloud provider and region - - Relevant configuration (⚠️ sanitize/redact sensitive information) - - Error messages and logs - - Steps to reproduce - -## Known Issues and Limitations - -### Current Known Issues - -1. **Migration compatibility**: After migrating from in-tree backup to the - plugin, the `kubectl cnpg backup` command syntax has changed - ([#353](https://github.com/cloudnative-pg/plugin-barman-cloud/issues/353)): - - ```sh - # Old command (in-tree, no longer works after migration) - kubectl cnpg backup -n \ - --method=barmanObjectStore - - # New command (plugin-based) - kubectl cnpg backup -n \ - --method=plugin --plugin-name=barman-cloud.cloudnative-pg.io - ``` - -### Plugin Limitations - -1. **Installation method**: Currently only supports manifest and Kustomize - installation ([#351](https://github.com/cloudnative-pg/plugin-barman-cloud/issues/351) - - Helm chart requested) - -2. **Sidecar resource sharing**: The plugin sidecar container shares pod - resources with PostgreSQL - -3. **Plugin restart behavior**: Restarting the sidecar container requires - restarting the entire PostgreSQL pod - -## Recap of General Debugging Steps - -### Check Backup Status and Identify the Target Instance - -```sh -# List all backups and their status -kubectl get backups.postgresql.cnpg.io -n - -# Get detailed backup information including error messages and target instance -kubectl describe backups.postgresql.cnpg.io \ - -n - -# Extract the target pod name from a failed backup -kubectl get backups.postgresql.cnpg.io \ - -n \ - -o jsonpath='{.status.instanceID.podName}' - -# Get more details including the target pod, method, phase, and error -kubectl get backups.postgresql.cnpg.io \ - -n \ - -o jsonpath='Pod: {.status.instanceID.podName}{"\n"}Method: {.status.method}{"\n"}Phase: {.status.phase}{"\n"}Error: {.status.error}{"\n"}' - -# Check the cluster status for backup-related information -kubectl cnpg status -n --verbose -``` - -### Check Sidecar Logs on the Backup Target Pod - -```sh -# Identify which pod was the backup target (from the previous step) -TARGET_POD=$(kubectl get backups.postgresql.cnpg.io \ - -n \ - -o jsonpath='{.status.instanceID.podName}') -echo "Backup target pod: $TARGET_POD" - -# Check the sidecar logs on the specific target pod -kubectl logs -n $TARGET_POD \ - -c plugin-barman-cloud --tail=100 - -# Follow the logs in real time -kubectl logs -n $TARGET_POD \ - -c plugin-barman-cloud -f - -# Check for specific errors in the target pod around the backup time -kubectl logs -n $TARGET_POD \ - -c plugin-barman-cloud --since=10m | grep -E "ERROR|FATAL|panic|failed" - -# Alternative: List all cluster pods and their roles -kubectl get pods -n -l cnpg.io/cluster= \ - -o custom-columns=NAME:.metadata.name,ROLE:.metadata.labels.cnpg\\.io/instanceRole,INSTANCE:.metadata.labels.cnpg\\.io/instanceName - -# Check sidecar logs on ALL cluster pods (if the target is unclear) -for pod in $(kubectl get pods -n -l cnpg.io/cluster= -o name); do - echo "=== Checking $pod ===" - kubectl logs -n $pod -c plugin-barman-cloud \ - --tail=20 | grep -i error || echo "No errors found" -done -``` - -### Check Events for Backup-Related Issues - -```sh -# Check events for the cluster -kubectl get events -n \ - --field-selector involvedObject.name= - -# Check events for failed backups -kubectl get events -n \ - --field-selector involvedObject.kind=Backup - -# Get all recent events in the namespace -kubectl get events -n --sort-by='.lastTimestamp' | tail -20 -``` - -### Verify `ObjectStore` Configuration - -```sh -# Check the ObjectStore resource -kubectl get objectstores.barmancloud.cnpg.io \ - -n -o yaml - -# Verify the secret exists and has the correct keys -kubectl get secret -n -o yaml -# Alternatively -kubectl get secret -n -o jsonpath='{.data}' | jq 'keys' -``` - -### Common Error Messages and Solutions - -* **"AccessDenied" or "403 Forbidden"** — Check cloud credentials and bucket permissions. -* **"NoSuchBucket"** — Verify the bucket exists and the endpoint URL is correct. -* **"Connection timeout"** — Check network connectivity and firewall rules. -* **"SSL certificate problem"** — For self-signed certificates, verify the CA bundle configuration. - diff --git a/web/versioned_docs/version-0.9.0/upgrades.mdx b/web/versioned_docs/version-0.9.0/upgrades.mdx deleted file mode 100644 index 0ab9ddb..0000000 --- a/web/versioned_docs/version-0.9.0/upgrades.mdx +++ /dev/null @@ -1,16 +0,0 @@ ---- -sidebar_position: 25 ---- - -# Upgrades - - - -You can upgrade the plugin simply by installing the new version. Unless -explicitly stated below or in the release notes, no special steps are required. - -## Upgrading to version 0.8.x from previous versions - -Version **0.8.0** introduces breaking changes to resource naming. -To complete the upgrade successfully, follow the instructions in the -["Resource name migration guide"](resource-name-migration.md). diff --git a/web/versioned_docs/version-0.9.0/usage.md b/web/versioned_docs/version-0.9.0/usage.md deleted file mode 100644 index 6406d38..0000000 --- a/web/versioned_docs/version-0.9.0/usage.md +++ /dev/null @@ -1,283 +0,0 @@ ---- -sidebar_position: 30 ---- - -# Using the Barman Cloud Plugin - - - -After [installing the plugin](installation.mdx) in the same namespace as the -CloudNativePG operator, enabling your PostgreSQL cluster to use the Barman -Cloud Plugin involves just a few steps: - -- Defining the object store containing your WAL archive and base backups, using - your preferred [provider](object_stores.md) -- Instructing the Postgres cluster to use the Barman Cloud Plugin - -From that moment, you’ll be able to issue on-demand backups or define a backup -schedule, as well as rely on the object store for recovery operations. - -The rest of this page details each step, using MinIO as object store provider. - -## Defining the `ObjectStore` - -An `ObjectStore` resource must be created for each object store used in your -PostgreSQL architecture. Here's an example configuration using MinIO: - -```yaml -apiVersion: barmancloud.cnpg.io/v1 -kind: ObjectStore -metadata: - name: minio-store -spec: - configuration: - destinationPath: s3://backups/ - endpointURL: http://minio:9000 - s3Credentials: - accessKeyId: - name: minio - key: ACCESS_KEY_ID - secretAccessKey: - name: minio - key: ACCESS_SECRET_KEY - wal: - compression: gzip -``` - -The `.spec.configuration` schema follows the same format as the -[in-tree barman-cloud support](https://pkg.go.dev/github.com/cloudnative-pg/barman-cloud/pkg/api#BarmanObjectStoreConfiguration). -Refer to [the CloudNativePG documentation](https://cloudnative-pg.io/documentation/current/appendixes/backup_barmanobjectstore/) -for additional details. - -:::important -The `serverName` parameter in the `ObjectStore` resource is retained solely for -API compatibility with the in-tree `barmanObjectStore` and must always be left empty. -When needed, use the `serverName` plugin parameter in the Cluster configuration instead. -::: - -## Configuring WAL Archiving - -Once the `ObjectStore` is defined, you can configure your PostgreSQL cluster -to archive WALs by referencing the store in the `.spec.plugins` section: - -```yaml -apiVersion: postgresql.cnpg.io/v1 -kind: Cluster -metadata: - name: cluster-example -spec: - instances: 3 - imagePullPolicy: Always - plugins: - - name: barman-cloud.cloudnative-pg.io - isWALArchiver: true - parameters: - barmanObjectName: minio-store - storage: - size: 1Gi -``` - -This configuration enables both WAL archiving and data directory backups. - -## Performing a Base Backup - -Once WAL archiving is enabled, the cluster is ready for backups. Backups can be -created either declaratively (with YAML manifests) or imperatively (with the -`cnpg` plugin). - -### Declarative approach (YAML manifest) - -Create a backup resource by applying a YAML manifest: - -```yaml -apiVersion: postgresql.cnpg.io/v1 -kind: Backup -metadata: - name: backup-example -spec: - cluster: - name: cluster-example - method: plugin - pluginConfiguration: - name: barman-cloud.cloudnative-pg.io -``` - -### Imperative approach (using the `cnpg` plugin) - -The quickest way to trigger an on-demand backup is with the `cnpg` plugin: - -```bash -kubectl cnpg backup -n \ - --method=plugin \ - --plugin-name=barman-cloud.cloudnative-pg.io -``` - -:::note Migration from in-tree backups -If you are migrating from the in-tree backup system, note the change in syntax: - -```bash -# Old command (in-tree backup) -kubectl cnpg backup -n --method=barmanObjectStore - -# New command (plugin-based backup) -kubectl cnpg backup -n \ - --method=plugin \ - --plugin-name=barman-cloud.cloudnative-pg.io -``` -::: - -## Restoring a Cluster - -To restore a cluster from an object store, create a new `Cluster` resource that -references the store containing the backup. Below is an example configuration: - -```yaml -apiVersion: postgresql.cnpg.io/v1 -kind: Cluster -metadata: - name: cluster-restore -spec: - instances: 3 - imagePullPolicy: IfNotPresent - bootstrap: - recovery: - source: source - externalClusters: - - name: source - plugin: - name: barman-cloud.cloudnative-pg.io - parameters: - barmanObjectName: minio-store - serverName: cluster-example - storage: - size: 1Gi -``` - -:::important -The above configuration does **not** enable WAL archiving for the restored cluster. -::: - -To enable WAL archiving for the restored cluster, include the `.spec.plugins` -section alongside the `externalClusters.plugin` section, as shown below: - -```yaml -apiVersion: postgresql.cnpg.io/v1 -kind: Cluster -metadata: - name: cluster-restore -spec: - instances: 3 - imagePullPolicy: IfNotPresent - bootstrap: - recovery: - source: source - plugins: - - name: barman-cloud.cloudnative-pg.io - isWALArchiver: true - parameters: - # Backup Object Store (push, read-write) - barmanObjectName: minio-store-bis - externalClusters: - - name: source - plugin: - name: barman-cloud.cloudnative-pg.io - parameters: - # Recovery Object Store (pull, read-only) - barmanObjectName: minio-store - serverName: cluster-example - storage: - size: 1Gi -``` - -The same object store may be used for both transaction log archiving and -restoring a cluster, or you can configure separate stores for these purposes. - -## Configuring Replica Clusters - -You can set up a distributed topology by combining the previously defined -configurations with the `.spec.replica` section. Below is an example of how to -define a replica cluster: - -```yaml -apiVersion: postgresql.cnpg.io/v1 -kind: Cluster -metadata: - name: cluster-dc-a -spec: - instances: 3 - primaryUpdateStrategy: unsupervised - - storage: - storageClass: csi-hostpath-sc - size: 1Gi - - plugins: - - name: barman-cloud.cloudnative-pg.io - isWALArchiver: true - parameters: - barmanObjectName: minio-store-a - - replica: - self: cluster-dc-a - primary: cluster-dc-a - source: cluster-dc-b - - externalClusters: - - name: cluster-dc-a - plugin: - name: barman-cloud.cloudnative-pg.io - parameters: - barmanObjectName: minio-store-a - - - name: cluster-dc-b - plugin: - name: barman-cloud.cloudnative-pg.io - parameters: - barmanObjectName: minio-store-b -``` - -## Configuring the plugin instance sidecar - -The Barman Cloud Plugin runs as a sidecar container next to each PostgreSQL -instance pod. It manages backup, WAL archiving, and restore processes. - -Configuration comes from multiple `ObjectStore` resources: - -1. The one referenced in the - `.spec.plugins` section of the `Cluster`. This is the - object store used for WAL archiving and base backups. -2. The one referenced in the external cluster - used in the `.spec.replica.source` section of the `Cluster`. This is - used by the log-shipping designated primary to get the WAL files. -3. The one referenced in the - `.spec.bootstrap.recovery.source` section of the `Cluster`. Used by - the initial recovery job to create the cluster from an existing backup. - -You can fine-tune sidecar behavior in the `.spec.instanceSidecarConfiguration` -of your ObjectStore. These settings apply to all PostgreSQL instances that use -this object store. Any updates take effect at the next `Cluster` reconciliation, -and could generate a rollout of the `Cluster`. - -```yaml -apiVersion: barmancloud.cnpg.io/v1 -kind: ObjectStore -metadata: - name: minio-store -spec: - configuration: - # [...] - instanceSidecarConfiguration: - retentionPolicyIntervalSeconds: 1800 - resources: - requests: - memory: "XXX" - cpu: "YYY" - limits: - memory: "XXX" - cpu: "YYY" -``` - -:::note -If more than one `ObjectStore` applies, the `instanceSidecarConfiguration` of -the one set in `.spec.plugins` has priority. -::: diff --git a/web/versioned_sidebars/version-0.10.0-sidebars.json b/web/versioned_sidebars/version-0.13.0-sidebars.json similarity index 100% rename from web/versioned_sidebars/version-0.10.0-sidebars.json rename to web/versioned_sidebars/version-0.13.0-sidebars.json diff --git a/web/versioned_sidebars/version-0.11.0-sidebars.json b/web/versioned_sidebars/version-0.14.0-sidebars.json similarity index 100% rename from web/versioned_sidebars/version-0.11.0-sidebars.json rename to web/versioned_sidebars/version-0.14.0-sidebars.json diff --git a/web/versioned_sidebars/version-0.12.0-sidebars.json b/web/versioned_sidebars/version-0.15.0-sidebars.json similarity index 100% rename from web/versioned_sidebars/version-0.12.0-sidebars.json rename to web/versioned_sidebars/version-0.15.0-sidebars.json diff --git a/web/versioned_sidebars/version-0.3.0-sidebars.json b/web/versioned_sidebars/version-0.3.0-sidebars.json deleted file mode 100644 index 1fd014a..0000000 --- a/web/versioned_sidebars/version-0.3.0-sidebars.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "docs": [ - { - "type": "autogenerated", - "dirName": "." - } - ] -} diff --git a/web/versioned_sidebars/version-0.4.0-sidebars.json b/web/versioned_sidebars/version-0.4.0-sidebars.json deleted file mode 100644 index 1fd014a..0000000 --- a/web/versioned_sidebars/version-0.4.0-sidebars.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "docs": [ - { - "type": "autogenerated", - "dirName": "." - } - ] -} diff --git a/web/versioned_sidebars/version-0.4.1-sidebars.json b/web/versioned_sidebars/version-0.4.1-sidebars.json deleted file mode 100644 index 1fd014a..0000000 --- a/web/versioned_sidebars/version-0.4.1-sidebars.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "docs": [ - { - "type": "autogenerated", - "dirName": "." - } - ] -} diff --git a/web/versioned_sidebars/version-0.5.0-sidebars.json b/web/versioned_sidebars/version-0.5.0-sidebars.json deleted file mode 100644 index 1fd014a..0000000 --- a/web/versioned_sidebars/version-0.5.0-sidebars.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "docs": [ - { - "type": "autogenerated", - "dirName": "." - } - ] -} diff --git a/web/versioned_sidebars/version-0.6.0-sidebars.json b/web/versioned_sidebars/version-0.6.0-sidebars.json deleted file mode 100644 index 1fd014a..0000000 --- a/web/versioned_sidebars/version-0.6.0-sidebars.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "docs": [ - { - "type": "autogenerated", - "dirName": "." - } - ] -} diff --git a/web/versioned_sidebars/version-0.7.0-sidebars.json b/web/versioned_sidebars/version-0.7.0-sidebars.json deleted file mode 100644 index 1fd014a..0000000 --- a/web/versioned_sidebars/version-0.7.0-sidebars.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "docs": [ - { - "type": "autogenerated", - "dirName": "." - } - ] -} diff --git a/web/versioned_sidebars/version-0.8.0-sidebars.json b/web/versioned_sidebars/version-0.8.0-sidebars.json deleted file mode 100644 index 1fd014a..0000000 --- a/web/versioned_sidebars/version-0.8.0-sidebars.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "docs": [ - { - "type": "autogenerated", - "dirName": "." - } - ] -} diff --git a/web/versioned_sidebars/version-0.9.0-sidebars.json b/web/versioned_sidebars/version-0.9.0-sidebars.json deleted file mode 100644 index 1fd014a..0000000 --- a/web/versioned_sidebars/version-0.9.0-sidebars.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "docs": [ - { - "type": "autogenerated", - "dirName": "." - } - ] -} diff --git a/web/versions.json b/web/versions.json index a788550..d743c1c 100644 --- a/web/versions.json +++ b/web/versions.json @@ -1,13 +1,5 @@ [ - "0.12.0", - "0.11.0", - "0.10.0", - "0.9.0", - "0.8.0", - "0.7.0", - "0.6.0", - "0.5.0", - "0.4.1", - "0.4.0", - "0.3.0" + "0.15.0", + "0.14.0", + "0.13.0" ] diff --git a/web/yarn.lock b/web/yarn.lock index 948865e..9a8925e 100644 --- a/web/yarn.lock +++ b/web/yarn.lock @@ -2,15 +2,25 @@ # yarn lockfile v1 -"@algolia/abtesting@1.18.1": - version "1.18.1" - resolved "https://registry.yarnpkg.com/@algolia/abtesting/-/abtesting-1.18.1.tgz#f6f6c221ec463eb3237756d41606c9fb364843dd" - integrity sha512-aehCadlWOGvrT91KUIZpC0MbB8KBW9yUuvTJFd2xesR7le/IsT4nJUnjCCZ4ZqZCeTcPHPV5mo//fZ5oxcSVYw== +"@11ty/gray-matter@^1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@11ty/gray-matter/-/gray-matter-1.0.0.tgz#35ee04d76b870893c053f64f659c923a7a9db2d7" + integrity sha512-7mJJl+wf1AByoT0PknQiQfOPnVNT4fevGrUBVWO4HXsnYn1aQPyRyrELYrNUFleUBM++KzMKN6QaxHPk0t/6/g== dependencies: - "@algolia/client-common" "5.52.1" - "@algolia/requester-browser-xhr" "5.52.1" - "@algolia/requester-fetch" "5.52.1" - "@algolia/requester-node-http" "5.52.1" + js-yaml "^4.1.0" + kind-of "^6.0.3" + section-matter "^1.0.0" + strip-bom-string "^1.0.0" + +"@algolia/abtesting@1.23.0": + version "1.23.0" + resolved "https://registry.yarnpkg.com/@algolia/abtesting/-/abtesting-1.23.0.tgz#810a23366284c4d3f3496e3f8fa7f1a24ec47206" + integrity sha512-j45MBISstltys9QyQ4xf6quRiN1g7vMuwQL9VM4dx8YuRZvCQ173b9royZAx6iAbRX3IB1VnG1z//NuwyQ8jpQ== + dependencies: + "@algolia/client-common" "5.57.0" + "@algolia/requester-browser-xhr" "5.57.0" + "@algolia/requester-fetch" "5.57.0" + "@algolia/requester-node-http" "5.57.0" "@algolia/autocomplete-core@1.19.2": version "1.19.2" @@ -21,12 +31,12 @@ "@algolia/autocomplete-shared" "1.19.2" "@algolia/autocomplete-core@^1.19.2": - version "1.19.8" - resolved "https://registry.yarnpkg.com/@algolia/autocomplete-core/-/autocomplete-core-1.19.8.tgz#7c84c771d28643fb00d09026c05013fb97aeea23" - integrity sha512-3YEorYg44niXcm7gkft3nXYItHd44e8tmh4D33CTszPgP0QWkaLEaFywiNyJBo7UL/mqObA/G9RYuU7R8tN1IA== + version "1.19.9" + resolved "https://registry.yarnpkg.com/@algolia/autocomplete-core/-/autocomplete-core-1.19.9.tgz#bbed371e56aeea4a31a3af239f16733e1b8aedca" + integrity sha512-4U2JKLMWlDu0CotYyUkWakDxr8AIav3QtIUXXRpfavYN29aVWfzlwJp9T0rPKEf/dO2QCPAUc0Kq1Tj1GJxo2A== dependencies: - "@algolia/autocomplete-plugin-algolia-insights" "1.19.8" - "@algolia/autocomplete-shared" "1.19.8" + "@algolia/autocomplete-plugin-algolia-insights" "1.19.9" + "@algolia/autocomplete-shared" "1.19.9" "@algolia/autocomplete-plugin-algolia-insights@1.19.2": version "1.19.2" @@ -35,172 +45,172 @@ dependencies: "@algolia/autocomplete-shared" "1.19.2" -"@algolia/autocomplete-plugin-algolia-insights@1.19.8": - version "1.19.8" - resolved "https://registry.yarnpkg.com/@algolia/autocomplete-plugin-algolia-insights/-/autocomplete-plugin-algolia-insights-1.19.8.tgz#f60d21edbe2a42e6d4e2215430733e3f51641471" - integrity sha512-ZvJWO8ZZJDpc1LNM2TTBdmQsZBLMR4rU5iNR2OYvEeFBiaf/0ESnRSSLQbryarJY4SVxtoz6A2ZtDMNM+iQEAA== +"@algolia/autocomplete-plugin-algolia-insights@1.19.9": + version "1.19.9" + resolved "https://registry.yarnpkg.com/@algolia/autocomplete-plugin-algolia-insights/-/autocomplete-plugin-algolia-insights-1.19.9.tgz#f799737d13bf0c4ec8421619c7107fa05c836535" + integrity sha512-6mExC6X7762s2SV3eJy3QOkB8bdMmnUhQ2agvGVDuzwoGyr3PquGSY/0vPQXCfiAiCaXUz1rXn+lwghgSi0l0w== dependencies: - "@algolia/autocomplete-shared" "1.19.8" + "@algolia/autocomplete-shared" "1.19.9" "@algolia/autocomplete-shared@1.19.2": version "1.19.2" resolved "https://registry.yarnpkg.com/@algolia/autocomplete-shared/-/autocomplete-shared-1.19.2.tgz#c0b7b8dc30a5c65b70501640e62b009535e4578f" integrity sha512-jEazxZTVD2nLrC+wYlVHQgpBoBB5KPStrJxLzsIFl6Kqd1AlG9sIAGl39V5tECLpIQzB3Qa2T6ZPJ1ChkwMK/w== -"@algolia/autocomplete-shared@1.19.8": - version "1.19.8" - resolved "https://registry.yarnpkg.com/@algolia/autocomplete-shared/-/autocomplete-shared-1.19.8.tgz#5d723d8bdb448efbb1b0e1c7ff94cc18e5b1dc0e" - integrity sha512-h5hf2t8ejF6vlOgvLaZzQbWs5SyH2z4PAWygNAvvD/2RI29hdQ54ldUGwqVuj9Srs+n8XUKTPUqb7fvhBhQrnQ== +"@algolia/autocomplete-shared@1.19.9": + version "1.19.9" + resolved "https://registry.yarnpkg.com/@algolia/autocomplete-shared/-/autocomplete-shared-1.19.9.tgz#c5b05e23c71027e4e45a301f286593dffdcdfbdf" + integrity sha512-YosP9Uoek6y/Ur1r1qeogk4biMe/hzkyNcgMCciw0//3XpCM7VlYLSHnyt/vOnEOGhCCc0+3v+unEiH6zz+Z1A== -"@algolia/client-abtesting@5.52.1": - version "5.52.1" - resolved "https://registry.yarnpkg.com/@algolia/client-abtesting/-/client-abtesting-5.52.1.tgz#e356949a304f3c6f30121e18d282cdd8f65b7f67" - integrity sha512-HmXOGBOAOJPounpBzBpuY0zDYeiCpxgHnQmuA7JO6ScukcBdGp3/XM9zJk5pJx/xNGD68mbPGXWpDxGtl6BwDQ== +"@algolia/client-abtesting@5.57.0": + version "5.57.0" + resolved "https://registry.yarnpkg.com/@algolia/client-abtesting/-/client-abtesting-5.57.0.tgz#dbd3f01148bdf2648133563021671e3d3628e4d4" + integrity sha512-JVFFujiZUCguk5tz3LZr4fTQxqpIrj4/Jw3SI7kMljSqtfLxYn/s/TWH0J2s4iNfsDpxPhgFGMotCpmDI4kZ8w== dependencies: - "@algolia/client-common" "5.52.1" - "@algolia/requester-browser-xhr" "5.52.1" - "@algolia/requester-fetch" "5.52.1" - "@algolia/requester-node-http" "5.52.1" + "@algolia/client-common" "5.57.0" + "@algolia/requester-browser-xhr" "5.57.0" + "@algolia/requester-fetch" "5.57.0" + "@algolia/requester-node-http" "5.57.0" -"@algolia/client-analytics@5.52.1": - version "5.52.1" - resolved "https://registry.yarnpkg.com/@algolia/client-analytics/-/client-analytics-5.52.1.tgz#82f50f028f88414a397d7ab2a284b0de61d8492a" - integrity sha512-5oo4+I8iixie9vXhCyNFCzeIr8pqA3FQ//VsLHTDvZAV4ttYOPGvYHGQq5NSalrLx5Jc3dRro/5uDOlnUMcBJg== +"@algolia/client-analytics@5.57.0": + version "5.57.0" + resolved "https://registry.yarnpkg.com/@algolia/client-analytics/-/client-analytics-5.57.0.tgz#e172c6ec3cdc7bfc5d305ba6190161cd9dfd3d1d" + integrity sha512-6KqECK4ED3JJQEoDrQWnGPQzElA828xAD4qK5ceawNNyP/LcSvzAoLHjFkoTPksZ/kxj6VUtCRH+IHZesLltng== dependencies: - "@algolia/client-common" "5.52.1" - "@algolia/requester-browser-xhr" "5.52.1" - "@algolia/requester-fetch" "5.52.1" - "@algolia/requester-node-http" "5.52.1" + "@algolia/client-common" "5.57.0" + "@algolia/requester-browser-xhr" "5.57.0" + "@algolia/requester-fetch" "5.57.0" + "@algolia/requester-node-http" "5.57.0" -"@algolia/client-common@5.52.1": - version "5.52.1" - resolved "https://registry.yarnpkg.com/@algolia/client-common/-/client-common-5.52.1.tgz#303ec8040b918c4b8bb1032d3385db1f1768cfbe" - integrity sha512-qCDoZfx5MpX7XQzvQ3bC4tSEMkQWQMaF/ABtLuoze03Y/flR563CCSws02qIJ23oX7lxl92LsilZjINVyTdtLw== +"@algolia/client-common@5.57.0": + version "5.57.0" + resolved "https://registry.yarnpkg.com/@algolia/client-common/-/client-common-5.57.0.tgz#e41ddfd7b2428c882077fb27e9bd44921fe8dc85" + integrity sha512-uqpGF3oXYsoCbQq5d7BzNrNTfIfuvJyGP1CKvSW27T9boUg7KOwyxsAw1AX0a3jSW2HrYEJ/NN+Z4MiGivbpeQ== -"@algolia/client-insights@5.52.1": - version "5.52.1" - resolved "https://registry.yarnpkg.com/@algolia/client-insights/-/client-insights-5.52.1.tgz#1558869cd0b0a7e59c46c0957535bddcb1eb43f4" - integrity sha512-hnGs0/lsFJ2PWDxNBz7pxreXo/Xz7gxYRcfePBUjsH26ad0kU/sgnVZd9LwWBpsQv65z2jlb5dkyaB9WE9M9FQ== +"@algolia/client-insights@5.57.0": + version "5.57.0" + resolved "https://registry.yarnpkg.com/@algolia/client-insights/-/client-insights-5.57.0.tgz#8bd281560f2d2a0b09d2c22a3ff8522c6fcb0e80" + integrity sha512-u5NboJVJXDEFplvNnqqX4CxkXPYysjJRj47hOSh9329H8kG5gFLKJBIiS5utMQ+GZm8xQl3Te7NInDk6elEADQ== dependencies: - "@algolia/client-common" "5.52.1" - "@algolia/requester-browser-xhr" "5.52.1" - "@algolia/requester-fetch" "5.52.1" - "@algolia/requester-node-http" "5.52.1" + "@algolia/client-common" "5.57.0" + "@algolia/requester-browser-xhr" "5.57.0" + "@algolia/requester-fetch" "5.57.0" + "@algolia/requester-node-http" "5.57.0" -"@algolia/client-personalization@5.52.1": - version "5.52.1" - resolved "https://registry.yarnpkg.com/@algolia/client-personalization/-/client-personalization-5.52.1.tgz#cc0ab06435b0e84dbdae7807131a30c4a5fbbd07" - integrity sha512-2VxxNc/uBysyKvGeBdSM5n9eIDKH8kWD7wd9/yqbJAiVwU4Yv6tU1LSJusHKrXV/aCu1KW7t9Gug9QyeEmtn/Q== +"@algolia/client-personalization@5.57.0": + version "5.57.0" + resolved "https://registry.yarnpkg.com/@algolia/client-personalization/-/client-personalization-5.57.0.tgz#31b963e1aad90e270712618476ee1b288f12f8d8" + integrity sha512-uzc0b2LmHAK9/QID4xeo35OG84AkZl4YewkCqawqAOGLjT2eZpM/OZx45ESygMHG30Ws+ZTSdluPtMJcUnrbWQ== dependencies: - "@algolia/client-common" "5.52.1" - "@algolia/requester-browser-xhr" "5.52.1" - "@algolia/requester-fetch" "5.52.1" - "@algolia/requester-node-http" "5.52.1" + "@algolia/client-common" "5.57.0" + "@algolia/requester-browser-xhr" "5.57.0" + "@algolia/requester-fetch" "5.57.0" + "@algolia/requester-node-http" "5.57.0" -"@algolia/client-query-suggestions@5.52.1": - version "5.52.1" - resolved "https://registry.yarnpkg.com/@algolia/client-query-suggestions/-/client-query-suggestions-5.52.1.tgz#6d1ec4950fe8478f33ac94da68122fd57092cf84" - integrity sha512-O6mPtsw3xEfNOe6gWFpYLeAZAIljNa4Hgna3bq15PwyN7nbjTY0wXJFRbzs/0YVf75Br+SbOQUmjKxXYjDiSiQ== +"@algolia/client-query-suggestions@5.57.0": + version "5.57.0" + resolved "https://registry.yarnpkg.com/@algolia/client-query-suggestions/-/client-query-suggestions-5.57.0.tgz#16895dc10abf228bd5ed136463273ed262b151b0" + integrity sha512-dIAhnM6ue/ssa5PjgNfu4g8A4yTojl9ZOUzZU3wIaIKRerL2R/3Emuf9n/D6ICXXP167KC6XCeC7nliSw7cuSw== dependencies: - "@algolia/client-common" "5.52.1" - "@algolia/requester-browser-xhr" "5.52.1" - "@algolia/requester-fetch" "5.52.1" - "@algolia/requester-node-http" "5.52.1" + "@algolia/client-common" "5.57.0" + "@algolia/requester-browser-xhr" "5.57.0" + "@algolia/requester-fetch" "5.57.0" + "@algolia/requester-node-http" "5.57.0" -"@algolia/client-search@5.52.1": - version "5.52.1" - resolved "https://registry.yarnpkg.com/@algolia/client-search/-/client-search-5.52.1.tgz#1a87024e25899cd7417c1dc88e4be1f390f38e85" - integrity sha512-gA8oJOV1LnQQkDf91iebNnFInHuW0gRPEgLSOQ7EfipCEjYTHm5swm1DlH9H5RaRw4RrHuzHBegnlzc0MAstcg== +"@algolia/client-search@5.57.0": + version "5.57.0" + resolved "https://registry.yarnpkg.com/@algolia/client-search/-/client-search-5.57.0.tgz#50363185ac641b5712ec5e3e81eba63a64d7e755" + integrity sha512-2TTPTTKSJmCptvhCm4Xf3bBYMqZni+Pgc2hVdqc4l9wsBpSJNVTVIKpnd10OubUgkGcmppVDj1XQqYaf6EnPSQ== dependencies: - "@algolia/client-common" "5.52.1" - "@algolia/requester-browser-xhr" "5.52.1" - "@algolia/requester-fetch" "5.52.1" - "@algolia/requester-node-http" "5.52.1" + "@algolia/client-common" "5.57.0" + "@algolia/requester-browser-xhr" "5.57.0" + "@algolia/requester-fetch" "5.57.0" + "@algolia/requester-node-http" "5.57.0" "@algolia/events@^4.0.1": version "4.0.1" resolved "https://registry.yarnpkg.com/@algolia/events/-/events-4.0.1.tgz#fd39e7477e7bc703d7f893b556f676c032af3950" integrity sha512-FQzvOCgoFXAbf5Y6mYozw2aj5KCJoA3m4heImceldzPSMbdyS4atVjJzXKMsfX3wnZTFYwkkt8/z8UesLHlSBQ== -"@algolia/ingestion@1.52.1": - version "1.52.1" - resolved "https://registry.yarnpkg.com/@algolia/ingestion/-/ingestion-1.52.1.tgz#6f045c218be76eae38e2ddb2c0d79081f67554b9" - integrity sha512-U9zZfc5xIu9wRxZkt+HceJUAD4VKHKbAyLSloJdEyMRmphXeibfrY9cxqIXBcmPeZzGhn3Imb35Dq8l19PkJhw== +"@algolia/ingestion@1.57.0": + version "1.57.0" + resolved "https://registry.yarnpkg.com/@algolia/ingestion/-/ingestion-1.57.0.tgz#0646edeaf3e63942301489fbd77ed9b55234558a" + integrity sha512-W4JseHKt+pzOxlFV+T3MWEG0h4Z2Se5zjoXUD0ewlw8aOWMG/yjRdopUdLQsXULepB/My2tDuZjkwk2sMfsUrQ== dependencies: - "@algolia/client-common" "5.52.1" - "@algolia/requester-browser-xhr" "5.52.1" - "@algolia/requester-fetch" "5.52.1" - "@algolia/requester-node-http" "5.52.1" + "@algolia/client-common" "5.57.0" + "@algolia/requester-browser-xhr" "5.57.0" + "@algolia/requester-fetch" "5.57.0" + "@algolia/requester-node-http" "5.57.0" -"@algolia/monitoring@1.52.1": - version "1.52.1" - resolved "https://registry.yarnpkg.com/@algolia/monitoring/-/monitoring-1.52.1.tgz#311045ebe1d1c987ffd3ef987847b13d2ade8b46" - integrity sha512-a3SGNceHmkQfq77iG8Ka+w1pvwfZa/0lzEIgse30fL0kD+yKnd/dg0dQvSfFPAEt2f21DMcGkDSSeJlO3KdQjQ== +"@algolia/monitoring@1.57.0": + version "1.57.0" + resolved "https://registry.yarnpkg.com/@algolia/monitoring/-/monitoring-1.57.0.tgz#a4adacfcb699dcc1a7297942db6655e5a7509ee6" + integrity sha512-BrxJVE0/eLinEPICCD7BKN/2xnt0nkjge70u8zzE2ISP3fuB3tjLgcwpanUycvlHBFLI4gK0l5ol54p6IYuR/Q== dependencies: - "@algolia/client-common" "5.52.1" - "@algolia/requester-browser-xhr" "5.52.1" - "@algolia/requester-fetch" "5.52.1" - "@algolia/requester-node-http" "5.52.1" + "@algolia/client-common" "5.57.0" + "@algolia/requester-browser-xhr" "5.57.0" + "@algolia/requester-fetch" "5.57.0" + "@algolia/requester-node-http" "5.57.0" -"@algolia/recommend@5.52.1": - version "5.52.1" - resolved "https://registry.yarnpkg.com/@algolia/recommend/-/recommend-5.52.1.tgz#8e197801ed0aabbf1006d7d3f2549f6d8a8c8729" - integrity sha512-z98QEguCFDpxb4S/PyrUK1igqF8tPsdbqOUUO6ON91vJ58w+Gwa6ncrI0oNXSFcrkxA5EqPKPQ2A1PBCn08TYQ== +"@algolia/recommend@5.57.0": + version "5.57.0" + resolved "https://registry.yarnpkg.com/@algolia/recommend/-/recommend-5.57.0.tgz#d0714fd2dd20c5b90d1c5f7facc3c32136e48218" + integrity sha512-Gc29jkeiLKlVfHvyrIgyUHHE+aYTdXEeLfK42rjr5/1TTVsYwUJz0XkvoIBIqfMjcDg6gXeHb1jTUZ0H+SYIlQ== dependencies: - "@algolia/client-common" "5.52.1" - "@algolia/requester-browser-xhr" "5.52.1" - "@algolia/requester-fetch" "5.52.1" - "@algolia/requester-node-http" "5.52.1" + "@algolia/client-common" "5.57.0" + "@algolia/requester-browser-xhr" "5.57.0" + "@algolia/requester-fetch" "5.57.0" + "@algolia/requester-node-http" "5.57.0" -"@algolia/requester-browser-xhr@5.52.1": - version "5.52.1" - resolved "https://registry.yarnpkg.com/@algolia/requester-browser-xhr/-/requester-browser-xhr-5.52.1.tgz#1cf9162c5f8a4b5a5379f29791c492f352f2f247" - integrity sha512-CI7+/0I11QeZM59Uc8whd2or0kqzFVjpaPn9Qpwll/krHcBAxk24WkAQ6WX+IwDVMfpont4YGbKwAmCre3vE8Q== +"@algolia/requester-browser-xhr@5.57.0": + version "5.57.0" + resolved "https://registry.yarnpkg.com/@algolia/requester-browser-xhr/-/requester-browser-xhr-5.57.0.tgz#4aee6fa45b792f0f57898bc556ff214a1c3457e3" + integrity sha512-PIPnPN7MP3fp2VAi01BVXhCWmD366ZB2Hkq5TlYKtThd4KxUtMmaaNDpFgVCTXtSIqWVZLJntOHRvxg/sIPd8Q== dependencies: - "@algolia/client-common" "5.52.1" + "@algolia/client-common" "5.57.0" -"@algolia/requester-fetch@5.52.1": - version "5.52.1" - resolved "https://registry.yarnpkg.com/@algolia/requester-fetch/-/requester-fetch-5.52.1.tgz#ee7e2094540a14a3e4416c31214b79f730d89c97" - integrity sha512-S6bDuw9byfOvm3T71cgdoZgrgnZq6hpdMLkx52Louh57nUAmvGQESz2aojOynQHjbTiV55smvAFbgn0qT4tJrg== +"@algolia/requester-fetch@5.57.0": + version "5.57.0" + resolved "https://registry.yarnpkg.com/@algolia/requester-fetch/-/requester-fetch-5.57.0.tgz#7715e53e330990343dad20577ad83d22aa32e60a" + integrity sha512-AX3RlOudXMdTwtwUqdAf5hAVLvXfOZZH1FZh6ALDdrhVLT0TtAIe48N6nYcWcTnwoTxK/wDIQqZ19IMjK8zJAA== dependencies: - "@algolia/client-common" "5.52.1" + "@algolia/client-common" "5.57.0" -"@algolia/requester-node-http@5.52.1": - version "5.52.1" - resolved "https://registry.yarnpkg.com/@algolia/requester-node-http/-/requester-node-http-5.52.1.tgz#be0d9c5642f392586bd306bae70befb38f04e0af" - integrity sha512-tqZXM+54rWo4mk5jL5Z/flE11nPmNEdXwFBM5py9DkOmbjeCNemfVd45FyM97XdzfZ0dl9uOJC6PYn1FpkeyQg== +"@algolia/requester-node-http@5.57.0": + version "5.57.0" + resolved "https://registry.yarnpkg.com/@algolia/requester-node-http/-/requester-node-http-5.57.0.tgz#fe979862e069f25fc99ddcdc8c5646abb5dba642" + integrity sha512-cWZc1dKb7wy9/wPpwMtL1y89gK2G7y2A47Coa7zwf1ydtIeJm4+S+XxoQ2b/ZRiQnrC1YHavLjYUPDCdnT7Khg== dependencies: - "@algolia/client-common" "5.52.1" + "@algolia/client-common" "5.57.0" -"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.28.6", "@babel/code-frame@^7.29.0": - version "7.29.0" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.29.0.tgz#7cd7a59f15b3cc0dcd803038f7792712a7d0b15c" - integrity sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw== +"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.29.7.tgz#f2fbbfea87c44a21590ec515b778b2c26d8866e7" + integrity sha512-Aup7aUOfpbAUg2ROOJN6Iw5f9DMBlzu0mIkm/malLQFN/YQgO48wCj0Kxa3sEHJvPVFg7siR+qRInwXd2qhQKw== dependencies: - "@babel/helper-validator-identifier" "^7.28.5" + "@babel/helper-validator-identifier" "^7.29.7" js-tokens "^4.0.0" picocolors "^1.1.1" -"@babel/compat-data@^7.28.6", "@babel/compat-data@^7.29.3": - version "7.29.3" - resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.29.3.tgz#e3f5347f0589596c91d227ccb6a541d37fb1307b" - integrity sha512-LIVqM46zQWZhj17qA8wb4nW/ixr2y1Nw+r1etiAWgRM6U1IqP+LNhL1yg440jYZR72jCWcWbLWzIosH+uP1fqg== +"@babel/compat-data@^7.28.6", "@babel/compat-data@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.29.7.tgz#6f0237f0f36d2e51c0570a636faed9d2d0efe629" + integrity sha512-locTkQyKvwIEgBzVrn8693ebc97F2U8ZHjbXwDXJ5Fn2TCpNwTlKcaKLkdHop5c/icOFE7qt7Q9JC5hnKNa6Gg== "@babel/core@^7.21.3", "@babel/core@^7.25.9": - version "7.29.0" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.29.0.tgz#5286ad785df7f79d656e88ce86e650d16ca5f322" - integrity sha512-CGOfOJqWjg2qW/Mb6zNsDm+u5vFQ8DxXfbM09z69p5Z6+mE1ikP2jUXw+j42Pf1XTYED2Rni5f95npYeuwMDQA== + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.29.7.tgz#80c10b17248082968b57a857b91640971f2070f7" + integrity sha512-RgHBCvtjbOK2gXSNBNIkNoEc9qoVEtau3hj8gEqKQuL3HZAibKarWFEI3Lfm6EYKkLalOh8eSrj9b+ch9H/VBA== dependencies: - "@babel/code-frame" "^7.29.0" - "@babel/generator" "^7.29.0" - "@babel/helper-compilation-targets" "^7.28.6" - "@babel/helper-module-transforms" "^7.28.6" - "@babel/helpers" "^7.28.6" - "@babel/parser" "^7.29.0" - "@babel/template" "^7.28.6" - "@babel/traverse" "^7.29.0" - "@babel/types" "^7.29.0" + "@babel/code-frame" "^7.29.7" + "@babel/generator" "^7.29.7" + "@babel/helper-compilation-targets" "^7.29.7" + "@babel/helper-module-transforms" "^7.29.7" + "@babel/helpers" "^7.29.7" + "@babel/parser" "^7.29.7" + "@babel/template" "^7.29.7" + "@babel/traverse" "^7.29.7" + "@babel/types" "^7.29.7" "@jridgewell/remapping" "^2.3.5" convert-source-map "^2.0.0" debug "^4.1.0" @@ -208,54 +218,54 @@ json5 "^2.2.3" semver "^6.3.1" -"@babel/generator@^7.25.9", "@babel/generator@^7.29.0": - version "7.29.1" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.29.1.tgz#d09876290111abbb00ef962a7b83a5307fba0d50" - integrity sha512-qsaF+9Qcm2Qv8SRIMMscAvG4O3lJ0F1GuMo5HR/Bp02LopNgnZBC/EkbevHFeGs4ls/oPz9v+Bsmzbkbe+0dUw== +"@babel/generator@^7.25.9", "@babel/generator@^7.29.7", "@babel/generator@^7.29.8": + version "7.29.8" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.29.8.tgz#4b0b887885422643339e09022148a4c4ebaa4979" + integrity sha512-gZbepsdh3WDtgZKWL+vTPh71LSBrm/Y4/QDZBVCcYfmeTEEuoOYwlSy+G1StfJg+/Zy550u/3TATbm7qDbbMtg== dependencies: - "@babel/parser" "^7.29.0" - "@babel/types" "^7.29.0" + "@babel/parser" "^7.29.8" + "@babel/types" "^7.29.8" "@jridgewell/gen-mapping" "^0.3.12" "@jridgewell/trace-mapping" "^0.3.28" jsesc "^3.0.2" -"@babel/helper-annotate-as-pure@^7.27.1", "@babel/helper-annotate-as-pure@^7.27.3": - version "7.27.3" - resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.27.3.tgz#f31fd86b915fc4daf1f3ac6976c59be7084ed9c5" - integrity sha512-fXSwMQqitTGeHLBC08Eq5yXz2m37E4pJX1qAU1+2cNedz/ifv/bVXft90VeSav5nFO61EcNgwr0aJxbyPaWBPg== +"@babel/helper-annotate-as-pure@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.29.7.tgz#c70fe3c6ecbdc3fd2dd1b0f498428b88b82ce47f" + integrity sha512-OoK6239jHPuSQOoS0kfTVKn0b/rVTk0seKq4Gd2UMLtmOVLjDC0ki3e+c90Trqv2gMfvJFqkiljrr568+qddiw== dependencies: - "@babel/types" "^7.27.3" + "@babel/types" "^7.29.7" -"@babel/helper-compilation-targets@^7.27.1", "@babel/helper-compilation-targets@^7.28.6": - version "7.28.6" - resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.28.6.tgz#32c4a3f41f12ed1532179b108a4d746e105c2b25" - integrity sha512-JYtls3hqi15fcx5GaSNL7SCTJ2MNmjrkHXg4FSpOA/grxK8KwyZ5bubHsCq8FXCkua6xhuaaBit+3b7+VZRfcA== +"@babel/helper-compilation-targets@^7.28.6", "@babel/helper-compilation-targets@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.29.7.tgz#7a1def704302401c47f64fa85589e974ae217042" + integrity sha512-wem6WaBj4NaVYVdNhLPPVacES6ZJ+KBBfSkTMD3YZxbP3rm3Di85tJU5ljaUNhaOynt+Aj0xruhYuzQBt8n71g== dependencies: - "@babel/compat-data" "^7.28.6" - "@babel/helper-validator-option" "^7.27.1" + "@babel/compat-data" "^7.29.7" + "@babel/helper-validator-option" "^7.29.7" browserslist "^4.24.0" lru-cache "^5.1.1" semver "^6.3.1" -"@babel/helper-create-class-features-plugin@^7.28.6": - version "7.29.3" - resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.29.3.tgz#67328947d956f06fc7b48def269bf0489155fd42" - integrity sha512-RpLYy2sb51oNLjuu1iD3bwBqCBWUzjO0ocp+iaCP/lJtb2CPLcnC2Fftw+4sAzaMELGeWTgExSKADbdo0GFVzA== +"@babel/helper-create-class-features-plugin@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.29.7.tgz#6eddf286f2ec418f740c91d60a83347c55838ddd" + integrity sha512-IY3ZD9Tmooqr3TUhc3DUWxiuo8xx1DWLhd5M7hQ+ZWJamqM2BbalrBJb2MisSLoYorOj75U03qULCxQTY9r3hg== dependencies: - "@babel/helper-annotate-as-pure" "^7.27.3" - "@babel/helper-member-expression-to-functions" "^7.28.5" - "@babel/helper-optimise-call-expression" "^7.27.1" - "@babel/helper-replace-supers" "^7.28.6" - "@babel/helper-skip-transparent-expression-wrappers" "^7.27.1" - "@babel/traverse" "^7.29.0" + "@babel/helper-annotate-as-pure" "^7.29.7" + "@babel/helper-member-expression-to-functions" "^7.29.7" + "@babel/helper-optimise-call-expression" "^7.29.7" + "@babel/helper-replace-supers" "^7.29.7" + "@babel/helper-skip-transparent-expression-wrappers" "^7.29.7" + "@babel/traverse" "^7.29.7" semver "^6.3.1" -"@babel/helper-create-regexp-features-plugin@^7.18.6", "@babel/helper-create-regexp-features-plugin@^7.27.1", "@babel/helper-create-regexp-features-plugin@^7.28.5": - version "7.28.5" - resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.28.5.tgz#7c1ddd64b2065c7f78034b25b43346a7e19ed997" - integrity sha512-N1EhvLtHzOvj7QQOUCCS3NrPJP8c5W6ZXCHDn7Yialuy1iu4r5EmIYkXlKNqT99Ciw+W0mDqWoR6HWMZlFP3hw== +"@babel/helper-create-regexp-features-plugin@^7.18.6", "@babel/helper-create-regexp-features-plugin@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.29.7.tgz#5d4c3f928f315cf6c4184ea2fc3b5b38745b2430" + integrity sha512-907Uymvqgg1dwUA+7IGwFAOSYzQOuzPXKNJ1yxzwPffzkYFg2q2eHi1fIOs6sXkG9NbIUMunnUlkYsfRFNvomg== dependencies: - "@babel/helper-annotate-as-pure" "^7.27.3" + "@babel/helper-annotate-as-pure" "^7.29.7" regexpu-core "^6.3.1" semver "^6.3.1" @@ -270,159 +280,159 @@ lodash.debounce "^4.0.8" resolve "^1.22.11" -"@babel/helper-globals@^7.28.0": - version "7.28.0" - resolved "https://registry.yarnpkg.com/@babel/helper-globals/-/helper-globals-7.28.0.tgz#b9430df2aa4e17bc28665eadeae8aa1d985e6674" - integrity sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw== +"@babel/helper-globals@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/helper-globals/-/helper-globals-7.29.7.tgz#f04a96fbd8473241b1079243f5b3f03a3010ab7b" + integrity sha512-3nQVUAtvkKH9zahfWgw96Jc/uFOmjACE1kQz82E2lqWmHBgjzbNlsC22nuQTfahmWeQtTq5nQ/4Nnd2A1wj4zA== -"@babel/helper-member-expression-to-functions@^7.28.5": - version "7.28.5" - resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.28.5.tgz#f3e07a10be37ed7a63461c63e6929575945a6150" - integrity sha512-cwM7SBRZcPCLgl8a7cY0soT1SptSzAlMH39vwiRpOQkJlh53r5hdHwLSCZpQdVLT39sZt+CRpNwYG4Y2v77atg== +"@babel/helper-member-expression-to-functions@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.29.7.tgz#8dbdb3ce0b5c487e1aec10e13c9a43a500814df8" + integrity sha512-j+7JYmk1JYDtACIGj0QJqqWZjoUpMoEikQGADMaHgCMCSDqd2+P32rfcibUNrGOMWrlzK1WJBdxrB3JJQZwWtg== dependencies: - "@babel/traverse" "^7.28.5" - "@babel/types" "^7.28.5" + "@babel/traverse" "^7.29.7" + "@babel/types" "^7.29.7" -"@babel/helper-module-imports@^7.28.6": - version "7.28.6" - resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.28.6.tgz#60632cbd6ffb70b22823187201116762a03e2d5c" - integrity sha512-l5XkZK7r7wa9LucGw9LwZyyCUscb4x37JWTPz7swwFE/0FMQAGpiWUZn8u9DzkSBWEcK25jmvubfpw2dnAMdbw== +"@babel/helper-module-imports@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.29.7.tgz#ef25048a518e828d7393fac5882ddd73921d7396" + integrity sha512-ejHwrQQYcm9xnTivShn2IDOlIzInN34AXskvq9QicvCtEzq1Vzclu/tKF8Jq1Cg8JG2GL6/EmjgsCT7lXepE3g== dependencies: - "@babel/traverse" "^7.28.6" - "@babel/types" "^7.28.6" + "@babel/traverse" "^7.29.7" + "@babel/types" "^7.29.7" -"@babel/helper-module-transforms@^7.27.1", "@babel/helper-module-transforms@^7.28.6": - version "7.28.6" - resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.28.6.tgz#9312d9d9e56edc35aeb6e95c25d4106b50b9eb1e" - integrity sha512-67oXFAYr2cDLDVGLXTEABjdBJZ6drElUSI7WKp70NrpyISso3plG9SAGEF6y7zbha/wOzUByWWTJvEDVNIUGcA== +"@babel/helper-module-transforms@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.29.7.tgz#b062747a5997ba138637201328bbff77960574ae" + integrity sha512-UPUVSyXbOh627KiCIGQSgwWzGeBKLkaJ9PJEdrngIwMSzxLR4jS4+f1f1jb7VzBbg8nFLaYotvVPFCTqdrmTAg== dependencies: - "@babel/helper-module-imports" "^7.28.6" - "@babel/helper-validator-identifier" "^7.28.5" - "@babel/traverse" "^7.28.6" + "@babel/helper-module-imports" "^7.29.7" + "@babel/helper-validator-identifier" "^7.29.7" + "@babel/traverse" "^7.29.7" -"@babel/helper-optimise-call-expression@^7.27.1": - version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.27.1.tgz#c65221b61a643f3e62705e5dd2b5f115e35f9200" - integrity sha512-URMGH08NzYFhubNSGJrpUEphGKQwMQYBySzat5cAByY1/YgIRkULnIy3tAMeszlL/so2HbeilYloUmSpd7GdVw== +"@babel/helper-optimise-call-expression@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.29.7.tgz#77b0b5b94f1997fa9d6e3125f445227b1faf9d85" + integrity sha512-+kmGVjcT9RGYzoDwdwEqEvGgKe3BYq+O1iGzjFubaNgZHwYHP6lsF2Yghf4kEuv9BV7tYDZ913aBW9am6YKong== dependencies: - "@babel/types" "^7.27.1" + "@babel/types" "^7.29.7" -"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.18.6", "@babel/helper-plugin-utils@^7.27.1", "@babel/helper-plugin-utils@^7.28.6", "@babel/helper-plugin-utils@^7.8.0": - version "7.28.6" - resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.28.6.tgz#6f13ea251b68c8532e985fd532f28741a8af9ac8" - integrity sha512-S9gzZ/bz83GRysI7gAD4wPT/AI3uCnY+9xn+Mx/KPs2JwHJIz1W8PZkg2cqyt3RNOBM8ejcXhV6y8Og7ly/Dug== +"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.18.6", "@babel/helper-plugin-utils@^7.28.6", "@babel/helper-plugin-utils@^7.29.7", "@babel/helper-plugin-utils@^7.8.0": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.29.7.tgz#c0a0766f1a13617d8a17407d7ab8f9d486225ea4" + integrity sha512-G7sHYigPY17oO5SYWnfD/0MTBwVR781S/JI643e/JhUYgVgWE/61SoW3NH9KWUKyKq5LVh3npif99Wkt6j86Jw== -"@babel/helper-remap-async-to-generator@^7.27.1": - version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.27.1.tgz#4601d5c7ce2eb2aea58328d43725523fcd362ce6" - integrity sha512-7fiA521aVw8lSPeI4ZOD3vRFkoqkJcS+z4hFo82bFSH/2tNd6eJ5qCVMS5OzDmZh/kaHQeBaeyxK6wljcPtveA== +"@babel/helper-remap-async-to-generator@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.29.7.tgz#34b1f68dd75b86d31df781a29c3ff2df88da82e6" + integrity sha512-16AMiW26DbXWBbr3B8wNozKM0ydMLB892vaOaJW/fPJdnT8vJk5sdkQcU/isqUxyCE0cEoa8wZOcbgDuC4b6Og== dependencies: - "@babel/helper-annotate-as-pure" "^7.27.1" - "@babel/helper-wrap-function" "^7.27.1" - "@babel/traverse" "^7.27.1" + "@babel/helper-annotate-as-pure" "^7.29.7" + "@babel/helper-wrap-function" "^7.29.7" + "@babel/traverse" "^7.29.7" -"@babel/helper-replace-supers@^7.27.1", "@babel/helper-replace-supers@^7.28.6": - version "7.28.6" - resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.28.6.tgz#94aa9a1d7423a00aead3f204f78834ce7d53fe44" - integrity sha512-mq8e+laIk94/yFec3DxSjCRD2Z0TAjhVbEJY3UQrlwVo15Lmt7C2wAUbK4bjnTs4APkwsYLTahXRraQXhb1WCg== +"@babel/helper-replace-supers@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.29.7.tgz#bc3c3964329043c79112e513c1b198f16589ac21" + integrity sha512-atfGXWSeCiF4DnKZIfmJfQRkSw9b9gNNXR1kqKjbhG4pGYCOnkp8OcTB8E3NXjBu8NpheSnOeNKz8KT7UNFTmQ== dependencies: - "@babel/helper-member-expression-to-functions" "^7.28.5" - "@babel/helper-optimise-call-expression" "^7.27.1" - "@babel/traverse" "^7.28.6" + "@babel/helper-member-expression-to-functions" "^7.29.7" + "@babel/helper-optimise-call-expression" "^7.29.7" + "@babel/traverse" "^7.29.7" -"@babel/helper-skip-transparent-expression-wrappers@^7.27.1": - version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.27.1.tgz#62bb91b3abba8c7f1fec0252d9dbea11b3ee7a56" - integrity sha512-Tub4ZKEXqbPjXgWLl2+3JpQAYBJ8+ikpQ2Ocj/q/r0LwE3UhENh7EUabyHjz2kCEsrRY83ew2DQdHluuiDQFzg== +"@babel/helper-skip-transparent-expression-wrappers@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.29.7.tgz#50c95c7e4c4f54936cfa0116428edc559862d551" + integrity sha512-brcMGQaVzIeUb+6/bs1Av0f8YuNNjKY2JyvfRCsFuFsdKccEQ5Ges2y74D74NZ1Rz8lKJ9ksJkfqwQFJ/iNEyQ== dependencies: - "@babel/traverse" "^7.27.1" - "@babel/types" "^7.27.1" + "@babel/traverse" "^7.29.7" + "@babel/types" "^7.29.7" -"@babel/helper-string-parser@^7.27.1": - version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz#54da796097ab19ce67ed9f88b47bb2ec49367687" - integrity sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA== +"@babel/helper-string-parser@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.29.7.tgz#7f0871d99824d23137d60f86fcf6130fd5a1b51f" + integrity sha512-Pb5ijPrZ89GDH8223L4UP8i6QApWxs04RbPQJTeWDV0/keR2E36MeKnyr6LYmUUvqRRI+Iv87SuF1W6ErINzYw== -"@babel/helper-validator-identifier@^7.28.5": - version "7.28.5" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz#010b6938fab7cb7df74aa2bbc06aa503b8fe5fb4" - integrity sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q== +"@babel/helper-validator-identifier@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.29.7.tgz#bd87084ced0c796ec46bda492de6e83d29e89fc2" + integrity sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg== -"@babel/helper-validator-option@^7.27.1": - version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz#fa52f5b1e7db1ab049445b421c4471303897702f" - integrity sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg== +"@babel/helper-validator-option@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.29.7.tgz#cf315be940213b354eb4abcc0bd01ebe3f73bc2a" + integrity sha512-N9ZErrD+yW5geCDtBqnOoxmR8+tNKiGuxKlDpuJxfsqpa2dFcexaziGAE/qoHLiDDreVNMupxGmSoNlyvsA3gw== -"@babel/helper-wrap-function@^7.27.1": - version "7.28.6" - resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.28.6.tgz#4e349ff9222dab69a93a019cc296cdd8442e279a" - integrity sha512-z+PwLziMNBeSQJonizz2AGnndLsP2DeGHIxDAn+wdHOGuo4Fo1x1HBPPXeE9TAOPHNNWQKCSlA2VZyYyyibDnQ== +"@babel/helper-wrap-function@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.29.7.tgz#eec72163044548a0935e9d182bf2d547ec5ff483" + integrity sha512-iES0Skag9ERIF68aXadpO6dbXa03mNWK3sEqJaMnLNs/eC3l0lkImdfoy6Y09/SfkpawdAB4RjQ7PVA7TcVGdw== dependencies: - "@babel/template" "^7.28.6" - "@babel/traverse" "^7.28.6" - "@babel/types" "^7.28.6" + "@babel/template" "^7.29.7" + "@babel/traverse" "^7.29.7" + "@babel/types" "^7.29.7" -"@babel/helpers@^7.28.6": - version "7.29.2" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.29.2.tgz#9cfbccb02b8e229892c0b07038052cc1a8709c49" - integrity sha512-HoGuUs4sCZNezVEKdVcwqmZN8GoHirLUcLaYVNBK2J0DadGtdcqgr3BCbvH8+XUo4NGjNl3VOtSjEKNzqfFgKw== +"@babel/helpers@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.29.7.tgz#45abfde7548997e34376c3e69feb475cffb4a607" + integrity sha512-1k2lAGRMfHTcwuNYcCNUmaUffmQv8KWMfh2iJUUeRlwlwH4FdNG7mfPI10NPfLHJFThE4Tyr4mv7kTNZOiPuBg== dependencies: - "@babel/template" "^7.28.6" - "@babel/types" "^7.29.0" + "@babel/template" "^7.29.7" + "@babel/types" "^7.29.7" -"@babel/parser@^7.28.6", "@babel/parser@^7.29.0": - version "7.29.3" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.29.3.tgz#116f70a77958307fceac27747573032f8a62f88e" - integrity sha512-b3ctpQwp+PROvU/cttc4OYl4MzfJUWy6FZg+PMXfzmt/+39iHVF0sDfqay8TQM3JA2EUOyKcFZt75jWriQijsA== +"@babel/parser@^7.29.7", "@babel/parser@^7.29.8": + version "7.29.8" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.29.8.tgz#9653716a2f10c677b98fbc63d4bfb000c302cf17" + integrity sha512-E8lTAYNB1KW+FH+VGJuZM1ioAx2E6oVlvQFRrf5P8ZZmsiJXYAD9vTFV7yyEURNzgh1dFqMZuO6tUwcARbqFCA== dependencies: - "@babel/types" "^7.29.0" + "@babel/types" "^7.29.8" -"@babel/plugin-bugfix-firefox-class-in-computed-class-key@^7.28.5": - version "7.28.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.28.5.tgz#fbde57974707bbfa0376d34d425ff4fa6c732421" - integrity sha512-87GDMS3tsmMSi/3bWOte1UblL+YUTFMV8SZPZ2eSEL17s74Cw/l63rR6NmGVKMYW2GYi85nE+/d6Hw5N0bEk2Q== +"@babel/plugin-bugfix-firefox-class-in-computed-class-key@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.29.7.tgz#2b535896d933a85aa92377eaa3d51a437d54a4e3" + integrity sha512-j8SrR0zLZrRsC09DlszEx8FpMiwukKffYXMK0d5LmOglO7vGG6sz/BR/20yHqWH+Lnn31JTt2PE3hIWNgM2J6w== dependencies: - "@babel/helper-plugin-utils" "^7.27.1" - "@babel/traverse" "^7.28.5" + "@babel/helper-plugin-utils" "^7.29.7" + "@babel/traverse" "^7.29.7" -"@babel/plugin-bugfix-safari-class-field-initializer-scope@^7.27.1": - version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-safari-class-field-initializer-scope/-/plugin-bugfix-safari-class-field-initializer-scope-7.27.1.tgz#43f70a6d7efd52370eefbdf55ae03d91b293856d" - integrity sha512-qNeq3bCKnGgLkEXUuFry6dPlGfCdQNZbn7yUAPCInwAJHMU7THJfrBSozkcWq5sNM6RcF3S8XyQL2A52KNR9IA== +"@babel/plugin-bugfix-safari-class-field-initializer-scope@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-safari-class-field-initializer-scope/-/plugin-bugfix-safari-class-field-initializer-scope-7.29.7.tgz#b00711a9e52bf4fe55ef7e54b2ef4a881bf804c8" + integrity sha512-r8j8escF+U2FUHo0KOhPUdMzUO+jp9fInva6+ACVAF3Y97Ev+5iNZwiqTghmzNeWwDkOPlYuTcfb1vDaoZKmAQ== dependencies: - "@babel/helper-plugin-utils" "^7.27.1" + "@babel/helper-plugin-utils" "^7.29.7" -"@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.27.1": - version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.27.1.tgz#beb623bd573b8b6f3047bd04c32506adc3e58a72" - integrity sha512-g4L7OYun04N1WyqMNjldFwlfPCLVkgB54A/YCXICZYBsvJJE3kByKv9c9+R/nAfmIfjl2rKYLNyMHboYbZaWaA== +"@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.29.7.tgz#2375328852026a3cf6bc0bcf2de7d236f2d5e701" + integrity sha512-GE1TFSiuFeGsCxmYXZl8HwoPrVlwe4rHPFE8weieGKZqnDORK+Ar3vgWMgW+AOxQ6/2TgLSKx9p6W7O4rC6qgQ== dependencies: - "@babel/helper-plugin-utils" "^7.27.1" + "@babel/helper-plugin-utils" "^7.29.7" -"@babel/plugin-bugfix-safari-rest-destructuring-rhs-array@^7.29.3": - version "7.29.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-safari-rest-destructuring-rhs-array/-/plugin-bugfix-safari-rest-destructuring-rhs-array-7.29.3.tgz#2e14f9335803d892ccb67ef487e23cf9726156fe" - integrity sha512-SRS46DFR4HqzUzCVgi90/xMoL+zeBDBvWdKYXSEzh79kXswNFEglUpMKxR04//dPqwYXWUBJ3mpUd933ru9Kmg== +"@babel/plugin-bugfix-safari-rest-destructuring-rhs-array@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-safari-rest-destructuring-rhs-array/-/plugin-bugfix-safari-rest-destructuring-rhs-array-7.29.7.tgz#759a857c46c4d2a6199685cf71070d81ae5f743a" + integrity sha512-oBNVCvnO5tND+xSopWvV8WNGfpTfgP4Zr/YXXSj8zfmcPktp5Ku/aZlsIowgSD4fjmgHn6sGmB9APVsU5zOdhA== dependencies: - "@babel/helper-plugin-utils" "^7.28.6" - "@babel/helper-skip-transparent-expression-wrappers" "^7.27.1" + "@babel/helper-plugin-utils" "^7.29.7" + "@babel/helper-skip-transparent-expression-wrappers" "^7.29.7" -"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@^7.27.1": - version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.27.1.tgz#e134a5479eb2ba9c02714e8c1ebf1ec9076124fd" - integrity sha512-oO02gcONcD5O1iTLi/6frMJBIwWEHceWGSGqrpCmEL8nogiS6J9PBlE48CaK20/Jx1LuRml9aDftLgdjXT8+Cw== +"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.29.7.tgz#86de98dd8e03836178231ea96c27dab26016a705" + integrity sha512-QQt9qKHZ2sg/kivaLr7lnQr8HVrQDdBNSfCsTjiDxRuX/K5ORyKq+Bu8Xr0cDE3Dfkv0cw28Ve0EKyKMvulkOw== dependencies: - "@babel/helper-plugin-utils" "^7.27.1" - "@babel/helper-skip-transparent-expression-wrappers" "^7.27.1" - "@babel/plugin-transform-optional-chaining" "^7.27.1" + "@babel/helper-plugin-utils" "^7.29.7" + "@babel/helper-skip-transparent-expression-wrappers" "^7.29.7" + "@babel/plugin-transform-optional-chaining" "^7.29.7" -"@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@^7.28.6": - version "7.28.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.28.6.tgz#0e8289cec28baaf05d54fd08d81ae3676065f69f" - integrity sha512-a0aBScVTlNaiUe35UtfxAN7A/tehvvG4/ByO6+46VPKTRSlfnAFsgKy0FUh+qAkQrDTmhDkT+IBOKlOoMUxQ0g== +"@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.29.7.tgz#f5d892681dbf4b08753436a5e55000d5ba728d6d" + integrity sha512-pn6QacGLgvCcwc+syUhKE/qSjV2D1IHDB84RNxWYSt1mW3K/SCtjinZ2p0cETJxAWBjPy3K/1lHwG5BjjPxNlw== dependencies: - "@babel/helper-plugin-utils" "^7.28.6" - "@babel/traverse" "^7.28.6" + "@babel/helper-plugin-utils" "^7.29.7" + "@babel/traverse" "^7.29.7" "@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2": version "7.21.0-placeholder-for-preset-env.2" @@ -436,33 +446,33 @@ dependencies: "@babel/helper-plugin-utils" "^7.8.0" -"@babel/plugin-syntax-import-assertions@^7.28.6": - version "7.28.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.28.6.tgz#ae9bc1923a6ba527b70104dd2191b0cd872c8507" - integrity sha512-pSJUpFHdx9z5nqTSirOCMtYVP2wFgoWhP0p3g8ONK/4IHhLIBd0B9NYqAvIUAhq+OkhO4VM1tENCt0cjlsNShw== +"@babel/plugin-syntax-import-assertions@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.29.7.tgz#c5cd868505269126cc18882e1f01f7b0e0e24b4e" + integrity sha512-/An1OCBN93thpBAGyfsK2pcf0jvju1SAtKkL2Ny++B5Sy6sqgzXDQH1cZxWbF96Wuk+bn41MDA9bLd4VVAw6rw== dependencies: - "@babel/helper-plugin-utils" "^7.28.6" + "@babel/helper-plugin-utils" "^7.29.7" -"@babel/plugin-syntax-import-attributes@^7.28.6": - version "7.28.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.28.6.tgz#b71d5914665f60124e133696f17cd7669062c503" - integrity sha512-jiLC0ma9XkQT3TKJ9uYvlakm66Pamywo+qwL+oL8HJOvc6TWdZXVfhqJr8CCzbSGUAbDOzlGHJC1U+vRfLQDvw== +"@babel/plugin-syntax-import-attributes@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.29.7.tgz#6115264516e95ead0f35a41710906612e447f605" + integrity sha512-zGYcYfq/WmZ4V+kBIXQon9dSSc8ircGZqw9ZaNhhGj9nZkeBu1jHLBDQqYYi5WA9uawvA2sIMbry2nCFhf5Djg== dependencies: - "@babel/helper-plugin-utils" "^7.28.6" + "@babel/helper-plugin-utils" "^7.29.7" -"@babel/plugin-syntax-jsx@^7.27.1", "@babel/plugin-syntax-jsx@^7.28.6": - version "7.28.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.28.6.tgz#f8ca28bbd84883b5fea0e447c635b81ba73997ee" - integrity sha512-wgEmr06G6sIpqr8YDwA2dSRTE3bJ+V0IfpzfSY3Lfgd7YWOaAdlykvJi13ZKBt8cZHfgH1IXN+CL656W3uUa4w== +"@babel/plugin-syntax-jsx@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.29.7.tgz#622c16f9ad63782fe6e83dadc7e40330744b7f1e" + integrity sha512-TSu8+mHCoEaaCDEZ0I3+6mvTBYR4PCxQwf2z9/r5Tbztv6NaLR3B9thGTTxX2WGuGHJqRiAbKPeGTJ5XWXVg6A== dependencies: - "@babel/helper-plugin-utils" "^7.28.6" + "@babel/helper-plugin-utils" "^7.29.7" -"@babel/plugin-syntax-typescript@^7.28.6": - version "7.28.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.28.6.tgz#c7b2ddf1d0a811145b1de800d1abd146af92e3a2" - integrity sha512-+nDNmQye7nlnuuHDboPbGm00Vqg3oO8niRRL27/4LYHUsHYh0zJ1xWOz0uRwNFmM1Avzk8wZbc6rdiYhomzv/A== +"@babel/plugin-syntax-typescript@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.29.7.tgz#7c29388932313ed58413a0343048d75d92fb5b24" + integrity sha512-ngr+82Sh0xMz25TPCZi+nC2iTzjfCdWS2ONXTp/PtSCHCgaCNBpdMqgvJ2ccdLlClVZ7sisIgB914j/JFe+RZA== dependencies: - "@babel/helper-plugin-utils" "^7.28.6" + "@babel/helper-plugin-utils" "^7.29.7" "@babel/plugin-syntax-unicode-sets-regex@^7.18.6": version "7.18.6" @@ -472,536 +482,536 @@ "@babel/helper-create-regexp-features-plugin" "^7.18.6" "@babel/helper-plugin-utils" "^7.18.6" -"@babel/plugin-transform-arrow-functions@^7.27.1": - version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.27.1.tgz#6e2061067ba3ab0266d834a9f94811196f2aba9a" - integrity sha512-8Z4TGic6xW70FKThA5HYEKKyBpOOsucTOD1DjU3fZxDg+K3zBJcXMFnt/4yQiZnf5+MiOMSXQ9PaEK/Ilh1DeA== +"@babel/plugin-transform-arrow-functions@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.29.7.tgz#d651343f562c03f47951bd1802195d0e10605f27" + integrity sha512-N7zArUXWzAMzm+/N0uPBeVB3Fam5lMxtUwMmDK5f/IBBS7a7p1qeUoxd/6CckXoxUdgsntq1Dh8xNW06maZbDQ== dependencies: - "@babel/helper-plugin-utils" "^7.27.1" + "@babel/helper-plugin-utils" "^7.29.7" -"@babel/plugin-transform-async-generator-functions@^7.29.0": - version "7.29.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.29.0.tgz#63ed829820298f0bf143d5a4a68fb8c06ffd742f" - integrity sha512-va0VdWro4zlBr2JsXC+ofCPB2iG12wPtVGTWFx2WLDOM3nYQZZIGP82qku2eW/JR83sD+k2k+CsNtyEbUqhU6w== +"@babel/plugin-transform-async-generator-functions@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.29.7.tgz#a5365617921d82a1fee33124a1102bb38a1e677d" + integrity sha512-d98gXZkgswvkyohMBABkhm3GeXhYj8psWfwQ2C7gtfrKGTykQa/iOIi+JJhwMjPlZ6Vm2XN+DCf3Es1EoG4ZLA== dependencies: - "@babel/helper-plugin-utils" "^7.28.6" - "@babel/helper-remap-async-to-generator" "^7.27.1" - "@babel/traverse" "^7.29.0" + "@babel/helper-plugin-utils" "^7.29.7" + "@babel/helper-remap-async-to-generator" "^7.29.7" + "@babel/traverse" "^7.29.7" -"@babel/plugin-transform-async-to-generator@^7.28.6": - version "7.28.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.28.6.tgz#bd97b42237b2d1bc90d74bcb486c39be5b4d7e77" - integrity sha512-ilTRcmbuXjsMmcZ3HASTe4caH5Tpo93PkTxF9oG2VZsSWsahydmcEHhix9Ik122RcTnZnUzPbmux4wh1swfv7g== +"@babel/plugin-transform-async-to-generator@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.29.7.tgz#3b5e8f1fb58133cf701bcf0baaf6f01bfd1a8889" + integrity sha512-pcUb2SS+RMo9TWVBwKGI5ShtoG7R+zBsFmCKDa6fe8c+hPr3XJlZgoE5j6i8W7gDjhyvy+85vmYexanvXh3d1w== dependencies: - "@babel/helper-module-imports" "^7.28.6" - "@babel/helper-plugin-utils" "^7.28.6" - "@babel/helper-remap-async-to-generator" "^7.27.1" + "@babel/helper-module-imports" "^7.29.7" + "@babel/helper-plugin-utils" "^7.29.7" + "@babel/helper-remap-async-to-generator" "^7.29.7" -"@babel/plugin-transform-block-scoped-functions@^7.27.1": - version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.27.1.tgz#558a9d6e24cf72802dd3b62a4b51e0d62c0f57f9" - integrity sha512-cnqkuOtZLapWYZUYM5rVIdv1nXYuFVIltZ6ZJ7nIj585QsjKM5dhL2Fu/lICXZ1OyIAFc7Qy+bvDAtTXqGrlhg== +"@babel/plugin-transform-block-scoped-functions@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.29.7.tgz#96d292634434082d6687bcdb81139affedf77e8c" + integrity sha512-cUSmjh72N+rN4PrkFlN1dJwNCwjVp5d38/CQrEsFggkD10UiFlBFgdH3tv5dNsLuHY+3S8db2xCHjhZcv5WgvA== dependencies: - "@babel/helper-plugin-utils" "^7.27.1" + "@babel/helper-plugin-utils" "^7.29.7" -"@babel/plugin-transform-block-scoping@^7.28.6": - version "7.28.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.28.6.tgz#e1ef5633448c24e76346125c2534eeb359699a99" - integrity sha512-tt/7wOtBmwHPNMPu7ax4pdPz6shjFrmHDghvNC+FG9Qvj7D6mJcoRQIF5dy4njmxR941l6rgtvfSB2zX3VlUIw== +"@babel/plugin-transform-block-scoping@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.29.7.tgz#baa376691ae16244cd14335422fca6900f54e17d" + integrity sha512-ONyr4+AZhKh8yKWInVxU9AXA9EbsyeLcL6V0dJy6M2/62vuvpGm29zzuymbTpdc451GEpDIdAyPLP3r+P61yKQ== dependencies: - "@babel/helper-plugin-utils" "^7.28.6" + "@babel/helper-plugin-utils" "^7.29.7" -"@babel/plugin-transform-class-properties@^7.28.6": - version "7.28.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.28.6.tgz#d274a4478b6e782d9ea987fda09bdb6d28d66b72" - integrity sha512-dY2wS3I2G7D697VHndN91TJr8/AAfXQNt5ynCTI/MpxMsSzHp+52uNivYT5wCPax3whc47DR8Ba7cmlQMg24bw== +"@babel/plugin-transform-class-properties@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.29.7.tgz#034897b8a21beec163332fac2de235b14409abdf" + integrity sha512-GtcpjFvanPfzNQi3eTitsCqtRRmmqzpy/A+yhTR1HaZo1Ly3EA8ZXxlPyHdR8/IuRMYc3E4wdGBewB2QKQjAaA== dependencies: - "@babel/helper-create-class-features-plugin" "^7.28.6" - "@babel/helper-plugin-utils" "^7.28.6" + "@babel/helper-create-class-features-plugin" "^7.29.7" + "@babel/helper-plugin-utils" "^7.29.7" -"@babel/plugin-transform-class-static-block@^7.28.6": - version "7.28.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.28.6.tgz#1257491e8259c6d125ac4d9a6f39f9d2bf3dba70" - integrity sha512-rfQ++ghVwTWTqQ7w8qyDxL1XGihjBss4CmTgGRCTAC9RIbhVpyp4fOeZtta0Lbf+dTNIVJer6ych2ibHwkZqsQ== +"@babel/plugin-transform-class-static-block@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.29.7.tgz#fed8efd19f3dd3e1114ee390707c70912778fd7c" + integrity sha512-kibJgmEdX2iMwsHY2tSZNDgj8PwIlCQz7FK9KuGKO8zsuoUwSEhoNnNVp/emKWrbY4HeO6kkXfdMqRKKKXBm2A== dependencies: - "@babel/helper-create-class-features-plugin" "^7.28.6" - "@babel/helper-plugin-utils" "^7.28.6" + "@babel/helper-create-class-features-plugin" "^7.29.7" + "@babel/helper-plugin-utils" "^7.29.7" -"@babel/plugin-transform-classes@^7.28.6": - version "7.28.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.28.6.tgz#8f6fb79ba3703978e701ce2a97e373aae7dda4b7" - integrity sha512-EF5KONAqC5zAqT783iMGuM2ZtmEBy+mJMOKl2BCvPZ2lVrwvXnB6o+OBWCS+CoeCCpVRF2sA2RBKUxvT8tQT5Q== +"@babel/plugin-transform-classes@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.29.7.tgz#61d3e5aaae0c838acc3204d9db7c8dc05c25815b" + integrity sha512-qV0OGGBVacduzQHE649JyCneOFI/maT+YKsO+K4Yi3xv2wTPNjM/W2o2gdzMwEAZz7fXNTHAe0NcSg30bIN69g== dependencies: - "@babel/helper-annotate-as-pure" "^7.27.3" - "@babel/helper-compilation-targets" "^7.28.6" - "@babel/helper-globals" "^7.28.0" - "@babel/helper-plugin-utils" "^7.28.6" - "@babel/helper-replace-supers" "^7.28.6" - "@babel/traverse" "^7.28.6" + "@babel/helper-annotate-as-pure" "^7.29.7" + "@babel/helper-compilation-targets" "^7.29.7" + "@babel/helper-globals" "^7.29.7" + "@babel/helper-plugin-utils" "^7.29.7" + "@babel/helper-replace-supers" "^7.29.7" + "@babel/traverse" "^7.29.7" -"@babel/plugin-transform-computed-properties@^7.28.6": - version "7.28.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.28.6.tgz#936824fc71c26cb5c433485776d79c8e7b0202d2" - integrity sha512-bcc3k0ijhHbc2lEfpFHgx7eYw9KNXqOerKWfzbxEHUGKnS3sz9C4CNL9OiFN1297bDNfUiSO7DaLzbvHQQQ1BQ== +"@babel/plugin-transform-computed-properties@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.29.7.tgz#95028787ca31901b9a20b5c6d9605c32346f55ad" + integrity sha512-RK7/IyU5phpuCdBAuig5VkzG/EnbDaui5SQGdU9BFrHdV+mV4cUjLMQ9lJDjLNtWHsqtiefpGZUXQP2BiTYMsA== dependencies: - "@babel/helper-plugin-utils" "^7.28.6" - "@babel/template" "^7.28.6" + "@babel/helper-plugin-utils" "^7.29.7" + "@babel/template" "^7.29.7" -"@babel/plugin-transform-destructuring@^7.28.5": - version "7.28.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.28.5.tgz#b8402764df96179a2070bb7b501a1586cf8ad7a7" - integrity sha512-Kl9Bc6D0zTUcFUvkNuQh4eGXPKKNDOJQXVyyM4ZAQPMveniJdxi8XMJwLo+xSoW3MIq81bD33lcUe9kZpl0MCw== +"@babel/plugin-transform-destructuring@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.29.7.tgz#5781ec6947852e27b64c1165f0db431f408090e4" + integrity sha512-iPX8aD6H9zV5s7ZsqTdNocPN/MGQ5sSMnElKrktxjJRMnB2jN/1p2+R7GkfD6CAYoVFqy5A4XnSIUeGgJzIWpg== dependencies: - "@babel/helper-plugin-utils" "^7.27.1" - "@babel/traverse" "^7.28.5" + "@babel/helper-plugin-utils" "^7.29.7" + "@babel/traverse" "^7.29.7" -"@babel/plugin-transform-dotall-regex@^7.28.6": - version "7.28.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.28.6.tgz#def31ed84e0fb6e25c71e53c124e7b76a4ab8e61" - integrity sha512-SljjowuNKB7q5Oayv4FoPzeB74g3QgLt8IVJw9ADvWy3QnUb/01aw8I4AVv8wYnPvQz2GDDZ/g3GhcNyDBI4Bg== +"@babel/plugin-transform-dotall-regex@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.29.7.tgz#b203de9740e4c7ff6b55ce436ed5313b88d70af8" + integrity sha512-3qc18hsD2RdZiyJNDNc7HQpv6xbncwh8FYtxNFFzclSyh/trPD9KkVR9BDECUjDLvb7yJVF15GfYUuC+LMkkiQ== dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.28.5" - "@babel/helper-plugin-utils" "^7.28.6" + "@babel/helper-create-regexp-features-plugin" "^7.29.7" + "@babel/helper-plugin-utils" "^7.29.7" -"@babel/plugin-transform-duplicate-keys@^7.27.1": - version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.27.1.tgz#f1fbf628ece18e12e7b32b175940e68358f546d1" - integrity sha512-MTyJk98sHvSs+cvZ4nOauwTTG1JeonDjSGvGGUNHreGQns+Mpt6WX/dVzWBHgg+dYZhkC4X+zTDfkTU+Vy9y7Q== +"@babel/plugin-transform-duplicate-keys@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.29.7.tgz#8f3fe721835cb7a433420841dae90afc962ea7ae" + integrity sha512-6IvRRriEMqnBwD6chtxdLpMYCHWEzN+oL5cyQtjykya19UgzbmKhxmhZgKC/LHxS2nYr9Q/qYPZ5Lr6jOL9+yQ== dependencies: - "@babel/helper-plugin-utils" "^7.27.1" + "@babel/helper-plugin-utils" "^7.29.7" -"@babel/plugin-transform-duplicate-named-capturing-groups-regex@^7.29.0": - version "7.29.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-named-capturing-groups-regex/-/plugin-transform-duplicate-named-capturing-groups-regex-7.29.0.tgz#8014b8a6cfd0e7b92762724443bf0d2400f26df1" - integrity sha512-zBPcW2lFGxdiD8PUnPwJjag2J9otbcLQzvbiOzDxpYXyCuYX9agOwMPGn1prVH0a4qzhCKu24rlH4c1f7yA8rw== +"@babel/plugin-transform-duplicate-named-capturing-groups-regex@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-named-capturing-groups-regex/-/plugin-transform-duplicate-named-capturing-groups-regex-7.29.7.tgz#dc6c405e55c01b7657e1827a25332c4ac17e9cac" + integrity sha512-2wiIyo2BjtgU7HufSeDnL9L2O7zr8jmhFKuSr65VpRkUiRKRNpb0mdlk56+XPPKoIrfHqzbMuglDvZun0RISsA== dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.28.5" - "@babel/helper-plugin-utils" "^7.28.6" + "@babel/helper-create-regexp-features-plugin" "^7.29.7" + "@babel/helper-plugin-utils" "^7.29.7" -"@babel/plugin-transform-dynamic-import@^7.27.1": - version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.27.1.tgz#4c78f35552ac0e06aa1f6e3c573d67695e8af5a4" - integrity sha512-MHzkWQcEmjzzVW9j2q8LGjwGWpG2mjwaaB0BNQwst3FIjqsg8Ct/mIZlvSPJvfi9y2AC8mi/ktxbFVL9pZ1I4A== +"@babel/plugin-transform-dynamic-import@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.29.7.tgz#a83a6faec5bab5b619adf9d0eac6c1c270123c2a" + integrity sha512-giOlEm/EFjfjr+te9NsdjkUo2v4f8rS/SXPumRVHAtbNcyNlvtREkU1dZzaIDclNpnaVhlCqRdFKhJBjBikzLg== dependencies: - "@babel/helper-plugin-utils" "^7.27.1" + "@babel/helper-plugin-utils" "^7.29.7" -"@babel/plugin-transform-explicit-resource-management@^7.28.6": - version "7.28.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-explicit-resource-management/-/plugin-transform-explicit-resource-management-7.28.6.tgz#dd6788f982c8b77e86779d1d029591e39d9d8be7" - integrity sha512-Iao5Konzx2b6g7EPqTy40UZbcdXE126tTxVFr/nAIj+WItNxjKSYTEw3RC+A2/ZetmdJsgueL1KhaMCQHkLPIg== +"@babel/plugin-transform-explicit-resource-management@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-explicit-resource-management/-/plugin-transform-explicit-resource-management-7.29.7.tgz#65c8b9f76ec915b02a0e1df703125a0fca58abaa" + integrity sha512-Rstj7coNz8sE+7Ju7ihpHLI564lsK5pUpNNlvptCIC/16E/S5hbl6n3kESPKdNRmqEWlpn5xpS5Q2dvXBsySLw== dependencies: - "@babel/helper-plugin-utils" "^7.28.6" - "@babel/plugin-transform-destructuring" "^7.28.5" + "@babel/helper-plugin-utils" "^7.29.7" + "@babel/plugin-transform-destructuring" "^7.29.7" -"@babel/plugin-transform-exponentiation-operator@^7.28.6": - version "7.28.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.28.6.tgz#5e477eb7eafaf2ab5537a04aaafcf37e2d7f1091" - integrity sha512-WitabqiGjV/vJ0aPOLSFfNY1u9U3R7W36B03r5I2KoNix+a3sOhJ3pKFB3R5It9/UiK78NiO0KE9P21cMhlPkw== +"@babel/plugin-transform-exponentiation-operator@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.29.7.tgz#00bf002fde8794356171f5d4df200f6bc0d5a303" + integrity sha512-zFpMOTLZBdW5LfObqcSbL6kefg4R4eLdmvS0wbN9M6D5Mym/sKm9toOoWyVOa+xDjvCnuWcHls2YonXwHvH3CQ== dependencies: - "@babel/helper-plugin-utils" "^7.28.6" + "@babel/helper-plugin-utils" "^7.29.7" -"@babel/plugin-transform-export-namespace-from@^7.27.1": - version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.27.1.tgz#71ca69d3471edd6daa711cf4dfc3400415df9c23" - integrity sha512-tQvHWSZ3/jH2xuq/vZDy0jNn+ZdXJeM8gHvX4lnJmsc3+50yPlWdZXIc5ay+umX+2/tJIqHqiEqcJvxlmIvRvQ== +"@babel/plugin-transform-export-namespace-from@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.29.7.tgz#d6014f45cec61d7691335c6c9804204bee801d51" + integrity sha512-24B2nOy2TeJSMheqwPD4DDQOV/elLSIlKxjZt4i05H5AgdPdWR3n18HnNrcJ+j76WJd9gbwb9jPjNYUy6RautA== dependencies: - "@babel/helper-plugin-utils" "^7.27.1" + "@babel/helper-plugin-utils" "^7.29.7" -"@babel/plugin-transform-for-of@^7.27.1": - version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.27.1.tgz#bc24f7080e9ff721b63a70ac7b2564ca15b6c40a" - integrity sha512-BfbWFFEJFQzLCQ5N8VocnCtA8J1CLkNTe2Ms2wocj75dd6VpiqS5Z5quTYcUoo4Yq+DN0rtikODccuv7RU81sw== +"@babel/plugin-transform-for-of@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.29.7.tgz#c65a678592117717aacdb10c1b73a9cb85e830be" + integrity sha512-zeSIHh0+E1Um1WJRXCFlHQYu2ieJNdivLLjlBEp+dIBu3S51n+SZZmIXjxnItw6pz56Cn+KvK68BIBVsxq2JiQ== dependencies: - "@babel/helper-plugin-utils" "^7.27.1" - "@babel/helper-skip-transparent-expression-wrappers" "^7.27.1" + "@babel/helper-plugin-utils" "^7.29.7" + "@babel/helper-skip-transparent-expression-wrappers" "^7.29.7" -"@babel/plugin-transform-function-name@^7.27.1": - version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.27.1.tgz#4d0bf307720e4dce6d7c30fcb1fd6ca77bdeb3a7" - integrity sha512-1bQeydJF9Nr1eBCMMbC+hdwmRlsv5XYOMu03YSWFwNs0HsAmtSxxF1fyuYPqemVldVyFmlCU7w8UE14LupUSZQ== +"@babel/plugin-transform-function-name@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.29.7.tgz#8b87f8a7504dbcd96135167e3fc4f61126a7bd86" + integrity sha512-otRWaHXE6fbAGkePvaj/kvs3HsqXfPhlnzwSOlnFgbqCPMd975dW+4wZ00WFBt+/YlBGcJwNrARQTOJOb4ZrIg== dependencies: - "@babel/helper-compilation-targets" "^7.27.1" - "@babel/helper-plugin-utils" "^7.27.1" - "@babel/traverse" "^7.27.1" + "@babel/helper-compilation-targets" "^7.29.7" + "@babel/helper-plugin-utils" "^7.29.7" + "@babel/traverse" "^7.29.7" -"@babel/plugin-transform-json-strings@^7.28.6": - version "7.28.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.28.6.tgz#4c8c15b2dc49e285d110a4cf3dac52fd2dfc3038" - integrity sha512-Nr+hEN+0geQkzhbdgQVPoqr47lZbm+5fCUmO70722xJZd0Mvb59+33QLImGj6F+DkK3xgDi1YVysP8whD6FQAw== +"@babel/plugin-transform-json-strings@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.29.7.tgz#f57d63dcc05b4481c281acedcd8fc4e3e439a1d4" + integrity sha512-RRnE2+eon1rJAq8MnoF1b5kTpY1vU88twHcvcKMrsqP/jxIRqDVs9iJB5fqPuqyeFAW0wJo4MlUIPpQCq/aRsg== dependencies: - "@babel/helper-plugin-utils" "^7.28.6" + "@babel/helper-plugin-utils" "^7.29.7" -"@babel/plugin-transform-literals@^7.27.1": - version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.27.1.tgz#baaefa4d10a1d4206f9dcdda50d7d5827bb70b24" - integrity sha512-0HCFSepIpLTkLcsi86GG3mTUzxV5jpmbv97hTETW3yzrAij8aqlD36toB1D0daVFJM8NK6GvKO0gslVQmm+zZA== +"@babel/plugin-transform-literals@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.29.7.tgz#b90bd47463326c2a9d779e1bd5e1f88b9f421921" + integrity sha512-DZ/oLP21ZuWx1vKqnoNv6/tvEK48AQOBRai40CX9dTjGluvT/YZCyY3rryDtyUqCEoyNroy5KKPwX2iQCiRvyw== dependencies: - "@babel/helper-plugin-utils" "^7.27.1" + "@babel/helper-plugin-utils" "^7.29.7" -"@babel/plugin-transform-logical-assignment-operators@^7.28.6": - version "7.28.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.28.6.tgz#53028a3d77e33c50ef30a8fce5ca17065936e605" - integrity sha512-+anKKair6gpi8VsM/95kmomGNMD0eLz1NQ8+Pfw5sAwWH9fGYXT50E55ZpV0pHUHWf6IUTWPM+f/7AAff+wr9A== +"@babel/plugin-transform-logical-assignment-operators@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.29.7.tgz#9b29425adf5c794967aabe4b046a046a167bac2f" + integrity sha512-A0H91hh6W8MFRkp5TqJmMr39jzGD1A1E1Ysiv2O06Sfbhkapm+XyIzxWCEh5kqwOZ1/8QZ0dY3SeQ7XBqfJd5Q== dependencies: - "@babel/helper-plugin-utils" "^7.28.6" + "@babel/helper-plugin-utils" "^7.29.7" -"@babel/plugin-transform-member-expression-literals@^7.27.1": - version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.27.1.tgz#37b88ba594d852418e99536f5612f795f23aeaf9" - integrity sha512-hqoBX4dcZ1I33jCSWcXrP+1Ku7kdqXf1oeah7ooKOIiAdKQ+uqftgCFNOSzA5AMS2XIHEYeGFg4cKRCdpxzVOQ== +"@babel/plugin-transform-member-expression-literals@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.29.7.tgz#1281689fa2fefc17b110d21ebafd0fe9402d5309" + integrity sha512-hl1kwFZCCiDyfH25Xmco9jTrkPgnS9pmOzSG7W5I4SaGbLeqKv417hcU2RKmaxoPEgsoJh7ZPOrnPGq99bHoUg== dependencies: - "@babel/helper-plugin-utils" "^7.27.1" + "@babel/helper-plugin-utils" "^7.29.7" -"@babel/plugin-transform-modules-amd@^7.27.1": - version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.27.1.tgz#a4145f9d87c2291fe2d05f994b65dba4e3e7196f" - integrity sha512-iCsytMg/N9/oFq6n+gFTvUYDZQOMK5kEdeYxmxt91fcJGycfxVP9CnrxoliM0oumFERba2i8ZtwRUCMhvP1LnA== +"@babel/plugin-transform-modules-amd@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.29.7.tgz#f05ca662c8a1dc4be2f337af9c7e80369c942d6c" + integrity sha512-fxtQoH3m5ywUSIfaH0FGCzWu4McsYon5bD3K4XnskC7f+OyQMj7rsOMi4NvvmJ83WwBAg4UCe+ov4VZlqEvyew== dependencies: - "@babel/helper-module-transforms" "^7.27.1" - "@babel/helper-plugin-utils" "^7.27.1" + "@babel/helper-module-transforms" "^7.29.7" + "@babel/helper-plugin-utils" "^7.29.7" -"@babel/plugin-transform-modules-commonjs@^7.27.1", "@babel/plugin-transform-modules-commonjs@^7.28.6": - version "7.28.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.28.6.tgz#c0232e0dfe66a734cc4ad0d5e75fc3321b6fdef1" - integrity sha512-jppVbf8IV9iWWwWTQIxJMAJCWBuuKx71475wHwYytrRGQ2CWiDvYlADQno3tcYpS/T2UUWFQp3nVtYfK/YBQrA== +"@babel/plugin-transform-modules-commonjs@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.29.7.tgz#70e6835abf2663dafbe94b8ef1f51de7351ef135" + integrity sha512-j0vCldybPC5b5dwCQOJ21uKtHzt7hxLygJTg9eF1ScfaikEDNfzn94XoW5Fi+seBR0nCyL23xaBFFkq7dTM8XQ== dependencies: - "@babel/helper-module-transforms" "^7.28.6" - "@babel/helper-plugin-utils" "^7.28.6" + "@babel/helper-module-transforms" "^7.29.7" + "@babel/helper-plugin-utils" "^7.29.7" -"@babel/plugin-transform-modules-systemjs@^7.29.4": - version "7.29.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.29.4.tgz#f621105da99919c15cf4bde6fcc7346ef95e7b20" - integrity sha512-N7QmZ0xRZfjHOfZeQLJjwgX2zS9pdGHSVl/cjSGlo4dXMqvurfxXDMKY4RqEKzPozV78VMcd0lxyG13mlbKc4w== +"@babel/plugin-transform-modules-systemjs@^7.29.7": + version "7.29.8" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.29.8.tgz#e60a6a42ac63a3095f9cc7264f698a100c8fe05d" + integrity sha512-6iSnEK0zlkLKU4heofK/AdmRD4e2SHVpJMtrwnTCzhnaM98ria4rTrOXBBi45BTTYnJtO8txnPsX4fChYXkmeA== dependencies: - "@babel/helper-module-transforms" "^7.28.6" - "@babel/helper-plugin-utils" "^7.28.6" - "@babel/helper-validator-identifier" "^7.28.5" - "@babel/traverse" "^7.29.0" + "@babel/helper-module-transforms" "^7.29.7" + "@babel/helper-plugin-utils" "^7.29.7" + "@babel/helper-validator-identifier" "^7.29.7" + "@babel/traverse" "^7.29.8" -"@babel/plugin-transform-modules-umd@^7.27.1": - version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.27.1.tgz#63f2cf4f6dc15debc12f694e44714863d34cd334" - integrity sha512-iQBE/xC5BV1OxJbp6WG7jq9IWiD+xxlZhLrdwpPkTX3ydmXdvoCpyfJN7acaIBZaOqTfr76pgzqBJflNbeRK+w== +"@babel/plugin-transform-modules-umd@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.29.7.tgz#391d1c0215aca6307257f2f608598dfe55feb6cf" + integrity sha512-B4UkaTK3QpgCwJnrxKfMPKdo92CN7OKXAlpAAnM3UPu0Q0lCCk57ylA9AJbRy2v8dDKOPAAWcoR6CMyeoHwRCA== dependencies: - "@babel/helper-module-transforms" "^7.27.1" - "@babel/helper-plugin-utils" "^7.27.1" + "@babel/helper-module-transforms" "^7.29.7" + "@babel/helper-plugin-utils" "^7.29.7" -"@babel/plugin-transform-named-capturing-groups-regex@^7.29.0": - version "7.29.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.29.0.tgz#a26cd51e09c4718588fc4cce1c5d1c0152102d6a" - integrity sha512-1CZQA5KNAD6ZYQLPw7oi5ewtDNxH/2vuCh+6SmvgDfhumForvs8a1o9n0UrEoBD8HU4djO2yWngTQlXl1NDVEQ== +"@babel/plugin-transform-named-capturing-groups-regex@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.29.7.tgz#21e75d847b31189842fa7a77703722ed4b43d27d" + integrity sha512-vuFoLwr4qnv2xbZ16SQd6uPcH5FNrLHhk/Jzo++0XJFcaDsr4gjJVg6j398oMHiC+83k/GiBzviwF5KBJkPUtQ== dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.28.5" - "@babel/helper-plugin-utils" "^7.28.6" + "@babel/helper-create-regexp-features-plugin" "^7.29.7" + "@babel/helper-plugin-utils" "^7.29.7" -"@babel/plugin-transform-new-target@^7.27.1": - version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.27.1.tgz#259c43939728cad1706ac17351b7e6a7bea1abeb" - integrity sha512-f6PiYeqXQ05lYq3TIfIDu/MtliKUbNwkGApPUvyo6+tc7uaR4cPjPe7DFPr15Uyycg2lZU6btZ575CuQoYh7MQ== +"@babel/plugin-transform-new-target@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.29.7.tgz#714147ce7947e1b49cbd84137ca2e75e92b2a067" + integrity sha512-fEo41GmsOUhOBlw8ioo6zvjX5Xc2Lqkzlyfqbpsk3eB6TReV18uhxZ0esfEokVbY2+PVJAQHNKxER6lGrzNd3A== dependencies: - "@babel/helper-plugin-utils" "^7.27.1" + "@babel/helper-plugin-utils" "^7.29.7" -"@babel/plugin-transform-nullish-coalescing-operator@^7.28.6": - version "7.28.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.28.6.tgz#9bc62096e90ab7a887f3ca9c469f6adec5679757" - integrity sha512-3wKbRgmzYbw24mDJXT7N+ADXw8BC/imU9yo9c9X9NKaLF1fW+e5H1U5QjMUBe4Qo4Ox/o++IyUkl1sVCLgevKg== +"@babel/plugin-transform-nullish-coalescing-operator@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.29.7.tgz#8a54cdf88c3f50433a6173117a286195b67714cc" + integrity sha512-idmp1dFaekP9GbcMvG24Kvw2BfhFZjHnNJCkV4WuIY4PskJzwI3f1N5OdgYke38T7rftO6ERulFRn2cFeZwRkg== dependencies: - "@babel/helper-plugin-utils" "^7.28.6" + "@babel/helper-plugin-utils" "^7.29.7" -"@babel/plugin-transform-numeric-separator@^7.28.6": - version "7.28.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.28.6.tgz#1310b0292762e7a4a335df5f580c3320ee7d9e9f" - integrity sha512-SJR8hPynj8outz+SlStQSwvziMN4+Bq99it4tMIf5/Caq+3iOc0JtKyse8puvyXkk3eFRIA5ID/XfunGgO5i6w== +"@babel/plugin-transform-numeric-separator@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.29.7.tgz#0266d5cd42ab87ec40fee45a4e36483cfdcbc66a" + integrity sha512-zR7fv/z14OjgHl4AgRtkDBvBMhIzCxqV/qN/2BCRC7LjFwvuzjYe7gDWxC4Wl/SNsLM6SE1IWvRPYMgSJaUvNw== dependencies: - "@babel/helper-plugin-utils" "^7.28.6" + "@babel/helper-plugin-utils" "^7.29.7" -"@babel/plugin-transform-object-rest-spread@^7.28.6": - version "7.28.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.28.6.tgz#fdd4bc2d72480db6ca42aed5c051f148d7b067f7" - integrity sha512-5rh+JR4JBC4pGkXLAcYdLHZjXudVxWMXbB6u6+E9lRL5TrGVbHt1TjxGbZ8CkmYw9zjkB7jutzOROArsqtncEA== +"@babel/plugin-transform-object-rest-spread@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.29.7.tgz#e0d5060241803922c545676613cc8acbbda0d266" + integrity sha512-Ld98jn4c0smUywL57m7SgsHq3OpThOa6LqZJif3G6jYOovPleoFhVrBJ1WegRApSFB2wu4+RelAj9AC9G08Z4A== dependencies: - "@babel/helper-compilation-targets" "^7.28.6" - "@babel/helper-plugin-utils" "^7.28.6" - "@babel/plugin-transform-destructuring" "^7.28.5" - "@babel/plugin-transform-parameters" "^7.27.7" - "@babel/traverse" "^7.28.6" + "@babel/helper-compilation-targets" "^7.29.7" + "@babel/helper-plugin-utils" "^7.29.7" + "@babel/plugin-transform-destructuring" "^7.29.7" + "@babel/plugin-transform-parameters" "^7.29.7" + "@babel/traverse" "^7.29.7" -"@babel/plugin-transform-object-super@^7.27.1": - version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.27.1.tgz#1c932cd27bf3874c43a5cac4f43ebf970c9871b5" - integrity sha512-SFy8S9plRPbIcxlJ8A6mT/CxFdJx/c04JEctz4jf8YZaVS2px34j7NXRrlGlHkN/M2gnpL37ZpGRGVFLd3l8Ng== +"@babel/plugin-transform-object-super@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.29.7.tgz#e89283d14fa3c35817d4493ffc6bc649aa10e4eb" + integrity sha512-Ea/diGcw0twB5IlZPO5sgET6fJsLJqPABqTuFWIR+iMPGPZJkATEIWx0wa+aEQ5UY1CBQyP/gkAiLEqn1vBiQA== dependencies: - "@babel/helper-plugin-utils" "^7.27.1" - "@babel/helper-replace-supers" "^7.27.1" + "@babel/helper-plugin-utils" "^7.29.7" + "@babel/helper-replace-supers" "^7.29.7" -"@babel/plugin-transform-optional-catch-binding@^7.28.6": - version "7.28.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.28.6.tgz#75107be14c78385978201a49c86414a150a20b4c" - integrity sha512-R8ja/Pyrv0OGAvAXQhSTmWyPJPml+0TMqXlO5w+AsMEiwb2fg3WkOvob7UxFSL3OIttFSGSRFKQsOhJ/X6HQdQ== +"@babel/plugin-transform-optional-catch-binding@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.29.7.tgz#729664f79985be504eba112c51de9f71d009030b" + integrity sha512-sLsyndxK2VwX6yNUOakMb7Sh553ZTe/vVM1XJ+9Z5aW1ytsc8xOIwmyk05NNjN60vkc5/KqoTH6hB4V41LJhng== dependencies: - "@babel/helper-plugin-utils" "^7.28.6" + "@babel/helper-plugin-utils" "^7.29.7" -"@babel/plugin-transform-optional-chaining@^7.27.1", "@babel/plugin-transform-optional-chaining@^7.28.6": - version "7.28.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.28.6.tgz#926cf150bd421fc8362753e911b4a1b1ce4356cd" - integrity sha512-A4zobikRGJTsX9uqVFdafzGkqD30t26ck2LmOzAuLL8b2x6k3TIqRiT2xVvA9fNmFeTX484VpsdgmKNA0bS23w== +"@babel/plugin-transform-optional-chaining@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.29.7.tgz#b84a1b574b3c73001023092567e16c492b720e51" + integrity sha512-6GM1dhvK3gNODkXcEcMCOLEDCLSoZ/sBbro2Ax8HURyasQ4NshagQixkRFdh5niI6E4gmA/jYI/4aT7rRos3ZQ== dependencies: - "@babel/helper-plugin-utils" "^7.28.6" - "@babel/helper-skip-transparent-expression-wrappers" "^7.27.1" + "@babel/helper-plugin-utils" "^7.29.7" + "@babel/helper-skip-transparent-expression-wrappers" "^7.29.7" -"@babel/plugin-transform-parameters@^7.27.7": - version "7.27.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.27.7.tgz#1fd2febb7c74e7d21cf3b05f7aebc907940af53a" - integrity sha512-qBkYTYCb76RRxUM6CcZA5KRu8K4SM8ajzVeUgVdMVO9NN9uI/GaVmBg/WKJJGnNokV9SY8FxNOVWGXzqzUidBg== +"@babel/plugin-transform-parameters@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.29.7.tgz#a5ddc3b9bfb534814cb8334cbeba47d9cf9db090" + integrity sha512-ZDOBqV/qLYJI0YElr8DcENEyARsFQeESqWXH6gZlghYXuPPjvweuDhP4VyEi4BlUBlLRFZVjxoZDMjxhLW766g== dependencies: - "@babel/helper-plugin-utils" "^7.27.1" + "@babel/helper-plugin-utils" "^7.29.7" -"@babel/plugin-transform-private-methods@^7.28.6": - version "7.28.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.28.6.tgz#c76fbfef3b86c775db7f7c106fff544610bdb411" - integrity sha512-piiuapX9CRv7+0st8lmuUlRSmX6mBcVeNQ1b4AYzJxfCMuBfB0vBXDiGSmm03pKJw1v6cZ8KSeM+oUnM6yAExg== +"@babel/plugin-transform-private-methods@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.29.7.tgz#cea8bd3ab99533892897a02999d5b752584ad145" + integrity sha512-/6Rz4DK1ETDEM/bWHsPHcaEe7ZaT1EqSXjtSP/L0DijOYuaUhiRiOKcwpZ8P7zR4xXEHc2ITdiCgBm9Tpyv9ug== dependencies: - "@babel/helper-create-class-features-plugin" "^7.28.6" - "@babel/helper-plugin-utils" "^7.28.6" + "@babel/helper-create-class-features-plugin" "^7.29.7" + "@babel/helper-plugin-utils" "^7.29.7" -"@babel/plugin-transform-private-property-in-object@^7.28.6": - version "7.28.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.28.6.tgz#4fafef1e13129d79f1d75ac180c52aafefdb2811" - integrity sha512-b97jvNSOb5+ehyQmBpmhOCiUC5oVK4PMnpRvO7+ymFBoqYjeDHIU9jnrNUuwHOiL9RpGDoKBpSViarV+BU+eVA== +"@babel/plugin-transform-private-property-in-object@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.29.7.tgz#4a2f6be5aba47be7afbdb4cd7903c46edf3a7661" + integrity sha512-+BNo06dnrzdNNqCm1X6YUaVv0DKk8Q+JYcoZfOkLhYWNCXzlwTSRq8zGWayT1csjcpNXV9CQTBRRbmTLZac5cA== dependencies: - "@babel/helper-annotate-as-pure" "^7.27.3" - "@babel/helper-create-class-features-plugin" "^7.28.6" - "@babel/helper-plugin-utils" "^7.28.6" + "@babel/helper-annotate-as-pure" "^7.29.7" + "@babel/helper-create-class-features-plugin" "^7.29.7" + "@babel/helper-plugin-utils" "^7.29.7" -"@babel/plugin-transform-property-literals@^7.27.1": - version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.27.1.tgz#07eafd618800591e88073a0af1b940d9a42c6424" - integrity sha512-oThy3BCuCha8kDZ8ZkgOg2exvPYUlprMukKQXI1r1pJ47NCvxfkEy8vK+r/hT9nF0Aa4H1WUPZZjHTFtAhGfmQ== +"@babel/plugin-transform-property-literals@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.29.7.tgz#d45817cd72f9e134ab1f7fbb79264cfcb85cf636" + integrity sha512-bOMRLQuI0A5ZqHq3OWJ89/rXpJ/NJrbVhXiP4zwPGMs6kpcVsuTUNjwoE30K0Qm3mf48a/TnRYYD6vPNqcg6jA== dependencies: - "@babel/helper-plugin-utils" "^7.27.1" + "@babel/helper-plugin-utils" "^7.29.7" "@babel/plugin-transform-react-constant-elements@^7.21.3": - version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.27.1.tgz#6c6b50424e749a6e48afd14cf7b92f98cb9383f9" - integrity sha512-edoidOjl/ZxvYo4lSBOQGDSyToYVkTAwyVoa2tkuYTSmjrB1+uAedoL5iROVLXkxH+vRgA7uP4tMg2pUJpZ3Ug== + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.29.7.tgz#8264440ea2ffc5ec405aebd7eac074815d6e28b1" + integrity sha512-J0wGhKan+rIiE2OhfhRptySLrJ6SjQYM6b6N1FMlhyhCcw1Mig8vQjWchyB+bgHGDvaWo6Diu6CLRMra2uMtmg== dependencies: - "@babel/helper-plugin-utils" "^7.27.1" + "@babel/helper-plugin-utils" "^7.29.7" -"@babel/plugin-transform-react-display-name@^7.28.0": - version "7.28.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.28.0.tgz#6f20a7295fea7df42eb42fed8f896813f5b934de" - integrity sha512-D6Eujc2zMxKjfa4Zxl4GHMsmhKKZ9VpcqIchJLvwTxad9zWIYulwYItBovpDOoNLISpcZSXoDJ5gaGbQUDqViA== +"@babel/plugin-transform-react-display-name@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.29.7.tgz#bf161a6d750267b79db7ff6f8fb89c3369b02df3" + integrity sha512-+1wdDMGNb4UPeY3Q4L5yLiYe6TXPXubs4NjrgRFw13hPRLJfEMw2Q5OXkee6/IfdqePIeW4Jjwe3aBh7SdKz4Q== dependencies: - "@babel/helper-plugin-utils" "^7.27.1" + "@babel/helper-plugin-utils" "^7.29.7" -"@babel/plugin-transform-react-jsx-development@^7.27.1": - version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.27.1.tgz#47ff95940e20a3a70e68ad3d4fcb657b647f6c98" - integrity sha512-ykDdF5yI4f1WrAolLqeF3hmYU12j9ntLQl/AOG1HAS21jxyg1Q0/J/tpREuYLfatGdGmXp/3yS0ZA76kOlVq9Q== +"@babel/plugin-transform-react-jsx-development@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.29.7.tgz#64e6aacb5cb43b9e80d3d5f19ddefc158a624f09" + integrity sha512-Xfy3UVMF04+ypnFbkhvfqtmvwfe92qwQdbGZVonhE+6v35GzlofmOnA1szaZqzb9xYWr0nl1e5EMmzi0DNON1g== dependencies: - "@babel/plugin-transform-react-jsx" "^7.27.1" + "@babel/plugin-transform-react-jsx" "^7.29.7" -"@babel/plugin-transform-react-jsx@^7.27.1": - version "7.28.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.28.6.tgz#f51cb70a90b9529fbb71ee1f75ea27b7078eed62" - integrity sha512-61bxqhiRfAACulXSLd/GxqmAedUSrRZIu/cbaT18T1CetkTmtDN15it7i80ru4DVqRK1WMxQhXs+Lf9kajm5Ow== +"@babel/plugin-transform-react-jsx@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.29.7.tgz#3d16a0e5773f079400a8c82a190709cdf92ee204" + integrity sha512-WsZulLVBUHXVj2cUcPVx6UE21TpalB6bHbSFErKT0Ib++ax24jjXe73FqlWvdylFOjiuPHYi6VCcgRad1ItN+A== dependencies: - "@babel/helper-annotate-as-pure" "^7.27.3" - "@babel/helper-module-imports" "^7.28.6" - "@babel/helper-plugin-utils" "^7.28.6" - "@babel/plugin-syntax-jsx" "^7.28.6" - "@babel/types" "^7.28.6" + "@babel/helper-annotate-as-pure" "^7.29.7" + "@babel/helper-module-imports" "^7.29.7" + "@babel/helper-plugin-utils" "^7.29.7" + "@babel/plugin-syntax-jsx" "^7.29.7" + "@babel/types" "^7.29.7" -"@babel/plugin-transform-react-pure-annotations@^7.27.1": - version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.27.1.tgz#339f1ce355eae242e0649f232b1c68907c02e879" - integrity sha512-JfuinvDOsD9FVMTHpzA/pBLisxpv1aSf+OIV8lgH3MuWrks19R27e6a6DipIg4aX1Zm9Wpb04p8wljfKrVSnPA== +"@babel/plugin-transform-react-pure-annotations@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.29.7.tgz#76445c90112dd0a7371b63264563bfa9a4fcd6e3" + integrity sha512-H5E+HBgDpr6Q5t+Aj11tL7XkIui1jhbIoArVQnqjgXo5/3YxkN7ZEBcWF4RQlB0T4rrxJQbXS6kiFV6B7XTqUA== dependencies: - "@babel/helper-annotate-as-pure" "^7.27.1" - "@babel/helper-plugin-utils" "^7.27.1" + "@babel/helper-annotate-as-pure" "^7.29.7" + "@babel/helper-plugin-utils" "^7.29.7" -"@babel/plugin-transform-regenerator@^7.29.0": - version "7.29.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.29.0.tgz#dec237cec1b93330876d6da9992c4abd42c9d18b" - integrity sha512-FijqlqMA7DmRdg/aINBSs04y8XNTYw/lr1gJ2WsmBnnaNw1iS43EPkJW+zK7z65auG3AWRFXWj+NcTQwYptUog== +"@babel/plugin-transform-regenerator@^7.29.7": + version "7.29.8" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.29.8.tgz#3a4a4dd7214af9d524f0503bb97c99af5f4abf26" + integrity sha512-0UpIXPtdDtMXfnV2OJAVMLpj3H/92vmkA6lpSRakmycJvj3VUy6Xs1dM8tXRugupykr5WB+LpiVl0J8LMVg2mg== dependencies: - "@babel/helper-plugin-utils" "^7.28.6" + "@babel/helper-plugin-utils" "^7.29.7" -"@babel/plugin-transform-regexp-modifiers@^7.28.6": - version "7.28.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regexp-modifiers/-/plugin-transform-regexp-modifiers-7.28.6.tgz#7ef0163bd8b4a610481b2509c58cf217f065290b" - integrity sha512-QGWAepm9qxpaIs7UM9FvUSnCGlb8Ua1RhyM4/veAxLwt3gMat/LSGrZixyuj4I6+Kn9iwvqCyPTtbdxanYoWYg== +"@babel/plugin-transform-regexp-modifiers@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regexp-modifiers/-/plugin-transform-regexp-modifiers-7.29.7.tgz#68311c0c10af2198212528863f8542843e424025" + integrity sha512-mB5Fs0VWrJ42ZCmc8114v60qetdaUVNkj9PmSZRmanCZM3S9hm0CFRLjRmYIsuXav14l2jvZ+4T8iiCGnhj3nQ== dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.28.5" - "@babel/helper-plugin-utils" "^7.28.6" + "@babel/helper-create-regexp-features-plugin" "^7.29.7" + "@babel/helper-plugin-utils" "^7.29.7" -"@babel/plugin-transform-reserved-words@^7.27.1": - version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.27.1.tgz#40fba4878ccbd1c56605a4479a3a891ac0274bb4" - integrity sha512-V2ABPHIJX4kC7HegLkYoDpfg9PVmuWy/i6vUM5eGK22bx4YVFD3M5F0QQnWQoDs6AGsUWTVOopBiMFQgHaSkVw== +"@babel/plugin-transform-reserved-words@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.29.7.tgz#a6feeb179b36a5f1fc6e3154c1eb727bdbe35876" + integrity sha512-5+YhdpVgmfSmwZyLMftfaiffLRMHjzIRHFHHLdibcSyJm2pasMrKHrO3Ptrt2DRshjvpgjEJJ1zVW14WPq/6QA== dependencies: - "@babel/helper-plugin-utils" "^7.27.1" + "@babel/helper-plugin-utils" "^7.29.7" "@babel/plugin-transform-runtime@^7.25.9": - version "7.29.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.29.0.tgz#a5fded13cc656700804bfd6e5ebd7fffd5266803" - integrity sha512-jlaRT5dJtMaMCV6fAuLbsQMSwz/QkvaHOHOSXRitGGwSpR1blCY4KUKoyP2tYO8vJcqYe8cEj96cqSztv3uF9w== + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.29.7.tgz#7c7fb6e2a46dce67e278b6cc84421c1d16da5695" + integrity sha512-xmAscdE/AsqRW7vutbPNoUmu/nF5SrLKPs7aoJgEjo35lLKA/Bc0i2rMv/hr1+Y0o1bQCiVtith3u2vdgRL39Q== dependencies: - "@babel/helper-module-imports" "^7.28.6" - "@babel/helper-plugin-utils" "^7.28.6" + "@babel/helper-module-imports" "^7.29.7" + "@babel/helper-plugin-utils" "^7.29.7" babel-plugin-polyfill-corejs2 "^0.4.14" babel-plugin-polyfill-corejs3 "^0.13.0" babel-plugin-polyfill-regenerator "^0.6.5" semver "^6.3.1" -"@babel/plugin-transform-shorthand-properties@^7.27.1": - version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.27.1.tgz#532abdacdec87bfee1e0ef8e2fcdee543fe32b90" - integrity sha512-N/wH1vcn4oYawbJ13Y/FxcQrWk63jhfNa7jef0ih7PHSIHX2LB7GWE1rkPrOnka9kwMxb6hMl19p7lidA+EHmQ== +"@babel/plugin-transform-shorthand-properties@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.29.7.tgz#25c0436b98f4bd9ca4b98e1fbd662743bbaab9bf" + integrity sha512-I+WYbGBAiCn7nA6xBrlgPH+MB7HWb4u8pv5S0Pv7OtwNvIFvCCb24YlttKEeUFVurfBCEaOTnuhlqsb7f0Z5Dg== dependencies: - "@babel/helper-plugin-utils" "^7.27.1" + "@babel/helper-plugin-utils" "^7.29.7" -"@babel/plugin-transform-spread@^7.28.6": - version "7.28.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.28.6.tgz#40a2b423f6db7b70f043ad027a58bcb44a9757b6" - integrity sha512-9U4QObUC0FtJl05AsUcodau/RWDytrU6uKgkxu09mLR9HLDAtUMoPuuskm5huQsoktmsYpI+bGmq+iapDcriKA== +"@babel/plugin-transform-spread@^7.29.7": + version "7.29.8" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.29.8.tgz#c894cff38556a5dafeb412e13fc012b6df4b95a2" + integrity sha512-4S9ksMGVWUshvgK0mKfvZky7leuG5/uoFVwMpAomJ8bMoDJiNHRVmc1EglwW/CmGVSqqWpEbXm9FmbRit22qoA== dependencies: - "@babel/helper-plugin-utils" "^7.28.6" - "@babel/helper-skip-transparent-expression-wrappers" "^7.27.1" + "@babel/helper-plugin-utils" "^7.29.7" + "@babel/helper-skip-transparent-expression-wrappers" "^7.29.7" -"@babel/plugin-transform-sticky-regex@^7.27.1": - version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.27.1.tgz#18984935d9d2296843a491d78a014939f7dcd280" - integrity sha512-lhInBO5bi/Kowe2/aLdBAawijx+q1pQzicSgnkB6dUPc1+RC8QmJHKf2OjvU+NZWitguJHEaEmbV6VWEouT58g== +"@babel/plugin-transform-sticky-regex@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.29.7.tgz#a42c0fd1fa42f7e98e1e0c7757f72a1bbca3a015" + integrity sha512-BCHzNYJGe9l7EpwwDBN/ztlL2NYFFq8hp9ddjtUEM9f2O7S7kKV/lL6Fwo7IF7NSkYhPK2vO+86nIGltA90MsA== dependencies: - "@babel/helper-plugin-utils" "^7.27.1" + "@babel/helper-plugin-utils" "^7.29.7" -"@babel/plugin-transform-template-literals@^7.27.1": - version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.27.1.tgz#1a0eb35d8bb3e6efc06c9fd40eb0bcef548328b8" - integrity sha512-fBJKiV7F2DxZUkg5EtHKXQdbsbURW3DZKQUWphDum0uRP6eHGGa/He9mc0mypL680pb+e/lDIthRohlv8NCHkg== +"@babel/plugin-transform-template-literals@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.29.7.tgz#ada97d8e0832bca8edb315888aa654b1570f3835" + integrity sha512-NCSEJ4sLFU2gqAub45HYh4fus2yQ36rr6ei6vpU7NdoJqCpxvEG8E6eJpscGyXP3VHD2Ny+fSXr04k1hoUrFqA== dependencies: - "@babel/helper-plugin-utils" "^7.27.1" + "@babel/helper-plugin-utils" "^7.29.7" -"@babel/plugin-transform-typeof-symbol@^7.27.1": - version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.27.1.tgz#70e966bb492e03509cf37eafa6dcc3051f844369" - integrity sha512-RiSILC+nRJM7FY5srIyc4/fGIwUhyDuuBSdWn4y6yT6gm652DpCHZjIipgn6B7MQ1ITOUnAKWixEUjQRIBIcLw== +"@babel/plugin-transform-typeof-symbol@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.29.7.tgz#d848a4677c1ee3485ab017f4018f04597798911c" + integrity sha512-223mNGoTkBiTEWFoK+Q6Go3tueMRclO8vxxxxquNCYuNI4jWOofFKJRRDu6SDrB8Sgo1UEGW9T4GAQ8ZyRso1A== dependencies: - "@babel/helper-plugin-utils" "^7.27.1" + "@babel/helper-plugin-utils" "^7.29.7" -"@babel/plugin-transform-typescript@^7.28.5": - version "7.28.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.28.6.tgz#1e93d96da8adbefdfdade1d4956f73afa201a158" - integrity sha512-0YWL2RFxOqEm9Efk5PvreamxPME8OyY0wM5wh5lHjF+VtVhdneCWGzZeSqzOfiobVqQaNCd2z0tQvnI9DaPWPw== +"@babel/plugin-transform-typescript@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.29.7.tgz#f0449c3df7037bbe232043476851c38f5e4a7615" + integrity sha512-jK52h8LaLc7JarhQV2ofeFMts4H7vnOXnqZNA6fYglBTZewRBE51KWt3BUltW1P+KoPsYkHoJeXePuz4zo2LMw== dependencies: - "@babel/helper-annotate-as-pure" "^7.27.3" - "@babel/helper-create-class-features-plugin" "^7.28.6" - "@babel/helper-plugin-utils" "^7.28.6" - "@babel/helper-skip-transparent-expression-wrappers" "^7.27.1" - "@babel/plugin-syntax-typescript" "^7.28.6" + "@babel/helper-annotate-as-pure" "^7.29.7" + "@babel/helper-create-class-features-plugin" "^7.29.7" + "@babel/helper-plugin-utils" "^7.29.7" + "@babel/helper-skip-transparent-expression-wrappers" "^7.29.7" + "@babel/plugin-syntax-typescript" "^7.29.7" -"@babel/plugin-transform-unicode-escapes@^7.27.1": - version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.27.1.tgz#3e3143f8438aef842de28816ece58780190cf806" - integrity sha512-Ysg4v6AmF26k9vpfFuTZg8HRfVWzsh1kVfowA23y9j/Gu6dOuahdUVhkLqpObp3JIv27MLSii6noRnuKN8H0Mg== +"@babel/plugin-transform-unicode-escapes@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.29.7.tgz#1e99554b0cddfd650d649a9f2b996049893e5720" + integrity sha512-jCfXxSjf94lf4E0hKE0AByxF6F3/pVFqRdUUNkDJhsY0m1ZKjnN6ZYyMeHNpzflxb/0q5b7t3p+BE+SLF1WOtA== dependencies: - "@babel/helper-plugin-utils" "^7.27.1" + "@babel/helper-plugin-utils" "^7.29.7" -"@babel/plugin-transform-unicode-property-regex@^7.28.6": - version "7.28.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.28.6.tgz#63a7a6c21a0e75dae9b1861454111ea5caa22821" - integrity sha512-4Wlbdl/sIZjzi/8St0evF0gEZrgOswVO6aOzqxh1kDZOl9WmLrHq2HtGhnOJZmHZYKP8WZ1MDLCt5DAWwRo57A== +"@babel/plugin-transform-unicode-property-regex@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.29.7.tgz#44444afc73768c2190fac4d95f7716817b7f204a" + integrity sha512-OgZ+zoAJgZLUCunsTRQ5LAjOywDv5zzZ2/hQ5aMw1pGXyY2rtE8/chXYUmu3AlVHKpm10KEdG9aMwbI/K76ZGw== dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.28.5" - "@babel/helper-plugin-utils" "^7.28.6" + "@babel/helper-create-regexp-features-plugin" "^7.29.7" + "@babel/helper-plugin-utils" "^7.29.7" -"@babel/plugin-transform-unicode-regex@^7.27.1": - version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.27.1.tgz#25948f5c395db15f609028e370667ed8bae9af97" - integrity sha512-xvINq24TRojDuyt6JGtHmkVkrfVV3FPT16uytxImLeBZqW3/H52yN+kM1MGuyPkIQxrzKwPHs5U/MP3qKyzkGw== +"@babel/plugin-transform-unicode-regex@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.29.7.tgz#c3064b293ff7f1794b71f7650eec8db9896d3e59" + integrity sha512-7D/x/23/d/3VqZ0QA+LGbZMlGwZjztBygSWWWsfTPoQ1oQ6Q1P6Mr3d0kk42XabyUVw+fha3LqdRsFqeKqvCyA== dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.27.1" - "@babel/helper-plugin-utils" "^7.27.1" + "@babel/helper-create-regexp-features-plugin" "^7.29.7" + "@babel/helper-plugin-utils" "^7.29.7" -"@babel/plugin-transform-unicode-sets-regex@^7.28.6": - version "7.28.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.28.6.tgz#924912914e5df9fe615ec472f88ff4788ce04d4e" - integrity sha512-/wHc/paTUmsDYN7SZkpWxogTOBNnlx7nBQYfy6JJlCT7G3mVhltk3e++N7zV0XfgGsrqBxd4rJQt9H16I21Y1Q== +"@babel/plugin-transform-unicode-sets-regex@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.29.7.tgz#b03ac9f27326f6197e8e574add83bbf33fc34ecd" + integrity sha512-BLOhLht9DOJwIxlmp91wHvkXv1lguuHS3/FwUO8HL1H0u8s4hR1gASVFyilu9iGtcTRYqjTZmlsFFeQletntEg== dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.28.5" - "@babel/helper-plugin-utils" "^7.28.6" + "@babel/helper-create-regexp-features-plugin" "^7.29.7" + "@babel/helper-plugin-utils" "^7.29.7" "@babel/preset-env@^7.20.2", "@babel/preset-env@^7.25.9": - version "7.29.5" - resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.29.5.tgz#c48b7ed94582c8b685e21b8b42de8633ec289268" - integrity sha512-/69t2aEzGKHD76DyLbHysF/QH2LJOB8iFnYO37unDTKBTubzcMRv0f3H5EiN1Q6ajOd/eB7dAInF0qdFVS06kA== + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.29.7.tgz#5e2ab5e764b493fdefc99c43aeaa70a9533a37fd" + integrity sha512-GYzX36n1nsciIb0uyH0GHwxwtNwPQIcpxSeiVLDtG/B7jB5xXgchnmL1f/jCX5o+pwnaDBtO60ONSJhEBJfxYA== dependencies: - "@babel/compat-data" "^7.29.3" - "@babel/helper-compilation-targets" "^7.28.6" - "@babel/helper-plugin-utils" "^7.28.6" - "@babel/helper-validator-option" "^7.27.1" - "@babel/plugin-bugfix-firefox-class-in-computed-class-key" "^7.28.5" - "@babel/plugin-bugfix-safari-class-field-initializer-scope" "^7.27.1" - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression" "^7.27.1" - "@babel/plugin-bugfix-safari-rest-destructuring-rhs-array" "^7.29.3" - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining" "^7.27.1" - "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly" "^7.28.6" + "@babel/compat-data" "^7.29.7" + "@babel/helper-compilation-targets" "^7.29.7" + "@babel/helper-plugin-utils" "^7.29.7" + "@babel/helper-validator-option" "^7.29.7" + "@babel/plugin-bugfix-firefox-class-in-computed-class-key" "^7.29.7" + "@babel/plugin-bugfix-safari-class-field-initializer-scope" "^7.29.7" + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression" "^7.29.7" + "@babel/plugin-bugfix-safari-rest-destructuring-rhs-array" "^7.29.7" + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining" "^7.29.7" + "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly" "^7.29.7" "@babel/plugin-proposal-private-property-in-object" "7.21.0-placeholder-for-preset-env.2" - "@babel/plugin-syntax-import-assertions" "^7.28.6" - "@babel/plugin-syntax-import-attributes" "^7.28.6" + "@babel/plugin-syntax-import-assertions" "^7.29.7" + "@babel/plugin-syntax-import-attributes" "^7.29.7" "@babel/plugin-syntax-unicode-sets-regex" "^7.18.6" - "@babel/plugin-transform-arrow-functions" "^7.27.1" - "@babel/plugin-transform-async-generator-functions" "^7.29.0" - "@babel/plugin-transform-async-to-generator" "^7.28.6" - "@babel/plugin-transform-block-scoped-functions" "^7.27.1" - "@babel/plugin-transform-block-scoping" "^7.28.6" - "@babel/plugin-transform-class-properties" "^7.28.6" - "@babel/plugin-transform-class-static-block" "^7.28.6" - "@babel/plugin-transform-classes" "^7.28.6" - "@babel/plugin-transform-computed-properties" "^7.28.6" - "@babel/plugin-transform-destructuring" "^7.28.5" - "@babel/plugin-transform-dotall-regex" "^7.28.6" - "@babel/plugin-transform-duplicate-keys" "^7.27.1" - "@babel/plugin-transform-duplicate-named-capturing-groups-regex" "^7.29.0" - "@babel/plugin-transform-dynamic-import" "^7.27.1" - "@babel/plugin-transform-explicit-resource-management" "^7.28.6" - "@babel/plugin-transform-exponentiation-operator" "^7.28.6" - "@babel/plugin-transform-export-namespace-from" "^7.27.1" - "@babel/plugin-transform-for-of" "^7.27.1" - "@babel/plugin-transform-function-name" "^7.27.1" - "@babel/plugin-transform-json-strings" "^7.28.6" - "@babel/plugin-transform-literals" "^7.27.1" - "@babel/plugin-transform-logical-assignment-operators" "^7.28.6" - "@babel/plugin-transform-member-expression-literals" "^7.27.1" - "@babel/plugin-transform-modules-amd" "^7.27.1" - "@babel/plugin-transform-modules-commonjs" "^7.28.6" - "@babel/plugin-transform-modules-systemjs" "^7.29.4" - "@babel/plugin-transform-modules-umd" "^7.27.1" - "@babel/plugin-transform-named-capturing-groups-regex" "^7.29.0" - "@babel/plugin-transform-new-target" "^7.27.1" - "@babel/plugin-transform-nullish-coalescing-operator" "^7.28.6" - "@babel/plugin-transform-numeric-separator" "^7.28.6" - "@babel/plugin-transform-object-rest-spread" "^7.28.6" - "@babel/plugin-transform-object-super" "^7.27.1" - "@babel/plugin-transform-optional-catch-binding" "^7.28.6" - "@babel/plugin-transform-optional-chaining" "^7.28.6" - "@babel/plugin-transform-parameters" "^7.27.7" - "@babel/plugin-transform-private-methods" "^7.28.6" - "@babel/plugin-transform-private-property-in-object" "^7.28.6" - "@babel/plugin-transform-property-literals" "^7.27.1" - "@babel/plugin-transform-regenerator" "^7.29.0" - "@babel/plugin-transform-regexp-modifiers" "^7.28.6" - "@babel/plugin-transform-reserved-words" "^7.27.1" - "@babel/plugin-transform-shorthand-properties" "^7.27.1" - "@babel/plugin-transform-spread" "^7.28.6" - "@babel/plugin-transform-sticky-regex" "^7.27.1" - "@babel/plugin-transform-template-literals" "^7.27.1" - "@babel/plugin-transform-typeof-symbol" "^7.27.1" - "@babel/plugin-transform-unicode-escapes" "^7.27.1" - "@babel/plugin-transform-unicode-property-regex" "^7.28.6" - "@babel/plugin-transform-unicode-regex" "^7.27.1" - "@babel/plugin-transform-unicode-sets-regex" "^7.28.6" + "@babel/plugin-transform-arrow-functions" "^7.29.7" + "@babel/plugin-transform-async-generator-functions" "^7.29.7" + "@babel/plugin-transform-async-to-generator" "^7.29.7" + "@babel/plugin-transform-block-scoped-functions" "^7.29.7" + "@babel/plugin-transform-block-scoping" "^7.29.7" + "@babel/plugin-transform-class-properties" "^7.29.7" + "@babel/plugin-transform-class-static-block" "^7.29.7" + "@babel/plugin-transform-classes" "^7.29.7" + "@babel/plugin-transform-computed-properties" "^7.29.7" + "@babel/plugin-transform-destructuring" "^7.29.7" + "@babel/plugin-transform-dotall-regex" "^7.29.7" + "@babel/plugin-transform-duplicate-keys" "^7.29.7" + "@babel/plugin-transform-duplicate-named-capturing-groups-regex" "^7.29.7" + "@babel/plugin-transform-dynamic-import" "^7.29.7" + "@babel/plugin-transform-explicit-resource-management" "^7.29.7" + "@babel/plugin-transform-exponentiation-operator" "^7.29.7" + "@babel/plugin-transform-export-namespace-from" "^7.29.7" + "@babel/plugin-transform-for-of" "^7.29.7" + "@babel/plugin-transform-function-name" "^7.29.7" + "@babel/plugin-transform-json-strings" "^7.29.7" + "@babel/plugin-transform-literals" "^7.29.7" + "@babel/plugin-transform-logical-assignment-operators" "^7.29.7" + "@babel/plugin-transform-member-expression-literals" "^7.29.7" + "@babel/plugin-transform-modules-amd" "^7.29.7" + "@babel/plugin-transform-modules-commonjs" "^7.29.7" + "@babel/plugin-transform-modules-systemjs" "^7.29.7" + "@babel/plugin-transform-modules-umd" "^7.29.7" + "@babel/plugin-transform-named-capturing-groups-regex" "^7.29.7" + "@babel/plugin-transform-new-target" "^7.29.7" + "@babel/plugin-transform-nullish-coalescing-operator" "^7.29.7" + "@babel/plugin-transform-numeric-separator" "^7.29.7" + "@babel/plugin-transform-object-rest-spread" "^7.29.7" + "@babel/plugin-transform-object-super" "^7.29.7" + "@babel/plugin-transform-optional-catch-binding" "^7.29.7" + "@babel/plugin-transform-optional-chaining" "^7.29.7" + "@babel/plugin-transform-parameters" "^7.29.7" + "@babel/plugin-transform-private-methods" "^7.29.7" + "@babel/plugin-transform-private-property-in-object" "^7.29.7" + "@babel/plugin-transform-property-literals" "^7.29.7" + "@babel/plugin-transform-regenerator" "^7.29.7" + "@babel/plugin-transform-regexp-modifiers" "^7.29.7" + "@babel/plugin-transform-reserved-words" "^7.29.7" + "@babel/plugin-transform-shorthand-properties" "^7.29.7" + "@babel/plugin-transform-spread" "^7.29.7" + "@babel/plugin-transform-sticky-regex" "^7.29.7" + "@babel/plugin-transform-template-literals" "^7.29.7" + "@babel/plugin-transform-typeof-symbol" "^7.29.7" + "@babel/plugin-transform-unicode-escapes" "^7.29.7" + "@babel/plugin-transform-unicode-property-regex" "^7.29.7" + "@babel/plugin-transform-unicode-regex" "^7.29.7" + "@babel/plugin-transform-unicode-sets-regex" "^7.29.7" "@babel/preset-modules" "0.1.6-no-external-plugins" babel-plugin-polyfill-corejs2 "^0.4.15" babel-plugin-polyfill-corejs3 "^0.14.0" @@ -1019,62 +1029,62 @@ esutils "^2.0.2" "@babel/preset-react@^7.18.6", "@babel/preset-react@^7.25.9": - version "7.28.5" - resolved "https://registry.yarnpkg.com/@babel/preset-react/-/preset-react-7.28.5.tgz#6fcc0400fa79698433d653092c3919bb4b0878d9" - integrity sha512-Z3J8vhRq7CeLjdC58jLv4lnZ5RKFUJWqH5emvxmv9Hv3BD1T9R/Im713R4MTKwvFaV74ejZ3sM01LyEKk4ugNQ== + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/preset-react/-/preset-react-7.29.7.tgz#2ed18366e38c2081bbf1760dc01e88fa5674eb17" + integrity sha512-C+PV1TFUPTmBQGoPBL8j2QmLpZ117YTCwxIZeJOM96GbYMFSc7/pOXU5lVykwnZxyTqQxRsvoRk6f2FktZgGHA== dependencies: - "@babel/helper-plugin-utils" "^7.27.1" - "@babel/helper-validator-option" "^7.27.1" - "@babel/plugin-transform-react-display-name" "^7.28.0" - "@babel/plugin-transform-react-jsx" "^7.27.1" - "@babel/plugin-transform-react-jsx-development" "^7.27.1" - "@babel/plugin-transform-react-pure-annotations" "^7.27.1" + "@babel/helper-plugin-utils" "^7.29.7" + "@babel/helper-validator-option" "^7.29.7" + "@babel/plugin-transform-react-display-name" "^7.29.7" + "@babel/plugin-transform-react-jsx" "^7.29.7" + "@babel/plugin-transform-react-jsx-development" "^7.29.7" + "@babel/plugin-transform-react-pure-annotations" "^7.29.7" "@babel/preset-typescript@^7.21.0", "@babel/preset-typescript@^7.25.9": - version "7.28.5" - resolved "https://registry.yarnpkg.com/@babel/preset-typescript/-/preset-typescript-7.28.5.tgz#540359efa3028236958466342967522fd8f2a60c" - integrity sha512-+bQy5WOI2V6LJZpPVxY+yp66XdZ2yifu0Mc1aP5CQKgjn4QM5IN2i5fAZ4xKop47pr8rpVhiAeu+nDQa12C8+g== + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/preset-typescript/-/preset-typescript-7.29.7.tgz#de9be1f47b785c979ec7b3a71f4cd8bae5267b62" + integrity sha512-/Foi8vKY2EVbed/1eZx0gJEEwHAIxogrySI7rULcRIvhZzbvoE/b5qG5Ghc0WKAFKOHA9SD1x7RsFlOYdutIiQ== dependencies: - "@babel/helper-plugin-utils" "^7.27.1" - "@babel/helper-validator-option" "^7.27.1" - "@babel/plugin-syntax-jsx" "^7.27.1" - "@babel/plugin-transform-modules-commonjs" "^7.27.1" - "@babel/plugin-transform-typescript" "^7.28.5" + "@babel/helper-plugin-utils" "^7.29.7" + "@babel/helper-validator-option" "^7.29.7" + "@babel/plugin-syntax-jsx" "^7.29.7" + "@babel/plugin-transform-modules-commonjs" "^7.29.7" + "@babel/plugin-transform-typescript" "^7.29.7" "@babel/runtime@^7.1.2", "@babel/runtime@^7.10.3", "@babel/runtime@^7.12.13", "@babel/runtime@^7.12.5", "@babel/runtime@^7.25.9": - version "7.29.2" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.29.2.tgz#9a6e2d05f4b6692e1801cd4fb176ad823930ed5e" - integrity sha512-JiDShH45zKHWyGe4ZNVRrCjBz8Nh9TMmZG1kh4QTK8hCBTWBi8Da+i7s1fJw7/lYpM4ccepSNfqzZ/QvABBi5g== + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.29.7.tgz#12022450c45a4da6d8d8287b18a4ff2ddb23f768" + integrity sha512-Nq8OhGWiZIZGV6hLHoyAKLLcJihP/xFeBMGJoUrxTX2psI8dCifzLhZISFb+VWS3wFMRDmCGw5R+dOySCqPLhw== -"@babel/template@^7.28.6": - version "7.28.6" - resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.28.6.tgz#0e7e56ecedb78aeef66ce7972b082fce76a23e57" - integrity sha512-YA6Ma2KsCdGb+WC6UpBVFJGXL58MDA6oyONbjyF/+5sBgxY/dwkhLogbMT2GXXyU84/IhRw/2D1Os1B/giz+BQ== +"@babel/template@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.29.7.tgz#4d9d4004f645cdd304de958c725162784ecac700" + integrity sha512-puq+Gf35oI24FeN11LkoUQFqv9uwNeWpxXZi/Ji3rRIoKAzKnxRaZ+Gkj0vKS9ZCiTESfng1N9LyOyXvo+m+Gg== dependencies: - "@babel/code-frame" "^7.28.6" - "@babel/parser" "^7.28.6" - "@babel/types" "^7.28.6" + "@babel/code-frame" "^7.29.7" + "@babel/parser" "^7.29.7" + "@babel/types" "^7.29.7" -"@babel/traverse@^7.25.9", "@babel/traverse@^7.27.1", "@babel/traverse@^7.28.5", "@babel/traverse@^7.28.6", "@babel/traverse@^7.29.0": - version "7.29.0" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.29.0.tgz#f323d05001440253eead3c9c858adbe00b90310a" - integrity sha512-4HPiQr0X7+waHfyXPZpWPfWL/J7dcN1mx9gL6WdQVMbPnF3+ZhSMs8tCxN7oHddJE9fhNE7+lxdnlyemKfJRuA== +"@babel/traverse@^7.25.9", "@babel/traverse@^7.29.7", "@babel/traverse@^7.29.8": + version "7.29.8" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.29.8.tgz#4111014cdc71a0f95d9471907590baa0b8a6b28a" + integrity sha512-I5z7H3bf/41ktsNVLtpN0wAa336HkqIHQ5BuPLEhTkt1jVSyZpeNKIzTgEWmlxjdg81R0IgUCcaE+Ok3NvrfZg== dependencies: - "@babel/code-frame" "^7.29.0" - "@babel/generator" "^7.29.0" - "@babel/helper-globals" "^7.28.0" - "@babel/parser" "^7.29.0" - "@babel/template" "^7.28.6" - "@babel/types" "^7.29.0" + "@babel/code-frame" "^7.29.7" + "@babel/generator" "^7.29.8" + "@babel/helper-globals" "^7.29.7" + "@babel/parser" "^7.29.8" + "@babel/template" "^7.29.7" + "@babel/types" "^7.29.8" debug "^4.3.1" -"@babel/types@^7.21.3", "@babel/types@^7.27.1", "@babel/types@^7.27.3", "@babel/types@^7.28.5", "@babel/types@^7.28.6", "@babel/types@^7.29.0", "@babel/types@^7.4.4": - version "7.29.0" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.29.0.tgz#9f5b1e838c446e72cf3cd4b918152b8c605e37c7" - integrity sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A== +"@babel/types@^7.21.3", "@babel/types@^7.29.7", "@babel/types@^7.29.8", "@babel/types@^7.4.4": + version "7.29.8" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.29.8.tgz#1229eef31d85156d70fa3f4cd859376d0eaf6863" + integrity sha512-Vj1jF3cPfxg7OAfoI7QnVKLoILlm2JF9pnVHrX8qx7AHMiYWT+NDAA7jChlNgRS4WTLc/fD1lXLmPixluj+3Gg== dependencies: - "@babel/helper-string-parser" "^7.27.1" - "@babel/helper-validator-identifier" "^7.28.5" + "@babel/helper-string-parser" "^7.29.7" + "@babel/helper-validator-identifier" "^7.29.7" "@colors/colors@1.5.0": version "1.5.0" @@ -1480,29 +1490,29 @@ resolved "https://registry.yarnpkg.com/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz#1d572bfbbe14b7704e0ba0f39b74815b84870d70" integrity sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw== -"@docsearch/core@4.6.3": - version "4.6.3" - resolved "https://registry.yarnpkg.com/@docsearch/core/-/core-4.6.3.tgz#9954c75c3ae28418e06f8e7537a920d6cd2bc22e" - integrity sha512-rUOujwIpxJRgD7+kicVsI3D5sqBvdiRTquzWBpTEXZs8ZXfGbfzpus5HqumaNYTppN2HvH8E2yNuRwYdHJeOlA== +"@docsearch/core@4.7.0": + version "4.7.0" + resolved "https://registry.yarnpkg.com/@docsearch/core/-/core-4.7.0.tgz#914962191f2718b9caa48f4cbe46c0720fdc055d" + integrity sha512-p/9xVKmPDj3FPvMfPf5naVO3Ej8SCbcUugGvx1+8GgkuBNbqxqN2Irx3WLBv8VY0jH7XpRwKWdlmjXLZsmTLsg== -"@docsearch/css@4.6.3": - version "4.6.3" - resolved "https://registry.yarnpkg.com/@docsearch/css/-/css-4.6.3.tgz#a94065af4a996dd927dc5dda383395e583dbd638" - integrity sha512-nlOwcXcsNAptQl4vlL4MA78qNJKO0Qlds5GuBjCoePgkebTXLSf8Qt1oyZ3YBshYupKXG9VRGEsk1zr23d+bzQ== +"@docsearch/css@4.7.0": + version "4.7.0" + resolved "https://registry.yarnpkg.com/@docsearch/css/-/css-4.7.0.tgz#d6d93c6ddf5e813a3ea09da719e150c222693a5c" + integrity sha512-Sk5xkdRFeE7PeWjG9l4AfTwdvMfr9wHiwNNCpHXT4v4SNyNMKdHGvEILc31BgaVFGDDNbv5u/a73tofRiwbEZw== "@docsearch/react@^3.9.0 || ^4.3.2": - version "4.6.3" - resolved "https://registry.yarnpkg.com/@docsearch/react/-/react-4.6.3.tgz#80df785f9c5e484c960b914a22ea2a3e4c7210ad" - integrity sha512-Bg2wdDsoQVlNCcEKuEJAU04tvHCqgx8rIu+uIoM4pRtcx3TBKJuXutJik3LTA8LRc9YEyHkrYUrmcC0D7BYf+g== + version "4.7.0" + resolved "https://registry.yarnpkg.com/@docsearch/react/-/react-4.7.0.tgz#8e7d77c34d19755f98d225a3413eddf605658d70" + integrity sha512-x6oedjJ8O8/pIDBsMo5Orca3/6cQCz616/CwthVe68l43mqnj2lrJ9kFQITBqy8hMsS3nWeBWFoVO5dJ1DCFKA== dependencies: "@algolia/autocomplete-core" "1.19.2" - "@docsearch/core" "4.6.3" - "@docsearch/css" "4.6.3" + "@docsearch/core" "4.7.0" + "@docsearch/css" "4.7.0" -"@docusaurus/babel@3.10.1": - version "3.10.1" - resolved "https://registry.yarnpkg.com/@docusaurus/babel/-/babel-3.10.1.tgz#2f714f682117658ba43d308e9b35b6a73a105227" - integrity sha512-DZzFO1K3v/GoEt1fx1DiYHF4en+PuhtQf1AkQJa5zu3CoeKSpr5cpQRUlz3jr0m44wyzmSXu9bVpfir+N4+8bg== +"@docusaurus/babel@3.10.2": + version "3.10.2" + resolved "https://registry.yarnpkg.com/@docusaurus/babel/-/babel-3.10.2.tgz#4d5f8ac4d16bfe26c06f256687831787edb46e8a" + integrity sha512-aJ1hpGyvfkte3dDAfNbWM4biW4yWZBVz7TIGLZP+v+tWOBgxX3e0N5ZIXHIvmfNNXTI77pcHUx3KmtOk05Ze3Q== dependencies: "@babel/core" "^7.25.9" "@babel/generator" "^7.25.9" @@ -1513,23 +1523,23 @@ "@babel/preset-typescript" "^7.25.9" "@babel/runtime" "^7.25.9" "@babel/traverse" "^7.25.9" - "@docusaurus/logger" "3.10.1" - "@docusaurus/utils" "3.10.1" + "@docusaurus/logger" "3.10.2" + "@docusaurus/utils" "3.10.2" babel-plugin-dynamic-import-node "^2.3.3" fs-extra "^11.1.1" tslib "^2.6.0" -"@docusaurus/bundler@3.10.1": - version "3.10.1" - resolved "https://registry.yarnpkg.com/@docusaurus/bundler/-/bundler-3.10.1.tgz#82fa5079f3787a67502e25f82d37d05ec5de0cc3" - integrity sha512-HIqQPvbqnnQRe4NsBd1774KRarjXqS6wHsWELtyuSs1gCfvixJO2jUGH/OEBtr1Gvzpw+ze5CjGMvSJ8UE1KUw== +"@docusaurus/bundler@3.10.2": + version "3.10.2" + resolved "https://registry.yarnpkg.com/@docusaurus/bundler/-/bundler-3.10.2.tgz#323492eb0550b6a7f6e5fa6b9877cdb2c53b1be3" + integrity sha512-i0ZNcy0f0WhaOlYVgzLsWhIoEXO9kS3HRoKPtgE6vQtZUq7arKZaYdNBudr3mqCmd+TyOkwtwfHgs1ENj07r5g== dependencies: "@babel/core" "^7.25.9" - "@docusaurus/babel" "3.10.1" - "@docusaurus/cssnano-preset" "3.10.1" - "@docusaurus/logger" "3.10.1" - "@docusaurus/types" "3.10.1" - "@docusaurus/utils" "3.10.1" + "@docusaurus/babel" "3.10.2" + "@docusaurus/cssnano-preset" "3.10.2" + "@docusaurus/logger" "3.10.2" + "@docusaurus/types" "3.10.2" + "@docusaurus/utils" "3.10.2" babel-loader "^9.2.1" clean-css "^5.3.3" copy-webpack-plugin "^11.0.0" @@ -1549,18 +1559,18 @@ webpack "^5.95.0" webpackbar "^7.0.0" -"@docusaurus/core@3.10.1": - version "3.10.1" - resolved "https://registry.yarnpkg.com/@docusaurus/core/-/core-3.10.1.tgz#3f8bdb97451b4df14f2a3b39ab0186366fbf8fbe" - integrity sha512-3pf2fXXw0eVk8WnC3T4LIigRDupcpvngpKo9Vy7mYyBhuddc0klDUuZAIfzMoK6z05pdlk6EFC/vBSX43+1O5w== +"@docusaurus/core@3.10.2": + version "3.10.2" + resolved "https://registry.yarnpkg.com/@docusaurus/core/-/core-3.10.2.tgz#349cae728fc3769b3f8aef4cf538ccb79aace8d0" + integrity sha512-EYByj6nk+aD9KeVxV6Hmo2/nAAT79P21Y82ycTBOBtrmqilloIbIEhgL2/8Xpt2Jz/pgNqHAwyusOGwmbKeJmA== dependencies: - "@docusaurus/babel" "3.10.1" - "@docusaurus/bundler" "3.10.1" - "@docusaurus/logger" "3.10.1" - "@docusaurus/mdx-loader" "3.10.1" - "@docusaurus/utils" "3.10.1" - "@docusaurus/utils-common" "3.10.1" - "@docusaurus/utils-validation" "3.10.1" + "@docusaurus/babel" "3.10.2" + "@docusaurus/bundler" "3.10.2" + "@docusaurus/logger" "3.10.2" + "@docusaurus/mdx-loader" "3.10.2" + "@docusaurus/utils" "3.10.2" + "@docusaurus/utils-common" "3.10.2" + "@docusaurus/utils-validation" "3.10.2" boxen "^6.2.1" chalk "^4.1.2" chokidar "^3.5.3" @@ -1568,7 +1578,7 @@ combine-promises "^1.1.0" commander "^5.1.0" core-js "^3.31.1" - detect-port "^1.5.1" + detect-port "^2.1.0" escape-html "^1.0.3" eta "^2.2.0" eval "^0.1.8" @@ -1597,32 +1607,32 @@ webpack-dev-server "^5.2.2" webpack-merge "^6.0.1" -"@docusaurus/cssnano-preset@3.10.1": - version "3.10.1" - resolved "https://registry.yarnpkg.com/@docusaurus/cssnano-preset/-/cssnano-preset-3.10.1.tgz#4b6bafeca8bb9423364d2fd6683c28e2f85a4665" - integrity sha512-eNfHGcTKCSq6xmcavAkX3RRclHaE2xRCMParlDXLdXVP01/a2e/jKXMj/0ULnLFQSNwwuI62L0Ge8J+nZsR7UQ== +"@docusaurus/cssnano-preset@3.10.2": + version "3.10.2" + resolved "https://registry.yarnpkg.com/@docusaurus/cssnano-preset/-/cssnano-preset-3.10.2.tgz#e3ac7e85585f77e8fdef95176ab7c211d1296630" + integrity sha512-4gCnHRbJLTloiwfvFAa92tgb2gI4KYhvjfQVYnEaiMO/EgvWfCo1LwytHXen+1oZAN0VAlS0JAPxp3MsvKDa3A== dependencies: cssnano-preset-advanced "^6.1.2" postcss "^8.5.4" postcss-sort-media-queries "^5.2.0" tslib "^2.6.0" -"@docusaurus/logger@3.10.1": - version "3.10.1" - resolved "https://registry.yarnpkg.com/@docusaurus/logger/-/logger-3.10.1.tgz#34c964e32e18f120e30f80171a38cfefe72cfb4b" - integrity sha512-oPjNFnfJsRCkePVjkGrxWGq4MvJKRQT0r9jOP0eRBTZ7Wr9FAbzdP/Gjs0I2Ss6YRkPoEgygKG112OkE6skvJw== +"@docusaurus/logger@3.10.2": + version "3.10.2" + resolved "https://registry.yarnpkg.com/@docusaurus/logger/-/logger-3.10.2.tgz#280bed53d0eb9cdc56e896a155036207910e89c9" + integrity sha512-gSEwqtPfCAnC3ZSJY6xL7tcIfgg0vFD39jbv93eakuweyvO2864xR0K+kmKwBhkTCtWRNjuGGnb5rdmkD/ndqw== dependencies: chalk "^4.1.2" tslib "^2.6.0" -"@docusaurus/mdx-loader@3.10.1": - version "3.10.1" - resolved "https://registry.yarnpkg.com/@docusaurus/mdx-loader/-/mdx-loader-3.10.1.tgz#050ae9bc614158a4ec07a628aa75fa9ae90d7e82" - integrity sha512-GRmeb/wQ+iXRrFwcHBfgQhrJxGElgCsoTWZYDhccjsZVne1p8MK/EpQVIloXttz76TCe78kKD5AEG9n1xc1oxQ== +"@docusaurus/mdx-loader@3.10.2": + version "3.10.2" + resolved "https://registry.yarnpkg.com/@docusaurus/mdx-loader/-/mdx-loader-3.10.2.tgz#3b4e7ffacff4ed856db2ec4e94c13b0a652d62eb" + integrity sha512-9Fd4V/SFjfrVQ0JH5EN0+iPWyFunvTeQE3gfyFeetqPaXMP0OylIjOw16dCuXG4NZJrYdBqwzjh18/h3gRi47w== dependencies: - "@docusaurus/logger" "3.10.1" - "@docusaurus/utils" "3.10.1" - "@docusaurus/utils-validation" "3.10.1" + "@docusaurus/logger" "3.10.2" + "@docusaurus/utils" "3.10.2" + "@docusaurus/utils-validation" "3.10.2" "@mdx-js/mdx" "^3.0.0" "@slorber/remark-comment" "^1.0.0" escape-html "^1.0.3" @@ -1645,12 +1655,12 @@ vfile "^6.0.1" webpack "^5.88.1" -"@docusaurus/module-type-aliases@3.10.1": - version "3.10.1" - resolved "https://registry.yarnpkg.com/@docusaurus/module-type-aliases/-/module-type-aliases-3.10.1.tgz#22d39177c296786eb6e0d940699cd590cc93ca77" - integrity sha512-YoOZKUdGlp8xSYhuAkGdSo5Ydkbq4V4eK3sD8v0a2hloxCWdQbNBhkc+Ko9QyjpESc0BYcIGM5iHVAy5hdFV6w== +"@docusaurus/module-type-aliases@3.10.2": + version "3.10.2" + resolved "https://registry.yarnpkg.com/@docusaurus/module-type-aliases/-/module-type-aliases-3.10.2.tgz#7c3b940c77d72e71d33a1e76f0e003b418e6163a" + integrity sha512-h/I5e4jaAhDHW4vaLENi1i2hnOEnXY1t9R+nnRTbgUl7ymVRzN/HF7dDfj8rKYGj8gfIge+Ef+iYRAMtbGvsrQ== dependencies: - "@docusaurus/types" "3.10.1" + "@docusaurus/types" "3.10.2" "@types/history" "^4.7.11" "@types/react" "*" "@types/react-router-config" "*" @@ -1658,19 +1668,19 @@ react-helmet-async "npm:@slorber/react-helmet-async@1.3.0" react-loadable "npm:@docusaurus/react-loadable@6.0.0" -"@docusaurus/plugin-content-blog@3.10.1": - version "3.10.1" - resolved "https://registry.yarnpkg.com/@docusaurus/plugin-content-blog/-/plugin-content-blog-3.10.1.tgz#0bd8de700ccbd8e95d920df2613304ef59abe72b" - integrity sha512-mmkgE6Q2+K74tnkou7tXlpDLvoCU/qkSa2GSQ3XUiHWvcebCoDQzS670RR3tO8PmaWlIyWWISYWzZLuMfxunRA== +"@docusaurus/plugin-content-blog@3.10.2": + version "3.10.2" + resolved "https://registry.yarnpkg.com/@docusaurus/plugin-content-blog/-/plugin-content-blog-3.10.2.tgz#2374886ec3d76e8f014e85db8c3c010de6c419be" + integrity sha512-0cbEnNKf0InmLkhj/+nVRmqEnWEoOE8Mh+2x1qOXI0qYpCnphq4RXknVJ8BvybKRXqYVvbmdMfiJSup+k4tm5w== dependencies: - "@docusaurus/core" "3.10.1" - "@docusaurus/logger" "3.10.1" - "@docusaurus/mdx-loader" "3.10.1" - "@docusaurus/theme-common" "3.10.1" - "@docusaurus/types" "3.10.1" - "@docusaurus/utils" "3.10.1" - "@docusaurus/utils-common" "3.10.1" - "@docusaurus/utils-validation" "3.10.1" + "@docusaurus/core" "3.10.2" + "@docusaurus/logger" "3.10.2" + "@docusaurus/mdx-loader" "3.10.2" + "@docusaurus/theme-common" "3.10.2" + "@docusaurus/types" "3.10.2" + "@docusaurus/utils" "3.10.2" + "@docusaurus/utils-common" "3.10.2" + "@docusaurus/utils-validation" "3.10.2" cheerio "1.0.0-rc.12" combine-promises "^1.1.0" feed "^4.2.2" @@ -1683,20 +1693,20 @@ utility-types "^3.10.0" webpack "^5.88.1" -"@docusaurus/plugin-content-docs@3.10.1", "@docusaurus/plugin-content-docs@^2 || ^3": - version "3.10.1" - resolved "https://registry.yarnpkg.com/@docusaurus/plugin-content-docs/-/plugin-content-docs-3.10.1.tgz#261e0e982e4a937c05b462e3c5729374f433b752" - integrity sha512-2jRVrtzjf8LClGTHQlwlwuD3wQXRx3WEoF7XUarJ8Ou+0onV+SLtejsyfY9JLpfUh9hPhXM4pbBGkyAY4Bi3HQ== +"@docusaurus/plugin-content-docs@3.10.2", "@docusaurus/plugin-content-docs@^2 || ^3": + version "3.10.2" + resolved "https://registry.yarnpkg.com/@docusaurus/plugin-content-docs/-/plugin-content-docs-3.10.2.tgz#249bbc806437f227b06410ecc771eb67d8910a9a" + integrity sha512-Sqwl4FPoZBDrlY8I2VU2H8O0M91CHp9T8ToMSkTZmjvHCif+1laqfXi6sTk8IfyVS/trN5yNjcWd1bFsGB6W5Q== dependencies: - "@docusaurus/core" "3.10.1" - "@docusaurus/logger" "3.10.1" - "@docusaurus/mdx-loader" "3.10.1" - "@docusaurus/module-type-aliases" "3.10.1" - "@docusaurus/theme-common" "3.10.1" - "@docusaurus/types" "3.10.1" - "@docusaurus/utils" "3.10.1" - "@docusaurus/utils-common" "3.10.1" - "@docusaurus/utils-validation" "3.10.1" + "@docusaurus/core" "3.10.2" + "@docusaurus/logger" "3.10.2" + "@docusaurus/mdx-loader" "3.10.2" + "@docusaurus/module-type-aliases" "3.10.2" + "@docusaurus/theme-common" "3.10.2" + "@docusaurus/types" "3.10.2" + "@docusaurus/utils" "3.10.2" + "@docusaurus/utils-common" "3.10.2" + "@docusaurus/utils-validation" "3.10.2" "@types/react-router-config" "^5.0.7" combine-promises "^1.1.0" fs-extra "^11.1.1" @@ -1707,142 +1717,141 @@ utility-types "^3.10.0" webpack "^5.88.1" -"@docusaurus/plugin-content-pages@3.10.1": - version "3.10.1" - resolved "https://registry.yarnpkg.com/@docusaurus/plugin-content-pages/-/plugin-content-pages-3.10.1.tgz#8c6ffc2079ed0262548ecc4df1dea6add6aa9673" - integrity sha512-huJpaRPMl42nsFwuCXvV8bVDj2MazuwRJIUylI/RSlmZeJssVoZXeCjVf1y+1Drtpa9SKcdGn8yoJ76IRJijtw== +"@docusaurus/plugin-content-pages@3.10.2": + version "3.10.2" + resolved "https://registry.yarnpkg.com/@docusaurus/plugin-content-pages/-/plugin-content-pages-3.10.2.tgz#377c11b36a6a5e0c0c14dd9dea799f986d662ed7" + integrity sha512-h5R12sZ/vV9EPiVjvIl9YFCOwkpwXes7dQMYt3EvP6Pphu4amHxxTqWxf08Fl5DR8h+oZMbWpFTNw5vKEYfvzQ== dependencies: - "@docusaurus/core" "3.10.1" - "@docusaurus/mdx-loader" "3.10.1" - "@docusaurus/types" "3.10.1" - "@docusaurus/utils" "3.10.1" - "@docusaurus/utils-validation" "3.10.1" + "@docusaurus/core" "3.10.2" + "@docusaurus/mdx-loader" "3.10.2" + "@docusaurus/types" "3.10.2" + "@docusaurus/utils" "3.10.2" + "@docusaurus/utils-validation" "3.10.2" fs-extra "^11.1.1" tslib "^2.6.0" webpack "^5.88.1" -"@docusaurus/plugin-css-cascade-layers@3.10.1": - version "3.10.1" - resolved "https://registry.yarnpkg.com/@docusaurus/plugin-css-cascade-layers/-/plugin-css-cascade-layers-3.10.1.tgz#440578d95cbe1a6120936fa83df868d2626cd1d8" - integrity sha512-r//fn+MNHkE1wCof8T29VAQezt1enGCpsFxoziBbvLgBM4JfXN2P3rxrBaavHmvLvm7lYkpJeitcDthwnmWCTw== +"@docusaurus/plugin-css-cascade-layers@3.10.2": + version "3.10.2" + resolved "https://registry.yarnpkg.com/@docusaurus/plugin-css-cascade-layers/-/plugin-css-cascade-layers-3.10.2.tgz#54edc6450b0bb95be5990ea416b4c4dc5e6bdde0" + integrity sha512-UkdvQby5OQUKWrw3lLnSTJXQ6VETaUVTuPQX9AABtmFm5h+ifEBx1OQ+LN726Q4byuwBf2ElHkf4qU4hTxdvRg== dependencies: - "@docusaurus/core" "3.10.1" - "@docusaurus/types" "3.10.1" - "@docusaurus/utils" "3.10.1" - "@docusaurus/utils-validation" "3.10.1" + "@docusaurus/core" "3.10.2" + "@docusaurus/types" "3.10.2" + "@docusaurus/utils" "3.10.2" + "@docusaurus/utils-validation" "3.10.2" tslib "^2.6.0" -"@docusaurus/plugin-debug@3.10.1": - version "3.10.1" - resolved "https://registry.yarnpkg.com/@docusaurus/plugin-debug/-/plugin-debug-3.10.1.tgz#b8b7b24d9a7d185fd8a56a030f90145d3bfd8239" - integrity sha512-9KqOpKNfAyqGZykRb9LhIT/vyRF6sm/ykhjj/39JvaJahDS+jZJE0Z1Wfz9q3DUNDTMNN0Q7u/kk4rKKU+IJuA== +"@docusaurus/plugin-debug@3.10.2": + version "3.10.2" + resolved "https://registry.yarnpkg.com/@docusaurus/plugin-debug/-/plugin-debug-3.10.2.tgz#2452f258668bb2514085d2d5fff700457c531aad" + integrity sha512-8vbZNOSCpnsT57EY6CgN7sgRVmx3KTYwO8Uvo2pbxOyb8tbqAwtT9SslqaQ41HbA1v1hpn5RP7u5s2KvRwAFpQ== dependencies: - "@docusaurus/core" "3.10.1" - "@docusaurus/types" "3.10.1" - "@docusaurus/utils" "3.10.1" + "@docusaurus/core" "3.10.2" + "@docusaurus/types" "3.10.2" + "@docusaurus/utils" "3.10.2" fs-extra "^11.1.1" react-json-view-lite "^2.3.0" tslib "^2.6.0" -"@docusaurus/plugin-google-analytics@3.10.1": - version "3.10.1" - resolved "https://registry.yarnpkg.com/@docusaurus/plugin-google-analytics/-/plugin-google-analytics-3.10.1.tgz#ac15afc77386e0352edb8a1698d993aa5de36ffc" - integrity sha512-8o0P1KtmgdYQHH+oInitPpRWI0Of5XednAX4+DMhQNSmGSRNrsEEHg1ebv35m9AgRClfAytCJ5jA9KvcASTyuA== +"@docusaurus/plugin-google-analytics@3.10.2": + version "3.10.2" + resolved "https://registry.yarnpkg.com/@docusaurus/plugin-google-analytics/-/plugin-google-analytics-3.10.2.tgz#7a0375c5a238cd9220166d9be8afc00ba508c55d" + integrity sha512-kMHMBK9j4VAtgd5owwrRLRIi0EjkrpXlX7ePj1+y68XfVZV9I1T4S+koPDm+Hfw2TtnyHvh0uNrDvjz+DjQGVA== dependencies: - "@docusaurus/core" "3.10.1" - "@docusaurus/types" "3.10.1" - "@docusaurus/utils-validation" "3.10.1" + "@docusaurus/core" "3.10.2" + "@docusaurus/types" "3.10.2" + "@docusaurus/utils-validation" "3.10.2" tslib "^2.6.0" -"@docusaurus/plugin-google-gtag@3.10.1": - version "3.10.1" - resolved "https://registry.yarnpkg.com/@docusaurus/plugin-google-gtag/-/plugin-google-gtag-3.10.1.tgz#0482b83b9bc411aa99a432be2b39d2e53a00e2e0" - integrity sha512-pu3xIUo5o/zCMLfUY9BO5KOwSH0zIsAGyFRPvXHayFSA5XIhCU/SFuB0g0ZNjFn9niZLCaNvoeAuOGFJZq0fdw== +"@docusaurus/plugin-google-gtag@3.10.2": + version "3.10.2" + resolved "https://registry.yarnpkg.com/@docusaurus/plugin-google-gtag/-/plugin-google-gtag-3.10.2.tgz#65df25eb5fb3f2a3f2d0fba8ddd423060e09e1ca" + integrity sha512-Vt90nNFhtAChRe9+it1hcHFgFvETdSnOkL5Bma+p6E/yU2tAYrvvyk+gv+LJGM2ZUkyKuKXLRsZ2Lb0bO7+Vog== dependencies: - "@docusaurus/core" "3.10.1" - "@docusaurus/types" "3.10.1" - "@docusaurus/utils-validation" "3.10.1" - "@types/gtag.js" "^0.0.20" + "@docusaurus/core" "3.10.2" + "@docusaurus/types" "3.10.2" + "@docusaurus/utils-validation" "3.10.2" tslib "^2.6.0" -"@docusaurus/plugin-google-tag-manager@3.10.1": - version "3.10.1" - resolved "https://registry.yarnpkg.com/@docusaurus/plugin-google-tag-manager/-/plugin-google-tag-manager-3.10.1.tgz#eaf5765d6f82b4fb661d92a793d1883f9d1ec106" - integrity sha512-f6fyGHiCm7kJHBtAisGQS5oNBnpnMTYQZxDXeVrnw/3zWU+LMA22pr6UHGYkBKDbN+qPC5QHG3NuOfzQLq3+Lw== +"@docusaurus/plugin-google-tag-manager@3.10.2": + version "3.10.2" + resolved "https://registry.yarnpkg.com/@docusaurus/plugin-google-tag-manager/-/plugin-google-tag-manager-3.10.2.tgz#882a24e51dc42487d2c1d4f2cde3f59c99a276cb" + integrity sha512-MLCffCldysi/R0nzJQP7ZWd0xAoGNnSTiVOo6TTR6mKVGFhE+/XArGe67ZcaZv1uytgQXoXs92VJrgVDrz80rQ== dependencies: - "@docusaurus/core" "3.10.1" - "@docusaurus/types" "3.10.1" - "@docusaurus/utils-validation" "3.10.1" + "@docusaurus/core" "3.10.2" + "@docusaurus/types" "3.10.2" + "@docusaurus/utils-validation" "3.10.2" tslib "^2.6.0" -"@docusaurus/plugin-sitemap@3.10.1": - version "3.10.1" - resolved "https://registry.yarnpkg.com/@docusaurus/plugin-sitemap/-/plugin-sitemap-3.10.1.tgz#66a6974bb2fd1b9d8f5cb0f3c5ecd2201c118565" - integrity sha512-C26MbmmqgdjkDq1htaZ3aD7LzEDKFWXfpyQpt0EOUThuq5nV77zDaedV20yHcVo9p+3ey9aZ4pbHA0D3QcZTzg== +"@docusaurus/plugin-sitemap@3.10.2": + version "3.10.2" + resolved "https://registry.yarnpkg.com/@docusaurus/plugin-sitemap/-/plugin-sitemap-3.10.2.tgz#6c662c7df3bb7d36887f8b73f54d85dc4d36371d" + integrity sha512-PODkwg5XetLML3hU/3xpCKJUZ9cqExLaBnD/Fzzwj2VHogLeqnDisLIujae87zuze7T4mCm2A6KEqZkyiz07EQ== dependencies: - "@docusaurus/core" "3.10.1" - "@docusaurus/logger" "3.10.1" - "@docusaurus/types" "3.10.1" - "@docusaurus/utils" "3.10.1" - "@docusaurus/utils-common" "3.10.1" - "@docusaurus/utils-validation" "3.10.1" + "@docusaurus/core" "3.10.2" + "@docusaurus/logger" "3.10.2" + "@docusaurus/types" "3.10.2" + "@docusaurus/utils" "3.10.2" + "@docusaurus/utils-common" "3.10.2" + "@docusaurus/utils-validation" "3.10.2" fs-extra "^11.1.1" sitemap "^7.1.1" tslib "^2.6.0" -"@docusaurus/plugin-svgr@3.10.1": - version "3.10.1" - resolved "https://registry.yarnpkg.com/@docusaurus/plugin-svgr/-/plugin-svgr-3.10.1.tgz#c217c24d6d23fd2bc6f54d44c040635b49d6b36e" - integrity sha512-6SFxsmjWFkVLDmBUvFK6i72QjUwqyQFe4Ovz+SUJophJjOyVG3ZZG5IQpBC/kX/Gfv1yWeU9nWauH6F6Q7QX/Q== +"@docusaurus/plugin-svgr@3.10.2": + version "3.10.2" + resolved "https://registry.yarnpkg.com/@docusaurus/plugin-svgr/-/plugin-svgr-3.10.2.tgz#916fd0a5d39bf73cb621de9789cce243a7ef1754" + integrity sha512-JgfT3jWM0TJ8Uw0cEcqxHpybngQY1vlBYpuuNO+gEh5iPh5Ar+vxq/u9CFrYsWeXy48BN7Db76Pzp2edNXUQ8A== dependencies: - "@docusaurus/core" "3.10.1" - "@docusaurus/types" "3.10.1" - "@docusaurus/utils" "3.10.1" - "@docusaurus/utils-validation" "3.10.1" + "@docusaurus/core" "3.10.2" + "@docusaurus/types" "3.10.2" + "@docusaurus/utils" "3.10.2" + "@docusaurus/utils-validation" "3.10.2" "@svgr/core" "8.1.0" "@svgr/webpack" "^8.1.0" tslib "^2.6.0" webpack "^5.88.1" -"@docusaurus/preset-classic@3.10.1": - version "3.10.1" - resolved "https://registry.yarnpkg.com/@docusaurus/preset-classic/-/preset-classic-3.10.1.tgz#faf330d96aedc9083a59bec09d966ae4dfc8b2fb" - integrity sha512-YO/FL8v1zmbxoTso6mjMz/RDjhaTJxb1UpFFTDdY5847LLDCeyYiYlrhyTbgN1RIN3xnkLKZ9Lj1x8hUzI4JOg== +"@docusaurus/preset-classic@3.10.2": + version "3.10.2" + resolved "https://registry.yarnpkg.com/@docusaurus/preset-classic/-/preset-classic-3.10.2.tgz#e4419c811723ab913a946c63efcc15e7f5f60a0a" + integrity sha512-a4B3VczmDl99zK0EufDQYomdJ186WDingjmDXxhN2PNPS9Ty/Y2M5CLFX1KQMRKqRTLiRDKfutzG5IY1FC/ceg== dependencies: - "@docusaurus/core" "3.10.1" - "@docusaurus/plugin-content-blog" "3.10.1" - "@docusaurus/plugin-content-docs" "3.10.1" - "@docusaurus/plugin-content-pages" "3.10.1" - "@docusaurus/plugin-css-cascade-layers" "3.10.1" - "@docusaurus/plugin-debug" "3.10.1" - "@docusaurus/plugin-google-analytics" "3.10.1" - "@docusaurus/plugin-google-gtag" "3.10.1" - "@docusaurus/plugin-google-tag-manager" "3.10.1" - "@docusaurus/plugin-sitemap" "3.10.1" - "@docusaurus/plugin-svgr" "3.10.1" - "@docusaurus/theme-classic" "3.10.1" - "@docusaurus/theme-common" "3.10.1" - "@docusaurus/theme-search-algolia" "3.10.1" - "@docusaurus/types" "3.10.1" + "@docusaurus/core" "3.10.2" + "@docusaurus/plugin-content-blog" "3.10.2" + "@docusaurus/plugin-content-docs" "3.10.2" + "@docusaurus/plugin-content-pages" "3.10.2" + "@docusaurus/plugin-css-cascade-layers" "3.10.2" + "@docusaurus/plugin-debug" "3.10.2" + "@docusaurus/plugin-google-analytics" "3.10.2" + "@docusaurus/plugin-google-gtag" "3.10.2" + "@docusaurus/plugin-google-tag-manager" "3.10.2" + "@docusaurus/plugin-sitemap" "3.10.2" + "@docusaurus/plugin-svgr" "3.10.2" + "@docusaurus/theme-classic" "3.10.2" + "@docusaurus/theme-common" "3.10.2" + "@docusaurus/theme-search-algolia" "3.10.2" + "@docusaurus/types" "3.10.2" -"@docusaurus/theme-classic@3.10.1": - version "3.10.1" - resolved "https://registry.yarnpkg.com/@docusaurus/theme-classic/-/theme-classic-3.10.1.tgz#deed8cf73cc0f56113e53775cbb3b168c3c61566" - integrity sha512-VU1RK0qb2pab0si4r7HFK37cYco8VzqLj3u1PspVipSr/z/GPVKHO4/HXbnePqHoWDk8urjyGSeatH0NIMBM1A== +"@docusaurus/theme-classic@3.10.2": + version "3.10.2" + resolved "https://registry.yarnpkg.com/@docusaurus/theme-classic/-/theme-classic-3.10.2.tgz#a64bd600c789b33c67c30c256b07e2ca0f57e2ae" + integrity sha512-JqTSLQmqmA9uKWZsD5iwBGJ4JyKB4/yTw6PsSXVPRJG/6GAm/u+add9Iip+hvwP12/AnPNztrdxsI14NJW4KeA== dependencies: - "@docusaurus/core" "3.10.1" - "@docusaurus/logger" "3.10.1" - "@docusaurus/mdx-loader" "3.10.1" - "@docusaurus/module-type-aliases" "3.10.1" - "@docusaurus/plugin-content-blog" "3.10.1" - "@docusaurus/plugin-content-docs" "3.10.1" - "@docusaurus/plugin-content-pages" "3.10.1" - "@docusaurus/theme-common" "3.10.1" - "@docusaurus/theme-translations" "3.10.1" - "@docusaurus/types" "3.10.1" - "@docusaurus/utils" "3.10.1" - "@docusaurus/utils-common" "3.10.1" - "@docusaurus/utils-validation" "3.10.1" + "@docusaurus/core" "3.10.2" + "@docusaurus/logger" "3.10.2" + "@docusaurus/mdx-loader" "3.10.2" + "@docusaurus/module-type-aliases" "3.10.2" + "@docusaurus/plugin-content-blog" "3.10.2" + "@docusaurus/plugin-content-docs" "3.10.2" + "@docusaurus/plugin-content-pages" "3.10.2" + "@docusaurus/theme-common" "3.10.2" + "@docusaurus/theme-translations" "3.10.2" + "@docusaurus/types" "3.10.2" + "@docusaurus/utils" "3.10.2" + "@docusaurus/utils-common" "3.10.2" + "@docusaurus/utils-validation" "3.10.2" "@mdx-js/react" "^3.0.0" clsx "^2.0.0" copy-text-to-clipboard "^3.2.0" @@ -1857,15 +1866,15 @@ tslib "^2.6.0" utility-types "^3.10.0" -"@docusaurus/theme-common@3.10.1": - version "3.10.1" - resolved "https://registry.yarnpkg.com/@docusaurus/theme-common/-/theme-common-3.10.1.tgz#cbfec82b1b107be5c229811ed9caae14a501361c" - integrity sha512-0YtmIeoNo1fIw65LO8+/1dPgmDV86UmhMkow37gzjytuiCSQm9xob6PJy0L4kuQEMTLfUOGvkXvZr7GPrHquMA== +"@docusaurus/theme-common@3.10.2": + version "3.10.2" + resolved "https://registry.yarnpkg.com/@docusaurus/theme-common/-/theme-common-3.10.2.tgz#5cf2a8b76554b8b38c6afe8448470c411f683e5b" + integrity sha512-R9b/vMpK1yye6hNZTA6x/ivRv+at6GhxnXcxkpzCGzO1R1RwiquqiFg2wMFh6aqlJTpWRFKpFD2TzCDQcyOU0A== dependencies: - "@docusaurus/mdx-loader" "3.10.1" - "@docusaurus/module-type-aliases" "3.10.1" - "@docusaurus/utils" "3.10.1" - "@docusaurus/utils-common" "3.10.1" + "@docusaurus/mdx-loader" "3.10.2" + "@docusaurus/module-type-aliases" "3.10.2" + "@docusaurus/utils" "3.10.2" + "@docusaurus/utils-common" "3.10.2" "@types/history" "^4.7.11" "@types/react" "*" "@types/react-router-config" "*" @@ -1875,20 +1884,20 @@ tslib "^2.6.0" utility-types "^3.10.0" -"@docusaurus/theme-search-algolia@3.10.1": - version "3.10.1" - resolved "https://registry.yarnpkg.com/@docusaurus/theme-search-algolia/-/theme-search-algolia-3.10.1.tgz#6f422058711629ce8d7c2f17e1e54efa075c626e" - integrity sha512-OTaARARVZj2GvkJQjB+1jOIxntRaXea+G+fMsNqrZBAU1O1vJKDW22R7kECOHW27oJCLFN9HKaZeRrfAUyviug== +"@docusaurus/theme-search-algolia@3.10.2": + version "3.10.2" + resolved "https://registry.yarnpkg.com/@docusaurus/theme-search-algolia/-/theme-search-algolia-3.10.2.tgz#e7756d4088a7df4d11fd734bfe0e8fa28ceac1dd" + integrity sha512-1msxllyhi/5m77JukXtp5UFnUAriwZIC1oJ7MTnpQpCwLTbclJi5BK5n28CTZuSXpQN2ewbbnqRgAhMM6c6ihg== dependencies: "@algolia/autocomplete-core" "^1.19.2" "@docsearch/react" "^3.9.0 || ^4.3.2" - "@docusaurus/core" "3.10.1" - "@docusaurus/logger" "3.10.1" - "@docusaurus/plugin-content-docs" "3.10.1" - "@docusaurus/theme-common" "3.10.1" - "@docusaurus/theme-translations" "3.10.1" - "@docusaurus/utils" "3.10.1" - "@docusaurus/utils-validation" "3.10.1" + "@docusaurus/core" "3.10.2" + "@docusaurus/logger" "3.10.2" + "@docusaurus/plugin-content-docs" "3.10.2" + "@docusaurus/theme-common" "3.10.2" + "@docusaurus/theme-translations" "3.10.2" + "@docusaurus/utils" "3.10.2" + "@docusaurus/utils-validation" "3.10.2" algoliasearch "^5.37.0" algoliasearch-helper "^3.26.0" clsx "^2.0.0" @@ -1898,23 +1907,23 @@ tslib "^2.6.0" utility-types "^3.10.0" -"@docusaurus/theme-translations@3.10.1", "@docusaurus/theme-translations@^2 || ^3": - version "3.10.1" - resolved "https://registry.yarnpkg.com/@docusaurus/theme-translations/-/theme-translations-3.10.1.tgz#c3119a015652290eea560ca45ac775963d6eb75b" - integrity sha512-cLMyaKivjBVWKMJuWqyFVVgtqe8DPJNPkog0bn8W1MDVAKcPdxRFycBfC1We1RaNp7Rdk513bmtW78RR6OBxBw== +"@docusaurus/theme-translations@3.10.2", "@docusaurus/theme-translations@^2 || ^3": + version "3.10.2" + resolved "https://registry.yarnpkg.com/@docusaurus/theme-translations/-/theme-translations-3.10.2.tgz#cd649083babd12df324e7129008aaccacd4cfb13" + integrity sha512-iv20wrxnyXkY89LM3TzRlzGlt5fIGO5UnaR6UL1ZVfB9RRFjxQFQ6awDrwAc6Km8Y5gD8pInuwYPF+6/TiCxXA== dependencies: fs-extra "^11.1.1" tslib "^2.6.0" -"@docusaurus/tsconfig@3.10.1": - version "3.10.1" - resolved "https://registry.yarnpkg.com/@docusaurus/tsconfig/-/tsconfig-3.10.1.tgz#1db31b4a4a5c914bdffa80070a35b6365d34f2e8" - integrity sha512-rYvB7yqkdqWIpAbDzQljGfM4cDBkLTbhmagZBEcsyj6oPUsz47lmW2pYdN1j+7sGFgltbAmQH62xfbrij4Eh6Q== +"@docusaurus/tsconfig@3.10.2": + version "3.10.2" + resolved "https://registry.yarnpkg.com/@docusaurus/tsconfig/-/tsconfig-3.10.2.tgz#0ad085ebf2900391632e2d56635d94c4283efffb" + integrity sha512-5GiB7h/nFsMFPO9mCqcRNE1yA5TSXXNCshNIgHPL6fCPOjcTDixs6qjQBu8ddkgPcicwCvOA7n3jeK2rGdJk6g== -"@docusaurus/types@3.10.1": - version "3.10.1" - resolved "https://registry.yarnpkg.com/@docusaurus/types/-/types-3.10.1.tgz#d42837938ae43ca2be0ca47e63e00476b5eb94be" - integrity sha512-XYMK8k1szDCFMw2V+Xyen0g7Kee1sP3dtFnl7vkGkZOkeAJ/oPDQPL8iz4HBKOo/cwU8QeV6onVjMqtP+tFzsw== +"@docusaurus/types@3.10.2": + version "3.10.2" + resolved "https://registry.yarnpkg.com/@docusaurus/types/-/types-3.10.2.tgz#9ffe35adfb4587e49158ee9e10d94b86419a5932" + integrity sha512-B6rvfwIFSapUqUJjMriZswX13K8l5Z7AcmVE6uTEJpYddQieSTR12DsGaFtcZAIDsQd4p+0WTl0Vc6jmZK0Trw== dependencies: "@mdx-js/mdx" "^3.0.0" "@types/history" "^4.7.11" @@ -1927,43 +1936,43 @@ webpack "^5.95.0" webpack-merge "^5.9.0" -"@docusaurus/utils-common@3.10.1", "@docusaurus/utils-common@^2 || ^3": - version "3.10.1" - resolved "https://registry.yarnpkg.com/@docusaurus/utils-common/-/utils-common-3.10.1.tgz#6350b4898691e765de750f90eade0e0fa7902d99" - integrity sha512-5mFSgEADtnFxFH7RLw02QA5MpU5JVUCj0MPeIvi/aF4Fi45tQRIuTwXoXDqJ+1VfQJuYJGz3SI63wmGz4HvXzA== +"@docusaurus/utils-common@3.10.2", "@docusaurus/utils-common@^2 || ^3": + version "3.10.2" + resolved "https://registry.yarnpkg.com/@docusaurus/utils-common/-/utils-common-3.10.2.tgz#a65fcfffafa4e15a59fe61d7ba315ee5d4c49269" + integrity sha512-x3Dz6jv6iQKBNjBmVTu8p57abMp/VNTUgKBMgRVXJc5444orBTsArv0+cdfrXTiz/VMmHfDRVkPbL7GH2B7T7w== dependencies: - "@docusaurus/types" "3.10.1" + "@docusaurus/types" "3.10.2" tslib "^2.6.0" -"@docusaurus/utils-validation@3.10.1", "@docusaurus/utils-validation@^2 || ^3": - version "3.10.1" - resolved "https://registry.yarnpkg.com/@docusaurus/utils-validation/-/utils-validation-3.10.1.tgz#ddbcce997a5506424cdd16abf6845cc51692acae" - integrity sha512-cRv1X69jwaWv47waglllgZVWzeBFLhl53XT/XED/83BerVBTC5FTP8WTcVl8Z6sZOegDSwitu/wpCSPCDOT6lg== +"@docusaurus/utils-validation@3.10.2", "@docusaurus/utils-validation@^2 || ^3": + version "3.10.2" + resolved "https://registry.yarnpkg.com/@docusaurus/utils-validation/-/utils-validation-3.10.2.tgz#2624b0ca6675675da2f063828115b43c9a22de47" + integrity sha512-sn8unbDfUL585NtR3cwHefPicOyaHvPaX7VD0aOg/siIxUBoKyKKaGEqzJZDS64mM43TnxurkYDtmB1wsJlZsw== dependencies: - "@docusaurus/logger" "3.10.1" - "@docusaurus/utils" "3.10.1" - "@docusaurus/utils-common" "3.10.1" + "@docusaurus/logger" "3.10.2" + "@docusaurus/utils" "3.10.2" + "@docusaurus/utils-common" "3.10.2" fs-extra "^11.2.0" joi "^17.9.2" js-yaml "^4.1.0" lodash "^4.17.21" tslib "^2.6.0" -"@docusaurus/utils@3.10.1", "@docusaurus/utils@^2 || ^3": - version "3.10.1" - resolved "https://registry.yarnpkg.com/@docusaurus/utils/-/utils-3.10.1.tgz#535968caa2c9bff69f997a081b98b95b3c5d3785" - integrity sha512-3ojeJry9xBYdJO6qoyyzqeJFSJBVx2mXhyDzSdjwL2+URFQMf+h25gG38iswGImicK0ELjTd1EL2xzk8hf3QPw== +"@docusaurus/utils@3.10.2", "@docusaurus/utils@^2 || ^3": + version "3.10.2" + resolved "https://registry.yarnpkg.com/@docusaurus/utils/-/utils-3.10.2.tgz#d99c1ffc5c7961e912344269a8728ce2aad8b3dc" + integrity sha512-xx0W3eav2uW1NRIpuHJWNwLTC15xPNjU4Uxi9NSnd3swYC96BE3vFiT93SD8s24kmAAWNwgZwfZ2fghGZ01Lcw== dependencies: - "@docusaurus/logger" "3.10.1" - "@docusaurus/types" "3.10.1" - "@docusaurus/utils-common" "3.10.1" + "@11ty/gray-matter" "^1.0.0" + "@docusaurus/logger" "3.10.2" + "@docusaurus/types" "3.10.2" + "@docusaurus/utils-common" "3.10.2" escape-string-regexp "^4.0.0" execa "^5.1.1" file-loader "^6.2.0" fs-extra "^11.1.1" github-slugger "^1.5.0" globby "^11.1.0" - gray-matter "^4.0.3" jiti "^1.20.0" js-yaml "^4.1.0" lodash "^4.17.21" @@ -1985,9 +1994,9 @@ immediate "^3.2.3" "@easyops-cn/docusaurus-search-local@^0.55.0": - version "0.55.1" - resolved "https://registry.yarnpkg.com/@easyops-cn/docusaurus-search-local/-/docusaurus-search-local-0.55.1.tgz#a0ee40e598c10138d328db04183584b51a8cb0d3" - integrity sha512-jmBKj1J+tajqNrCvECwKCQYTWwHVZDGApy8lLOYEPe+Dm0/f3Ccdw8BP5/OHNpltr7WDNY2roQXn+TWn2f1kig== + version "0.55.3" + resolved "https://registry.yarnpkg.com/@easyops-cn/docusaurus-search-local/-/docusaurus-search-local-0.55.3.tgz#4beba8939a630a5fe4b37fd83bb41beca9923809" + integrity sha512-PlMKmxuonvZ1C+/zJS1hJaF1xaxD1TsUvOMzpP6DdQMtZqmTaYjcLGM12ePzl0m1rp3AgfTBeDbFNHQhwnH/dA== dependencies: "@docusaurus/plugin-content-docs" "^2 || ^3" "@docusaurus/theme-translations" "^2 || ^3" @@ -2008,24 +2017,24 @@ tslib "^2.4.0" "@emnapi/core@^1.4.3": - version "1.10.0" - resolved "https://registry.yarnpkg.com/@emnapi/core/-/core-1.10.0.tgz#380ccc8f2412ea22d1d972df7f8ee23a3b9c7467" - integrity sha512-yq6OkJ4p82CAfPl0u9mQebQHKPJkY7WrIuk205cTYnYe+k2Z8YBh11FrbRG/H6ihirqcacOgl2BIO8oyMQLeXw== + version "1.11.3" + resolved "https://registry.yarnpkg.com/@emnapi/core/-/core-1.11.3.tgz#5e95348a42cd1e06f0b9aa380cd74091daa4d520" + integrity sha512-zLpS5asjEb7lq8jYLq37N6XKaE41DIexlY1rF/z4/tIl3wo13Sqm28fRyfIsKZD+NZ8mM5RoKkpW/rBcuoSZSg== dependencies: - "@emnapi/wasi-threads" "1.2.1" + "@emnapi/wasi-threads" "1.2.3" tslib "^2.4.0" "@emnapi/runtime@^1.4.3": - version "1.10.0" - resolved "https://registry.yarnpkg.com/@emnapi/runtime/-/runtime-1.10.0.tgz#4b260c0d3534204e98c6110b8db1a987d26ec87c" - integrity sha512-ewvYlk86xUoGI0zQRNq/mC+16R1QeDlKQy21Ki3oSYXNgLb45GV1P6A0M+/s6nyCuNDqe5VpaY84BzXGwVbwFA== + version "1.11.3" + resolved "https://registry.yarnpkg.com/@emnapi/runtime/-/runtime-1.11.3.tgz#84257ae3b0531eb2aec1ffa23d70700da007ba95" + integrity sha512-Xz4Tpyki7XyrpbUK1jR1AhdAdaXyhhY4lZ3neLodmhpuWfy2PAQN5B46sAiU4liOXGLkHypn/qU+jvfWSCYYLA== dependencies: tslib "^2.4.0" -"@emnapi/wasi-threads@1.2.1": - version "1.2.1" - resolved "https://registry.yarnpkg.com/@emnapi/wasi-threads/-/wasi-threads-1.2.1.tgz#28fed21a1ba1ce797c44a070abc94d42f3ae8548" - integrity sha512-uTII7OYF+/Mes/MrcIOYp5yOtSMLBWSIoLPpcgwipoiKbli6k322tcoFsxoIIxPDqW01SQGAgko4EzZi2BNv2w== +"@emnapi/wasi-threads@1.2.3": + version "1.2.3" + resolved "https://registry.yarnpkg.com/@emnapi/wasi-threads/-/wasi-threads-1.2.3.tgz#c9bf72fd4be5b928aee894820e8d814ed73916e9" + integrity sha512-ELEBe8PsLvvJ6QMr0zLt8ffvOHW/dc1m3CEzNMg7aJUv3bMaoDtw2TXyDAwkYBuroxxuHEwhRTLJSe5sya547g== dependencies: tslib "^2.4.0" @@ -2090,11 +2099,11 @@ "@jridgewell/trace-mapping" "^0.3.25" "@jridgewell/sourcemap-codec@^1.4.14", "@jridgewell/sourcemap-codec@^1.5.0": - version "1.5.5" - resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz#6912b00d2c631c0d15ce1a7ab57cd657f2a8f8ba" - integrity sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og== + version "1.6.0" + resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.6.0.tgz#f4c663e862f06dc98ca4d453862c46902789a18d" + integrity sha512-T7jf+5zgsZHwNJ4lvQ7/aezbyk0nNX+zJVWpmHA7VYsEx7a7qr5Rg5IbtJFqkgze5Y2sruq1RUY8Q837Od7iFw== -"@jridgewell/trace-mapping@^0.3.18", "@jridgewell/trace-mapping@^0.3.24", "@jridgewell/trace-mapping@^0.3.25", "@jridgewell/trace-mapping@^0.3.28": +"@jridgewell/trace-mapping@^0.3.18", "@jridgewell/trace-mapping@^0.3.24", "@jridgewell/trace-mapping@^0.3.25", "@jridgewell/trace-mapping@^0.3.28", "@jridgewell/trace-mapping@^0.3.31": version "0.3.31" resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz#db15d6781c931f3a251a3dac39501c98a6082fd0" integrity sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw== @@ -2132,74 +2141,75 @@ resolved "https://registry.yarnpkg.com/@jsonjoy.com/codegen/-/codegen-1.0.0.tgz#5c23f796c47675f166d23b948cdb889184b93207" integrity sha512-E8Oy+08cmCf0EK/NMxpaJZmOxPqM+6iSe2S4nlSBrPZOORoDJILxtbSUEDKQyTamm/BVAhIGllOBNU79/dwf0g== -"@jsonjoy.com/fs-core@4.57.2": - version "4.57.2" - resolved "https://registry.yarnpkg.com/@jsonjoy.com/fs-core/-/fs-core-4.57.2.tgz#e28f357ba9983ce53577ba34fc72d344f19ec459" - integrity sha512-SVjwklkpIV5wrynpYtuYnfYH1QF4/nDuLBX7VXdb+3miglcAgBVZb/5y0cOsehRV/9Vb+3UqhkMq3/NR3ztdkQ== +"@jsonjoy.com/fs-core@4.68.2": + version "4.68.2" + resolved "https://registry.yarnpkg.com/@jsonjoy.com/fs-core/-/fs-core-4.68.2.tgz#ea3e3e3e07e0d808844ba7ee908dd47ad121eddf" + integrity sha512-PoBeUNEbjyLKKwCap2z8LkkqdhdfttS4rTHCALVuP65BdF+sAoyBqHo1m+uGTRBiQWv3H7MGfr8f7lY4pDwanw== dependencies: - "@jsonjoy.com/fs-node-builtins" "4.57.2" - "@jsonjoy.com/fs-node-utils" "4.57.2" + "@jsonjoy.com/fs-node-builtins" "4.68.2" + "@jsonjoy.com/fs-node-utils" "4.68.2" thingies "^2.5.0" -"@jsonjoy.com/fs-fsa@4.57.2": - version "4.57.2" - resolved "https://registry.yarnpkg.com/@jsonjoy.com/fs-fsa/-/fs-fsa-4.57.2.tgz#ec6dd492ff8c104a0c1eae74959a013960fe8969" - integrity sha512-fhO8+iR2I+OCw668ISDJdn1aArc9zx033sWejIyzQ8RBeXa9bDSaUeA3ix0poYOfrj1KdOzytmYNv2/uLDfV6g== +"@jsonjoy.com/fs-fsa@4.68.2": + version "4.68.2" + resolved "https://registry.yarnpkg.com/@jsonjoy.com/fs-fsa/-/fs-fsa-4.68.2.tgz#01d59e3bedb3cfe4b32334abbb1004a75b481a76" + integrity sha512-h6eGXlLGGMyPfNliDQrbuHKTB9Z29ksCLjreAmdBqrDOBdfrTrHssi+b9WLfrF+J2KzAbIt9OMjJu6AEpTnYkg== dependencies: - "@jsonjoy.com/fs-core" "4.57.2" - "@jsonjoy.com/fs-node-builtins" "4.57.2" - "@jsonjoy.com/fs-node-utils" "4.57.2" + "@jsonjoy.com/fs-core" "4.68.2" + "@jsonjoy.com/fs-node-builtins" "4.68.2" + "@jsonjoy.com/fs-node-utils" "4.68.2" thingies "^2.5.0" -"@jsonjoy.com/fs-node-builtins@4.57.2": - version "4.57.2" - resolved "https://registry.yarnpkg.com/@jsonjoy.com/fs-node-builtins/-/fs-node-builtins-4.57.2.tgz#9174b87e70213b38caf1ac8669b130c4dfd6a909" - integrity sha512-xhiegylRmhw43Ki2HO1ZBL7DQ5ja/qpRsL29VtQ2xuUHiuDGbgf2uD4p9Qd8hJI5P6RCtGYD50IXHXVq/Ocjcg== +"@jsonjoy.com/fs-node-builtins@4.68.2": + version "4.68.2" + resolved "https://registry.yarnpkg.com/@jsonjoy.com/fs-node-builtins/-/fs-node-builtins-4.68.2.tgz#ef82d558a6894b54537857ba153daa38a5326a05" + integrity sha512-V8WzQsW2YIrH3RxBGY6HZisxn+dDUltHgksVRuCdPEOXEkAfXuhL/01eHFrabNu84Dn13XuLqvcQUKOYVKAUOA== -"@jsonjoy.com/fs-node-to-fsa@4.57.2": - version "4.57.2" - resolved "https://registry.yarnpkg.com/@jsonjoy.com/fs-node-to-fsa/-/fs-node-to-fsa-4.57.2.tgz#8542449b72dfc48f3bfe311a7b0af5323f9bc926" - integrity sha512-18LmWTSONhoAPW+IWRuf8w/+zRolPFGPeGwMxlAhhfY11EKzX+5XHDBPAw67dBF5dxDErHJbl40U+3IXSDRXSQ== +"@jsonjoy.com/fs-node-to-fsa@4.68.2": + version "4.68.2" + resolved "https://registry.yarnpkg.com/@jsonjoy.com/fs-node-to-fsa/-/fs-node-to-fsa-4.68.2.tgz#faf01a277752868d90681f6dcb86d3e01f05a296" + integrity sha512-4O1K4w5G4oJIpKpoa3WSLG83AsQYVnGv+aUSBGOvIUph9Axm6bB1mPlvldkNg2tBx/4dkiTlZnqNrK5SQ21Wtg== dependencies: - "@jsonjoy.com/fs-fsa" "4.57.2" - "@jsonjoy.com/fs-node-builtins" "4.57.2" - "@jsonjoy.com/fs-node-utils" "4.57.2" + "@jsonjoy.com/fs-fsa" "4.68.2" + "@jsonjoy.com/fs-node-builtins" "4.68.2" + "@jsonjoy.com/fs-node-utils" "4.68.2" -"@jsonjoy.com/fs-node-utils@4.57.2": - version "4.57.2" - resolved "https://registry.yarnpkg.com/@jsonjoy.com/fs-node-utils/-/fs-node-utils-4.57.2.tgz#c3234c03b1e59d609a0915572dd6f450be0463b1" - integrity sha512-rsPSJgekz43IlNbLyAM/Ab+ouYLWGp5DDBfYBNNEqDaSpsbXfthBn29Q4muFA9L0F+Z3mKo+CWlgSCXrf+mOyQ== +"@jsonjoy.com/fs-node-utils@4.68.2": + version "4.68.2" + resolved "https://registry.yarnpkg.com/@jsonjoy.com/fs-node-utils/-/fs-node-utils-4.68.2.tgz#78311a84df4e4edc51f8e41fc042d3eed21cb0d4" + integrity sha512-CxFwyG9fJr7dAKAd1uanNRNrRMtDDqbYJA8do53+M4LY7SxcBEEmMjC1zi9MOsBlVLHTXvA7OP9+n639UqtIcw== dependencies: - "@jsonjoy.com/fs-node-builtins" "4.57.2" + "@jsonjoy.com/fs-node-builtins" "4.68.2" + glob-to-regex.js "^1.0.1" -"@jsonjoy.com/fs-node@4.57.2": - version "4.57.2" - resolved "https://registry.yarnpkg.com/@jsonjoy.com/fs-node/-/fs-node-4.57.2.tgz#8db2875df19683683e5852053e0099e233dc45d2" - integrity sha512-nX2AdL6cOFwLdju9G4/nbRnYevmCJbh7N7hvR3gGm97Cs60uEjyd0rpR+YBS7cTg175zzl22pGKXR5USaQMvKg== +"@jsonjoy.com/fs-node@4.68.2": + version "4.68.2" + resolved "https://registry.yarnpkg.com/@jsonjoy.com/fs-node/-/fs-node-4.68.2.tgz#166b641f7c810e12cbf92c483e9c7084123ed669" + integrity sha512-Kpj519Qk4OXG4+mZ8vTf9BEflliJrPueIDEVcbx8tAOufMJJ8IxR0WwdbcEvJol2KQog3PJjtALXVclorE+xbQ== dependencies: - "@jsonjoy.com/fs-core" "4.57.2" - "@jsonjoy.com/fs-node-builtins" "4.57.2" - "@jsonjoy.com/fs-node-utils" "4.57.2" - "@jsonjoy.com/fs-print" "4.57.2" - "@jsonjoy.com/fs-snapshot" "4.57.2" + "@jsonjoy.com/fs-core" "4.68.2" + "@jsonjoy.com/fs-node-builtins" "4.68.2" + "@jsonjoy.com/fs-node-utils" "4.68.2" + "@jsonjoy.com/fs-print" "4.68.2" + "@jsonjoy.com/fs-snapshot" "4.68.2" glob-to-regex.js "^1.0.0" thingies "^2.5.0" -"@jsonjoy.com/fs-print@4.57.2": - version "4.57.2" - resolved "https://registry.yarnpkg.com/@jsonjoy.com/fs-print/-/fs-print-4.57.2.tgz#286c4ceda19225a5c54aaad657ad9f466d5bd0c1" - integrity sha512-wK9NSow48i4DbDl9F1CQE5TqnyZOJ04elU3WFG5aJ76p+YxO/ulyBBQvKsessPxdo381Bc2pcEoyPujMOhcRqQ== +"@jsonjoy.com/fs-print@4.68.2": + version "4.68.2" + resolved "https://registry.yarnpkg.com/@jsonjoy.com/fs-print/-/fs-print-4.68.2.tgz#1562c2481393359644e2840c25a5082274378f39" + integrity sha512-cBABQmZJXig6bahwNka3+yPNGUF1GeMWbR76ZM1N2ajgCd+S+twZigCoe9+0ueZmkhM9xd2a7688Gy/ch7T+2w== dependencies: - "@jsonjoy.com/fs-node-utils" "4.57.2" + "@jsonjoy.com/fs-node-utils" "4.68.2" tree-dump "^1.1.0" -"@jsonjoy.com/fs-snapshot@4.57.2": - version "4.57.2" - resolved "https://registry.yarnpkg.com/@jsonjoy.com/fs-snapshot/-/fs-snapshot-4.57.2.tgz#800424a076638a605dad5ef1540915bc0167d7f8" - integrity sha512-GdduDZuoP5V/QCgJkx9+BZ6SC0EZ/smXAdTS7PfMqgMTGXLlt/bH/FqMYaqB9JmLf05sJPtO0XRbAwwkEEPbVw== +"@jsonjoy.com/fs-snapshot@4.68.2": + version "4.68.2" + resolved "https://registry.yarnpkg.com/@jsonjoy.com/fs-snapshot/-/fs-snapshot-4.68.2.tgz#6f1b2e5aa6827a1075f82162055ca8bedee0fe58" + integrity sha512-Aix7+NM38LzvewM0T3PICSgFdF5BVCtVgsjNsrlDPGc9hiMgJzReTDDl2/elgl0A9USMl3QP27x5WwxZSOtrfw== dependencies: "@jsonjoy.com/buffers" "^17.65.0" - "@jsonjoy.com/fs-node-utils" "4.57.2" + "@jsonjoy.com/fs-node-utils" "4.68.2" "@jsonjoy.com/json-pack" "^17.65.0" "@jsonjoy.com/util" "^17.65.0" @@ -2432,110 +2442,110 @@ "@nodelib/fs.scandir" "2.1.5" fastq "^1.6.0" -"@peculiar/asn1-cms@^2.6.0", "@peculiar/asn1-cms@^2.7.0": - version "2.7.0" - resolved "https://registry.yarnpkg.com/@peculiar/asn1-cms/-/asn1-cms-2.7.0.tgz#8e0eb656f4fc85f7c621dd442fa2d298faa84984" - integrity sha512-hew63shtzzvBcSHbhm+cyAmKe6AIfinT9hzEqSPjDC6opTTMKmTkQ0gHuN2KsWlvqiKw1S/fS94fhag/FJkioQ== +"@peculiar/asn1-cms@^2.6.0", "@peculiar/asn1-cms@^2.9.4": + version "2.9.4" + resolved "https://registry.yarnpkg.com/@peculiar/asn1-cms/-/asn1-cms-2.9.4.tgz#1c0b42ba5dcbaf8e1e060a1e76cd2442affbc37c" + integrity sha512-cben7oxmQsUGZqotus7yt0srYdncOT6RNWcTQ77T2RFOXejYVYkXadrfePdRcrVpO9K95IRLKKglG2k38jKXuw== dependencies: - "@peculiar/asn1-schema" "^2.7.0" - "@peculiar/asn1-x509" "^2.7.0" - "@peculiar/asn1-x509-attr" "^2.7.0" - asn1js "^3.0.6" + "@peculiar/asn1-schema" "^2.9.4" + "@peculiar/asn1-x509" "^2.9.4" + "@peculiar/asn1-x509-attr" "^2.9.4" + asn1js "^3.0.10" tslib "^2.8.1" "@peculiar/asn1-csr@^2.6.0": - version "2.7.0" - resolved "https://registry.yarnpkg.com/@peculiar/asn1-csr/-/asn1-csr-2.7.0.tgz#1a03ac03f7571ea981f5d8377c6f4510c5d43411" - integrity sha512-VVsAyGqErT9D1SY4aEqozThXMVI+ssVRiv2DDeYuvpBKLIgZ3hYs3Ay3u/VSoKq6ESFi9cf6rf3IOOzfwh7oMA== + version "2.9.4" + resolved "https://registry.yarnpkg.com/@peculiar/asn1-csr/-/asn1-csr-2.9.4.tgz#d306964f97bd7eb4edc6e3dc5e5ac87b2414e858" + integrity sha512-xd4YN4vpRjkDAQWVfZZkeu12IEND7DOpkqaHSIHxZl1uggUNa9Ju0QxY2jHvDAS9pP0zhRBytg8ifsnGo3V0jw== dependencies: - "@peculiar/asn1-schema" "^2.7.0" - "@peculiar/asn1-x509" "^2.7.0" - asn1js "^3.0.6" + "@peculiar/asn1-schema" "^2.9.4" + "@peculiar/asn1-x509" "^2.9.4" + asn1js "^3.0.10" tslib "^2.8.1" "@peculiar/asn1-ecc@^2.6.0": - version "2.7.0" - resolved "https://registry.yarnpkg.com/@peculiar/asn1-ecc/-/asn1-ecc-2.7.0.tgz#c35b57859812ecd0c2ae7b2144855e8208c2cfee" - integrity sha512-n7KEs/Q/wrB415cxy4fHOBhegp4NdJ15fkJPwcB/3/8iNBQC2L/N7SChJPKDJPZGYH0jD4Tg4/0vnHmwghnbKw== + version "2.9.4" + resolved "https://registry.yarnpkg.com/@peculiar/asn1-ecc/-/asn1-ecc-2.9.4.tgz#2bf1bd8734584689a2d3f43c57b25ce3a60a0ce2" + integrity sha512-JJXefFshRAuVAjWQo/39bkg1ywc1VaiO44S8RRC+Ykvf/u2KDmYffoDb0ZBPCR5uJy4AGKQhl8mX+Q8ShcWaXQ== dependencies: - "@peculiar/asn1-schema" "^2.7.0" - "@peculiar/asn1-x509" "^2.7.0" - asn1js "^3.0.6" + "@peculiar/asn1-schema" "^2.9.4" + "@peculiar/asn1-x509" "^2.9.4" + asn1js "^3.0.10" tslib "^2.8.1" -"@peculiar/asn1-pfx@^2.7.0": - version "2.7.0" - resolved "https://registry.yarnpkg.com/@peculiar/asn1-pfx/-/asn1-pfx-2.7.0.tgz#d00766b13ff49785684a604248e6aadd184b291f" - integrity sha512-V/nrlQVmhg7lYAsM7E13UDL5erAwFv6kCIVFqNaMIHSVi7dngcT839JkRTkQBqznMG98l2XjxYk74ZztAohZzA== +"@peculiar/asn1-pfx@^2.9.4": + version "2.9.4" + resolved "https://registry.yarnpkg.com/@peculiar/asn1-pfx/-/asn1-pfx-2.9.4.tgz#795ddfe7ee3669b50f42cdaed42cc82b22a5d440" + integrity sha512-khuGzHTzNzk4GDlIBEILyIs6Lce0yn0ZBdoI9v93kmNncfZRhD+AQ5ODFqdhvoE8cMJF/JMTQ8yA+t1D14kqCw== dependencies: - "@peculiar/asn1-cms" "^2.7.0" - "@peculiar/asn1-pkcs8" "^2.7.0" - "@peculiar/asn1-rsa" "^2.7.0" - "@peculiar/asn1-schema" "^2.7.0" - asn1js "^3.0.6" + "@peculiar/asn1-cms" "^2.9.4" + "@peculiar/asn1-pkcs8" "^2.9.4" + "@peculiar/asn1-rsa" "^2.9.4" + "@peculiar/asn1-schema" "^2.9.4" + asn1js "^3.0.10" tslib "^2.8.1" -"@peculiar/asn1-pkcs8@^2.7.0": - version "2.7.0" - resolved "https://registry.yarnpkg.com/@peculiar/asn1-pkcs8/-/asn1-pkcs8-2.7.0.tgz#5ee602d8a9a3e0a3f09f7b008ff644a657378692" - integrity sha512-9GTl1nE8Mx1kTZ+7QyYatDyKsm34QcWRBFkY1iPvWC3X4Dona5s/tlLiQsx5WzVdZqiMBZNYT0buyw4/vbhnjw== +"@peculiar/asn1-pkcs8@^2.9.4": + version "2.9.4" + resolved "https://registry.yarnpkg.com/@peculiar/asn1-pkcs8/-/asn1-pkcs8-2.9.4.tgz#79ac7696eb7acf3fe68b121ac39fcb265f8b219e" + integrity sha512-duRdotlUx9eDZe6QrQpQKl61RbWykCHBCkKayP8V8XdEFwlKHZ8qGGDMyS6Pye7OX7nLFttTTpRkJeet78ckwQ== dependencies: - "@peculiar/asn1-schema" "^2.7.0" - "@peculiar/asn1-x509" "^2.7.0" - asn1js "^3.0.6" + "@peculiar/asn1-schema" "^2.9.4" + "@peculiar/asn1-x509" "^2.9.4" + asn1js "^3.0.10" tslib "^2.8.1" "@peculiar/asn1-pkcs9@^2.6.0": - version "2.7.0" - resolved "https://registry.yarnpkg.com/@peculiar/asn1-pkcs9/-/asn1-pkcs9-2.7.0.tgz#23b4eae41c2feb8df258aa69c502a70092026b0a" - integrity sha512-Bh7m+OuIaSEllPQcSd9OSp93F4ROWH7sbITWV8MI+8dwsjE5111/87VxiWVvYFKyww3vp39geLv9ENqhwWHcew== + version "2.9.4" + resolved "https://registry.yarnpkg.com/@peculiar/asn1-pkcs9/-/asn1-pkcs9-2.9.4.tgz#18c89ab8d5e34469d43497bdbde7fc84cf437991" + integrity sha512-kaL4cNxBpdQE2dKlyZBqz4ygCrwffO+8wfoxTEqM1Z8RadvCeELBRzcv0dzM8aY9azHMwODO5nxU65zXmhToOQ== dependencies: - "@peculiar/asn1-cms" "^2.7.0" - "@peculiar/asn1-pfx" "^2.7.0" - "@peculiar/asn1-pkcs8" "^2.7.0" - "@peculiar/asn1-schema" "^2.7.0" - "@peculiar/asn1-x509" "^2.7.0" - "@peculiar/asn1-x509-attr" "^2.7.0" - asn1js "^3.0.6" + "@peculiar/asn1-cms" "^2.9.4" + "@peculiar/asn1-pfx" "^2.9.4" + "@peculiar/asn1-pkcs8" "^2.9.4" + "@peculiar/asn1-schema" "^2.9.4" + "@peculiar/asn1-x509" "^2.9.4" + "@peculiar/asn1-x509-attr" "^2.9.4" + asn1js "^3.0.10" tslib "^2.8.1" -"@peculiar/asn1-rsa@^2.6.0", "@peculiar/asn1-rsa@^2.7.0": - version "2.7.0" - resolved "https://registry.yarnpkg.com/@peculiar/asn1-rsa/-/asn1-rsa-2.7.0.tgz#6dc5c78c643264dd5a251a66f1dd9a38fcbba385" - integrity sha512-/qvENQrXyTZURjMqSeofHul0JJt2sNSzSwk36pl2olkHbaioMQgrASDZAlHXl0xUlnVbHj0uGgOrBMTb5x2aJQ== +"@peculiar/asn1-rsa@^2.6.0", "@peculiar/asn1-rsa@^2.9.4": + version "2.9.4" + resolved "https://registry.yarnpkg.com/@peculiar/asn1-rsa/-/asn1-rsa-2.9.4.tgz#0547359f09b10876a21a96ef32b70af6db9855ad" + integrity sha512-pZ96eD1PptovcWQ/GSmuNFXd/7EQJNlKfDaNCyE2rx3W0v6QFelkzquVqRSRyyDXXCYD69ZXJDzZ8GhIiQzKoA== dependencies: - "@peculiar/asn1-schema" "^2.7.0" - "@peculiar/asn1-x509" "^2.7.0" - asn1js "^3.0.6" + "@peculiar/asn1-schema" "^2.9.4" + "@peculiar/asn1-x509" "^2.9.4" + asn1js "^3.0.10" tslib "^2.8.1" -"@peculiar/asn1-schema@^2.6.0", "@peculiar/asn1-schema@^2.7.0": - version "2.7.0" - resolved "https://registry.yarnpkg.com/@peculiar/asn1-schema/-/asn1-schema-2.7.0.tgz#f2dcb25995ce7cac8687ba1039f043e5eff43820" - integrity sha512-W8ZfWzLmQnrcky+eh3tni4IozMdqBDiHWU0N+vve/UGjMaUs8c0L7A2oEdkBXS8rTpWDpK/aoI3DG/L/hxmxPg== +"@peculiar/asn1-schema@^2.6.0", "@peculiar/asn1-schema@^2.9.4": + version "2.9.4" + resolved "https://registry.yarnpkg.com/@peculiar/asn1-schema/-/asn1-schema-2.9.4.tgz#99003d4bc87ec2ed2c4deb2843404496a912c3cf" + integrity sha512-GjzePcT9Iw8NzeOPf73iNS9xM+TBhd/FilAfP+RQGkTMQJTVWtytN3JHJACCjf/ABNau5S7mS3g+DcuxmRgYEg== dependencies: "@peculiar/utils" "^2.0.2" - asn1js "^3.0.6" + asn1js "^3.0.10" tslib "^2.8.1" -"@peculiar/asn1-x509-attr@^2.7.0": - version "2.7.0" - resolved "https://registry.yarnpkg.com/@peculiar/asn1-x509-attr/-/asn1-x509-attr-2.7.0.tgz#5ef2a10d3a78d4763b848a2cb56db4bb6b1e082a" - integrity sha512-NS8e7SOgXipkzUPLF/sce7ukpMpWjhxYsH0n6Y+bHYo4TTxOb95Zv7hqwSuL212mj5YxovjdOKQOgH1As3E94w== +"@peculiar/asn1-x509-attr@^2.9.4": + version "2.9.4" + resolved "https://registry.yarnpkg.com/@peculiar/asn1-x509-attr/-/asn1-x509-attr-2.9.4.tgz#c74094ffb97442c3fac7b965bd1345f9a0b59d48" + integrity sha512-ehQXbpQaQYycgu8OrvigwSPTFfVRcu0ECNYCWw+yzBp02Lw5paRqzzhUpfOgO2K38+WfFZuEz/0RPtam5g0OMg== dependencies: - "@peculiar/asn1-schema" "^2.7.0" - "@peculiar/asn1-x509" "^2.7.0" - asn1js "^3.0.6" + "@peculiar/asn1-schema" "^2.9.4" + "@peculiar/asn1-x509" "^2.9.4" + asn1js "^3.0.10" tslib "^2.8.1" -"@peculiar/asn1-x509@^2.6.0", "@peculiar/asn1-x509@^2.7.0": - version "2.7.0" - resolved "https://registry.yarnpkg.com/@peculiar/asn1-x509/-/asn1-x509-2.7.0.tgz#84793efb7819dbc9526fd6b0a4ccd86f90464b96" - integrity sha512-mUn9RRrkGDnG4ALfunDmzyRW5dg+sWCj/pfnCCqEHYbkGxEpvUt6iVJv8Yw1cyp6SWZ26ZE5oSmI5SqEaen15g== +"@peculiar/asn1-x509@^2.6.0", "@peculiar/asn1-x509@^2.9.4": + version "2.9.4" + resolved "https://registry.yarnpkg.com/@peculiar/asn1-x509/-/asn1-x509-2.9.4.tgz#f997898c48ba6536bed640f788734d36477c21ad" + integrity sha512-CxhBo/RdEbMMob7T31ZdQjGuoyRFLVwrDzTn25bihzBasRg9kRm/0IxIPvhgQtcK/9dNcO1XQL2fuPugwELL0Q== dependencies: - "@peculiar/asn1-schema" "^2.7.0" + "@peculiar/asn1-schema" "^2.9.4" "@peculiar/utils" "^2.0.2" - asn1js "^3.0.6" + asn1js "^3.0.10" tslib "^2.8.1" "@peculiar/utils@^2.0.2": @@ -2575,9 +2585,9 @@ graceful-fs "4.2.10" "@pnpm/npm-conf@^3.0.2": - version "3.0.2" - resolved "https://registry.yarnpkg.com/@pnpm/npm-conf/-/npm-conf-3.0.2.tgz#857622421aa9bbf254e557b8a022c216a7928f47" - integrity sha512-h104Kh26rR8tm+a3Qkc5S4VLYint3FE48as7+/5oCEcKR2idC/pF1G6AhIXKI+eHPJa/3J9i5z0Al47IeGHPkA== + version "3.0.3" + resolved "https://registry.yarnpkg.com/@pnpm/npm-conf/-/npm-conf-3.0.3.tgz#17b59982126c86294a8d248aa1d7b185f2df6484" + integrity sha512-//0sR/cow/s4ICQaYoAobOl4aU8cjU6x/V24V7XkKotb9+O+3zySIYp146vpaobYHnxa4pZX8NkV54Z5AwbDKA== dependencies: "@pnpm/config.env-replace" "^1.1.0" "@pnpm/network.ca-file" "^1.0.1" @@ -2606,9 +2616,9 @@ integrity sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ== "@sinclair/typebox@^0.27.8": - version "0.27.10" - resolved "https://registry.yarnpkg.com/@sinclair/typebox/-/typebox-0.27.10.tgz#beefe675f1853f73676aecc915b2bd2ac98c4fc6" - integrity sha512-MTBk/3jGLNB2tVxv6uLlFh1iu64iYOQ2PbdOSK3NW8JZsmlaOh2q6sdtKowBhfw8QFLmYNzTW4/oK4uATIi6ZA== + version "0.27.12" + resolved "https://registry.yarnpkg.com/@sinclair/typebox/-/typebox-0.27.12.tgz#0cacd3cff047a32936b1ace47ea7c86eaab60a7f" + integrity sha512-hhyNJ+nbR6ZR7pToHvllEFun9TL0sbL+tk/ON75lo+Xas054uez98qRbsuNt7MBCyZKK4+8Yli/OAGZhmfBZ/g== "@sindresorhus/is@^4.6.0": version "4.6.0" @@ -2743,9 +2753,9 @@ defer-to-connect "^2.0.1" "@tybys/wasm-util@^0.10.0": - version "0.10.2" - resolved "https://registry.yarnpkg.com/@tybys/wasm-util/-/wasm-util-0.10.2.tgz#12b3a1b33db1f9cad4ddff1f604ab7dd00bf464e" - integrity sha512-RoBvJ2X0wuKlWFIjrwffGw1IqZHKQqzIchKaadZZfnNpsAYp2mM0h36JtPCjNDAHGgYez/15uMBpfGwchhiMgg== + version "0.10.3" + resolved "https://registry.yarnpkg.com/@tybys/wasm-util/-/wasm-util-0.10.3.tgz#015cba9e9dd47ce14d03d2a8c5d547bfb169665d" + integrity sha512-F3fo1MYrRJYL3zER0OUOmkutjr1Vp23m7OsSgp7nq4SP6OqX6C/56XFIPAl5bt3zaBRjmW7SGz3u/6LwFpYcOg== dependencies: tslib "^2.4.0" @@ -2799,9 +2809,9 @@ integrity sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg== "@types/express-serve-static-core@*", "@types/express-serve-static-core@^5.0.0": - version "5.1.1" - resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-5.1.1.tgz#1a77faffee9572d39124933259be2523837d7eaa" - integrity sha512-v4zIMr/cX7/d2BpAEX3KNKL/JrT1s43s96lLvvdTmza1oEvDudCqK9aF/djc/SWgy8Yh0h30TZx5VpzqFCxk5A== + version "5.1.3" + resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-5.1.3.tgz#9d34c88c0c9ee62b9a6e4d9f8ab8d7e29688e6b4" + integrity sha512-dPfW8NFiOF4wOHc7+N/QSxlY9cfSsenewGbAz8C8U/MULPd/YZ27LvJUIlzaXie7e6Ove9YunJGgC9tbHD2cKw== dependencies: "@types/node" "*" "@types/qs" "*" @@ -2809,9 +2819,9 @@ "@types/send" "*" "@types/express-serve-static-core@^4.17.21", "@types/express-serve-static-core@^4.17.33": - version "4.19.8" - resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-4.19.8.tgz#99b960322a4d576b239a640ab52ef191989b036f" - integrity sha512-02S5fmqeoKzVZCHPZid4b8JH2eM5HzQLZWN2FohQEy/0eXTq8VXZfSN6Pcr3F6N9R/vNrj7cpgbhjie6m/1tCA== + version "4.19.9" + resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-4.19.9.tgz#b746a8bb6c389af7a31141397bb539f775b0ae84" + integrity sha512-QP2ESEe/ImWY0HDwNAnK9PvEffUyhLTnWkk7KXzHfyeWAnlrDe1fN77bXl6ia8KT3wPlmA7t9/VPRpnf4Ex9sg== dependencies: "@types/node" "*" "@types/qs" "*" @@ -2837,15 +2847,10 @@ "@types/qs" "*" "@types/serve-static" "^1" -"@types/gtag.js@^0.0.20": - version "0.0.20" - resolved "https://registry.yarnpkg.com/@types/gtag.js/-/gtag.js-0.0.20.tgz#e47edabb4ed5ecac90a079275958e6c929d7c08a" - integrity sha512-wwAbk3SA2QeU67unN7zPxjEHmPmlXwZXZvQEpbEUQuMCRGgKyE1m6XDuTUA9b6pCGb/GqJmdfMOY5LuDjJSbbg== - "@types/hast@^3.0.0": - version "3.0.4" - resolved "https://registry.yarnpkg.com/@types/hast/-/hast-3.0.4.tgz#1d6b39993b82cea6ad783945b0508c25903e15aa" - integrity sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ== + version "3.0.5" + resolved "https://registry.yarnpkg.com/@types/hast/-/hast-3.0.5.tgz#48020de4c0e63492f4ca9db42068c108f68b7f8f" + integrity sha512-rp/ezSWaD1m44dPKICGhiskI13nVr7qTloFwDa/IYkhhf5nzwP+zIQcIJh3WIFSBOy/H1PzB40jPjMDksN4F+g== dependencies: "@types/unist" "*" @@ -2908,9 +2913,9 @@ "@types/unist" "*" "@types/mdx@^2.0.0": - version "2.0.13" - resolved "https://registry.yarnpkg.com/@types/mdx/-/mdx-2.0.13.tgz#68f6877043d377092890ff5b298152b0a21671bd" - integrity sha512-+OWZQfAYyio6YkJb3HLxDrvnx6SWWDbC0zVPfBRzUk0/nqoDyf6dNxQi3eArPe8rJ473nobTMQ/8Zk+LxJ+Yuw== + version "2.0.14" + resolved "https://registry.yarnpkg.com/@types/mdx/-/mdx-2.0.14.tgz#c1e54113265b152021ab0afe0434e3cadd90bfe3" + integrity sha512-T48PeuJtvLosNTPVhfnIp3i/n3a4g4Bad7YCq5k64D4u7NwDrAotikQ+5+sjtUvBmxCMlbo3dVL+C2dP0rWHzg== "@types/mime@^1": version "1.3.5" @@ -2923,11 +2928,11 @@ integrity sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA== "@types/node@*": - version "25.9.1" - resolved "https://registry.yarnpkg.com/@types/node/-/node-25.9.1.tgz#3bda556db500ae4319c08e7fc9ab94f19013ba0b" - integrity sha512-xfrlY7UD5rMJk3ZVJP8BNzS28J36YJg+xp+LPXV1TdWxr8uMH5A860QNxYDGQe/ylDSgjxE52Q9VnO7p75tJxg== + version "26.4.0" + resolved "https://registry.yarnpkg.com/@types/node/-/node-26.4.0.tgz#4c4ca071c42241fe602741d02999f16b4e64c468" + integrity sha512-faiGnoIrLH/V8cibOMEAZ8pMw6oXqSukl29ra4mN8GdaB2ZewzeaLj+INpV5N+Z1eKWzY+IzaIZH2EIR6YZRNQ== dependencies: - undici-types ">=7.24.0 <7.24.7" + undici-types "~8.3.0" "@types/node@^17.0.5": version "17.0.45" @@ -2976,9 +2981,9 @@ "@types/react" "*" "@types/react@*": - version "19.2.15" - resolved "https://registry.yarnpkg.com/@types/react/-/react-19.2.15.tgz#9e2c6a4251a290f5c525c3143caa872fa6e01e0d" - integrity sha512-eRwcGNHve+E8qtEQSSRl6urh+rFop4v8gm6O8rGv25CodbvFdLjA1vVQ1KkiFE0w0UPOnb8tDiFKL5lp0rtY5Q== + version "19.2.18" + resolved "https://registry.yarnpkg.com/@types/react/-/react-19.2.18.tgz#eb0b6a1fb635d1a9692d5f84a3495bd8ad153707" + integrity sha512-AnzbBERsrLKtk2XSfTbYRLjQPdy116Sty4q+T+Bp3IC4l6jNBvreVPAHmpq9qhXQM7CXZPjLVmGMw9sy+hxQ3w== dependencies: csstype "^3.2.2" @@ -3069,10 +3074,110 @@ dependencies: "@types/yargs-parser" "*" +"@typescript/typescript-aix-ppc64@7.0.2": + version "7.0.2" + resolved "https://registry.yarnpkg.com/@typescript/typescript-aix-ppc64/-/typescript-aix-ppc64-7.0.2.tgz#cdc7ce81d60f1e09034960ddfb1fb880d7a776b6" + integrity sha512-MTKKkWB7p/0E9xi1d1tHtZ5PiLkGEMIq88pK2CubZjOsLtYTLqhgIgi6zepFa+9GHZ6h05NMCkQxGKiPXMxXtQ== + +"@typescript/typescript-darwin-arm64@7.0.2": + version "7.0.2" + resolved "https://registry.yarnpkg.com/@typescript/typescript-darwin-arm64/-/typescript-darwin-arm64-7.0.2.tgz#a55fdfcfa58df58d27db2237cde6a5c1e35a7235" + integrity sha512-gowzar9MwS/aRWp6f3a4KUqzRjAZjOsmGNCM6LcTgXum+dBfgsBVMN+AgvOCCbguXyick6LJhpBszxMebJ8syA== + +"@typescript/typescript-darwin-x64@7.0.2": + version "7.0.2" + resolved "https://registry.yarnpkg.com/@typescript/typescript-darwin-x64/-/typescript-darwin-x64-7.0.2.tgz#38d1c9172800a91d707bec64d2a370a016634db4" + integrity sha512-SZ9xZInqApNlNGc9s0W1VSsktYSOe9cFqNOIqmN1Gs8SmkjKZYFt017G4VwPxASInODuAdbTW7sXiFUf893RgA== + +"@typescript/typescript-freebsd-arm64@7.0.2": + version "7.0.2" + resolved "https://registry.yarnpkg.com/@typescript/typescript-freebsd-arm64/-/typescript-freebsd-arm64-7.0.2.tgz#f1ff8810030b35d2b5be0db6a2dc650460ea94fa" + integrity sha512-W5NH4y/J0plIIS5b2xvTEkU7JFxyqdMAOgf+Ilhl0vHQXKO5dZoxd+C/jEtq56c4F3wk71RB4BMRQ2XdI+bwYQ== + +"@typescript/typescript-freebsd-x64@7.0.2": + version "7.0.2" + resolved "https://registry.yarnpkg.com/@typescript/typescript-freebsd-x64/-/typescript-freebsd-x64-7.0.2.tgz#3d86b03f353c5b1ba95162eb6ce35533bfc294bd" + integrity sha512-UMGDx5sTpzNw3WiPebH7l90IWfJggEd+egHt/q6p7/Cm3zqoV7VxkGXt+3DxPIw8CcmvAB0j3sVVfbhX+M4Tpw== + +"@typescript/typescript-linux-arm64@7.0.2": + version "7.0.2" + resolved "https://registry.yarnpkg.com/@typescript/typescript-linux-arm64/-/typescript-linux-arm64-7.0.2.tgz#d9334d96d6dac6ff85da9c865588948de939e91f" + integrity sha512-Qh4eU4/y3yDjnfjjyPYihMj5/ODIlmt+Bzu17OI+fiSRDW57QmU5SiN63exPRNJPKUzcc1INa1NXdrJ+MqHjUQ== + +"@typescript/typescript-linux-arm@7.0.2": + version "7.0.2" + resolved "https://registry.yarnpkg.com/@typescript/typescript-linux-arm/-/typescript-linux-arm-7.0.2.tgz#ad94b41e1aee2a4dcc6a298c7b67c43345fde32e" + integrity sha512-gffT3xPz9sR7j/YJExkyPntrI0P2EP9XbOyWzth2/Gs0RstK+90RBcO0ncXoXy/beYll1SXw846Nf2zdnEz0QQ== + +"@typescript/typescript-linux-loong64@7.0.2": + version "7.0.2" + resolved "https://registry.yarnpkg.com/@typescript/typescript-linux-loong64/-/typescript-linux-loong64-7.0.2.tgz#2965aee4fc873360139d893daafe6397a29138ad" + integrity sha512-uEHck9i8hoAzXPiYRib1O7miOnz23SxIeVl6F4LXox+qov1K35jHcEW6VHKvZI+pyvl7fZEP4MCU5LYvIq1GuQ== + +"@typescript/typescript-linux-mips64el@7.0.2": + version "7.0.2" + resolved "https://registry.yarnpkg.com/@typescript/typescript-linux-mips64el/-/typescript-linux-mips64el-7.0.2.tgz#1a887a311bed3a833f80bfd4a9ed37c271936cf0" + integrity sha512-R4KvAMnE43W5Qeqb0Ly56O3mWMWIAgsMyz36DCaycd5nbg/9kzm0liw3JocfRqyJY0KPmzFjbswozXyW0DnIYA== + +"@typescript/typescript-linux-ppc64@7.0.2": + version "7.0.2" + resolved "https://registry.yarnpkg.com/@typescript/typescript-linux-ppc64/-/typescript-linux-ppc64-7.0.2.tgz#8b63c9b2f445b393eb4e43ec21da225dade3577d" + integrity sha512-DORx5b3sd/4S7eayxm4FQv+A7CrkUIGRaHiwI8oiHTAI1fAPWhF4J0vAlkC8biAlHSVVwxMQ3tjZ2/DVbnQiiA== + +"@typescript/typescript-linux-riscv64@7.0.2": + version "7.0.2" + resolved "https://registry.yarnpkg.com/@typescript/typescript-linux-riscv64/-/typescript-linux-riscv64-7.0.2.tgz#b6e8a35c289b3ea97a92a41d461aaeed0d3b36e1" + integrity sha512-wf0jqEDOjrPRnKwYRyyJDRo11KMbvMFrU+q4zqKyChODBzvlkbhNQfKvLxQCcwTpdDaXSHZTVuh0JoCrKCUMHQ== + +"@typescript/typescript-linux-s390x@7.0.2": + version "7.0.2" + resolved "https://registry.yarnpkg.com/@typescript/typescript-linux-s390x/-/typescript-linux-s390x-7.0.2.tgz#2ef96693be4861f6d17965427e5b009cbbed1a3e" + integrity sha512-IkwJc3L7yhytWd/ewjyxNDfOmswCm9GWMJT/ue/dU4aZNbwZeYAetq42VyLmsmSjvoX7z74X6ZaYCtzAr0EuGw== + +"@typescript/typescript-linux-x64@7.0.2": + version "7.0.2" + resolved "https://registry.yarnpkg.com/@typescript/typescript-linux-x64/-/typescript-linux-x64-7.0.2.tgz#73269cb0baba50aea0ca060445a6b88e583f1ce2" + integrity sha512-EYdf2cNg7rgCWJnxCdJ+F3V39O8ihb37eHAu1LK8oAFizgTQbPOK7zHHXbPt8rX24COqODXeI3sIf0fCXG7H/A== + +"@typescript/typescript-netbsd-arm64@7.0.2": + version "7.0.2" + resolved "https://registry.yarnpkg.com/@typescript/typescript-netbsd-arm64/-/typescript-netbsd-arm64-7.0.2.tgz#3a3649f97fafa210b4e6e3798c15e06605c8a901" + integrity sha512-+polYF4MF04aPpO5FTkHran9yUQDSXqy5GiSDKpsll5jy3l3+g9QLhpf39T+ePtefhXLOGrLl0QIjkQP6VnelA== + +"@typescript/typescript-netbsd-x64@7.0.2": + version "7.0.2" + resolved "https://registry.yarnpkg.com/@typescript/typescript-netbsd-x64/-/typescript-netbsd-x64-7.0.2.tgz#47ec59491a40c470d2807dc4d2b825528fd979ab" + integrity sha512-8YIT0EHM/3dq10ZOVF/A7pc/YSMtbcecct4rWtexrnSCHOPcpC2KTLXfTCR6vDpnSiY12heNb1GiN/wu+T/FyA== + +"@typescript/typescript-openbsd-arm64@7.0.2": + version "7.0.2" + resolved "https://registry.yarnpkg.com/@typescript/typescript-openbsd-arm64/-/typescript-openbsd-arm64-7.0.2.tgz#796be8da0bd989d8a3fb96f2801e38a8365b4baf" + integrity sha512-APT8+ClYnuYm1u9+kgGXoMj2VzWzcymwh2gNSQVySHfkRDGOTVkoWLjCmOQSaO+PoqQ57B0flRp9SA+7GnnkzQ== + +"@typescript/typescript-openbsd-x64@7.0.2": + version "7.0.2" + resolved "https://registry.yarnpkg.com/@typescript/typescript-openbsd-x64/-/typescript-openbsd-x64-7.0.2.tgz#d37fe2a729eb942c076c454ee7f1815faf7d560f" + integrity sha512-yX7s+Q0Dln0Dt9tEzZsAjXXR/+ytBM7AlglaqyeMPxQszJ1JhlJdZ6jLA+IzldHtflX81em7lDao1xXu+aRRkg== + +"@typescript/typescript-sunos-x64@7.0.2": + version "7.0.2" + resolved "https://registry.yarnpkg.com/@typescript/typescript-sunos-x64/-/typescript-sunos-x64-7.0.2.tgz#aba8d3464c3565a7044789baba96916bd4ab2c88" + integrity sha512-dLJDGaLZ1D4HPQn62u1n8mBDkJREwMsAkCdkwd4Ieqw+x3TUyTsqY0YiBCtE6H6OzzgGk3iuZ3vFWRS+E8/d1g== + +"@typescript/typescript-win32-arm64@7.0.2": + version "7.0.2" + resolved "https://registry.yarnpkg.com/@typescript/typescript-win32-arm64/-/typescript-win32-arm64-7.0.2.tgz#b9de50a17196383f62620b5f9d0a2f34ad3b60d7" + integrity sha512-Gyl1Vy6OsWesLzmq+EP0Fb7b4Nid5232AvcA2SFcdYreldpNtYFFofPjnt62y9hQy7VTaZp65ICJjuAQRaVcIQ== + +"@typescript/typescript-win32-x64@7.0.2": + version "7.0.2" + resolved "https://registry.yarnpkg.com/@typescript/typescript-win32-x64/-/typescript-win32-x64-7.0.2.tgz#cf3b7b0d6ce5635daca4c8e01c189cdcde47ec3c" + integrity sha512-0BQ3HkAHHlKLSp1qRvf3SUhGpGsDuhB/jgFw75guyqbxJqEaS0Cw/VFO8i2nHglJUzQCRtMMR/IBAKE3ETMC4g== + "@ungap/structured-clone@^1.0.0": - version "1.3.1" - resolved "https://registry.yarnpkg.com/@ungap/structured-clone/-/structured-clone-1.3.1.tgz#0e8f34854df7966b09304a18e808b23997bb9fc1" - integrity sha512-mUFwbeTqrVgDQxFveS+df2yfap6iuP20NAKAsBt5jDEoOTDew+zwLAOilHCeQJOVSvmgCX4ogqIrA0mnyr08yQ== + version "1.4.0" + resolved "https://registry.yarnpkg.com/@ungap/structured-clone/-/structured-clone-1.4.0.tgz#5e2e1374c0a30b5a42e8b083523a225c6945f88a" + integrity sha512-1mEZtMKPM09vDmQt5y7YvmN2+DFTP7Tg0EWXdic8/C6VRnpb33e4ghisCIE3WZjsE2N8mf+QV1Zqh7ZFYLWInQ== "@webassemblyjs/ast@1.14.1", "@webassemblyjs/ast@^1.14.1": version "1.14.1" @@ -3213,11 +3318,6 @@ accepts@~1.3.8: mime-types "~2.1.34" negotiator "0.6.3" -acorn-import-phases@^1.0.3: - version "1.0.4" - resolved "https://registry.yarnpkg.com/acorn-import-phases/-/acorn-import-phases-1.0.4.tgz#16eb850ba99a056cb7cbfe872ffb8972e18c8bd7" - integrity sha512-wKmbr/DDiIXzEOiWrTTUcDm24kQ2vGfZQvM2fwg2vXqR5uW6aapr7ObPtj1th32b9u90/Pf4AItvdTh42fBmVQ== - acorn-jsx@^5.0.0: version "5.3.2" resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937" @@ -3231,14 +3331,14 @@ acorn-walk@^8.0.0: acorn "^8.11.0" acorn@^8.0.0, acorn@^8.0.4, acorn@^8.11.0, acorn@^8.15.0, acorn@^8.16.0: - version "8.16.0" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.16.0.tgz#4ce79c89be40afe7afe8f3adb902a1f1ce9ac08a" - integrity sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw== + version "8.18.0" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.18.0.tgz#4faf01b2d6d326bfeed97aea1f52220b5f4c1940" + integrity sha512-lGq+9yr1/GuAWaVYIHRjvvySG5/4VfKIvC8EWxStPdcDh/Ka7FG3twP6v4d5BkravUilhIAsG4Qj83t02LWUPQ== -address@^1.0.1: - version "1.2.2" - resolved "https://registry.yarnpkg.com/address/-/address-1.2.2.tgz#2b5248dac5485a6390532c6a517fda2e3faac89e" - integrity sha512-4B/qKCfeE/ODUaAUpSwfzazo5x29WD4r3vXiWsB7I2mSDAihwEqKO+g8GELZUQSSAo5e1XTYh3ZVfLyxBc12nA== +address@^2.0.1: + version "2.0.3" + resolved "https://registry.yarnpkg.com/address/-/address-2.0.3.tgz#e910900615db3d8a20c040d4c710631062fc4ba8" + integrity sha512-XNAb/a6TCqou+TufU8/u11HCu9x1gYvOoxLwtlXgIqmkrYQADVv6ljyW2zwiPhHz9R1gItAWpuDrdJMmrOBFEA== aggregate-error@^3.0.0: version "3.1.0" @@ -3288,31 +3388,31 @@ ajv@^8.0.0, ajv@^8.9.0: require-from-string "^2.0.2" algoliasearch-helper@^3.26.0: - version "3.29.1" - resolved "https://registry.yarnpkg.com/algoliasearch-helper/-/algoliasearch-helper-3.29.1.tgz#4e764351493d461aa825d2a1209403a98e9b2477" - integrity sha512-6ck2YFudF2Pje7szQoPBiRFTGfd+1I+0I/WfLPGn0bj1kvrFoOQmNyedNiDxTk3/r4IfSLDYk+RA4G7u8H6+yA== + version "3.29.3" + resolved "https://registry.yarnpkg.com/algoliasearch-helper/-/algoliasearch-helper-3.29.3.tgz#dc21f119320acbdd5890a21021846b5730d11e03" + integrity sha512-gVOMbbPVrCO3Xs+B+BLAIGFqIQow6qHMTYCEeBqLQB9m4ZmKUqMwkEumlal2iyyezHEd4Y0FvFTLbCRutCutIQ== dependencies: "@algolia/events" "^4.0.1" algoliasearch@^5.37.0: - version "5.52.1" - resolved "https://registry.yarnpkg.com/algoliasearch/-/algoliasearch-5.52.1.tgz#4405146139ccbd79ae45a3c61abe047b281107b5" - integrity sha512-fHA8+kXTbjagw3jkLiaS7KKrH8qe2DyOsiUhGlN4cdT77PEsfqXZl7ewDk1hsg+pJnPlnE50XtLxjR91iJOpmg== + version "5.57.0" + resolved "https://registry.yarnpkg.com/algoliasearch/-/algoliasearch-5.57.0.tgz#79b103088c1addccb707bafcd8623827dd62c0cf" + integrity sha512-HpND7MBGctOAkd1GoQoDZCGoCpqNTS5NG1LuhElFet3RdLJkwnyTYZXZhXwtpAQPrI36fqQ3eT6KQrdKDTKu3A== dependencies: - "@algolia/abtesting" "1.18.1" - "@algolia/client-abtesting" "5.52.1" - "@algolia/client-analytics" "5.52.1" - "@algolia/client-common" "5.52.1" - "@algolia/client-insights" "5.52.1" - "@algolia/client-personalization" "5.52.1" - "@algolia/client-query-suggestions" "5.52.1" - "@algolia/client-search" "5.52.1" - "@algolia/ingestion" "1.52.1" - "@algolia/monitoring" "1.52.1" - "@algolia/recommend" "5.52.1" - "@algolia/requester-browser-xhr" "5.52.1" - "@algolia/requester-fetch" "5.52.1" - "@algolia/requester-node-http" "5.52.1" + "@algolia/abtesting" "1.23.0" + "@algolia/client-abtesting" "5.57.0" + "@algolia/client-analytics" "5.57.0" + "@algolia/client-common" "5.57.0" + "@algolia/client-insights" "5.57.0" + "@algolia/client-personalization" "5.57.0" + "@algolia/client-query-suggestions" "5.57.0" + "@algolia/client-search" "5.57.0" + "@algolia/ingestion" "1.57.0" + "@algolia/monitoring" "1.57.0" + "@algolia/recommend" "5.57.0" + "@algolia/requester-browser-xhr" "5.57.0" + "@algolia/requester-fetch" "5.57.0" + "@algolia/requester-node-http" "5.57.0" ansi-align@^3.0.1: version "3.0.1" @@ -3332,9 +3432,9 @@ ansi-regex@^5.0.1: integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== ansi-regex@^6.2.2: - version "6.2.2" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-6.2.2.tgz#60216eea464d864597ce2832000738a0589650c1" - integrity sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg== + version "6.3.0" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-6.3.0.tgz#247c8e7b70a1a43b10ce14c0226fcbf58e8815d5" + integrity sha512-WpDfL7NO6j7tH88IDBNVdUJxDh9nmCteAVW9dsep846XdwF4naCBK+/tGLX3KJgcpgMRXCFlTM2hKGoK9FsdrQ== ansi-styles@^4.1.0: version "4.3.0" @@ -3366,13 +3466,6 @@ arg@^5.0.0: resolved "https://registry.yarnpkg.com/arg/-/arg-5.0.2.tgz#c81433cc427c92c4dcf4865142dbca6f15acd59c" integrity sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg== -argparse@^1.0.7: - version "1.0.10" - resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" - integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== - dependencies: - sprintf-js "~1.0.2" - argparse@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" @@ -3388,7 +3481,7 @@ array-union@^2.1.0: resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d" integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== -asn1js@^3.0.6: +asn1js@^3.0.10, asn1js@^3.0.6: version "3.0.10" resolved "https://registry.yarnpkg.com/asn1js/-/asn1js-3.0.10.tgz#df26c874c8a8b41ca605efea47b2ad07551013dd" integrity sha512-S2s3aOytiKdFRdulw2qPE51MzjzVOisppcVv7jVFR+Kw0kxwvFrDcYA0h7Ndqbmj0HkMIXYWaoj7fli8kgx1eg== @@ -3403,12 +3496,12 @@ astring@^1.8.0: integrity sha512-LElXdjswlqjWrPpJFg1Fx4wpkOCxj1TDHlSV4PlaRxHGWko024xICaa97ZkMfs6DRKlCguiAI+rbXv5GWwXIkg== autoprefixer@^10.4.19, autoprefixer@^10.4.23: - version "10.5.0" - resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-10.5.0.tgz#33d87e443430f020a0f85319d6ff1593cb291be9" - integrity sha512-FMhOoZV4+qR6aTUALKX2rEqGG+oyATvwBt9IIzVR5rMa2HRWPkxf+P+PAJLD1I/H5/II+HuZcBJYEFBpq39ong== + version "10.5.4" + resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-10.5.4.tgz#3b7dd848b4155514a95ad1f6ce598844bea09697" + integrity sha512-MaU0U/za7N3r6brxD4YB/l4NSrFzLPlANv6wEuQVaIPlD3L4W9rFcQPbL/EilY9BHhHvhfcz3gInDLrEtWT4EA== dependencies: - browserslist "^4.28.2" - caniuse-lite "^1.0.30001787" + browserslist "^4.28.6" + caniuse-lite "^1.0.30001806" fraction.js "^5.3.4" picocolors "^1.1.1" postcss-value-parser "^4.2.0" @@ -3470,10 +3563,10 @@ balanced-match@^1.0.0: resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== -baseline-browser-mapping@^2.10.12: - version "2.10.32" - resolved "https://registry.yarnpkg.com/baseline-browser-mapping/-/baseline-browser-mapping-2.10.32.tgz#b6b553a4285fdd606327a617de36a5351e3aaa64" - integrity sha512-wbPvpyjJPC0zdfdKXxqEL3Ea+bOMD/87X4lftiJkkaBiuG6ALQy1SLmEd7BSmVCuwCQsBrCamgBoLyfFDD1EPg== +baseline-browser-mapping@^2.11.12: + version "2.11.20" + resolved "https://registry.yarnpkg.com/baseline-browser-mapping/-/baseline-browser-mapping-2.11.20.tgz#26078c7a4b08299656ea7ddceaebec955dc44303" + integrity sha512-H0ulySigv6icDJ1F7SjtdCD6PrhTpdYCmP0CactWy1+ekh0AFd0o1Wn5T8b+hnTmdBx19u9yhL6wvCylXMY7zw== batch@0.6.1: version "0.6.1" @@ -3491,9 +3584,9 @@ binary-extensions@^2.0.0: integrity sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw== body-parser@~1.20.5: - version "1.20.5" - resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.20.5.tgz#303c8c34423d1d6fa799bc764e93c1e4dc6ebf64" - integrity sha512-3grm+/2tUOvu2cjJkvsIxrv/wVpfXQW4PsQHYm7yk4vfpu7Ekl6nEsYBoJUL6qDwZUx8wUhQ8tR2qz+ad9c9OA== + version "1.20.6" + resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.20.6.tgz#60c789c78e0992d906da0a29d71ae01d15c1ed76" + integrity sha512-p5tAzS57i5MV9fZFDj9LeIiTZEufbSe2eDozP+ElheSUq1m74CRq1jI4mYNDdVs9vQztXFLuk/Gd6BWTdwRJ5g== dependencies: bytes "~3.1.2" content-type "~1.0.5" @@ -3509,9 +3602,9 @@ body-parser@~1.20.5: unpipe "~1.0.0" bonjour-service@^1.2.1: - version "1.4.0" - resolved "https://registry.yarnpkg.com/bonjour-service/-/bonjour-service-1.4.0.tgz#6d7cfbb5a8f630b41bb44dcd73585eaedf6ef93c" - integrity sha512-fGQtj1qdR9vIKjFiWPQd52qIqwjaYqhcI40JEiDuvlZ86E7ZBPBwY9fPgHy9r2rYGIjiRfctNPYz6OQU73ww2w== + version "1.4.4" + resolved "https://registry.yarnpkg.com/bonjour-service/-/bonjour-service-1.4.4.tgz#8ff5b85fa0641e0996bf40bcf61fc0c6727b66d3" + integrity sha512-jCZcVv7eoc4QesRscwEZtSROBen+6LpKAmBIsQYQrsAeVHLyMXWX/t6eIV5KiRZYNUBl8eVqImEEMQ8L5+c/Kw== dependencies: fast-deep-equal "^3.1.3" multicast-dns "^7.2.5" @@ -3550,9 +3643,9 @@ boxen@^7.0.0: wrap-ansi "^8.1.0" brace-expansion@^1.1.7: - version "1.1.14" - resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.14.tgz#d9de602370d91347cd9ddad1224d4fd701eb348b" - integrity sha512-MWPGfDxnyzKU7rNOW9SP/c50vi3xrmrua/+6hfPbCS2ABNWfx24vPidzvC7krjU/RTo235sV776ymlsMtGKj8g== + version "1.1.18" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.18.tgz#3ce74d89885136be1535341f8c3d4425c29a5cab" + integrity sha512-Edep/X9fGqVNmzKBVsDYIOtD+z1tuezV70LBjdCst9Tqu76lsnvRiZ6oTic1n+/BIwX6QDGAO94PN4N2SADvtw== dependencies: balanced-match "^1.0.0" concat-map "0.0.1" @@ -3564,16 +3657,16 @@ braces@^3.0.3, braces@~3.0.2: dependencies: fill-range "^7.1.1" -browserslist@^4.0.0, browserslist@^4.23.0, browserslist@^4.24.0, browserslist@^4.28.1, browserslist@^4.28.2: - version "4.28.2" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.28.2.tgz#f50b65362ef48974ca9f50b3680566d786b811d2" - integrity sha512-48xSriZYYg+8qXna9kwqjIVzuQxi+KYWp2+5nCYnYKPTr0LvD89Jqk2Or5ogxz0NUMfIjhh2lIUX/LyX9B4oIg== +browserslist@^4.0.0, browserslist@^4.23.0, browserslist@^4.24.0, browserslist@^4.28.1, browserslist@^4.28.6, browserslist@^4.28.7: + version "4.28.8" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.28.8.tgz#a3c79ceb70028527e5da7dafc887f3200b5168c0" + integrity sha512-V2NpofLblG64mfOtSgDhOJESZEGogzDMBv/q+W6oc4LXWP/q75eOXoOaaOu1EOadB9U4Bwx/e0yzbvwKH8zalA== dependencies: - baseline-browser-mapping "^2.10.12" - caniuse-lite "^1.0.30001782" - electron-to-chromium "^1.5.328" - node-releases "^2.0.36" - update-browserslist-db "^1.2.3" + baseline-browser-mapping "^2.11.12" + caniuse-lite "^1.0.30001809" + electron-to-chromium "^1.5.402" + node-releases "^2.0.53" + update-browserslist-db "^1.3.0" buffer-from@^1.0.0: version "1.1.2" @@ -3679,10 +3772,10 @@ caniuse-api@^3.0.0: lodash.memoize "^4.1.2" lodash.uniq "^4.5.0" -caniuse-lite@^1.0.0, caniuse-lite@^1.0.30001782, caniuse-lite@^1.0.30001787: - version "1.0.30001793" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001793.tgz#238887ddf5fcfc8c36d872394d0a78a517312a72" - integrity sha512-iwSsYWaCOoh26cV8NwNRViHlrfUvYsHDfRVcbtmw0Kg6PJIZZXwMkj1442FYLBGkeUf1juAsU3DTfxW579mrPA== +caniuse-lite@^1.0.0, caniuse-lite@^1.0.30001806, caniuse-lite@^1.0.30001809: + version "1.0.30001810" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001810.tgz#4970b477dea3278374de9bc43aa8f5d39fc3cda2" + integrity sha512-TITQPUkaz+aVk5GL6NhOdwk1aEaNTSDPsGFWrTuhKGtjTF70jL/Oht2W4c6rXUe5fu7Ie19VIahAXHIIiWWNeg== ccount@^2.0.0: version "2.0.1" @@ -3852,9 +3945,9 @@ color-name@~1.1.4: integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== colord@^2.9.3: - version "2.9.3" - resolved "https://registry.yarnpkg.com/colord/-/colord-2.9.3.tgz#4f8ce919de456f1d5c1c368c307fe20f3e59fb43" - integrity sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw== + version "2.10.0" + resolved "https://registry.yarnpkg.com/colord/-/colord-2.10.0.tgz#56c9050e6b06b4b6c62ddec366a48d65ef57e860" + integrity sha512-AidJptpBJmjTclAp9BkLwJi0T93fo5epJnbaZslpg6QVzpHjAiveF55mE9AcUJiGMqRHgMDY8soMsQtuNYMHfw== colorette@^2.0.10: version "2.0.20" @@ -4010,16 +4103,16 @@ copy-webpack-plugin@^11.0.0: serialize-javascript "^6.0.0" core-js-compat@^3.43.0, core-js-compat@^3.48.0: - version "3.49.0" - resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.49.0.tgz#06145447d92f4aaf258a0c44f24b47afaeaffef6" - integrity sha512-VQXt1jr9cBz03b331DFDCCP90b3fanciLkgiOoy8SBHy06gNf+vQ1A3WFLqG7I8TipYIKeYK9wxd0tUrvHcOZA== + version "3.50.0" + resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.50.0.tgz#d5922c2a692ab1cba6078c920e7c5567421ae08e" + integrity sha512-XGpFGbMLHwSt74YLTKho7Ib242qi6O8MSX+sRokV4oz7iKXvQWGYZthjIhjRGMxjzVkAubBO512dKGYcefmX3Q== dependencies: - browserslist "^4.28.1" + browserslist "^4.28.7" core-js@^3.31.1: - version "3.49.0" - resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.49.0.tgz#8b4d520ac034311fa21aa616f017ada0e0dbbddd" - integrity sha512-es1U2+YTtzpwkxVLwAFdSpaIMyQaq0PBgm3YD1W3Qpsn1NAmO3KSgZfu+oGSWVu6NvLHoHCV/aYcsE5wiB7ALg== + version "3.50.0" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.50.0.tgz#a18646fcb0097650189b4504c803e887bcae4c0a" + integrity sha512-BRWgOLKkFeCgRudR6zrs8p9XJZcE14grzKMMssoYrk6krtuEZ7MTKPIY5RzOnqsEKIR9kst7wNzphttraT+Yqw== core-util-is@~1.0.0: version "1.0.3" @@ -4148,9 +4241,9 @@ css-what@^6.0.1, css-what@^6.1.0: integrity sha512-u/O3vwbptzhMs3L1fQE82ZSLHQQfto5gyZzwteVIEyeaY5Fc7R4dapF/BvRoSYFeqfBk4m0V1Vafq5Pjv25wvA== cssdb@^8.6.0: - version "8.9.0" - resolved "https://registry.yarnpkg.com/cssdb/-/cssdb-8.9.0.tgz#e24d44824895957a4a5c75ba72c910f94e7aed77" - integrity sha512-J8jOU/hLjaXcO1LldOLraJSQpfLXRKof0I7mtbRyOy2AAXgqst0x9rlgi2qXeD6d0ou3ZLqcPAMqYVbpCbrxEw== + version "8.11.0" + resolved "https://registry.yarnpkg.com/cssdb/-/cssdb-8.11.0.tgz#e03c9cdc9c5e99d8cddf64a917bfc427b20c143a" + integrity sha512-VzY/8kcK5M8oCVr/cwh24J8XVlCOITpmzCizKBC28o7Z1s23MMojXoJ3q7a+TQQoMKvxC3YlG0Z9yU10kJF1uQ== cssesc@^3.0.0: version "3.0.0" @@ -4243,7 +4336,7 @@ debug@2.6.9: dependencies: ms "2.0.0" -debug@4, debug@^4.0.0, debug@^4.1.0, debug@^4.2.0, debug@^4.3.1, debug@^4.4.3: +debug@^4.0.0, debug@^4.1.0, debug@^4.2.0, debug@^4.3.1, debug@^4.4.3: version "4.4.3" resolved "https://registry.yarnpkg.com/debug/-/debug-4.4.3.tgz#c6ae432d9bd9662582fce08709b038c58e9e3d6a" integrity sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA== @@ -4280,9 +4373,9 @@ default-browser-id@^5.0.0: integrity sha512-x1VCxdX4t+8wVfd1so/9w+vQ4vx7lKd2Qp5tDRutErwmR85OgmfX7RlLRMWafRMY7hbEiXIbudNrjOAPa/hL8Q== default-browser@^5.2.1: - version "5.5.0" - resolved "https://registry.yarnpkg.com/default-browser/-/default-browser-5.5.0.tgz#2792e886f2422894545947cc80e1a444496c5976" - integrity sha512-H9LMLr5zwIbSxrmvikGuI/5KGhZ8E2zH3stkMgM5LpOWDutGM2JZaj460Udnf1a+946zc7YBgrqEWwbk7zHvGw== + version "5.5.1" + resolved "https://registry.yarnpkg.com/default-browser/-/default-browser-5.5.1.tgz#1790affc52680fbb11e17cab2752d69aa2a37d2c" + integrity sha512-m1pAzaJgZ/gssEqlOhJkPJp8Xly7QyW6xcrkUa2KKcDeDSEMP7X8xipU3snUcfisTQx0w1AGae+9UtJSfVnXGw== dependencies: bundle-name "^4.1.0" default-browser-id "^5.0.0" @@ -4345,13 +4438,12 @@ detect-node@^2.0.4: resolved "https://registry.yarnpkg.com/detect-node/-/detect-node-2.1.0.tgz#c9c70775a49c3d03bc2c06d9a73be550f978f8b1" integrity sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g== -detect-port@^1.5.1: - version "1.6.1" - resolved "https://registry.yarnpkg.com/detect-port/-/detect-port-1.6.1.tgz#45e4073997c5f292b957cb678fb0bb8ed4250a67" - integrity sha512-CmnVc+Hek2egPx1PeTFVta2W78xy2K/9Rkf6cC4T59S50tVnzKj+tnx5mmx5lwvCkujZ4uRrpRSuV+IVs3f90Q== +detect-port@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/detect-port/-/detect-port-2.1.0.tgz#03d72644891fa451ca5609b83107a8a0ebd03f91" + integrity sha512-epZuWb/6Q62L+nDHJc/hQAqf8pylsqgk3BpZXVBx1CDnr3nkrVNn73Uu1rXcFzkNcc+hkP3whuOg7JZYaQB65Q== dependencies: - address "^1.0.1" - debug "4" + address "^2.0.1" devlop@^1.0.0, devlop@^1.1.0: version "1.1.0" @@ -4475,10 +4567,10 @@ ee-first@1.1.1: resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" integrity sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow== -electron-to-chromium@^1.5.328: - version "1.5.361" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.5.361.tgz#b993bc7b34ea83f348aa1787a608ecf12e39b909" - integrity sha512-Q6Hts7N9FnJc5LeGRINFvLhCI9xZmNtTDe5ZbcVezQz7cU4a8Aua3GH1b8J2XY8Al9PF+OCwYqhgsOOheMdvkA== +electron-to-chromium@^1.5.402: + version "1.5.418" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.5.418.tgz#40ccbf6d572447663041611e05924b53bc9a0331" + integrity sha512-UzS26r3AEbG5wSoGVpJKqwHIU9zwQN7LHdVIThDrJpS0I5KdlXFMEb8543fhc9dVnIIAST6ar8rhwa00AL5MlA== emoji-regex@^8.0.0: version "8.0.0" @@ -4518,10 +4610,10 @@ encoding-sniffer@^0.2.1: iconv-lite "^0.6.3" whatwg-encoding "^3.1.1" -enhanced-resolve@^5.21.4: - version "5.22.0" - resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.22.0.tgz#43c5caad657c6fce58fc6142e5ca6fa8528ed460" - integrity sha512-xYcDWrpELkFzz9SpZ3PlI6Eu6eD93Yf0WLDRxikGhWJ3MAir2SNZTIVCVZqZ/NUyx8AdMc2gT9C0gPiw18kG+A== +enhanced-resolve@^5.24.4: + version "5.24.5" + resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.24.5.tgz#b4dad3255b7545f07ba5535189868e9f85f47573" + integrity sha512-L1l8TNvomm6UVW5B253AGxQagSQr+vGwhMlrrfRS2qmhx46AMpMVJKQYLvWYbysTMY8VoicOvzHzoHMbyzB+4A== dependencies: graceful-fs "^4.2.4" tapable "^2.3.3" @@ -4564,9 +4656,9 @@ es-errors@^1.3.0: integrity sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw== es-module-lexer@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/es-module-lexer/-/es-module-lexer-2.1.0.tgz#1dfcbb5ea3bbfb63f28e1fc3676c3676d1c9624c" - integrity sha512-n27zTYMjYu1aj4MjCWzSP7G9r75utsaoc8m61weK+W8JMBGGQybd43GstCXZ3WNmSFtGT9wi59qQTW6mhTR5LQ== + version "2.3.2" + resolved "https://registry.yarnpkg.com/es-module-lexer/-/es-module-lexer-2.3.2.tgz#311fa4f40168c1975c505477c51b23234d41ad55" + integrity sha512-poHGpORABojJJucnV9KbOavETW8lBVnphkW77ER5/BQ5Fz7oXSoCNek7IH3vR5nRjdsEz926ibFYX8KtLQmdyw== es-object-atoms@^1.0.0, es-object-atoms@^1.1.1: version "1.1.2" @@ -4620,36 +4712,6 @@ escape-string-regexp@^5.0.0: resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz#4683126b500b61762f2dbebace1806e8be31b1c8" integrity sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw== -eslint-scope@5.1.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.1.1.tgz#e786e59a66cb92b3f6c1fb0d508aab174848f48c" - integrity sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw== - dependencies: - esrecurse "^4.3.0" - estraverse "^4.1.1" - -esprima@^4.0.0: - version "4.0.1" - resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" - integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== - -esrecurse@^4.3.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921" - integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== - dependencies: - estraverse "^5.2.0" - -estraverse@^4.1.1: - version "4.3.0" - resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d" - integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== - -estraverse@^5.2.0: - version "5.3.0" - resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123" - integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== - estree-util-attach-comments@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/estree-util-attach-comments/-/estree-util-attach-comments-3.0.0.tgz#344bde6a64c8a31d15231e5ee9e297566a691c2d" @@ -4673,9 +4735,9 @@ estree-util-is-identifier-name@^3.0.0: integrity sha512-hFtqIDZTIUZ9BXLb8y4pYGyk6+wekIivNVTcmvk8NoOh+VeRn5y6cEHzbURrWbfp1fIqdVipilzj+lfaadNZmg== estree-util-scope@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/estree-util-scope/-/estree-util-scope-1.0.0.tgz#9cbdfc77f5cb51e3d9ed4ad9c4adbff22d43e585" - integrity sha512-2CAASclonf+JFWBNJPndcOpA8EMJwa0Q8LUFJEKqXLW6+qBvbFZuF5gItbQOs/umBUkjviCSDCbBwU2cXbmrhQ== + version "1.0.1" + resolved "https://registry.yarnpkg.com/estree-util-scope/-/estree-util-scope-1.0.1.tgz#28e1e124b5d792f463f43ef3d1690236434b05ea" + integrity sha512-B0np3dcdxqILX5e9nEi5/Fr4K7gL4oYFVPV1zRa2e9wRCbQoZZNWOZFYyoInvXUPJXBXjss+QXlWLJChDEHDkA== dependencies: "@types/estree" "^1.0.0" devlop "^1.0.0" @@ -4830,14 +4892,14 @@ fast-json-stable-stringify@^2.0.0: integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== fast-uri@^3.0.1: - version "3.1.2" - resolved "https://registry.yarnpkg.com/fast-uri/-/fast-uri-3.1.2.tgz#8af3d4fc9d3e71b11572cc2673b514a7d1a8c8ec" - integrity sha512-rVjf7ArG3LTk+FS6Yw81V1DLuZl1bRbNrev6Tmd/9RaroeeRRJhAt7jg/6YFxbvAQXUCavSoZhPPj6oOx+5KjQ== + version "3.1.6" + resolved "https://registry.yarnpkg.com/fast-uri/-/fast-uri-3.1.6.tgz#bfdd308ef763f835fed059f3c6c925f708e33e3a" + integrity sha512-7Ical1vFEMr0onbVzEDIreM22I4khW+fzyQPwvAFWBp1iwdshSZRsL4jjRvPG9JP1uiqMHRto+YU6R2/CzDz5Q== fastq@^1.6.0: - version "1.20.1" - resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.20.1.tgz#ca750a10dc925bc8b18839fd203e3ef4b3ced675" - integrity sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw== + version "1.20.3" + resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.20.3.tgz#7ab8731e647b56abcfeee997dae333ca3ee1d04d" + integrity sha512-XKv5nnLs6nLF71NgiKJLIZFLkPyIEuOselLG7ujZnGrRfQK8HpvY+WqKhAJUAdLomwVHErVS4LfxFlPq0/FTAw== dependencies: reusify "^1.0.4" @@ -4951,9 +5013,9 @@ fs-extra@^10.0.0: universalify "^2.0.0" fs-extra@^11.1.1, fs-extra@^11.2.0: - version "11.3.5" - resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-11.3.5.tgz#07a44eff40bea53e719909a532f91a23bf0769ff" - integrity sha512-eKpRKAovdpZtR1WopLHxlBWvAgPny3c4gX1G5Jhwmmw4XJj0ifSD5qB5TOo8hmA0wlRKDAOAhEE1yVPgs6Fgcg== + version "11.4.0" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-11.4.0.tgz#f88ed6d180ac9e14b61b08e679468f0b1b6b4730" + integrity sha512-EQsFzMUJkCKGr1ePqlYADkIUmHW1s3ZXr5Yqy6wbGrfUCphpl2maM/kyOIRA2HpP3AaFQTZXD4ldjek+nccddA== dependencies: graceful-fs "^4.2.0" jsonfile "^6.0.1" @@ -5032,11 +5094,6 @@ glob-to-regex.js@^1.0.0, glob-to-regex.js@^1.0.1: resolved "https://registry.yarnpkg.com/glob-to-regex.js/-/glob-to-regex.js-1.2.0.tgz#2b323728271d133830850e32311f40766c5f6413" integrity sha512-QMwlOQKU/IzqMUOAZWubUOT8Qft+Y0KQWnX9nK3ch0CJg0tTp4TvGZsTfudYKv2NzoQSyPcnA6TYeIQ3jGichQ== -glob-to-regexp@^0.4.1: - version "0.4.1" - resolved "https://registry.yarnpkg.com/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz#c75297087c851b9a578bd217dd59a92f59fe546e" - integrity sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw== - global-dirs@^3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/global-dirs/-/global-dirs-3.0.1.tgz#0c488971f066baceda21447aecb1a8b911d22485" @@ -5099,16 +5156,6 @@ graceful-fs@^4.1.11, graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0, resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3" integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== -gray-matter@^4.0.3: - version "4.0.3" - resolved "https://registry.yarnpkg.com/gray-matter/-/gray-matter-4.0.3.tgz#e893c064825de73ea1f5f7d88c7a9f7274288798" - integrity sha512-5v6yZd4JK3eMI3FqqCouswVqwugaA9r4dNZB1wwcmrD02QkV5H0y7XBQW8QwQqEaZY1pM9aqORSORhJRdNK44Q== - dependencies: - js-yaml "^3.13.1" - kind-of "^6.0.2" - section-matter "^1.0.0" - strip-bom-string "^1.0.0" - gzip-size@^6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/gzip-size/-/gzip-size-6.0.0.tgz#065367fd50c239c0671cbcbad5be3e2eeb10e462" @@ -5144,9 +5191,9 @@ has-yarn@^3.0.0: integrity sha512-IrsVwUHhEULx3R8f/aA8AHuEzAorplsab/v8HBzEiIukwq5i/EC+xmOW+HfP1OaDP+2JkgT1yILHN2O3UFIbcA== hasown@^2.0.2, hasown@^2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/hasown/-/hasown-2.0.3.tgz#5e5c2b15b60370a4c7930c383dfb76bf17bc403c" - integrity sha512-ej4AhfhfL2Q2zpMmLo7U1Uv9+PyhIZpgQLGT1F9miIGmiCJIoCgSmczFdrc97mWT4kVY72KA+WnnhJ5pghSvSg== + version "2.0.4" + resolved "https://registry.yarnpkg.com/hasown/-/hasown-2.0.4.tgz#8c62d8cb90beb2aad5d0a5b67581ad9854c3f003" + integrity sha512-T2UbfbBEF32wiepXIsMlTW9+dDYC6wMh/t/vYA4tuOMKqWz/n3vr1NFSxQiyP+zk2mXsoMA/i/7qV6LKut1t1A== dependencies: function-bind "^1.1.2" @@ -5340,9 +5387,9 @@ html-void-elements@^3.0.0: integrity sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg== html-webpack-plugin@^5.6.0: - version "5.6.7" - resolved "https://registry.yarnpkg.com/html-webpack-plugin/-/html-webpack-plugin-5.6.7.tgz#429bab4e12abf3c07e1c608886608e2df2c06b11" - integrity sha512-md+vXtdCAe60s1k6AU3dUyMJnDxUyQAwfwPKoLisvgUF1IXjtlLsk2se54+qfL9Mdm26bbwvjJybpNx48NKRLw== + version "5.6.8" + resolved "https://registry.yarnpkg.com/html-webpack-plugin/-/html-webpack-plugin-5.6.8.tgz#5425dbc63eb533ffa59e92342be94894a125fc23" + integrity sha512-MZmKQcTnhEh1SPSyMiEytIeDZDUoBZVorNHivQGXMASHf/BSGGOrKa2xQ5bGx3TCe1n109ecCt+cpww7wwWhKA== dependencies: "@types/html-minifier-terser" "^6.0.0" html-minifier-terser "^6.0.2" @@ -5418,9 +5465,9 @@ http-parser-js@>=0.5.1: integrity sha512-Pysuw9XpUq5dVc/2SMHpuTY01RFl8fttgcyunjL7eEMhGM3cI4eOmiCycJDVCo/7O7ClfQD3SaI6ftDzqOXYMA== http-proxy-middleware@^2.0.9: - version "2.0.9" - resolved "https://registry.yarnpkg.com/http-proxy-middleware/-/http-proxy-middleware-2.0.9.tgz#e9e63d68afaa4eee3d147f39149ab84c0c2815ef" - integrity sha512-c1IyJYLYppU574+YI7R4QyX2ystMtVXZwIdzazUIPIJsHuWNd+mho2j+bKoHftndicGj9yh+xjd+l0yj7VeT1Q== + version "2.0.10" + resolved "https://registry.yarnpkg.com/http-proxy-middleware/-/http-proxy-middleware-2.0.10.tgz#b2df7b705203d7a8c269ac8450cf96b00c532f94" + integrity sha512-RKzRWNPxUZqbuk3BC5mGVJbBnWgr+diEnjJexIOytFbBzDy88Fbh/YvBr3DsNrl1jYAfjWfpATEv0NO35FDuPQ== dependencies: "@types/http-proxy" "^1.17.8" http-proxy "^1.18.1" @@ -5550,9 +5597,9 @@ ipaddr.js@1.9.1: integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g== ipaddr.js@^2.1.0: - version "2.4.0" - resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-2.4.0.tgz#038e9ceaf8219efc5bb76347b7eb787875d5095b" - integrity sha512-9VGk3HGanVE6JoZXHiCpnGy5X0jYDnN4EA4lntFPj+1vIWlFhIylq2CrrCOJH9EAhc5CYhq18F2Av2tgoAPsYQ== + version "2.5.0" + resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-2.5.0.tgz#7d4b6c39f9392fb61cf807de6e425e22c10e061f" + integrity sha512-aq+t5NAc+cS6rZQQVWC2x98CPqGtKKTMDd4Gaodv0wShnItdKg/51djkGJ1hqH+Oy0ivDftCbSLCQob8zso01w== is-alphabetical@^2.0.0: version "2.0.1" @@ -5788,9 +5835,9 @@ jiti@^1.20.0: integrity sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A== joi@^17.9.2: - version "17.13.3" - resolved "https://registry.yarnpkg.com/joi/-/joi-17.13.3.tgz#0f5cc1169c999b30d344366d384b12d92558bcec" - integrity sha512-otDA4ldcIx+ZXsKHWmp0YizCweVRZG96J10b0FevjfuncLO1oX59THoAmHkNubYJ+9gWsYsp5k8v4ib6oDv1fA== + version "17.13.6" + resolved "https://registry.yarnpkg.com/joi/-/joi-17.13.6.tgz#3fa166ca4b7feac442340c1522ea2f51cca3d425" + integrity sha512-ImNZaq/LSysofih+xIGYfR0WUXMA9GLUNB//YTCSrZptoRmVgaNAdJyi6K1kXi9pkLEoSkoI8I4UwtNiu/D7nw== dependencies: "@hapi/hoek" "^9.3.0" "@hapi/topo" "^5.1.0" @@ -5803,18 +5850,10 @@ joi@^17.9.2: resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== -js-yaml@^3.13.1: - version "3.14.2" - resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.14.2.tgz#77485ce1dd7f33c061fd1b16ecea23b55fcb04b0" - integrity sha512-PMSmkqxr106Xa156c2M265Z+FTrPl+oxd/rgOQy2tijQeK5TxQ43psO1ZCwhVOSdnn+RzkzlRz/eY4BgJBYVpg== - dependencies: - argparse "^1.0.7" - esprima "^4.0.0" - js-yaml@^4.1.0: - version "4.1.1" - resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.1.tgz#854c292467705b699476e1a2decc0c8a3458806b" - integrity sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA== + version "4.3.2" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.3.2.tgz#8e44fb14a2643c59726bb15787b5f1512cb3d3fb" + integrity sha512-SFNOvSJ+Dgf/9An904Yx+CgSlIPCkIpao4qo51lpee25TIRejdH3rhR4EZMGoNx3/TP3O+wzWuiTFl4sqbltzA== dependencies: argparse "^2.0.1" @@ -5864,7 +5903,7 @@ keyv@^4.5.3: dependencies: json-buffer "3.0.1" -kind-of@^6.0.0, kind-of@^6.0.2: +kind-of@^6.0.0, kind-of@^6.0.2, kind-of@^6.0.3: version "6.0.3" resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd" integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw== @@ -5888,13 +5927,13 @@ latest-version@^7.0.0: dependencies: package-json "^8.1.0" -launch-editor@^2.6.1: - version "2.13.2" - resolved "https://registry.yarnpkg.com/launch-editor/-/launch-editor-2.13.2.tgz#41d51baaf8afb393224b89bd2bcb4e02f2306405" - integrity sha512-4VVDnbOpLXy/s8rdRCSXb+zfMeFR0WlJWpET1iA9CQdlZDfwyLjUuGQzXU4VeOoey6AicSAluWan7Etga6Kcmg== +launch-editor@^2.14.1: + version "2.14.1" + resolved "https://registry.yarnpkg.com/launch-editor/-/launch-editor-2.14.1.tgz#f7e0da3f58aaea03fea01074d840b5f739ed7ddc" + integrity sha512-QWBrQsMpH7gPr965dsKD/3cKWiNoTjpATQf++Xq63N6sKRGMwlVXz41O1IZTMfZQgBctD/K5Zt06+/I6pP6+HA== dependencies: picocolors "^1.1.1" - shell-quote "^1.8.3" + shell-quote "^1.8.4" leven@^3.1.0: version "3.1.0" @@ -5911,11 +5950,6 @@ lines-and-columns@^1.1.6: resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.2.4.tgz#eca284f75d2965079309dc0ad9255abb2ebc1632" integrity sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg== -loader-runner@^4.3.2: - version "4.3.2" - resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-4.3.2.tgz#9913d3a15971f8f635915e601fb5c9d495d918e9" - integrity sha512-DFEqQ3ihfS9blba08cLfYf1NRAIEm+dDjic073DRDc3/JspI/8wYmtDsHwd3+4hwvdxSK7PGaElfTmm0awWJ4w== - loader-utils@^2.0.0: version "2.0.4" resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-2.0.4.tgz#8b5cb38b5c34a9a018ee1fc0e6a066d1dfcc528c" @@ -5984,9 +6018,9 @@ lru-cache@^5.1.1: yallist "^3.0.2" lunr-languages@^1.4.0: - version "1.20.0" - resolved "https://registry.yarnpkg.com/lunr-languages/-/lunr-languages-1.20.0.tgz#d145555fdeb546300b1394860d768487b8e0e182" - integrity sha512-3LVgE7ekWXt04NBci/hjm+NXJxXZeRXuyClL0kA0HONyBOjxhP3ZQkuWIM4Ok3pbeptUW/rj3XcJcJuJVPwPYA== + version "1.21.0" + resolved "https://registry.yarnpkg.com/lunr-languages/-/lunr-languages-1.21.0.tgz#37d0106e77fb1cccacf68185f75c3a514f099bdb" + integrity sha512-Hj0VwJP1FGwZzVMMZdDtWY2GB2VVKtvVElYtVajzCZCDr2RTucyLpPibrOPGgTlcq2ENQy2gYLtPnzyFu9jZCg== lunr@^2.3.9: version "2.3.9" @@ -6247,18 +6281,18 @@ media-typer@0.3.0: integrity sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ== memfs@^4.43.1: - version "4.57.2" - resolved "https://registry.yarnpkg.com/memfs/-/memfs-4.57.2.tgz#5f74e977c9a14681ea10d427b3ce5d7db5f817e7" - integrity sha512-2nWzSsJzrukurSDna4Z0WywuScK4Id3tSKejgu74u8KCdW4uNrseKRSIDg75C6Yw5ZRqBe0F0EtMNlTbUq8bAQ== + version "4.68.2" + resolved "https://registry.yarnpkg.com/memfs/-/memfs-4.68.2.tgz#26aeb07f3774ccf79bf9d79483ea3241e1383254" + integrity sha512-Un1ElEBoIdPI9kg0sm3LebVEuEViodfIvlaG8Z1MFXa7ZnR9vWuPKUo3dt/vuWY2ivc05l76B5QOjdgCzAzmGw== dependencies: - "@jsonjoy.com/fs-core" "4.57.2" - "@jsonjoy.com/fs-fsa" "4.57.2" - "@jsonjoy.com/fs-node" "4.57.2" - "@jsonjoy.com/fs-node-builtins" "4.57.2" - "@jsonjoy.com/fs-node-to-fsa" "4.57.2" - "@jsonjoy.com/fs-node-utils" "4.57.2" - "@jsonjoy.com/fs-print" "4.57.2" - "@jsonjoy.com/fs-snapshot" "4.57.2" + "@jsonjoy.com/fs-core" "4.68.2" + "@jsonjoy.com/fs-fsa" "4.68.2" + "@jsonjoy.com/fs-node" "4.68.2" + "@jsonjoy.com/fs-node-builtins" "4.68.2" + "@jsonjoy.com/fs-node-to-fsa" "4.68.2" + "@jsonjoy.com/fs-node-utils" "4.68.2" + "@jsonjoy.com/fs-print" "4.68.2" + "@jsonjoy.com/fs-snapshot" "4.68.2" "@jsonjoy.com/json-pack" "^1.11.0" "@jsonjoy.com/util" "^1.9.0" glob-to-regex.js "^1.0.1" @@ -6791,6 +6825,16 @@ minimist@^1.2.0: resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.8.tgz#c1a464e7693302e082a075cee0c057741ac4772c" integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== +minimizer-webpack-plugin@^5.7.0: + version "5.8.0" + resolved "https://registry.yarnpkg.com/minimizer-webpack-plugin/-/minimizer-webpack-plugin-5.8.0.tgz#744f0e28da888aa1708e2be32b4ddcf2eeb09e58" + integrity sha512-2cT9+goJfBhtMz+gJqejSf09ClgmYhPhccRb/fb0ztVbixt0BkO8mRuI26FoPPuUNkRk6iEDryWAIouc5W8eJA== + dependencies: + "@jridgewell/trace-mapping" "^0.3.31" + jest-worker "^27.4.5" + schema-utils "^4.3.3" + terser "^5.51.0" + mrmime@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/mrmime/-/mrmime-2.0.1.tgz#bc3e87f7987853a54c9850eeb1f1078cd44adddc" @@ -6814,10 +6858,10 @@ multicast-dns@^7.2.5: dns-packet "^5.2.2" thunky "^1.0.2" -nanoid@^3.3.12: - version "3.3.12" - resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.12.tgz#ab3d912e217a6d0a514f00a72a16543a28982c05" - integrity sha512-ZB9RH/39qpq5Vu6Y+NmUaFhQR6pp+M2Xt76XBnEwDaGcVAqhlvxrl3B2bKS5D3NH3QR76v3aSrKaF/Kiy7lEtQ== +nanoid@^3.3.17: + version "3.3.18" + resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.18.tgz#f66a2de1199ffde0fcf21c8a5f13106b1c081913" + integrity sha512-DTg4MJbGMWkfi6VZFdNt2/caMbQy4Ou+Op/hJQvGEWcnVfoA1QA+xzRKAzw9jD6+GVOOeYr/mIcuDSdug6F6+w== negotiator@0.6.3: version "0.6.3" @@ -6852,10 +6896,10 @@ node-emoji@^2.1.0: emojilib "^2.4.0" skin-tone "^2.0.0" -node-releases@^2.0.36: - version "2.0.46" - resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.46.tgz#d188a129a83f5e03a101aacb58f260f2ee8faaa1" - integrity sha512-GYVXHE2KnrzAfsAjl4uP++evGFCrAU1jta4ubEjIG7YWt/64Gqv66a30yKwWczVjA6j3bM4nBwH7Pk1JmDHaxQ== +node-releases@^2.0.53: + version "2.0.54" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.54.tgz#09af17d5647aa9f221ec5cf2becb95b68a981afe" + integrity sha512-YHs7BmmcsdAI5Ozuf8JZo6PT0mv2GIWC9vMfvUC3dp65M8hn7Ux8CPL+2oBI7juNuj9d0ndhTcznq2ODBps9cQ== normalize-path@^3.0.0, normalize-path@~3.0.0: version "3.0.0" @@ -7691,17 +7735,17 @@ postcss-selector-not@^8.0.1: postcss-selector-parser "^7.0.0" postcss-selector-parser@^6.0.11, postcss-selector-parser@^6.0.16: - version "6.1.2" - resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz#27ecb41fb0e3b6ba7a1ec84fff347f734c7929de" - integrity sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg== + version "6.1.4" + resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.1.4.tgz#fdec4ca80f5781bd216ca9bf89a2a0fccfffa5f0" + integrity sha512-bIoJLOmjCO1S9XdY/DcnR5hJxvrDir1PbGChrzXG3vw0/FOliy/fA3dmdhQ441kah4gKv+TwckGzex6wNS5cnQ== dependencies: cssesc "^3.0.0" util-deprecate "^1.0.2" postcss-selector-parser@^7.0.0: - version "7.1.1" - resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-7.1.1.tgz#e75d2e0d843f620e5df69076166f4e16f891cb9f" - integrity sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg== + version "7.1.5" + resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-7.1.5.tgz#ee7b090724eb60739b530660e5b402200e694a97" + integrity sha512-KvvtD7SrlBP7dlgkBghEE3r84CABm5SmV2aNcG4oCA+qDnJ/tvKonFVvwWAyyWUEwxuNawdfEAZKP9zM3oZ2Uw== dependencies: cssesc "^3.0.0" util-deprecate "^1.0.2" @@ -7739,11 +7783,11 @@ postcss-zindex@^6.0.2: integrity sha512-5BxW9l1evPB/4ZIc+2GobEBoKC+h8gPGCMi+jxsYvd2x0mjq7wazk6DrP71pStqxE9Foxh5TVnonbWpFZzXaYg== postcss@^8.4.21, postcss@^8.4.24, postcss@^8.4.33, postcss@^8.5.4: - version "8.5.15" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.5.15.tgz#d1eaf677a324e9ec02196da2d3fecf4a0b9a735c" - integrity sha512-FfR8sjd4em2T6fb3I2MwAJU7HWVMr9zba+enmQeeWFfCbm+UOC/0X4DS8XtpUTMwWMGbjKYP7xjfNekzyGmB3A== + version "8.5.26" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.5.26.tgz#6e75135780c7e10df3433bf2266c552d35c8c620" + integrity sha512-u82N74LFzG8ca+dD8puPnplTXoGH4fTPpVGuIbt36G3qvNlkvfD0lEAZSxaly3KX8TS/L1A1gsCEmvKmBcVbkQ== dependencies: - nanoid "^3.3.12" + nanoid "^3.3.17" picocolors "^1.1.1" source-map-js "^1.2.1" @@ -7796,9 +7840,9 @@ prop-types@^15.6.2, prop-types@^15.7.2: react-is "^16.13.1" property-information@^7.0.0: - version "7.1.0" - resolved "https://registry.yarnpkg.com/property-information/-/property-information-7.1.0.tgz#b622e8646e02b580205415586b40804d3e8bfd5d" - integrity sha512-TwEZ+X+yCJmYfL7TPUOcvBZ4QfoT5YenQiJuX//0th53DE6w0xxLEtfK3iyryQFddXuvkIk51EEgrJQ0WJkOmQ== + version "7.2.0" + resolved "https://registry.yarnpkg.com/property-information/-/property-information-7.2.0.tgz#0809b34264e995c0bfcd3227028a1e35210af80a" + integrity sha512-IAtzIB6sUiWaJYrX9smp3V46pBGbBeLFRGdh25kg1334VcBlD8HzhPeNIWQH9zhGmo2itIe25EHt9dQP7G5hmg== proto-list@~1.2.1: version "1.2.4" @@ -7833,16 +7877,17 @@ pvtsutils@^1.3.6: tslib "^2.8.1" pvutils@^1.1.3, pvutils@^1.1.5: - version "1.1.5" - resolved "https://registry.yarnpkg.com/pvutils/-/pvutils-1.1.5.tgz#84b0dea4a5d670249aa9800511804ee0b7c2809c" - integrity sha512-KTqnxsgGiQ6ZAzZCVlJH5eOjSnvlyEgx1m8bkRJfOhmGRqfo5KLvmAlACQkrjEtOQ4B7wF9TdSLIs9O90MX9xA== + version "1.2.0" + resolved "https://registry.yarnpkg.com/pvutils/-/pvutils-1.2.0.tgz#4b5487a9cccd52d275b0538775790a3ca982bc22" + integrity sha512-BbubeCEyTuQjVMakvJQ/Sxbc93F2pwmbsxONT/ZRrwU7Ua38d8unYTwXpTVLAKJ4BDuH9IGztCjQcd/N/39Dvg== qs@~6.15.1: - version "6.15.2" - resolved "https://registry.yarnpkg.com/qs/-/qs-6.15.2.tgz#fd55426d710403ddccc45e0f9eab16db7727ece9" - integrity sha512-Rzq0KEyX/w/tEybncDgdkZrJgVUsUMk3xjh3t5bv3S1HTAtg+uOYt72+ZfwiQwKdysThkTBdL/rTi6HDmX9Ddw== + version "6.15.3" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.15.3.tgz#76852132a58ed5c7c0ef67e4441b9bb5d6061b3b" + integrity sha512-O9gl3zCl5h5blw1KGUzQKhA5oUXSl8rwUIM5o0S3nCXMliSvy5Dzx7/DJcI+SwgICv+IneSZwhBh1oSyEHA71A== dependencies: - side-channel "^1.1.0" + es-define-property "^1.0.1" + side-channel "^1.1.1" queue-microtask@^1.2.2: version "1.2.3" @@ -7859,7 +7904,12 @@ range-parser@1.2.0: resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.0.tgz#f49be6b487894ddc40dcc94a322f611092e00d5e" integrity sha512-kA5WQoNVo4t9lNx2kQNFCxKeBl5IbbSNBl1M/tLkw9WCn+hxNBAW5Qh8gdhs63CJnhjJ2zQWFoqPJP2sK1AV5A== -range-parser@^1.2.1, range-parser@~1.2.1: +range-parser@^1.2.1: + version "1.3.0" + resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.3.0.tgz#d7f19be812bb62721472b45d3be219ef09572b47" + integrity sha512-hek2mFQpPuI4E1BBKrSto+BU3e3x4xuarsbiwr3+lf7p44juvFMV0XFWQAP3xUyqXA4RrXLIoaSUGbSt056ZMw== + +range-parser@~1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031" integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== @@ -7885,9 +7935,9 @@ rc@1.2.8: strip-json-comments "~2.0.1" react-dom@^19.0.0: - version "19.2.6" - resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-19.2.6.tgz#44a81b0bcca22da814c00847d09d01c8615529b7" - integrity sha512-0prMI+hvBbPjsWnxDLxlCGyM8PN6UuWjEUCYmZhO67xIV9Xasa/r/vDnq+Xyq4Lo27g8QSbO5YzARu0D1Sps3g== + version "19.2.8" + resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-19.2.8.tgz#3b46b9eeda877cdff2cf13d2770fff4ae36c2ec2" + integrity sha512-rVprimfGBG3DR+Tq0IQG2DT5PxKth1WIGDmj5yPmlzr4YBe7uyE+Du4oVqTDXZSHGGGXRtTJEGSSePyQCMBglQ== dependencies: scheduler "^0.27.0" @@ -7967,9 +8017,9 @@ react-router@5.3.4, react-router@^5.3.4: tiny-warning "^1.0.0" react@^19.0.0: - version "19.2.6" - resolved "https://registry.yarnpkg.com/react/-/react-19.2.6.tgz#3dadb8e12b2a7934c1d5317973e5dce1301f9a4d" - integrity sha512-sfWGGfavi0xr8Pg0sVsyHMAOziVYKgPLNrS7ig+ivMNb3wbCBw3KxtflsGBAwD3gYQlE/AEZsTLgToRrSCjb0Q== + version "19.2.8" + resolved "https://registry.yarnpkg.com/react/-/react-19.2.8.tgz#a80663dbb58d69c6fe3fd291d3cb324e8a7dff2d" + integrity sha512-PWaYA1L/q9u2u7xYQi+Y3L3Yfnie7XyLeaJICV1MGD6LprsBxcAqGjYyr0eY3p+QdsA+x/Irkt4Qif8D63+Sbw== readable-stream@^2.0.1: version "2.3.8" @@ -8089,9 +8139,9 @@ regjsgen@^0.8.0: integrity sha512-RvwtGe3d7LvWiDQXeQw8p5asZUmfU1G/l6WbUXeHta7Y2PEIvBTwH6E2EfmYUK8pxcxEdEmaomqyp0vZZ7C+3Q== regjsparser@^0.13.0: - version "0.13.1" - resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.13.1.tgz#0593cbacb27527927692030928ae4d3b878d6f8d" - integrity sha512-dLsljMd9sqwRkby8zhO1gSg3PnJIBFid8f4CQj/sXx+7cKx+E7u0PKhZ+U4wmhx7EfmtvnA318oVaIkAB1lRJw== + version "0.13.2" + resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.13.2.tgz#f654734b5c588b22ba3e21693b30523417180808" + integrity sha512-NgRBy2Nx/bE+9F27nVHnqcN5HjyLmecqsqx2PJHu3/IEtADD4WuxuXIVExD5PoSDFVrl78dOonfcOe5O+5nbzQ== dependencies: jsesc "~3.1.0" @@ -8305,9 +8355,9 @@ safe-buffer@~5.1.0, safe-buffer@~5.1.1: integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== sax@^1.2.4, sax@^1.5.0: - version "1.6.0" - resolved "https://registry.yarnpkg.com/sax/-/sax-1.6.0.tgz#da59637629307b97e7c4cb28e080a7bc38560d5b" - integrity sha512-6R3J5M4AcbtLUdZmRv2SygeVaM7IhrLXu9BmnOGmmACak8fiUtOsYNWUS4uK7upbmHIBbLBeFeI//477BKLBzA== + version "1.6.1" + resolved "https://registry.yarnpkg.com/sax/-/sax-1.6.1.tgz#4c23cf608c0b693ab54b4b5888e92cfe977b9843" + integrity sha512-42tBVwLWnaQvW5zc4HbZrTuWccECCZfBi92FDuwtqxasH+JbPB3/FOKb1m222K42R4WxuxzzMsTswfzgtSu64Q== scheduler@^0.27.0: version "0.27.0" @@ -8372,9 +8422,9 @@ semver@^6.3.1: integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== semver@^7.3.5, semver@^7.3.7, semver@^7.5.4: - version "7.8.1" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.8.1.tgz#bf4970b5e70fda0686363cc18bfe8805d5ed957e" - integrity sha512-rkVq3IXh+4FDGch+KwzX3aV9W3kO54GyEgpvBzSyctDA6Xtd7RJQV1xmXbeQp5v7+VzLOfVqiutSE6GICgPFvg== + version "7.8.5" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.8.5.tgz#39b646037dd50c14fb451e7e4cac58ed8b863f69" + integrity sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA== send@~0.19.0, send@~0.19.1: version "0.19.2" @@ -8396,9 +8446,9 @@ send@~0.19.0, send@~0.19.1: statuses "~2.0.2" serialize-javascript@>=7.0.5, serialize-javascript@^6.0.0, serialize-javascript@^6.0.1: - version "7.0.5" - resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-7.0.5.tgz#c798cc0552ffbb08981914a42a8756e339d0d5b1" - integrity sha512-F4LcB0UqUl1zErq+1nYEEzSHJnIwb3AF2XWB94b+afhrekOUijwooAYqFyRbjYkm2PAKBabx6oYv/xDxNi8IBw== + version "7.1.1" + resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-7.1.1.tgz#c3b0a7ac13df6cf2fcda71cbb142ba9392a710b9" + integrity sha512-k3CMsaIvvdSwm8oLB4MXSl0wH2/cwlH7xGcnRd2DaeRmBkbzYmyT8j0tsX60DwD1eRwHTpNpH8ljKu9oUT1MeQ== serve-handler@^6.1.7: version "6.1.7" @@ -8477,12 +8527,12 @@ shebang-regex@^3.0.0: resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== -shell-quote@^1.8.3: - version "1.8.4" - resolved "https://registry.yarnpkg.com/shell-quote/-/shell-quote-1.8.4.tgz#2edd9a4dcefc96649e2e2cb12f637b1f1d92a190" - integrity sha512-VsC6n6vz1ihYYyZZwX7YZSF5l5x36ca17OC+a69h94YqB7X6XLwf+5MOgynYir2SLFUbl8gIYvBo8K8RoNQ6bQ== +shell-quote@^1.8.4: + version "1.10.0" + resolved "https://registry.yarnpkg.com/shell-quote/-/shell-quote-1.10.0.tgz#482033e192e4f5c07151521ffa03400ec71b1b0f" + integrity sha512-w1aiOKwKuRgtwAReIIj89puqg+I7GvX4IbLrvmhXbzQsj1+Zwi4VO3+fa6ZF91TWSjIxoEkKnMeHcLEODK5ZXA== -side-channel-list@^1.0.0: +side-channel-list@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/side-channel-list/-/side-channel-list-1.0.1.tgz#c2e0b5a14a540aebee3bbc6c3f8666cc9b509127" integrity sha512-mjn/0bi/oUURjc5Xl7IaWi/OJJJumuoJFQJfDDyO46+hBWsfaVM65TBHq2eoZBhzl9EchxOijpkbRC8SVBQU0w== @@ -8511,14 +8561,14 @@ side-channel-weakmap@^1.0.2: object-inspect "^1.13.3" side-channel-map "^1.0.1" -side-channel@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.1.0.tgz#c3fcff9c4da932784873335ec9765fa94ff66bc9" - integrity sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw== +side-channel@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.1.1.tgz#ea02c62e05dc4bea67d4442f0fb71ee192f8e0ab" + integrity sha512-6x6dK6zJdpTzF4sQeNYxwtvBzf6Eg4GtlesS94HOvTudUeyK2WXAaIfmDgsyslYrRBeFIlsi54AYsFGUuhmvrQ== dependencies: es-errors "^1.3.0" - object-inspect "^1.13.3" - side-channel-list "^1.0.0" + object-inspect "^1.13.4" + side-channel-list "^1.0.1" side-channel-map "^1.0.1" side-channel-weakmap "^1.0.2" @@ -8641,11 +8691,6 @@ spdy@^4.0.2: select-hose "^2.0.0" spdy-transport "^3.0.0" -sprintf-js@~1.0.2: - version "1.0.3" - resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" - integrity sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g== - srcset@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/srcset/-/srcset-4.0.0.tgz#336816b665b14cd013ba545b6fe62357f86e65f4" @@ -8791,14 +8836,14 @@ supports-preserve-symlinks-flag@^1.0.0: integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== svg-parser@^2.0.4: - version "2.0.4" - resolved "https://registry.yarnpkg.com/svg-parser/-/svg-parser-2.0.4.tgz#fdc2e29e13951736140b76cb122c8ee6630eb6b5" - integrity sha512-e4hG1hRwoOdRb37cIMSgzNsxyzKfayW6VOflrwvR+/bzrkyxY/31WkbgnQpgtrNp1SdpJvpUAGTa/ZoiPNDuRQ== + version "2.1.0" + resolved "https://registry.yarnpkg.com/svg-parser/-/svg-parser-2.1.0.tgz#f808c50953207b230fea6200d866697af61617a4" + integrity sha512-bwLf38YmY+TDYHJw1Ex0Co8c4yeXuJAo8YnXGZrscxrvYoVVIvLeniEkV1Ks/54VteMnL4FtyN1+P+TZJdUPmQ== svgo@^3.0.2, svgo@^3.2.0: - version "3.3.3" - resolved "https://registry.yarnpkg.com/svgo/-/svgo-3.3.3.tgz#8246aee0b08791fde3b0ed22b5661b471fadf58e" - integrity sha512-+wn7I4p7YgJhHs38k2TNjy1vCfPIfLIJWR5MnCStsN8WuuTcBnRKcMHQLMM2ijxGZmDoZwNv8ipl5aTTen62ng== + version "3.3.5" + resolved "https://registry.yarnpkg.com/svgo/-/svgo-3.3.5.tgz#8a3d9557ab2f386eca7e24760385849554985a1c" + integrity sha512-8SQMzdrvWaD8deUmrnYB+ASyxBVgWUOilg+A75nE/76WdLpj6LopCwiAVvkzkcqy/9b7t2Mg7faFLjg0ZRcZ3w== dependencies: commander "^7.2.0" css-select "^5.1.0" @@ -8813,20 +8858,20 @@ tapable@^2.0.0, tapable@^2.2.1, tapable@^2.3.0, tapable@^2.3.3: resolved "https://registry.yarnpkg.com/tapable/-/tapable-2.3.3.tgz#5da7c9992c46038221267985ab28421a8879f160" integrity sha512-uxc/zpqFg6x7C8vOE7lh6Lbda8eEL9zmVm/PLeTPBRhh1xCgdWaQ+J1CUieGpIfm2HdtsUpRv+HshiasBMcc6A== -terser-webpack-plugin@^5.3.9, terser-webpack-plugin@^5.5.0: - version "5.6.0" - resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-5.6.0.tgz#8e7caad248183ab9e91ff08a83b0fc9f0439c3c3" - integrity sha512-Eum+5ajkaOhf5KbM26osvv21kLD7BaGqQ1UA4Ami4arYwylmGUQTgHFpHDdmJod1q4QXa66p0to/FBKID+J1vA== +terser-webpack-plugin@^5.3.9: + version "5.6.1" + resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-5.6.1.tgz#47bc41bd8b8fab8383b62ec763b7394829097e7b" + integrity sha512-201R5j+sJpK8nFWwKVyNfZot8FaJbLZDq5evriVzbV1wDtSXDjRUDRfJzHpAaxFDMEhsZL1QkeqM61wgsS3KaQ== dependencies: "@jridgewell/trace-mapping" "^0.3.25" jest-worker "^27.4.5" schema-utils "^4.3.0" terser "^5.31.1" -terser@^5.10.0, terser@^5.15.1, terser@^5.31.1: - version "5.48.0" - resolved "https://registry.yarnpkg.com/terser/-/terser-5.48.0.tgz#8b391171cfbb7ac4a88f9f04ba1cfabc54f643db" - integrity sha512-J/9An6vs9Us6wKRriSFXBWdRZapREHqFzdNUKk0pmu804EMR6dr6winwo7e5JDxN4xahxQsuysyYFwlwj4XN/Q== +terser@^5.10.0, terser@^5.15.1, terser@^5.31.1, terser@^5.51.0: + version "5.51.2" + resolved "https://registry.yarnpkg.com/terser/-/terser-5.51.2.tgz#555912425a7f2ff7737425c3718fa76c7069f6ef" + integrity sha512-bWnjSNscmuI+GJze6ZupnHP8G/cTcsJF+bXCeQknk2SHQsgbNJnLrqiH9jZ2W4STPVXH2mDKKRX3iwPhc9Cn/Q== dependencies: "@jridgewell/source-map" "^0.3.3" acorn "^8.15.0" @@ -8834,9 +8879,9 @@ terser@^5.10.0, terser@^5.15.1, terser@^5.31.1: source-map-support "~0.5.20" thingies@^2.5.0: - version "2.6.0" - resolved "https://registry.yarnpkg.com/thingies/-/thingies-2.6.0.tgz#e09b98b9e6f6caf8a759eca8481fea1de974d2b1" - integrity sha512-rMHRjmlFLM1R96UYPvpmnc3LYtdFrT33JIB7L9hetGue1qAPfn1N2LJeEjxUSidu1Iku+haLZXDuEXUHNGO/lg== + version "2.6.1" + resolved "https://registry.yarnpkg.com/thingies/-/thingies-2.6.1.tgz#4eb28e2585a75288f1765a0b08f1dfa020357a6f" + integrity sha512-cV/CMGTK3M4MlnJ/0At6ismOw/A0EEniDNScajjz/Br3c1sqE72YD01rGpPTKwd27wAxI5Pr+6+0w8yofzFRYw== thunky@^1.0.2: version "1.1.0" @@ -8932,20 +8977,41 @@ typedarray-to-buffer@^3.1.5: dependencies: is-typedarray "^1.0.0" -typescript@~6.0.0: - version "6.0.3" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-6.0.3.tgz#90251dc007916e972786cb94d74d15b185577d21" - integrity sha512-y2TvuxSZPDyQakkFRPZHKFm+KKVqIisdg9/CZwm9ftvKXLP8NRWj38/ODjNbr43SsoXqNuAisEf1GdCxqWcdBw== +typescript@~7.0.0: + version "7.0.2" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-7.0.2.tgz#9ec773d7954a8c182c17cc5bbd575aa28bc51582" + integrity sha512-8FYau96o3NKOhbjKi/qNvG/W5jhzxkbdm5sj9AbZ/5T5sWqn3hJgLfGx27sRKZWTvyzCP8dLRBTf5tBTSRVUNA== + optionalDependencies: + "@typescript/typescript-aix-ppc64" "7.0.2" + "@typescript/typescript-darwin-arm64" "7.0.2" + "@typescript/typescript-darwin-x64" "7.0.2" + "@typescript/typescript-freebsd-arm64" "7.0.2" + "@typescript/typescript-freebsd-x64" "7.0.2" + "@typescript/typescript-linux-arm" "7.0.2" + "@typescript/typescript-linux-arm64" "7.0.2" + "@typescript/typescript-linux-loong64" "7.0.2" + "@typescript/typescript-linux-mips64el" "7.0.2" + "@typescript/typescript-linux-ppc64" "7.0.2" + "@typescript/typescript-linux-riscv64" "7.0.2" + "@typescript/typescript-linux-s390x" "7.0.2" + "@typescript/typescript-linux-x64" "7.0.2" + "@typescript/typescript-netbsd-arm64" "7.0.2" + "@typescript/typescript-netbsd-x64" "7.0.2" + "@typescript/typescript-openbsd-arm64" "7.0.2" + "@typescript/typescript-openbsd-x64" "7.0.2" + "@typescript/typescript-sunos-x64" "7.0.2" + "@typescript/typescript-win32-arm64" "7.0.2" + "@typescript/typescript-win32-x64" "7.0.2" -"undici-types@>=7.24.0 <7.24.7": - version "7.24.6" - resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-7.24.6.tgz#61275b485d7fd4e9d269c7cf04ec2873c9cc0f91" - integrity sha512-WRNW+sJgj5OBN4/0JpHFqtqzhpbnV0GuB+OozA9gCL7a993SmU+1JBZCzLNxYsbMfIeDL+lTsphD5jN5N+n0zg== +undici-types@~8.3.0: + version "8.3.0" + resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-8.3.0.tgz#44e9fc9f3244648cdea35e4f9bb2d681e9410809" + integrity sha512-j375ScV60dom+YkPFIfTLcOiPxkN/buHz5GobjLhixFuANaNs3C9l4GmrWqejgXWJ7BbJcFYpTEUkS1Ge8bpZQ== undici@^7.19.0: - version "7.25.0" - resolved "https://registry.yarnpkg.com/undici/-/undici-7.25.0.tgz#7d72fc429a0421769ca2966fd07cac875c85b781" - integrity sha512-xXnp4kTyor2Zq+J1FfPI6Eq3ew5h6Vl0F/8d9XU5zZQf1tX9s2Su1/3PiMmUANFULpmksxkClamIZcaUqryHsQ== + version "7.29.0" + resolved "https://registry.yarnpkg.com/undici/-/undici-7.29.0.tgz#ae0f6f62e06e057a9cbb7b2b5fde2bb74f791b8f" + integrity sha512-IDxfleLmmbSskfWSUATiN1nfn2rDuvnMOqb5CWR92iIfojA0Ud+ulOAAEQ57LPr9rWmsreUyf5lwyao+7GNNVw== unicode-canonical-property-names-ecmascript@^2.0.0: version "2.0.1" @@ -9050,10 +9116,10 @@ unpipe@~1.0.0: resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" integrity sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ== -update-browserslist-db@^1.2.3: - version "1.2.3" - resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz#64d76db58713136acbeb4c49114366cc6cc2e80d" - integrity sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w== +update-browserslist-db@^1.3.0: + version "1.3.2" + resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.3.2.tgz#9d99fbff56c50bb11ba5fd35cece5916da595836" + integrity sha512-UQ+MSxlhRm1bzjhU+DcuXfjFO1FzNtqhK5+9Yvlp90ItDLk5vT932A0rFu619nf7RVS+Y/VeaUW1jaRDqZ8VJw== dependencies: escalade "^3.2.0" picocolors "^1.1.1" @@ -9114,10 +9180,10 @@ utils-merge@1.0.1: resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" integrity sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA== -uuid@^8.3.2: - version "8.3.2" - resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2" - integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== +uuid@>=11.1.1, uuid@^8.3.2: + version "14.0.2" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-14.0.2.tgz#d5ae03e4db0881c87271f8b0b9bd7312d02c799a" + integrity sha512-xZe/16rV4aa+HGSOCiY2YeLT1OybRLrrkL/Rqaq7p7GMVXjFh+6wN4oMYgjFmnSnhY8t6Xpdl2l9qmnHYuMHwQ== value-equal@^1.0.1: version "1.0.1" @@ -9153,12 +9219,11 @@ vfile@^6.0.0, vfile@^6.0.1: "@types/unist" "^3.0.0" vfile-message "^4.0.0" -watchpack@^2.5.1: - version "2.5.1" - resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-2.5.1.tgz#dd38b601f669e0cbf567cb802e75cead82cde102" - integrity sha512-Zn5uXdcFNIA1+1Ei5McRd+iRzfhENPCe7LeABkJtNulSxjma+l7ltNx55BWZkRlwRnpOgHqxnjyaDgJnNXnqzg== +watchpack@^2.5.2: + version "2.5.2" + resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-2.5.2.tgz#e12e82d84674266fc1c6dbfe38891b92ff0522ec" + integrity sha512-6i/00NBjP4yGPs+caKSyRfpTF/8Torsu0MOW3mMzIbhgISFder8i7xbqgHlLMwJrdiN8ndBV3UA1/AfzPSr+jg== dependencies: - glob-to-regexp "^0.4.1" graceful-fs "^4.1.2" wbuf@^1.1.0, wbuf@^1.7.3: @@ -9204,9 +9269,9 @@ webpack-dev-middleware@^7.4.2: schema-utils "^4.0.0" webpack-dev-server@^5.2.2: - version "5.2.4" - resolved "https://registry.yarnpkg.com/webpack-dev-server/-/webpack-dev-server-5.2.4.tgz#6e6306ce59848ed322c235e48b326632b1eed6d6" - integrity sha512-GqDPGZN9bRqKBTkp4aWkobDDHMsrXKoGSdOH56smIri8qR0JG8gfL8/v/f/OZR3/OKXjG8uwJbFVhKm/FNU/UA== + version "5.2.6" + resolved "https://registry.yarnpkg.com/webpack-dev-server/-/webpack-dev-server-5.2.6.tgz#3a5d41233cbb7504f814d19e59a59173fb8ae23d" + integrity sha512-HNLRmamRvVavZQ+avceZifmv8hmdUjg43t6MI4SqJDwFdW7RPQwH5vzGhDRZSX59SgfbeHhLnq3g+uooWo7pVw== dependencies: "@types/bonjour" "^3.5.13" "@types/connect-history-api-fallback" "^1.5.4" @@ -9226,7 +9291,7 @@ webpack-dev-server@^5.2.2: graceful-fs "^4.2.6" http-proxy-middleware "^2.0.9" ipaddr.js "^2.1.0" - launch-editor "^2.6.1" + launch-editor "^2.14.1" open "^10.0.3" p-retry "^6.2.0" schema-utils "^4.2.0" @@ -9255,15 +9320,15 @@ webpack-merge@^6.0.1: flat "^5.0.2" wildcard "^2.0.1" -webpack-sources@^3.4.1: - version "3.5.0" - resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-3.5.0.tgz#87bf7f5801a4e985b1f1c92b64b9620a02f76d08" - integrity sha512-HPuy+uuoTCaaoEoI1LQ3JN9+vrPBvEesnnX1jADHy728cHSMlq4wUc4afYqahq2B1mhQVZxCXOkNTnXltr+2vQ== +webpack-sources@^3.5.1: + version "3.5.1" + resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-3.5.1.tgz#76c2418486dcc02b2aa0694c104176c2858fe84a" + integrity sha512-jyuiGJdtvY434z5bUZrjz67v76/ePNvFZTp9Mdz29IlH4+GPsgyGjiv0fKI+M7BdkU6ADjulUcKAd3tUK3WlEw== webpack@^5.88.1, webpack@^5.95.0: - version "5.107.1" - resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.107.1.tgz#01ad63131b7c413f607cc00a8136f467c1f10af0" - integrity sha512-mvdIWxj/H6QsfgDdH9djne3a5dYcmEmtsXGESkypaGN5jXjF/b+9KDlmTDQ2TKlFUeA2fI9Y65kihD30JOdB+Q== + version "5.110.2" + resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.110.2.tgz#ef23a0e62fe5e1ba71b033e3505b7f005d8d5c6e" + integrity sha512-TciLrfM7zgEjqGdY851HkirDsSPQgTFsWQpl9oHqMAMYsHhEC0bKjscvjpnz+pzx10hLC8qISApGrsnrCP4UtQ== dependencies: "@types/estree" "^1.0.8" "@types/json-schema" "^7.0.15" @@ -9271,23 +9336,19 @@ webpack@^5.88.1, webpack@^5.95.0: "@webassemblyjs/wasm-edit" "^1.14.1" "@webassemblyjs/wasm-parser" "^1.14.1" acorn "^8.16.0" - acorn-import-phases "^1.0.3" browserslist "^4.28.1" chrome-trace-event "^1.0.2" - enhanced-resolve "^5.21.4" + enhanced-resolve "^5.24.4" es-module-lexer "^2.1.0" - eslint-scope "5.1.1" events "^3.2.0" - glob-to-regexp "^0.4.1" graceful-fs "^4.2.11" - loader-runner "^4.3.2" mime-db "^1.54.0" + minimizer-webpack-plugin "^5.7.0" neo-async "^2.6.2" schema-utils "^4.3.3" tapable "^2.3.0" - terser-webpack-plugin "^5.5.0" - watchpack "^2.5.1" - webpack-sources "^3.4.1" + watchpack "^2.5.2" + webpack-sources "^3.5.1" webpackbar@^7.0.0: version "7.0.0" @@ -9300,9 +9361,9 @@ webpackbar@^7.0.0: std-env "^3.7.0" websocket-driver@>=0.5.1, websocket-driver@^0.7.4: - version "0.7.4" - resolved "https://registry.yarnpkg.com/websocket-driver/-/websocket-driver-0.7.4.tgz#89ad5295bbf64b480abcba31e4953aca706f5760" - integrity sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg== + version "0.7.5" + resolved "https://registry.yarnpkg.com/websocket-driver/-/websocket-driver-0.7.5.tgz#569d22764ab21f2de20af0e74b411e8ae5a0fa46" + integrity sha512-ZL2+3c7kMBdIRCMz6l8jQMHyGVxj+UL+xVk74Ombiciboca8rHa15L86B19E5oh1pL9Ii/uj54gtsIrZGMo6zA== dependencies: http-parser-js ">=0.5.1" safe-buffer ">=5.1.0" @@ -9364,14 +9425,14 @@ write-file-atomic@^3.0.3: typedarray-to-buffer "^3.1.5" ws@^7.3.1: - version "7.5.11" - resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.11.tgz#9460daf1812bb81a423c5b9eac746941a86310fa" - integrity sha512-zS54Oen9bITtp7kp2XM3AydrCIq1D+HwJOuH+c+e4LfpL/lotP5osijd+UoMnxwAam1GN8R4KtLAyIrIcBNpiA== + version "7.5.13" + resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.13.tgz#12aa507eaca76c295c278b1aebf4698ab2c1845f" + integrity sha512-rsKI6xDBFVf4r/x8XyChGK04QR/XHroxs/jUcoWvtEZM8TPU/X/uIY9B1CsSzYws9ZJb/6bbBu7dPhFW00CAoA== ws@^8.18.0: - version "8.21.0" - resolved "https://registry.yarnpkg.com/ws/-/ws-8.21.0.tgz#012e413fc07429945121b0c153158c4343086951" - integrity sha512-Vsp28b7DRcimFQvrqu2Wek3z1iYxDCWqHYB8Qsnk/S4RfaCQzPGPyBNuVjJV3cd6UiKtUtp6sNM77gWvzcCH+g== + version "8.21.3" + resolved "https://registry.yarnpkg.com/ws/-/ws-8.21.3.tgz#660b4faddb6a3e575c86e078126919961f4de4fc" + integrity sha512-201TZ/kPWxoPr/OKWjquZR1SWKXcvxdH+e1xrx89b3YbmzLMFCLfnaG1HFIgWzJOEWZ7MvpK++odZufgYR50Rw== wsl-utils@^0.1.0: version "0.1.0"