docs: publish docs with docusaurus (#268)
Rework the documentation to be a static website instead of just the GitHub README.md. Use docusaurus to create the website, and the CI to publish to GitHub pages on commits to main. Block `release-please` releases unless the documentation for that version has been generated. Closes #244 Signed-off-by: Francesco Canovai <francesco.canovai@enterprisedb.com> Signed-off-by: Gabriele Bartolini <gabriele.bartolini@enterprisedb.com> Co-authored-by: Leonardo Cecchi <leonardo.cecchi@enterprisedb.com> Co-authored-by: Gabriele Bartolini <gabriele.bartolini@enterprisedb.com>
64
.github/workflows/publish-docs.yml
vendored
Normal file
@ -0,0 +1,64 @@
|
|||||||
|
# This workflow builds and deploys the Docusaurus documentation to GitHub Pages
|
||||||
|
# when changes are pushed to the main branch.
|
||||||
|
name: Deploy Docusaurus to GitHub Pages
|
||||||
|
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
branches:
|
||||||
|
- main
|
||||||
|
paths:
|
||||||
|
- 'web/docs/**'
|
||||||
|
|
||||||
|
# Prevent parallel deployments when multiple commits are pushed to main
|
||||||
|
# in a short time.
|
||||||
|
concurrency:
|
||||||
|
group: "pages"
|
||||||
|
cancel-in-progress: false
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
build:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
permissions:
|
||||||
|
contents: read
|
||||||
|
steps:
|
||||||
|
- name: Checkout
|
||||||
|
uses: actions/checkout@v4
|
||||||
|
|
||||||
|
- name: Setup Node
|
||||||
|
uses: actions/setup-node@v4
|
||||||
|
with:
|
||||||
|
# Use the latest LTS version of Node.js already installed on the runner.
|
||||||
|
node-version: latest
|
||||||
|
check-latest: 'false'
|
||||||
|
cache: yarn
|
||||||
|
cache-dependency-path: web/package-lock.json
|
||||||
|
|
||||||
|
- name: Setup Pages
|
||||||
|
uses: actions/configure-pages@v4
|
||||||
|
|
||||||
|
- name: Install dependencies
|
||||||
|
working-directory: web
|
||||||
|
run: yarn install --frozen-lockfile --non-interactive
|
||||||
|
|
||||||
|
- name: Build website
|
||||||
|
working-directory: web
|
||||||
|
run: yarn build
|
||||||
|
|
||||||
|
- name: Upload artifact
|
||||||
|
uses: actions/upload-pages-artifact@v3
|
||||||
|
with:
|
||||||
|
path: web/build
|
||||||
|
|
||||||
|
deploy:
|
||||||
|
permissions:
|
||||||
|
pages: write
|
||||||
|
id-token: write
|
||||||
|
environment:
|
||||||
|
name: github-pages
|
||||||
|
url: ${{ steps.deployment.outputs.page_url }}
|
||||||
|
needs: build
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- name: Deploy to GitHub Pages
|
||||||
|
id: deployment
|
||||||
|
uses: actions/deploy-pages@v4
|
||||||
@ -3,6 +3,7 @@ BarmanObjectStore
|
|||||||
BarmanObjectStoreConfiguration
|
BarmanObjectStoreConfiguration
|
||||||
BarmanObjectStores
|
BarmanObjectStores
|
||||||
CloudNativePG
|
CloudNativePG
|
||||||
|
Docusaurus
|
||||||
EnvVar
|
EnvVar
|
||||||
Gi
|
Gi
|
||||||
IfNotPresent
|
IfNotPresent
|
||||||
@ -13,6 +14,7 @@ ObjectStore
|
|||||||
ObjectStoreSpec
|
ObjectStoreSpec
|
||||||
ObjectStoreStatus
|
ObjectStoreStatus
|
||||||
PITR
|
PITR
|
||||||
|
README
|
||||||
RecoveryWindow
|
RecoveryWindow
|
||||||
RetentionPolicy
|
RetentionPolicy
|
||||||
ServerRecoveryWindow
|
ServerRecoveryWindow
|
||||||
@ -42,12 +44,14 @@ gcs
|
|||||||
gf
|
gf
|
||||||
github
|
github
|
||||||
hostpath
|
hostpath
|
||||||
|
http
|
||||||
https
|
https
|
||||||
imagePullPolicy
|
imagePullPolicy
|
||||||
io
|
io
|
||||||
isWALArchiver
|
isWALArchiver
|
||||||
kubectl
|
kubectl
|
||||||
kubernetes
|
kubernetes
|
||||||
|
localhost
|
||||||
md
|
md
|
||||||
minio
|
minio
|
||||||
namespace
|
namespace
|
||||||
|
|||||||
341
README.md
@ -2,343 +2,4 @@
|
|||||||
|
|
||||||
# Barman Cloud CNPG-I plugin
|
# Barman Cloud CNPG-I plugin
|
||||||
|
|
||||||
**Status:** EXPERIMENTAL
|
Documentation for the Barman Cloud CNPG-I plugin is available at [https://cloudnative-pg.io/plugin-barman-cloud](https://cloudnative-pg.github.io/plugin-barman-cloud).
|
||||||
|
|
||||||
Welcome to the codebase of the [barman-cloud](https://pgbarman.org/) CNPG-I
|
|
||||||
plugin for [CloudNativePG](https://cloudnative-pg.io/).
|
|
||||||
|
|
||||||
## Table of contents
|
|
||||||
|
|
||||||
- [Features](#features)
|
|
||||||
- [Prerequisites](#prerequisites)
|
|
||||||
- [Installation](#installation)
|
|
||||||
- [Usage](#usage)
|
|
||||||
- [WAL Archiving](#configuring-wal-archiving)
|
|
||||||
- [Backup](#performing-a-base-backup)
|
|
||||||
- [Restore](#restoring-a-cluster)
|
|
||||||
- [Replica clusters](#configuring-replica-clusters)
|
|
||||||
- [API Reference](#api-reference)
|
|
||||||
|
|
||||||
## Features
|
|
||||||
|
|
||||||
This plugin enables continuous backup to object storage for a PostgreSQL
|
|
||||||
cluster using the [barman-cloud](https://pgbarman.org/) tool suite.
|
|
||||||
|
|
||||||
The features provided by this plugin are:
|
|
||||||
|
|
||||||
- Data Directory Backup
|
|
||||||
- Data Directory Restore
|
|
||||||
- WAL Archiving
|
|
||||||
- WAL Restoring
|
|
||||||
- Point-in-Time Recovery (PITR)
|
|
||||||
- Replica Clusters
|
|
||||||
|
|
||||||
This plugin is compatible with all object storage services supported by
|
|
||||||
barman-cloud, including:
|
|
||||||
|
|
||||||
- Amazon AWS S3
|
|
||||||
- Google Cloud Storage
|
|
||||||
- Microsoft Azure Blob Storage
|
|
||||||
|
|
||||||
The following storage solutions have been tested and confirmed to work with
|
|
||||||
this implementation:
|
|
||||||
|
|
||||||
- [MinIO](https://min.io/) – An S3-compatible object storage solution.
|
|
||||||
- [Azurite](https://github.com/Azure/Azurite) – A simulator for Microsoft Azure Blob Storage.
|
|
||||||
- [fake-gcs-server](https://github.com/fsouza/fake-gcs-server) – A simulator for Google Cloud Storage.
|
|
||||||
|
|
||||||
Backups created with in-tree object store support can be restored using this
|
|
||||||
plugin, ensuring compatibility and reliability across environments.
|
|
||||||
|
|
||||||
## Prerequisites
|
|
||||||
|
|
||||||
To use this plugin, ensure the following prerequisites are met:
|
|
||||||
|
|
||||||
- [**CloudNativePG**](https://cloudnative-pg.io) version **1.25** or newer.
|
|
||||||
- [**cert-manager**](https://cert-manager.io/) for enabling **TLS communication** between the plugin and the operator.
|
|
||||||
- [**Kubernetes Version >= 1.29**](https://kubernetes.io/docs/concepts/workloads/pods/sidecar-containers/) **Sidecar Containers** need kubernetes v1.29 or above to work.
|
|
||||||
|
|
||||||
## Installation
|
|
||||||
|
|
||||||
**IMPORTANT NOTES:**
|
|
||||||
|
|
||||||
1. The plugin **must** be installed in the same namespace where the operator is
|
|
||||||
installed (typically `cnpg-system`).
|
|
||||||
|
|
||||||
2. Be aware that the operator's **listening namespaces** may differ from its
|
|
||||||
installation namespace. Ensure you verify this distinction to avoid
|
|
||||||
configuration issues.
|
|
||||||
|
|
||||||
Here’s an enhanced version of your instructions for verifying the prerequisites:
|
|
||||||
|
|
||||||
### Step 1 - Verify the Prerequisites
|
|
||||||
|
|
||||||
If CloudNativePG is installed in the default `cnpg-system` namespace, verify its version using the following command:
|
|
||||||
|
|
||||||
```sh
|
|
||||||
kubectl get deployment -n cnpg-system cnpg-controller-manager -o yaml \
|
|
||||||
| grep ghcr.io/cloudnative-pg/cloudnative-pg
|
|
||||||
```
|
|
||||||
|
|
||||||
Example output:
|
|
||||||
|
|
||||||
```output
|
|
||||||
image: ghcr.io/cloudnative-pg/cloudnative-pg:1.25.0
|
|
||||||
```
|
|
||||||
|
|
||||||
Ensure that the version displayed is **1.25** or newer.
|
|
||||||
|
|
||||||
Then, use the [cmctl](https://cert-manager.io/docs/reference/cmctl/#installation)
|
|
||||||
tool to confirm that `cert-manager` is correctly installed:
|
|
||||||
|
|
||||||
```sh
|
|
||||||
cmctl check api
|
|
||||||
```
|
|
||||||
|
|
||||||
Example output:
|
|
||||||
|
|
||||||
```output
|
|
||||||
The cert-manager API is ready
|
|
||||||
```
|
|
||||||
|
|
||||||
Both checks are necessary to proceed with the installation.
|
|
||||||
|
|
||||||
### Step 2 - Install the barman-cloud Plugin
|
|
||||||
|
|
||||||
Use `kubectl` to apply the manifest for the latest commit in the `main` branch:
|
|
||||||
|
|
||||||
<!-- x-release-please-start-version -->
|
|
||||||
```sh
|
|
||||||
kubectl apply -f \
|
|
||||||
https://github.com/cloudnative-pg/plugin-barman-cloud/releases/download/v0.3.0/manifest.yaml
|
|
||||||
```
|
|
||||||
<!-- x-release-please-end -->
|
|
||||||
|
|
||||||
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
|
|
||||||
```
|
|
||||||
|
|
||||||
After these steps, the plugin will be successfully installed. Make sure it is
|
|
||||||
ready to use by checking the deployment status as follows:
|
|
||||||
|
|
||||||
```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 operational.
|
|
||||||
|
|
||||||
## Usage
|
|
||||||
|
|
||||||
### Defining the `BarmanObjectStore`
|
|
||||||
|
|
||||||
A `BarmanObjectStore` object should be created for each object store used in
|
|
||||||
your PostgreSQL architecture. Below is an example configuration for 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` API follows the same schema 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 detailed usage.
|
|
||||||
|
|
||||||
### Configuring WAL Archiving
|
|
||||||
|
|
||||||
Once the `BarmanObjectStore` is defined, you can configure a PostgreSQL cluster
|
|
||||||
to archive WALs by referencing the store in the `.spec.plugins` section, as
|
|
||||||
shown below:
|
|
||||||
|
|
||||||
```yaml
|
|
||||||
apiVersion: postgresql.cnpg.io/v1
|
|
||||||
kind: Cluster
|
|
||||||
metadata:
|
|
||||||
name: cluster-example
|
|
||||||
spec:
|
|
||||||
instances: 3
|
|
||||||
imagePullPolicy: Always
|
|
||||||
plugins:
|
|
||||||
- name: barman-cloud.cloudnative-pg.io
|
|
||||||
isWALArchiver: true
|
|
||||||
parameters:
|
|
||||||
barmanObjectName: minio-store
|
|
||||||
storage:
|
|
||||||
size: 1Gi
|
|
||||||
```
|
|
||||||
|
|
||||||
This configuration enables both WAL archiving and data directory backups.
|
|
||||||
|
|
||||||
### Performing a Base Backup
|
|
||||||
|
|
||||||
Once WAL archiving is enabled, the cluster is ready for backups. To create a
|
|
||||||
backup, configure the `backup.spec.pluginConfiguration` section to specify this
|
|
||||||
plugin:
|
|
||||||
|
|
||||||
```yaml
|
|
||||||
apiVersion: postgresql.cnpg.io/v1
|
|
||||||
kind: Backup
|
|
||||||
metadata:
|
|
||||||
name: backup-example
|
|
||||||
spec:
|
|
||||||
method: plugin
|
|
||||||
cluster:
|
|
||||||
name: cluster-example
|
|
||||||
pluginConfiguration:
|
|
||||||
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
|
|
||||||
```
|
|
||||||
|
|
||||||
**NOTE:** 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
|
|
||||||
```
|
|
||||||
|
|
||||||
## API Reference
|
|
||||||
|
|
||||||
You can find the API reference on its
|
|
||||||
[dedicated page](./docs/src/plugin-barman-cloud.v1.md).
|
|
||||||
|
|||||||
34
Taskfile.yml
@ -79,18 +79,36 @@ tasks:
|
|||||||
GITHUB_REF= dagger -s call -m github.com/cloudnative-pg/daggerverse/crd-ref-docs@${DAGGER_CRDGENREF_SHA} generate
|
GITHUB_REF= dagger -s call -m github.com/cloudnative-pg/daggerverse/crd-ref-docs@${DAGGER_CRDGENREF_SHA} generate
|
||||||
--src .
|
--src .
|
||||||
--source-path api/v1
|
--source-path api/v1
|
||||||
--config-file docs/config.yaml
|
--config-file hack/crd-gen-refs/config.yaml
|
||||||
--renderer markdown
|
--renderer markdown
|
||||||
--templates-dir docs/markdown
|
--templates-dir hack/crd-gen-refs/markdown
|
||||||
file --path out.md
|
file --path out.md
|
||||||
export --path docs/src/plugin-barman-cloud.v1.md
|
export --path web/docs/plugin-barman-cloud.v1.md
|
||||||
sources:
|
sources:
|
||||||
- ./api/**/*.go
|
- ./api/**/*.go
|
||||||
- ./docs/config.yaml
|
- ./hack/docs/crd-gen-refs/**/*
|
||||||
- ./docs/markdown/**/*.tpl
|
|
||||||
- ./Taskfile.yml
|
- ./Taskfile.yml
|
||||||
generates:
|
|
||||||
- ./docs/src/plugin-barman-cloud.v1.md
|
docusaurus-build-test:
|
||||||
|
desc: Check that the documentation builds
|
||||||
|
deps:
|
||||||
|
- apidoc
|
||||||
|
env:
|
||||||
|
# renovate: datasource=git-refs depName=docusaurus lookupname=https://github.com/levlaz/daggerverse currentValue=main
|
||||||
|
DAGGER_DOCUSAURUS_SHA: 47f5206067011dad0f581d4e7db7afddda32acd0
|
||||||
|
cmds:
|
||||||
|
- GITHUB_REF= dagger -s call -m github.com/levlaz/daggerverse/docusaurus@${DAGGER_DOCUSAURUS_SHA}
|
||||||
|
--src web --yarn build
|
||||||
|
src:
|
||||||
|
- ./web/**/*
|
||||||
|
|
||||||
|
docusaurus-version-is-aligned:
|
||||||
|
desc: Verify that a documentation version exists for the current version of the plugin
|
||||||
|
cmds:
|
||||||
|
- $(dagger -s call -m dagger/check-doc-version has-version-documentation --src .)
|
||||||
|
src:
|
||||||
|
- .release-please-manifest.json
|
||||||
|
- ./web/versions.json
|
||||||
|
|
||||||
go-test:
|
go-test:
|
||||||
desc: Run go test
|
desc: Run go test
|
||||||
@ -311,6 +329,8 @@ tasks:
|
|||||||
- lint
|
- lint
|
||||||
- go-test
|
- go-test
|
||||||
- e2e-ephemeral
|
- e2e-ephemeral
|
||||||
|
- docusaurus-build-test
|
||||||
|
- docusaurus-version-is-aligned
|
||||||
|
|
||||||
publish:
|
publish:
|
||||||
desc: Build and publish a container image for the plugin
|
desc: Build and publish a container image for the plugin
|
||||||
|
|||||||
4
dagger/check-doc-version/.gitattributes
vendored
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
/dagger.gen.go linguist-generated
|
||||||
|
/internal/dagger/** linguist-generated
|
||||||
|
/internal/querybuilder/** linguist-generated
|
||||||
|
/internal/telemetry/** linguist-generated
|
||||||
4
dagger/check-doc-version/.gitignore
vendored
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
/dagger.gen.go
|
||||||
|
/internal/dagger
|
||||||
|
/internal/querybuilder
|
||||||
|
/internal/telemetry
|
||||||
7
dagger/check-doc-version/dagger.json
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
{
|
||||||
|
"name": "check-doc-version",
|
||||||
|
"engineVersion": "v0.18.2",
|
||||||
|
"sdk": {
|
||||||
|
"source": "go"
|
||||||
|
}
|
||||||
|
}
|
||||||
50
dagger/check-doc-version/go.mod
Normal file
@ -0,0 +1,50 @@
|
|||||||
|
module dagger/check-doc-version
|
||||||
|
|
||||||
|
go 1.23.6
|
||||||
|
|
||||||
|
require (
|
||||||
|
github.com/99designs/gqlgen v0.17.70
|
||||||
|
github.com/Khan/genqlient v0.8.0
|
||||||
|
github.com/vektah/gqlparser/v2 v2.5.23
|
||||||
|
go.opentelemetry.io/otel v1.34.0
|
||||||
|
go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploggrpc v0.8.0
|
||||||
|
go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp v0.8.0
|
||||||
|
go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.32.0
|
||||||
|
go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v1.32.0
|
||||||
|
go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.32.0
|
||||||
|
go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.32.0
|
||||||
|
go.opentelemetry.io/otel/log v0.8.0
|
||||||
|
go.opentelemetry.io/otel/metric v1.34.0
|
||||||
|
go.opentelemetry.io/otel/sdk v1.34.0
|
||||||
|
go.opentelemetry.io/otel/sdk/log v0.8.0
|
||||||
|
go.opentelemetry.io/otel/sdk/metric v1.34.0
|
||||||
|
go.opentelemetry.io/otel/trace v1.34.0
|
||||||
|
go.opentelemetry.io/proto/otlp v1.3.1
|
||||||
|
golang.org/x/sync v0.12.0
|
||||||
|
google.golang.org/grpc v1.71.0
|
||||||
|
)
|
||||||
|
|
||||||
|
require (
|
||||||
|
github.com/cenkalti/backoff/v4 v4.3.0 // indirect
|
||||||
|
github.com/go-logr/logr v1.4.2 // indirect
|
||||||
|
github.com/go-logr/stdr v1.2.2 // indirect
|
||||||
|
github.com/google/uuid v1.6.0 // indirect
|
||||||
|
github.com/grpc-ecosystem/grpc-gateway/v2 v2.23.0 // indirect
|
||||||
|
github.com/sosodev/duration v1.3.1 // indirect
|
||||||
|
go.opentelemetry.io/auto/sdk v1.1.0 // indirect
|
||||||
|
go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.32.0 // indirect
|
||||||
|
golang.org/x/net v0.38.0 // indirect
|
||||||
|
golang.org/x/sys v0.31.0 // indirect
|
||||||
|
golang.org/x/text v0.23.0 // indirect
|
||||||
|
google.golang.org/genproto/googleapis/api v0.0.0-20250106144421-5f5ef82da422 // indirect
|
||||||
|
google.golang.org/genproto/googleapis/rpc v0.0.0-20250115164207-1a7da9e5054f // indirect
|
||||||
|
google.golang.org/protobuf v1.36.6 // indirect
|
||||||
|
)
|
||||||
|
|
||||||
|
replace go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploggrpc => go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploggrpc v0.8.0
|
||||||
|
|
||||||
|
replace go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp => go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp v0.8.0
|
||||||
|
|
||||||
|
replace go.opentelemetry.io/otel/log => go.opentelemetry.io/otel/log v0.8.0
|
||||||
|
|
||||||
|
replace go.opentelemetry.io/otel/sdk/log => go.opentelemetry.io/otel/sdk/log v0.8.0
|
||||||
85
dagger/check-doc-version/go.sum
Normal file
@ -0,0 +1,85 @@
|
|||||||
|
github.com/99designs/gqlgen v0.17.70 h1:xgLIgQuG+Q2L/AE9cW595CT7xCWCe/bpPIFGSfsGSGs=
|
||||||
|
github.com/99designs/gqlgen v0.17.70/go.mod h1:fvCiqQAu2VLhKXez2xFvLmE47QgAPf/KTPN5XQ4rsHQ=
|
||||||
|
github.com/Khan/genqlient v0.8.0 h1:Hd1a+E1CQHYbMEKakIkvBH3zW0PWEeiX6Hp1i2kP2WE=
|
||||||
|
github.com/Khan/genqlient v0.8.0/go.mod h1:hn70SpYjWteRGvxTwo0kfaqg4wxvndECGkfa1fdDdYI=
|
||||||
|
github.com/andreyvit/diff v0.0.0-20170406064948-c7f18ee00883 h1:bvNMNQO63//z+xNgfBlViaCIJKLlCJ6/fmUseuG0wVQ=
|
||||||
|
github.com/andreyvit/diff v0.0.0-20170406064948-c7f18ee00883/go.mod h1:rCTlJbsFo29Kk6CurOXKm700vrz8f0KW0JNfpkRJY/8=
|
||||||
|
github.com/cenkalti/backoff/v4 v4.3.0 h1:MyRJ/UdXutAwSAT+s3wNd7MfTIcy71VQueUuFK343L8=
|
||||||
|
github.com/cenkalti/backoff/v4 v4.3.0/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE=
|
||||||
|
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
|
||||||
|
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
||||||
|
github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=
|
||||||
|
github.com/go-logr/logr v1.4.2 h1:6pFjapn8bFcIbiKo3XT4j/BhANplGihG6tvd+8rYgrY=
|
||||||
|
github.com/go-logr/logr v1.4.2/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY=
|
||||||
|
github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag=
|
||||||
|
github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE=
|
||||||
|
github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek=
|
||||||
|
github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps=
|
||||||
|
github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI=
|
||||||
|
github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
|
||||||
|
github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0=
|
||||||
|
github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
|
||||||
|
github.com/grpc-ecosystem/grpc-gateway/v2 v2.23.0 h1:ad0vkEBuk23VJzZR9nkLVG0YAoN9coASF1GusYX6AlU=
|
||||||
|
github.com/grpc-ecosystem/grpc-gateway/v2 v2.23.0/go.mod h1:igFoXX2ELCW06bol23DWPB5BEWfZISOzSP5K2sbLea0=
|
||||||
|
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
|
||||||
|
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
|
||||||
|
github.com/sergi/go-diff v1.3.1 h1:xkr+Oxo4BOQKmkn/B9eMK0g5Kg/983T9DqqPHwYqD+8=
|
||||||
|
github.com/sergi/go-diff v1.3.1/go.mod h1:aMJSSKb2lpPvRNec0+w3fl7LP9IOFzdc9Pa4NFbPK1I=
|
||||||
|
github.com/sosodev/duration v1.3.1 h1:qtHBDMQ6lvMQsL15g4aopM4HEfOaYuhWBw3NPTtlqq4=
|
||||||
|
github.com/sosodev/duration v1.3.1/go.mod h1:RQIBBX0+fMLc/D9+Jb/fwvVmo0eZvDDEERAikUR6SDg=
|
||||||
|
github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA=
|
||||||
|
github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=
|
||||||
|
github.com/vektah/gqlparser/v2 v2.5.23 h1:PurJ9wpgEVB7tty1seRUwkIDa/QH5RzkzraiKIjKLfA=
|
||||||
|
github.com/vektah/gqlparser/v2 v2.5.23/go.mod h1:D1/VCZtV3LPnQrcPBeR/q5jkSQIPti0uYCP/RI0gIeo=
|
||||||
|
go.opentelemetry.io/auto/sdk v1.1.0 h1:cH53jehLUN6UFLY71z+NDOiNJqDdPRaXzTel0sJySYA=
|
||||||
|
go.opentelemetry.io/auto/sdk v1.1.0/go.mod h1:3wSPjt5PWp2RhlCcmmOial7AvC4DQqZb7a7wCow3W8A=
|
||||||
|
go.opentelemetry.io/otel v1.34.0 h1:zRLXxLCgL1WyKsPVrgbSdMN4c0FMkDAskSTQP+0hdUY=
|
||||||
|
go.opentelemetry.io/otel v1.34.0/go.mod h1:OWFPOQ+h4G8xpyjgqo4SxJYdDQ/qmRH+wivy7zzx9oI=
|
||||||
|
go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploggrpc v0.8.0 h1:WzNab7hOOLzdDF/EoWCt4glhrbMPVMOO5JYTmpz36Ls=
|
||||||
|
go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploggrpc v0.8.0/go.mod h1:hKvJwTzJdp90Vh7p6q/9PAOd55dI6WA6sWj62a/JvSs=
|
||||||
|
go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp v0.8.0 h1:S+LdBGiQXtJdowoJoQPEtI52syEP/JYBUpjO49EQhV8=
|
||||||
|
go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp v0.8.0/go.mod h1:5KXybFvPGds3QinJWQT7pmXf+TN5YIa7CNYObWRkj50=
|
||||||
|
go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.32.0 h1:j7ZSD+5yn+lo3sGV69nW04rRR0jhYnBwjuX3r0HvnK0=
|
||||||
|
go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.32.0/go.mod h1:WXbYJTUaZXAbYd8lbgGuvih0yuCfOFC5RJoYnoLcGz8=
|
||||||
|
go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v1.32.0 h1:t/Qur3vKSkUCcDVaSumWF2PKHt85pc7fRvFuoVT8qFU=
|
||||||
|
go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v1.32.0/go.mod h1:Rl61tySSdcOJWoEgYZVtmnKdA0GeKrSqkHC1t+91CH8=
|
||||||
|
go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.32.0 h1:IJFEoHiytixx8cMiVAO+GmHR6Frwu+u5Ur8njpFO6Ac=
|
||||||
|
go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.32.0/go.mod h1:3rHrKNtLIoS0oZwkY2vxi+oJcwFRWdtUyRII+so45p8=
|
||||||
|
go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.32.0 h1:9kV11HXBHZAvuPUZxmMWrH8hZn/6UnHX4K0mu36vNsU=
|
||||||
|
go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.32.0/go.mod h1:JyA0FHXe22E1NeNiHmVp7kFHglnexDQ7uRWDiiJ1hKQ=
|
||||||
|
go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.32.0 h1:cMyu9O88joYEaI47CnQkxO1XZdpoTF9fEnW2duIddhw=
|
||||||
|
go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.32.0/go.mod h1:6Am3rn7P9TVVeXYG+wtcGE7IE1tsQ+bP3AuWcKt/gOI=
|
||||||
|
go.opentelemetry.io/otel/log v0.8.0 h1:egZ8vV5atrUWUbnSsHn6vB8R21G2wrKqNiDt3iWertk=
|
||||||
|
go.opentelemetry.io/otel/log v0.8.0/go.mod h1:M9qvDdUTRCopJcGRKg57+JSQ9LgLBrwwfC32epk5NX8=
|
||||||
|
go.opentelemetry.io/otel/metric v1.34.0 h1:+eTR3U0MyfWjRDhmFMxe2SsW64QrZ84AOhvqS7Y+PoQ=
|
||||||
|
go.opentelemetry.io/otel/metric v1.34.0/go.mod h1:CEDrp0fy2D0MvkXE+dPV7cMi8tWZwX3dmaIhwPOaqHE=
|
||||||
|
go.opentelemetry.io/otel/sdk v1.34.0 h1:95zS4k/2GOy069d321O8jWgYsW3MzVV+KuSPKp7Wr1A=
|
||||||
|
go.opentelemetry.io/otel/sdk v1.34.0/go.mod h1:0e/pNiaMAqaykJGKbi+tSjWfNNHMTxoC9qANsCzbyxU=
|
||||||
|
go.opentelemetry.io/otel/sdk/log v0.8.0 h1:zg7GUYXqxk1jnGF/dTdLPrK06xJdrXgqgFLnI4Crxvs=
|
||||||
|
go.opentelemetry.io/otel/sdk/log v0.8.0/go.mod h1:50iXr0UVwQrYS45KbruFrEt4LvAdCaWWgIrsN3ZQggo=
|
||||||
|
go.opentelemetry.io/otel/sdk/metric v1.34.0 h1:5CeK9ujjbFVL5c1PhLuStg1wxA7vQv7ce1EK0Gyvahk=
|
||||||
|
go.opentelemetry.io/otel/sdk/metric v1.34.0/go.mod h1:jQ/r8Ze28zRKoNRdkjCZxfs6YvBTG1+YIqyFVFYec5w=
|
||||||
|
go.opentelemetry.io/otel/trace v1.34.0 h1:+ouXS2V8Rd4hp4580a8q23bg0azF2nI8cqLYnC8mh/k=
|
||||||
|
go.opentelemetry.io/otel/trace v1.34.0/go.mod h1:Svm7lSjQD7kG7KJ/MUHPVXSDGz2OX4h0M2jHBhmSfRE=
|
||||||
|
go.opentelemetry.io/proto/otlp v1.3.1 h1:TrMUixzpM0yuc/znrFTP9MMRh8trP93mkCiDVeXrui0=
|
||||||
|
go.opentelemetry.io/proto/otlp v1.3.1/go.mod h1:0X1WI4de4ZsLrrJNLAQbFeLCm3T7yBkR0XqQ7niQU+8=
|
||||||
|
go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto=
|
||||||
|
go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE=
|
||||||
|
golang.org/x/net v0.38.0 h1:vRMAPTMaeGqVhG5QyLJHqNDwecKTomGeqbnfZyKlBI8=
|
||||||
|
golang.org/x/net v0.38.0/go.mod h1:ivrbrMbzFq5J41QOQh0siUuly180yBYtLp+CKbEaFx8=
|
||||||
|
golang.org/x/sync v0.12.0 h1:MHc5BpPuC30uJk597Ri8TV3CNZcTLu6B6z4lJy+g6Jw=
|
||||||
|
golang.org/x/sync v0.12.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA=
|
||||||
|
golang.org/x/sys v0.31.0 h1:ioabZlmFYtWhL+TRYpcnNlLwhyxaM9kWTDEmfnprqik=
|
||||||
|
golang.org/x/sys v0.31.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k=
|
||||||
|
golang.org/x/text v0.23.0 h1:D71I7dUrlY+VX0gQShAThNGHFxZ13dGLBHQLVl1mJlY=
|
||||||
|
golang.org/x/text v0.23.0/go.mod h1:/BLNzu4aZCJ1+kcD0DNRotWKage4q2rGVAg4o22unh4=
|
||||||
|
google.golang.org/genproto/googleapis/api v0.0.0-20250106144421-5f5ef82da422 h1:GVIKPyP/kLIyVOgOnTwFOrvQaQUzOzGMCxgFUOEmm24=
|
||||||
|
google.golang.org/genproto/googleapis/api v0.0.0-20250106144421-5f5ef82da422/go.mod h1:b6h1vNKhxaSoEI+5jc3PJUCustfli/mRab7295pY7rw=
|
||||||
|
google.golang.org/genproto/googleapis/rpc v0.0.0-20250115164207-1a7da9e5054f h1:OxYkA3wjPsZyBylwymxSHa7ViiW1Sml4ToBrncvFehI=
|
||||||
|
google.golang.org/genproto/googleapis/rpc v0.0.0-20250115164207-1a7da9e5054f/go.mod h1:+2Yz8+CLJbIfL9z73EW45avw8Lmge3xVElCP9zEKi50=
|
||||||
|
google.golang.org/grpc v1.71.0 h1:kF77BGdPTQ4/JZWMlb9VpJ5pa25aqvVqogsxNHHdeBg=
|
||||||
|
google.golang.org/grpc v1.71.0/go.mod h1:H0GRtasmQOh9LkFoCPDu3ZrwUtD1YGE+b2vYBYd/8Ec=
|
||||||
|
google.golang.org/protobuf v1.36.6 h1:z1NpPI8ku2WgiWnf+t9wTPsn6eP1L7ksHUlkfLvd9xY=
|
||||||
|
google.golang.org/protobuf v1.36.6/go.mod h1:jduwjTPXsFjZGTmRluh+L6NjiWu7pchiJ2/5YcXBHnY=
|
||||||
|
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
|
||||||
|
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
|
||||||
45
dagger/check-doc-version/main.go
Normal file
@ -0,0 +1,45 @@
|
|||||||
|
// The CheckDocVersion module is designed to check if the version of the
|
||||||
|
// documentation exists for the version specified in the release-please manifest.
|
||||||
|
// This is used to ensure that we do not release a new version of the plugin
|
||||||
|
// without having the corresponding documentation ready.
|
||||||
|
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"context"
|
||||||
|
"fmt"
|
||||||
|
"strings"
|
||||||
|
|
||||||
|
"dagger/check-doc-version/internal/dagger"
|
||||||
|
)
|
||||||
|
|
||||||
|
type CheckDocVersion struct{}
|
||||||
|
|
||||||
|
// HasVersionDocumentation checks if a version of the documentation exists for the
|
||||||
|
// version in the release-please manifest.
|
||||||
|
func (m *CheckDocVersion) HasVersionDocumentation(ctx context.Context, src *dagger.Directory) (bool, error) {
|
||||||
|
releasePleaseManifest := ".release-please-manifest.json"
|
||||||
|
docusaurusVersions := "web/versions.json"
|
||||||
|
ctr := dag.Container().From("alpine:latest").
|
||||||
|
WithDirectory("/src", src).
|
||||||
|
WithWorkdir("/src").
|
||||||
|
WithExec([]string{"apk", "add", "jq"})
|
||||||
|
nextVersion, err := ctr.
|
||||||
|
WithExec([]string{"jq", "-r", ".[\".\"]", releasePleaseManifest}).
|
||||||
|
Stdout(ctx)
|
||||||
|
nextVersion = strings.TrimSpace(nextVersion)
|
||||||
|
if err != nil {
|
||||||
|
return false, fmt.Errorf("cannot find proposed release-please version in %v: %w", releasePleaseManifest,
|
||||||
|
err)
|
||||||
|
}
|
||||||
|
currVersion, err := ctr.WithExec([]string{"jq", "-r", fmt.Sprintf(". | index(\"%v\")", nextVersion),
|
||||||
|
docusaurusVersions}).Stdout(ctx)
|
||||||
|
currVersion = strings.TrimSpace(currVersion)
|
||||||
|
if err != nil {
|
||||||
|
return false, fmt.Errorf("error querying versions in %v: %w", docusaurusVersions, err)
|
||||||
|
}
|
||||||
|
if currVersion == "null" {
|
||||||
|
return false, nil
|
||||||
|
}
|
||||||
|
return true, nil
|
||||||
|
}
|
||||||
20
web/.gitignore
vendored
Normal file
@ -0,0 +1,20 @@
|
|||||||
|
# Dependencies
|
||||||
|
/node_modules
|
||||||
|
|
||||||
|
# Production
|
||||||
|
/build
|
||||||
|
|
||||||
|
# Generated files
|
||||||
|
.docusaurus
|
||||||
|
.cache-loader
|
||||||
|
|
||||||
|
# Misc
|
||||||
|
.DS_Store
|
||||||
|
.env.local
|
||||||
|
.env.development.local
|
||||||
|
.env.test.local
|
||||||
|
.env.production.local
|
||||||
|
|
||||||
|
npm-debug.log*
|
||||||
|
yarn-debug.log*
|
||||||
|
yarn-error.log*
|
||||||
47
web/README.md
Normal file
@ -0,0 +1,47 @@
|
|||||||
|
# Website
|
||||||
|
|
||||||
|
This website is built using [Docusaurus](https://docusaurus.io/), a modern
|
||||||
|
static website generator.
|
||||||
|
|
||||||
|
### Installation
|
||||||
|
|
||||||
|
```shell
|
||||||
|
$ yarn
|
||||||
|
```
|
||||||
|
|
||||||
|
### Local Development
|
||||||
|
|
||||||
|
```shell
|
||||||
|
$ yarn start
|
||||||
|
```
|
||||||
|
|
||||||
|
This command starts a local development server and opens up a browser window.
|
||||||
|
Most changes are reflected live without having to restart the server.
|
||||||
|
|
||||||
|
### Build
|
||||||
|
|
||||||
|
```shell
|
||||||
|
$ yarn build
|
||||||
|
```
|
||||||
|
|
||||||
|
This command generates static content into the `build` directory and can be
|
||||||
|
served using any static contents hosting service.
|
||||||
|
|
||||||
|
### Test the build
|
||||||
|
|
||||||
|
```shell
|
||||||
|
$ yarn serve
|
||||||
|
```
|
||||||
|
|
||||||
|
By default, this will load your site at http://localhost:3000/.
|
||||||
|
|
||||||
|
### Versioning
|
||||||
|
|
||||||
|
Docusaurus allows versioning of the documentation to maintain separate sets of
|
||||||
|
documentation for different software versions.
|
||||||
|
|
||||||
|
To create a new documentation version:
|
||||||
|
|
||||||
|
```shell
|
||||||
|
$ yarn docusaurus docs:version X.Y.Z
|
||||||
|
```
|
||||||
35
web/docs/features.md
Normal file
@ -0,0 +1,35 @@
|
|||||||
|
---
|
||||||
|
sidebar_position: 2
|
||||||
|
---
|
||||||
|
|
||||||
|
# Features
|
||||||
|
|
||||||
|
This plugin enables continuous backup to object storage for a PostgreSQL
|
||||||
|
cluster using the [barman-cloud](https://pgbarman.org/) tool suite.
|
||||||
|
|
||||||
|
The features provided by this plugin are:
|
||||||
|
|
||||||
|
- Data Directory Backup
|
||||||
|
- Data Directory Restore
|
||||||
|
- WAL Archiving
|
||||||
|
- WAL Restoring
|
||||||
|
- Point-in-Time Recovery (PITR)
|
||||||
|
- Replica Clusters
|
||||||
|
|
||||||
|
This plugin is compatible with all object storage services supported by
|
||||||
|
barman-cloud, including:
|
||||||
|
|
||||||
|
- Amazon AWS S3
|
||||||
|
- Google Cloud Storage
|
||||||
|
- Microsoft Azure Blob Storage
|
||||||
|
|
||||||
|
The following storage solutions have been tested and confirmed to work with
|
||||||
|
this implementation:
|
||||||
|
|
||||||
|
- [MinIO](https://min.io/) – An S3-compatible object storage solution.
|
||||||
|
- [Azurite](https://github.com/Azure/Azurite) – A simulator for Microsoft Azure Blob Storage.
|
||||||
|
- [fake-gcs-server](https://github.com/fsouza/fake-gcs-server) – A simulator for Google Cloud Storage.
|
||||||
|
|
||||||
|
Backups created with in-tree object store support can be restored using this
|
||||||
|
plugin, ensuring compatibility and reliability across environments.
|
||||||
|
|
||||||
97
web/docs/installation.md
Normal file
@ -0,0 +1,97 @@
|
|||||||
|
---
|
||||||
|
sidebar_position: 4
|
||||||
|
---
|
||||||
|
|
||||||
|
# Installation
|
||||||
|
|
||||||
|
**IMPORTANT NOTES:**
|
||||||
|
|
||||||
|
1. The plugin **must** be installed in the same namespace where the operator is
|
||||||
|
installed (typically `cnpg-system`).
|
||||||
|
|
||||||
|
2. Be aware that the operator's **listening namespaces** may differ from its
|
||||||
|
installation namespace. Ensure you verify this distinction to avoid
|
||||||
|
configuration issues.
|
||||||
|
|
||||||
|
Here’s an enhanced version of your instructions for verifying the prerequisites:
|
||||||
|
|
||||||
|
## Step 1 - Verify the Prerequisites
|
||||||
|
|
||||||
|
If CloudNativePG is installed in the default `cnpg-system` namespace, verify its version using the following command:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
kubectl get deployment -n cnpg-system cnpg-controller-manager -o yaml \
|
||||||
|
| grep ghcr.io/cloudnative-pg/cloudnative-pg
|
||||||
|
```
|
||||||
|
|
||||||
|
Example output:
|
||||||
|
|
||||||
|
```output
|
||||||
|
image: ghcr.io/cloudnative-pg/cloudnative-pg:1.26.0
|
||||||
|
```
|
||||||
|
|
||||||
|
Ensure that the version displayed is **1.26** or newer.
|
||||||
|
|
||||||
|
Then, use the [cmctl](https://cert-manager.io/docs/reference/cmctl/#installation)
|
||||||
|
tool to confirm that `cert-manager` is correctly installed:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
cmctl check api
|
||||||
|
```
|
||||||
|
|
||||||
|
Example output:
|
||||||
|
|
||||||
|
```output
|
||||||
|
The cert-manager API is ready
|
||||||
|
```
|
||||||
|
|
||||||
|
Both checks are necessary to proceed with the installation.
|
||||||
|
|
||||||
|
## Step 2 - Install the barman-cloud Plugin
|
||||||
|
|
||||||
|
Use `kubectl` to apply the manifest for the latest commit in the `main` branch:
|
||||||
|
|
||||||
|
<!-- x-release-please-start-version -->
|
||||||
|
```sh
|
||||||
|
kubectl apply -f \
|
||||||
|
https://github.com/cloudnative-pg/plugin-barman-cloud/releases/download/v0.3.0/manifest.yaml
|
||||||
|
```
|
||||||
|
<!-- x-release-please-end -->
|
||||||
|
|
||||||
|
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
|
||||||
|
```
|
||||||
|
|
||||||
|
After these steps, the plugin will be successfully installed. Make sure it is
|
||||||
|
ready to use by checking the deployment status as follows:
|
||||||
|
|
||||||
|
```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 operational.
|
||||||
10
web/docs/prerequisites.md
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
---
|
||||||
|
sidebar_position: 3
|
||||||
|
---
|
||||||
|
|
||||||
|
# Prerequisites
|
||||||
|
|
||||||
|
To use this plugin, ensure the following prerequisites are met:
|
||||||
|
|
||||||
|
- [**CloudNativePG**](https://cloudnative-pg.io) version **1.25** or newer.
|
||||||
|
- [**cert-manager**](https://cert-manager.io/) for enabling **TLS communication** between the plugin and the operator.
|
||||||
189
web/docs/usage.md
Normal file
@ -0,0 +1,189 @@
|
|||||||
|
---
|
||||||
|
sidebar_position: 5
|
||||||
|
---
|
||||||
|
|
||||||
|
# Usage
|
||||||
|
|
||||||
|
## Defining the `BarmanObjectStore`
|
||||||
|
|
||||||
|
A `BarmanObjectStore` object should be created for each object store used in
|
||||||
|
your PostgreSQL architecture. Below is an example configuration for 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` API follows the same schema 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 detailed usage.
|
||||||
|
|
||||||
|
## Configuring WAL Archiving
|
||||||
|
|
||||||
|
Once the `BarmanObjectStore` is defined, you can configure a PostgreSQL cluster
|
||||||
|
to archive WALs by referencing the store in the `.spec.plugins` section, as
|
||||||
|
shown below:
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
apiVersion: postgresql.cnpg.io/v1
|
||||||
|
kind: Cluster
|
||||||
|
metadata:
|
||||||
|
name: cluster-example
|
||||||
|
spec:
|
||||||
|
instances: 3
|
||||||
|
imagePullPolicy: Always
|
||||||
|
plugins:
|
||||||
|
- name: barman-cloud.cloudnative-pg.io
|
||||||
|
isWALArchiver: true
|
||||||
|
parameters:
|
||||||
|
barmanObjectName: minio-store
|
||||||
|
storage:
|
||||||
|
size: 1Gi
|
||||||
|
```
|
||||||
|
|
||||||
|
This configuration enables both WAL archiving and data directory backups.
|
||||||
|
|
||||||
|
## Performing a Base Backup
|
||||||
|
|
||||||
|
Once WAL archiving is enabled, the cluster is ready for backups. To create a
|
||||||
|
backup, configure the `backup.spec.pluginConfiguration` section to specify this
|
||||||
|
plugin:
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
apiVersion: postgresql.cnpg.io/v1
|
||||||
|
kind: Backup
|
||||||
|
metadata:
|
||||||
|
name: backup-example
|
||||||
|
spec:
|
||||||
|
method: plugin
|
||||||
|
cluster:
|
||||||
|
name: cluster-example
|
||||||
|
pluginConfiguration:
|
||||||
|
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
|
||||||
|
```
|
||||||
|
|
||||||
|
**NOTE:** 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
|
||||||
|
```
|
||||||
13
web/docs/welcome.md
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
---
|
||||||
|
sidebar_position: 1
|
||||||
|
sidebar_label: "Welcome"
|
||||||
|
---
|
||||||
|
|
||||||
|
# Barman Cloud CNPG-I plugin
|
||||||
|
|
||||||
|
**Status:** EXPERIMENTAL
|
||||||
|
|
||||||
|
Welcome to the documentation of the [barman-cloud](https://pgbarman.org/) CNPG-I
|
||||||
|
plugin for [CloudNativePG](https://cloudnative-pg.io/).
|
||||||
|
|
||||||
|
Test
|
||||||
152
web/docusaurus.config.ts
Normal file
@ -0,0 +1,152 @@
|
|||||||
|
import {themes as prismThemes} from 'prism-react-renderer';
|
||||||
|
import type {Config} from '@docusaurus/types';
|
||||||
|
import type * as Preset from '@docusaurus/preset-classic';
|
||||||
|
|
||||||
|
// This runs in Node.js - Don't use client-side code here (browser APIs, JSX...)
|
||||||
|
|
||||||
|
const config: Config = {
|
||||||
|
title: 'Barman Cloud CNPG-I plugin',
|
||||||
|
favicon: 'img/favicon.ico',
|
||||||
|
|
||||||
|
// Set the production url of your site here
|
||||||
|
url: 'https://cloudnative-pg.github.io',
|
||||||
|
// Set the /<baseUrl>/ pathname under which your site is served
|
||||||
|
// For GitHub pages deployment, it is often '/<projectName>/'
|
||||||
|
baseUrl: '/plugin-barman-cloud/',
|
||||||
|
trailingSlash: true,
|
||||||
|
|
||||||
|
// GitHub pages deployment config.
|
||||||
|
organizationName: 'cloudnative-pg',
|
||||||
|
projectName: 'plugin-barman-cloud',
|
||||||
|
deploymentBranch: 'gh-pages',
|
||||||
|
|
||||||
|
onBrokenLinks: 'throw',
|
||||||
|
onBrokenMarkdownLinks: 'throw',
|
||||||
|
|
||||||
|
// Even if you don't use internationalization, you can use this field to set
|
||||||
|
// useful metadata like html lang. For example, if your site is Chinese, you
|
||||||
|
// may want to replace "en" with "zh-Hans".
|
||||||
|
i18n: {
|
||||||
|
defaultLocale: 'en',
|
||||||
|
locales: ['en'],
|
||||||
|
},
|
||||||
|
|
||||||
|
presets: [
|
||||||
|
[
|
||||||
|
'classic',
|
||||||
|
{
|
||||||
|
docs: {
|
||||||
|
path: 'docs',
|
||||||
|
sidebarPath: './sidebars.ts',
|
||||||
|
includeCurrentVersion: true, // Include the current version in the sidebar
|
||||||
|
versions:{
|
||||||
|
current:{
|
||||||
|
label: 'Dev',
|
||||||
|
badge: true,
|
||||||
|
banner: "unreleased",
|
||||||
|
},
|
||||||
|
}
|
||||||
|
},
|
||||||
|
theme: {
|
||||||
|
customCss: './src/css/custom.css',
|
||||||
|
},
|
||||||
|
} satisfies Preset.Options,
|
||||||
|
],
|
||||||
|
],
|
||||||
|
themes: [
|
||||||
|
[
|
||||||
|
require.resolve("@easyops-cn/docusaurus-search-local"),
|
||||||
|
/** @type {import("@easyops-cn/docusaurus-search-local").PluginOptions} */
|
||||||
|
({
|
||||||
|
hashed: true,
|
||||||
|
docsDir: ['docs'],
|
||||||
|
searchResultLimits: 8,
|
||||||
|
searchResultContextMaxLength: 50,
|
||||||
|
language: ["en"],
|
||||||
|
// Only index headings and content
|
||||||
|
indexBlog: false,
|
||||||
|
indexPages: false,
|
||||||
|
}),
|
||||||
|
],
|
||||||
|
],
|
||||||
|
themeConfig: {
|
||||||
|
image: 'img/cloudnativepg-social-card.png',
|
||||||
|
navbar: {
|
||||||
|
title: 'Barman Cloud CNPG-I plugin',
|
||||||
|
logo: {
|
||||||
|
alt: 'CloudNativePG Logo',
|
||||||
|
src: 'img/logo.svg',
|
||||||
|
},
|
||||||
|
items: [
|
||||||
|
{
|
||||||
|
type: 'docSidebar',
|
||||||
|
sidebarId: 'docs',
|
||||||
|
position: 'left',
|
||||||
|
label: 'Documentation',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
type: 'docsVersionDropdown',
|
||||||
|
position: 'right',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
href: "https://github.com/cloudnative-pg/plugin-barman-cloud",
|
||||||
|
position: "right",
|
||||||
|
className: "header-github-link",
|
||||||
|
"aria-label": "GitHub repository",
|
||||||
|
},
|
||||||
|
|
||||||
|
],
|
||||||
|
},
|
||||||
|
footer: {
|
||||||
|
logo: {
|
||||||
|
alt: 'CloudNativePG Logo',
|
||||||
|
src: "img/cloudnativepg-landscape-white.png",
|
||||||
|
href: "https://cloudnative-pg.io",
|
||||||
|
},
|
||||||
|
style: 'dark',
|
||||||
|
links: [
|
||||||
|
{
|
||||||
|
title: 'Community',
|
||||||
|
items: [
|
||||||
|
{
|
||||||
|
label: 'Slack',
|
||||||
|
href: 'https://cloud-native.slack.com/messages/cloudnativepg-users',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: 'X',
|
||||||
|
href: 'https://x.com/CloudNativePG',
|
||||||
|
},
|
||||||
|
],
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: 'More',
|
||||||
|
items: [
|
||||||
|
{
|
||||||
|
label: 'GitHub',
|
||||||
|
href: 'https://github.com/cloudnative-pg/plugin-barman-cloud',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: 'CloudNativePG',
|
||||||
|
href: 'https://cloudnative-pg.io',
|
||||||
|
},
|
||||||
|
],
|
||||||
|
},
|
||||||
|
],
|
||||||
|
copyright: `
|
||||||
|
Copyright © ${new Date().getFullYear()} CloudNativePG a Series of LF Projects, LLC.<br><br>
|
||||||
|
|
||||||
|
For website terms of use, trademark policy and other project policies please see
|
||||||
|
<a href="https://lfprojects.org/policies/">LF Projects, LLC Policies</a>.<br>
|
||||||
|
<a href="https://www.linuxfoundation.org/trademark-usage/">The Linux Foundation has registered trademarks and uses trademarks</a>.<br>
|
||||||
|
<a href="https://www.postgresql.org/about/policies/trademarks">Postgres, PostgreSQL and the Slonik Logo are
|
||||||
|
trademarks or registered trademarks of the PostgreSQL Community Association of Canada, and
|
||||||
|
used with their permission</a>.`
|
||||||
|
},
|
||||||
|
prism: {
|
||||||
|
theme: prismThemes.github,
|
||||||
|
darkTheme: prismThemes.dracula,
|
||||||
|
},
|
||||||
|
} satisfies Preset.ThemeConfig,
|
||||||
|
};
|
||||||
|
|
||||||
|
export default config;
|
||||||
18448
web/package-lock.json
generated
Normal file
48
web/package.json
Normal file
@ -0,0 +1,48 @@
|
|||||||
|
{
|
||||||
|
"name": "docs",
|
||||||
|
"version": "0.0.0",
|
||||||
|
"private": true,
|
||||||
|
"scripts": {
|
||||||
|
"docusaurus": "docusaurus",
|
||||||
|
"start": "docusaurus start",
|
||||||
|
"build": "docusaurus build",
|
||||||
|
"swizzle": "docusaurus swizzle",
|
||||||
|
"deploy": "docusaurus deploy",
|
||||||
|
"clear": "docusaurus clear",
|
||||||
|
"serve": "docusaurus serve",
|
||||||
|
"write-translations": "docusaurus write-translations",
|
||||||
|
"write-heading-ids": "docusaurus write-heading-ids",
|
||||||
|
"typecheck": "tsc"
|
||||||
|
},
|
||||||
|
"dependencies": {
|
||||||
|
"@docusaurus/core": "3.7.0",
|
||||||
|
"@docusaurus/preset-classic": "3.7.0",
|
||||||
|
"@easyops-cn/docusaurus-search-local": "^0.49.2",
|
||||||
|
"@mdx-js/react": "^3.0.0",
|
||||||
|
"clsx": "^2.0.0",
|
||||||
|
"prism-react-renderer": "^2.3.0",
|
||||||
|
"react": "^19.0.0",
|
||||||
|
"react-dom": "^19.0.0"
|
||||||
|
},
|
||||||
|
"devDependencies": {
|
||||||
|
"@docusaurus/module-type-aliases": "3.7.0",
|
||||||
|
"@docusaurus/tsconfig": "3.7.0",
|
||||||
|
"@docusaurus/types": "3.7.0",
|
||||||
|
"typescript": "~5.6.2"
|
||||||
|
},
|
||||||
|
"browserslist": {
|
||||||
|
"production": [
|
||||||
|
">0.5%",
|
||||||
|
"not dead",
|
||||||
|
"not op_mini all"
|
||||||
|
],
|
||||||
|
"development": [
|
||||||
|
"last 3 chrome version",
|
||||||
|
"last 3 firefox version",
|
||||||
|
"last 5 safari version"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"engines": {
|
||||||
|
"node": ">=18.0"
|
||||||
|
}
|
||||||
|
}
|
||||||
20
web/sidebars.ts
Normal file
@ -0,0 +1,20 @@
|
|||||||
|
import type {SidebarsConfig} from '@docusaurus/plugin-content-docs';
|
||||||
|
|
||||||
|
// This runs in Node.js - Don't use client-side code here (browser APIs, JSX...)
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creating a sidebar enables you to:
|
||||||
|
- create an ordered group of docs
|
||||||
|
- render a sidebar for each doc of that group
|
||||||
|
- provide next/previous navigation
|
||||||
|
|
||||||
|
The sidebars can be generated from the filesystem, or explicitly defined here.
|
||||||
|
|
||||||
|
Create as many sidebars as you want.
|
||||||
|
*/
|
||||||
|
|
||||||
|
// Export the combined sidebars
|
||||||
|
export default {
|
||||||
|
// The key 'documentation' is the sidebarId referenced in navbar
|
||||||
|
docs: [{type: 'autogenerated', dirName: '.'}],
|
||||||
|
};
|
||||||
71
web/src/components/HomepageFeatures/index.tsx
Normal file
@ -0,0 +1,71 @@
|
|||||||
|
import type {ReactNode} from 'react';
|
||||||
|
import clsx from 'clsx';
|
||||||
|
import Heading from '@theme/Heading';
|
||||||
|
import styles from './styles.module.css';
|
||||||
|
|
||||||
|
type FeatureItem = {
|
||||||
|
title: string;
|
||||||
|
Svg: React.ComponentType<React.ComponentProps<'svg'>>;
|
||||||
|
description: ReactNode;
|
||||||
|
};
|
||||||
|
|
||||||
|
const FeatureList: FeatureItem[] = [
|
||||||
|
{
|
||||||
|
title: 'Backup your clusters',
|
||||||
|
Svg: require('@site/static/img/undraw_going-up_g8av.svg').default,
|
||||||
|
description: (
|
||||||
|
<>
|
||||||
|
Securely backup your CloudNativePG clusters to object storage with
|
||||||
|
configurable retention policies and compression options.
|
||||||
|
</>
|
||||||
|
),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: 'Restore to any point in time',
|
||||||
|
Svg: require('@site/static/img/undraw_season-change_ohe6.svg').default,
|
||||||
|
description: (
|
||||||
|
<>
|
||||||
|
Perform flexible restores to any point in time using a combination of
|
||||||
|
base backups and WAL archives.
|
||||||
|
</>
|
||||||
|
),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: 'Cloud-native architecture',
|
||||||
|
Svg: require('@site/static/img/undraw_maintenance_rjtm.svg').default,
|
||||||
|
description: (
|
||||||
|
<>
|
||||||
|
Seamlessly integrate with all major cloud providers and on-premises object storage
|
||||||
|
solutions.
|
||||||
|
</>
|
||||||
|
),
|
||||||
|
},
|
||||||
|
];
|
||||||
|
|
||||||
|
function Feature({title, Svg, description}: FeatureItem) {
|
||||||
|
return (
|
||||||
|
<div className={clsx('col col--4')}>
|
||||||
|
<div className="text--center">
|
||||||
|
<Svg className={styles.featureSvg} role="img" />
|
||||||
|
</div>
|
||||||
|
<div className="text--center padding-horiz--md">
|
||||||
|
<Heading as="h3">{title}</Heading>
|
||||||
|
<p>{description}</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
export default function HomepageFeatures(): ReactNode {
|
||||||
|
return (
|
||||||
|
<section className={styles.features}>
|
||||||
|
<div className="container">
|
||||||
|
<div className="row">
|
||||||
|
{FeatureList.map((props, idx) => (
|
||||||
|
<Feature key={idx} {...props} />
|
||||||
|
))}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
);
|
||||||
|
}
|
||||||
11
web/src/components/HomepageFeatures/styles.module.css
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
.features {
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
padding: 2rem 0;
|
||||||
|
width: 100%;
|
||||||
|
}
|
||||||
|
|
||||||
|
.featureSvg {
|
||||||
|
height: 200px;
|
||||||
|
width: 200px;
|
||||||
|
}
|
||||||
49
web/src/css/custom.css
Normal file
@ -0,0 +1,49 @@
|
|||||||
|
/**
|
||||||
|
* Any CSS included here will be global. The classic template
|
||||||
|
* bundles Infima by default. Infima is a CSS framework designed to
|
||||||
|
* work well for content-centric websites.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* You can override the default Infima variables here. */
|
||||||
|
:root {
|
||||||
|
--ifm-color-primary: #e63054;
|
||||||
|
--ifm-color-primary-dark: #d8244a;
|
||||||
|
--ifm-color-primary-darker: #cc2044;
|
||||||
|
--ifm-color-primary-darkest: #a81a38;
|
||||||
|
--ifm-color-primary-light: #e94a6a;
|
||||||
|
--ifm-color-primary-lighter: #eb5875;
|
||||||
|
--ifm-color-primary-lightest: #f07d94;
|
||||||
|
--ifm-code-font-size: 95%;
|
||||||
|
--docusaurus-highlighted-code-line-bg: rgba(0, 0, 0, 0.1);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* For readability concerns, you should choose a lighter palette in dark mode. */
|
||||||
|
[data-theme='dark'] {
|
||||||
|
--ifm-color-primary: #ff3054;
|
||||||
|
--ifm-color-primary-dark: #ff1642;
|
||||||
|
--ifm-color-primary-darker: #ff0638;
|
||||||
|
--ifm-color-primary-darkest: #d4002d;
|
||||||
|
--ifm-color-primary-light: #ff4a66;
|
||||||
|
--ifm-color-primary-lighter: #ff5a74;
|
||||||
|
--ifm-color-primary-lightest: #ff899c;
|
||||||
|
--docusaurus-highlighted-code-line-bg: rgba(0, 0, 0, 0.3);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Configuration for the GitHub link in the header */
|
||||||
|
.header-github-link:hover {
|
||||||
|
opacity: 0.6;
|
||||||
|
}
|
||||||
|
|
||||||
|
.header-github-link:before {
|
||||||
|
content: '';
|
||||||
|
width: 24px;
|
||||||
|
height: 24px;
|
||||||
|
display: flex;
|
||||||
|
background: url("/img/github-mark.svg") no-repeat ;
|
||||||
|
background-size: 24px 24px;
|
||||||
|
}
|
||||||
|
|
||||||
|
html[data-theme='dark'] .header-github-link:before {
|
||||||
|
background: url("/img/github-mark-white.svg") no-repeat;
|
||||||
|
background-size: 24px 24px;
|
||||||
|
}
|
||||||
23
web/src/pages/index.module.css
Normal file
@ -0,0 +1,23 @@
|
|||||||
|
/**
|
||||||
|
* CSS files with the .module.css suffix will be treated as CSS modules
|
||||||
|
* and scoped locally.
|
||||||
|
*/
|
||||||
|
|
||||||
|
.heroBanner {
|
||||||
|
padding: 4rem 0;
|
||||||
|
text-align: center;
|
||||||
|
position: relative;
|
||||||
|
overflow: hidden;
|
||||||
|
}
|
||||||
|
|
||||||
|
@media screen and (max-width: 996px) {
|
||||||
|
.heroBanner {
|
||||||
|
padding: 2rem;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.buttons {
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: center;
|
||||||
|
}
|
||||||
36
web/src/pages/index.tsx
Normal file
@ -0,0 +1,36 @@
|
|||||||
|
import type {ReactNode} from 'react';
|
||||||
|
import clsx from 'clsx';
|
||||||
|
import Link from '@docusaurus/Link';
|
||||||
|
import useDocusaurusContext from '@docusaurus/useDocusaurusContext';
|
||||||
|
import Layout from '@theme/Layout';
|
||||||
|
import HomepageFeatures from '@site/src/components/HomepageFeatures';
|
||||||
|
import Heading from '@theme/Heading';
|
||||||
|
|
||||||
|
import styles from './index.module.css';
|
||||||
|
|
||||||
|
function HomepageHeader() {
|
||||||
|
const { siteConfig } = useDocusaurusContext();
|
||||||
|
return (
|
||||||
|
<header className={clsx('hero hero--primary', styles.heroBanner)}>
|
||||||
|
<div className="container">
|
||||||
|
<Heading as="h1" className="hero__title">
|
||||||
|
{siteConfig.title}
|
||||||
|
</Heading>
|
||||||
|
</div>
|
||||||
|
</header>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
export default function Home(): ReactNode {
|
||||||
|
const {siteConfig} = useDocusaurusContext();
|
||||||
|
return (
|
||||||
|
<Layout
|
||||||
|
title={`Hello from ${siteConfig.title}`}
|
||||||
|
description="Description will go into a meta tag in <head />">
|
||||||
|
<HomepageHeader />
|
||||||
|
<main>
|
||||||
|
<HomepageFeatures />
|
||||||
|
</main>
|
||||||
|
</Layout>
|
||||||
|
);
|
||||||
|
}
|
||||||
0
web/static/.nojekyll
Normal file
BIN
web/static/img/cloudnativepg-landscape-white.png
Normal file
|
After Width: | Height: | Size: 52 KiB |
BIN
web/static/img/cloudnativepg-social-card.png
Normal file
|
After Width: | Height: | Size: 292 KiB |
BIN
web/static/img/cloudnativepg.png
Normal file
|
After Width: | Height: | Size: 69 KiB |
BIN
web/static/img/favicon.ico
Normal file
|
After Width: | Height: | Size: 58 KiB |
1
web/static/img/github-mark-white.svg
Normal file
@ -0,0 +1 @@
|
|||||||
|
<svg width="98" height="96" xmlns="http://www.w3.org/2000/svg"><path fill-rule="evenodd" clip-rule="evenodd" d="M48.854 0C21.839 0 0 22 0 49.217c0 21.756 13.993 40.172 33.405 46.69 2.427.49 3.316-1.059 3.316-2.362 0-1.141-.08-5.052-.08-9.127-13.59 2.934-16.42-5.867-16.42-5.867-2.184-5.704-5.42-7.17-5.42-7.17-4.448-3.015.324-3.015.324-3.015 4.934.326 7.523 5.052 7.523 5.052 4.367 7.496 11.404 5.378 14.235 4.074.404-3.178 1.699-5.378 3.074-6.6-10.839-1.141-22.243-5.378-22.243-24.283 0-5.378 1.94-9.778 5.014-13.2-.485-1.222-2.184-6.275.486-13.038 0 0 4.125-1.304 13.426 5.052a46.97 46.97 0 0 1 12.214-1.63c4.125 0 8.33.571 12.213 1.63 9.302-6.356 13.427-5.052 13.427-5.052 2.67 6.763.97 11.816.485 13.038 3.155 3.422 5.015 7.822 5.015 13.2 0 18.905-11.404 23.06-22.324 24.283 1.78 1.548 3.316 4.481 3.316 9.126 0 6.6-.08 11.897-.08 13.526 0 1.304.89 2.853 3.316 2.364 19.412-6.52 33.405-24.935 33.405-46.691C97.707 22 75.788 0 48.854 0z" fill="#fff"/></svg>
|
||||||
|
After Width: | Height: | Size: 960 B |
1
web/static/img/github-mark.svg
Normal file
@ -0,0 +1 @@
|
|||||||
|
<svg width="98" height="96" xmlns="http://www.w3.org/2000/svg"><path fill-rule="evenodd" clip-rule="evenodd" d="M48.854 0C21.839 0 0 22 0 49.217c0 21.756 13.993 40.172 33.405 46.69 2.427.49 3.316-1.059 3.316-2.362 0-1.141-.08-5.052-.08-9.127-13.59 2.934-16.42-5.867-16.42-5.867-2.184-5.704-5.42-7.17-5.42-7.17-4.448-3.015.324-3.015.324-3.015 4.934.326 7.523 5.052 7.523 5.052 4.367 7.496 11.404 5.378 14.235 4.074.404-3.178 1.699-5.378 3.074-6.6-10.839-1.141-22.243-5.378-22.243-24.283 0-5.378 1.94-9.778 5.014-13.2-.485-1.222-2.184-6.275.486-13.038 0 0 4.125-1.304 13.426 5.052a46.97 46.97 0 0 1 12.214-1.63c4.125 0 8.33.571 12.213 1.63 9.302-6.356 13.427-5.052 13.427-5.052 2.67 6.763.97 11.816.485 13.038 3.155 3.422 5.015 7.822 5.015 13.2 0 18.905-11.404 23.06-22.324 24.283 1.78 1.548 3.316 4.481 3.316 9.126 0 6.6-.08 11.897-.08 13.526 0 1.304.89 2.853 3.316 2.364 19.412-6.52 33.405-24.935 33.405-46.691C97.707 22 75.788 0 48.854 0z" fill="#24292f"/></svg>
|
||||||
|
After Width: | Height: | Size: 963 B |
1
web/static/img/logo.svg
Normal file
|
After Width: | Height: | Size: 7.3 KiB |
1
web/static/img/undraw_going-up_g8av.svg
Normal file
|
After Width: | Height: | Size: 12 KiB |
1
web/static/img/undraw_maintenance_rjtm.svg
Normal file
|
After Width: | Height: | Size: 9.0 KiB |
1
web/static/img/undraw_season-change_ohe6.svg
Normal file
|
After Width: | Height: | Size: 6.6 KiB |
8
web/tsconfig.json
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
{
|
||||||
|
// This file is not used in compilation. It is here just for a nice editor experience.
|
||||||
|
"extends": "@docusaurus/tsconfig",
|
||||||
|
"compilerOptions": {
|
||||||
|
"baseUrl": "."
|
||||||
|
},
|
||||||
|
"exclude": [".docusaurus", "build"]
|
||||||
|
}
|
||||||
15
web/versioned_docs/version-0.3.0/welcome.md
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
---
|
||||||
|
sidebar_position: 1
|
||||||
|
sidebar_label: "Welcome"
|
||||||
|
---
|
||||||
|
|
||||||
|
# Barman Cloud CNPG-I plugin
|
||||||
|
|
||||||
|
**Status:** EXPERIMENTAL
|
||||||
|
|
||||||
|
Welcome to the documentation of the [barman-cloud](https://pgbarman.org/) CNPG-I
|
||||||
|
plugin for [CloudNativePG](https://cloudnative-pg.io/).
|
||||||
|
|
||||||
|
Documentation for version **0.3.0** of the plugin is available in the
|
||||||
|
[README](https://github.com/cloudnative-pg/plugin-barman-cloud/blob/v0.3.0/README.md)
|
||||||
|
on GitHub.
|
||||||
8
web/versioned_sidebars/version-0.3.0-sidebars.json
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
{
|
||||||
|
"docs": [
|
||||||
|
{
|
||||||
|
"type": "autogenerated",
|
||||||
|
"dirName": "."
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
3
web/versions.json
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
[
|
||||||
|
"0.3.0"
|
||||||
|
]
|
||||||