mirror of
https://github.com/cloudnative-pg/plugin-barman-cloud.git
synced 2026-01-11 21:23:12 +01:00
Merge branch 'main' into feat/configure_startup_probe
This commit is contained in:
commit
74535f84a3
@ -1,3 +1,3 @@
|
||||
{
|
||||
".": "0.6.0"
|
||||
".": "0.7.0"
|
||||
}
|
||||
|
||||
@ -1,3 +1,4 @@
|
||||
AccessDenied
|
||||
AdditionalContainerArgs
|
||||
Akamai
|
||||
Azurite
|
||||
@ -12,6 +13,7 @@ DigitalOcean
|
||||
Docusaurus
|
||||
EDB
|
||||
EKS
|
||||
Enum
|
||||
EnvVar
|
||||
GCP
|
||||
GKE
|
||||
@ -21,9 +23,12 @@ IRSA
|
||||
IfNotPresent
|
||||
InstanceSidecarConfiguration
|
||||
JSON
|
||||
Kustomize
|
||||
Lifecycle
|
||||
Linode
|
||||
MinIO
|
||||
Misconfiguration
|
||||
NoSuchBucket
|
||||
ObjectMeta
|
||||
ObjectStore
|
||||
ObjectStoreSpec
|
||||
@ -42,6 +47,7 @@ SAS
|
||||
SFO
|
||||
SPDX
|
||||
SPDX
|
||||
SSL
|
||||
ServerRecoveryWindow
|
||||
Slonik
|
||||
TLS
|
||||
@ -54,6 +60,7 @@ amz
|
||||
api
|
||||
apiVersion
|
||||
apiextensions
|
||||
archiver
|
||||
args
|
||||
auth
|
||||
autocert
|
||||
@ -61,11 +68,13 @@ aws
|
||||
backend
|
||||
backends
|
||||
barmanObjectName
|
||||
barmanObjectStore
|
||||
barmancloud
|
||||
boto
|
||||
bzip
|
||||
cd
|
||||
cloudnative
|
||||
cloudnativepg
|
||||
clusterrole
|
||||
clusterrolebinding
|
||||
cmctl
|
||||
@ -76,7 +85,9 @@ cpu
|
||||
creds
|
||||
csi
|
||||
customresourcedefinition
|
||||
declaratively
|
||||
deps
|
||||
desc
|
||||
devel
|
||||
env
|
||||
externalClusters
|
||||
@ -88,11 +99,19 @@ hostpath
|
||||
http
|
||||
https
|
||||
imagePullPolicy
|
||||
instanceID
|
||||
instanceName
|
||||
instanceRole
|
||||
involvedObject
|
||||
io
|
||||
isWALArchiver
|
||||
jq
|
||||
jsonpath
|
||||
kb
|
||||
krew
|
||||
kubectl
|
||||
kubernetes
|
||||
lastTimestamp
|
||||
lifecycle
|
||||
localhost
|
||||
md
|
||||
@ -102,6 +121,8 @@ namespaces
|
||||
objectstore
|
||||
objectstores
|
||||
pluginConfiguration
|
||||
podName
|
||||
postgres
|
||||
postgresql
|
||||
primaryUpdateStrategy
|
||||
rbac
|
||||
@ -112,6 +133,7 @@ retentionCheckInterval
|
||||
retentionPolicy
|
||||
rolebinding
|
||||
rollout
|
||||
rpc
|
||||
sc
|
||||
secretKeyRef
|
||||
selfsigned
|
||||
|
||||
23
CHANGELOG.md
23
CHANGELOG.md
@ -1,5 +1,28 @@
|
||||
# Changelog
|
||||
|
||||
## [0.7.0](https://github.com/cloudnative-pg/plugin-barman-cloud/compare/v0.6.0...v0.7.0) (2025-09-25)
|
||||
|
||||
|
||||
### Features
|
||||
|
||||
* Introduce `logLevel` setting to control verbosity ([#536](https://github.com/cloudnative-pg/plugin-barman-cloud/issues/536)) ([0501e18](https://github.com/cloudnative-pg/plugin-barman-cloud/commit/0501e185bab4969064c5b92977747be30bd38e95))
|
||||
* Return proper gRPC error codes for expected conditions ([#549](https://github.com/cloudnative-pg/plugin-barman-cloud/issues/549)) ([08c3f1c](https://github.com/cloudnative-pg/plugin-barman-cloud/commit/08c3f1c2324d79d6080fbf73f11b4fa715bec4cb))
|
||||
* **spec:** Add support for additional sidecar container arguments ([#520](https://github.com/cloudnative-pg/plugin-barman-cloud/issues/520)) ([ec352ac](https://github.com/cloudnative-pg/plugin-barman-cloud/commit/ec352ac0fdd31656321e564bcf6a026481ec06e4))
|
||||
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* Avoid panicking if serverRecoveryWindow has still not been set ([#525](https://github.com/cloudnative-pg/plugin-barman-cloud/issues/525)) ([dfd9861](https://github.com/cloudnative-pg/plugin-barman-cloud/commit/dfd9861a3f9296bffe084a81faa8755ddca95149)), closes [#523](https://github.com/cloudnative-pg/plugin-barman-cloud/issues/523)
|
||||
* **deps:** Lock file maintenance documentation dependencies ([#534](https://github.com/cloudnative-pg/plugin-barman-cloud/issues/534)) ([0ad066d](https://github.com/cloudnative-pg/plugin-barman-cloud/commit/0ad066d195b8556d9cf13ac0b585bfa6ffe01b75))
|
||||
* **deps:** Update all non-major go dependencies ([#521](https://github.com/cloudnative-pg/plugin-barman-cloud/issues/521)) ([df92fa6](https://github.com/cloudnative-pg/plugin-barman-cloud/commit/df92fa6f3e9bfd934da4be2aba4983570f751fad))
|
||||
* **deps:** Update kubernetes packages to v0.34.1 ([#530](https://github.com/cloudnative-pg/plugin-barman-cloud/issues/530)) ([eced5ea](https://github.com/cloudnative-pg/plugin-barman-cloud/commit/eced5ea2c6d44ec3fc09b632b42c204a5d469297))
|
||||
* **deps:** Update module github.com/cloudnative-pg/cnpg-i-machinery to v0.4.1 ([#551](https://github.com/cloudnative-pg/plugin-barman-cloud/issues/551)) ([65a0d11](https://github.com/cloudnative-pg/plugin-barman-cloud/commit/65a0d11ec8cf1fc6e3478d49ad88d9ba9c40adf6))
|
||||
* **deps:** Update module github.com/onsi/ginkgo/v2 to v2.25.1 ([#495](https://github.com/cloudnative-pg/plugin-barman-cloud/issues/495)) ([2dc29a5](https://github.com/cloudnative-pg/plugin-barman-cloud/commit/2dc29a5dbcc4e4a5b79cc2c796d2a451ffcd654a))
|
||||
* **deps:** Update module sigs.k8s.io/controller-runtime to v0.22.1 ([#531](https://github.com/cloudnative-pg/plugin-barman-cloud/issues/531)) ([82449d9](https://github.com/cloudnative-pg/plugin-barman-cloud/commit/82449d9351555e3b8ee128f040bffd9799279e72))
|
||||
* **logs:** Log the correct name when on ObjectStore not found error ([#540](https://github.com/cloudnative-pg/plugin-barman-cloud/issues/540)) ([a29aa1c](https://github.com/cloudnative-pg/plugin-barman-cloud/commit/a29aa1c91af0bc7cb4a7511c49dcc461900e9a13)), closes [#539](https://github.com/cloudnative-pg/plugin-barman-cloud/issues/539)
|
||||
* **object-cache:** Improve reliability of object cache management ([#508](https://github.com/cloudnative-pg/plugin-barman-cloud/issues/508)) ([8c3db95](https://github.com/cloudnative-pg/plugin-barman-cloud/commit/8c3db955efc2d23593faa0c6e410e7aa0e427ebf)), closes [#502](https://github.com/cloudnative-pg/plugin-barman-cloud/issues/502)
|
||||
* Typo in variable name ([#515](https://github.com/cloudnative-pg/plugin-barman-cloud/issues/515)) ([3c0d8c3](https://github.com/cloudnative-pg/plugin-barman-cloud/commit/3c0d8c3a3394d5b628d03c849be86999b2e7887f))
|
||||
|
||||
## [0.6.0](https://github.com/cloudnative-pg/plugin-barman-cloud/compare/v0.5.0...v0.6.0) (2025-08-21)
|
||||
|
||||
|
||||
|
||||
18
Taskfile.yml
18
Taskfile.yml
@ -19,9 +19,9 @@ tasks:
|
||||
desc: Run golangci-lint
|
||||
env:
|
||||
# renovate: datasource=git-refs depName=golangci-lint lookupName=https://github.com/sagikazarmark/daggerverse currentValue=main
|
||||
DAGGER_GOLANGCI_LINT_SHA: 88056b48085a170fbf7638e106efbecd26c6573d
|
||||
DAGGER_GOLANGCI_LINT_SHA: 6133ad18e131b891d4723b8e25d69f5de077b472
|
||||
# renovate: datasource=docker depName=golangci/golangci-lint versioning=semver
|
||||
GOLANGCI_LINT_VERSION: v2.4.0
|
||||
GOLANGCI_LINT_VERSION: v2.5.0
|
||||
cmds:
|
||||
- >
|
||||
GITHUB_REF= dagger -sc "github.com/sagikazarmark/daggerverse/golangci-lint@${DAGGER_GOLANGCI_LINT_SHA}
|
||||
@ -44,7 +44,7 @@ tasks:
|
||||
- wordlist-ordered
|
||||
env:
|
||||
# renovate: datasource=git-refs depName=spellcheck lookupName=https://github.com/cloudnative-pg/daggerverse currentValue=main
|
||||
DAGGER_SPELLCHECK_SHA: 838ccbbd35b0e5e9a7d4af600fa8fa1a4259b1d0
|
||||
DAGGER_SPELLCHECK_SHA: 3923866bb6d43e7cf64047b6e910dc90687add2f
|
||||
cmds:
|
||||
- >
|
||||
GITHUB_REF= dagger -s call -m github.com/cloudnative-pg/daggerverse/spellcheck@${DAGGER_SPELLCHECK_SHA}
|
||||
@ -58,7 +58,7 @@ tasks:
|
||||
desc: Check for conventional commits
|
||||
env:
|
||||
# renovate: datasource=git-refs depName=commitlint lookupName=https://github.com/cloudnative-pg/daggerverse currentValue=main
|
||||
DAGGER_COMMITLINT_SHA: 838ccbbd35b0e5e9a7d4af600fa8fa1a4259b1d0
|
||||
DAGGER_COMMITLINT_SHA: 3923866bb6d43e7cf64047b6e910dc90687add2f
|
||||
cmds:
|
||||
- >
|
||||
GITHUB_REF= dagger -s call -m github.com/cloudnative-pg/daggerverse/commitlint@${DAGGER_COMMITLINT_SHA}
|
||||
@ -72,7 +72,7 @@ tasks:
|
||||
- wordlist-ordered
|
||||
env:
|
||||
# renovate: datasource=git-refs depName=uncommitted lookupName=https://github.com/cloudnative-pg/daggerverse currentValue=main
|
||||
DAGGER_UNCOMMITTED_SHA: 838ccbbd35b0e5e9a7d4af600fa8fa1a4259b1d0
|
||||
DAGGER_UNCOMMITTED_SHA: 3923866bb6d43e7cf64047b6e910dc90687add2f
|
||||
cmds:
|
||||
- GITHUB_REF= dagger -s call -m github.com/cloudnative-pg/daggerverse/uncommitted@${DAGGER_UNCOMMITTED_SHA} check-uncommitted --source . stdout
|
||||
sources:
|
||||
@ -84,7 +84,7 @@ tasks:
|
||||
- controller-gen
|
||||
env:
|
||||
# renovate: datasource=git-refs depName=crd-gen-refs lookupName=https://github.com/cloudnative-pg/daggerverse currentValue=main
|
||||
DAGGER_CRDGENREF_SHA: 838ccbbd35b0e5e9a7d4af600fa8fa1a4259b1d0
|
||||
DAGGER_CRDGENREF_SHA: 3923866bb6d43e7cf64047b6e910dc90687add2f
|
||||
cmds:
|
||||
- >
|
||||
GITHUB_REF= dagger -s call -m github.com/cloudnative-pg/daggerverse/crd-ref-docs@${DAGGER_CRDGENREF_SHA} generate
|
||||
@ -410,7 +410,7 @@ tasks:
|
||||
run: once
|
||||
env:
|
||||
# renovate: datasource=git-refs depName=controller-gen lookupName=https://github.com/cloudnative-pg/daggerverse currentValue=main
|
||||
DAGGER_CONTROLLER_GEN_SHA: 838ccbbd35b0e5e9a7d4af600fa8fa1a4259b1d0
|
||||
DAGGER_CONTROLLER_GEN_SHA: 3923866bb6d43e7cf64047b6e910dc90687add2f
|
||||
cmds:
|
||||
- >
|
||||
GITHUB_REF= dagger -s call -m github.com/cloudnative-pg/daggerverse/controller-gen@${DAGGER_CONTROLLER_GEN_SHA}
|
||||
@ -482,7 +482,7 @@ tasks:
|
||||
IMAGE_VERSION: '{{regexReplaceAll "(\\d+)/merge" .GITHUB_REF_NAME "pr-${1}"}}'
|
||||
env:
|
||||
# renovate: datasource=git-refs depName=kustomize lookupName=https://github.com/sagikazarmark/daggerverse currentValue=main
|
||||
DAGGER_KUSTOMIZE_SHA: 88056b48085a170fbf7638e106efbecd26c6573d
|
||||
DAGGER_KUSTOMIZE_SHA: 6133ad18e131b891d4723b8e25d69f5de077b472
|
||||
cmds:
|
||||
- >
|
||||
dagger -s call -m https://github.com/sagikazarmark/daggerverse/kustomize@${DAGGER_KUSTOMIZE_SHA}
|
||||
@ -512,7 +512,7 @@ tasks:
|
||||
- GITHUB_TOKEN
|
||||
env:
|
||||
# renovate: datasource=git-refs depName=gh lookupName=https://github.com/sagikazarmark/daggerverse
|
||||
DAGGER_GH_SHA: 88056b48085a170fbf7638e106efbecd26c6573d
|
||||
DAGGER_GH_SHA: 6133ad18e131b891d4723b8e25d69f5de077b472
|
||||
preconditions:
|
||||
- sh: "[[ {{.GITHUB_REF}} =~ 'refs/tags/v.*' ]]"
|
||||
msg: not a tag, failing
|
||||
|
||||
@ -81,8 +81,15 @@ type InstanceSidecarConfiguration struct {
|
||||
// AdditionalContainerArgs is an optional list of command-line arguments
|
||||
// to be passed to the sidecar container when it starts.
|
||||
// The provided arguments are appended to the container’s default arguments.
|
||||
// +kubebuilder:validation:XValidation:rule="!self.exists(a, a.startsWith('--log-level'))",reason="FieldValueForbidden",message="do not set --log-level in additionalContainerArgs; use spec.instanceSidecarConfiguration.logLevel"
|
||||
// +optional
|
||||
AdditionalContainerArgs []string `json:"additionalContainerArgs,omitempty"`
|
||||
|
||||
// The log level for PostgreSQL instances. Valid values are: `error`, `warning`, `info` (default), `debug`, `trace`
|
||||
// +kubebuilder:default:=info
|
||||
// +kubebuilder:validation:Enum:=error;warning;info;debug;trace
|
||||
// +optional
|
||||
LogLevel string `json:"logLevel,omitempty"`
|
||||
}
|
||||
|
||||
// ObjectStoreSpec defines the desired state of ObjectStore.
|
||||
|
||||
@ -399,6 +399,11 @@ spec:
|
||||
items:
|
||||
type: string
|
||||
type: array
|
||||
x-kubernetes-validations:
|
||||
- message: do not set --log-level in additionalContainerArgs;
|
||||
use spec.instanceSidecarConfiguration.logLevel
|
||||
reason: FieldValueForbidden
|
||||
rule: '!self.exists(a, a.startsWith(''--log-level''))'
|
||||
env:
|
||||
description: The environment to be explicitly passed to the sidecar
|
||||
items:
|
||||
@ -629,6 +634,17 @@ spec:
|
||||
format: int32
|
||||
type: integer
|
||||
type: object
|
||||
logLevel:
|
||||
default: info
|
||||
description: 'The log level for PostgreSQL instances. Valid values
|
||||
are: `error`, `warning`, `info` (default), `debug`, `trace`'
|
||||
enum:
|
||||
- error
|
||||
- warning
|
||||
- info
|
||||
- debug
|
||||
- trace
|
||||
type: string
|
||||
resources:
|
||||
description: Resources define cpu/memory requests and limits for
|
||||
the sidecar that runs in the instance pods.
|
||||
|
||||
@ -2,7 +2,7 @@
|
||||
# This file is autogenerated by pip-compile with Python 3.13
|
||||
# by the following command:
|
||||
#
|
||||
# pip-compile --allow-unsafe --generate-hashes --output-file=sidecar-requirements.txt --strip-extras sidecar-requirements.in
|
||||
# pip-compile --allow-unsafe --cert=None --client-cert=None --generate-hashes --index-url=None --output-file=sidecar-requirements.txt --pip-args=None --strip-extras sidecar-requirements.in
|
||||
#
|
||||
azure-core==1.35.1 \
|
||||
--hash=sha256:12da0c9e08e48e198f9158b56ddbe33b421477e1dc98c2e1c8f9e254d92c468b \
|
||||
@ -22,13 +22,13 @@ barman==3.15.0 \
|
||||
--hash=sha256:96d10c950f8947c821451f3fd387e8c55698b280237d0a9b2ce28c3b96956cd2 \
|
||||
--hash=sha256:aeda1991637c5c4d4b440eaa08069e855e3c50ff0ea2fc6e08dd881c87eb8ec1
|
||||
# via -r sidecar-requirements.in
|
||||
boto3==1.40.33 \
|
||||
--hash=sha256:b9548f4cfb44dc9fb7f09741c7dce34350d4a9f904ff0f7f97d699d0586f6b9a \
|
||||
--hash=sha256:dc8a37b25f43d458d830a5988283f0a5ac38a47dd2c46cccc5bc40e47fda97c9
|
||||
boto3==1.40.35 \
|
||||
--hash=sha256:d718df3591c829bcca4c498abb7b09d64d1eecc4e5a2b6cef14b476501211b8a \
|
||||
--hash=sha256:f4c1b01dd61e7733b453bca38b004ce030e26ee36e7a3d4a9e45a730b67bc38d
|
||||
# via barman
|
||||
botocore==1.40.33 \
|
||||
--hash=sha256:307e0cb55f4b7307bfd2090fd1c9ca14e1febece5b928144ccc0f78adfd2d864 \
|
||||
--hash=sha256:b9a33758913410ca0d81f30dfd9f00c4ff22c72c38fdf679864011afc73d99fd
|
||||
botocore==1.40.35 \
|
||||
--hash=sha256:67e062752ff579c8cc25f30f9c3a84c72d692516a41a9ee1cf17735767ca78be \
|
||||
--hash=sha256:c545de2cbbce161f54ca589fbb677bae14cdbfac7d5f1a27f6a620cb057c26f4
|
||||
# via
|
||||
# boto3
|
||||
# s3transfer
|
||||
|
||||
2
go.mod
2
go.mod
@ -8,7 +8,7 @@ require (
|
||||
github.com/cloudnative-pg/barman-cloud v0.3.3
|
||||
github.com/cloudnative-pg/cloudnative-pg v1.27.0
|
||||
github.com/cloudnative-pg/cnpg-i v0.3.0
|
||||
github.com/cloudnative-pg/cnpg-i-machinery v0.4.0
|
||||
github.com/cloudnative-pg/cnpg-i-machinery v0.4.1
|
||||
github.com/cloudnative-pg/machinery v0.3.1
|
||||
github.com/onsi/ginkgo/v2 v2.25.3
|
||||
github.com/onsi/gomega v1.38.2
|
||||
|
||||
4
go.sum
4
go.sum
@ -24,8 +24,8 @@ github.com/cloudnative-pg/cloudnative-pg v1.27.0 h1:mp0zlYO4vKAJmQdArWORWKr1lmB4
|
||||
github.com/cloudnative-pg/cloudnative-pg v1.27.0/go.mod h1:aIVMy0BrfXg+eJuA/ZyRGyOQtPtshw/sCzQnQn3KFUo=
|
||||
github.com/cloudnative-pg/cnpg-i v0.3.0 h1:5ayNOG5x68lU70IVbHDZQrv5p+bErCJ0mqRmOpW2jjE=
|
||||
github.com/cloudnative-pg/cnpg-i v0.3.0/go.mod h1:VOIWWXcJ1RyioK+elR2DGOa4cBA6K+6UQgx05aZmH+g=
|
||||
github.com/cloudnative-pg/cnpg-i-machinery v0.4.0 h1:16wQt9qFFqvyxeg+9dPt8ic8dh3PRPq0jCGXVuZyjO4=
|
||||
github.com/cloudnative-pg/cnpg-i-machinery v0.4.0/go.mod h1:4MCJzbCOsB7ianxlm8rqD+gDpkgVTHoTuglle/i72WA=
|
||||
github.com/cloudnative-pg/cnpg-i-machinery v0.4.1 h1:M4ELhZO0e7UjiV3PZ3uGJOz3SgG/3ThWiqkbrFCcXNE=
|
||||
github.com/cloudnative-pg/cnpg-i-machinery v0.4.1/go.mod h1:TxwoMgQINOJkS1kepudqCBTYd8QYev6JoT8R52pYD4E=
|
||||
github.com/cloudnative-pg/machinery v0.3.1 h1:KtPA6EwELTUNisCMLiFYkK83GU9606rkGQhDJGPB8Yw=
|
||||
github.com/cloudnative-pg/machinery v0.3.1/go.mod h1:jebuqKxZAbrRKDEEpVCIDMKW+FbWtB9Kf/hb2kMUu9o=
|
||||
github.com/cpuguy83/go-md2man/v2 v2.0.6/go.mod h1:oOW0eioCTA6cOiMLiUPZOpcVxMig6NIQQ7OS05n1F4g=
|
||||
|
||||
@ -5,6 +5,7 @@ metadata:
|
||||
spec:
|
||||
retentionPolicy: "1m"
|
||||
instanceSidecarConfiguration:
|
||||
logLevel: "debug"
|
||||
retentionPolicyIntervalSeconds: 1800
|
||||
resources:
|
||||
requests:
|
||||
|
||||
@ -1,16 +1,25 @@
|
||||
package common
|
||||
|
||||
// walNotFoundError is raised when a WAL file has not been found in the object store
|
||||
type walNotFoundError struct{}
|
||||
import (
|
||||
"google.golang.org/grpc/codes"
|
||||
"google.golang.org/grpc/status"
|
||||
)
|
||||
|
||||
func newWALNotFoundError() *walNotFoundError { return &walNotFoundError{} }
|
||||
// ErrEndOfWALStreamReached is returned when end of WAL is detected in the cloud archive.
|
||||
var ErrEndOfWALStreamReached = status.Errorf(codes.OutOfRange, "end of WAL reached")
|
||||
|
||||
// ShouldPrintStackTrace tells whether the sidecar log stream should contain the stack trace
|
||||
func (e walNotFoundError) ShouldPrintStackTrace() bool {
|
||||
return false
|
||||
}
|
||||
|
||||
// Error implements the error interface
|
||||
func (e walNotFoundError) Error() string {
|
||||
return "WAL file not found"
|
||||
// ErrMissingPermissions is raised when the sidecar has no
|
||||
// permission to download the credentials needed to reach
|
||||
// the object storage.
|
||||
// This will be fixed by the reconciliation loop in the
|
||||
// operator plugin.
|
||||
var ErrMissingPermissions = status.Errorf(codes.FailedPrecondition,
|
||||
"no permission to download the backup credentials, retrying")
|
||||
|
||||
// newWALNotFoundError returns a error that states that a
|
||||
// certain WAL file has not been found. This error is
|
||||
// compatible with GRPC status codes, resulting in a 404
|
||||
// being used as a response code.
|
||||
func newWALNotFoundError(walName string) error {
|
||||
return status.Errorf(codes.NotFound, "wal %q not found", walName)
|
||||
}
|
||||
|
||||
@ -27,13 +27,6 @@ import (
|
||||
"github.com/cloudnative-pg/plugin-barman-cloud/internal/cnpgi/operator/config"
|
||||
)
|
||||
|
||||
// ErrMissingPermissions is raised when the sidecar has no
|
||||
// permission to download the credentials needed to reach
|
||||
// the object storage.
|
||||
// This will be fixed by the reconciliation loop in the
|
||||
// operator plugin.
|
||||
var ErrMissingPermissions = fmt.Errorf("no permission to download the backup credentials, retrying")
|
||||
|
||||
// SpoolManagementError is raised when a spool management
|
||||
// error has been detected
|
||||
type SpoolManagementError struct {
|
||||
@ -95,11 +88,14 @@ func (w WALServiceImplementation) Archive(
|
||||
ctx context.Context,
|
||||
request *wal.WALArchiveRequest,
|
||||
) (*wal.WALArchiveResult, error) {
|
||||
contextLogger := log.FromContext(ctx)
|
||||
contextLogger.Debug("starting wal archive")
|
||||
|
||||
baseWalName := path.Base(request.GetSourceFileName())
|
||||
|
||||
contextLogger := log.FromContext(ctx)
|
||||
contextLogger.Debug("wal archive start", "walName", baseWalName)
|
||||
defer func() {
|
||||
contextLogger.Debug("wal archive end", "walName", baseWalName)
|
||||
}()
|
||||
|
||||
// Step 1: parse the configuration and get the environment variables needed
|
||||
// for barman-cloud-wal-archive
|
||||
configuration, err := config.NewFromClusterJSON(request.ClusterDefinition)
|
||||
@ -122,6 +118,7 @@ func (w WALServiceImplementation) Archive(
|
||||
)
|
||||
if err != nil {
|
||||
if apierrors.IsForbidden(err) {
|
||||
contextLogger.Info(ErrMissingPermissions.Error())
|
||||
return nil, ErrMissingPermissions
|
||||
}
|
||||
return nil, err
|
||||
@ -350,7 +347,7 @@ func (w WALServiceImplementation) restoreFromBarmanObjectStore(
|
||||
// The failure has already been logged in walRestorer.RestoreList method
|
||||
if walStatus[0].Err != nil {
|
||||
if errors.Is(walStatus[0].Err, barmanRestorer.ErrWALNotFound) {
|
||||
return newWALNotFoundError()
|
||||
return newWALNotFoundError(walStatus[0].WalName)
|
||||
}
|
||||
|
||||
return walStatus[0].Err
|
||||
@ -457,9 +454,6 @@ func gatherWALFilesToRestore(walName string, parallel int) (walList []string, er
|
||||
return walList, err
|
||||
}
|
||||
|
||||
// ErrEndOfWALStreamReached is returned when end of WAL is detected in the cloud archive.
|
||||
var ErrEndOfWALStreamReached = errors.New("end of WAL reached")
|
||||
|
||||
// checkEndOfWALStreamFlag returns ErrEndOfWALStreamReached if the flag is set in the restorer.
|
||||
func checkEndOfWALStreamFlag(walRestorer *barmanRestorer.WALRestorer) error {
|
||||
contain, err := walRestorer.IsEndOfWALStream()
|
||||
|
||||
@ -24,7 +24,7 @@ const (
|
||||
// Data is the metadata of this plugin.
|
||||
var Data = identity.GetPluginMetadataResponse{
|
||||
Name: PluginName,
|
||||
Version: "0.6.0", // x-release-please-version
|
||||
Version: "0.7.0", // x-release-please-version
|
||||
DisplayName: "BarmanCloudInstance",
|
||||
ProjectUrl: "https://github.com/cloudnative-pg/plugin-barman-cloud",
|
||||
RepositoryUrl: "https://github.com/cloudnative-pg/plugin-barman-cloud",
|
||||
|
||||
@ -275,6 +275,19 @@ func (impl LifecycleImplementation) collectAdditionalInstanceArgs(
|
||||
ctx context.Context,
|
||||
pluginConfiguration *config.PluginConfiguration,
|
||||
) ([]string, error) {
|
||||
collectTypedAdditionalArgs := func(store *barmancloudv1.ObjectStore) []string {
|
||||
if store == nil {
|
||||
return nil
|
||||
}
|
||||
|
||||
var args []string
|
||||
if len(store.Spec.InstanceSidecarConfiguration.LogLevel) > 0 {
|
||||
args = append(args, fmt.Sprintf("--log-level=%s", store.Spec.InstanceSidecarConfiguration.LogLevel))
|
||||
}
|
||||
|
||||
return args
|
||||
}
|
||||
|
||||
// Prefer the cluster object store (backup/archive). If not set, fallback to the recovery object store.
|
||||
// If neither is configured, no additional args are provided.
|
||||
if len(pluginConfiguration.BarmanObjectName) > 0 {
|
||||
@ -283,7 +296,12 @@ func (impl LifecycleImplementation) collectAdditionalInstanceArgs(
|
||||
return nil, fmt.Errorf("while getting barman object store %s: %w",
|
||||
pluginConfiguration.GetBarmanObjectKey().String(), err)
|
||||
}
|
||||
return barmanObjectStore.Spec.InstanceSidecarConfiguration.AdditionalContainerArgs, nil
|
||||
args := barmanObjectStore.Spec.InstanceSidecarConfiguration.AdditionalContainerArgs
|
||||
args = append(
|
||||
args,
|
||||
collectTypedAdditionalArgs(&barmanObjectStore)...,
|
||||
)
|
||||
return args, nil
|
||||
}
|
||||
|
||||
if len(pluginConfiguration.RecoveryBarmanObjectName) > 0 {
|
||||
@ -292,7 +310,12 @@ func (impl LifecycleImplementation) collectAdditionalInstanceArgs(
|
||||
return nil, fmt.Errorf("while getting recovery barman object store %s: %w",
|
||||
pluginConfiguration.GetRecoveryBarmanObjectKey().String(), err)
|
||||
}
|
||||
return barmanObjectStore.Spec.InstanceSidecarConfiguration.AdditionalContainerArgs, nil
|
||||
args := barmanObjectStore.Spec.InstanceSidecarConfiguration.AdditionalContainerArgs
|
||||
args = append(
|
||||
args,
|
||||
collectTypedAdditionalArgs(&barmanObjectStore)...,
|
||||
)
|
||||
return args, nil
|
||||
}
|
||||
|
||||
return nil, nil
|
||||
|
||||
@ -427,6 +427,60 @@ var _ = Describe("LifecycleImplementation", func() {
|
||||
Expect(err.Error()).To(ContainSubstring(ns + "/" + pc.RecoveryBarmanObjectName))
|
||||
Expect(args).To(BeNil())
|
||||
})
|
||||
|
||||
It("includes --log-level from primary object store when set", func(ctx SpecContext) {
|
||||
ns := "test-ns"
|
||||
cluster := &cnpgv1.Cluster{ObjectMeta: metav1.ObjectMeta{Name: "c", Namespace: ns}}
|
||||
pc := &config.PluginConfiguration{
|
||||
Cluster: cluster,
|
||||
BarmanObjectName: "primary-store",
|
||||
}
|
||||
store := &barmancloudv1.ObjectStore{
|
||||
TypeMeta: metav1.TypeMeta{Kind: "ObjectStore", APIVersion: barmancloudv1.GroupVersion.String()},
|
||||
ObjectMeta: metav1.ObjectMeta{Name: pc.BarmanObjectName, Namespace: ns},
|
||||
Spec: barmancloudv1.ObjectStoreSpec{
|
||||
InstanceSidecarConfiguration: barmancloudv1.InstanceSidecarConfiguration{
|
||||
AdditionalContainerArgs: []string{"--alpha"},
|
||||
LogLevel: "debug",
|
||||
},
|
||||
},
|
||||
}
|
||||
s := runtime.NewScheme()
|
||||
_ = barmancloudv1.AddToScheme(s)
|
||||
cli := fake.NewClientBuilder().WithScheme(s).WithRuntimeObjects(store).Build()
|
||||
|
||||
impl := LifecycleImplementation{Client: cli}
|
||||
args, err := impl.collectAdditionalInstanceArgs(ctx, pc)
|
||||
Expect(err).NotTo(HaveOccurred())
|
||||
Expect(args).To(Equal([]string{"--alpha", "--log-level=debug"}))
|
||||
})
|
||||
|
||||
It("includes --log-level from recovery object store when primary not set", func(ctx SpecContext) {
|
||||
ns := "test-ns"
|
||||
cluster := &cnpgv1.Cluster{ObjectMeta: metav1.ObjectMeta{Name: "c", Namespace: ns}}
|
||||
pc := &config.PluginConfiguration{
|
||||
Cluster: cluster,
|
||||
BarmanObjectName: "",
|
||||
RecoveryBarmanObjectName: "reco-store",
|
||||
}
|
||||
store := &barmancloudv1.ObjectStore{
|
||||
TypeMeta: metav1.TypeMeta{Kind: "ObjectStore", APIVersion: barmancloudv1.GroupVersion.String()},
|
||||
ObjectMeta: metav1.ObjectMeta{Name: pc.RecoveryBarmanObjectName, Namespace: ns},
|
||||
Spec: barmancloudv1.ObjectStoreSpec{
|
||||
InstanceSidecarConfiguration: barmancloudv1.InstanceSidecarConfiguration{
|
||||
LogLevel: "info",
|
||||
},
|
||||
},
|
||||
}
|
||||
s := runtime.NewScheme()
|
||||
_ = barmancloudv1.AddToScheme(s)
|
||||
cli := fake.NewClientBuilder().WithScheme(s).WithRuntimeObjects(store).Build()
|
||||
|
||||
impl := LifecycleImplementation{Client: cli}
|
||||
args, err := impl.collectAdditionalInstanceArgs(ctx, pc)
|
||||
Expect(err).NotTo(HaveOccurred())
|
||||
Expect(args).To(Equal([]string{"--log-level=info"}))
|
||||
})
|
||||
})
|
||||
})
|
||||
|
||||
|
||||
@ -81,8 +81,8 @@ func (r ReconcilerImplementation) Pre(
|
||||
if apierrs.IsNotFound(err) {
|
||||
contextLogger.Info(
|
||||
"barman object configuration not found, requeuing",
|
||||
"name", pluginConfiguration.BarmanObjectName,
|
||||
"namespace", cluster.Namespace)
|
||||
"name", barmanObjectKey.Name,
|
||||
"namespace", barmanObjectKey.Namespace)
|
||||
return &reconciler.ReconcilerHooksResult{
|
||||
Behavior: reconciler.ReconcilerHooksResult_BEHAVIOR_REQUEUE,
|
||||
}, nil
|
||||
|
||||
@ -398,6 +398,11 @@ spec:
|
||||
items:
|
||||
type: string
|
||||
type: array
|
||||
x-kubernetes-validations:
|
||||
- message: do not set --log-level in additionalContainerArgs;
|
||||
use spec.instanceSidecarConfiguration.logLevel
|
||||
reason: FieldValueForbidden
|
||||
rule: '!self.exists(a, a.startsWith(''--log-level''))'
|
||||
env:
|
||||
description: The environment to be explicitly passed to the sidecar
|
||||
items:
|
||||
@ -628,6 +633,17 @@ spec:
|
||||
format: int32
|
||||
type: integer
|
||||
type: object
|
||||
logLevel:
|
||||
default: info
|
||||
description: 'The log level for PostgreSQL instances. Valid values
|
||||
are: `error`, `warning`, `info` (default), `debug`, `trace`'
|
||||
enum:
|
||||
- error
|
||||
- warning
|
||||
- info
|
||||
- debug
|
||||
- trace
|
||||
type: string
|
||||
resources:
|
||||
description: Resources define cpu/memory requests and limits for
|
||||
the sidecar that runs in the instance pods.
|
||||
|
||||
@ -21,11 +21,30 @@ for detailed instructions.
|
||||
|
||||
## Requirements
|
||||
|
||||
To use the Barman Cloud Plugin, you need:
|
||||
Before using the Barman Cloud Plugin, ensure that the following components are
|
||||
installed and properly configured:
|
||||
|
||||
- [CloudNativePG](https://cloudnative-pg.io) version **1.26** <!-- ADD WHEN 1.27 IS OUT "or later" -->
|
||||
- [cert-manager](https://cert-manager.io/) to enable TLS communication between
|
||||
the plugin and the operator
|
||||
- [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
|
||||
|
||||
|
||||
@ -30,6 +30,7 @@ _Appears in:_
|
||||
| `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
|
||||
|
||||
580
web/docs/troubleshooting.md
Normal file
580
web/docs/troubleshooting.md
Normal file
@ -0,0 +1,580 @@
|
||||
---
|
||||
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:
|
||||
barmanObjectStore: <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-15 10:30:00"
|
||||
|
||||
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
|
||||
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` and `s3UsePathStyle` match your storage type
|
||||
- Verify network policies allow egress to your storage provider
|
||||
|
||||
## Diagnostic Commands
|
||||
|
||||
### Using the `cnpg` plugin for `kubectl`
|
||||
|
||||
The `cnpg` plugin for `kubectl` provides extended debugging capabilities.
|
||||
Keep it updated:
|
||||
|
||||
```sh
|
||||
# Install or update the `cnpg` plugin
|
||||
kubectl krew install cnpg
|
||||
# Or using an alternative method: https://cloudnative-pg.io/documentation/current/kubectl-plugin/#install
|
||||
|
||||
# Check plugin status (requires CNPG 1.27.0+)
|
||||
kubectl cnpg status <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.
|
||||
|
||||
@ -81,8 +81,13 @@ This configuration enables both WAL archiving and data directory backups.
|
||||
|
||||
## Performing a Base Backup
|
||||
|
||||
Once WAL archiving is enabled, the cluster is ready for backups. To issue an
|
||||
on-demand backup, use the following configuration with the plugin method:
|
||||
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
|
||||
@ -97,8 +102,28 @@ spec:
|
||||
name: barman-cloud.cloudnative-pg.io
|
||||
```
|
||||
|
||||
:::note
|
||||
You can apply the same concept to the `ScheduledBackup` resource.
|
||||
### 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
|
||||
|
||||
43
web/versioned_docs/version-0.7.0/compression.md
Normal file
43
web/versioned_docs/version-0.7.0/compression.md
Normal file
@ -0,0 +1,43 @@
|
||||
---
|
||||
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` (WAL only)
|
||||
- `snappy`
|
||||
- `xz` (WAL only)
|
||||
- `zstd` (WAL only)
|
||||
|
||||
Compression settings for base backups and WAL archives are configured
|
||||
independently. For implementation details, refer to the corresponding API
|
||||
definitions:
|
||||
|
||||
- [`DataBackupConfiguration`](https://pkg.go.dev/github.com/cloudnative-pg/barman-cloud/pkg/api#DataBackupConfiguration)
|
||||
- [`WALBackupConfiguration`](https://pkg.go.dev/github.com/cloudnative-pg/barman-cloud/pkg/api#WalBackupConfiguration)
|
||||
|
||||
:::important
|
||||
Compression impacts both performance and storage efficiency. Choose the right
|
||||
algorithm based on your recovery time objectives (RTO), storage capacity, and
|
||||
network throughput.
|
||||
:::
|
||||
|
||||
## Compression Benchmark (on MinIO)
|
||||
|
||||
| Compression | Backup Time (ms) | Restore Time (ms) | Uncompressed Size (MB) | Compressed Size (MB) | Ratio |
|
||||
| ----------- | ---------------- | ----------------- | ---------------------- | -------------------- | ----- |
|
||||
| None | 10,927 | 7,553 | 395 | 395 | 1.0:1 |
|
||||
| bzip2 | 25,404 | 13,886 | 395 | 67 | 5.9:1 |
|
||||
| gzip | 116,281 | 3,077 | 395 | 91 | 4.3:1 |
|
||||
| snappy | 8,134 | 8,341 | 395 | 166 | 2.4:1 |
|
||||
177
web/versioned_docs/version-0.7.0/concepts.md
Normal file
177
web/versioned_docs/version-0.7.0/concepts.md
Normal file
@ -0,0 +1,177 @@
|
||||
---
|
||||
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-and-wal-archiving).
|
||||
|
||||
:::tip
|
||||
For details, refer to the
|
||||
[API reference for the `ObjectStore` resource](plugin-barman-cloud.v1.md#objectstorespec).
|
||||
:::
|
||||
|
||||
## Integration with a CloudNativePG Cluster
|
||||
|
||||
CloudNativePG can delegate continuous backup and recovery responsibilities to
|
||||
the **Barman Cloud Plugin** by configuring the `.spec.plugins` section of a
|
||||
`Cluster` resource. This setup requires a corresponding `ObjectStore` resource
|
||||
to be defined.
|
||||
|
||||
:::important
|
||||
While it is technically possible to reuse the same `ObjectStore` for multiple
|
||||
`Cluster` resources within the same namespace, it is strongly recommended to
|
||||
dedicate one object store per PostgreSQL cluster to ensure data isolation and
|
||||
operational clarity.
|
||||
:::
|
||||
|
||||
The following example demonstrates how to configure a CloudNativePG cluster
|
||||
named `cluster-example` to use a previously defined `ObjectStore` (also named
|
||||
`cluster-example`) in the same namespace. Setting `isWALArchiver: true` enables
|
||||
WAL archiving through the plugin:
|
||||
|
||||
```yaml
|
||||
apiVersion: postgresql.cnpg.io/v1
|
||||
kind: Cluster
|
||||
metadata:
|
||||
name: cluster-example
|
||||
spec:
|
||||
# Other cluster settings...
|
||||
plugins:
|
||||
- name: barman-cloud.cloudnative-pg.io
|
||||
isWALArchiver: true
|
||||
parameters:
|
||||
barmanObjectName: cluster-example
|
||||
```
|
||||
|
||||
## Backup of a Postgres Cluster
|
||||
|
||||
Once the object store is defined and the `Cluster` is configured to use the
|
||||
Barman Cloud Plugin, **WAL archiving is activated immediately** on the
|
||||
PostgreSQL primary.
|
||||
|
||||
Physical base backups are seamlessly managed by CloudNativePG using the
|
||||
`Backup` and `ScheduledBackup` resources, respectively for
|
||||
[on-demand](https://cloudnative-pg.io/documentation/current/backup/#on-demand-backups)
|
||||
and
|
||||
[scheduled](https://cloudnative-pg.io/documentation/current/backup/#scheduled-backups)
|
||||
backups.
|
||||
|
||||
To use the Barman Cloud Plugin, you must set the `method` to `plugin` and
|
||||
configure the `pluginConfiguration` section as shown:
|
||||
|
||||
```yaml
|
||||
[...]
|
||||
spec:
|
||||
method: plugin
|
||||
pluginConfiguration:
|
||||
name: barman-cloud.cloudnative-pg.io
|
||||
[...]
|
||||
```
|
||||
|
||||
With this configuration, CloudNativePG supports:
|
||||
|
||||
- Backups from both **primary** and **standby** instances
|
||||
- Backups from **designated primaries** in a distributed topology using
|
||||
[replica clusters](https://cloudnative-pg.io/documentation/current/replica_cluster/)
|
||||
|
||||
:::tip
|
||||
For details on how to back up from a standby, refer to the official documentation:
|
||||
[Backup from a standby](https://cloudnative-pg.io/documentation/current/backup/#backup-from-a-standby).
|
||||
:::
|
||||
|
||||
:::important
|
||||
Both backup and WAL archiving operations are executed by sidecar containers
|
||||
running in the same pod as the PostgreSQL `Cluster` primary instance—except
|
||||
when backups are taken from a standby, in which case the sidecar runs alongside
|
||||
the standby pod.
|
||||
The sidecar containers use a [dedicated container image](images.md) that
|
||||
includes only the supported version of Barman Cloud.
|
||||
:::
|
||||
|
||||
## Recovery of a Postgres Cluster
|
||||
|
||||
In PostgreSQL, *recovery* refers to the process of starting a database instance
|
||||
from an existing backup. The Barman Cloud Plugin integrates with CloudNativePG
|
||||
to support both **full recovery** and **Point-in-Time Recovery (PITR)** from an
|
||||
object store.
|
||||
|
||||
Recovery in this context is *not in-place*: it bootstraps a brand-new
|
||||
PostgreSQL cluster from a backup and replays the necessary WAL files to reach
|
||||
the desired recovery target.
|
||||
|
||||
To perform a recovery, define an *external cluster* that references the
|
||||
appropriate `ObjectStore`, and use it as the source in the `bootstrap` section
|
||||
of the target cluster:
|
||||
|
||||
```yaml
|
||||
[...]
|
||||
spec:
|
||||
[...]
|
||||
bootstrap:
|
||||
recovery:
|
||||
source: source
|
||||
externalClusters:
|
||||
- name: source
|
||||
plugin:
|
||||
name: barman-cloud.cloudnative-pg.io
|
||||
parameters:
|
||||
barmanObjectName: cluster-example
|
||||
serverName: cluster-example
|
||||
[...]
|
||||
```
|
||||
|
||||
The critical element here is the `externalClusters` section of the `Cluster`
|
||||
resource, where the `plugin` stanza instructs CloudNativePG to use the Barman
|
||||
Cloud Plugin to access the object store for recovery.
|
||||
|
||||
This same mechanism can be used for a variety of scenarios enabled by the
|
||||
CloudNativePG API, including:
|
||||
|
||||
* **Full cluster recovery** from the latest backup
|
||||
* **Point-in-Time Recovery (PITR)**
|
||||
* Bootstrapping **replica clusters** in a distributed topology
|
||||
|
||||
:::tip
|
||||
For complete instructions and advanced use cases, refer to the official
|
||||
[Recovery documentation](https://cloudnative-pg.io/documentation/current/recovery/).
|
||||
:::
|
||||
37
web/versioned_docs/version-0.7.0/images.md
Normal file
37
web/versioned_docs/version-0.7.0/images.md
Normal file
@ -0,0 +1,37 @@
|
||||
---
|
||||
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.
|
||||
109
web/versioned_docs/version-0.7.0/installation.mdx
Normal file
109
web/versioned_docs/version-0.7.0/installation.mdx
Normal file
@ -0,0 +1,109 @@
|
||||
---
|
||||
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
|
||||
```
|
||||
86
web/versioned_docs/version-0.7.0/intro.md
Normal file
86
web/versioned_docs/version-0.7.0/intro.md
Normal file
@ -0,0 +1,86 @@
|
||||
---
|
||||
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).
|
||||
:::
|
||||
259
web/versioned_docs/version-0.7.0/migration.md
Normal file
259
web/versioned_docs/version-0.7.0/migration.md
Normal file
@ -0,0 +1,259 @@
|
||||
---
|
||||
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
|
||||
```
|
||||
76
web/versioned_docs/version-0.7.0/misc.md
Normal file
76
web/versioned_docs/version-0.7.0/misc.md
Normal file
@ -0,0 +1,76 @@
|
||||
---
|
||||
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 and WAL Archiving
|
||||
|
||||
You can pass additional command-line arguments to `barman-cloud-backup` and
|
||||
`barman-cloud-wal-archive` using the `additionalCommandArgs` field in the
|
||||
`ObjectStore` configuration.
|
||||
|
||||
- `.spec.configuration.data.additionalCommandArgs`: for `barman-cloud-backup`
|
||||
- `.spec.configuration.wal.additionalCommandArgs`: for `barman-cloud-wal-archive`
|
||||
|
||||
Each field accepts a list of string arguments. If an argument is already
|
||||
configured elsewhere in the plugin, the duplicate will be ignored.
|
||||
|
||||
### Example: Extra Backup Options
|
||||
|
||||
```yaml
|
||||
kind: ObjectStore
|
||||
metadata:
|
||||
name: my-store
|
||||
spec:
|
||||
configuration:
|
||||
data:
|
||||
additionalCommandArgs:
|
||||
- "--min-chunk-size=5MB"
|
||||
- "--read-timeout=60"
|
||||
```
|
||||
|
||||
### Example: Extra WAL Archive Options
|
||||
|
||||
```yaml
|
||||
kind: ObjectStore
|
||||
metadata:
|
||||
name: my-store
|
||||
spec:
|
||||
configuration:
|
||||
wal:
|
||||
additionalCommandArgs:
|
||||
- "--max-concurrency=1"
|
||||
- "--read-timeout=60"
|
||||
```
|
||||
|
||||
For a complete list of supported options, refer to the
|
||||
[official Barman Cloud documentation](https://docs.pgbarman.org/release/latest/).
|
||||
454
web/versioned_docs/version-0.7.0/object_stores.md
Normal file
454
web/versioned_docs/version-0.7.0/object_stores.md
Normal file
@ -0,0 +1,454 @@
|
||||
---
|
||||
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.
|
||||
|
||||
---
|
||||
|
||||
## 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 or delete 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 + [Access Key](https://learn.microsoft.com/en-us/azure/storage/common/storage-account-keys-manage)
|
||||
- Storage Account Name + [SAS Token](https://learn.microsoft.com/en-us/azure/storage/blobs/sas-service-create)
|
||||
- [Azure AD Workload Identity](https://azure.github.io/azure-workload-identity/docs/introduction.html)
|
||||
|
||||
### Azure AD Workload Identity
|
||||
|
||||
This method avoids storing credentials in Kubernetes via the
|
||||
`.spec.configuration.inheritFromAzureAD` option:
|
||||
|
||||
```yaml
|
||||
apiVersion: barmancloud.cnpg.io/v1
|
||||
kind: ObjectStore
|
||||
metadata:
|
||||
name: azure-store
|
||||
spec:
|
||||
configuration:
|
||||
destinationPath: "<destination path here>"
|
||||
azureCredentials:
|
||||
inheritFromAzureAD: true
|
||||
[...]
|
||||
```
|
||||
|
||||
### Access Key, SAS Token, or Connection String
|
||||
|
||||
Store credentials in a Kubernetes secret:
|
||||
|
||||
```sh
|
||||
kubectl create secret generic azure-creds \
|
||||
--from-literal=AZURE_STORAGE_ACCOUNT=<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.
|
||||
:::
|
||||
|
||||
---
|
||||
19
web/versioned_docs/version-0.7.0/parameters.md
Normal file
19
web/versioned_docs/version-0.7.0/parameters.md
Normal file
@ -0,0 +1,19 @@
|
||||
---
|
||||
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.
|
||||
:::
|
||||
108
web/versioned_docs/version-0.7.0/plugin-barman-cloud.v1.md
Normal file
108
web/versioned_docs/version-0.7.0/plugin-barman-cloud.v1.md
Normal file
@ -0,0 +1,108 @@
|
||||
# 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 | | |
|
||||
|
||||
|
||||
38
web/versioned_docs/version-0.7.0/retention.md
Normal file
38
web/versioned_docs/version-0.7.0/retention.md
Normal file
@ -0,0 +1,38 @@
|
||||
---
|
||||
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.
|
||||
:::
|
||||
|
||||
580
web/versioned_docs/version-0.7.0/troubleshooting.md
Normal file
580
web/versioned_docs/version-0.7.0/troubleshooting.md
Normal file
@ -0,0 +1,580 @@
|
||||
---
|
||||
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:
|
||||
barmanObjectStore: <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-15 10:30:00"
|
||||
|
||||
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
|
||||
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` and `s3UsePathStyle` match your storage type
|
||||
- Verify network policies allow egress to your storage provider
|
||||
|
||||
## Diagnostic Commands
|
||||
|
||||
### Using the `cnpg` plugin for `kubectl`
|
||||
|
||||
The `cnpg` plugin for `kubectl` provides extended debugging capabilities.
|
||||
Keep it updated:
|
||||
|
||||
```sh
|
||||
# Install or update the `cnpg` plugin
|
||||
kubectl krew install cnpg
|
||||
# Or using an alternative method: https://cloudnative-pg.io/documentation/current/kubectl-plugin/#install
|
||||
|
||||
# Check plugin status (requires CNPG 1.27.0+)
|
||||
kubectl cnpg status <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.
|
||||
|
||||
283
web/versioned_docs/version-0.7.0/usage.md
Normal file
283
web/versioned_docs/version-0.7.0/usage.md
Normal file
@ -0,0 +1,283 @@
|
||||
---
|
||||
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/preview/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.
|
||||
:::
|
||||
8
web/versioned_sidebars/version-0.7.0-sidebars.json
Normal file
8
web/versioned_sidebars/version-0.7.0-sidebars.json
Normal file
@ -0,0 +1,8 @@
|
||||
{
|
||||
"docs": [
|
||||
{
|
||||
"type": "autogenerated",
|
||||
"dirName": "."
|
||||
}
|
||||
]
|
||||
}
|
||||
@ -1,4 +1,5 @@
|
||||
[
|
||||
"0.7.0",
|
||||
"0.6.0",
|
||||
"0.5.0",
|
||||
"0.4.1",
|
||||
|
||||
274
web/yarn.lock
274
web/yarn.lock
@ -1104,15 +1104,15 @@
|
||||
resolved "https://registry.yarnpkg.com/@csstools/media-query-list-parser/-/media-query-list-parser-4.0.3.tgz#7aec77bcb89c2da80ef207e73f474ef9e1b3cdf1"
|
||||
integrity sha512-HAYH7d3TLRHDOUQK4mZKf9k9Ph/m8Akstg66ywKR4SFAigjs3yBiUeZtFxywiTm5moZMAp/5W/ZuFnNXXYLuuQ==
|
||||
|
||||
"@csstools/postcss-alpha-function@^1.0.0":
|
||||
version "1.0.0"
|
||||
resolved "https://registry.yarnpkg.com/@csstools/postcss-alpha-function/-/postcss-alpha-function-1.0.0.tgz#8764fbbf25a5f1e106fb623ae632e01a220a6fc2"
|
||||
integrity sha512-r2L8KNg5Wriq5n8IUQcjzy2Rh37J5YjzP9iOyHZL5fxdWYHB08vqykHQa4wAzN/tXwDuCHnhQDGCtxfS76xn7g==
|
||||
"@csstools/postcss-alpha-function@^1.0.1":
|
||||
version "1.0.1"
|
||||
resolved "https://registry.yarnpkg.com/@csstools/postcss-alpha-function/-/postcss-alpha-function-1.0.1.tgz#7989605711de7831bc7cd75b94c9b5bac9c3728e"
|
||||
integrity sha512-isfLLwksH3yHkFXfCI2Gcaqg7wGGHZZwunoJzEZk0yKYIokgre6hYVFibKL3SYAoR1kBXova8LB+JoO5vZzi9w==
|
||||
dependencies:
|
||||
"@csstools/css-color-parser" "^3.1.0"
|
||||
"@csstools/css-parser-algorithms" "^3.0.5"
|
||||
"@csstools/css-tokenizer" "^3.0.4"
|
||||
"@csstools/postcss-progressive-custom-properties" "^4.2.0"
|
||||
"@csstools/postcss-progressive-custom-properties" "^4.2.1"
|
||||
"@csstools/utilities" "^2.0.0"
|
||||
|
||||
"@csstools/postcss-cascade-layers@^5.0.2":
|
||||
@ -1123,58 +1123,69 @@
|
||||
"@csstools/selector-specificity" "^5.0.0"
|
||||
postcss-selector-parser "^7.0.0"
|
||||
|
||||
"@csstools/postcss-color-function-display-p3-linear@^1.0.0":
|
||||
version "1.0.0"
|
||||
resolved "https://registry.yarnpkg.com/@csstools/postcss-color-function-display-p3-linear/-/postcss-color-function-display-p3-linear-1.0.0.tgz#27395b62a5d9a108eefcc0eb463247a15f4269a1"
|
||||
integrity sha512-7q+OuUqfowRrP84m/Jl0wv3pfCQyUTCW5MxDIux+/yty5IkUUHOTigCjrC0Fjy3OT0ncGLudHbfLWmP7E1arNA==
|
||||
dependencies:
|
||||
"@csstools/css-color-parser" "^3.1.0"
|
||||
"@csstools/css-parser-algorithms" "^3.0.5"
|
||||
"@csstools/css-tokenizer" "^3.0.4"
|
||||
"@csstools/postcss-progressive-custom-properties" "^4.2.0"
|
||||
"@csstools/utilities" "^2.0.0"
|
||||
|
||||
"@csstools/postcss-color-function@^4.0.11":
|
||||
version "4.0.11"
|
||||
resolved "https://registry.yarnpkg.com/@csstools/postcss-color-function/-/postcss-color-function-4.0.11.tgz#03c34a51dc00943a6674294fb1163e7af9e87ffd"
|
||||
integrity sha512-AtH22zLHTLm64HLdpv5EedT/zmYTm1MtdQbQhRZXxEB6iYtS6SrS1jLX3TcmUWMFzpumK/OVylCm3HcLms4slw==
|
||||
dependencies:
|
||||
"@csstools/css-color-parser" "^3.1.0"
|
||||
"@csstools/css-parser-algorithms" "^3.0.5"
|
||||
"@csstools/css-tokenizer" "^3.0.4"
|
||||
"@csstools/postcss-progressive-custom-properties" "^4.2.0"
|
||||
"@csstools/utilities" "^2.0.0"
|
||||
|
||||
"@csstools/postcss-color-mix-function@^3.0.11":
|
||||
version "3.0.11"
|
||||
resolved "https://registry.yarnpkg.com/@csstools/postcss-color-mix-function/-/postcss-color-mix-function-3.0.11.tgz#6db0a1c749fabaf2bf978b37044700d1c1b09fc2"
|
||||
integrity sha512-cQpXBelpTx0YhScZM5Ve0jDCA4RzwFc7oNafzZOGgCHt/GQVYiU8Vevz9QJcwy/W0Pyi/BneY+KMjz23lI9r+Q==
|
||||
dependencies:
|
||||
"@csstools/css-color-parser" "^3.1.0"
|
||||
"@csstools/css-parser-algorithms" "^3.0.5"
|
||||
"@csstools/css-tokenizer" "^3.0.4"
|
||||
"@csstools/postcss-progressive-custom-properties" "^4.2.0"
|
||||
"@csstools/utilities" "^2.0.0"
|
||||
|
||||
"@csstools/postcss-color-mix-variadic-function-arguments@^1.0.1":
|
||||
"@csstools/postcss-color-function-display-p3-linear@^1.0.1":
|
||||
version "1.0.1"
|
||||
resolved "https://registry.yarnpkg.com/@csstools/postcss-color-mix-variadic-function-arguments/-/postcss-color-mix-variadic-function-arguments-1.0.1.tgz#2dd9d66ded0d41cd7b2c13a1188f03e894c17d7e"
|
||||
integrity sha512-c7hyBtbF+jlHIcUGVdWY06bHICgguV9ypfcELU3eU3W/9fiz2dxM8PqxQk2ndXYTzLnwPvNNqu1yCmQ++N6Dcg==
|
||||
resolved "https://registry.yarnpkg.com/@csstools/postcss-color-function-display-p3-linear/-/postcss-color-function-display-p3-linear-1.0.1.tgz#3017ff5e1f65307d6083e58e93d76724fb1ebf9f"
|
||||
integrity sha512-E5qusdzhlmO1TztYzDIi8XPdPoYOjoTY6HBYBCYSj+Gn4gQRBlvjgPQXzfzuPQqt8EhkC/SzPKObg4Mbn8/xMg==
|
||||
dependencies:
|
||||
"@csstools/css-color-parser" "^3.1.0"
|
||||
"@csstools/css-parser-algorithms" "^3.0.5"
|
||||
"@csstools/css-tokenizer" "^3.0.4"
|
||||
"@csstools/postcss-progressive-custom-properties" "^4.2.0"
|
||||
"@csstools/postcss-progressive-custom-properties" "^4.2.1"
|
||||
"@csstools/utilities" "^2.0.0"
|
||||
|
||||
"@csstools/postcss-content-alt-text@^2.0.7":
|
||||
version "2.0.7"
|
||||
resolved "https://registry.yarnpkg.com/@csstools/postcss-content-alt-text/-/postcss-content-alt-text-2.0.7.tgz#ac0a263e8acb0be99cdcfc0b1792c62141825747"
|
||||
integrity sha512-cq/zWaEkpcg3RttJ5+GdNwk26NwxY5KgqgtNL777Fdd28AVGHxuBvqmK4Jq4oKhW1NX4M2LbgYAVVN0NZ+/XYQ==
|
||||
"@csstools/postcss-color-function@^4.0.12":
|
||||
version "4.0.12"
|
||||
resolved "https://registry.yarnpkg.com/@csstools/postcss-color-function/-/postcss-color-function-4.0.12.tgz#a7c85a98c77b522a194a1bbb00dd207f40c7a771"
|
||||
integrity sha512-yx3cljQKRaSBc2hfh8rMZFZzChaFgwmO2JfFgFr1vMcF3C/uyy5I4RFIBOIWGq1D+XbKCG789CGkG6zzkLpagA==
|
||||
dependencies:
|
||||
"@csstools/css-color-parser" "^3.1.0"
|
||||
"@csstools/css-parser-algorithms" "^3.0.5"
|
||||
"@csstools/css-tokenizer" "^3.0.4"
|
||||
"@csstools/postcss-progressive-custom-properties" "^4.2.1"
|
||||
"@csstools/utilities" "^2.0.0"
|
||||
|
||||
"@csstools/postcss-color-mix-function@^3.0.12":
|
||||
version "3.0.12"
|
||||
resolved "https://registry.yarnpkg.com/@csstools/postcss-color-mix-function/-/postcss-color-mix-function-3.0.12.tgz#2f1ee9f8208077af069545c9bd79bb9733382c2a"
|
||||
integrity sha512-4STERZfCP5Jcs13P1U5pTvI9SkgLgfMUMhdXW8IlJWkzOOOqhZIjcNhWtNJZes2nkBDsIKJ0CJtFtuaZ00moag==
|
||||
dependencies:
|
||||
"@csstools/css-color-parser" "^3.1.0"
|
||||
"@csstools/css-parser-algorithms" "^3.0.5"
|
||||
"@csstools/css-tokenizer" "^3.0.4"
|
||||
"@csstools/postcss-progressive-custom-properties" "^4.2.1"
|
||||
"@csstools/utilities" "^2.0.0"
|
||||
|
||||
"@csstools/postcss-color-mix-variadic-function-arguments@^1.0.2":
|
||||
version "1.0.2"
|
||||
resolved "https://registry.yarnpkg.com/@csstools/postcss-color-mix-variadic-function-arguments/-/postcss-color-mix-variadic-function-arguments-1.0.2.tgz#b4012b62a4eaa24d694172bb7137f9d2319cb8f2"
|
||||
integrity sha512-rM67Gp9lRAkTo+X31DUqMEq+iK+EFqsidfecmhrteErxJZb6tUoJBVQca1Vn1GpDql1s1rD1pKcuYzMsg7Z1KQ==
|
||||
dependencies:
|
||||
"@csstools/css-color-parser" "^3.1.0"
|
||||
"@csstools/css-parser-algorithms" "^3.0.5"
|
||||
"@csstools/css-tokenizer" "^3.0.4"
|
||||
"@csstools/postcss-progressive-custom-properties" "^4.2.1"
|
||||
"@csstools/utilities" "^2.0.0"
|
||||
|
||||
"@csstools/postcss-content-alt-text@^2.0.8":
|
||||
version "2.0.8"
|
||||
resolved "https://registry.yarnpkg.com/@csstools/postcss-content-alt-text/-/postcss-content-alt-text-2.0.8.tgz#1d52da1762893c32999ff76839e48d6ec7c7a4cb"
|
||||
integrity sha512-9SfEW9QCxEpTlNMnpSqFaHyzsiRpZ5J5+KqCu1u5/eEJAWsMhzT40qf0FIbeeglEvrGRMdDzAxMIz3wqoGSb+Q==
|
||||
dependencies:
|
||||
"@csstools/css-parser-algorithms" "^3.0.5"
|
||||
"@csstools/css-tokenizer" "^3.0.4"
|
||||
"@csstools/postcss-progressive-custom-properties" "^4.2.0"
|
||||
"@csstools/postcss-progressive-custom-properties" "^4.2.1"
|
||||
"@csstools/utilities" "^2.0.0"
|
||||
|
||||
"@csstools/postcss-contrast-color-function@^2.0.12":
|
||||
version "2.0.12"
|
||||
resolved "https://registry.yarnpkg.com/@csstools/postcss-contrast-color-function/-/postcss-contrast-color-function-2.0.12.tgz#ca46986d095c60f208d9e3f24704d199c9172637"
|
||||
integrity sha512-YbwWckjK3qwKjeYz/CijgcS7WDUCtKTd8ShLztm3/i5dhh4NaqzsbYnhm4bjrpFpnLZ31jVcbK8YL77z3GBPzA==
|
||||
dependencies:
|
||||
"@csstools/css-color-parser" "^3.1.0"
|
||||
"@csstools/css-parser-algorithms" "^3.0.5"
|
||||
"@csstools/css-tokenizer" "^3.0.4"
|
||||
"@csstools/postcss-progressive-custom-properties" "^4.2.1"
|
||||
"@csstools/utilities" "^2.0.0"
|
||||
|
||||
"@csstools/postcss-exponential-functions@^2.0.9":
|
||||
@ -1203,34 +1214,34 @@
|
||||
"@csstools/css-parser-algorithms" "^3.0.5"
|
||||
"@csstools/css-tokenizer" "^3.0.4"
|
||||
|
||||
"@csstools/postcss-gradients-interpolation-method@^5.0.11":
|
||||
version "5.0.11"
|
||||
resolved "https://registry.yarnpkg.com/@csstools/postcss-gradients-interpolation-method/-/postcss-gradients-interpolation-method-5.0.11.tgz#f1c5c431a44ed9655cb408aea8666ed2c5250490"
|
||||
integrity sha512-8M3mcNTL3cGIJXDnvrJ2oWEcKi3zyw7NeYheFKePUlBmLYm1gkw9Rr/BA7lFONrOPeQA3yeMPldrrws6lqHrug==
|
||||
"@csstools/postcss-gradients-interpolation-method@^5.0.12":
|
||||
version "5.0.12"
|
||||
resolved "https://registry.yarnpkg.com/@csstools/postcss-gradients-interpolation-method/-/postcss-gradients-interpolation-method-5.0.12.tgz#0955cce4d97203b861bf66742bbec611b2f3661c"
|
||||
integrity sha512-jugzjwkUY0wtNrZlFeyXzimUL3hN4xMvoPnIXxoZqxDvjZRiSh+itgHcVUWzJ2VwD/VAMEgCLvtaJHX+4Vj3Ow==
|
||||
dependencies:
|
||||
"@csstools/css-color-parser" "^3.1.0"
|
||||
"@csstools/css-parser-algorithms" "^3.0.5"
|
||||
"@csstools/css-tokenizer" "^3.0.4"
|
||||
"@csstools/postcss-progressive-custom-properties" "^4.2.0"
|
||||
"@csstools/postcss-progressive-custom-properties" "^4.2.1"
|
||||
"@csstools/utilities" "^2.0.0"
|
||||
|
||||
"@csstools/postcss-hwb-function@^4.0.11":
|
||||
version "4.0.11"
|
||||
resolved "https://registry.yarnpkg.com/@csstools/postcss-hwb-function/-/postcss-hwb-function-4.0.11.tgz#4bb173f1c8c2361bf46a842a948ee687471ae4ea"
|
||||
integrity sha512-9meZbsVWTZkWsSBazQips3cHUOT29a/UAwFz0AMEXukvpIGGDR9+GMl3nIckWO5sPImsadu4F5Zy+zjt8QgCdA==
|
||||
"@csstools/postcss-hwb-function@^4.0.12":
|
||||
version "4.0.12"
|
||||
resolved "https://registry.yarnpkg.com/@csstools/postcss-hwb-function/-/postcss-hwb-function-4.0.12.tgz#07f7ecb08c50e094673bd20eaf7757db0162beee"
|
||||
integrity sha512-mL/+88Z53KrE4JdePYFJAQWFrcADEqsLprExCM04GDNgHIztwFzj0Mbhd/yxMBngq0NIlz58VVxjt5abNs1VhA==
|
||||
dependencies:
|
||||
"@csstools/css-color-parser" "^3.1.0"
|
||||
"@csstools/css-parser-algorithms" "^3.0.5"
|
||||
"@csstools/css-tokenizer" "^3.0.4"
|
||||
"@csstools/postcss-progressive-custom-properties" "^4.2.0"
|
||||
"@csstools/postcss-progressive-custom-properties" "^4.2.1"
|
||||
"@csstools/utilities" "^2.0.0"
|
||||
|
||||
"@csstools/postcss-ic-unit@^4.0.3":
|
||||
version "4.0.3"
|
||||
resolved "https://registry.yarnpkg.com/@csstools/postcss-ic-unit/-/postcss-ic-unit-4.0.3.tgz#ba0375e9d346e6e5a42dc8c2cb1133b2262f9ffa"
|
||||
integrity sha512-RtYYm2qUIu9vAaHB0cC8rQGlOCQAUgEc2tMr7ewlGXYipBQKjoWmyVArqsk7SEr8N3tErq6P6UOJT3amaVof5Q==
|
||||
"@csstools/postcss-ic-unit@^4.0.4":
|
||||
version "4.0.4"
|
||||
resolved "https://registry.yarnpkg.com/@csstools/postcss-ic-unit/-/postcss-ic-unit-4.0.4.tgz#2ee2da0690db7edfbc469279711b9e69495659d2"
|
||||
integrity sha512-yQ4VmossuOAql65sCPppVO1yfb7hDscf4GseF0VCA/DTDaBc0Wtf8MTqVPfjGYlT5+2buokG0Gp7y0atYZpwjg==
|
||||
dependencies:
|
||||
"@csstools/postcss-progressive-custom-properties" "^4.2.0"
|
||||
"@csstools/postcss-progressive-custom-properties" "^4.2.1"
|
||||
"@csstools/utilities" "^2.0.0"
|
||||
postcss-value-parser "^4.2.0"
|
||||
|
||||
@ -1247,14 +1258,14 @@
|
||||
"@csstools/selector-specificity" "^5.0.0"
|
||||
postcss-selector-parser "^7.0.0"
|
||||
|
||||
"@csstools/postcss-light-dark-function@^2.0.10":
|
||||
version "2.0.10"
|
||||
resolved "https://registry.yarnpkg.com/@csstools/postcss-light-dark-function/-/postcss-light-dark-function-2.0.10.tgz#b606f13d1f81efd297763c6ad1ac515c3ca4165b"
|
||||
integrity sha512-g7Lwb294lSoNnyrwcqoooh9fTAp47rRNo+ILg7SLRSMU3K9ePIwRt566sNx+pehiCelv4E1ICaU1EwLQuyF2qw==
|
||||
"@csstools/postcss-light-dark-function@^2.0.11":
|
||||
version "2.0.11"
|
||||
resolved "https://registry.yarnpkg.com/@csstools/postcss-light-dark-function/-/postcss-light-dark-function-2.0.11.tgz#0df448aab9a33cb9a085264ff1f396fb80c4437d"
|
||||
integrity sha512-fNJcKXJdPM3Lyrbmgw2OBbaioU7yuKZtiXClf4sGdQttitijYlZMD5K7HrC/eF83VRWRrYq6OZ0Lx92leV2LFA==
|
||||
dependencies:
|
||||
"@csstools/css-parser-algorithms" "^3.0.5"
|
||||
"@csstools/css-tokenizer" "^3.0.4"
|
||||
"@csstools/postcss-progressive-custom-properties" "^4.2.0"
|
||||
"@csstools/postcss-progressive-custom-properties" "^4.2.1"
|
||||
"@csstools/utilities" "^2.0.0"
|
||||
|
||||
"@csstools/postcss-logical-float-and-clear@^3.0.0":
|
||||
@ -1321,21 +1332,21 @@
|
||||
dependencies:
|
||||
postcss-value-parser "^4.2.0"
|
||||
|
||||
"@csstools/postcss-oklab-function@^4.0.11":
|
||||
version "4.0.11"
|
||||
resolved "https://registry.yarnpkg.com/@csstools/postcss-oklab-function/-/postcss-oklab-function-4.0.11.tgz#d69242a9b027dda731bd79db7293bc938bb6df97"
|
||||
integrity sha512-9f03ZGxZ2VmSCrM4SDXlAYP+Xpu4VFzemfQUQFL9OYxAbpvDy0FjDipZ0i8So1pgs8VIbQI0bNjFWgfdpGw8ig==
|
||||
"@csstools/postcss-oklab-function@^4.0.12":
|
||||
version "4.0.12"
|
||||
resolved "https://registry.yarnpkg.com/@csstools/postcss-oklab-function/-/postcss-oklab-function-4.0.12.tgz#416640ef10227eea1375b47b72d141495950971d"
|
||||
integrity sha512-HhlSmnE1NKBhXsTnNGjxvhryKtO7tJd1w42DKOGFD6jSHtYOrsJTQDKPMwvOfrzUAk8t7GcpIfRyM7ssqHpFjg==
|
||||
dependencies:
|
||||
"@csstools/css-color-parser" "^3.1.0"
|
||||
"@csstools/css-parser-algorithms" "^3.0.5"
|
||||
"@csstools/css-tokenizer" "^3.0.4"
|
||||
"@csstools/postcss-progressive-custom-properties" "^4.2.0"
|
||||
"@csstools/postcss-progressive-custom-properties" "^4.2.1"
|
||||
"@csstools/utilities" "^2.0.0"
|
||||
|
||||
"@csstools/postcss-progressive-custom-properties@^4.2.0":
|
||||
version "4.2.0"
|
||||
resolved "https://registry.yarnpkg.com/@csstools/postcss-progressive-custom-properties/-/postcss-progressive-custom-properties-4.2.0.tgz#7f15349c2cd108478d28e1503c660d4037925030"
|
||||
integrity sha512-fWCXRasX17N1NCPTCuwC3FJDV+Wc031f16cFuuMEfIsYJ1q5ABCa59W0C6VeMGqjNv6ldf37vvwXXAeaZjD9PA==
|
||||
"@csstools/postcss-progressive-custom-properties@^4.2.1":
|
||||
version "4.2.1"
|
||||
resolved "https://registry.yarnpkg.com/@csstools/postcss-progressive-custom-properties/-/postcss-progressive-custom-properties-4.2.1.tgz#c39780b9ff0d554efb842b6bd75276aa6f1705db"
|
||||
integrity sha512-uPiiXf7IEKtUQXsxu6uWtOlRMXd2QWWy5fhxHDnPdXKCQckPP3E34ZgDoZ62r2iT+UOgWsSbM4NvHE5m3mAEdw==
|
||||
dependencies:
|
||||
postcss-value-parser "^4.2.0"
|
||||
|
||||
@ -1348,15 +1359,15 @@
|
||||
"@csstools/css-parser-algorithms" "^3.0.5"
|
||||
"@csstools/css-tokenizer" "^3.0.4"
|
||||
|
||||
"@csstools/postcss-relative-color-syntax@^3.0.11":
|
||||
version "3.0.11"
|
||||
resolved "https://registry.yarnpkg.com/@csstools/postcss-relative-color-syntax/-/postcss-relative-color-syntax-3.0.11.tgz#d81d59ff123fa5f3e4a0493b1e2b0585353bb541"
|
||||
integrity sha512-oQ5fZvkcBrWR+k6arHXk0F8FlkmD4IxM+rcGDLWrF2f31tWyEM3lSraeWAV0f7BGH6LIrqmyU3+Qo/1acfoJng==
|
||||
"@csstools/postcss-relative-color-syntax@^3.0.12":
|
||||
version "3.0.12"
|
||||
resolved "https://registry.yarnpkg.com/@csstools/postcss-relative-color-syntax/-/postcss-relative-color-syntax-3.0.12.tgz#ced792450102441f7c160e1d106f33e4b44181f8"
|
||||
integrity sha512-0RLIeONxu/mtxRtf3o41Lq2ghLimw0w9ByLWnnEVuy89exmEEq8bynveBxNW3nyHqLAFEeNtVEmC1QK9MZ8Huw==
|
||||
dependencies:
|
||||
"@csstools/css-color-parser" "^3.1.0"
|
||||
"@csstools/css-parser-algorithms" "^3.0.5"
|
||||
"@csstools/css-tokenizer" "^3.0.4"
|
||||
"@csstools/postcss-progressive-custom-properties" "^4.2.0"
|
||||
"@csstools/postcss-progressive-custom-properties" "^4.2.1"
|
||||
"@csstools/utilities" "^2.0.0"
|
||||
|
||||
"@csstools/postcss-scope-pseudo-class@^4.0.1":
|
||||
@ -3115,9 +3126,9 @@ balanced-match@^1.0.0:
|
||||
integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==
|
||||
|
||||
baseline-browser-mapping@^2.8.3:
|
||||
version "2.8.5"
|
||||
resolved "https://registry.yarnpkg.com/baseline-browser-mapping/-/baseline-browser-mapping-2.8.5.tgz#3147fe6b01a0c49ce1952daebcfc2057fc43fedb"
|
||||
integrity sha512-TiU4qUT9jdCuh4aVOG7H1QozyeI2sZRqoRPdqBIaslfNt4WUSanRBueAwl2x5jt4rXBMim3lIN2x6yT8PDi24Q==
|
||||
version "2.8.6"
|
||||
resolved "https://registry.yarnpkg.com/baseline-browser-mapping/-/baseline-browser-mapping-2.8.6.tgz#c37dea4291ed8d01682f85661dbe87967028642e"
|
||||
integrity sha512-wrH5NNqren/QMtKUEEJf7z86YjfqW/2uw3IL3/xpqZUC95SSVIFXYQeeGjL6FT/X68IROu6RMehZQS5foy2BXw==
|
||||
|
||||
batch@0.6.1:
|
||||
version "0.6.1"
|
||||
@ -3208,7 +3219,7 @@ braces@^3.0.3, braces@~3.0.2:
|
||||
dependencies:
|
||||
fill-range "^7.1.1"
|
||||
|
||||
browserslist@^4.0.0, browserslist@^4.23.0, browserslist@^4.24.0, browserslist@^4.24.4, browserslist@^4.25.1, browserslist@^4.25.3:
|
||||
browserslist@^4.0.0, browserslist@^4.23.0, browserslist@^4.24.0, browserslist@^4.24.4, browserslist@^4.25.3, browserslist@^4.26.0:
|
||||
version "4.26.2"
|
||||
resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.26.2.tgz#7db3b3577ec97f1140a52db4936654911078cef3"
|
||||
integrity sha512-ECFzp6uFOSB+dcZ5BK/IBaGWssbSYBHvuMeMt3MMFyhI0Z8SqGgEkBLARgpRH3hutIgPVsALcMwbDrJqPxQ65A==
|
||||
@ -3697,9 +3708,9 @@ css-blank-pseudo@^7.0.1:
|
||||
postcss-selector-parser "^7.0.0"
|
||||
|
||||
css-declaration-sorter@^7.2.0:
|
||||
version "7.2.0"
|
||||
resolved "https://registry.yarnpkg.com/css-declaration-sorter/-/css-declaration-sorter-7.2.0.tgz#6dec1c9523bc4a643e088aab8f09e67a54961024"
|
||||
integrity sha512-h70rUM+3PNFuaBDTLe8wF/cdWu+dOZmb7pJt8Z2sedYbAcQVQV/tEchueg3GWxwqS0cxtbxmaHEdkNACqcvsow==
|
||||
version "7.3.0"
|
||||
resolved "https://registry.yarnpkg.com/css-declaration-sorter/-/css-declaration-sorter-7.3.0.tgz#edc45c36bcdfea0788b1d4452829f142ef1c4a4a"
|
||||
integrity sha512-LQF6N/3vkAMYF4xoHLJfG718HRJh34Z8BnNhd6bosOMIVjMlhuZK5++oZa3uYAgrI5+7x2o27gUqTR2U/KjUOQ==
|
||||
|
||||
css-has-pseudo@^7.0.3:
|
||||
version "7.0.3"
|
||||
@ -3784,10 +3795,10 @@ css-what@^6.0.1, css-what@^6.1.0:
|
||||
resolved "https://registry.yarnpkg.com/css-what/-/css-what-6.2.2.tgz#cdcc8f9b6977719fdfbd1de7aec24abf756b9dea"
|
||||
integrity sha512-u/O3vwbptzhMs3L1fQE82ZSLHQQfto5gyZzwteVIEyeaY5Fc7R4dapF/BvRoSYFeqfBk4m0V1Vafq5Pjv25wvA==
|
||||
|
||||
cssdb@^8.4.0:
|
||||
version "8.4.0"
|
||||
resolved "https://registry.yarnpkg.com/cssdb/-/cssdb-8.4.0.tgz#232a1aa7751983ed2b40331634902d4c93f0456c"
|
||||
integrity sha512-lyATYGyvXwQ8h55WeQeEHXhI+47rl52pXSYkFK/ZrCbAJSgVIaPFjYc3RM8TpRHKk7W3wsAZImmLps+P5VyN9g==
|
||||
cssdb@^8.4.2:
|
||||
version "8.4.2"
|
||||
resolved "https://registry.yarnpkg.com/cssdb/-/cssdb-8.4.2.tgz#1a367ab1904c97af0bb2c7ae179764deae7b078b"
|
||||
integrity sha512-PzjkRkRUS+IHDJohtxkIczlxPPZqRo0nXplsYXOMBRPjcVRjj1W4DfvRgshUYTVuUigU7ptVYkFJQ7abUB0nyg==
|
||||
|
||||
cssesc@^3.0.0:
|
||||
version "3.0.0"
|
||||
@ -4102,9 +4113,9 @@ ee-first@1.1.1:
|
||||
integrity sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==
|
||||
|
||||
electron-to-chromium@^1.5.218:
|
||||
version "1.5.221"
|
||||
resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.5.221.tgz#bd98014b2a247701c4ebd713080448d539545d79"
|
||||
integrity sha512-/1hFJ39wkW01ogqSyYoA4goOXOtMRy6B+yvA1u42nnsEGtHzIzmk93aPISumVQeblj47JUHLC9coCjUxb1EvtQ==
|
||||
version "1.5.222"
|
||||
resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.5.222.tgz#965c93783ad989116b74593ae3068b9466fdb237"
|
||||
integrity sha512-gA7psSwSwQRE60CEoLz6JBCQPIxNeuzB2nL8vE03GK/OHxlvykbLyeiumQy1iH5C2f3YbRAZpGCMT12a/9ih9w==
|
||||
|
||||
emoji-regex@^8.0.0:
|
||||
version "8.0.0"
|
||||
@ -6839,15 +6850,15 @@ postcss-clamp@^4.1.0:
|
||||
dependencies:
|
||||
postcss-value-parser "^4.2.0"
|
||||
|
||||
postcss-color-functional-notation@^7.0.11:
|
||||
version "7.0.11"
|
||||
resolved "https://registry.yarnpkg.com/postcss-color-functional-notation/-/postcss-color-functional-notation-7.0.11.tgz#ad6b3d2e71fedd94a932f96260b596c33c53c6a5"
|
||||
integrity sha512-zfqoUSaHMko/k2PA9xnaydVTHqYv5vphq5Q2AHcG/dCdv/OkHYWcVWfVTBKZ526uzT8L7NghuvSw3C9PxlKnLg==
|
||||
postcss-color-functional-notation@^7.0.12:
|
||||
version "7.0.12"
|
||||
resolved "https://registry.yarnpkg.com/postcss-color-functional-notation/-/postcss-color-functional-notation-7.0.12.tgz#9a3df2296889e629fde18b873bb1f50a4ecf4b83"
|
||||
integrity sha512-TLCW9fN5kvO/u38/uesdpbx3e8AkTYhMvDZYa9JpmImWuTE99bDQ7GU7hdOADIZsiI9/zuxfAJxny/khknp1Zw==
|
||||
dependencies:
|
||||
"@csstools/css-color-parser" "^3.1.0"
|
||||
"@csstools/css-parser-algorithms" "^3.0.5"
|
||||
"@csstools/css-tokenizer" "^3.0.4"
|
||||
"@csstools/postcss-progressive-custom-properties" "^4.2.0"
|
||||
"@csstools/postcss-progressive-custom-properties" "^4.2.1"
|
||||
"@csstools/utilities" "^2.0.0"
|
||||
|
||||
postcss-color-hex-alpha@^10.0.0:
|
||||
@ -6949,12 +6960,12 @@ postcss-discard-unused@^6.0.5:
|
||||
dependencies:
|
||||
postcss-selector-parser "^6.0.16"
|
||||
|
||||
postcss-double-position-gradients@^6.0.3:
|
||||
version "6.0.3"
|
||||
resolved "https://registry.yarnpkg.com/postcss-double-position-gradients/-/postcss-double-position-gradients-6.0.3.tgz#d8c4b126af89855a3aa6687e5b1a0d5460d4a5b7"
|
||||
integrity sha512-Dl0Z9sdbMwrPslgOaGBZRGo3TASmmgTcqcUODr82MTYyJk6devXZM6MlQjpQKMJqlLJ6oL1w78U7IXFdPA5+ug==
|
||||
postcss-double-position-gradients@^6.0.4:
|
||||
version "6.0.4"
|
||||
resolved "https://registry.yarnpkg.com/postcss-double-position-gradients/-/postcss-double-position-gradients-6.0.4.tgz#b482d08b5ced092b393eb297d07976ab482d4cad"
|
||||
integrity sha512-m6IKmxo7FxSP5nF2l63QbCC3r+bWpFUWmZXZf096WxG0m7Vl1Q1+ruFOhpdDRmKrRS+S3Jtk+TVk/7z0+BVK6g==
|
||||
dependencies:
|
||||
"@csstools/postcss-progressive-custom-properties" "^4.2.0"
|
||||
"@csstools/postcss-progressive-custom-properties" "^4.2.1"
|
||||
"@csstools/utilities" "^2.0.0"
|
||||
postcss-value-parser "^4.2.0"
|
||||
|
||||
@ -6990,15 +7001,15 @@ postcss-image-set-function@^7.0.0:
|
||||
"@csstools/utilities" "^2.0.0"
|
||||
postcss-value-parser "^4.2.0"
|
||||
|
||||
postcss-lab-function@^7.0.11:
|
||||
version "7.0.11"
|
||||
resolved "https://registry.yarnpkg.com/postcss-lab-function/-/postcss-lab-function-7.0.11.tgz#455934181eea130f8e649c1f54692e1768046f6a"
|
||||
integrity sha512-BEA4jId8uQe1gyjZZ6Bunb6ZsH2izks+v25AxQJDBtigXCjTLmCPWECwQpLTtcxH589MVxhs/9TAmRC6lUEmXQ==
|
||||
postcss-lab-function@^7.0.12:
|
||||
version "7.0.12"
|
||||
resolved "https://registry.yarnpkg.com/postcss-lab-function/-/postcss-lab-function-7.0.12.tgz#eb555ac542607730eb0a87555074e4a5c6eef6e4"
|
||||
integrity sha512-tUcyRk1ZTPec3OuKFsqtRzW2Go5lehW29XA21lZ65XmzQkz43VY2tyWEC202F7W3mILOjw0voOiuxRGTsN+J9w==
|
||||
dependencies:
|
||||
"@csstools/css-color-parser" "^3.1.0"
|
||||
"@csstools/css-parser-algorithms" "^3.0.5"
|
||||
"@csstools/css-tokenizer" "^3.0.4"
|
||||
"@csstools/postcss-progressive-custom-properties" "^4.2.0"
|
||||
"@csstools/postcss-progressive-custom-properties" "^4.2.1"
|
||||
"@csstools/utilities" "^2.0.0"
|
||||
|
||||
postcss-loader@^7.3.4:
|
||||
@ -7207,26 +7218,27 @@ postcss-place@^10.0.0:
|
||||
postcss-value-parser "^4.2.0"
|
||||
|
||||
postcss-preset-env@^10.2.1:
|
||||
version "10.3.1"
|
||||
resolved "https://registry.yarnpkg.com/postcss-preset-env/-/postcss-preset-env-10.3.1.tgz#f3799f0f7a7ea384b3c16e073055c231d11bb3bf"
|
||||
integrity sha512-8ZOOWVwQ0iMpfEYkYo+U6W7fE2dJ/tP6dtEFwPJ66eB5JjnFupfYh+y6zo+vWDO72nGhKOVdxwhTjfzcSNRg4Q==
|
||||
version "10.4.0"
|
||||
resolved "https://registry.yarnpkg.com/postcss-preset-env/-/postcss-preset-env-10.4.0.tgz#fa6167a307f337b2bcdd1d125604ff97cdeb5142"
|
||||
integrity sha512-2kqpOthQ6JhxqQq1FSAAZGe9COQv75Aw8WbsOvQVNJ2nSevc9Yx/IKZGuZ7XJ+iOTtVon7LfO7ELRzg8AZ+sdw==
|
||||
dependencies:
|
||||
"@csstools/postcss-alpha-function" "^1.0.0"
|
||||
"@csstools/postcss-alpha-function" "^1.0.1"
|
||||
"@csstools/postcss-cascade-layers" "^5.0.2"
|
||||
"@csstools/postcss-color-function" "^4.0.11"
|
||||
"@csstools/postcss-color-function-display-p3-linear" "^1.0.0"
|
||||
"@csstools/postcss-color-mix-function" "^3.0.11"
|
||||
"@csstools/postcss-color-mix-variadic-function-arguments" "^1.0.1"
|
||||
"@csstools/postcss-content-alt-text" "^2.0.7"
|
||||
"@csstools/postcss-color-function" "^4.0.12"
|
||||
"@csstools/postcss-color-function-display-p3-linear" "^1.0.1"
|
||||
"@csstools/postcss-color-mix-function" "^3.0.12"
|
||||
"@csstools/postcss-color-mix-variadic-function-arguments" "^1.0.2"
|
||||
"@csstools/postcss-content-alt-text" "^2.0.8"
|
||||
"@csstools/postcss-contrast-color-function" "^2.0.12"
|
||||
"@csstools/postcss-exponential-functions" "^2.0.9"
|
||||
"@csstools/postcss-font-format-keywords" "^4.0.0"
|
||||
"@csstools/postcss-gamut-mapping" "^2.0.11"
|
||||
"@csstools/postcss-gradients-interpolation-method" "^5.0.11"
|
||||
"@csstools/postcss-hwb-function" "^4.0.11"
|
||||
"@csstools/postcss-ic-unit" "^4.0.3"
|
||||
"@csstools/postcss-gradients-interpolation-method" "^5.0.12"
|
||||
"@csstools/postcss-hwb-function" "^4.0.12"
|
||||
"@csstools/postcss-ic-unit" "^4.0.4"
|
||||
"@csstools/postcss-initial" "^2.0.1"
|
||||
"@csstools/postcss-is-pseudo-class" "^5.0.3"
|
||||
"@csstools/postcss-light-dark-function" "^2.0.10"
|
||||
"@csstools/postcss-light-dark-function" "^2.0.11"
|
||||
"@csstools/postcss-logical-float-and-clear" "^3.0.0"
|
||||
"@csstools/postcss-logical-overflow" "^2.0.0"
|
||||
"@csstools/postcss-logical-overscroll-behavior" "^2.0.0"
|
||||
@ -7236,10 +7248,10 @@ postcss-preset-env@^10.2.1:
|
||||
"@csstools/postcss-media-queries-aspect-ratio-number-values" "^3.0.5"
|
||||
"@csstools/postcss-nested-calc" "^4.0.0"
|
||||
"@csstools/postcss-normalize-display-values" "^4.0.0"
|
||||
"@csstools/postcss-oklab-function" "^4.0.11"
|
||||
"@csstools/postcss-progressive-custom-properties" "^4.2.0"
|
||||
"@csstools/postcss-oklab-function" "^4.0.12"
|
||||
"@csstools/postcss-progressive-custom-properties" "^4.2.1"
|
||||
"@csstools/postcss-random-function" "^2.0.1"
|
||||
"@csstools/postcss-relative-color-syntax" "^3.0.11"
|
||||
"@csstools/postcss-relative-color-syntax" "^3.0.12"
|
||||
"@csstools/postcss-scope-pseudo-class" "^4.0.1"
|
||||
"@csstools/postcss-sign-functions" "^1.1.4"
|
||||
"@csstools/postcss-stepped-value-functions" "^4.0.9"
|
||||
@ -7247,27 +7259,27 @@ postcss-preset-env@^10.2.1:
|
||||
"@csstools/postcss-trigonometric-functions" "^4.0.9"
|
||||
"@csstools/postcss-unset-value" "^4.0.0"
|
||||
autoprefixer "^10.4.21"
|
||||
browserslist "^4.25.1"
|
||||
browserslist "^4.26.0"
|
||||
css-blank-pseudo "^7.0.1"
|
||||
css-has-pseudo "^7.0.3"
|
||||
css-prefers-color-scheme "^10.0.0"
|
||||
cssdb "^8.4.0"
|
||||
cssdb "^8.4.2"
|
||||
postcss-attribute-case-insensitive "^7.0.1"
|
||||
postcss-clamp "^4.1.0"
|
||||
postcss-color-functional-notation "^7.0.11"
|
||||
postcss-color-functional-notation "^7.0.12"
|
||||
postcss-color-hex-alpha "^10.0.0"
|
||||
postcss-color-rebeccapurple "^10.0.0"
|
||||
postcss-custom-media "^11.0.6"
|
||||
postcss-custom-properties "^14.0.6"
|
||||
postcss-custom-selectors "^8.0.5"
|
||||
postcss-dir-pseudo-class "^9.0.1"
|
||||
postcss-double-position-gradients "^6.0.3"
|
||||
postcss-double-position-gradients "^6.0.4"
|
||||
postcss-focus-visible "^10.0.1"
|
||||
postcss-focus-within "^9.0.1"
|
||||
postcss-font-variant "^5.0.0"
|
||||
postcss-gap-properties "^6.0.0"
|
||||
postcss-image-set-function "^7.0.0"
|
||||
postcss-lab-function "^7.0.11"
|
||||
postcss-lab-function "^7.0.12"
|
||||
postcss-logical "^8.1.0"
|
||||
postcss-nesting "^13.0.2"
|
||||
postcss-opacity-percentage "^3.0.0"
|
||||
|
||||
Loading…
Reference in New Issue
Block a user