mirror of
https://github.com/cloudnative-pg/plugin-barman-cloud.git
synced 2026-09-06 15:02:21 +02:00
Compare commits
1 Commits
12361e4a30
...
c6582ed7db
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
c6582ed7db |
38
.github/workflows/ci.yml
vendored
38
.github/workflows/ci.yml
vendored
@ -6,18 +6,14 @@ on:
|
|||||||
|
|
||||||
permissions: read-all
|
permissions: read-all
|
||||||
|
|
||||||
concurrency:
|
|
||||||
group: ${{ github.workflow }}-${{ github.ref }}
|
|
||||||
cancel-in-progress: ${{ github.event_name == 'pull_request' }}
|
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
ci:
|
ci:
|
||||||
runs-on: ${{ vars.CI_RUNNERS || 'ubuntu-latest' }}
|
runs-on: ubuntu-latest
|
||||||
permissions:
|
permissions:
|
||||||
contents: read
|
packages: write
|
||||||
|
contents: write
|
||||||
steps:
|
steps:
|
||||||
- name: Cleanup Disk
|
- name: Cleanup Disk
|
||||||
if: vars.CI_RUNNERS == '' || vars.CI_RUNNERS == 'ubuntu-latest'
|
|
||||||
uses: jlumbroso/free-disk-space@v1.3.1
|
uses: jlumbroso/free-disk-space@v1.3.1
|
||||||
with:
|
with:
|
||||||
android: true
|
android: true
|
||||||
@ -27,7 +23,6 @@ jobs:
|
|||||||
large-packages: false
|
large-packages: false
|
||||||
swap-storage: false
|
swap-storage: false
|
||||||
- name: Cleanup docker cache
|
- name: Cleanup docker cache
|
||||||
if: vars.CI_RUNNERS == '' || vars.CI_RUNNERS == 'ubuntu-latest'
|
|
||||||
run: |
|
run: |
|
||||||
echo "-------------Disk info before cleanup----------------"
|
echo "-------------Disk info before cleanup----------------"
|
||||||
df -h
|
df -h
|
||||||
@ -37,33 +32,11 @@ jobs:
|
|||||||
df -h
|
df -h
|
||||||
echo "-----------------------------------------------------"
|
echo "-----------------------------------------------------"
|
||||||
- name: Checkout
|
- name: Checkout
|
||||||
uses: actions/checkout@v7.0.1
|
uses: actions/checkout@v7.0.0
|
||||||
# We need the full history for the commitlint task
|
# We need the full history for the commitlint task
|
||||||
with:
|
with:
|
||||||
fetch-depth: 0
|
fetch-depth: 0
|
||||||
ref: ${{ github.event.pull_request.head.sha }}
|
ref: ${{ github.event.pull_request.head.sha }}
|
||||||
- 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.7
|
|
||||||
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
|
- name: Install QEMU static binaries
|
||||||
uses: docker/setup-qemu-action@v4
|
uses: docker/setup-qemu-action@v4
|
||||||
- name: Install Task
|
- name: Install Task
|
||||||
@ -74,6 +47,9 @@ jobs:
|
|||||||
DAGGER_VERSION: 0.21.7
|
DAGGER_VERSION: 0.21.7
|
||||||
run: |
|
run: |
|
||||||
curl -L https://dl.dagger.io/dagger/install.sh | BIN_DIR=$HOME/.local/bin sh
|
curl -L https://dl.dagger.io/dagger/install.sh | BIN_DIR=$HOME/.local/bin sh
|
||||||
|
- name: Run CI task
|
||||||
|
run: |
|
||||||
|
task ci
|
||||||
- name: Write manifest
|
- name: Write manifest
|
||||||
run: |
|
run: |
|
||||||
task manifest
|
task manifest
|
||||||
|
|||||||
6
.github/workflows/publish-docs.yml
vendored
6
.github/workflows/publish-docs.yml
vendored
@ -20,12 +20,12 @@ permissions: read-all
|
|||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
build:
|
build:
|
||||||
runs-on: ${{ vars.CI_RUNNERS || 'ubuntu-latest' }}
|
runs-on: ubuntu-latest
|
||||||
permissions:
|
permissions:
|
||||||
contents: read
|
contents: read
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout
|
- name: Checkout
|
||||||
uses: actions/checkout@v7.0.1
|
uses: actions/checkout@v7.0.0
|
||||||
|
|
||||||
- name: Setup Node
|
- name: Setup Node
|
||||||
uses: actions/setup-node@v7
|
uses: actions/setup-node@v7
|
||||||
@ -60,7 +60,7 @@ jobs:
|
|||||||
name: github-pages
|
name: github-pages
|
||||||
url: ${{ steps.deployment.outputs.page_url }}
|
url: ${{ steps.deployment.outputs.page_url }}
|
||||||
needs: build
|
needs: build
|
||||||
runs-on: ${{ vars.CI_RUNNERS || 'ubuntu-latest' }}
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- name: Deploy to GitHub Pages
|
- name: Deploy to GitHub Pages
|
||||||
id: deployment
|
id: deployment
|
||||||
|
|||||||
4
.github/workflows/release-please.yml
vendored
4
.github/workflows/release-please.yml
vendored
@ -9,7 +9,7 @@ permissions: read-all
|
|||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
release-please:
|
release-please:
|
||||||
runs-on: ${{ vars.CI_RUNNERS || 'ubuntu-latest' }}
|
runs-on: ubuntu-latest
|
||||||
permissions:
|
permissions:
|
||||||
contents: write
|
contents: write
|
||||||
pull-requests: write
|
pull-requests: write
|
||||||
@ -19,7 +19,7 @@ jobs:
|
|||||||
# We'll use the cli until there's a fix for
|
# We'll use the cli until there's a fix for
|
||||||
# https://github.com/googleapis/release-please/issues/2280.
|
# https://github.com/googleapis/release-please/issues/2280.
|
||||||
- name: Checkout
|
- name: Checkout
|
||||||
uses: actions/checkout@v7.0.1
|
uses: actions/checkout@v7.0.0
|
||||||
- name: Install node
|
- name: Install node
|
||||||
uses: actions/setup-node@v7
|
uses: actions/setup-node@v7
|
||||||
with:
|
with:
|
||||||
|
|||||||
4
.github/workflows/release-publish.yml
vendored
4
.github/workflows/release-publish.yml
vendored
@ -7,13 +7,13 @@ permissions: read-all
|
|||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
release-publish-artifacts:
|
release-publish-artifacts:
|
||||||
runs-on: ${{ vars.CI_RUNNERS || 'ubuntu-latest' }}
|
runs-on: ubuntu-latest
|
||||||
permissions:
|
permissions:
|
||||||
packages: write
|
packages: write
|
||||||
contents: write
|
contents: write
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout
|
- name: Checkout
|
||||||
uses: actions/checkout@v7.0.1
|
uses: actions/checkout@v7.0.0
|
||||||
- name: Install QEMU static binaries
|
- name: Install QEMU static binaries
|
||||||
uses: docker/setup-qemu-action@v4
|
uses: docker/setup-qemu-action@v4
|
||||||
- name: Install Task
|
- name: Install Task
|
||||||
|
|||||||
@ -1,3 +1,3 @@
|
|||||||
{
|
{
|
||||||
".": "0.14.0"
|
".": "0.13.0"
|
||||||
}
|
}
|
||||||
|
|||||||
31
CHANGELOG.md
31
CHANGELOG.md
@ -1,36 +1,5 @@
|
|||||||
# Changelog
|
# Changelog
|
||||||
|
|
||||||
## [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)
|
## [0.13.0](https://github.com/cloudnative-pg/plugin-barman-cloud/compare/v0.12.0...v0.13.0) (2026-06-10)
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
12
CODEOWNERS
12
CODEOWNERS
@ -1,9 +1,5 @@
|
|||||||
# This file is generated from componentowners-policy.yaml in
|
# The CODEOWNERS file is used to define individuals or teams that are
|
||||||
# cloudnative-pg/cnpg-infra — do not hand-edit, propose changes there instead.
|
# 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
|
||||||
# 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/plugin-barman-cloud-owners
|
* @cloudnative-pg/maintainers
|
||||||
|
|||||||
10
Taskfile.yml
10
Taskfile.yml
@ -46,7 +46,7 @@ tasks:
|
|||||||
- wordlist-ordered
|
- wordlist-ordered
|
||||||
env:
|
env:
|
||||||
# renovate: datasource=git-refs depName=spellcheck lookupName=https://github.com/cloudnative-pg/daggerverse currentValue=main
|
# renovate: datasource=git-refs depName=spellcheck lookupName=https://github.com/cloudnative-pg/daggerverse currentValue=main
|
||||||
DAGGER_SPELLCHECK_SHA: f7187c307f2ba79290efbfff5ce436b956162c53
|
DAGGER_SPELLCHECK_SHA: 7431c24907de3c6b1516114c8990d4f8d23d92cd
|
||||||
cmds:
|
cmds:
|
||||||
- >
|
- >
|
||||||
GITHUB_REF= dagger -s call -m github.com/cloudnative-pg/daggerverse/spellcheck@${DAGGER_SPELLCHECK_SHA}
|
GITHUB_REF= dagger -s call -m github.com/cloudnative-pg/daggerverse/spellcheck@${DAGGER_SPELLCHECK_SHA}
|
||||||
@ -60,7 +60,7 @@ tasks:
|
|||||||
desc: Check for conventional commits
|
desc: Check for conventional commits
|
||||||
env:
|
env:
|
||||||
# renovate: datasource=git-refs depName=commitlint lookupName=https://github.com/cloudnative-pg/daggerverse currentValue=main
|
# renovate: datasource=git-refs depName=commitlint lookupName=https://github.com/cloudnative-pg/daggerverse currentValue=main
|
||||||
DAGGER_COMMITLINT_SHA: f7187c307f2ba79290efbfff5ce436b956162c53
|
DAGGER_COMMITLINT_SHA: 7431c24907de3c6b1516114c8990d4f8d23d92cd
|
||||||
cmds:
|
cmds:
|
||||||
- >
|
- >
|
||||||
GITHUB_REF= dagger -s call -m github.com/cloudnative-pg/daggerverse/commitlint@${DAGGER_COMMITLINT_SHA}
|
GITHUB_REF= dagger -s call -m github.com/cloudnative-pg/daggerverse/commitlint@${DAGGER_COMMITLINT_SHA}
|
||||||
@ -74,7 +74,7 @@ tasks:
|
|||||||
- wordlist-ordered
|
- wordlist-ordered
|
||||||
env:
|
env:
|
||||||
# renovate: datasource=git-refs depName=uncommitted lookupName=https://github.com/cloudnative-pg/daggerverse currentValue=main
|
# renovate: datasource=git-refs depName=uncommitted lookupName=https://github.com/cloudnative-pg/daggerverse currentValue=main
|
||||||
DAGGER_UNCOMMITTED_SHA: f7187c307f2ba79290efbfff5ce436b956162c53
|
DAGGER_UNCOMMITTED_SHA: 7431c24907de3c6b1516114c8990d4f8d23d92cd
|
||||||
cmds:
|
cmds:
|
||||||
- GITHUB_REF= dagger -s call -m github.com/cloudnative-pg/daggerverse/uncommitted@${DAGGER_UNCOMMITTED_SHA} check-uncommitted --source . stdout
|
- GITHUB_REF= dagger -s call -m github.com/cloudnative-pg/daggerverse/uncommitted@${DAGGER_UNCOMMITTED_SHA} check-uncommitted --source . stdout
|
||||||
sources:
|
sources:
|
||||||
@ -86,7 +86,7 @@ tasks:
|
|||||||
- controller-gen
|
- controller-gen
|
||||||
env:
|
env:
|
||||||
# renovate: datasource=git-refs depName=crd-gen-refs lookupName=https://github.com/cloudnative-pg/daggerverse currentValue=main
|
# renovate: datasource=git-refs depName=crd-gen-refs lookupName=https://github.com/cloudnative-pg/daggerverse currentValue=main
|
||||||
DAGGER_CRDGENREF_SHA: f7187c307f2ba79290efbfff5ce436b956162c53
|
DAGGER_CRDGENREF_SHA: 7431c24907de3c6b1516114c8990d4f8d23d92cd
|
||||||
# renovate: datasource=go depName=github.com/elastic/crd-ref-docs
|
# renovate: datasource=go depName=github.com/elastic/crd-ref-docs
|
||||||
CRDREFDOCS_VERSION: v0.3.0
|
CRDREFDOCS_VERSION: v0.3.0
|
||||||
cmds:
|
cmds:
|
||||||
@ -383,7 +383,7 @@ tasks:
|
|||||||
run: once
|
run: once
|
||||||
env:
|
env:
|
||||||
# renovate: datasource=git-refs depName=controller-gen lookupName=https://github.com/cloudnative-pg/daggerverse currentValue=main
|
# renovate: datasource=git-refs depName=controller-gen lookupName=https://github.com/cloudnative-pg/daggerverse currentValue=main
|
||||||
DAGGER_CONTROLLER_GEN_SHA: f7187c307f2ba79290efbfff5ce436b956162c53
|
DAGGER_CONTROLLER_GEN_SHA: 7431c24907de3c6b1516114c8990d4f8d23d92cd
|
||||||
cmds:
|
cmds:
|
||||||
- >
|
- >
|
||||||
GITHUB_REF= dagger -s call -m github.com/cloudnative-pg/daggerverse/controller-gen@${DAGGER_CONTROLLER_GEN_SHA}
|
GITHUB_REF= dagger -s call -m github.com/cloudnative-pg/daggerverse/controller-gen@${DAGGER_CONTROLLER_GEN_SHA}
|
||||||
|
|||||||
@ -22,216 +22,236 @@ barman==3.19.1 \
|
|||||||
--hash=sha256:0a6a9e1babf97687732d8b2a3eb79ea95d55246a5257b9433865cb6e755221c0 \
|
--hash=sha256:0a6a9e1babf97687732d8b2a3eb79ea95d55246a5257b9433865cb6e755221c0 \
|
||||||
--hash=sha256:2f71c4a1f1ba53f694cbdf838bb9906d8ba02b97d1fd3041196e8999bec7a1ee
|
--hash=sha256:2f71c4a1f1ba53f694cbdf838bb9906d8ba02b97d1fd3041196e8999bec7a1ee
|
||||||
# via -r sidecar-requirements.in
|
# via -r sidecar-requirements.in
|
||||||
boto3==1.43.56 \
|
boto3==1.43.36 \
|
||||||
--hash=sha256:57c90df9fb026f2e6ae22530861198130203733c5c9ec4e5cca3a4037f5a8db4 \
|
--hash=sha256:42942dde254673abcbc9e6e60017c88341a4f49d99d24e1f2e290fb38138c26f \
|
||||||
--hash=sha256:feb699d4ab241ef5c1b80bb58277be2aaad365cd4b672d7817e0bc59ee45131b
|
--hash=sha256:587d7ee92a12e440ad12b0e7f11f3358f0c4d65b19f64726efc94aaf194aff28
|
||||||
# via barman
|
# via barman
|
||||||
botocore==1.43.56 \
|
botocore==1.43.36 \
|
||||||
--hash=sha256:6c01f85f0ff9863076f4c761e74ee3aa96c5ccc1ad09fc1efd62ef8f2d22bf57 \
|
--hash=sha256:3c65fdc39ed01d8dfde1e961b34038aed03c459f8ddf80717a12ac006475e49d \
|
||||||
--hash=sha256:aafc741f1b10f6fd63253eaf6ea029680c1ff436d87e1b8969d62aefa0c76976
|
--hash=sha256:4cae47d1b2d426316b85a0087d9e69e048f13bc003b5177d74639fe9dfd28205
|
||||||
# via
|
# via
|
||||||
# boto3
|
# boto3
|
||||||
# s3transfer
|
# s3transfer
|
||||||
certifi==2026.7.22 \
|
certifi==2026.6.17 \
|
||||||
--hash=sha256:62f22742b58a1a33014a2b6b706588a8d7e2a88ae7bd1a6ebe8c992928483775 \
|
--hash=sha256:024c88eeec92ca068db80f02b8b07c9cef7b9fe261d1d535abfd5abd6f6af432 \
|
||||||
--hash=sha256:741e2c3b351ddf169a738da9f2c048608ff7f2c5cc02f1ebc6b118bb090d5d55
|
--hash=sha256:2227dcbaafe0d2f59279d1762ddddc37783ed4354594f194ffc31d20f41fc3db
|
||||||
# via requests
|
# via requests
|
||||||
cffi==2.1.0 \
|
cffi==2.0.0 \
|
||||||
--hash=sha256:02cb7ff33ded4f1532476731f89ede53e2e488a8e6205515a82144246ffa7dcc \
|
--hash=sha256:00bdf7acc5f795150faa6957054fbbca2439db2f775ce831222b66f192f03beb \
|
||||||
--hash=sha256:03e9810d18c646077e501f661b682fbf5dee4676048527ca3cffe66faa9960dd \
|
--hash=sha256:07b271772c100085dd28b74fa0cd81c8fb1a3ba18b21e03d7c27f3436a10606b \
|
||||||
--hash=sha256:0520e1f4c35f44e209cbbb421b67eec42e6a157f59444dfb6058874ff3610e5d \
|
--hash=sha256:087067fa8953339c723661eda6b54bc98c5625757ea62e95eb4898ad5e776e9f \
|
||||||
--hash=sha256:0582a58f3051372229ca8e7f5f589f9e5632678208d8636fea3676711fdf7fe5 \
|
--hash=sha256:0a1527a803f0a659de1af2e1fd700213caba79377e27e4693648c2923da066f9 \
|
||||||
--hash=sha256:0611e7ebf90573a535ebdc33ae9da222d037853983e13359f580fab781ca017f \
|
--hash=sha256:0cf2d91ecc3fcc0625c2c530fe004f82c110405f101548512cce44322fa8ac44 \
|
||||||
--hash=sha256:0a42c688d19fca6e095a53c6a6e2295a5b050a8b289f109adab02a9e61a25de6 \
|
--hash=sha256:0f6084a0ea23d05d20c3edcda20c3d006f9b6f3fefeac38f59262e10cef47ee2 \
|
||||||
--hash=sha256:0a96b74cda968eebbad56d973efe5098974f0a9fb323865bf99ea1fd24e3e64c \
|
--hash=sha256:12873ca6cb9b0f0d3a0da705d6086fe911591737a59f28b7936bdfed27c0d47c \
|
||||||
--hash=sha256:10537b1df4967ca26d21e5072d7d54188354483b91dc75058968d3f0cf13fbda \
|
--hash=sha256:19f705ada2530c1167abacb171925dd886168931e0a7b78f5bffcae5c6b5be75 \
|
||||||
--hash=sha256:11b3fb55f4f8ad92274ed26705f65d8f91457de71f5380061eb6d125a768fecd \
|
--hash=sha256:1cd13c99ce269b3ed80b417dcd591415d3372bcac067009b6e0f59c7d4015e65 \
|
||||||
--hash=sha256:15faec4adfff450819f3aee0e2e02c812de6edb88203aa58807955db2003472a \
|
--hash=sha256:1e3a615586f05fc4065a8b22b8152f0c1b00cdbc60596d187c2a74f9e3036e4e \
|
||||||
--hash=sha256:164bff1657b2a74f0b6d54e11c9b375bc97b931f2ca9c43fcf875838da1570dd \
|
--hash=sha256:1f72fb8906754ac8a2cc3f9f5aaa298070652a0ffae577e0ea9bd480dc3c931a \
|
||||||
--hash=sha256:1854b724d00f6654c742097d5387569021be12d3a0f770eae1df8f8acfcc6acd \
|
--hash=sha256:1fc9ea04857caf665289b7a75923f2c6ed559b8298a1b8c49e59f7dd95c8481e \
|
||||||
--hash=sha256:19c54ac121cad98450b4896fa9a43ee0180d57bc4bc911a33db6cab1efab6cd3 \
|
--hash=sha256:203a48d1fb583fc7d78a4c6655692963b860a417c0528492a6bc21f1aaefab25 \
|
||||||
--hash=sha256:1b96bfe2c4bd825681b7d311ad6d9b7280a091f43e8f63da5729638083cd3bfb \
|
--hash=sha256:2081580ebb843f759b9f617314a24ed5738c51d2aee65d31e02f6f7a2b97707a \
|
||||||
--hash=sha256:1e9f50d192a3e525b15a75ab5114e442d83d657b7ec29182a991bc9a88fd3a66 \
|
--hash=sha256:21d1152871b019407d8ac3985f6775c079416c282e431a4da6afe7aefd2bccbe \
|
||||||
--hash=sha256:1ff3456eab0d889592d1936d6125bbfbc7ae4d3354a700f8bd80450a66445d4d \
|
--hash=sha256:24b6f81f1983e6df8db3adc38562c83f7d4a0c36162885ec7f7b77c7dcbec97b \
|
||||||
--hash=sha256:2282cd5e38aa8accd03e99d1256af8411c84cdbee6a89d841b563fdbd1f3e50f \
|
--hash=sha256:256f80b80ca3853f90c21b23ee78cd008713787b1b1e93eae9f3d6a7134abd91 \
|
||||||
--hash=sha256:276f20fffd7b396e12516ba8edf9509210ac248cbbc5acbc39cd512f9f59ebe6 \
|
--hash=sha256:28a3a209b96630bca57cce802da70c266eb08c6e97e5afd61a75611ee6c64592 \
|
||||||
--hash=sha256:2b71d409cccee78310ab5dec549aed052aaea483346e282c7b02362596e01bb0 \
|
--hash=sha256:2c8f814d84194c9ea681642fd164267891702542f028a15fc97d4674b6206187 \
|
||||||
--hash=sha256:2e9dabb9abcb7ad15938c7196ad5c1718a4e6d33cc79b4c0209bdb64c4a54a5c \
|
--hash=sha256:2de9a304e27f7596cd03d16f1b7c72219bd944e99cc52b84d0145aefb07cbd3c \
|
||||||
--hash=sha256:30b65779d598c370374fefabf138d456fd6f3216bfa7bedfab1ba82025b0cd93 \
|
--hash=sha256:38100abb9d1b1435bc4cc340bb4489635dc2f0da7456590877030c9b3d40b0c1 \
|
||||||
--hash=sha256:33eb1ad83ebe8f313e0df035c406227d55a79456704a863fad9842136af5ad7d \
|
--hash=sha256:3925dd22fa2b7699ed2617149842d2e6adde22b262fcbfada50e3d195e4b3a94 \
|
||||||
--hash=sha256:35aaea0c7ee0e58a5cd8c2fd1a48fdf7ece0d2699b7ecdda08194e9ce5dd9b3d \
|
--hash=sha256:3e17ed538242334bf70832644a32a7aae3d83b57567f9fd60a26257e992b79ba \
|
||||||
--hash=sha256:3681e031db29958a7502f5c0c9d6bbc4c36cb20f7b104086fa642d1799631ff8 \
|
--hash=sha256:3e837e369566884707ddaf85fc1744b47575005c0a229de3327f8f9a20f4efeb \
|
||||||
--hash=sha256:379de10ce1ba048b1448599d1b37b24caee16309d1ac98d3982fc997f768700b \
|
--hash=sha256:3f4d46d8b35698056ec29bca21546e1551a205058ae1a181d871e278b0b28165 \
|
||||||
--hash=sha256:37f525a7e7e50c017fdebe58b787be310ad59357ae43a053943a6e1a6c526001 \
|
--hash=sha256:44d1b5909021139fe36001ae048dbdde8214afa20200eda0f64c068cac5d5529 \
|
||||||
--hash=sha256:3b926723c13eba9f81d2ef3820d63aeceec3b2d4639906047bf675cb8a7a500d \
|
--hash=sha256:45d5e886156860dc35862657e1494b9bae8dfa63bf56796f2fb56e1679fc0bca \
|
||||||
--hash=sha256:3d7f118b5adbfdfead90c25822690b02bc8074fba949bb7858bec4ebd55adb43 \
|
--hash=sha256:4647afc2f90d1ddd33441e5b0e85b16b12ddec4fca55f0d9671fef036ecca27c \
|
||||||
--hash=sha256:46b1c8db8f6122420f32d02fffb924c2fe9bc772d228c7c711748fff56aabb2b \
|
--hash=sha256:4671d9dd5ec934cb9a73e7ee9676f9362aba54f7f34910956b84d727b0d73fb6 \
|
||||||
--hash=sha256:47ff3a8bfd8cb9da1af7524b965127095055654c177fcfc7578debcb015eecd0 \
|
--hash=sha256:53f77cbe57044e88bbd5ed26ac1d0514d2acf0591dd6bb02a3ae37f76811b80c \
|
||||||
--hash=sha256:4d433a51f1870e43a13b6732f92aaf540ff77c2015097c78556f75a2d6c030e0 \
|
--hash=sha256:5eda85d6d1879e692d546a078b44251cdd08dd1cfb98dfb77b670c97cee49ea0 \
|
||||||
--hash=sha256:4f26194e3d95e06501b942642855aed4f953d55e95d7d01b7c4483db3ecff458 \
|
--hash=sha256:5fed36fccc0612a53f1d4d9a816b50a36702c28a2aa880cb8a122b3466638743 \
|
||||||
--hash=sha256:510aeeeac94811b138077451da1fb18b308a5feab47dd2b603af55804155e1c8 \
|
--hash=sha256:61d028e90346df14fedc3d1e5441df818d095f3b87d286825dfcbd6459b7ef63 \
|
||||||
--hash=sha256:5972433ad71a9e46516584ef60a0fda12d9dc459938d1539c3ddecf9bdc1368d \
|
--hash=sha256:66f011380d0e49ed280c789fbd08ff0d40968ee7b665575489afa95c98196ab5 \
|
||||||
--hash=sha256:5ecbd0499275d57506d397eebe1981cee87b47fcd9ef5c22cab7ed7644a39a94 \
|
--hash=sha256:6824f87845e3396029f3820c206e459ccc91760e8fa24422f8b0c3d1731cbec5 \
|
||||||
--hash=sha256:6274dcb2d15cef48daa73ed1be5a40d501d74dccd0cd6db364776d12cb6ba022 \
|
--hash=sha256:6c6c373cfc5c83a975506110d17457138c8c63016b563cc9ed6e056a82f13ce4 \
|
||||||
--hash=sha256:63960549e4f8dc41e31accb97b975abaecfc44c03e396c093a6436763c2ea7db \
|
--hash=sha256:6d02d6655b0e54f54c4ef0b94eb6be0607b70853c45ce98bd278dc7de718be5d \
|
||||||
--hash=sha256:64c753a0f87a256020004f37a1c8c02c480e725f910f0b2a0f3f07debd1b2479 \
|
--hash=sha256:6d50360be4546678fc1b79ffe7a66265e28667840010348dd69a314145807a1b \
|
||||||
--hash=sha256:6af371f3767faeffc6ac1ef57cdfd25844403e9d3f476c5537caee499de96376 \
|
--hash=sha256:730cacb21e1bdff3ce90babf007d0a0917cc3e6492f336c2f0134101e0944f93 \
|
||||||
--hash=sha256:6ca4919c6e4f89aa99c42510b42cf54596892c00b3f9077f6bdd1505e24b9c8d \
|
--hash=sha256:737fe7d37e1a1bffe70bd5754ea763a62a066dc5913ca57e957824b72a85e205 \
|
||||||
--hash=sha256:6d194185eabd279f1c05ebe3504265ddfc5ad2b58d0714f7db9f01da592e9eb6 \
|
--hash=sha256:74a03b9698e198d47562765773b4a8309919089150a0bb17d829ad7b44b60d27 \
|
||||||
--hash=sha256:702c436735fbe99d59ada02a1f65cfc0d31c0ee8b7290912f8fbc5cd1e4b16c3 \
|
--hash=sha256:7553fb2090d71822f02c629afe6042c299edf91ba1bf94951165613553984512 \
|
||||||
--hash=sha256:716ff8ec22f20b4d988b12884086bcef0fc99737043e503f7a3935a6be99b1ea \
|
--hash=sha256:7a66c7204d8869299919db4d5069a82f1561581af12b11b3c9f48c584eb8743d \
|
||||||
--hash=sha256:762f99479dcb369f60ab9017ad4ab97a36a1dd7c1ee5a3b15db0f4b8659120cd \
|
--hash=sha256:7cc09976e8b56f8cebd752f7113ad07752461f48a58cbba644139015ac24954c \
|
||||||
--hash=sha256:7762faa47e8ff7eb80bd261d9a7d8eea2d8baa69de5e95b70c1f338bbe712f02 \
|
--hash=sha256:81afed14892743bbe14dacb9e36d9e0e504cd204e0b165062c488942b9718037 \
|
||||||
--hash=sha256:78474632761faa0fb96f30b1c928c84ebcf68713cbb80d15bab09dfe61640fde \
|
--hash=sha256:8941aaadaf67246224cee8c3803777eed332a19d909b47e29c9842ef1e79ac26 \
|
||||||
--hash=sha256:799416bae98336e400981ff6e532d67d5c709cfb30afb79865a1315f94b0e224 \
|
--hash=sha256:89472c9762729b5ae1ad974b777416bfda4ac5642423fa93bd57a09204712322 \
|
||||||
--hash=sha256:7d034dcffa09e9a46c93fa3a3be402096cb5354ac6e41ab8e5cc9cd8b642ad76 \
|
--hash=sha256:8ea985900c5c95ce9db1745f7933eeef5d314f0565b27625d9a10ec9881e1bfb \
|
||||||
--hash=sha256:7d28dff1db6764108bc30788d85d61c876beff416d9a49cb9dd7c5a9f34f5804 \
|
--hash=sha256:8eca2a813c1cb7ad4fb74d368c2ffbbb4789d377ee5bb8df98373c2cc0dee76c \
|
||||||
--hash=sha256:7d3538f9c0e50670f4deb93dbb696576e60590369cae2faf7de681e597a8a1f1 \
|
--hash=sha256:92b68146a71df78564e4ef48af17551a5ddd142e5190cdf2c5624d0c3ff5b2e8 \
|
||||||
--hash=sha256:7d5980a3433d4b71a5e120f9dd551403d7824e31e2e67124fe2769c404c06913 \
|
--hash=sha256:9332088d75dc3241c702d852d4671613136d90fa6881da7d770a483fd05248b4 \
|
||||||
--hash=sha256:7ea6b3e2c4250ff1de21c630fe72d0f63eb95c2c32ffbf64a358cf4a8836d714 \
|
--hash=sha256:94698a9c5f91f9d138526b48fe26a199609544591f859c870d477351dc7b2414 \
|
||||||
--hash=sha256:86cf8755a791f72c85dc287128cc62d4f24d392e3f1e15837245623f4a33cccc \
|
--hash=sha256:9a67fc9e8eb39039280526379fb3a70023d77caec1852002b4da7e8b270c4dd9 \
|
||||||
--hash=sha256:88023dfe18799507b73f1dbb0d14326a17465de1bc9c9c7655c22845e9ddc3a2 \
|
--hash=sha256:9de40a7b0323d889cf8d23d1ef214f565ab154443c42737dfe52ff82cf857664 \
|
||||||
--hash=sha256:89095c1968b4ba8285840e131bf2891b09ae137fe2146905acae0354fbce1b5e \
|
--hash=sha256:a05d0c237b3349096d3981b727493e22147f934b20f6f125a3eba8f994bec4a9 \
|
||||||
--hash=sha256:8d35c139744adb3e727cd51b1a18324bbe44b8bd41bf8322bca4d41289f48eda \
|
--hash=sha256:afb8db5439b81cf9c9d0c80404b60c3cc9c3add93e114dcae767f1477cb53775 \
|
||||||
--hash=sha256:8e74a6135550c4748af665b1b1118b6aab33b1fc6a16f9aff630af107c3b4512 \
|
--hash=sha256:b18a3ed7d5b3bd8d9ef7a8cb226502c6bf8308df1525e1cc676c3680e7176739 \
|
||||||
--hash=sha256:8f9ec95b8a043d3dfbc74d9abc6f7baf524dd27a8dc160b0a32ff9cdab650c28 \
|
--hash=sha256:b1e74d11748e7e98e2f426ab176d4ed720a64412b6a15054378afdb71e0f37dc \
|
||||||
--hash=sha256:90bec57cf82089383bd06a605b3eb8daebf7e5a668520beaf6e327a83a947699 \
|
--hash=sha256:b21e08af67b8a103c71a250401c78d5e0893beff75e28c53c98f4de42f774062 \
|
||||||
--hash=sha256:95f2954c2c9473d892eca6e0409f3568b37ab62a8eedb122461f73cc273476e3 \
|
--hash=sha256:b4c854ef3adc177950a8dfc81a86f5115d2abd545751a304c5bcf2c2c7283cfe \
|
||||||
--hash=sha256:961be50688f7fba2fa65f63712d3b9b341a22311f5253460ce933f52f0de1c8c \
|
--hash=sha256:b882b3df248017dba09d6b16defe9b5c407fe32fc7c65a9c69798e6175601be9 \
|
||||||
--hash=sha256:98fff996e983a36d3aa2eca83af40c5821202e7e6f32d13ae94e3d2286f10cfe \
|
--hash=sha256:baf5215e0ab74c16e2dd324e8ec067ef59e41125d3eade2b863d294fd5035c92 \
|
||||||
--hash=sha256:9b8f0f26ca4e7513c534d351eca551947d053fac438f2a04ac96d882909b0d3a \
|
--hash=sha256:c649e3a33450ec82378822b3dad03cc228b8f5963c0c12fc3b1e0ab940f768a5 \
|
||||||
--hash=sha256:9d72af0cf10a76a600a9690078fe31c63b9588c8e86bf9fd353f713c84b5db0f \
|
--hash=sha256:c654de545946e0db659b3400168c9ad31b5d29593291482c43e3564effbcee13 \
|
||||||
--hash=sha256:9d8272c0e483b024e1b9ad029821470ed8ec65631dbd90217469da0e7cd89f1c \
|
--hash=sha256:c6638687455baf640e37344fe26d37c404db8b80d037c3d29f58fe8d1c3b194d \
|
||||||
--hash=sha256:a016194dbe13d14ee9556e734b772d8d67b947092b268d757fd4290e3ba2dfc2 \
|
--hash=sha256:c8d3b5532fc71b7a77c09192b4a5a200ea992702734a2e9279a37f2478236f26 \
|
||||||
--hash=sha256:a5781494d4d400a3f47f8f1da94b324f6e6b440a53387774002890a2a2f4b50f \
|
--hash=sha256:cb527a79772e5ef98fb1d700678fe031e353e765d1ca2d409c92263c6d43e09f \
|
||||||
--hash=sha256:a95b05f9baf29b91171b3a8bd2020b028835243e7b0ff6bb23e2a3c228518b1b \
|
--hash=sha256:cf364028c016c03078a23b503f02058f1814320a56ad535686f90565636a9495 \
|
||||||
--hash=sha256:aa7a1b53a2a4452ada2d1b5dade9960b2522f1e61293a811a077439e39029565 \
|
--hash=sha256:d48a880098c96020b02d5a1f7d9251308510ce8858940e6fa99ece33f610838b \
|
||||||
--hash=sha256:ac0f1a2d0cfa7eea3f2aaf006ab6e70e8feeb16b75d65b7e5939982ca2f11056 \
|
--hash=sha256:d68b6cef7827e8641e8ef16f4494edda8b36104d79773a334beaa1e3521430f6 \
|
||||||
--hash=sha256:af5e2915d41fe6c961694d7bfdc8562942638200f3ce2765dfb8b745cf997629 \
|
--hash=sha256:d9b29c1f0ae438d5ee9acb31cadee00a58c46cc9c0b2f9038c6b0b3470877a8c \
|
||||||
--hash=sha256:b6422532152adf4e59b110cb2808cee7a033800952f5c036b4af047ee43199e7 \
|
--hash=sha256:d9b97165e8aed9272a6bb17c01e3cc5871a594a446ebedc996e2397a1c1ea8ef \
|
||||||
--hash=sha256:b65f590ef2a44640f9a05dbb548a429b4ade77913ce683ac8b1480777658a6c0 \
|
--hash=sha256:da68248800ad6320861f129cd9c1bf96ca849a2771a59e0344e88681905916f5 \
|
||||||
--hash=sha256:ba00f661f8ba35d075c937174e27c2c421cec3942fd2e0ea3e66996757c0fdd9 \
|
--hash=sha256:da902562c3e9c550df360bfa53c035b2f241fed6d9aef119048073680ace4a18 \
|
||||||
--hash=sha256:bccbbb5ee76a61f9d99b5bf3846a51d7fca4b6a732fe46f89295610edaf41853 \
|
--hash=sha256:dbd5c7a25a7cb98f5ca55d258b103a2054f859a46ae11aaf23134f9cc0d356ad \
|
||||||
--hash=sha256:bf01d8c84cbea96b944c73b22182e6c7c432b3475632b8111dbfdc95ddad6e13 \
|
--hash=sha256:dd4f05f54a52fb558f1ba9f528228066954fee3ebe629fc1660d874d040ae5a3 \
|
||||||
--hash=sha256:bf5c6cf48238b0eb4c086978c492ad1cbc22373fc5b2d7353b3a598ce6db887a \
|
--hash=sha256:de8dad4425a6ca6e4e5e297b27b5c824ecc7581910bf9aee86cb6835e6812aa7 \
|
||||||
--hash=sha256:c16914df9fb7f500e440e6875fa23ff5e0b31db01fa9c06af98d59a91f0dc2e4 \
|
--hash=sha256:e11e82b744887154b182fd3e7e8512418446501191994dbf9c9fc1f32cc8efd5 \
|
||||||
--hash=sha256:c351efb95e832a853a29361675f33a7ce53de1a109cd73fd47af0712213aa4ce \
|
--hash=sha256:e6e73b9e02893c764e7e8d5bb5ce277f1a009cd5243f8228f75f842bf937c534 \
|
||||||
--hash=sha256:c4165821e131d6d4ca444347c2b694e2311bcfa3fe5a861cc72968f28867beac \
|
--hash=sha256:f73b96c41e3b2adedc34a7356e64c8eb96e03a3782b535e043a986276ce12a49 \
|
||||||
--hash=sha256:c5f5df567f6eb216de69be06ce55c8b714090fae02b18a3b40da8163b8c5fa9c \
|
--hash=sha256:f93fd8e5c8c0a4aa1f424d6173f14a892044054871c771f8566e4008eaa359d2 \
|
||||||
--hash=sha256:c941bb58d5a6e1c3892d86e42927ed6c180302f07e6d395d08c416e594b98b46 \
|
--hash=sha256:fc33c5141b55ed366cfaad382df24fe7dcbc686de5be719b207bb248e3053dc5 \
|
||||||
--hash=sha256:c97f080ea627e2863524c5af3836e2270b5f5dfff1f104392b959f8df0c5d384 \
|
--hash=sha256:fc7de24befaeae77ba923797c7c87834c73648a05a4bde34b3b7e5588973a453 \
|
||||||
--hash=sha256:cb96698e3c7413d906ce83f8ffd245ec1bd94707541f299d0ce4d6b0193e982b \
|
--hash=sha256:fe562eb1a64e67dd297ccc4f5addea2501664954f2692b69a76449ec7913ecbf
|
||||||
--hash=sha256:cbb7640ce37159548d2147b5b8c241f962143d4c71231431820783f4dc78f210 \
|
|
||||||
--hash=sha256:cdf2448aab5f661c9315308ec8b93f4e8a1a67a3c733f8631067a2b67d5913dc \
|
|
||||||
--hash=sha256:d2117334c3af3bdcb9a88522b844a2bdb5efdc4f71c6c822df55486ae1c3347a \
|
|
||||||
--hash=sha256:d53d10f7da99ae46f7373b9150393e9c5eab9b224909982b43832668de4779f5 \
|
|
||||||
--hash=sha256:d9fafc5aa2e2a39aaf7f8cc0c1f044a9b07fca12e558dca53a3cc5c654ad67a7 \
|
|
||||||
--hash=sha256:db3eb7d46527159a878ec3460e9d40615bc25ba337d477db681aea6e4f05c5d2 \
|
|
||||||
--hash=sha256:dbf7c7a88e2bac086f06d14577332760bdeecc42bdec8ac4077f6260557d9326 \
|
|
||||||
--hash=sha256:df2b82571a1b30f58a87bf4e5a9e78d2b1eff6c6ce8fd3aa3757221f93f0863f \
|
|
||||||
--hash=sha256:df92f2aba50eb4d96718b68ef76f2e57a57b54f2fa62333496d16c6d585a85ca \
|
|
||||||
--hash=sha256:eb4e8997a49aa2c08a3e43c9045d224448b8941d88e7ac163c7d383e560cbf98 \
|
|
||||||
--hash=sha256:efc1cdd798b1aaf39b4610bba7aad28c9bea9b910f25c784ccf9ec1fa719d1f9 \
|
|
||||||
--hash=sha256:f146d154428a2523f9cc7936c02353c2459b8f6cf07d3cd1ee1c0a611109c5d5 \
|
|
||||||
--hash=sha256:f5bce581e6b8c235e566a14768a943b172ada3ed73537bb0c0be1edee312d4e7 \
|
|
||||||
--hash=sha256:f9912624a0c0b834b7520d7769b3644453aabc0a7e1c839da7359f050750e9bc \
|
|
||||||
--hash=sha256:fb62edb5bb52cca65fab91a63afa7561607120d26090a7e8fda6fb9f064726da \
|
|
||||||
--hash=sha256:ff067a8d8d880e7809e4ac88eb009bb848870115317b306666502ccad30b147f
|
|
||||||
# via cryptography
|
# via cryptography
|
||||||
charset-normalizer==3.4.9 \
|
charset-normalizer==3.4.7 \
|
||||||
--hash=sha256:0327fcd59a935777d83410750c50600ee9571af2846f71ce40f25b13da1ef380 \
|
--hash=sha256:007d05ec7321d12a40227aae9e2bc6dca73f3cb21058999a1df9e193555a9dcc \
|
||||||
--hash=sha256:03d07803992c6c7bbc976327f34b18b6160327fc81cb82c9d504720ac0be3b62 \
|
--hash=sha256:03853ed82eeebbce3c2abfdbc98c96dc205f32a79627688ac9a27370ea61a49c \
|
||||||
--hash=sha256:04ce310cb89c15df659582aee80a0603788732a5e017d5bd5c81158106ce249c \
|
--hash=sha256:07d9e39b01743c3717745f4c530a6349eadbfa043c7577eef86c502c15df2c67 \
|
||||||
--hash=sha256:0d861473f743244d349b50f850d10eb87aeb22bbdcc8e64f79273c94af5a8226 \
|
--hash=sha256:08e721811161356f97b4059a9ba7bafb23ea5ee2255402c42881c214e173c6b4 \
|
||||||
--hash=sha256:0e94703ec9684807f20cfb5eed95c70f67f2a8f21ad620146d7b5a13677b93e5 \
|
--hash=sha256:0c96c3b819b5c3e9e165495db84d41914d6894d55181d2d108cc1a69bfc9cce0 \
|
||||||
--hash=sha256:0fa1aec2d32bcc03c8fa0f6f1712caad1adc38509f31142112e5c9daf5b9c833 \
|
--hash=sha256:0ea948db76d31190bf08bd371623927ee1339d5f2a0b4b1b4a4439a65298703c \
|
||||||
--hash=sha256:16b65ea0f2465b6fb52aa22de5eca612aa964ddfec00a912e26f4656cbef890b \
|
--hash=sha256:0f7eb884681e3938906ed0434f20c63046eacd0111c4ba96f27b76084cd679f5 \
|
||||||
--hash=sha256:16d10d789dd9bcca1173c95af82c58433122564b7bc39385124be735a35cbe99 \
|
--hash=sha256:12a6fff75f6bc66711b73a2f0addfc4c8c15a20e805146a02d147a318962c444 \
|
||||||
--hash=sha256:19ac87f93086ce37b86e098888555c4b4bc48102279bae3350098c0ed664b501 \
|
--hash=sha256:12d8baf840cc7889b37c7c770f478adea7adce3dcb3944d02ec87508e2dcf153 \
|
||||||
--hash=sha256:1d22856ffbe153a602df38e4a5464f0b748a54002e0d69ac6d2ad0a197cc99ec \
|
--hash=sha256:14265bfe1f09498b9d8ec91e9ec9fa52775edf90fcbde092b25f4a33d444fea9 \
|
||||||
--hash=sha256:21e764fd1e70b6a3e205a0e46f3051701f98a8cb3fad66eeb80e48bb502f8698 \
|
--hash=sha256:16d971e29578a5e97d7117866d15889a4a07befe0e87e703ed63cd90cb348c01 \
|
||||||
--hash=sha256:231ddcbb35e2ff8973e1365db41fe0572662893b99a05deb183b68ad4c0c8bd4 \
|
--hash=sha256:177a0ba5f0211d488e295aaf82707237e331c24788d8d76c96c5a41594723217 \
|
||||||
--hash=sha256:253a4a220747e8b5faf57ec320c4f5efb0cef05f647420bf267143ec15dba10a \
|
--hash=sha256:1a87ca9d5df6fe460483d9a5bbf2b18f620cbed41b432e2bddb686228282d10b \
|
||||||
--hash=sha256:280081916dc341820640489a66e4696049401ef1cf6dd672f672e70ad915aca3 \
|
--hash=sha256:1c2a768fdd44ee4a9339a9b0b130049139b8ce3c01d2ce09f67f5a68048d477c \
|
||||||
--hash=sha256:2a441ea71902098ffe78c5abe6c494f44160b4af614ed16c3d9a3b1d17fd8ee2 \
|
--hash=sha256:1c2aed2e5e41f24ea8ef1590b8e848a79b56f3a5564a65ceec43c9d692dc7d8a \
|
||||||
--hash=sha256:304b13570067b2547562e308af560b3963857b1fa90bd6afd978130130fe2d6a \
|
--hash=sha256:1dc8b0ea451d6e69735094606991f32867807881400f808a106ee1d963c46a83 \
|
||||||
--hash=sha256:32286a2c8d167e897177b673176c1e3e00d4057caf5d2b64eef9a3666b03018e \
|
--hash=sha256:1efde3cae86c8c273f1eb3b287be7d8499420cf2fe7585c41d370d3e790054a5 \
|
||||||
--hash=sha256:33bdcc2a32c0a0e861f60841a512c8acc658c87c2ac59d89e3a46dacf7d866e4 \
|
--hash=sha256:202389074300232baeb53ae2569a60901f7efadd4245cf3a3bf0617d60b439d7 \
|
||||||
--hash=sha256:375b83ed0aecfce76c16d198fbc21f3b11b337d68662bea0a995046682a11419 \
|
--hash=sha256:203104ed3e428044fd943bc4bf45fa73c0730391f9621e37fe39ecf477b128cb \
|
||||||
--hash=sha256:3c09a49d6cde137258beb3d551994a2927fd35ad5cf96aed573f61bbd67c5f84 \
|
--hash=sha256:2257141f39fe65a3fdf38aeccae4b953e5f3b3324f4ff0daf9f15b8518666a2c \
|
||||||
--hash=sha256:3d92613ec25e43b05f042302531ec0f00b8445190e43325880cbd6ab7c2581da \
|
--hash=sha256:298930cec56029e05497a76988377cbd7457ba864beeea92ad7e844fe74cd1f1 \
|
||||||
--hash=sha256:40a126142a56b2dfc0aacbad1de8310cbf60da7656db0e6b16eebd48e3e93519 \
|
--hash=sha256:2cd4a60d0e2fb04537162c62bbbb4182f53541fe0ede35cdf270a1c1e723cc42 \
|
||||||
--hash=sha256:416c229f77e5ea25b3dfd4b582f8d73d7e43c22320302b9ab128a2d3a0b38efe \
|
--hash=sha256:2d6eb928e13016cea4f1f21d1e10c1cebd5a421bc57ddf5b1142ae3f86824fab \
|
||||||
--hash=sha256:432786d3561e69aeeae6c7e8648964ce0ad05736120135601f87ac26b9c83381 \
|
--hash=sha256:2fe249cb4651fd12605b7288b24751d8bfd46d35f12a20b1ba33dea122e690df \
|
||||||
--hash=sha256:43b9e366a31fdd1c87d0eb08f579b4a82b723ea54338f040d6b4e518a026ea29 \
|
--hash=sha256:30b8d1d8c52a48c2c5690e152c169b673487a2a58de1ec7393196753063fcd5e \
|
||||||
--hash=sha256:440eede837960000d74978f0eba527be106b5b9aee0daf779d395276ed0b0614 \
|
--hash=sha256:320ade88cfb846b8cd6b4ddf5ee9e80ee0c1f52401f2456b84ae1ae6a1a5f207 \
|
||||||
--hash=sha256:45b0cc4e3556cd875e09102988d1ab8356c998b596c9fced84547c8138b487a0 \
|
--hash=sha256:3534e7dcbdcf757da6b85a0bbf5b6868786d5982dd959b065e65481644817a18 \
|
||||||
--hash=sha256:476743fe6dfe14a2da12e3ac79125dc84a3b2cf8094369a47a1529b0cd8549fe \
|
--hash=sha256:36836d6ff945a00b88ba1e4572d721e60b5b8c98c155d465f56ad19d68f23734 \
|
||||||
--hash=sha256:4773092f8019072343a7447203308b176e10199920eb02d6195e81bbb3274c29 \
|
--hash=sha256:38c0109396c4cfc574d502df99742a45c72c08eff0a36158b6f04000043dbf38 \
|
||||||
--hash=sha256:4b3dac63058cc36820b0dd072f89898604e2d39686fe05321729d00d8ac185a0 \
|
--hash=sha256:3946fa46a0cf3e4c8cb1cc52f56bb536310d34f25f01ca9b6c16afa767dab110 \
|
||||||
--hash=sha256:4d1c96a7a18b9690a4d46df09e3e3382406ae3213727cd1019ebade1c4a81917 \
|
--hash=sha256:3bec022aec2c514d9cf199522a802bd007cd588ab17ab2525f20f9c34d067c18 \
|
||||||
--hash=sha256:51307f5c71007673a2bf8232ad973483d281e74cb99c8c5a990af1eefa6277d9 \
|
--hash=sha256:3c9a494bc5ec77d43cea229c4f6db1e4d8fe7e1bbffa8b6f0f0032430ff8ab44 \
|
||||||
--hash=sha256:51447e9aa2684679af07ca5021c3db526e0284347ebf4ffcec1154c3350cfe32 \
|
--hash=sha256:3dce51d0f5e7951f8bb4900c257dad282f49190fdbebecd4ba99bcc41fef404d \
|
||||||
--hash=sha256:58150c9f9b9a552505912d182ccdf26f6396fb6094816ceebcbb20eecabaed94 \
|
--hash=sha256:3dedcc22d73ec993f42055eff4fcfed9318d1eeb9a6606c55892a26964964e48 \
|
||||||
--hash=sha256:5b10cd92fc5c498b35a8635df6d5a100207f88b63a4dc1de7ef9a548e1e2cd63 \
|
--hash=sha256:4042d5c8f957e15221d423ba781e85d553722fc4113f523f2feb7b188cc34c5e \
|
||||||
--hash=sha256:5e226f6218febc71f6c1fc2fafb91c226f75bdc1d8fb12d66823716e891608fd \
|
--hash=sha256:481551899c856c704d58119b5025793fa6730adda3571971af568f66d2424bb5 \
|
||||||
--hash=sha256:609b3ba8fcc0fb5ab7af00719d0fb6ad0cb518e48e7712d12fd68f1327951198 \
|
--hash=sha256:4dc1e73c36828f982bfe79fadf5919923f8a6f4df2860804db9a98c48824ce8d \
|
||||||
--hash=sha256:60f44ade2cf573dad7a277e6f8ca9a51a21dda572b13bd7d8539bb3cd5dbedde \
|
--hash=sha256:4e5163c14bffd570ef2affbfdd77bba66383890797df43dc8b4cc7d6f500bf53 \
|
||||||
--hash=sha256:611057cc5d5c0afc743ba8be6bd828c17e0aaa8643f9d0a9b9bb7dea80eb8012 \
|
--hash=sha256:511ef87c8aec0783e08ac18565a16d435372bc1ac25a91e6ac7f5ef2b0bff790 \
|
||||||
--hash=sha256:6366a16e1a25018694d6a5d784d09b046edc9eac40ea2b54065c3052672516a1 \
|
--hash=sha256:532bc9bf33a68613fd7d65e4b1c71a6a38d7d42604ecf239c77392e9b4e8998c \
|
||||||
--hash=sha256:65a7ff3f705e57d392f7261b6d0550fe137c3019477431f1c355e0db0a7d3e15 \
|
--hash=sha256:54523e136b8948060c0fa0bc7b1b50c32c186f2fceee897a495406bb6e311d2b \
|
||||||
--hash=sha256:673611bbd43f0810bec0b0f028ddeaaa501190339cac411f347ac76917c3ae7b \
|
--hash=sha256:5649fd1c7bade02f320a462fdefd0b4bd3ce036065836d4f42e0de958038e116 \
|
||||||
--hash=sha256:67830fc78e67501f47bb950471b2dcb9b35b140084429318e862895a8e89c993 \
|
--hash=sha256:56be790f86bfb2c98fb742ce566dfb4816e5a83384616ab59c49e0604d49c51d \
|
||||||
--hash=sha256:68ce9f4d6b26d5ccbf7fd4459bf75f74a0a146677ebba80597df60cbdb20e6f4 \
|
--hash=sha256:5b77459df20e08151cd6f8b9ef8ef1f961ef73d85c21a555c7eed5b79410ec10 \
|
||||||
--hash=sha256:68e5f26a1ad57ded6d1cfb85331d1c1a195314756471d97758c48498bb4dcdf5 \
|
--hash=sha256:5ed6ab538499c8644b8a3e18debabcd7ce684f3fa91cf867521a7a0279cab2d6 \
|
||||||
--hash=sha256:69b157c5d3292bcd443faca052f3096f637f1e074b98212a933c074ae23dc3b8 \
|
--hash=sha256:6178f72c5508bfc5fd446a5905e698c6212932f25bcdd4b47a757a50605a90e2 \
|
||||||
--hash=sha256:75286256590a6320cf106a0d28970d3560aad9ee09aa7b34fb40524792436d35 \
|
--hash=sha256:6370e8686f662e6a3941ee48ed4742317cafbe5707e36406e9df792cdb535776 \
|
||||||
--hash=sha256:78841cccf1af7b40f6f716338d50c0902dbe88d9f800b3c973b7a9a0a693a642 \
|
--hash=sha256:64f02c6841d7d83f832cd97ccf8eb8a906d06eb95d5276069175c696b024b60a \
|
||||||
--hash=sha256:78fa18e436a1a0e58dbd7e02fc4473f3f32cceb12df9dfca542d075961c307d2 \
|
--hash=sha256:65bcd23054beab4d166035cabbc868a09c1a49d1efe458fe8e4361215df40265 \
|
||||||
--hash=sha256:79580094b00d1789d1f93ea55bc43cb2f611910c72235b7657f3482ddcc1b22d \
|
--hash=sha256:66671f93accb62ed07da56613636f3641f1a12c13046ce91ffc923721f23c008 \
|
||||||
--hash=sha256:7b86a2b16095d250c6f58b3d9b2eee6f4147754344f3dab0922f7c9bf7d226c9 \
|
--hash=sha256:6696b7688f54f5af4462118f0bfa7c1621eeb87154f77fa04b9295ce7a8f2943 \
|
||||||
--hash=sha256:83aed2c10721ddd90f68140685391b50811a880af20654c59af6b6c66c40513c \
|
--hash=sha256:6785f414ae0f3c733c437e0f3929197934f526d19dfaa75e18fdb4f94c6fb374 \
|
||||||
--hash=sha256:84fd18bcc17526fc2b3c1af7d2b9217d32c9c04448c16ec693b9b4f1985c3d33 \
|
--hash=sha256:67f6279d125ca0046a7fd386d01b311c6363844deac3e5b069b514ba3e63c246 \
|
||||||
--hash=sha256:871ff67ea1aad4dfd91736464934d56b32dac49f9fbe16cddba36198a7b3a0db \
|
--hash=sha256:6c114670c45346afedc0d947faf3c7f701051d2518b943679c8ff88befe14f8e \
|
||||||
--hash=sha256:898f0e9068ca27d37f8e83a5b962821df851532e6c4a7d615c1c033f9da6eedf \
|
--hash=sha256:6e0d51f618228538a3e8f46bd246f87a6cd030565e015803691603f55e12afb5 \
|
||||||
--hash=sha256:8a79d9f4d8001473a30c163556b3c3bfebec837495a412dde78b51672f6134f9 \
|
--hash=sha256:6ed74185b2db44f41ef35fd1617c5888e59792da9bbc9190d6c7300617182616 \
|
||||||
--hash=sha256:8c041122946b7ba21bb32c45b1aa57b1be35527690aeb3c5c234521085632eee \
|
--hash=sha256:708838739abf24b2ceb208d0e22403dd018faeef86ddac04319a62ae884c4f15 \
|
||||||
--hash=sha256:90c44bc373b7687f6948b693cceaea1348ae0975d7474746559494468e3c1d84 \
|
--hash=sha256:715479b9a2802ecac752a3b0efa2b0b60285cf962ee38414211abdfccc233b41 \
|
||||||
--hash=sha256:9104ed0bd76a429d46f9ec0dbc9b08ad1d2dcdf2b00a5a0daa1c145329b35b44 \
|
--hash=sha256:733784b6d6def852c814bce5f318d25da2ee65dd4839a0718641c696e09a2960 \
|
||||||
--hash=sha256:920079c3f7456fa213e0829ed2073aaa727fd39d889ead5b4f35d0de5460d04f \
|
--hash=sha256:750e02e074872a3fad7f233b47734166440af3cdea0add3e95163110816d6752 \
|
||||||
--hash=sha256:93d59d504b230e83c7a843251681959a0b6a9cd76f6e146ce1b8a80eb8739af9 \
|
--hash=sha256:752a45dc4a6934060b3b0dab47e04edc3326575f82be64bc4fc293914566503e \
|
||||||
--hash=sha256:9b2aff1c7b3884512b9512c3eaadd9bab39fb45042ffaaa1dd08ff2b9f8109d9 \
|
--hash=sha256:7579e913a5339fb8fa133f6bbcfd8e6749696206cf05acdbdca71a1b436d8e72 \
|
||||||
--hash=sha256:9b8e0f3107e2200b76f6054de99016eac3ee6762713587b36baaa7e4bd2ae177 \
|
--hash=sha256:7641bb8895e77f921102f72833904dcd9901df5d6d72a2ab8f31d04b7e51e4e7 \
|
||||||
--hash=sha256:9bb41182d93ea91f60b4bc8fbf4c820c69ef8a12ab2d917f3f1834f1acad07e8 \
|
--hash=sha256:7804338df6fcc08105c7745f1502ba68d900f45fd770d5bdd5288ddccb8a42d8 \
|
||||||
--hash=sha256:9cdef90ae47919cae358d8ab15797a800ed41da7aba5d72419fb510729e2ed4b \
|
--hash=sha256:80d04837f55fc81da168b98de4f4b797ef007fc8a79ab71c6ec9bc4dd662b15b \
|
||||||
--hash=sha256:a1786910334ed46ab1dd73222f2cd1e05c2c3bb39f6dddb4f8b36fc382058a39 \
|
--hash=sha256:813c0e0132266c08eb87469a642cb30aaff57c5f426255419572aaeceeaa7bf4 \
|
||||||
--hash=sha256:a4cfde78a9f2880208d16a93b795726a3017d5977e08d1e162a7a31322479c41 \
|
--hash=sha256:82b271f5137d07749f7bf32f70b17ab6eaabedd297e75dce75081a24f76eb545 \
|
||||||
--hash=sha256:a4fbdde9dd4a9ce5fd52c2b3a347bb50cc89483ef783f1cb00d408c13f7a96c0 \
|
--hash=sha256:84c018e49c3bf790f9c2771c45e9313a08c2c2a6342b162cd650258b57817706 \
|
||||||
--hash=sha256:aa99adc8f081b475a12843953db36831eaf83ec33eb46a90629ca6a5de45a616 \
|
--hash=sha256:8751d2787c9131302398b11e6c8068053dcb55d5a8964e114b6e196cf16cb366 \
|
||||||
--hash=sha256:ac351b3b8014eead140e77e9717e2992c6bbe30b63bc3422422eb84865412e3d \
|
--hash=sha256:8778f0c7a52e56f75d12dae53ae320fae900a8b9b4164b981b9c5ce059cd1fcb \
|
||||||
--hash=sha256:ad41ba96094304aa090f5a30cb6e4fb3b3f1c264c523394b4c39bbacc4dc92ba \
|
--hash=sha256:87fad7d9ba98c86bcb41b2dc8dbb326619be2562af1f8ff50776a39e55721c5a \
|
||||||
--hash=sha256:b5314963fce9b0b12743891de876e724997864ee22aa496f903f426c7e2fa5b2 \
|
--hash=sha256:8d828b6667a32a728a1ad1d93957cdf37489c57b97ae6c4de2860fa749b8fc1e \
|
||||||
--hash=sha256:bcf74c1df76758a395bf0af608c04c82257523f55c9868b334f06270d0f2112b \
|
--hash=sha256:8e385e4267ab76874ae30db04c627faaaf0b509e1ccc11a95b3fc3e83f855c00 \
|
||||||
--hash=sha256:bd47ba7fc3ca94896759ea0109775132d3e7ab921fbf54038e1bab2e46c313c9 \
|
--hash=sha256:92a0a01ead5e668468e952e4238cccd7c537364eb7d851ab144ab6627dbbe12f \
|
||||||
--hash=sha256:c0323c9daef75ef2e5083624b4585018a0c9d5e3b40f607eed81a311270b934b \
|
--hash=sha256:94e1885b270625a9a828c9793b4d52a64445299baa1fea5a173bf1d3dd9a1a5a \
|
||||||
--hash=sha256:c1225416b463483160e4af85d5fc3a9690ccb53fd4b1865a6437825f5ede3209 \
|
--hash=sha256:a180c5e59792af262bf263b21a3c49353f25945d8d9f70628e73de370d55e1e1 \
|
||||||
--hash=sha256:c1c948747b03be832dceed96ca815cef7360de9aa19d37c730f8e3f6101aca48 \
|
--hash=sha256:a277ab8928b9f299723bc1a2dabb1265911b1a76341f90a510368ca44ad9ab66 \
|
||||||
--hash=sha256:c25fe15c70c59eb7c5ce8c06a1f3fa1da0ecc5ea1e7a5922c40fd2fa9b0d5046 \
|
--hash=sha256:a5fe03b42827c13cdccd08e6c0247b6a6d4b5e3cdc53fd1749f5896adcdc2356 \
|
||||||
--hash=sha256:cc1b0fff8ead343dae06305f954eb8468ba0ec1a97881f42489d198e4ce3c632 \
|
--hash=sha256:a6c5863edfbe888d9eff9c8b8087354e27618d9da76425c119293f11712a6319 \
|
||||||
--hash=sha256:cd6280cf040f233bd7d3407b743b4b4c74f70e8e1c4199cb112a62c941c0772a \
|
--hash=sha256:a89c23ef8d2c6b27fd200a42aa4ac72786e7c60d40efdc76e6011260b6e949c4 \
|
||||||
--hash=sha256:cd6c3d4b783c556fa00bf540854e42f135e2f256abd29669fcd0da0f2dec79c2 \
|
--hash=sha256:adb2597b428735679446b46c8badf467b4ca5f5056aae4d51a19f9570301b1ad \
|
||||||
--hash=sha256:d4d6fcde76f94f5cb9e43e9e9a61f16dacefd228cbbf6f1a09bd9b219a92f1a1 \
|
--hash=sha256:ae196f021b5e7c78e918242d217db021ed2a6ace2bc6ae94c0fc596221c7f58d \
|
||||||
--hash=sha256:ddf4af30b417d9fe16481e9b81c27ab2a7cde1ff7ba3e85653b02db7d145dc7b \
|
--hash=sha256:ae89db9e5f98a11a4bf50407d4363e7b09b31e55bc117b4f7d80aab97ba009e5 \
|
||||||
--hash=sha256:df115d4d83168fdf2cae48ef1ff6d1cb4c466364e30861b37121de0f3bf1b990 \
|
--hash=sha256:aed52fea0513bac0ccde438c188c8a471c4e0f457c2dd20cdbf6ea7a450046c7 \
|
||||||
--hash=sha256:df7276909358e5635ae203673ab7e509ddd224225a8d6b0790bf13eb2bde1cc5 \
|
--hash=sha256:aef65cd602a6d0e0ff6f9930fcb1c8fec60dd2cfcb6facaf4bdb0e5873042db0 \
|
||||||
--hash=sha256:e4fd89cc178bced6ad29cb3e6dd4aa63fa5017c3524dbd0b25998fb64a87cc8b \
|
--hash=sha256:af21eb4409a119e365397b2adbaca4c9ccab56543a65d5dbd9f920d6ac29f686 \
|
||||||
--hash=sha256:e9701d0049d92c16703a42771b98d560b95248949f23f8cf7b4eddd201814fb9 \
|
--hash=sha256:b14b2d9dac08e28bb8046a1a0434b1750eb221c8f5b87a68f4fa11a6f97b5e34 \
|
||||||
--hash=sha256:ee2f2a527e3c1a6e6411eb4209642e138b544a2d72fe5d0d76daf77b24063534 \
|
--hash=sha256:bb6d88045545b26da47aa879dd4a89a71d1dce0f0e549b1abcb31dfe4a8eac49 \
|
||||||
--hash=sha256:f7fb7d750cfa0a070d2c24e831fd3481019a60dd317ea2b39acbcebc08b6ed81 \
|
--hash=sha256:bb8cc7534f51d9a017b93e3e85b260924f909601c3df002bcdb58ddb4dc41a5c \
|
||||||
--hash=sha256:f840ed6d8ecba8255df8c42b87fadeda98ddfc6eeec05e2dc66e26d46dd6f58a \
|
--hash=sha256:bc17a677b21b3502a21f66a8cc64f5bfad4df8a0b8434d661666f8ce90ac3af1 \
|
||||||
--hash=sha256:f86c6358749bd4fda175388691e3ba8c46e24c5347d0afd20f9b7edfc9faf07d \
|
--hash=sha256:bd6c2a1c7573c64738d716488d2cdd3c00e340e4835707d8fdb8dc1a66ef164e \
|
||||||
--hash=sha256:fa36ec09ef71d158186bc79e359ff5fdd6e7996fe8ab638f00d6b93139ba4fcf \
|
--hash=sha256:bd9b23791fe793e4968dba0c447e12f78e425c59fc0e3b97f6450f4781f3ee60 \
|
||||||
--hash=sha256:fe2c7201c642b7c308f1675355ad7ff7b66acfe3541625efe5a3ad38f29d6115
|
--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
|
||||||
# via requests
|
# via requests
|
||||||
cramjam==2.11.0 \
|
cramjam==2.11.0 \
|
||||||
--hash=sha256:028400d699442d40dbda02f74158c73d05cb76587a12490d0bfedd958fd49188 \
|
--hash=sha256:028400d699442d40dbda02f74158c73d05cb76587a12490d0bfedd958fd49188 \
|
||||||
@ -423,15 +443,15 @@ cryptography==49.0.0 \
|
|||||||
# google-auth
|
# google-auth
|
||||||
# msal
|
# msal
|
||||||
# pyjwt
|
# pyjwt
|
||||||
google-api-core==2.33.0 \
|
google-api-core==2.31.0 \
|
||||||
--hash=sha256:3a36bcc3e319783f4c97da41f6f45ea6ffcaa55848e341de16e09cb70243c2bb \
|
--hash=sha256:2be84ee0f584c48e6bde1b36766e23348b361fb7e55e56135fc76ce1c397f9c2 \
|
||||||
--hash=sha256:a2e22a0c1d0f03eafff1858b38cf46f832d5902b0c052235bf0ab8402929fbdc
|
--hash=sha256:ef79fb3784c71cbac89cbd03301ba0c8fb8ad2aa95d7f9204dd9628f7adf59ab
|
||||||
# via
|
# via
|
||||||
# google-cloud-core
|
# google-cloud-core
|
||||||
# google-cloud-storage
|
# google-cloud-storage
|
||||||
google-auth==2.56.2 \
|
google-auth==2.55.1 \
|
||||||
--hash=sha256:c8270ea95b2697b74e3d8438ae9c5b898e38b623b915c7b5c5635921e7de68a6 \
|
--hash=sha256:eada68dfd52b3b81191827601e2a0c3fa12540c818534b630ddc5355769c3995 \
|
||||||
--hash=sha256:e28f103ca8091fb7012b99c44243d7366c29863713b8e34a220c3322b7a07051
|
--hash=sha256:fb2d9b730f2c9b8d326ec8d7222f21aef2ead15bf0513793d6442485d87af0a1
|
||||||
# via
|
# via
|
||||||
# google-api-core
|
# google-api-core
|
||||||
# google-cloud-core
|
# google-cloud-core
|
||||||
@ -440,9 +460,9 @@ google-cloud-core==2.6.0 \
|
|||||||
--hash=sha256:6d63ac8e5eca6d9e4319d0a1e2265fadcd7f1049904378caecfa01cf52dd869e \
|
--hash=sha256:6d63ac8e5eca6d9e4319d0a1e2265fadcd7f1049904378caecfa01cf52dd869e \
|
||||||
--hash=sha256:e76149739f90fac1fc6757c09f47eaccb3145b54adbd7759b0f7c4b235f46c83
|
--hash=sha256:e76149739f90fac1fc6757c09f47eaccb3145b54adbd7759b0f7c4b235f46c83
|
||||||
# via google-cloud-storage
|
# via google-cloud-storage
|
||||||
google-cloud-storage==3.13.0 \
|
google-cloud-storage==3.12.0 \
|
||||||
--hash=sha256:648af3ef8a6acc674e1359d3c920c67eb89a7a5ab66b336bd3ac43fed6b5ab84 \
|
--hash=sha256:03ae9847c6babb368f35f054126b8a08cbc0e3266efb990eb17b9926a45cf3be \
|
||||||
--hash=sha256:d11d8706ea1520fba0f21043bcb7897caf7015d76ce1ad9a4f60237e4d7a9f6c
|
--hash=sha256:3880773754ddf7c27567b04e2a4d193950b6b99429f37b9097d873686e95b09c
|
||||||
# via barman
|
# via barman
|
||||||
google-crc32c==1.8.0 \
|
google-crc32c==1.8.0 \
|
||||||
--hash=sha256:014a7e68d623e9a4222d663931febc3033c5c7c9730785727de2a81f87d5bab8 \
|
--hash=sha256:014a7e68d623e9a4222d663931febc3033c5c7c9730785727de2a81f87d5bab8 \
|
||||||
@ -572,9 +592,9 @@ msal-extensions==1.3.1 \
|
|||||||
--hash=sha256:96d3de4d034504e969ac5e85bae8106c8373b5c6568e4c8fa7af2eca9dbe6bca \
|
--hash=sha256:96d3de4d034504e969ac5e85bae8106c8373b5c6568e4c8fa7af2eca9dbe6bca \
|
||||||
--hash=sha256:c5b0fd10f65ef62b5f1d62f4251d51cbcaf003fcedae8c91b040a488614be1a4
|
--hash=sha256:c5b0fd10f65ef62b5f1d62f4251d51cbcaf003fcedae8c91b040a488614be1a4
|
||||||
# via azure-identity
|
# via azure-identity
|
||||||
proto-plus==1.28.2 \
|
proto-plus==1.28.0 \
|
||||||
--hash=sha256:26d843eb99c1e32fdf1d20ff0faae56607f7748fe774acf9ecd5cfe6c6472501 \
|
--hash=sha256:38e5696342835b08fc116f30a25665b29531cda9d5d5643e9b81fc312385abd9 \
|
||||||
--hash=sha256:b874236fcac2358f601e4330bcb76cb8b89c851303ccf4078408b3d4774d1c52
|
--hash=sha256:a630604310899e73c59ec302e5765c058d412b2f090b9c79c8822589f14955b8
|
||||||
# via google-api-core
|
# via google-api-core
|
||||||
protobuf==7.35.1 \
|
protobuf==7.35.1 \
|
||||||
--hash=sha256:11d6b0ec246892d85215b0a13ca6e0233cf5284b68f0ac02646427f4ff88a799 \
|
--hash=sha256:11d6b0ec246892d85215b0a13ca6e0233cf5284b68f0ac02646427f4ff88a799 \
|
||||||
@ -598,9 +618,9 @@ psycopg2==2.9.12 \
|
|||||||
--hash=sha256:a73d5513bfe929c56555006c7a9cc7ae6e4276aa99dd2b1e2544eb8bb54f8b23 \
|
--hash=sha256:a73d5513bfe929c56555006c7a9cc7ae6e4276aa99dd2b1e2544eb8bb54f8b23 \
|
||||||
--hash=sha256:d5fbe092315fb007c03544704e6d1e678a6c0378139d01cea433dc59edf041b4
|
--hash=sha256:d5fbe092315fb007c03544704e6d1e678a6c0378139d01cea433dc59edf041b4
|
||||||
# via barman
|
# via barman
|
||||||
pyasn1==0.6.4 \
|
pyasn1==0.6.3 \
|
||||||
--hash=sha256:9c447d8431c947fe4c8febc4ed9e760bc29011a5b01e5c74b67025bd9fb8ce81 \
|
--hash=sha256:697a8ecd6d98891189184ca1fa05d1bb00e2f84b5977c481452050549c8a72cf \
|
||||||
--hash=sha256:deda9277cfd454080ec40b207fb6df82206a3a2688735233cdcd8d3d565f088b
|
--hash=sha256:a80184d120f0864a52a073acc6fc642847d0be408e7c7252f31390c0f4eadcde
|
||||||
# via pyasn1-modules
|
# via pyasn1-modules
|
||||||
pyasn1-modules==0.4.2 \
|
pyasn1-modules==0.4.2 \
|
||||||
--hash=sha256:29253a9207ce32b64c3ac6600edc75368f98473906e8fd1043bd6b5b1de2c14a \
|
--hash=sha256:29253a9207ce32b64c3ac6600edc75368f98473906e8fd1043bd6b5b1de2c14a \
|
||||||
@ -634,17 +654,17 @@ requests==2.34.2 \
|
|||||||
# google-api-core
|
# google-api-core
|
||||||
# google-cloud-storage
|
# google-cloud-storage
|
||||||
# msal
|
# msal
|
||||||
s3transfer==0.19.2 \
|
s3transfer==0.19.0 \
|
||||||
--hash=sha256:ba0309fd86be3c27dbf78cdd813c13c5e1df16e5874b99d2535ebbdfb9892993 \
|
--hash=sha256:777cc2415536f1debadb5c2ef7779275d0fc0fe0e042411cdd6caebeb2685262 \
|
||||||
--hash=sha256:d8168eccca828cbb2cd573675333f3bddd254313a9c42494b84c76b539e8ba25
|
--hash=sha256:ce436931687addc4c1712d52d40b32f53e88315723f107ffa20ba82b05a0f685
|
||||||
# via boto3
|
# via boto3
|
||||||
six==1.17.0 \
|
six==1.17.0 \
|
||||||
--hash=sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274 \
|
--hash=sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274 \
|
||||||
--hash=sha256:ff70335d468e7eb6ec65b95b99d3a2836546063f63acc5171de367e834932a81
|
--hash=sha256:ff70335d468e7eb6ec65b95b99d3a2836546063f63acc5171de367e834932a81
|
||||||
# via python-dateutil
|
# via python-dateutil
|
||||||
typing-extensions==4.16.0 \
|
typing-extensions==4.15.0 \
|
||||||
--hash=sha256:481caa481374e813c1b176ada14e97f1f67a4539ce9cfeb3f350d78d6370c2e8 \
|
--hash=sha256:0cea48d173cc12fa28ecabc3b837ea3cf6f38c6d1136f85cbaaf598984861466 \
|
||||||
--hash=sha256:dc983d19a509c94dba722ee6abd33940f7c05a89e243c47e907eb4db6f1a43e5
|
--hash=sha256:f0fa19c6845758ab08074a0cfa8b7aecb71c999ca73d62883bc25cc018c4e548
|
||||||
# via
|
# via
|
||||||
# azure-core
|
# azure-core
|
||||||
# azure-identity
|
# azure-identity
|
||||||
|
|||||||
18
go.mod
18
go.mod
@ -5,9 +5,9 @@ go 1.26.4
|
|||||||
require (
|
require (
|
||||||
github.com/cert-manager/cert-manager v1.21.0
|
github.com/cert-manager/cert-manager v1.21.0
|
||||||
github.com/cloudnative-pg/api v1.30.0
|
github.com/cloudnative-pg/api v1.30.0
|
||||||
github.com/cloudnative-pg/barman-cloud v0.5.2-0.20260720143032-950b0f57e122
|
github.com/cloudnative-pg/barman-cloud v0.5.2-0.20260709152604-43158c204df1
|
||||||
github.com/cloudnative-pg/cloudnative-pg v1.30.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 v0.5.0
|
||||||
github.com/cloudnative-pg/cnpg-i-machinery v0.4.2
|
github.com/cloudnative-pg/cnpg-i-machinery v0.4.2
|
||||||
github.com/cloudnative-pg/machinery v0.5.0
|
github.com/cloudnative-pg/machinery v0.5.0
|
||||||
github.com/onsi/ginkgo/v2 v2.32.0
|
github.com/onsi/ginkgo/v2 v2.32.0
|
||||||
@ -16,10 +16,10 @@ require (
|
|||||||
github.com/spf13/viper v1.21.0
|
github.com/spf13/viper v1.21.0
|
||||||
google.golang.org/grpc v1.82.1
|
google.golang.org/grpc v1.82.1
|
||||||
gopkg.in/yaml.v3 v3.0.1
|
gopkg.in/yaml.v3 v3.0.1
|
||||||
k8s.io/api v0.36.3
|
k8s.io/api v0.36.2
|
||||||
k8s.io/apiextensions-apiserver v0.36.3
|
k8s.io/apiextensions-apiserver v0.36.2
|
||||||
k8s.io/apimachinery v0.36.3
|
k8s.io/apimachinery v0.36.2
|
||||||
k8s.io/client-go v0.36.3
|
k8s.io/client-go v0.36.2
|
||||||
k8s.io/utils v0.0.0-20260707023825-cf1189d6abe3
|
k8s.io/utils v0.0.0-20260707023825-cf1189d6abe3
|
||||||
sigs.k8s.io/controller-runtime v0.24.1
|
sigs.k8s.io/controller-runtime v0.24.1
|
||||||
sigs.k8s.io/kustomize/api v0.21.1
|
sigs.k8s.io/kustomize/api v0.21.1
|
||||||
@ -125,11 +125,11 @@ require (
|
|||||||
google.golang.org/protobuf v1.36.12-0.20260120151049-f2248ac996af // indirect
|
google.golang.org/protobuf v1.36.12-0.20260120151049-f2248ac996af // indirect
|
||||||
gopkg.in/evanphx/json-patch.v4 v4.13.0 // indirect
|
gopkg.in/evanphx/json-patch.v4 v4.13.0 // indirect
|
||||||
gopkg.in/inf.v0 v0.9.1 // indirect
|
gopkg.in/inf.v0 v0.9.1 // indirect
|
||||||
k8s.io/apiserver v0.36.3 // indirect
|
k8s.io/apiserver v0.36.2 // indirect
|
||||||
k8s.io/component-base v0.36.3 // indirect
|
k8s.io/component-base v0.36.2 // indirect
|
||||||
k8s.io/klog/v2 v2.140.0 // indirect
|
k8s.io/klog/v2 v2.140.0 // indirect
|
||||||
k8s.io/kube-openapi v0.0.0-20260603220949-865597e52e25 // indirect
|
k8s.io/kube-openapi v0.0.0-20260603220949-865597e52e25 // indirect
|
||||||
k8s.io/streaming v0.36.3 // indirect
|
k8s.io/streaming v0.36.2 // indirect
|
||||||
sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.34.0 // indirect
|
sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.34.0 // indirect
|
||||||
sigs.k8s.io/gateway-api v1.6.0 // indirect
|
sigs.k8s.io/gateway-api v1.6.0 // indirect
|
||||||
sigs.k8s.io/json v0.0.0-20250730193827-2d320260d730 // indirect
|
sigs.k8s.io/json v0.0.0-20250730193827-2d320260d730 // indirect
|
||||||
|
|||||||
36
go.sum
36
go.sum
@ -20,12 +20,12 @@ 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/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
|
||||||
github.com/cloudnative-pg/api v1.30.0 h1:L8hnvV/tPEQA1xYEi41FUBFA7FUNVGju8+SlgFlDDjI=
|
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/api v1.30.0/go.mod h1:XrKBbOWObL33si0FNuwX4uHNf5JShiZyOUqd6LxbJQo=
|
||||||
github.com/cloudnative-pg/barman-cloud v0.5.2-0.20260720143032-950b0f57e122 h1:NuOztBdp+bUr/xYtaAw8o/x880hvWDRhJGl+R1YsZNw=
|
github.com/cloudnative-pg/barman-cloud v0.5.2-0.20260709152604-43158c204df1 h1:+AV67yFPqnwmHQ5PIYkAaJUDsOrrwJCvH+J1JzHXyQc=
|
||||||
github.com/cloudnative-pg/barman-cloud v0.5.2-0.20260720143032-950b0f57e122/go.mod h1:ZQLkdpk44FW5/BGWzABTOEcV9qPbwC+rbdscg2I8mBI=
|
github.com/cloudnative-pg/barman-cloud v0.5.2-0.20260709152604-43158c204df1/go.mod h1:ZQLkdpk44FW5/BGWzABTOEcV9qPbwC+rbdscg2I8mBI=
|
||||||
github.com/cloudnative-pg/cloudnative-pg v1.30.0 h1:fnhVq44xXx97MNiuvJsPrX1vSjYbgdyBK5MSGfdHdp0=
|
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/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.5.0 h1:/TOzpNT6cwNgrpftTtrnLKdoHgMwd+88vZgXjlVgXeE=
|
||||||
github.com/cloudnative-pg/cnpg-i v0.6.0/go.mod h1:4kcpLAj+feMTnh0TVadXRASdVnEhBytNSm/BvktLgmI=
|
github.com/cloudnative-pg/cnpg-i v0.5.0/go.mod h1:7Gh4+UzhBpGhr4DreB1GN9wGYfvxwXCXZUyVt3zE/3I=
|
||||||
github.com/cloudnative-pg/cnpg-i-machinery v0.4.2 h1:0reS9MtyLYINHXQ/MfxJ9jp39hhBf8e3Qdj+T5Nsq6I=
|
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/cnpg-i-machinery v0.4.2/go.mod h1:gvrKabgxXq0zGthXGucemDdsxakLEQDMxn43M4HLW30=
|
||||||
github.com/cloudnative-pg/machinery v0.5.0 h1:hhTnkzn+AiN3NmbjCQ6RXj5rfqV3K6arzq6kdXAzcnQ=
|
github.com/cloudnative-pg/machinery v0.5.0 h1:hhTnkzn+AiN3NmbjCQ6RXj5rfqV3K6arzq6kdXAzcnQ=
|
||||||
@ -308,24 +308,24 @@ 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.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 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
|
||||||
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
|
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
|
||||||
k8s.io/api v0.36.3 h1:NxB+05W2UGqXWFXcLO0RB5cnqnUPP5v5sVlaOH0Iz4w=
|
k8s.io/api v0.36.2 h1:TF6YDLIzKfccK7cq9YpTcGX8TJmEkHVRv78DM51fRYY=
|
||||||
k8s.io/api v0.36.3/go.mod h1:JzLQKqRHC5+I8RVj/lS3lCg0mg6nWI9Fo/Sk3ElxHzg=
|
k8s.io/api v0.36.2/go.mod h1:F4LbMO4brjZYh7yFkXWhynSvtB7YauxV4c+HHkNRGNg=
|
||||||
k8s.io/apiextensions-apiserver v0.36.3 h1:dPmOAPhwTtqb1bTxbFPsy18KHPhktQeO3WUPXunZIB0=
|
k8s.io/apiextensions-apiserver v0.36.2 h1:3O5gqOj/dt2XWWbpMe+TXWpE9yU6pjM/tXxtHHJT/K4=
|
||||||
k8s.io/apiextensions-apiserver v0.36.3/go.mod h1:KTXFqgXiuw2pRoL+Wpmttqc+up9Xt/GohadPWeLLOa4=
|
k8s.io/apiextensions-apiserver v0.36.2/go.mod h1:cL1tBWe8XSaP1H30iWKGo7hf6iAUUUJPEU70dskmAnA=
|
||||||
k8s.io/apimachinery v0.36.3 h1:PkzMRBRG8joFD8EhCuQAtNPvJlxb82FwplP26HIzvAM=
|
k8s.io/apimachinery v0.36.2 h1:0PE/W/WNy1UX61NLbXY5TMbJ6UwLL6E6lAPkYrKFxbQ=
|
||||||
k8s.io/apimachinery v0.36.3/go.mod h1:cTSjBWgPe/6CQyBKzY/hDIRWCQQQeK0mfLbml0UYFHE=
|
k8s.io/apimachinery v0.36.2/go.mod h1:fvf/HOLXq9RId0rnDIbN1OEBvHXdQbLMM8nu0LcBUf4=
|
||||||
k8s.io/apiserver v0.36.3 h1:MGSg2SkdfuytiDEcRylT5mQFmmSsbx90XFUO67Y4bsQ=
|
k8s.io/apiserver v0.36.2 h1:6vMnkmHZPeBloNkHUhmZYq7Ylv8WIB8xjyEl+eSt26E=
|
||||||
k8s.io/apiserver v0.36.3/go.mod h1:fVH7zv9EUNUA7Fl7LtDKh8aB9W7u1VQPSGtWV5SjUxg=
|
k8s.io/apiserver v0.36.2/go.mod h1:9PoQ2ikCytrZyZg11mGhLEF5m8Rgsb5FJmYJ4Wvnl1k=
|
||||||
k8s.io/client-go v0.36.3 h1:M4JdVzXxYcZk4fGpfDdYnxSwhLKWCFoQsHW6t+z8Hfg=
|
k8s.io/client-go v0.36.2 h1:bfgxmFKc9CgqsgX4xKLAAdmTQlWee7Ob/HlDOrJ5TBI=
|
||||||
k8s.io/client-go v0.36.3/go.mod h1:gcPwr0c87vjjG6HB6pWEqOeuYVoXSsREjzux2j6GF30=
|
k8s.io/client-go v0.36.2/go.mod h1:1vgO4OAlfPnoLcb+Rze2GF5rAr14w8qjrYMoyXJzQj0=
|
||||||
k8s.io/component-base v0.36.3 h1:vc/UFvPCkW0irPz84LAodAL1j3f4xktPM6dDJIEheAY=
|
k8s.io/component-base v0.36.2 h1:Z0VH80O7Ng0HDZnZj3WRR3urEGa0kTwmO8CwEwjVK1w=
|
||||||
k8s.io/component-base v0.36.3/go.mod h1:hZbNFG+gCMl9EbykDGEu73feKP9/Cq6JsV4pTo9GTO8=
|
k8s.io/component-base v0.36.2/go.mod h1:mGfFOA7Gwpdm1VW2cwSQYbiDIlz8GD2WGwH88QSeCyA=
|
||||||
k8s.io/klog/v2 v2.140.0 h1:Tf+J3AH7xnUzZyVVXhTgGhEKnFqye14aadWv7bzXdzc=
|
k8s.io/klog/v2 v2.140.0 h1:Tf+J3AH7xnUzZyVVXhTgGhEKnFqye14aadWv7bzXdzc=
|
||||||
k8s.io/klog/v2 v2.140.0/go.mod h1:o+/RWfJ6PwpnFn7OyAG3QnO47BFsymfEfrz6XyYSSp0=
|
k8s.io/klog/v2 v2.140.0/go.mod h1:o+/RWfJ6PwpnFn7OyAG3QnO47BFsymfEfrz6XyYSSp0=
|
||||||
k8s.io/kube-openapi v0.0.0-20260603220949-865597e52e25 h1:mPMaPMpBij2V1Wv/fR+HW124vVGXXvOSS9ver/9yjWs=
|
k8s.io/kube-openapi v0.0.0-20260603220949-865597e52e25 h1:mPMaPMpBij2V1Wv/fR+HW124vVGXXvOSS9ver/9yjWs=
|
||||||
k8s.io/kube-openapi v0.0.0-20260603220949-865597e52e25/go.mod h1:V/QaCUYDa+0QpcHhVVc5l99Uz56wEMEXBSj9oCDkNDY=
|
k8s.io/kube-openapi v0.0.0-20260603220949-865597e52e25/go.mod h1:V/QaCUYDa+0QpcHhVVc5l99Uz56wEMEXBSj9oCDkNDY=
|
||||||
k8s.io/streaming v0.36.3 h1:9rAaqBk0C0Pc7+/fqGekj07NV+/Xrew58p647A0JT8w=
|
k8s.io/streaming v0.36.2 h1:NSKthPPg9UFSKsRauVJUVGH2Dvn8fhKmY4qrMkw/p98=
|
||||||
k8s.io/streaming v0.36.3/go.mod h1:z6fV3D+NVkoeqRMtWwlUZK6U17SY/LqNzOxWL6GyR/s=
|
k8s.io/streaming v0.36.2/go.mod h1:z6fV3D+NVkoeqRMtWwlUZK6U17SY/LqNzOxWL6GyR/s=
|
||||||
k8s.io/utils v0.0.0-20260707023825-cf1189d6abe3 h1:jVkFFVfXdXP74B/zbO3hM3hpSFD0xvhQ5U686DPurkE=
|
k8s.io/utils v0.0.0-20260707023825-cf1189d6abe3 h1:jVkFFVfXdXP74B/zbO3hM3hpSFD0xvhQ5U686DPurkE=
|
||||||
k8s.io/utils v0.0.0-20260707023825-cf1189d6abe3/go.mod h1:M2s5JB1lIYP3jzZdorPLHXIPJzt9vv2muW5a6L9DtNM=
|
k8s.io/utils v0.0.0-20260707023825-cf1189d6abe3/go.mod h1:M2s5JB1lIYP3jzZdorPLHXIPJzt9vv2muW5a6L9DtNM=
|
||||||
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 h1:hSfpvjjTQXQY2Fol2CS0QHMNs/WI1MOSGzCm1KhM5ec=
|
||||||
|
|||||||
@ -27,7 +27,6 @@ import (
|
|||||||
"path"
|
"path"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
barmanapi "github.com/cloudnative-pg/barman-cloud/pkg/api"
|
|
||||||
"github.com/cloudnative-pg/barman-cloud/pkg/archiver"
|
"github.com/cloudnative-pg/barman-cloud/pkg/archiver"
|
||||||
barmanCommand "github.com/cloudnative-pg/barman-cloud/pkg/command"
|
barmanCommand "github.com/cloudnative-pg/barman-cloud/pkg/command"
|
||||||
barmanCredentials "github.com/cloudnative-pg/barman-cloud/pkg/credentials"
|
barmanCredentials "github.com/cloudnative-pg/barman-cloud/pkg/credentials"
|
||||||
@ -156,17 +155,13 @@ func (w WALServiceImplementation) Archive(
|
|||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
// Step 2: Check if the archive location is safe to perform archiving.
|
// Step 2: Check if the archive location is safe to perform archiving
|
||||||
checkEmptyWalArchive, err := resolveArchiveEmptyWalArchiveCheck(
|
checkFileExisting, err := fileutils.FileExists(emptyWalArchiveFile)
|
||||||
request.CheckEmptyWalArchive,
|
|
||||||
configuration.Cluster,
|
|
||||||
emptyWalArchiveFile,
|
|
||||||
)
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, fmt.Errorf("while checking for empty wal archive check file %q: %w", emptyWalArchiveFile, err)
|
||||||
}
|
}
|
||||||
|
|
||||||
if checkEmptyWalArchive {
|
if utils.IsEmptyWalArchiveCheckEnabled(&configuration.Cluster.ObjectMeta) && checkFileExisting {
|
||||||
if err := CheckBackupDestination(
|
if err := CheckBackupDestination(
|
||||||
ctx,
|
ctx,
|
||||||
&objectStore.Spec.Configuration,
|
&objectStore.Spec.Configuration,
|
||||||
@ -228,31 +223,6 @@ func (w WALServiceImplementation) Archive(
|
|||||||
return &wal.WALArchiveResult{}, nil
|
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
|
// Restore implements the WALService interface
|
||||||
func (w WALServiceImplementation) Restore(
|
func (w WALServiceImplementation) Restore(
|
||||||
ctx context.Context,
|
ctx context.Context,
|
||||||
@ -279,11 +249,9 @@ func (w WALServiceImplementation) Restore(
|
|||||||
"Restoring WAL file",
|
"Restoring WAL file",
|
||||||
"objectStore", objectStore.Name,
|
"objectStore", objectStore.Name,
|
||||||
"serverName", serverName,
|
"serverName", serverName,
|
||||||
"walName", walName,
|
"walName", walName)
|
||||||
"mode", request.GetMode())
|
|
||||||
return &wal.WALRestoreResult{}, w.restoreFromBarmanObjectStore(
|
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
|
// resolveRestoreObjectStore selects the object store and server name to use when
|
||||||
@ -320,7 +288,6 @@ func (w WALServiceImplementation) restoreFromBarmanObjectStore(
|
|||||||
serverName string,
|
serverName string,
|
||||||
walName string,
|
walName string,
|
||||||
destinationPath string,
|
destinationPath string,
|
||||||
rewindMode bool,
|
|
||||||
) error {
|
) error {
|
||||||
contextLogger := log.FromContext(ctx)
|
contextLogger := log.FromContext(ctx)
|
||||||
startTime := time.Now()
|
startTime := time.Now()
|
||||||
@ -352,20 +319,6 @@ func (w WALServiceImplementation) restoreFromBarmanObjectStore(
|
|||||||
return fmt.Errorf("while creating the restorer: %w", err)
|
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
|
// Step 1: check if this WAL file is not already in the spool
|
||||||
var wasInSpool bool
|
var wasInSpool bool
|
||||||
if wasInSpool, err = walRestorer.RestoreFromSpool(walName, destinationPath); err != nil {
|
if wasInSpool, err = walRestorer.RestoreFromSpool(walName, destinationPath); err != nil {
|
||||||
@ -378,10 +331,8 @@ func (w WALServiceImplementation) restoreFromBarmanObjectStore(
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// Step 2: return error if the end-of-wal-stream flag is set.
|
// We skip this step if streaming connection is not available
|
||||||
// We skip this step if the flag machinery does not apply to this invocation
|
if isStreamingAvailable(cluster, w.InstanceName) {
|
||||||
useEndOfWALStreamFlag := shouldUseEndOfWALStreamFlag(cluster, w.InstanceName, rewindMode)
|
|
||||||
if useEndOfWALStreamFlag {
|
|
||||||
if err := checkEndOfWALStreamFlag(walRestorer); err != nil {
|
if err := checkEndOfWALStreamFlag(walRestorer); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
@ -389,7 +340,10 @@ 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.
|
// 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
|
var walFilesList []string
|
||||||
maxParallel := maxWALFilesPerInvocation(barmanConfiguration, rewindMode)
|
maxParallel := 1
|
||||||
|
if barmanConfiguration.Wal != nil && barmanConfiguration.Wal.MaxParallel > 1 {
|
||||||
|
maxParallel = barmanConfiguration.Wal.MaxParallel
|
||||||
|
}
|
||||||
if IsWALFile(walName) {
|
if IsWALFile(walName) {
|
||||||
// If this is a regular WAL file, we try to prefetch
|
// If this is a regular WAL file, we try to prefetch
|
||||||
if walFilesList, err = gatherWALFilesToRestore(walName, maxParallel); err != nil {
|
if walFilesList, err = gatherWALFilesToRestore(walName, maxParallel); err != nil {
|
||||||
@ -411,9 +365,9 @@ func (w WALServiceImplementation) restoreFromBarmanObjectStore(
|
|||||||
return classifyWALRestoreError(walStatus[0].WalName, walStatus[0].Err)
|
return classifyWALRestoreError(walStatus[0].WalName, walStatus[0].Err)
|
||||||
}
|
}
|
||||||
|
|
||||||
// We skip this step if the flag machinery does not apply to this invocation
|
// We skip this step if streaming connection is not available
|
||||||
endOfWALStream := isEndOfWALStream(walStatus)
|
endOfWALStream := isEndOfWALStream(walStatus)
|
||||||
if useEndOfWALStreamFlag && endOfWALStream {
|
if isStreamingAvailable(cluster, w.InstanceName) && endOfWALStream {
|
||||||
contextLogger.Info(
|
contextLogger.Info(
|
||||||
"Set end-of-wal-stream flag as one of the WAL files to be prefetched was not found")
|
"Set end-of-wal-stream flag as one of the WAL files to be prefetched was not found")
|
||||||
|
|
||||||
@ -461,38 +415,6 @@ func (w WALServiceImplementation) SetFirstRequired(
|
|||||||
panic("implement me")
|
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.
|
// isStreamingAvailable checks if this pod can replicate via streaming connection.
|
||||||
func isStreamingAvailable(cluster *cnpgv1.Cluster, podName string) bool {
|
func isStreamingAvailable(cluster *cnpgv1.Cluster, podName string) bool {
|
||||||
if cluster == nil {
|
if cluster == nil {
|
||||||
@ -569,22 +491,6 @@ func checkEndOfWALStreamFlag(walRestorer *barmanRestorer.WALRestorer) error {
|
|||||||
return nil
|
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
|
// isEndOfWALStream returns true if one of the downloads has returned
|
||||||
// a file-not-found error.
|
// a file-not-found error.
|
||||||
func isEndOfWALStream(results []barmanRestorer.Result) bool {
|
func isEndOfWALStream(results []barmanRestorer.Result) bool {
|
||||||
|
|||||||
@ -20,21 +20,12 @@ SPDX-License-Identifier: Apache-2.0
|
|||||||
package common
|
package common
|
||||||
|
|
||||||
import (
|
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"
|
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/ginkgo/v2"
|
||||||
. "github.com/onsi/gomega"
|
. "github.com/onsi/gomega"
|
||||||
|
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
||||||
|
|
||||||
|
"github.com/cloudnative-pg/plugin-barman-cloud/internal/cnpgi/operator/config"
|
||||||
)
|
)
|
||||||
|
|
||||||
var _ = Describe("resolveRestoreObjectStore", func() {
|
var _ = Describe("resolveRestoreObjectStore", func() {
|
||||||
@ -105,142 +96,3 @@ var _ = Describe("resolveRestoreObjectStore", func() {
|
|||||||
"cluster-server", "cluster-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),
|
|
||||||
)
|
|
||||||
})
|
|
||||||
})
|
|
||||||
|
|||||||
@ -63,7 +63,7 @@ const (
|
|||||||
// Data is the metadata of this plugin.
|
// Data is the metadata of this plugin.
|
||||||
var Data = identity.GetPluginMetadataResponse{
|
var Data = identity.GetPluginMetadataResponse{
|
||||||
Name: PluginName,
|
Name: PluginName,
|
||||||
Version: "0.14.0", // x-release-please-version
|
Version: "0.13.0", // x-release-please-version
|
||||||
DisplayName: "BarmanCloudInstance",
|
DisplayName: "BarmanCloudInstance",
|
||||||
ProjectUrl: "https://github.com/cloudnative-pg/plugin-barman-cloud",
|
ProjectUrl: "https://github.com/cloudnative-pg/plugin-barman-cloud",
|
||||||
RepositoryUrl: "https://github.com/cloudnative-pg/plugin-barman-cloud",
|
RepositoryUrl: "https://github.com/cloudnative-pg/plugin-barman-cloud",
|
||||||
|
|||||||
@ -113,7 +113,6 @@ func (impl JobHookImpl) Restore(
|
|||||||
configuration.Cluster,
|
configuration.Cluster,
|
||||||
&targetObjectStore.Spec.Configuration,
|
&targetObjectStore.Spec.Configuration,
|
||||||
targetObjectStore.Name,
|
targetObjectStore.Name,
|
||||||
req.CheckEmptyWalArchive,
|
|
||||||
); err != nil {
|
); err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
@ -251,7 +250,6 @@ func (impl *JobHookImpl) checkBackupDestination(
|
|||||||
cluster *cnpgv1.Cluster,
|
cluster *cnpgv1.Cluster,
|
||||||
barmanConfiguration *cnpgv1.BarmanObjectStoreConfiguration,
|
barmanConfiguration *cnpgv1.BarmanObjectStoreConfiguration,
|
||||||
objectStoreName string,
|
objectStoreName string,
|
||||||
operatorCheckEmptyWalArchive *bool,
|
|
||||||
) error {
|
) error {
|
||||||
// Get environment from cache
|
// Get environment from cache
|
||||||
env, err := barmanCredentials.EnvSetCloudCredentialsAndCertificates(ctx,
|
env, err := barmanCredentials.EnvSetCloudCredentialsAndCertificates(ctx,
|
||||||
@ -290,26 +288,14 @@ func (impl *JobHookImpl) checkBackupDestination(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if resolveRestoreEmptyWalArchiveCheck(operatorCheckEmptyWalArchive, cluster) {
|
// Check if we're ok to archive in the desired destination
|
||||||
|
if utils.IsEmptyWalArchiveCheckEnabled(&cluster.ObjectMeta) {
|
||||||
return common.CheckBackupDestination(ctx, barmanConfiguration, walArchiver, serverName)
|
return common.CheckBackupDestination(ctx, barmanConfiguration, walArchiver, serverName)
|
||||||
}
|
}
|
||||||
|
|
||||||
return nil
|
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
|
// 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
|
// returns indicating if any changes were made and any error encountered in the process
|
||||||
func (impl JobHookImpl) restoreCustomWalDir(ctx context.Context) (bool, error) {
|
func (impl JobHookImpl) restoreCustomWalDir(ctx context.Context) (bool, error) {
|
||||||
|
|||||||
@ -1,66 +0,0 @@
|
|||||||
/*
|
|
||||||
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),
|
|
||||||
)
|
|
||||||
})
|
|
||||||
})
|
|
||||||
@ -1,32 +0,0 @@
|
|||||||
/*
|
|
||||||
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")
|
|
||||||
}
|
|
||||||
@ -73,7 +73,7 @@ func newAzuriteDeployment(namespace, name string) *appsv1.Deployment {
|
|||||||
Name: name,
|
Name: name,
|
||||||
// renovate: datasource=docker depName=mcr.microsoft.com/azure-storage/azurite versioning=docker
|
// renovate: datasource=docker depName=mcr.microsoft.com/azure-storage/azurite versioning=docker
|
||||||
// Version: 3.36.0
|
// Version: 3.36.0
|
||||||
Image: "mcr.microsoft.com/azure-storage/azurite@sha256:76b8127d608fab8287a14a4bfeb9a5502cdcffb4bf1e86f09f324ebb0e70edba",
|
Image: "mcr.microsoft.com/azure-storage/azurite@sha256:37493d0f2e764467421ffe16eb3caa39277e5fa7f6adea18eb5bbfb3c5247f98",
|
||||||
Args: []string{
|
Args: []string{
|
||||||
"azurite-blob",
|
"azurite-blob",
|
||||||
"--blobHost",
|
"--blobHost",
|
||||||
|
|||||||
@ -72,8 +72,8 @@ func newGCSDeployment(namespace, name string) *appsv1.Deployment {
|
|||||||
{
|
{
|
||||||
Name: name,
|
Name: name,
|
||||||
// renovate: datasource=docker depName=fsouza/fake-gcs-server versioning=docker
|
// renovate: datasource=docker depName=fsouza/fake-gcs-server versioning=docker
|
||||||
// Version: 1.55.1
|
// Version: 1.55.0
|
||||||
Image: "fsouza/fake-gcs-server@sha256:91afded49de804aa61b5f3eb6c7cd65205acf9e5c5e047cf0ba7d9507af806c8",
|
Image: "fsouza/fake-gcs-server@sha256:2845d1504bb4a5a4fe54b16dd70e398814eb139af49b01b07839e016120ff123",
|
||||||
Ports: []corev1.ContainerPort{
|
Ports: []corev1.ContainerPort{
|
||||||
{
|
{
|
||||||
ContainerPort: 4443,
|
ContainerPort: 4443,
|
||||||
|
|||||||
@ -121,8 +121,8 @@ func newS3ClientDeployment(namespace string) *appsv1.Deployment {
|
|||||||
{
|
{
|
||||||
Name: s3ClientName,
|
Name: s3ClientName,
|
||||||
// renovate: datasource=docker depName=amazon/aws-cli versioning=docker
|
// renovate: datasource=docker depName=amazon/aws-cli versioning=docker
|
||||||
// Version: 2.36.9
|
// Version: 2.36.1
|
||||||
Image: "docker.io/amazon/aws-cli@sha256:00dee8ccaf669721f8163944ea9e6ac13183851b23d5b7a9868a608bc932cfdb",
|
Image: "docker.io/amazon/aws-cli@sha256:406ca32d31e640a56e8d52921b40528cc64bfa59ec9cb4ee1456db6746cb7292",
|
||||||
Command: []string{"sleep", "infinity"},
|
Command: []string{"sleep", "infinity"},
|
||||||
Env: []corev1.EnvVar{
|
Env: []corev1.EnvVar{
|
||||||
{
|
{
|
||||||
|
|||||||
@ -1,45 +0,0 @@
|
|||||||
---
|
|
||||||
sidebar_position: 80
|
|
||||||
---
|
|
||||||
|
|
||||||
# Compression
|
|
||||||
|
|
||||||
<!-- SPDX-License-Identifier: CC-BY-4.0 -->
|
|
||||||
|
|
||||||
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`
|
|
||||||
- `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 |
|
|
||||||
|
|
||||||
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.
|
|
||||||
@ -1,177 +0,0 @@
|
|||||||
---
|
|
||||||
sidebar_position: 10
|
|
||||||
---
|
|
||||||
|
|
||||||
# Main Concepts
|
|
||||||
|
|
||||||
<!-- SPDX-License-Identifier: CC-BY-4.0 -->
|
|
||||||
|
|
||||||
:::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-wal-archiving-and-restore).
|
|
||||||
|
|
||||||
:::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/).
|
|
||||||
:::
|
|
||||||
@ -1,37 +0,0 @@
|
|||||||
---
|
|
||||||
sidebar_position: 99
|
|
||||||
---
|
|
||||||
|
|
||||||
# Container Images
|
|
||||||
|
|
||||||
<!-- SPDX-License-Identifier: CC-BY-4.0 -->
|
|
||||||
|
|
||||||
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.
|
|
||||||
@ -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:
|
|
||||||
|
|
||||||
<InstallationSnippet />
|
|
||||||
|
|
||||||
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
|
|
||||||
```
|
|
||||||
@ -1,86 +0,0 @@
|
|||||||
---
|
|
||||||
sidebar_position: 1
|
|
||||||
sidebar_label: "Introduction"
|
|
||||||
---
|
|
||||||
|
|
||||||
# Barman Cloud Plugin
|
|
||||||
|
|
||||||
<!-- SPDX-License-Identifier: CC-BY-4.0 -->
|
|
||||||
|
|
||||||
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).
|
|
||||||
:::
|
|
||||||
@ -1,274 +0,0 @@
|
|||||||
---
|
|
||||||
sidebar_position: 40
|
|
||||||
---
|
|
||||||
|
|
||||||
# Migrating from Built-in CloudNativePG Backup
|
|
||||||
|
|
||||||
<!-- SPDX-License-Identifier: CC-BY-4.0 -->
|
|
||||||
|
|
||||||
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` |
|
|
||||||
@ -1,126 +0,0 @@
|
|||||||
---
|
|
||||||
sidebar_position: 90
|
|
||||||
---
|
|
||||||
|
|
||||||
# Miscellaneous
|
|
||||||
|
|
||||||
<!-- SPDX-License-Identifier: CC-BY-4.0 -->
|
|
||||||
|
|
||||||
## 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, WAL Archiving, and Restore
|
|
||||||
|
|
||||||
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 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
|
|
||||||
|
|
||||||
```yaml
|
|
||||||
kind: ObjectStore
|
|
||||||
metadata:
|
|
||||||
name: my-store
|
|
||||||
spec:
|
|
||||||
configuration:
|
|
||||||
data:
|
|
||||||
additionalCommandArgs:
|
|
||||||
- "--min-chunk-size=5MB"
|
|
||||||
- "--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
|
|
||||||
kind: ObjectStore
|
|
||||||
metadata:
|
|
||||||
name: my-store
|
|
||||||
spec:
|
|
||||||
configuration:
|
|
||||||
wal:
|
|
||||||
archiveAdditionalCommandArgs:
|
|
||||||
- "--max-concurrency=1"
|
|
||||||
- "--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/).
|
|
||||||
|
|
||||||
## Enable the pprof debug server for the sidecar
|
|
||||||
|
|
||||||
You can enable the instance sidecar's pprof debug HTTP server by adding the `--pprof-server=<address>` flag to the container's
|
|
||||||
arguments via `.spec.instanceSidecarConfiguration.additionalContainerArgs`.
|
|
||||||
|
|
||||||
Pass a bind address in the form `<host>:<port>` (for example, `0.0.0.0:6061`).
|
|
||||||
An empty value disables the server (disabled by default).
|
|
||||||
|
|
||||||
### Example
|
|
||||||
|
|
||||||
```yaml
|
|
||||||
apiVersion: barmancloud.cnpg.io/v1
|
|
||||||
kind: ObjectStore
|
|
||||||
metadata:
|
|
||||||
name: my-store
|
|
||||||
spec:
|
|
||||||
instanceSidecarConfiguration:
|
|
||||||
additionalContainerArgs:
|
|
||||||
- "--pprof-server=0.0.0.0:6061"
|
|
||||||
```
|
|
||||||
@ -1,497 +0,0 @@
|
|||||||
---
|
|
||||||
sidebar_position: 50
|
|
||||||
---
|
|
||||||
|
|
||||||
# Object Store Providers
|
|
||||||
|
|
||||||
<!-- SPDX-License-Identifier: CC-BY-4.0 -->
|
|
||||||
|
|
||||||
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.
|
|
||||||
|
|
||||||
:::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
|
|
||||||
|
|
||||||
[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=<access key here> \
|
|
||||||
--from-literal=ACCESS_SECRET_KEY=<secret key here>
|
|
||||||
# --from-literal=ACCESS_SESSION_TOKEN=<session token here> # 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: <myEndpointURL>
|
|
||||||
endpointCA:
|
|
||||||
name: my-ca-secret
|
|
||||||
key: ca.crt
|
|
||||||
[...]
|
|
||||||
```
|
|
||||||
|
|
||||||
<!-- TODO: does this also apply to the plugin? -->
|
|
||||||
:::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 + [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 Managed Identity
|
|
||||||
|
|
||||||
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
|
|
||||||
kind: ObjectStore
|
|
||||||
metadata:
|
|
||||||
name: azure-store
|
|
||||||
spec:
|
|
||||||
configuration:
|
|
||||||
destinationPath: "<destination path here>"
|
|
||||||
azureCredentials:
|
|
||||||
inheritFromAzureAD: true
|
|
||||||
[...]
|
|
||||||
```
|
|
||||||
|
|
||||||
### 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: "<destination path here>"
|
|
||||||
azureCredentials:
|
|
||||||
useDefaultAzureCredentials: 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=<storage account name> \
|
|
||||||
--from-literal=AZURE_STORAGE_KEY=<storage account key> \
|
|
||||||
--from-literal=AZURE_STORAGE_SAS_TOKEN=<SAS token> \
|
|
||||||
--from-literal=AZURE_STORAGE_CONNECTION_STRING=<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: "<destination path here>"
|
|
||||||
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:
|
|
||||||
|
|
||||||
```
|
|
||||||
<http|https>://<account-name>.<service-name>.core.windows.net/<container>/<blob>
|
|
||||||
```
|
|
||||||
|
|
||||||
### Azure-Compatible Providers
|
|
||||||
|
|
||||||
If you're using a different implementation (e.g., Azurite or emulator):
|
|
||||||
|
|
||||||
```
|
|
||||||
<http|https>://<local-machine-address>:<port>/<account-name>/<container>/<blob>
|
|
||||||
```
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 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://<bucket>/<folder>"
|
|
||||||
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://<bucket>/<folder>"
|
|
||||||
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:
|
|
||||||
- `<tenant>-console` on port 9090 (with autocert) or 9443 (without autocert)
|
|
||||||
- `<tenant>-hl` on port 9000
|
|
||||||
Where `<tenant>` is the `metadata.name` you assigned to your Tenant resource.
|
|
||||||
|
|
||||||
:::note
|
|
||||||
The `<tenant>-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=<minio access key or username> \
|
|
||||||
--from-literal=MINIO_SECRET_KEY=<minio secret key or password>
|
|
||||||
```
|
|
||||||
|
|
||||||
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://<tenant>-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.
|
|
||||||
:::
|
|
||||||
|
|
||||||
---
|
|
||||||
@ -1,24 +0,0 @@
|
|||||||
---
|
|
||||||
sidebar_position: 55
|
|
||||||
---
|
|
||||||
|
|
||||||
# Observability
|
|
||||||
|
|
||||||
<!-- SPDX-License-Identifier: CC-BY-4.0 -->
|
|
||||||
|
|
||||||
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.
|
|
||||||
@ -1,19 +0,0 @@
|
|||||||
---
|
|
||||||
sidebar_position: 100
|
|
||||||
---
|
|
||||||
|
|
||||||
# Parameters
|
|
||||||
|
|
||||||
<!-- SPDX-License-Identifier: CC-BY-4.0 -->
|
|
||||||
|
|
||||||
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.
|
|
||||||
:::
|
|
||||||
@ -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<br />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<br />to be passed to the sidecar container when it starts.<br />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] <br /> |
|
|
||||||
|
|
||||||
|
|
||||||
#### 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.<br />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<br />date. Populated by the system. Read-only.<br />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<br />and WALs (i.e. '60d'). The retention policy is expressed in the form<br />of `XXu` where `XX` is a positive integer and `u` is in `[dwm]` -<br />days, weeks, months. | | | Pattern: `^[1-9][0-9]*[dwm]$` <br /> |
|
|
||||||
| `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<br />the earliest point in time to which the database can be<br />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 | | |
|
|
||||||
|
|
||||||
|
|
||||||
@ -1,219 +0,0 @@
|
|||||||
---
|
|
||||||
sidebar_position: 90
|
|
||||||
---
|
|
||||||
|
|
||||||
# Resource name migration guide
|
|
||||||
|
|
||||||
<!-- SPDX-License-Identifier: CC-BY-4.0 -->
|
|
||||||
|
|
||||||
:::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).
|
|
||||||
@ -1,38 +0,0 @@
|
|||||||
---
|
|
||||||
sidebar_position: 60
|
|
||||||
---
|
|
||||||
|
|
||||||
# Retention Policies
|
|
||||||
|
|
||||||
<!-- SPDX-License-Identifier: CC-BY-4.0 -->
|
|
||||||
|
|
||||||
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.
|
|
||||||
:::
|
|
||||||
|
|
||||||
@ -1,591 +0,0 @@
|
|||||||
---
|
|
||||||
sidebar_position: 90
|
|
||||||
---
|
|
||||||
|
|
||||||
# Troubleshooting
|
|
||||||
|
|
||||||
<!-- SPDX-License-Identifier: CC-BY-4.0 -->
|
|
||||||
|
|
||||||
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 <namespace> <cluster-pod-name> -c plugin-barman-cloud -f
|
|
||||||
|
|
||||||
# View all containers in a pod
|
|
||||||
kubectl logs -n <namespace> <cluster-pod-name> --all-containers=true
|
|
||||||
|
|
||||||
# View previous container logs (if container restarted)
|
|
||||||
kubectl logs -n <namespace> <cluster-pod-name> -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 <namespace>
|
|
||||||
```
|
|
||||||
2. **Get error details and target pod**:
|
|
||||||
|
|
||||||
```sh
|
|
||||||
kubectl describe backups.postgresql.cnpg.io \
|
|
||||||
-n <namespace> <backup-name>
|
|
||||||
|
|
||||||
kubectl get backups.postgresql.cnpg.io \
|
|
||||||
-n <namespace> <backup-name> \
|
|
||||||
-o jsonpath='{.status.instanceID.podName}'
|
|
||||||
```
|
|
||||||
3. **Check the target pod’s sidecar logs**:
|
|
||||||
|
|
||||||
```sh
|
|
||||||
TARGET_POD=$(kubectl get backups.postgresql.cnpg.io \
|
|
||||||
-n <namespace> <backup-name> \
|
|
||||||
-o jsonpath='{.status.instanceID.podName}')
|
|
||||||
|
|
||||||
kubectl logs \
|
|
||||||
-n <namespace> $TARGET_POD -c plugin-barman-cloud \
|
|
||||||
--tail=100 | grep -E "ERROR|FATAL|panic"
|
|
||||||
```
|
|
||||||
4. **Check cluster events**:
|
|
||||||
|
|
||||||
```sh
|
|
||||||
kubectl get events -n <namespace> \
|
|
||||||
--field-selector involvedObject.name=<cluster-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 <namespace> <cluster-name>
|
|
||||||
```
|
|
||||||
|
|
||||||
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: <your-objectstore-name>
|
|
||||||
```
|
|
||||||
|
|
||||||
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 <namespace> <primary-pod> -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 <namespace> <cluster-pod-name> \
|
|
||||||
-c plugin-barman-cloud --tail=100
|
|
||||||
|
|
||||||
# Look for restore-related errors
|
|
||||||
kubectl logs -n <namespace> <cluster-pod-name> \
|
|
||||||
-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 <namespace> <objectstore-name> -o yaml
|
|
||||||
|
|
||||||
# Check PostgreSQL recovery logs
|
|
||||||
kubectl logs -n <namespace> <cluster-pod> \
|
|
||||||
-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: <cluster-restore-name>
|
|
||||||
spec:
|
|
||||||
storage:
|
|
||||||
size: 1Gi
|
|
||||||
|
|
||||||
bootstrap:
|
|
||||||
recovery:
|
|
||||||
source: origin
|
|
||||||
recoveryTarget:
|
|
||||||
targetTime: "2024-01-15T10:30:00Z"
|
|
||||||
|
|
||||||
externalClusters:
|
|
||||||
- name: origin
|
|
||||||
plugin:
|
|
||||||
enabled: true
|
|
||||||
name: barman-cloud.cloudnative-pg.io
|
|
||||||
parameters:
|
|
||||||
barmanObjectName: <object-store-name>
|
|
||||||
serverName: <source-cluster-name>
|
|
||||||
```
|
|
||||||
|
|
||||||
2. **Check sidecar logs for WAL-related errors**
|
|
||||||
|
|
||||||
```sh
|
|
||||||
kubectl logs -n <namespace> <cluster-pod> \
|
|
||||||
-c plugin-barman-cloud | grep -i wal
|
|
||||||
```
|
|
||||||
|
|
||||||
:::note
|
|
||||||
Timestamps without an explicit timezone suffix
|
|
||||||
(e.g., `2024-01-15 10:30:00`) are interpreted as UTC.
|
|
||||||
:::
|
|
||||||
|
|
||||||
:::warning
|
|
||||||
Always specify an explicit timezone in your timestamp to avoid ambiguity.
|
|
||||||
For example, use `2024-01-15T10:30:00Z` or `2024-01-15T10:30:00+02:00`
|
|
||||||
instead of `2024-01-15 10:30:00`.
|
|
||||||
:::
|
|
||||||
|
|
||||||
:::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 <namespace> <objectstore-name> -o yaml
|
|
||||||
|
|
||||||
# Verify the secret exists and has correct keys for your provider
|
|
||||||
kubectl get secret -n <namespace> <secret-name> \
|
|
||||||
-o jsonpath='{.data}' | jq 'keys'
|
|
||||||
```
|
|
||||||
|
|
||||||
2. **Check sidecar logs for connectivity issues**
|
|
||||||
```sh
|
|
||||||
kubectl logs -n <namespace> <cluster-pod> \
|
|
||||||
-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` is set correctly for your storage provider
|
|
||||||
- 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 <cluster-name> -n <namespace>
|
|
||||||
|
|
||||||
# View cluster status in detail
|
|
||||||
kubectl cnpg status <cluster-name> -n <namespace> --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 <namespace> <cluster-name> \
|
|
||||||
--method=barmanObjectStore
|
|
||||||
|
|
||||||
# New command (plugin-based)
|
|
||||||
kubectl cnpg backup -n <namespace> <cluster-name> \
|
|
||||||
--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 <namespace>
|
|
||||||
|
|
||||||
# Get detailed backup information including error messages and target instance
|
|
||||||
kubectl describe backups.postgresql.cnpg.io \
|
|
||||||
-n <namespace> <backup-name>
|
|
||||||
|
|
||||||
# Extract the target pod name from a failed backup
|
|
||||||
kubectl get backups.postgresql.cnpg.io \
|
|
||||||
-n <namespace> <backup-name> \
|
|
||||||
-o jsonpath='{.status.instanceID.podName}'
|
|
||||||
|
|
||||||
# Get more details including the target pod, method, phase, and error
|
|
||||||
kubectl get backups.postgresql.cnpg.io \
|
|
||||||
-n <namespace> <backup-name> \
|
|
||||||
-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 <cluster-name> -n <namespace> --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 <namespace> <backup-name> \
|
|
||||||
-o jsonpath='{.status.instanceID.podName}')
|
|
||||||
echo "Backup target pod: $TARGET_POD"
|
|
||||||
|
|
||||||
# Check the sidecar logs on the specific target pod
|
|
||||||
kubectl logs -n <namespace> $TARGET_POD \
|
|
||||||
-c plugin-barman-cloud --tail=100
|
|
||||||
|
|
||||||
# Follow the logs in real time
|
|
||||||
kubectl logs -n <namespace> $TARGET_POD \
|
|
||||||
-c plugin-barman-cloud -f
|
|
||||||
|
|
||||||
# Check for specific errors in the target pod around the backup time
|
|
||||||
kubectl logs -n <namespace> $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 <namespace> -l cnpg.io/cluster=<cluster-name> \
|
|
||||||
-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 <namespace> -l cnpg.io/cluster=<cluster-name> -o name); do
|
|
||||||
echo "=== Checking $pod ==="
|
|
||||||
kubectl logs -n <namespace> $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 <namespace> \
|
|
||||||
--field-selector involvedObject.name=<cluster-name>
|
|
||||||
|
|
||||||
# Check events for failed backups
|
|
||||||
kubectl get events -n <namespace> \
|
|
||||||
--field-selector involvedObject.kind=Backup
|
|
||||||
|
|
||||||
# Get all recent events in the namespace
|
|
||||||
kubectl get events -n <namespace> --sort-by='.lastTimestamp' | tail -20
|
|
||||||
```
|
|
||||||
|
|
||||||
### Verify `ObjectStore` Configuration
|
|
||||||
|
|
||||||
```sh
|
|
||||||
# Check the ObjectStore resource
|
|
||||||
kubectl get objectstores.barmancloud.cnpg.io \
|
|
||||||
-n <namespace> <objectstore-name> -o yaml
|
|
||||||
|
|
||||||
# Verify the secret exists and has the correct keys
|
|
||||||
kubectl get secret -n <namespace> <secret-name> -o yaml
|
|
||||||
# Alternatively
|
|
||||||
kubectl get secret -n <namespace> <secret-name> -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.
|
|
||||||
|
|
||||||
@ -1,16 +0,0 @@
|
|||||||
---
|
|
||||||
sidebar_position: 25
|
|
||||||
---
|
|
||||||
|
|
||||||
# Upgrades
|
|
||||||
|
|
||||||
<!-- SPDX-License-Identifier: CC-BY-4.0 -->
|
|
||||||
|
|
||||||
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).
|
|
||||||
@ -1,283 +0,0 @@
|
|||||||
---
|
|
||||||
sidebar_position: 30
|
|
||||||
---
|
|
||||||
|
|
||||||
# Using the Barman Cloud Plugin
|
|
||||||
|
|
||||||
<!-- SPDX-License-Identifier: CC-BY-4.0 -->
|
|
||||||
|
|
||||||
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 <namespace> <cluster-name> \
|
|
||||||
--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 <namespace> <cluster-name> --method=barmanObjectStore
|
|
||||||
|
|
||||||
# New command (plugin-based backup)
|
|
||||||
kubectl cnpg backup -n <namespace> <cluster-name> \
|
|
||||||
--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.
|
|
||||||
:::
|
|
||||||
@ -1,8 +0,0 @@
|
|||||||
{
|
|
||||||
"docs": [
|
|
||||||
{
|
|
||||||
"type": "autogenerated",
|
|
||||||
"dirName": "."
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
@ -1,5 +1,4 @@
|
|||||||
[
|
[
|
||||||
"0.14.0",
|
|
||||||
"0.13.0",
|
"0.13.0",
|
||||||
"0.12.0",
|
"0.12.0",
|
||||||
"0.11.0",
|
"0.11.0",
|
||||||
|
|||||||
400
web/yarn.lock
400
web/yarn.lock
@ -12,15 +12,15 @@
|
|||||||
section-matter "^1.0.0"
|
section-matter "^1.0.0"
|
||||||
strip-bom-string "^1.0.0"
|
strip-bom-string "^1.0.0"
|
||||||
|
|
||||||
"@algolia/abtesting@1.22.0":
|
"@algolia/abtesting@1.21.2":
|
||||||
version "1.22.0"
|
version "1.21.2"
|
||||||
resolved "https://registry.yarnpkg.com/@algolia/abtesting/-/abtesting-1.22.0.tgz#7537637f52d2fe00b3714fe2d5ce8cb856be35ff"
|
resolved "https://registry.yarnpkg.com/@algolia/abtesting/-/abtesting-1.21.2.tgz#798e51b0226b6ed303a7d891235606b674a87857"
|
||||||
integrity sha512-BFR6zNowNKcY7Ou7TaJc9QWexES4YKPbmf/OTFofpdsdhz4x6q0lbxp3duO0EHnyrN7rE4ba/TSXuY+BDGu4+g==
|
integrity sha512-uXj0rgk30EpsKvOpuS+R+1XFDrnm56hED1Lz56e8uBkZdKCxw99LS2U8eXBqAHYU8kpkbsnV1GC8velBG070Hg==
|
||||||
dependencies:
|
dependencies:
|
||||||
"@algolia/client-common" "5.56.0"
|
"@algolia/client-common" "5.55.2"
|
||||||
"@algolia/requester-browser-xhr" "5.56.0"
|
"@algolia/requester-browser-xhr" "5.55.2"
|
||||||
"@algolia/requester-fetch" "5.56.0"
|
"@algolia/requester-fetch" "5.55.2"
|
||||||
"@algolia/requester-node-http" "5.56.0"
|
"@algolia/requester-node-http" "5.55.2"
|
||||||
|
|
||||||
"@algolia/autocomplete-core@1.19.2":
|
"@algolia/autocomplete-core@1.19.2":
|
||||||
version "1.19.2"
|
version "1.19.2"
|
||||||
@ -62,126 +62,126 @@
|
|||||||
resolved "https://registry.yarnpkg.com/@algolia/autocomplete-shared/-/autocomplete-shared-1.19.9.tgz#c5b05e23c71027e4e45a301f286593dffdcdfbdf"
|
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==
|
integrity sha512-YosP9Uoek6y/Ur1r1qeogk4biMe/hzkyNcgMCciw0//3XpCM7VlYLSHnyt/vOnEOGhCCc0+3v+unEiH6zz+Z1A==
|
||||||
|
|
||||||
"@algolia/client-abtesting@5.56.0":
|
"@algolia/client-abtesting@5.55.2":
|
||||||
version "5.56.0"
|
version "5.55.2"
|
||||||
resolved "https://registry.yarnpkg.com/@algolia/client-abtesting/-/client-abtesting-5.56.0.tgz#25be0db6f97ae91dfdbaffbe9eae99e963310891"
|
resolved "https://registry.yarnpkg.com/@algolia/client-abtesting/-/client-abtesting-5.55.2.tgz#5c7d1632051b05ef155a6ea7e4a9454d5c6d5a08"
|
||||||
integrity sha512-7r4Z3NC7yU1oAQVWJNA2HX7tX481F3pJvCGyLIXiTdBcthz4Q/o21jwcMYDFkuI92UWTNBQQmHYgwHo1zS5dzg==
|
integrity sha512-y7Epol8HcjlBxKXHhyhfFPFhm78B3P6x9cCbCyGTdxjsdVCptXCy5hpkZWxjGpnaLHvWsHS4QRF0TiBOLst2xg==
|
||||||
dependencies:
|
dependencies:
|
||||||
"@algolia/client-common" "5.56.0"
|
"@algolia/client-common" "5.55.2"
|
||||||
"@algolia/requester-browser-xhr" "5.56.0"
|
"@algolia/requester-browser-xhr" "5.55.2"
|
||||||
"@algolia/requester-fetch" "5.56.0"
|
"@algolia/requester-fetch" "5.55.2"
|
||||||
"@algolia/requester-node-http" "5.56.0"
|
"@algolia/requester-node-http" "5.55.2"
|
||||||
|
|
||||||
"@algolia/client-analytics@5.56.0":
|
"@algolia/client-analytics@5.55.2":
|
||||||
version "5.56.0"
|
version "5.55.2"
|
||||||
resolved "https://registry.yarnpkg.com/@algolia/client-analytics/-/client-analytics-5.56.0.tgz#bcace36358cda26ca285f3a100544db0ce29aabe"
|
resolved "https://registry.yarnpkg.com/@algolia/client-analytics/-/client-analytics-5.55.2.tgz#770694ceef05213a2dc1c64bf3cb9c0b33a16b71"
|
||||||
integrity sha512-avmjXQSq+jadFO8Xl2em05/uQdQnEmHsJyOAdVbZkmVgpMfxL12aJwVVfGNwYr9nulcpuJN1X0lTaQ5wxuNGcA==
|
integrity sha512-8Pxj2VVmpM2d+UZufnlTq7T1QIcYPVugLV5XC50PnHsV5uRM9CSoYkg2Y+CwqwRk2La0xK5QsfZ0obIU+9XftQ==
|
||||||
dependencies:
|
dependencies:
|
||||||
"@algolia/client-common" "5.56.0"
|
"@algolia/client-common" "5.55.2"
|
||||||
"@algolia/requester-browser-xhr" "5.56.0"
|
"@algolia/requester-browser-xhr" "5.55.2"
|
||||||
"@algolia/requester-fetch" "5.56.0"
|
"@algolia/requester-fetch" "5.55.2"
|
||||||
"@algolia/requester-node-http" "5.56.0"
|
"@algolia/requester-node-http" "5.55.2"
|
||||||
|
|
||||||
"@algolia/client-common@5.56.0":
|
"@algolia/client-common@5.55.2":
|
||||||
version "5.56.0"
|
version "5.55.2"
|
||||||
resolved "https://registry.yarnpkg.com/@algolia/client-common/-/client-common-5.56.0.tgz#6190221a7091dfa1a0e0a3b5964e92b1b59968ba"
|
resolved "https://registry.yarnpkg.com/@algolia/client-common/-/client-common-5.55.2.tgz#17347bdd5a118b7966231a73c59cac44d256071c"
|
||||||
integrity sha512-v2TPStUhY//ripPjIVclZ8AWc7DEGooXULZGFlFu37zNatgHjw34oZZ+OSbbc/YHO+xZwPl62I1k8xH1m4S2eg==
|
integrity sha512-9L4IpIYUqA63a7sw1trnHQGUvwiAjKz67nsgDnal98JGAc7wyposRb0Iag+eiMuyzFFaSHLe2/rGyIo+PafRBA==
|
||||||
|
|
||||||
"@algolia/client-insights@5.56.0":
|
"@algolia/client-insights@5.55.2":
|
||||||
version "5.56.0"
|
version "5.55.2"
|
||||||
resolved "https://registry.yarnpkg.com/@algolia/client-insights/-/client-insights-5.56.0.tgz#2ff179c8924ff188d4604e32aef645c709cc76be"
|
resolved "https://registry.yarnpkg.com/@algolia/client-insights/-/client-insights-5.55.2.tgz#3e575307d01d2e6ccd7394b7428edd22ec68057c"
|
||||||
integrity sha512-P0ehROpM4Sem3Sqo5x2cKPgj67D3G3jy0rh1Amwkcvsfr6tkvIcdCmerieanqTF7NxUMPNFLkpIFeMO8Rpa50w==
|
integrity sha512-ZBm2ytY5EHFcj+kjNsXxMNO/TGlOHe2fBFXGKHJOM1bk1rAy4o2YI+d9oV/w/jrqx44pvJMJlc8X6vKnCuDgUQ==
|
||||||
dependencies:
|
dependencies:
|
||||||
"@algolia/client-common" "5.56.0"
|
"@algolia/client-common" "5.55.2"
|
||||||
"@algolia/requester-browser-xhr" "5.56.0"
|
"@algolia/requester-browser-xhr" "5.55.2"
|
||||||
"@algolia/requester-fetch" "5.56.0"
|
"@algolia/requester-fetch" "5.55.2"
|
||||||
"@algolia/requester-node-http" "5.56.0"
|
"@algolia/requester-node-http" "5.55.2"
|
||||||
|
|
||||||
"@algolia/client-personalization@5.56.0":
|
"@algolia/client-personalization@5.55.2":
|
||||||
version "5.56.0"
|
version "5.55.2"
|
||||||
resolved "https://registry.yarnpkg.com/@algolia/client-personalization/-/client-personalization-5.56.0.tgz#64f8197c46c60306a115bc4024f6ebce2d8140d8"
|
resolved "https://registry.yarnpkg.com/@algolia/client-personalization/-/client-personalization-5.55.2.tgz#1c5458095fdfdd2dd0ed8dcd5b94962db2852400"
|
||||||
integrity sha512-SXK3Vn3WVxyzbm31oePZBJkp1wpOyuWdd4B/Pv7n0aXDxmeSWhC1R1FC1517mMrFAIaPH4Rt0x6RUe7ZNjz8FA==
|
integrity sha512-3FGVW/jDk7sdYwqa2NKnF/qXWcttc4bvGrwNbvqz3VoWSRv42CNvRk+3Y9QJFIUf1vY50hAuVWUoFKdyc8vaXA==
|
||||||
dependencies:
|
dependencies:
|
||||||
"@algolia/client-common" "5.56.0"
|
"@algolia/client-common" "5.55.2"
|
||||||
"@algolia/requester-browser-xhr" "5.56.0"
|
"@algolia/requester-browser-xhr" "5.55.2"
|
||||||
"@algolia/requester-fetch" "5.56.0"
|
"@algolia/requester-fetch" "5.55.2"
|
||||||
"@algolia/requester-node-http" "5.56.0"
|
"@algolia/requester-node-http" "5.55.2"
|
||||||
|
|
||||||
"@algolia/client-query-suggestions@5.56.0":
|
"@algolia/client-query-suggestions@5.55.2":
|
||||||
version "5.56.0"
|
version "5.55.2"
|
||||||
resolved "https://registry.yarnpkg.com/@algolia/client-query-suggestions/-/client-query-suggestions-5.56.0.tgz#e4a28bc249e9c69f0b5ef280b72a12e32e8c53c8"
|
resolved "https://registry.yarnpkg.com/@algolia/client-query-suggestions/-/client-query-suggestions-5.55.2.tgz#7bf49bf6f7832943646dcaa1ffc2873e54bb783e"
|
||||||
integrity sha512-5+ZdX8garFnmycnZgKhtXHePEaLj5zqDxI/0lkhhluzCcvTn0/PvvTirTg8hHYetQHvn7GDyeAiqTAieMvMW4A==
|
integrity sha512-JsG8LovDAYul5t8e533tZ3O1uZILxso5zsTtB7ONc5RJ8ACdTxAAC/jaOnsBNYb+x+STP7fzx/Iro55v5DNgoQ==
|
||||||
dependencies:
|
dependencies:
|
||||||
"@algolia/client-common" "5.56.0"
|
"@algolia/client-common" "5.55.2"
|
||||||
"@algolia/requester-browser-xhr" "5.56.0"
|
"@algolia/requester-browser-xhr" "5.55.2"
|
||||||
"@algolia/requester-fetch" "5.56.0"
|
"@algolia/requester-fetch" "5.55.2"
|
||||||
"@algolia/requester-node-http" "5.56.0"
|
"@algolia/requester-node-http" "5.55.2"
|
||||||
|
|
||||||
"@algolia/client-search@5.56.0":
|
"@algolia/client-search@5.55.2":
|
||||||
version "5.56.0"
|
version "5.55.2"
|
||||||
resolved "https://registry.yarnpkg.com/@algolia/client-search/-/client-search-5.56.0.tgz#66b19d5382bf47a16105817b78e372f5e9039508"
|
resolved "https://registry.yarnpkg.com/@algolia/client-search/-/client-search-5.55.2.tgz#8cd3d994598210e5428ca9a64dd3f17620bfbf08"
|
||||||
integrity sha512-+mKUdYvqOi0BcvpAEyCEw49vSBptufIcfibtHz2bdr1pI789M46Yt0uQEk/sxtK3teh71OQvVFHaTDzShUWewQ==
|
integrity sha512-5wDnoIfC75zJ2MSHv5SSzTlRL2z7jQMbqQ5jrzottuq2p3oBObv8pD/JpXWu8pRaimaxNr3/Bs/KZIGVXxJ7hg==
|
||||||
dependencies:
|
dependencies:
|
||||||
"@algolia/client-common" "5.56.0"
|
"@algolia/client-common" "5.55.2"
|
||||||
"@algolia/requester-browser-xhr" "5.56.0"
|
"@algolia/requester-browser-xhr" "5.55.2"
|
||||||
"@algolia/requester-fetch" "5.56.0"
|
"@algolia/requester-fetch" "5.55.2"
|
||||||
"@algolia/requester-node-http" "5.56.0"
|
"@algolia/requester-node-http" "5.55.2"
|
||||||
|
|
||||||
"@algolia/events@^4.0.1":
|
"@algolia/events@^4.0.1":
|
||||||
version "4.0.1"
|
version "4.0.1"
|
||||||
resolved "https://registry.yarnpkg.com/@algolia/events/-/events-4.0.1.tgz#fd39e7477e7bc703d7f893b556f676c032af3950"
|
resolved "https://registry.yarnpkg.com/@algolia/events/-/events-4.0.1.tgz#fd39e7477e7bc703d7f893b556f676c032af3950"
|
||||||
integrity sha512-FQzvOCgoFXAbf5Y6mYozw2aj5KCJoA3m4heImceldzPSMbdyS4atVjJzXKMsfX3wnZTFYwkkt8/z8UesLHlSBQ==
|
integrity sha512-FQzvOCgoFXAbf5Y6mYozw2aj5KCJoA3m4heImceldzPSMbdyS4atVjJzXKMsfX3wnZTFYwkkt8/z8UesLHlSBQ==
|
||||||
|
|
||||||
"@algolia/ingestion@1.56.0":
|
"@algolia/ingestion@1.55.2":
|
||||||
version "1.56.0"
|
version "1.55.2"
|
||||||
resolved "https://registry.yarnpkg.com/@algolia/ingestion/-/ingestion-1.56.0.tgz#1b3c41b8f1c5a2d309610683e3d1b99f962d92df"
|
resolved "https://registry.yarnpkg.com/@algolia/ingestion/-/ingestion-1.55.2.tgz#e247f70c5055569af70e3c676853bad4c422ab6c"
|
||||||
integrity sha512-9g/zj+AZx5moFcdFIrYQoVrueXivjUcc3MQHtCYT8WhIuk1lUh1AyEhvJCS0XBZld09cLvd1AZ3BvDBpVpX2UA==
|
integrity sha512-da+SC6ikpza98W7C5ChsKEQDvZc8PQLQ0sxmQ5yMRsHpdD3iPKnclJA6ViB5Nr5T9qOX+IDswC6AyqY4V3rtug==
|
||||||
dependencies:
|
dependencies:
|
||||||
"@algolia/client-common" "5.56.0"
|
"@algolia/client-common" "5.55.2"
|
||||||
"@algolia/requester-browser-xhr" "5.56.0"
|
"@algolia/requester-browser-xhr" "5.55.2"
|
||||||
"@algolia/requester-fetch" "5.56.0"
|
"@algolia/requester-fetch" "5.55.2"
|
||||||
"@algolia/requester-node-http" "5.56.0"
|
"@algolia/requester-node-http" "5.55.2"
|
||||||
|
|
||||||
"@algolia/monitoring@1.56.0":
|
"@algolia/monitoring@1.55.2":
|
||||||
version "1.56.0"
|
version "1.55.2"
|
||||||
resolved "https://registry.yarnpkg.com/@algolia/monitoring/-/monitoring-1.56.0.tgz#11cc9198e778466eafde5a12d02fd02cfcbd1710"
|
resolved "https://registry.yarnpkg.com/@algolia/monitoring/-/monitoring-1.55.2.tgz#56c8b9e5b8e64d5f8fd41a37854eb5559cb798d4"
|
||||||
integrity sha512-Qf3Sr6f9A9uxCZUf3MXS0d2b877uYzEB5yxqpVGXAhcJnBCQjrRRon0KvefpGkxy+BshrIJs96OUoMtGqXTFDA==
|
integrity sha512-Y8kEcPqCiIEeaGv83l9RRA09mfYECqAJHNnOyEtZc9UirI6XBMUyFVss/sSeYUiV/Lf30hkbWcl00V1uXsf86Q==
|
||||||
dependencies:
|
dependencies:
|
||||||
"@algolia/client-common" "5.56.0"
|
"@algolia/client-common" "5.55.2"
|
||||||
"@algolia/requester-browser-xhr" "5.56.0"
|
"@algolia/requester-browser-xhr" "5.55.2"
|
||||||
"@algolia/requester-fetch" "5.56.0"
|
"@algolia/requester-fetch" "5.55.2"
|
||||||
"@algolia/requester-node-http" "5.56.0"
|
"@algolia/requester-node-http" "5.55.2"
|
||||||
|
|
||||||
"@algolia/recommend@5.56.0":
|
"@algolia/recommend@5.55.2":
|
||||||
version "5.56.0"
|
version "5.55.2"
|
||||||
resolved "https://registry.yarnpkg.com/@algolia/recommend/-/recommend-5.56.0.tgz#6c96193cb91cf5c9f3c884fdf064e15dfe6cb742"
|
resolved "https://registry.yarnpkg.com/@algolia/recommend/-/recommend-5.55.2.tgz#9549d2fe261dca9ac94c144131ea980c56a6442b"
|
||||||
integrity sha512-GXWG1rWc5wu8hY4N33Y3b6ernY6sAdAvmKWN/zHAiACOx40WnpG0TVX5YazCAr/9gOYGInSiM2A0y2jy2xbiDA==
|
integrity sha512-5zmobuCQqFZkx+84Nt+suL7vo6jTh2CfAs2ndDSeTS2QHvnzP8YEEGWtWftjyACI0cK/FuH8urWwCHP+d2j8TA==
|
||||||
dependencies:
|
dependencies:
|
||||||
"@algolia/client-common" "5.56.0"
|
"@algolia/client-common" "5.55.2"
|
||||||
"@algolia/requester-browser-xhr" "5.56.0"
|
"@algolia/requester-browser-xhr" "5.55.2"
|
||||||
"@algolia/requester-fetch" "5.56.0"
|
"@algolia/requester-fetch" "5.55.2"
|
||||||
"@algolia/requester-node-http" "5.56.0"
|
"@algolia/requester-node-http" "5.55.2"
|
||||||
|
|
||||||
"@algolia/requester-browser-xhr@5.56.0":
|
"@algolia/requester-browser-xhr@5.55.2":
|
||||||
version "5.56.0"
|
version "5.55.2"
|
||||||
resolved "https://registry.yarnpkg.com/@algolia/requester-browser-xhr/-/requester-browser-xhr-5.56.0.tgz#b1f4705c53f1602ec14339999bfbf0e3e9a7bbc8"
|
resolved "https://registry.yarnpkg.com/@algolia/requester-browser-xhr/-/requester-browser-xhr-5.55.2.tgz#087322fcdfb35fdf8226d2ca966628c49f711d74"
|
||||||
integrity sha512-7t24cBxaInS3mZb7ddEaZT/tp6q+/aR4YttsQVyP1/i+LmwPR34atO35KjaLFCcRVrlP7sYOAqkCfg6lIRB+ew==
|
integrity sha512-qnGUUuWG66dRMnr33owLsrYIh9fHVxtU4R2rd3SpneAHuoAUcGbDOWNrj05glVU6M8yOqo9gQ22K8zpz0I8Xpg==
|
||||||
dependencies:
|
dependencies:
|
||||||
"@algolia/client-common" "5.56.0"
|
"@algolia/client-common" "5.55.2"
|
||||||
|
|
||||||
"@algolia/requester-fetch@5.56.0":
|
"@algolia/requester-fetch@5.55.2":
|
||||||
version "5.56.0"
|
version "5.55.2"
|
||||||
resolved "https://registry.yarnpkg.com/@algolia/requester-fetch/-/requester-fetch-5.56.0.tgz#03f0aeea08efc991ab9f0663f1ea63df720fd9ba"
|
resolved "https://registry.yarnpkg.com/@algolia/requester-fetch/-/requester-fetch-5.55.2.tgz#a01695738861a80181f231ce7e8fca6f7a6e4072"
|
||||||
integrity sha512-R7ePHgVYmDFjZpvrsVAfbDz/d4RxKAYZ5/vgLfIsCVRZRryjWl/3INOxpOICzitehQ5FjNtNjcLQTrmHPTcHBQ==
|
integrity sha512-lKZ5uhafMvR7dWCJEyuaeyZitid1I3ICx+k0vGf5x/ktdIQvc7bndCiOPpmIDqUmN26FE3jTehkAzSqee95G2Q==
|
||||||
dependencies:
|
dependencies:
|
||||||
"@algolia/client-common" "5.56.0"
|
"@algolia/client-common" "5.55.2"
|
||||||
|
|
||||||
"@algolia/requester-node-http@5.56.0":
|
"@algolia/requester-node-http@5.55.2":
|
||||||
version "5.56.0"
|
version "5.55.2"
|
||||||
resolved "https://registry.yarnpkg.com/@algolia/requester-node-http/-/requester-node-http-5.56.0.tgz#238bfa98ed145e261c1db7e133bee6390ba58c94"
|
resolved "https://registry.yarnpkg.com/@algolia/requester-node-http/-/requester-node-http-5.55.2.tgz#5ceae3de5e223366fc5b3e643fcc0542909b87e8"
|
||||||
integrity sha512-PIOUXlSnrqM0S+WOgDRb4RzotydJH7ZoT6tOyL7tAO7qJOfvX5wsEW8Pe+PMKMwvuI4/gIyK9cg2H7lJXqnc4Q==
|
integrity sha512-Zc90xvKWUvxcNicvvTO9Pr/hT2TAnkixOIzJm/KMj5Ptm2pKjk71ngTsdkbRtJQvhZ2Kr9N1YdIjLrNHB5P2xw==
|
||||||
dependencies:
|
dependencies:
|
||||||
"@algolia/client-common" "5.56.0"
|
"@algolia/client-common" "5.55.2"
|
||||||
|
|
||||||
"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.29.7":
|
"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.29.7":
|
||||||
version "7.29.7"
|
version "7.29.7"
|
||||||
@ -2017,24 +2017,24 @@
|
|||||||
tslib "^2.4.0"
|
tslib "^2.4.0"
|
||||||
|
|
||||||
"@emnapi/core@^1.4.3":
|
"@emnapi/core@^1.4.3":
|
||||||
version "1.11.3"
|
version "1.11.2"
|
||||||
resolved "https://registry.yarnpkg.com/@emnapi/core/-/core-1.11.3.tgz#5e95348a42cd1e06f0b9aa380cd74091daa4d520"
|
resolved "https://registry.yarnpkg.com/@emnapi/core/-/core-1.11.2.tgz#fab0a0f3c492d11f5a9ac9065d0d73955ee1c1c9"
|
||||||
integrity sha512-zLpS5asjEb7lq8jYLq37N6XKaE41DIexlY1rF/z4/tIl3wo13Sqm28fRyfIsKZD+NZ8mM5RoKkpW/rBcuoSZSg==
|
integrity sha512-TC8MkTuZUtcTSiFeuC0ksCh9QIJ5+F21MvZ4Wn4ORfYaFJ/0dsiudv5tVkejgwZlwQ39jL9WWDe2lz8x0WglOA==
|
||||||
dependencies:
|
dependencies:
|
||||||
"@emnapi/wasi-threads" "1.2.3"
|
"@emnapi/wasi-threads" "1.2.2"
|
||||||
tslib "^2.4.0"
|
tslib "^2.4.0"
|
||||||
|
|
||||||
"@emnapi/runtime@^1.4.3":
|
"@emnapi/runtime@^1.4.3":
|
||||||
version "1.11.3"
|
version "1.11.2"
|
||||||
resolved "https://registry.yarnpkg.com/@emnapi/runtime/-/runtime-1.11.3.tgz#84257ae3b0531eb2aec1ffa23d70700da007ba95"
|
resolved "https://registry.yarnpkg.com/@emnapi/runtime/-/runtime-1.11.2.tgz#eb22f04d76febfdf4f87fdaff54c8a53f6bf0dbd"
|
||||||
integrity sha512-Xz4Tpyki7XyrpbUK1jR1AhdAdaXyhhY4lZ3neLodmhpuWfy2PAQN5B46sAiU4liOXGLkHypn/qU+jvfWSCYYLA==
|
integrity sha512-kyOl3X0DuTiT1h2ft8r2fYO8JYtU9a9Xis/zBSiGArNaagCOWx90N1k2wxp18czFDH+OgcWGb5ZP/XMt3dcyPA==
|
||||||
dependencies:
|
dependencies:
|
||||||
tslib "^2.4.0"
|
tslib "^2.4.0"
|
||||||
|
|
||||||
"@emnapi/wasi-threads@1.2.3":
|
"@emnapi/wasi-threads@1.2.2":
|
||||||
version "1.2.3"
|
version "1.2.2"
|
||||||
resolved "https://registry.yarnpkg.com/@emnapi/wasi-threads/-/wasi-threads-1.2.3.tgz#c9bf72fd4be5b928aee894820e8d814ed73916e9"
|
resolved "https://registry.yarnpkg.com/@emnapi/wasi-threads/-/wasi-threads-1.2.2.tgz#4c93becf5bfa3b13d1bbdcc06aee38321ad8139a"
|
||||||
integrity sha512-ELEBe8PsLvvJ6QMr0zLt8ffvOHW/dc1m3CEzNMg7aJUv3bMaoDtw2TXyDAwkYBuroxxuHEwhRTLJSe5sya547g==
|
integrity sha512-c95qOXkHdydNKhscBTebqEC1CVAZpyqOfVfBzQ1qgzyl3gfeldUjIggDbIZgDKsHLgnsM+igH7TJ/eAasaVuMA==
|
||||||
dependencies:
|
dependencies:
|
||||||
tslib "^2.4.0"
|
tslib "^2.4.0"
|
||||||
|
|
||||||
@ -2616,9 +2616,9 @@
|
|||||||
integrity sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ==
|
integrity sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ==
|
||||||
|
|
||||||
"@sinclair/typebox@^0.27.8":
|
"@sinclair/typebox@^0.27.8":
|
||||||
version "0.27.12"
|
version "0.27.10"
|
||||||
resolved "https://registry.yarnpkg.com/@sinclair/typebox/-/typebox-0.27.12.tgz#0cacd3cff047a32936b1ace47ea7c86eaab60a7f"
|
resolved "https://registry.yarnpkg.com/@sinclair/typebox/-/typebox-0.27.10.tgz#beefe675f1853f73676aecc915b2bd2ac98c4fc6"
|
||||||
integrity sha512-hhyNJ+nbR6ZR7pToHvllEFun9TL0sbL+tk/ON75lo+Xas054uez98qRbsuNt7MBCyZKK4+8Yli/OAGZhmfBZ/g==
|
integrity sha512-MTBk/3jGLNB2tVxv6uLlFh1iu64iYOQ2PbdOSK3NW8JZsmlaOh2q6sdtKowBhfw8QFLmYNzTW4/oK4uATIi6ZA==
|
||||||
|
|
||||||
"@sindresorhus/is@^4.6.0":
|
"@sindresorhus/is@^4.6.0":
|
||||||
version "4.6.0"
|
version "4.6.0"
|
||||||
@ -3318,6 +3318,11 @@ accepts@~1.3.8:
|
|||||||
mime-types "~2.1.34"
|
mime-types "~2.1.34"
|
||||||
negotiator "0.6.3"
|
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:
|
acorn-jsx@^5.0.0:
|
||||||
version "5.3.2"
|
version "5.3.2"
|
||||||
resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937"
|
resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937"
|
||||||
@ -3395,24 +3400,24 @@ algoliasearch-helper@^3.26.0:
|
|||||||
"@algolia/events" "^4.0.1"
|
"@algolia/events" "^4.0.1"
|
||||||
|
|
||||||
algoliasearch@^5.37.0:
|
algoliasearch@^5.37.0:
|
||||||
version "5.56.0"
|
version "5.55.2"
|
||||||
resolved "https://registry.yarnpkg.com/algoliasearch/-/algoliasearch-5.56.0.tgz#042f1a39dfa951356206f43dece1c8d1ea1721bd"
|
resolved "https://registry.yarnpkg.com/algoliasearch/-/algoliasearch-5.55.2.tgz#5aa9426faedfa63c6433e6ba78b1843c8208e012"
|
||||||
integrity sha512-PrqppUmhT4ENdas2pH9caE7efUcxy6EcSFhWzosiVuQBzu2tQ5yLTI6jwomT/1cuBnivzGfxiJCqDNN9FRRh+Q==
|
integrity sha512-OyacJsaeuLUvGWOynNqYc6sx88XvyoG39wMT8SYqL3l9wwaorDW/LPRbUPfhzw0bWsUWzNCZTnFYOrWFBKsUaw==
|
||||||
dependencies:
|
dependencies:
|
||||||
"@algolia/abtesting" "1.22.0"
|
"@algolia/abtesting" "1.21.2"
|
||||||
"@algolia/client-abtesting" "5.56.0"
|
"@algolia/client-abtesting" "5.55.2"
|
||||||
"@algolia/client-analytics" "5.56.0"
|
"@algolia/client-analytics" "5.55.2"
|
||||||
"@algolia/client-common" "5.56.0"
|
"@algolia/client-common" "5.55.2"
|
||||||
"@algolia/client-insights" "5.56.0"
|
"@algolia/client-insights" "5.55.2"
|
||||||
"@algolia/client-personalization" "5.56.0"
|
"@algolia/client-personalization" "5.55.2"
|
||||||
"@algolia/client-query-suggestions" "5.56.0"
|
"@algolia/client-query-suggestions" "5.55.2"
|
||||||
"@algolia/client-search" "5.56.0"
|
"@algolia/client-search" "5.55.2"
|
||||||
"@algolia/ingestion" "1.56.0"
|
"@algolia/ingestion" "1.55.2"
|
||||||
"@algolia/monitoring" "1.56.0"
|
"@algolia/monitoring" "1.55.2"
|
||||||
"@algolia/recommend" "5.56.0"
|
"@algolia/recommend" "5.55.2"
|
||||||
"@algolia/requester-browser-xhr" "5.56.0"
|
"@algolia/requester-browser-xhr" "5.55.2"
|
||||||
"@algolia/requester-fetch" "5.56.0"
|
"@algolia/requester-fetch" "5.55.2"
|
||||||
"@algolia/requester-node-http" "5.56.0"
|
"@algolia/requester-node-http" "5.55.2"
|
||||||
|
|
||||||
ansi-align@^3.0.1:
|
ansi-align@^3.0.1:
|
||||||
version "3.0.1"
|
version "3.0.1"
|
||||||
@ -3496,12 +3501,12 @@ astring@^1.8.0:
|
|||||||
integrity sha512-LElXdjswlqjWrPpJFg1Fx4wpkOCxj1TDHlSV4PlaRxHGWko024xICaa97ZkMfs6DRKlCguiAI+rbXv5GWwXIkg==
|
integrity sha512-LElXdjswlqjWrPpJFg1Fx4wpkOCxj1TDHlSV4PlaRxHGWko024xICaa97ZkMfs6DRKlCguiAI+rbXv5GWwXIkg==
|
||||||
|
|
||||||
autoprefixer@^10.4.19, autoprefixer@^10.4.23:
|
autoprefixer@^10.4.19, autoprefixer@^10.4.23:
|
||||||
version "10.5.4"
|
version "10.5.3"
|
||||||
resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-10.5.4.tgz#3b7dd848b4155514a95ad1f6ce598844bea09697"
|
resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-10.5.3.tgz#cd6f4c611cef98055c998b5de8e6b1759f024447"
|
||||||
integrity sha512-MaU0U/za7N3r6brxD4YB/l4NSrFzLPlANv6wEuQVaIPlD3L4W9rFcQPbL/EilY9BHhHvhfcz3gInDLrEtWT4EA==
|
integrity sha512-bJRzflk8GgE4JX+iZNEwz9f9p460NCHnU7bd+CZ9vIjIlZuTkt6F3WSl2oNO8StZBFx17nLEsiQ6H2wcZiY7nA==
|
||||||
dependencies:
|
dependencies:
|
||||||
browserslist "^4.28.6"
|
browserslist "^4.28.6"
|
||||||
caniuse-lite "^1.0.30001806"
|
caniuse-lite "^1.0.30001805"
|
||||||
fraction.js "^5.3.4"
|
fraction.js "^5.3.4"
|
||||||
picocolors "^1.1.1"
|
picocolors "^1.1.1"
|
||||||
postcss-value-parser "^4.2.0"
|
postcss-value-parser "^4.2.0"
|
||||||
@ -3563,10 +3568,10 @@ balanced-match@^1.0.0:
|
|||||||
resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee"
|
resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee"
|
||||||
integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==
|
integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==
|
||||||
|
|
||||||
baseline-browser-mapping@^2.10.44:
|
baseline-browser-mapping@^2.10.42:
|
||||||
version "2.11.4"
|
version "2.10.43"
|
||||||
resolved "https://registry.yarnpkg.com/baseline-browser-mapping/-/baseline-browser-mapping-2.11.4.tgz#3da1a877a8be2ec06495123ce994b43af58cc55e"
|
resolved "https://registry.yarnpkg.com/baseline-browser-mapping/-/baseline-browser-mapping-2.10.43.tgz#7b5d11590ce5acdbe4859443e3c940e81ce8c02d"
|
||||||
integrity sha512-s4+sLr9mZ/CyqeRritFeYV/Zx73OAtmaHn6kkBS1XRoJn1hrg3xIDUcpicAEX68tkcIN0iBCgti31C8zxtkhsQ==
|
integrity sha512-AjYpR78kDWAY3Efj+cDTFH9t9SCoL7OoTp1BOb0mQV7S+6CiLwnWM3FyxhJtdPufDFKzmCSFoUncKjWgJEZTCQ==
|
||||||
|
|
||||||
batch@0.6.1:
|
batch@0.6.1:
|
||||||
version "0.6.1"
|
version "0.6.1"
|
||||||
@ -3658,13 +3663,13 @@ braces@^3.0.3, braces@~3.0.2:
|
|||||||
fill-range "^7.1.1"
|
fill-range "^7.1.1"
|
||||||
|
|
||||||
browserslist@^4.0.0, browserslist@^4.23.0, browserslist@^4.24.0, browserslist@^4.28.1, browserslist@^4.28.6:
|
browserslist@^4.0.0, browserslist@^4.23.0, browserslist@^4.24.0, browserslist@^4.28.1, browserslist@^4.28.6:
|
||||||
version "4.28.7"
|
version "4.28.6"
|
||||||
resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.28.7.tgz#409046517fccd2e51cdc20f077454b7141184028"
|
resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.28.6.tgz#7cf83afcd69c55fde6fb2dcc5039ff0f4ba42610"
|
||||||
integrity sha512-JxV13hNrFxqjOc8alRbq9dK1MM79NEXYpma2B2J4wAtpWS5zIEIKqWPGCl7N4o7Uc7B7itylh7SuDujATRyyTw==
|
integrity sha512-FQBYNK15VMslhLHpA7+n+n1GOlF1kId2xcCg7/j95f24AOF6VDYMNH4mFxF7KuaTdv627faazpOAjFzMrfJOUw==
|
||||||
dependencies:
|
dependencies:
|
||||||
baseline-browser-mapping "^2.10.44"
|
baseline-browser-mapping "^2.10.42"
|
||||||
caniuse-lite "^1.0.30001806"
|
caniuse-lite "^1.0.30001803"
|
||||||
electron-to-chromium "^1.5.393"
|
electron-to-chromium "^1.5.389"
|
||||||
node-releases "^2.0.51"
|
node-releases "^2.0.51"
|
||||||
update-browserslist-db "^1.2.3"
|
update-browserslist-db "^1.2.3"
|
||||||
|
|
||||||
@ -3772,10 +3777,10 @@ caniuse-api@^3.0.0:
|
|||||||
lodash.memoize "^4.1.2"
|
lodash.memoize "^4.1.2"
|
||||||
lodash.uniq "^4.5.0"
|
lodash.uniq "^4.5.0"
|
||||||
|
|
||||||
caniuse-lite@^1.0.0, caniuse-lite@^1.0.30001806:
|
caniuse-lite@^1.0.0, caniuse-lite@^1.0.30001803, caniuse-lite@^1.0.30001805:
|
||||||
version "1.0.30001806"
|
version "1.0.30001805"
|
||||||
resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001806.tgz#1bc8e502b723fa393455dfbedd5ccec0c29bb74e"
|
resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001805.tgz#78d5d5968a69b7ff81af87a96d7ddc7ea6670b1e"
|
||||||
integrity sha512-72Cuvd95zbSYPKq6Fhg8eDJRlzgWDf7/mtoZv6Qe/DYNCEBdNxoA3+rZAU2ZhGCpZlns3EssFavaZomckT5Uuw==
|
integrity sha512-52noaS3DubycKSXaU30TwPGIp+POyQSUVa5jBEq3vkRkY0kjyb3LQgvhU6WGyCcyXqVLWO0Cw0Q6BSdD0kUfVA==
|
||||||
|
|
||||||
ccount@^2.0.0:
|
ccount@^2.0.0:
|
||||||
version "2.0.1"
|
version "2.0.1"
|
||||||
@ -4567,10 +4572,10 @@ ee-first@1.1.1:
|
|||||||
resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d"
|
resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d"
|
||||||
integrity sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==
|
integrity sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==
|
||||||
|
|
||||||
electron-to-chromium@^1.5.393:
|
electron-to-chromium@^1.5.389:
|
||||||
version "1.5.396"
|
version "1.5.392"
|
||||||
resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.5.396.tgz#4aa96428486c8d1c9c8aeb205b2d6e04928ca046"
|
resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.5.392.tgz#31e9f9af0d8df3d1489468a4242b173605617482"
|
||||||
integrity sha512-yHiw2Y3C3H9U6TMbOfoWK/BPreiOPXRfTWPBwQBoZG6/8TB6eOPnsy5oaRYuatR7Fw2SJ4kKforgufeo7fq0EQ==
|
integrity sha512-1yQq3VQCZRwsnYc67Oc+1fge6Lwtn0hzi6zmEVkB61Zx21kTbwJAW4dFLadl5Rc1tKhG/kSpYXnfiAhu0f0a1g==
|
||||||
|
|
||||||
emoji-regex@^8.0.0:
|
emoji-regex@^8.0.0:
|
||||||
version "8.0.0"
|
version "8.0.0"
|
||||||
@ -4610,10 +4615,10 @@ encoding-sniffer@^0.2.1:
|
|||||||
iconv-lite "^0.6.3"
|
iconv-lite "^0.6.3"
|
||||||
whatwg-encoding "^3.1.1"
|
whatwg-encoding "^3.1.1"
|
||||||
|
|
||||||
enhanced-resolve@^5.24.2:
|
enhanced-resolve@^5.22.2:
|
||||||
version "5.24.3"
|
version "5.24.2"
|
||||||
resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.24.3.tgz#406bbf1ec20971265a30254f08030fce6a8207fe"
|
resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.24.2.tgz#f25d703a24431cb1e02f944adb74aefa4fcb8d7e"
|
||||||
integrity sha512-PwKooW9JUzh5chmYfHM3IQl5OkK2u2Nm011MgeZrss3JmFraUx/fqrf78kk8GUMYoibx/14MdwTl/1WKkG7TpQ==
|
integrity sha512-rpsZEGT1jFuve6QlpyRp9ckQ+kN61hvF9BzCPyMdaKTm8UJce96KBn3sorXOFXlzjPrs3Vc4T1NsSroZ3PxlFw==
|
||||||
dependencies:
|
dependencies:
|
||||||
graceful-fs "^4.2.4"
|
graceful-fs "^4.2.4"
|
||||||
tapable "^2.3.3"
|
tapable "^2.3.3"
|
||||||
@ -4917,9 +4922,9 @@ fast-json-stable-stringify@^2.0.0:
|
|||||||
integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==
|
integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==
|
||||||
|
|
||||||
fast-uri@^3.0.1:
|
fast-uri@^3.0.1:
|
||||||
version "3.1.4"
|
version "3.1.3"
|
||||||
resolved "https://registry.yarnpkg.com/fast-uri/-/fast-uri-3.1.4.tgz#3b3daf9ce68f41f956df0b505132c0cfce9ec7af"
|
resolved "https://registry.yarnpkg.com/fast-uri/-/fast-uri-3.1.3.tgz#f695a40f006aba505631573a0021ddb21194ad11"
|
||||||
integrity sha512-8JnbkQ4juDyvYs4mgFGQqg4yCYtFDtUtmp2QIQq11ZZe5CFQ5wcqm1rqDgAh/QdMySuBnPzMUiJUNZG5N/AiQw==
|
integrity sha512-i70LwGWUduXqzicKXWshooq+sWL1K3WUU5rKZNG/0i3a1OSoX3HqhH5WbWwTmqWfor4urUakGPiRQcleRZTwOg==
|
||||||
|
|
||||||
fastq@^1.6.0:
|
fastq@^1.6.0:
|
||||||
version "1.20.1"
|
version "1.20.1"
|
||||||
@ -5038,9 +5043,9 @@ fs-extra@^10.0.0:
|
|||||||
universalify "^2.0.0"
|
universalify "^2.0.0"
|
||||||
|
|
||||||
fs-extra@^11.1.1, fs-extra@^11.2.0:
|
fs-extra@^11.1.1, fs-extra@^11.2.0:
|
||||||
version "11.4.0"
|
version "11.3.6"
|
||||||
resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-11.4.0.tgz#f88ed6d180ac9e14b61b08e679468f0b1b6b4730"
|
resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-11.3.6.tgz#f7cb80e9df550cd1db6f537fa5cdd568d3e70d10"
|
||||||
integrity sha512-EQsFzMUJkCKGr1ePqlYADkIUmHW1s3ZXr5Yqy6wbGrfUCphpl2maM/kyOIRA2HpP3AaFQTZXD4ldjek+nccddA==
|
integrity sha512-w8ZNZr2mKIc7qeNaQ9AVPT1+iFaI+Avd4xudVOvdDJ8VytREi1Ft5Ih7hd9jjehod8vAM5GMsfQ/TpPf4EyoEA==
|
||||||
dependencies:
|
dependencies:
|
||||||
graceful-fs "^4.2.0"
|
graceful-fs "^4.2.0"
|
||||||
jsonfile "^6.0.1"
|
jsonfile "^6.0.1"
|
||||||
@ -5412,9 +5417,9 @@ html-void-elements@^3.0.0:
|
|||||||
integrity sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==
|
integrity sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==
|
||||||
|
|
||||||
html-webpack-plugin@^5.6.0:
|
html-webpack-plugin@^5.6.0:
|
||||||
version "5.6.8"
|
version "5.6.7"
|
||||||
resolved "https://registry.yarnpkg.com/html-webpack-plugin/-/html-webpack-plugin-5.6.8.tgz#5425dbc63eb533ffa59e92342be94894a125fc23"
|
resolved "https://registry.yarnpkg.com/html-webpack-plugin/-/html-webpack-plugin-5.6.7.tgz#429bab4e12abf3c07e1c608886608e2df2c06b11"
|
||||||
integrity sha512-MZmKQcTnhEh1SPSyMiEytIeDZDUoBZVorNHivQGXMASHf/BSGGOrKa2xQ5bGx3TCe1n109ecCt+cpww7wwWhKA==
|
integrity sha512-md+vXtdCAe60s1k6AU3dUyMJnDxUyQAwfwPKoLisvgUF1IXjtlLsk2se54+qfL9Mdm26bbwvjJybpNx48NKRLw==
|
||||||
dependencies:
|
dependencies:
|
||||||
"@types/html-minifier-terser" "^6.0.0"
|
"@types/html-minifier-terser" "^6.0.0"
|
||||||
html-minifier-terser "^6.0.2"
|
html-minifier-terser "^6.0.2"
|
||||||
@ -5975,6 +5980,11 @@ lines-and-columns@^1.1.6:
|
|||||||
resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.2.4.tgz#eca284f75d2965079309dc0ad9255abb2ebc1632"
|
resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.2.4.tgz#eca284f75d2965079309dc0ad9255abb2ebc1632"
|
||||||
integrity sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==
|
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:
|
loader-utils@^2.0.0:
|
||||||
version "2.0.4"
|
version "2.0.4"
|
||||||
resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-2.0.4.tgz#8b5cb38b5c34a9a018ee1fc0e6a066d1dfcc528c"
|
resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-2.0.4.tgz#8b5cb38b5c34a9a018ee1fc0e6a066d1dfcc528c"
|
||||||
@ -6883,7 +6893,7 @@ multicast-dns@^7.2.5:
|
|||||||
dns-packet "^5.2.2"
|
dns-packet "^5.2.2"
|
||||||
thunky "^1.0.2"
|
thunky "^1.0.2"
|
||||||
|
|
||||||
nanoid@^3.3.16:
|
nanoid@^3.3.12:
|
||||||
version "3.3.16"
|
version "3.3.16"
|
||||||
resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.16.tgz#a04d8ec4b1f10009d2d533947aefe4293737816c"
|
resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.16.tgz#a04d8ec4b1f10009d2d533947aefe4293737816c"
|
||||||
integrity sha512-bzlKTyNJ7+LdGIIwy8ijFpIqEQIvafahV7eYykJ8Cvh42EdJeODoJ6gUJXpQJvej1BddH8OqTXZNE/KfbWAu8Q==
|
integrity sha512-bzlKTyNJ7+LdGIIwy8ijFpIqEQIvafahV7eYykJ8Cvh42EdJeODoJ6gUJXpQJvej1BddH8OqTXZNE/KfbWAu8Q==
|
||||||
@ -7808,11 +7818,11 @@ postcss-zindex@^6.0.2:
|
|||||||
integrity sha512-5BxW9l1evPB/4ZIc+2GobEBoKC+h8gPGCMi+jxsYvd2x0mjq7wazk6DrP71pStqxE9Foxh5TVnonbWpFZzXaYg==
|
integrity sha512-5BxW9l1evPB/4ZIc+2GobEBoKC+h8gPGCMi+jxsYvd2x0mjq7wazk6DrP71pStqxE9Foxh5TVnonbWpFZzXaYg==
|
||||||
|
|
||||||
postcss@^8.4.21, postcss@^8.4.24, postcss@^8.4.33, postcss@^8.5.4:
|
postcss@^8.4.21, postcss@^8.4.24, postcss@^8.4.33, postcss@^8.5.4:
|
||||||
version "8.5.23"
|
version "8.5.19"
|
||||||
resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.5.23.tgz#3493550116f478487298301d2c2e8dc5a56e6594"
|
resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.5.19.tgz#45ad5cfde499408e20147348237551381a922037"
|
||||||
integrity sha512-g50586zr4bZmwFiTlflMu8E0bDTb5I5gertgwAKmsdUlTQIhZtunzUlD1WSzwcVWPoAVpsrA6vlfCD7oXvRwgg==
|
integrity sha512-Mz8SaolMd8nB+G13WkORcxQKHZ/NE4xXevtkJHVuG+guo9/wYKlIMTKAqGdEmYOXR2ijPjTYNHssizdaVSUNdQ==
|
||||||
dependencies:
|
dependencies:
|
||||||
nanoid "^3.3.16"
|
nanoid "^3.3.12"
|
||||||
picocolors "^1.1.1"
|
picocolors "^1.1.1"
|
||||||
source-map-js "^1.2.1"
|
source-map-js "^1.2.1"
|
||||||
|
|
||||||
@ -7960,9 +7970,9 @@ rc@1.2.8:
|
|||||||
strip-json-comments "~2.0.1"
|
strip-json-comments "~2.0.1"
|
||||||
|
|
||||||
react-dom@^19.0.0:
|
react-dom@^19.0.0:
|
||||||
version "19.2.8"
|
version "19.2.7"
|
||||||
resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-19.2.8.tgz#3b46b9eeda877cdff2cf13d2770fff4ae36c2ec2"
|
resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-19.2.7.tgz#0450dc9ae9ddbff76ef196401cd8b8c7fb466ccc"
|
||||||
integrity sha512-rVprimfGBG3DR+Tq0IQG2DT5PxKth1WIGDmj5yPmlzr4YBe7uyE+Du4oVqTDXZSHGGGXRtTJEGSSePyQCMBglQ==
|
integrity sha512-t0BRVXvbiE/o20Hfw669rLbMCDWtYZLvmJigy2f0MxsXF+71pxhR3xOkspmsO8h3ZlNzyibAmtCa3l4lYKk6gQ==
|
||||||
dependencies:
|
dependencies:
|
||||||
scheduler "^0.27.0"
|
scheduler "^0.27.0"
|
||||||
|
|
||||||
@ -8042,9 +8052,9 @@ react-router@5.3.4, react-router@^5.3.4:
|
|||||||
tiny-warning "^1.0.0"
|
tiny-warning "^1.0.0"
|
||||||
|
|
||||||
react@^19.0.0:
|
react@^19.0.0:
|
||||||
version "19.2.8"
|
version "19.2.7"
|
||||||
resolved "https://registry.yarnpkg.com/react/-/react-19.2.8.tgz#a80663dbb58d69c6fe3fd291d3cb324e8a7dff2d"
|
resolved "https://registry.yarnpkg.com/react/-/react-19.2.7.tgz#1f47a1bfc06f8ec885752c6f4af14369a9f8260b"
|
||||||
integrity sha512-PWaYA1L/q9u2u7xYQi+Y3L3Yfnie7XyLeaJICV1MGD6LprsBxcAqGjYyr0eY3p+QdsA+x/Irkt4Qif8D63+Sbw==
|
integrity sha512-HNe9WslTbXmFK8o8cmwgAeJFSBvt1bPdHCVKtaaV+WlAN36mpT4hcRpwbf3fY56ar2oIXzsBpOAiIRHAdY0OlQ==
|
||||||
|
|
||||||
readable-stream@^2.0.1:
|
readable-stream@^2.0.1:
|
||||||
version "2.3.8"
|
version "2.3.8"
|
||||||
@ -8380,9 +8390,9 @@ safe-buffer@~5.1.0, safe-buffer@~5.1.1:
|
|||||||
integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==
|
integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==
|
||||||
|
|
||||||
sax@^1.2.4, sax@^1.5.0:
|
sax@^1.2.4, sax@^1.5.0:
|
||||||
version "1.6.1"
|
version "1.6.0"
|
||||||
resolved "https://registry.yarnpkg.com/sax/-/sax-1.6.1.tgz#4c23cf608c0b693ab54b4b5888e92cfe977b9843"
|
resolved "https://registry.yarnpkg.com/sax/-/sax-1.6.0.tgz#da59637629307b97e7c4cb28e080a7bc38560d5b"
|
||||||
integrity sha512-42tBVwLWnaQvW5zc4HbZrTuWccECCZfBi92FDuwtqxasH+JbPB3/FOKb1m222K42R4WxuxzzMsTswfzgtSu64Q==
|
integrity sha512-6R3J5M4AcbtLUdZmRv2SygeVaM7IhrLXu9BmnOGmmACak8fiUtOsYNWUS4uK7upbmHIBbLBeFeI//477BKLBzA==
|
||||||
|
|
||||||
scheduler@^0.27.0:
|
scheduler@^0.27.0:
|
||||||
version "0.27.0"
|
version "0.27.0"
|
||||||
@ -8904,9 +8914,9 @@ terser@^5.10.0, terser@^5.15.1, terser@^5.31.1:
|
|||||||
source-map-support "~0.5.20"
|
source-map-support "~0.5.20"
|
||||||
|
|
||||||
thingies@^2.5.0:
|
thingies@^2.5.0:
|
||||||
version "2.6.1"
|
version "2.6.0"
|
||||||
resolved "https://registry.yarnpkg.com/thingies/-/thingies-2.6.1.tgz#4eb28e2585a75288f1765a0b08f1dfa020357a6f"
|
resolved "https://registry.yarnpkg.com/thingies/-/thingies-2.6.0.tgz#e09b98b9e6f6caf8a759eca8481fea1de974d2b1"
|
||||||
integrity sha512-cV/CMGTK3M4MlnJ/0At6ismOw/A0EEniDNScajjz/Br3c1sqE72YD01rGpPTKwd27wAxI5Pr+6+0w8yofzFRYw==
|
integrity sha512-rMHRjmlFLM1R96UYPvpmnc3LYtdFrT33JIB7L9hetGue1qAPfn1N2LJeEjxUSidu1Iku+haLZXDuEXUHNGO/lg==
|
||||||
|
|
||||||
thunky@^1.0.2:
|
thunky@^1.0.2:
|
||||||
version "1.1.0"
|
version "1.1.0"
|
||||||
@ -9034,9 +9044,9 @@ undici-types@~8.3.0:
|
|||||||
integrity sha512-j375ScV60dom+YkPFIfTLcOiPxkN/buHz5GobjLhixFuANaNs3C9l4GmrWqejgXWJ7BbJcFYpTEUkS1Ge8bpZQ==
|
integrity sha512-j375ScV60dom+YkPFIfTLcOiPxkN/buHz5GobjLhixFuANaNs3C9l4GmrWqejgXWJ7BbJcFYpTEUkS1Ge8bpZQ==
|
||||||
|
|
||||||
undici@^7.19.0:
|
undici@^7.19.0:
|
||||||
version "7.29.0"
|
version "7.28.0"
|
||||||
resolved "https://registry.yarnpkg.com/undici/-/undici-7.29.0.tgz#ae0f6f62e06e057a9cbb7b2b5fde2bb74f791b8f"
|
resolved "https://registry.yarnpkg.com/undici/-/undici-7.28.0.tgz#97d64564198b285bc281f0e8e29597e3d11fe7ec"
|
||||||
integrity sha512-IDxfleLmmbSskfWSUATiN1nfn2rDuvnMOqb5CWR92iIfojA0Ud+ulOAAEQ57LPr9rWmsreUyf5lwyao+7GNNVw==
|
integrity sha512-cRZYrTDwWznlnRiPjggAGxZXanty6M8RV1ff8Wm4LWXBp7/IG8v5DnOm74DtUBp9OONpK75YlPnIjQqX0dBDtA==
|
||||||
|
|
||||||
unicode-canonical-property-names-ecmascript@^2.0.0:
|
unicode-canonical-property-names-ecmascript@^2.0.0:
|
||||||
version "2.0.1"
|
version "2.0.1"
|
||||||
@ -9345,15 +9355,15 @@ webpack-merge@^6.0.1:
|
|||||||
flat "^5.0.2"
|
flat "^5.0.2"
|
||||||
wildcard "^2.0.1"
|
wildcard "^2.0.1"
|
||||||
|
|
||||||
webpack-sources@^3.5.1:
|
webpack-sources@^3.5.0:
|
||||||
version "3.5.1"
|
version "3.5.1"
|
||||||
resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-3.5.1.tgz#76c2418486dcc02b2aa0694c104176c2858fe84a"
|
resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-3.5.1.tgz#76c2418486dcc02b2aa0694c104176c2858fe84a"
|
||||||
integrity sha512-jyuiGJdtvY434z5bUZrjz67v76/ePNvFZTp9Mdz29IlH4+GPsgyGjiv0fKI+M7BdkU6ADjulUcKAd3tUK3WlEw==
|
integrity sha512-jyuiGJdtvY434z5bUZrjz67v76/ePNvFZTp9Mdz29IlH4+GPsgyGjiv0fKI+M7BdkU6ADjulUcKAd3tUK3WlEw==
|
||||||
|
|
||||||
webpack@^5.88.1, webpack@^5.95.0:
|
webpack@^5.88.1, webpack@^5.95.0:
|
||||||
version "5.109.0"
|
version "5.108.4"
|
||||||
resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.109.0.tgz#871d8eee5e2d5e6eaf5ec8d1a6db74ea65491030"
|
resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.108.4.tgz#141818a411662773a0bb32dc5536acc5409943b7"
|
||||||
integrity sha512-vomrngskVVXEZF9sMZfYAd4pXZUnfaWdJGlF+BTNF+gJBCKYCQBnOeVPlrh39Ewl7nlCsirDplMy6o5g9xJHBg==
|
integrity sha512-yur8LyJoeiWh47dErD+Ok7vlbmDsJ3UbbRPAoxbGJ54WpE2y5yVo5G/inUzujnYgw3tPmBRdn+G7PoxXaYC33w==
|
||||||
dependencies:
|
dependencies:
|
||||||
"@types/estree" "^1.0.8"
|
"@types/estree" "^1.0.8"
|
||||||
"@types/json-schema" "^7.0.15"
|
"@types/json-schema" "^7.0.15"
|
||||||
@ -9361,20 +9371,22 @@ webpack@^5.88.1, webpack@^5.95.0:
|
|||||||
"@webassemblyjs/wasm-edit" "^1.14.1"
|
"@webassemblyjs/wasm-edit" "^1.14.1"
|
||||||
"@webassemblyjs/wasm-parser" "^1.14.1"
|
"@webassemblyjs/wasm-parser" "^1.14.1"
|
||||||
acorn "^8.16.0"
|
acorn "^8.16.0"
|
||||||
|
acorn-import-phases "^1.0.3"
|
||||||
browserslist "^4.28.1"
|
browserslist "^4.28.1"
|
||||||
chrome-trace-event "^1.0.2"
|
chrome-trace-event "^1.0.2"
|
||||||
enhanced-resolve "^5.24.2"
|
enhanced-resolve "^5.22.2"
|
||||||
es-module-lexer "^2.1.0"
|
es-module-lexer "^2.1.0"
|
||||||
eslint-scope "5.1.1"
|
eslint-scope "5.1.1"
|
||||||
events "^3.2.0"
|
events "^3.2.0"
|
||||||
graceful-fs "^4.2.11"
|
graceful-fs "^4.2.11"
|
||||||
|
loader-runner "^4.3.2"
|
||||||
mime-db "^1.54.0"
|
mime-db "^1.54.0"
|
||||||
minimizer-webpack-plugin "^5.6.1"
|
minimizer-webpack-plugin "^5.6.1"
|
||||||
neo-async "^2.6.2"
|
neo-async "^2.6.2"
|
||||||
schema-utils "^4.3.3"
|
schema-utils "^4.3.3"
|
||||||
tapable "^2.3.0"
|
tapable "^2.3.0"
|
||||||
watchpack "^2.5.2"
|
watchpack "^2.5.2"
|
||||||
webpack-sources "^3.5.1"
|
webpack-sources "^3.5.0"
|
||||||
|
|
||||||
webpackbar@^7.0.0:
|
webpackbar@^7.0.0:
|
||||||
version "7.0.0"
|
version "7.0.0"
|
||||||
@ -9451,9 +9463,9 @@ write-file-atomic@^3.0.3:
|
|||||||
typedarray-to-buffer "^3.1.5"
|
typedarray-to-buffer "^3.1.5"
|
||||||
|
|
||||||
ws@^7.3.1:
|
ws@^7.3.1:
|
||||||
version "7.5.13"
|
version "7.5.12"
|
||||||
resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.13.tgz#12aa507eaca76c295c278b1aebf4698ab2c1845f"
|
resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.12.tgz#4ca2c04966db4dcd2f9bc4d1419d23cd1e4a18db"
|
||||||
integrity sha512-rsKI6xDBFVf4r/x8XyChGK04QR/XHroxs/jUcoWvtEZM8TPU/X/uIY9B1CsSzYws9ZJb/6bbBu7dPhFW00CAoA==
|
integrity sha512-1xGnbYN3zbog9CwuNDQULNRrTCLIn46/WmpR1f0w6PsCYQHkylZr5vkd6kfMZYV6pRnQkcPNRyiA8LsrNKyhpg==
|
||||||
|
|
||||||
ws@^8.18.0:
|
ws@^8.18.0:
|
||||||
version "8.21.1"
|
version "8.21.1"
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user