@bluedynamics/cdk8s-plone 0.1.43 → 0.1.45
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.jsii +25 -24
- package/API.md +6 -2
- package/README.md +3 -3
- package/documentation/sources/conf.py +55 -29
- package/documentation/sources/explanation/architecture.md +14 -16
- package/documentation/sources/explanation/cdk8s-workflow.md +66 -0
- package/documentation/sources/explanation/index.md +1 -27
- package/documentation/sources/how-to/backup-and-restore.md +107 -0
- package/documentation/sources/how-to/configure-env-and-secrets.md +184 -0
- package/documentation/sources/how-to/configure-ingress-tls.md +108 -0
- package/documentation/sources/how-to/configure-security-context.md +0 -5
- package/documentation/sources/how-to/deploy-blicca.md +8 -8
- package/documentation/sources/how-to/{deploy-production-volto.md → deploy-volto.md} +20 -25
- package/documentation/sources/how-to/deploy-with-httpcache.md +224 -0
- package/documentation/sources/how-to/deploy-with-vinyl-cache.md +0 -5
- package/documentation/sources/how-to/enable-prometheus-monitoring.md +4 -5
- package/documentation/sources/how-to/index.md +15 -8
- package/documentation/sources/how-to/scale-and-high-availability.md +122 -0
- package/documentation/sources/how-to/schedule-pods.md +0 -5
- package/documentation/sources/how-to/troubleshooting.md +113 -0
- package/documentation/sources/how-to/upgrade-and-rollout.md +89 -0
- package/documentation/sources/index.md +3 -11
- package/documentation/sources/reference/api/index.md +6 -4
- package/documentation/sources/reference/configuration-options.md +85 -516
- package/documentation/sources/reference/index.md +16 -43
- package/documentation/sources/tutorials/01-quick-start.md +1 -1
- package/documentation/sources/tutorials/index.md +7 -11
- package/examples/blicca/.env.example +3 -2
- package/examples/blicca/README.md +21 -24
- package/examples/blicca/__snapshots__/main.test.ts.snap +138 -345
- package/examples/blicca/main.test.ts +7 -0
- package/examples/blicca/main.ts +8 -7
- package/examples/blicca/postgres.plain.ts +115 -0
- package/examples/blicca/tsconfig.json +33 -0
- package/examples/{production-volto → volto}/.env.example +3 -2
- package/examples/{production-volto → volto}/README.md +20 -23
- package/examples/{production-volto → volto}/__snapshots__/main.test.ts.snap +139 -345
- package/examples/{production-volto → volto}/main.test.ts +7 -0
- package/examples/{production-volto → volto}/main.ts +8 -7
- package/examples/{production-volto → volto}/package.json +1 -1
- package/examples/volto/postgres.plain.ts +115 -0
- package/examples/volto/tsconfig.json +33 -0
- package/lib/httpcache.js +1 -1
- package/lib/imports/vinyl.bluedynamics.eu.d.ts +4011 -53
- package/lib/imports/vinyl.bluedynamics.eu.js +1786 -157
- package/lib/plone.js +1 -1
- package/lib/vinylcache.d.ts +3 -1
- package/lib/vinylcache.js +3 -2
- package/package.json +6 -6
- package/documentation/sources/_static/brand-theme.css +0 -685
- package/documentation/sources/_static/custom-icons.css +0 -123
- package/documentation/sources/_static/fonts/hack/Hack-Regular.woff2 +0 -0
- package/documentation/sources/_static/fonts/orbitron/Orbitron-Black.woff2 +0 -11
- package/documentation/sources/_static/fonts/orbitron/Orbitron-Bold.woff2 +0 -11
- package/documentation/sources/_static/fonts/orbitron/Orbitron-Regular.woff2 +0 -0
- package/documentation/sources/_static/fonts/rajdhani/Rajdhani-Bold.woff2 +0 -11
- package/documentation/sources/_static/fonts/rajdhani/Rajdhani-Medium.woff2 +0 -11
- package/documentation/sources/_static/fonts/rajdhani/Rajdhani-Regular.woff2 +0 -11
- package/documentation/sources/_static/fonts/rajdhani/Rajdhani-SemiBold.woff2 +0 -11
- package/documentation/sources/_static/kup6s-icon-explanation.svg +0 -32
- package/documentation/sources/_static/kup6s-icon-howto.svg +0 -34
- package/documentation/sources/_static/kup6s-icon-reference.svg +0 -34
- package/documentation/sources/_static/kup6s-icon-tutorials.svg +0 -30
- package/documentation/sources/_static/logo-fix.js +0 -12
- package/documentation/sources/reference/api/.gitkeep +0 -1
- package/examples/blicca/postgres.bitnami.ts +0 -49
- package/examples/production-volto/postgres.bitnami.ts +0 -49
- /package/documentation/sources/_static/{kup6s-icon-plone.svg → logo.svg} +0 -0
- /package/examples/{production-volto → volto}/cdk8s.yaml +0 -0
- /package/examples/{production-volto → volto}/config/varnish.tpl.vcl +0 -0
- /package/examples/{production-volto → volto}/ingress.ts +0 -0
- /package/examples/{production-volto → volto}/jest.config.js +0 -0
- /package/examples/{production-volto → volto}/postgres.cloudnativepg.ts +0 -0
package/.jsii
CHANGED
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
]
|
|
8
8
|
},
|
|
9
9
|
"dependencies": {
|
|
10
|
-
"cdk8s": "^2.70.
|
|
10
|
+
"cdk8s": "^2.70.82",
|
|
11
11
|
"cdk8s-plus-30": "^2.4.10",
|
|
12
12
|
"constructs": "^10.4.2"
|
|
13
13
|
},
|
|
@@ -108,7 +108,7 @@
|
|
|
108
108
|
},
|
|
109
109
|
"name": "@bluedynamics/cdk8s-plone",
|
|
110
110
|
"readme": {
|
|
111
|
-
"markdown": "# CDK8S Plone\n\n> TypeScript and Python library for deploying Plone CMS to Kubernetes using CDK8S\n\n[](https://www.npmjs.com/package/@bluedynamics/cdk8s-plone)\n[](https://pypi.org/project/cdk8s-plone/)\n[](LICENSE)\n\n## Overview\n\ncdk8s-plone provides CDK8S constructs for deploying [Plone CMS](https://plone.org/) on Kubernetes. Define your infrastructure using TypeScript or Python and generate Kubernetes manifests automatically.\n\n**Key Features:**\n- 🚀 Supports Volto (React frontend) and Blicca (formerly Classic UI)\n- 📦 High availability with configurable replicas\n- ⚡ Optional Varnish HTTP caching via kube-httpcache (`PloneHttpcache`) or cloud-vinyl VinylCache operator (`PloneVinylCache`)\n- 🔧 Fine-grained resource and probe configuration\n- 🌍 Multi-language support (TypeScript/JavaScript and Python)\n- ✅ Type-safe infrastructure as code\n\n## Quick Start\n\n### Installation\n\n**TypeScript/JavaScript:**\n```bash\nnpm install @bluedynamics/cdk8s-plone\n```\n\n**Python:**\n```bash\npip install cdk8s-plone\n```\n\n### Basic Example\n\n```typescript\nimport { App, Chart } from 'cdk8s';\nimport { Plone, PloneVariant } from '@bluedynamics/cdk8s-plone';\n\nconst app = new App();\nconst chart = new Chart(app, 'PloneDeployment');\n\nnew Plone(chart, 'my-plone', {\n variant: PloneVariant.VOLTO,\n backend: {\n image: 'plone/plone-backend:6.1.3',\n replicas: 3,\n },\n frontend: {\n image: 'plone/plone-frontend:16.0.0',\n replicas: 2,\n },\n});\n\napp.synth();\n```\n\nGenerate Kubernetes manifests:\n```bash\ncdk8s synth\nkubectl apply -f dist/\n```\n\n## Documentation\n\n**📚 Full documentation:** https://bluedynamics.github.io/cdk8s-plone/\n\n- [Quick Start Tutorial](https://bluedynamics.github.io/cdk8s-plone/tutorials/01-quick-start.html)\n- [Configuration Reference](https://bluedynamics.github.io/cdk8s-plone/reference/configuration-options.html)\n- [Architecture Overview](https://bluedynamics.github.io/cdk8s-plone/explanation/architecture.html)\n- [Complete API Documentation](./API.md)\n\n## Examples\n\nComplete working examples are available in the [`examples/`](examples/) directory:\n\n- **[
|
|
111
|
+
"markdown": "# CDK8S Plone\n\n> TypeScript and Python library for deploying Plone CMS to Kubernetes using CDK8S\n\n[](https://www.npmjs.com/package/@bluedynamics/cdk8s-plone)\n[](https://pypi.org/project/cdk8s-plone/)\n[](LICENSE)\n\n## Overview\n\ncdk8s-plone provides CDK8S constructs for deploying [Plone CMS](https://plone.org/) on Kubernetes. Define your infrastructure using TypeScript or Python and generate Kubernetes manifests automatically.\n\n**Key Features:**\n- 🚀 Supports Volto (React frontend) and Blicca (formerly Classic UI)\n- 📦 High availability with configurable replicas\n- ⚡ Optional Varnish HTTP caching via kube-httpcache (`PloneHttpcache`) or cloud-vinyl VinylCache operator (`PloneVinylCache`)\n- 🔧 Fine-grained resource and probe configuration\n- 🌍 Multi-language support (TypeScript/JavaScript and Python)\n- ✅ Type-safe infrastructure as code\n\n## Quick Start\n\n### Installation\n\n**TypeScript/JavaScript:**\n```bash\nnpm install @bluedynamics/cdk8s-plone\n```\n\n**Python:**\n```bash\npip install cdk8s-plone\n```\n\n### Basic Example\n\n```typescript\nimport { App, Chart } from 'cdk8s';\nimport { Plone, PloneVariant } from '@bluedynamics/cdk8s-plone';\n\nconst app = new App();\nconst chart = new Chart(app, 'PloneDeployment');\n\nnew Plone(chart, 'my-plone', {\n variant: PloneVariant.VOLTO,\n backend: {\n image: 'plone/plone-backend:6.1.3',\n replicas: 3,\n },\n frontend: {\n image: 'plone/plone-frontend:16.0.0',\n replicas: 2,\n },\n});\n\napp.synth();\n```\n\nGenerate Kubernetes manifests:\n```bash\ncdk8s synth\nkubectl apply -f dist/\n```\n\n## Documentation\n\n**📚 Full documentation:** https://bluedynamics.github.io/cdk8s-plone/\n\n- [Quick Start Tutorial](https://bluedynamics.github.io/cdk8s-plone/tutorials/01-quick-start.html)\n- [Configuration Reference](https://bluedynamics.github.io/cdk8s-plone/reference/configuration-options.html)\n- [Architecture Overview](https://bluedynamics.github.io/cdk8s-plone/explanation/architecture.html)\n- [Complete API Documentation](./API.md)\n\n## Examples\n\nComplete working examples are available in the [`examples/`](examples/) directory:\n\n- **[Volto](examples/volto/)** - Production-ready Plone 6 deployment with the React single-page frontend:\n - Volto frontend (React) + REST API backend\n - PostgreSQL with RelStorage (plain PostgreSQL or CloudNativePG)\n - Varnish HTTP caching with kube-httpcache\n - Ingress support (Traefik/Kong) with TLS\n\n- **[Blicca](examples/blicca/)** - Plone deployment with server-side rendering (formerly Classic UI):\n - Blicca (backend renders the UI, no separate frontend)\n - PostgreSQL with RelStorage (plain PostgreSQL or CloudNativePG)\n - Varnish HTTP caching with kube-httpcache\n - Ingress support (Traefik/Kong) with TLS\n - Simpler architecture (no separate frontend)\n\n### Prometheus Metrics\n\nEnable Prometheus ServiceMonitor for metrics collection (requires Prometheus Operator):\n\n```typescript\nnew Plone(chart, 'my-plone', {\n backend: {\n servicemonitor: true,\n metricsPath: '/metrics', // optional, defaults to '/metrics'\n },\n frontend: {\n servicemonitor: true,\n metricsPort: 9090, // optional, defaults to service port\n },\n});\n```\n\n**Note:** You must instrument your Plone backend/frontend to expose metrics at the configured endpoint. For Volto/Node.js frontends, consider using [prom-client](https://www.npmjs.com/package/prom-client) or [express-prometheus-middleware](https://www.npmjs.com/package/express-prometheus-middleware).\n\n## Requirements\n- **kubectl** - [Install kubectl](https://kubernetes.io/docs/tasks/tools/#kubectl)\n- **Node.js 16+** (for TypeScript/JavaScript) - [Install Node.js](https://nodejs.org/)\n- **Python 3.8+** (for Python) - [Install Python](https://www.python.org/)\n- **Kubernetes cluster** (local or cloud)\n\nFor detailed setup instructions, see [Setup Prerequisites](https://bluedynamics.github.io/cdk8s-plone/how-to/setup-prerequisites.html).\n\n## Development\n\nThis project uses [Projen](https://projen.io/) for project management.\n\n```bash\n# Install dependencies\nnpm install\n\n# Run tests\nnpm test\n\n# Build\nnpm run build\n\n# Update project configuration\n# Edit .projenrc.ts, then run:\nnpx projen\n```\n\nFor detailed development instructions, see [CONTRIBUTING.md](./CONTRIBUTING.md) (if available).\n\n## Resources\n\n- [CDK8S Documentation](https://cdk8s.io/)\n- [Plone CMS](https://plone.org/)\n- [kube-httpcache](https://github.com/mittwald/kube-httpcache) (for HTTP caching)\n- [CloudNativePG](https://cloudnative-pg.io/) (for PostgreSQL management)\n\n## License\n\n[Apache 2.0](LICENSE)\n\n## Maintainers\n\nMaintained by [Blue Dynamics Alliance](https://github.com/bluedynamics)\n\n**Author:** Jens W. Klein (jk@kleinundpartner.at)\n"
|
|
112
112
|
},
|
|
113
113
|
"repository": {
|
|
114
114
|
"type": "git",
|
|
@@ -2036,7 +2036,7 @@
|
|
|
2036
2036
|
},
|
|
2037
2037
|
"locationInModule": {
|
|
2038
2038
|
"filename": "src/vinylcache.ts",
|
|
2039
|
-
"line":
|
|
2039
|
+
"line": 405
|
|
2040
2040
|
},
|
|
2041
2041
|
"parameters": [
|
|
2042
2042
|
{
|
|
@@ -2062,7 +2062,7 @@
|
|
|
2062
2062
|
"kind": "class",
|
|
2063
2063
|
"locationInModule": {
|
|
2064
2064
|
"filename": "src/vinylcache.ts",
|
|
2065
|
-
"line":
|
|
2065
|
+
"line": 398
|
|
2066
2066
|
},
|
|
2067
2067
|
"name": "PloneVinylCache",
|
|
2068
2068
|
"properties": [
|
|
@@ -2075,7 +2075,7 @@
|
|
|
2075
2075
|
"immutable": true,
|
|
2076
2076
|
"locationInModule": {
|
|
2077
2077
|
"filename": "src/vinylcache.ts",
|
|
2078
|
-
"line":
|
|
2078
|
+
"line": 403
|
|
2079
2079
|
},
|
|
2080
2080
|
"name": "vinylCacheServiceName",
|
|
2081
2081
|
"type": {
|
|
@@ -2170,7 +2170,7 @@
|
|
|
2170
2170
|
"immutable": true,
|
|
2171
2171
|
"locationInModule": {
|
|
2172
2172
|
"filename": "src/vinylcache.ts",
|
|
2173
|
-
"line":
|
|
2173
|
+
"line": 293
|
|
2174
2174
|
},
|
|
2175
2175
|
"name": "image",
|
|
2176
2176
|
"optional": true,
|
|
@@ -2236,13 +2236,14 @@
|
|
|
2236
2236
|
"abstract": true,
|
|
2237
2237
|
"docs": {
|
|
2238
2238
|
"default": "false",
|
|
2239
|
+
"remarks": "When true this turns on operator metrics,\na ServiceMonitor, and the prometheus_varnish_exporter sidecar (required\nfor cache hit-ratio and backend-health metrics).",
|
|
2239
2240
|
"stability": "stable",
|
|
2240
|
-
"summary": "Enable Prometheus monitoring
|
|
2241
|
+
"summary": "Enable Prometheus monitoring."
|
|
2241
2242
|
},
|
|
2242
2243
|
"immutable": true,
|
|
2243
2244
|
"locationInModule": {
|
|
2244
2245
|
"filename": "src/vinylcache.ts",
|
|
2245
|
-
"line":
|
|
2246
|
+
"line": 287
|
|
2246
2247
|
},
|
|
2247
2248
|
"name": "monitoring",
|
|
2248
2249
|
"optional": true,
|
|
@@ -2261,7 +2262,7 @@
|
|
|
2261
2262
|
"immutable": true,
|
|
2262
2263
|
"locationInModule": {
|
|
2263
2264
|
"filename": "src/vinylcache.ts",
|
|
2264
|
-
"line":
|
|
2265
|
+
"line": 306
|
|
2265
2266
|
},
|
|
2266
2267
|
"name": "nodeSelector",
|
|
2267
2268
|
"optional": true,
|
|
@@ -2439,7 +2440,7 @@
|
|
|
2439
2440
|
"immutable": true,
|
|
2440
2441
|
"locationInModule": {
|
|
2441
2442
|
"filename": "src/vinylcache.ts",
|
|
2442
|
-
"line":
|
|
2443
|
+
"line": 299
|
|
2443
2444
|
},
|
|
2444
2445
|
"name": "tolerations",
|
|
2445
2446
|
"optional": true,
|
|
@@ -2462,7 +2463,7 @@
|
|
|
2462
2463
|
"immutable": true,
|
|
2463
2464
|
"locationInModule": {
|
|
2464
2465
|
"filename": "src/vinylcache.ts",
|
|
2465
|
-
"line":
|
|
2466
|
+
"line": 378
|
|
2466
2467
|
},
|
|
2467
2468
|
"name": "vclBackendErrorSnippet",
|
|
2468
2469
|
"optional": true,
|
|
@@ -2480,7 +2481,7 @@
|
|
|
2480
2481
|
"immutable": true,
|
|
2481
2482
|
"locationInModule": {
|
|
2482
2483
|
"filename": "src/vinylcache.ts",
|
|
2483
|
-
"line":
|
|
2484
|
+
"line": 372
|
|
2484
2485
|
},
|
|
2485
2486
|
"name": "vclBackendFetchSnippet",
|
|
2486
2487
|
"optional": true,
|
|
@@ -2517,7 +2518,7 @@
|
|
|
2517
2518
|
"immutable": true,
|
|
2518
2519
|
"locationInModule": {
|
|
2519
2520
|
"filename": "src/vinylcache.ts",
|
|
2520
|
-
"line":
|
|
2521
|
+
"line": 312
|
|
2521
2522
|
},
|
|
2522
2523
|
"name": "vclDeliverSnippet",
|
|
2523
2524
|
"optional": true,
|
|
@@ -2535,7 +2536,7 @@
|
|
|
2535
2536
|
"immutable": true,
|
|
2536
2537
|
"locationInModule": {
|
|
2537
2538
|
"filename": "src/vinylcache.ts",
|
|
2538
|
-
"line":
|
|
2539
|
+
"line": 366
|
|
2539
2540
|
},
|
|
2540
2541
|
"name": "vclFiniSnippet",
|
|
2541
2542
|
"optional": true,
|
|
@@ -2553,7 +2554,7 @@
|
|
|
2553
2554
|
"immutable": true,
|
|
2554
2555
|
"locationInModule": {
|
|
2555
2556
|
"filename": "src/vinylcache.ts",
|
|
2556
|
-
"line":
|
|
2557
|
+
"line": 354
|
|
2557
2558
|
},
|
|
2558
2559
|
"name": "vclHashSnippet",
|
|
2559
2560
|
"optional": true,
|
|
@@ -2571,7 +2572,7 @@
|
|
|
2571
2572
|
"immutable": true,
|
|
2572
2573
|
"locationInModule": {
|
|
2573
2574
|
"filename": "src/vinylcache.ts",
|
|
2574
|
-
"line":
|
|
2575
|
+
"line": 318
|
|
2575
2576
|
},
|
|
2576
2577
|
"name": "vclHitSnippet",
|
|
2577
2578
|
"optional": true,
|
|
@@ -2589,7 +2590,7 @@
|
|
|
2589
2590
|
"immutable": true,
|
|
2590
2591
|
"locationInModule": {
|
|
2591
2592
|
"filename": "src/vinylcache.ts",
|
|
2592
|
-
"line":
|
|
2593
|
+
"line": 360
|
|
2593
2594
|
},
|
|
2594
2595
|
"name": "vclInitSnippet",
|
|
2595
2596
|
"optional": true,
|
|
@@ -2607,7 +2608,7 @@
|
|
|
2607
2608
|
"immutable": true,
|
|
2608
2609
|
"locationInModule": {
|
|
2609
2610
|
"filename": "src/vinylcache.ts",
|
|
2610
|
-
"line":
|
|
2611
|
+
"line": 324
|
|
2611
2612
|
},
|
|
2612
2613
|
"name": "vclMissSnippet",
|
|
2613
2614
|
"optional": true,
|
|
@@ -2625,7 +2626,7 @@
|
|
|
2625
2626
|
"immutable": true,
|
|
2626
2627
|
"locationInModule": {
|
|
2627
2628
|
"filename": "src/vinylcache.ts",
|
|
2628
|
-
"line":
|
|
2629
|
+
"line": 330
|
|
2629
2630
|
},
|
|
2630
2631
|
"name": "vclPassSnippet",
|
|
2631
2632
|
"optional": true,
|
|
@@ -2643,7 +2644,7 @@
|
|
|
2643
2644
|
"immutable": true,
|
|
2644
2645
|
"locationInModule": {
|
|
2645
2646
|
"filename": "src/vinylcache.ts",
|
|
2646
|
-
"line":
|
|
2647
|
+
"line": 336
|
|
2647
2648
|
},
|
|
2648
2649
|
"name": "vclPipeSnippet",
|
|
2649
2650
|
"optional": true,
|
|
@@ -2661,7 +2662,7 @@
|
|
|
2661
2662
|
"immutable": true,
|
|
2662
2663
|
"locationInModule": {
|
|
2663
2664
|
"filename": "src/vinylcache.ts",
|
|
2664
|
-
"line":
|
|
2665
|
+
"line": 348
|
|
2665
2666
|
},
|
|
2666
2667
|
"name": "vclPurgeSnippet",
|
|
2667
2668
|
"optional": true,
|
|
@@ -2698,7 +2699,7 @@
|
|
|
2698
2699
|
"immutable": true,
|
|
2699
2700
|
"locationInModule": {
|
|
2700
2701
|
"filename": "src/vinylcache.ts",
|
|
2701
|
-
"line":
|
|
2702
|
+
"line": 342
|
|
2702
2703
|
},
|
|
2703
2704
|
"name": "vclSynthSnippet",
|
|
2704
2705
|
"optional": true,
|
|
@@ -3118,6 +3119,6 @@
|
|
|
3118
3119
|
"symbolId": "src/vinylcache:VinylCacheToleration"
|
|
3119
3120
|
}
|
|
3120
3121
|
},
|
|
3121
|
-
"version": "0.1.
|
|
3122
|
-
"fingerprint": "
|
|
3122
|
+
"version": "0.1.45",
|
|
3123
|
+
"fingerprint": "mBEQ2jnl2myvLvZ/h7T7aPtv4ozEnU3u4Xp37uWCh0U="
|
|
3123
3124
|
}
|
package/API.md
CHANGED
|
@@ -1992,7 +1992,7 @@ const ploneVinylCacheOptions: PloneVinylCacheOptions = { ... }
|
|
|
1992
1992
|
| <code><a href="#@bluedynamics/cdk8s-plone.PloneVinylCacheOptions.property.invalidation">invalidation</a></code> | <code>boolean</code> | Enable cache invalidation (PURGE, BAN, xkey). |
|
|
1993
1993
|
| <code><a href="#@bluedynamics/cdk8s-plone.PloneVinylCacheOptions.property.limitCpu">limitCpu</a></code> | <code>string</code> | CPU limit for Varnish pods. |
|
|
1994
1994
|
| <code><a href="#@bluedynamics/cdk8s-plone.PloneVinylCacheOptions.property.limitMemory">limitMemory</a></code> | <code>string</code> | Memory limit for Varnish pods. |
|
|
1995
|
-
| <code><a href="#@bluedynamics/cdk8s-plone.PloneVinylCacheOptions.property.monitoring">monitoring</a></code> | <code>boolean</code> | Enable Prometheus monitoring
|
|
1995
|
+
| <code><a href="#@bluedynamics/cdk8s-plone.PloneVinylCacheOptions.property.monitoring">monitoring</a></code> | <code>boolean</code> | Enable Prometheus monitoring. |
|
|
1996
1996
|
| <code><a href="#@bluedynamics/cdk8s-plone.PloneVinylCacheOptions.property.nodeSelector">nodeSelector</a></code> | <code>{[ key: string ]: string}</code> | Node selector labels for the Varnish pods. |
|
|
1997
1997
|
| <code><a href="#@bluedynamics/cdk8s-plone.PloneVinylCacheOptions.property.replicas">replicas</a></code> | <code>number</code> | Number of Varnish pod replicas. |
|
|
1998
1998
|
| <code><a href="#@bluedynamics/cdk8s-plone.PloneVinylCacheOptions.property.requestCpu">requestCpu</a></code> | <code>string</code> | CPU request for Varnish pods. |
|
|
@@ -2123,7 +2123,11 @@ public readonly monitoring: boolean;
|
|
|
2123
2123
|
- *Type:* boolean
|
|
2124
2124
|
- *Default:* false
|
|
2125
2125
|
|
|
2126
|
-
Enable Prometheus monitoring
|
|
2126
|
+
Enable Prometheus monitoring.
|
|
2127
|
+
|
|
2128
|
+
When true this turns on operator metrics,
|
|
2129
|
+
a ServiceMonitor, and the prometheus_varnish_exporter sidecar (required
|
|
2130
|
+
for cache hit-ratio and backend-health metrics).
|
|
2127
2131
|
|
|
2128
2132
|
---
|
|
2129
2133
|
|
package/README.md
CHANGED
|
@@ -75,15 +75,15 @@ kubectl apply -f dist/
|
|
|
75
75
|
|
|
76
76
|
Complete working examples are available in the [`examples/`](examples/) directory:
|
|
77
77
|
|
|
78
|
-
- **[
|
|
78
|
+
- **[Volto](examples/volto/)** - Production-ready Plone 6 deployment with the React single-page frontend:
|
|
79
79
|
- Volto frontend (React) + REST API backend
|
|
80
|
-
- PostgreSQL with RelStorage (
|
|
80
|
+
- PostgreSQL with RelStorage (plain PostgreSQL or CloudNativePG)
|
|
81
81
|
- Varnish HTTP caching with kube-httpcache
|
|
82
82
|
- Ingress support (Traefik/Kong) with TLS
|
|
83
83
|
|
|
84
84
|
- **[Blicca](examples/blicca/)** - Plone deployment with server-side rendering (formerly Classic UI):
|
|
85
85
|
- Blicca (backend renders the UI, no separate frontend)
|
|
86
|
-
- PostgreSQL with RelStorage (
|
|
86
|
+
- PostgreSQL with RelStorage (plain PostgreSQL or CloudNativePG)
|
|
87
87
|
- Varnish HTTP caching with kube-httpcache
|
|
88
88
|
- Ingress support (Traefik/Kong) with TLS
|
|
89
89
|
- Simpler architecture (no separate frontend)
|
|
@@ -77,43 +77,69 @@ mermaid_output_format = "raw" # Use client-side rendering with mermaid.js
|
|
|
77
77
|
# This makes absolute paths in logo_target work correctly with path prefix
|
|
78
78
|
html_baseurl = "https://bluedynamics.github.io/cdk8s-plone"
|
|
79
79
|
|
|
80
|
-
# The theme to use for HTML and HTML Help pages.
|
|
81
|
-
#
|
|
82
|
-
#
|
|
80
|
+
# The theme to use for HTML and HTML Help pages.
|
|
81
|
+
# Shibuya, matching the rest of the Cloudbrine ecosystem.
|
|
83
82
|
html_theme = "shibuya"
|
|
84
83
|
|
|
85
84
|
html_theme_options = {
|
|
86
|
-
|
|
87
|
-
"logo_target": "/",
|
|
88
|
-
|
|
89
|
-
# Color scheme - using cyan from brand palette (#00d4ff)
|
|
85
|
+
"logo_target": "/cdk8s-plone/",
|
|
90
86
|
"accent_color": "cyan",
|
|
91
|
-
|
|
92
|
-
# Color mode - force dark mode (brand is dark-first cyberpunk aesthetic)
|
|
93
87
|
"color_mode": "dark",
|
|
94
|
-
|
|
95
|
-
# Dark code blocks
|
|
96
88
|
"dark_code": True,
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
89
|
+
"nav_links": [
|
|
90
|
+
{
|
|
91
|
+
"title": "Ecosystem",
|
|
92
|
+
"url": "https://bluedynamics.github.io/zodb-pgjsonb/ecosystem.html",
|
|
93
|
+
"children": [
|
|
94
|
+
{
|
|
95
|
+
"title": "Dashboard",
|
|
96
|
+
"url": "https://bluedynamics.github.io/zodb-pgjsonb/ecosystem.html",
|
|
97
|
+
"summary": "Overview of all packages",
|
|
98
|
+
},
|
|
99
|
+
{
|
|
100
|
+
"title": "zodb-pgjsonb",
|
|
101
|
+
"url": "https://bluedynamics.github.io/zodb-pgjsonb/",
|
|
102
|
+
"summary": "PostgreSQL JSONB storage",
|
|
103
|
+
},
|
|
104
|
+
{
|
|
105
|
+
"title": "zodb-json-codec",
|
|
106
|
+
"url": "https://bluedynamics.github.io/zodb-json-codec/",
|
|
107
|
+
"summary": "Rust pickle↔JSON transcoder",
|
|
108
|
+
},
|
|
109
|
+
{
|
|
110
|
+
"title": "plone-pgcatalog",
|
|
111
|
+
"url": "https://bluedynamics.github.io/plone-pgcatalog/",
|
|
112
|
+
"summary": "PostgreSQL-backed catalog",
|
|
113
|
+
},
|
|
114
|
+
{
|
|
115
|
+
"title": "plone-pgthumbor",
|
|
116
|
+
"url": "https://bluedynamics.github.io/plone-pgthumbor/",
|
|
117
|
+
"summary": "Thumbor image scaling",
|
|
118
|
+
},
|
|
119
|
+
{
|
|
120
|
+
"title": "cdk8s-plone",
|
|
121
|
+
"url": "https://bluedynamics.github.io/cdk8s-plone/",
|
|
122
|
+
"summary": "Deploy Plone to Kubernetes",
|
|
123
|
+
},
|
|
124
|
+
],
|
|
125
|
+
},
|
|
126
|
+
{
|
|
127
|
+
"title": "GitHub",
|
|
128
|
+
"url": "https://github.com/bluedynamics/cdk8s-plone",
|
|
129
|
+
},
|
|
130
|
+
{
|
|
131
|
+
"title": "PyPI",
|
|
132
|
+
"url": "https://pypi.org/project/cdk8s-plone/",
|
|
133
|
+
},
|
|
134
|
+
{
|
|
135
|
+
"title": "npm",
|
|
136
|
+
"url": "https://www.npmjs.com/package/@bluedynamics/cdk8s-plone",
|
|
137
|
+
},
|
|
138
|
+
],
|
|
100
139
|
}
|
|
101
140
|
|
|
102
|
-
|
|
103
|
-
html_logo = "_static/kup6s-icon-plone.svg"
|
|
141
|
+
html_logo = "_static/logo.svg"
|
|
104
142
|
|
|
105
143
|
# Add any paths that contain custom static files (such as style sheets) here,
|
|
106
|
-
# relative to this directory.
|
|
107
|
-
# so a file named "default.css" will overwrite the builtin "default.css".
|
|
144
|
+
# relative to this directory.
|
|
108
145
|
html_static_path = ["_static"]
|
|
109
|
-
|
|
110
|
-
# Custom CSS files
|
|
111
|
-
html_css_files = [
|
|
112
|
-
"brand-theme.css", # Main brand theme (includes fonts, colors, cyberpunk design, icons)
|
|
113
|
-
"custom-icons.css", # Custom icon styling for section headers
|
|
114
|
-
]
|
|
115
|
-
|
|
116
|
-
# Custom JavaScript files
|
|
117
|
-
html_js_files = [
|
|
118
|
-
"logo-fix.js", # Fix logo link for path prefix deployment
|
|
119
|
-
]
|
|
@@ -103,35 +103,35 @@ The library is published in multiple languages:
|
|
|
103
103
|
|
|
104
104
|
```mermaid
|
|
105
105
|
graph TB
|
|
106
|
-
subgraph "External
|
|
107
|
-
Client[Client/Browser]
|
|
106
|
+
subgraph "External access"
|
|
107
|
+
Client[Client / Browser]
|
|
108
108
|
Ingress[Ingress Controller]
|
|
109
109
|
end
|
|
110
110
|
|
|
111
|
-
subgraph "
|
|
112
|
-
Varnish[Varnish
|
|
111
|
+
subgraph "Cache layer (optional)"
|
|
112
|
+
Varnish[Varnish<br/>PloneHttpcache or PloneVinylCache]
|
|
113
113
|
end
|
|
114
114
|
|
|
115
|
-
subgraph "
|
|
115
|
+
subgraph "Frontend (Volto variant only)"
|
|
116
116
|
FrontendSvc[Frontend Service]
|
|
117
|
-
Frontend1[Frontend Pod
|
|
118
|
-
Frontend2[Frontend Pod
|
|
117
|
+
Frontend1[Frontend Pod]
|
|
118
|
+
Frontend2[Frontend Pod]
|
|
119
119
|
end
|
|
120
120
|
|
|
121
|
-
subgraph "
|
|
121
|
+
subgraph "Backend (REST API for Volto, HTML for Blicca)"
|
|
122
122
|
BackendSvc[Backend Service]
|
|
123
|
-
Backend1[Backend Pod
|
|
124
|
-
Backend2[Backend Pod
|
|
125
|
-
Backend3[Backend Pod 3]
|
|
123
|
+
Backend1[Backend Pod]
|
|
124
|
+
Backend2[Backend Pod]
|
|
126
125
|
end
|
|
127
126
|
|
|
128
|
-
subgraph "Data
|
|
129
|
-
DB[(
|
|
127
|
+
subgraph "Data layer"
|
|
128
|
+
DB[(PostgreSQL<br/>with RelStorage)]
|
|
130
129
|
end
|
|
131
130
|
|
|
132
131
|
Client --> Ingress
|
|
133
132
|
Ingress --> Varnish
|
|
134
|
-
Varnish -.cache miss.-> FrontendSvc
|
|
133
|
+
Varnish -.Volto: cache miss.-> FrontendSvc
|
|
134
|
+
Varnish -.Blicca: cache miss.-> BackendSvc
|
|
135
135
|
Varnish -.invalidation.-> BackendSvc
|
|
136
136
|
|
|
137
137
|
FrontendSvc --> Frontend1
|
|
@@ -142,11 +142,9 @@ graph TB
|
|
|
142
142
|
|
|
143
143
|
BackendSvc --> Backend1
|
|
144
144
|
BackendSvc --> Backend2
|
|
145
|
-
BackendSvc --> Backend3
|
|
146
145
|
|
|
147
146
|
Backend1 --> DB
|
|
148
147
|
Backend2 --> DB
|
|
149
|
-
Backend3 --> DB
|
|
150
148
|
```
|
|
151
149
|
|
|
152
150
|
## Component responsibilities
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
---
|
|
2
|
+
myst:
|
|
3
|
+
html_meta:
|
|
4
|
+
"description": "How cdk8s-plone fits into the cdk8s workflow: constructs, synthesis to Kubernetes manifests, and applying them by hand or through GitOps."
|
|
5
|
+
"property=og:description": "How cdk8s-plone fits into the cdk8s workflow: constructs, synthesis to Kubernetes manifests, and applying them by hand or through GitOps."
|
|
6
|
+
"property=og:title": "About the cdk8s workflow"
|
|
7
|
+
"keywords": "Plone, cdk8s, Kubernetes, synth, constructs, GitOps, ArgoCD, Helm"
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
# About the cdk8s workflow
|
|
11
|
+
|
|
12
|
+
This page explains where `cdk8s-plone` sits in the cdk8s workflow and why that workflow looks the way it does.
|
|
13
|
+
It is background reading, not a set of steps; for the steps, see {doc}`/tutorials/01-quick-start`.
|
|
14
|
+
|
|
15
|
+
## Code, synth, apply
|
|
16
|
+
|
|
17
|
+
[cdk8s](https://cdk8s.io/) is a framework for defining Kubernetes resources in a general-purpose programming language.
|
|
18
|
+
You write TypeScript or Python that constructs objects, run a synthesis step, and get plain Kubernetes YAML.
|
|
19
|
+
Nothing about cdk8s talks to a cluster: it is a manifest generator.
|
|
20
|
+
|
|
21
|
+
The workflow has three distinct phases, and keeping them apart explains most of how cdk8s-plone behaves.
|
|
22
|
+
First you write code that instantiates constructs inside an `App` and one or more `Chart` objects.
|
|
23
|
+
Then you run `cdk8s synth`, which evaluates that code and writes Kubernetes manifests into the `dist/` directory.
|
|
24
|
+
Finally you apply those manifests to a cluster, either with `kubectl apply` or through a GitOps controller.
|
|
25
|
+
|
|
26
|
+
The separation matters because the manifests are an ordinary, reviewable artifact.
|
|
27
|
+
You can read the YAML, diff it across changes, and run policy checks on it before anything reaches the cluster.
|
|
28
|
+
|
|
29
|
+
## Where cdk8s-plone fits
|
|
30
|
+
|
|
31
|
+
`cdk8s-plone` is a construct library, not an application you run.
|
|
32
|
+
You compose its constructs, mainly `Plone` and one of the cache constructs, inside your own cdk8s app.
|
|
33
|
+
A construct is a reusable building block: `Plone` expands into the Deployments, Services, and optional PodDisruptionBudget and ServiceMonitor that a Plone site needs, with production-minded defaults you can override.
|
|
34
|
+
|
|
35
|
+
This is the same idea as a Helm chart or a Kustomize base, but expressed in code rather than templated YAML.
|
|
36
|
+
Because the inputs are typed options rather than free-form values, your editor and the compiler catch mistakes before synthesis, and the {doc}`API reference </reference/api/index>` is generated from those types.
|
|
37
|
+
|
|
38
|
+
## Synthesis time versus apply time
|
|
39
|
+
|
|
40
|
+
The two cache constructs illustrate the phase distinction well, because they resolve at different times.
|
|
41
|
+
|
|
42
|
+
`PloneHttpcache` renders the mittwald kube-httpcache Helm chart during synthesis.
|
|
43
|
+
It shells out to the `helm` CLI, so `helm` must be present where you run `cdk8s synth`, and the chart's resources land in your `dist/` output as ordinary manifests.
|
|
44
|
+
|
|
45
|
+
`PloneVinylCache` instead emits a `VinylCache` custom resource.
|
|
46
|
+
That resource does nothing on its own; the cloud-vinyl operator reconciles it at apply time and creates the underlying Varnish deployment in the cluster.
|
|
47
|
+
The work happens later, and in a different place, than the synthesis that produced the manifest.
|
|
48
|
+
|
|
49
|
+
Neither approach is universally better.
|
|
50
|
+
Rendering at synthesis keeps everything in one reviewable artifact, while delegating to an operator keeps the cluster as the source of truth and lets the operator manage the cache over its lifetime.
|
|
51
|
+
For the practical trade-offs between the two caches, see {doc}`architecture`.
|
|
52
|
+
|
|
53
|
+
## Applying by hand or through GitOps
|
|
54
|
+
|
|
55
|
+
Because synthesis produces plain YAML, you can apply it however you already deploy Kubernetes resources.
|
|
56
|
+
A small project applies `dist/` directly with `kubectl`.
|
|
57
|
+
A larger one commits the synthesized manifests to a repository and lets a GitOps controller such as Argo CD or Flux reconcile them, so the cluster always matches what is in version control.
|
|
58
|
+
|
|
59
|
+
A common middle path runs `cdk8s synth` in continuous integration and publishes the result, so the synthesis is reproducible and the applied manifests are auditable.
|
|
60
|
+
In every case the cdk8s-plone code stays the single definition of the deployment, and the manifests are a derived, inspectable product of it.
|
|
61
|
+
|
|
62
|
+
## See also
|
|
63
|
+
|
|
64
|
+
- {doc}`architecture` — the components a `Plone` construct creates and how they relate.
|
|
65
|
+
- {doc}`/tutorials/01-quick-start` — the workflow applied end to end.
|
|
66
|
+
- [cdk8s documentation](https://cdk8s.io/docs/latest/) — the framework this builds on.
|
|
@@ -7,11 +7,6 @@ myst:
|
|
|
7
7
|
"keywords": "Plone, cdk8s, Kubernetes, architecture, design, concepts"
|
|
8
8
|
---
|
|
9
9
|
|
|
10
|
-
```{image} ../_static/kup6s-icon-explanation.svg
|
|
11
|
-
:align: center
|
|
12
|
-
:class: section-icon-large
|
|
13
|
-
```
|
|
14
|
-
|
|
15
10
|
# Explanation
|
|
16
11
|
|
|
17
12
|
**Understanding-oriented discussion of concepts, architecture, and design decisions.**
|
|
@@ -27,30 +22,9 @@ titlesonly: true
|
|
|
27
22
|
---
|
|
28
23
|
features
|
|
29
24
|
architecture
|
|
25
|
+
cdk8s-workflow
|
|
30
26
|
```
|
|
31
27
|
|
|
32
|
-
## Key topics
|
|
33
|
-
|
|
34
|
-
*This section will explain:*
|
|
35
|
-
- Plone architecture and component relationships
|
|
36
|
-
- Backend and Frontend integration
|
|
37
|
-
- Storage architecture for Plone data
|
|
38
|
-
- CDK8S construct patterns and best practices
|
|
39
|
-
- Configuration management strategies
|
|
40
|
-
|
|
41
|
-
*Future topics:*
|
|
42
|
-
- Security considerations
|
|
43
|
-
- Scaling and high availability considerations
|
|
44
|
-
- Performance optimization
|
|
45
|
-
|
|
46
|
-
## Design decisions
|
|
47
|
-
|
|
48
|
-
*This section will document:*
|
|
49
|
-
- Why certain defaults were chosen
|
|
50
|
-
- Trade-offs in configuration approaches
|
|
51
|
-
- Integration strategies with external services
|
|
52
|
-
- Testing philosophy
|
|
53
|
-
|
|
54
28
|
---
|
|
55
29
|
|
|
56
30
|
**Ready to get started?** Jump into the [Tutorials](../tutorials/index.md) for hands-on lessons.
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
---
|
|
2
|
+
myst:
|
|
3
|
+
html_meta:
|
|
4
|
+
"description": "Back up and restore a cdk8s-plone deployment by protecting the PostgreSQL database that holds the Plone content."
|
|
5
|
+
"property=og:description": "Back up and restore a cdk8s-plone deployment by protecting the PostgreSQL database that holds the Plone content."
|
|
6
|
+
"property=og:title": "Back up and restore"
|
|
7
|
+
"keywords": "Plone, cdk8s, Kubernetes, backup, restore, PostgreSQL, CloudNativePG, pg_dump, RelStorage"
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
# Back up and restore
|
|
11
|
+
|
|
12
|
+
This guide shows you how to back up and restore a Plone deployment.
|
|
13
|
+
|
|
14
|
+
`cdk8s-plone` does not run backups.
|
|
15
|
+
It deploys the application; your data lives in PostgreSQL, so you protect the database.
|
|
16
|
+
|
|
17
|
+
## What to back up
|
|
18
|
+
|
|
19
|
+
Plone stores its content in the ZODB, which this stack keeps in PostgreSQL through RelStorage.
|
|
20
|
+
A backup of the PostgreSQL database is a backup of your site content.
|
|
21
|
+
|
|
22
|
+
If your configuration keeps blobs on a separate volume rather than in the database, back up that volume as well.
|
|
23
|
+
The application images and Kubernetes manifests are reproducible from your `cdk8s-plone` code, so they do not need a backup.
|
|
24
|
+
|
|
25
|
+
## Back up a CloudNativePG database
|
|
26
|
+
|
|
27
|
+
CloudNativePG performs scheduled and on-demand backups to object storage through its own resources.
|
|
28
|
+
|
|
29
|
+
Configure object-store backups on the `Cluster`, then schedule them with a `ScheduledBackup`:
|
|
30
|
+
|
|
31
|
+
```yaml
|
|
32
|
+
apiVersion: postgresql.cnpg.io/v1
|
|
33
|
+
kind: ScheduledBackup
|
|
34
|
+
metadata:
|
|
35
|
+
name: plone-daily
|
|
36
|
+
spec:
|
|
37
|
+
schedule: "0 0 2 * * *"
|
|
38
|
+
backupOwnerReference: self
|
|
39
|
+
cluster:
|
|
40
|
+
name: <cluster-name>
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
Take an immediate backup with a `Backup` resource:
|
|
44
|
+
|
|
45
|
+
```yaml
|
|
46
|
+
apiVersion: postgresql.cnpg.io/v1
|
|
47
|
+
kind: Backup
|
|
48
|
+
metadata:
|
|
49
|
+
name: plone-manual
|
|
50
|
+
spec:
|
|
51
|
+
cluster:
|
|
52
|
+
name: <cluster-name>
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
See the [CloudNativePG backup documentation](https://cloudnative-pg.io/documentation/current/backup/) for object-store credentials and retention policies.
|
|
56
|
+
|
|
57
|
+
## Back up a plain or standalone database
|
|
58
|
+
|
|
59
|
+
For a database without an operator, take a logical dump with `pg_dump` from a client pod:
|
|
60
|
+
|
|
61
|
+
```shell
|
|
62
|
+
kubectl exec -n <namespace> <postgres-pod> -- \
|
|
63
|
+
pg_dump -U <user> -d <database> -Fc -f /tmp/plone.dump
|
|
64
|
+
kubectl cp <namespace>/<postgres-pod>:/tmp/plone.dump ./plone.dump
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
Run this on a schedule with a `CronJob`, and store the dump off-cluster.
|
|
68
|
+
|
|
69
|
+
## Restore
|
|
70
|
+
|
|
71
|
+
For CloudNativePG, create a new `Cluster` with a `bootstrap.recovery` stanza that points at a backup, following the [CloudNativePG recovery guide](https://cloudnative-pg.io/documentation/current/recovery/).
|
|
72
|
+
|
|
73
|
+
For a logical dump, restore into an empty database with `pg_restore`:
|
|
74
|
+
|
|
75
|
+
```shell
|
|
76
|
+
kubectl cp ./plone.dump <namespace>/<postgres-pod>:/tmp/plone.dump
|
|
77
|
+
kubectl exec -n <namespace> <postgres-pod> -- \
|
|
78
|
+
pg_restore -U <user> -d <database> --clean --if-exists /tmp/plone.dump
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
After the database is restored, restart the backend so it reconnects:
|
|
82
|
+
|
|
83
|
+
```shell
|
|
84
|
+
kubectl rollout restart deployment/<backend-deployment> -n <namespace>
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
```{warning}
|
|
88
|
+
Restoring overwrites the current database.
|
|
89
|
+
Take a fresh backup before you restore, so you can return to the current state if the restore goes wrong.
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
## Verify
|
|
93
|
+
|
|
94
|
+
Confirm a backup completed and is recent:
|
|
95
|
+
|
|
96
|
+
```shell
|
|
97
|
+
kubectl get backup -n <namespace>
|
|
98
|
+
kubectl get scheduledbackup -n <namespace>
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
After a restore, open the site and confirm your content is present.
|
|
102
|
+
|
|
103
|
+
## See also
|
|
104
|
+
|
|
105
|
+
- {doc}`/how-to/upgrade-and-rollout` — back up before a risky upgrade.
|
|
106
|
+
- {doc}`/explanation/architecture` — where Plone stores its data.
|
|
107
|
+
- [CloudNativePG documentation](https://cloudnative-pg.io/documentation/current/) — backup, recovery, and retention.
|