@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.
Files changed (73) hide show
  1. package/.jsii +25 -24
  2. package/API.md +6 -2
  3. package/README.md +3 -3
  4. package/documentation/sources/conf.py +55 -29
  5. package/documentation/sources/explanation/architecture.md +14 -16
  6. package/documentation/sources/explanation/cdk8s-workflow.md +66 -0
  7. package/documentation/sources/explanation/index.md +1 -27
  8. package/documentation/sources/how-to/backup-and-restore.md +107 -0
  9. package/documentation/sources/how-to/configure-env-and-secrets.md +184 -0
  10. package/documentation/sources/how-to/configure-ingress-tls.md +108 -0
  11. package/documentation/sources/how-to/configure-security-context.md +0 -5
  12. package/documentation/sources/how-to/deploy-blicca.md +8 -8
  13. package/documentation/sources/how-to/{deploy-production-volto.md → deploy-volto.md} +20 -25
  14. package/documentation/sources/how-to/deploy-with-httpcache.md +224 -0
  15. package/documentation/sources/how-to/deploy-with-vinyl-cache.md +0 -5
  16. package/documentation/sources/how-to/enable-prometheus-monitoring.md +4 -5
  17. package/documentation/sources/how-to/index.md +15 -8
  18. package/documentation/sources/how-to/scale-and-high-availability.md +122 -0
  19. package/documentation/sources/how-to/schedule-pods.md +0 -5
  20. package/documentation/sources/how-to/troubleshooting.md +113 -0
  21. package/documentation/sources/how-to/upgrade-and-rollout.md +89 -0
  22. package/documentation/sources/index.md +3 -11
  23. package/documentation/sources/reference/api/index.md +6 -4
  24. package/documentation/sources/reference/configuration-options.md +85 -516
  25. package/documentation/sources/reference/index.md +16 -43
  26. package/documentation/sources/tutorials/01-quick-start.md +1 -1
  27. package/documentation/sources/tutorials/index.md +7 -11
  28. package/examples/blicca/.env.example +3 -2
  29. package/examples/blicca/README.md +21 -24
  30. package/examples/blicca/__snapshots__/main.test.ts.snap +138 -345
  31. package/examples/blicca/main.test.ts +7 -0
  32. package/examples/blicca/main.ts +8 -7
  33. package/examples/blicca/postgres.plain.ts +115 -0
  34. package/examples/blicca/tsconfig.json +33 -0
  35. package/examples/{production-volto → volto}/.env.example +3 -2
  36. package/examples/{production-volto → volto}/README.md +20 -23
  37. package/examples/{production-volto → volto}/__snapshots__/main.test.ts.snap +139 -345
  38. package/examples/{production-volto → volto}/main.test.ts +7 -0
  39. package/examples/{production-volto → volto}/main.ts +8 -7
  40. package/examples/{production-volto → volto}/package.json +1 -1
  41. package/examples/volto/postgres.plain.ts +115 -0
  42. package/examples/volto/tsconfig.json +33 -0
  43. package/lib/httpcache.js +1 -1
  44. package/lib/imports/vinyl.bluedynamics.eu.d.ts +4011 -53
  45. package/lib/imports/vinyl.bluedynamics.eu.js +1786 -157
  46. package/lib/plone.js +1 -1
  47. package/lib/vinylcache.d.ts +3 -1
  48. package/lib/vinylcache.js +3 -2
  49. package/package.json +6 -6
  50. package/documentation/sources/_static/brand-theme.css +0 -685
  51. package/documentation/sources/_static/custom-icons.css +0 -123
  52. package/documentation/sources/_static/fonts/hack/Hack-Regular.woff2 +0 -0
  53. package/documentation/sources/_static/fonts/orbitron/Orbitron-Black.woff2 +0 -11
  54. package/documentation/sources/_static/fonts/orbitron/Orbitron-Bold.woff2 +0 -11
  55. package/documentation/sources/_static/fonts/orbitron/Orbitron-Regular.woff2 +0 -0
  56. package/documentation/sources/_static/fonts/rajdhani/Rajdhani-Bold.woff2 +0 -11
  57. package/documentation/sources/_static/fonts/rajdhani/Rajdhani-Medium.woff2 +0 -11
  58. package/documentation/sources/_static/fonts/rajdhani/Rajdhani-Regular.woff2 +0 -11
  59. package/documentation/sources/_static/fonts/rajdhani/Rajdhani-SemiBold.woff2 +0 -11
  60. package/documentation/sources/_static/kup6s-icon-explanation.svg +0 -32
  61. package/documentation/sources/_static/kup6s-icon-howto.svg +0 -34
  62. package/documentation/sources/_static/kup6s-icon-reference.svg +0 -34
  63. package/documentation/sources/_static/kup6s-icon-tutorials.svg +0 -30
  64. package/documentation/sources/_static/logo-fix.js +0 -12
  65. package/documentation/sources/reference/api/.gitkeep +0 -1
  66. package/examples/blicca/postgres.bitnami.ts +0 -49
  67. package/examples/production-volto/postgres.bitnami.ts +0 -49
  68. /package/documentation/sources/_static/{kup6s-icon-plone.svg → logo.svg} +0 -0
  69. /package/examples/{production-volto → volto}/cdk8s.yaml +0 -0
  70. /package/examples/{production-volto → volto}/config/varnish.tpl.vcl +0 -0
  71. /package/examples/{production-volto → volto}/ingress.ts +0 -0
  72. /package/examples/{production-volto → volto}/jest.config.js +0 -0
  73. /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.79",
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[![npm version](https://badge.fury.io/js/%40bluedynamics%2Fcdk8s-plone.svg)](https://www.npmjs.com/package/@bluedynamics/cdk8s-plone)\n[![PyPI version](https://badge.fury.io/py/cdk8s-plone.svg)](https://pypi.org/project/cdk8s-plone/)\n[![License](https://img.shields.io/badge/License-Apache%202.0-blue.svg)](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- **[Production Volto](examples/production-volto/)** - Production-ready Plone 6 deployment with the React single-page frontend:\n - Volto frontend (React) + REST API backend\n - PostgreSQL with RelStorage (CloudNativePG or Bitnami)\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 (CloudNativePG or Bitnami)\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"
111
+ "markdown": "# CDK8S Plone\n\n> TypeScript and Python library for deploying Plone CMS to Kubernetes using CDK8S\n\n[![npm version](https://badge.fury.io/js/%40bluedynamics%2Fcdk8s-plone.svg)](https://www.npmjs.com/package/@bluedynamics/cdk8s-plone)\n[![PyPI version](https://badge.fury.io/py/cdk8s-plone.svg)](https://pypi.org/project/cdk8s-plone/)\n[![License](https://img.shields.io/badge/License-Apache%202.0-blue.svg)](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": 403
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": 396
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": 401
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": 291
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 (metrics + ServiceMonitor)."
2241
+ "summary": "Enable Prometheus monitoring."
2241
2242
  },
2242
2243
  "immutable": true,
2243
2244
  "locationInModule": {
2244
2245
  "filename": "src/vinylcache.ts",
2245
- "line": 285
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": 304
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": 297
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": 376
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": 370
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": 310
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": 364
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": 352
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": 316
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": 358
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": 322
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": 328
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": 334
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": 346
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": 340
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.43",
3122
- "fingerprint": "5arI0nYpog888exkSdJCCYEorrET0rqyYrN36ZpI76s="
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 (metrics + ServiceMonitor). |
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 (metrics + ServiceMonitor).
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
- - **[Production Volto](examples/production-volto/)** - Production-ready Plone 6 deployment with the React single-page frontend:
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 (CloudNativePG or Bitnami)
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 (CloudNativePG or Bitnami)
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. See the documentation for
81
- # a list of builtin themes.
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
- # Logo configuration - absolute path resolves relative to html_baseurl
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
- # Navigation
99
- "nav_links": [],
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
- # Logo configuration (Shibuya uses different approach)
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. They are copied after the builtin static files,
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 Access"
107
- Client[Client/Browser]
106
+ subgraph "External access"
107
+ Client[Client / Browser]
108
108
  Ingress[Ingress Controller]
109
109
  end
110
110
 
111
- subgraph "HTTP Cache Layer (Optional)"
112
- Varnish[Varnish Cache<br/>kube-httpcache]
111
+ subgraph "Cache layer (optional)"
112
+ Varnish[Varnish<br/>PloneHttpcache or PloneVinylCache]
113
113
  end
114
114
 
115
- subgraph "Plone Frontend (Volto)"
115
+ subgraph "Frontend (Volto variant only)"
116
116
  FrontendSvc[Frontend Service]
117
- Frontend1[Frontend Pod 1]
118
- Frontend2[Frontend Pod 2]
117
+ Frontend1[Frontend Pod]
118
+ Frontend2[Frontend Pod]
119
119
  end
120
120
 
121
- subgraph "Plone Backend (API)"
121
+ subgraph "Backend (REST API for Volto, HTML for Blicca)"
122
122
  BackendSvc[Backend Service]
123
- Backend1[Backend Pod 1]
124
- Backend2[Backend Pod 2]
125
- Backend3[Backend Pod 3]
123
+ Backend1[Backend Pod]
124
+ Backend2[Backend Pod]
126
125
  end
127
126
 
128
- subgraph "Data Layer"
129
- DB[(External Database<br/>PostgreSQL/MySQL/Oracle<br/>with RelStorage)]
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.