@bluedynamics/cdk8s-plone 0.1.35 → 0.1.37

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.
@@ -1,8 +1,17 @@
1
- # Deploy Classic UI Example
1
+ ---
2
+ myst:
3
+ html_meta:
4
+ "description": "Deploy the Classic UI example: server-side rendered Plone with PostgreSQL, Varnish caching, and ingress with TLS."
5
+ "property=og:description": "Deploy the Classic UI example: server-side rendered Plone with PostgreSQL, Varnish caching, and ingress with TLS."
6
+ "property=og:title": "Deploy Classic UI example"
7
+ "keywords": "Plone, cdk8s, Kubernetes, Classic UI, PostgreSQL, Varnish, ingress"
8
+ ---
9
+
10
+ # Deploy Classic UI example
2
11
 
3
12
  This guide shows you how to deploy the Classic UI example to your Kubernetes cluster.
4
13
 
5
- ## What You'll Deploy
14
+ ## What you'll deploy
6
15
 
7
16
  The [Classic UI example](https://github.com/bluedynamics/cdk8s-plone/tree/main/examples/classic-ui) provides traditional Plone with server-side rendering:
8
17
 
@@ -27,7 +36,7 @@ Choose Classic UI if you're migrating from older Plone versions or need specific
27
36
 
28
37
  ## Prerequisites
29
38
 
30
- Same as the [Production Volto guide](deploy-production-volto.md#prerequisites), you need:
39
+ Same as the {ref}`production-volto-prerequisites` in the Production Volto guide, you need:
31
40
 
32
41
  - Ingress controller (Traefik or Kong)
33
42
  - cert-manager
@@ -36,36 +45,36 @@ Same as the [Production Volto guide](deploy-production-volto.md#prerequisites),
36
45
 
37
46
  See [Setup Prerequisites](setup-prerequisites.md) for detailed instructions.
38
47
 
39
- ## Step 1: Get the Example
48
+ ## Step 1: Get the example
40
49
 
41
- ```bash
50
+ ```shell
42
51
  git clone https://github.com/bluedynamics/cdk8s-plone.git
43
52
  cd cdk8s-plone/examples/classic-ui
44
53
  ```
45
54
 
46
- ## Step 2: Install Dependencies
55
+ ## Step 2: Install dependencies
47
56
 
48
- ```bash
57
+ ```shell
49
58
  npm install
50
59
  ```
51
60
 
52
61
  ## Step 3: Import CRDs
53
62
 
54
- ```bash
63
+ ```shell
55
64
  npm run import
56
65
  ```
57
66
 
58
- ## Step 4: Configure Environment
67
+ ## Step 4: Configure environment
59
68
 
60
69
  Create `.env` from the example:
61
70
 
62
- ```bash
71
+ ```shell
63
72
  cp .env.example .env
64
73
  ```
65
74
 
66
75
  Edit `.env`:
67
76
 
68
- ```bash
77
+ ```shell
69
78
  # Your domains
70
79
  DOMAIN_CACHED=plone.example.com
71
80
  DOMAIN_UNCACHED=plone-test.example.com
@@ -85,17 +94,17 @@ DATABASE=cloudnativepg
85
94
  Classic UI only needs one image (backend). There's no frontend image configuration.
86
95
  :::
87
96
 
88
- ## Step 5: Generate Manifests
97
+ ## Step 5: Generate manifests
89
98
 
90
- ```bash
99
+ ```shell
91
100
  npm run synth
92
101
  ```
93
102
 
94
103
  Creates `dist/plone-classic.k8s.yaml` (~27 KB, smaller than Volto's 32 KB).
95
104
 
96
- ## Step 6: Review Manifests
105
+ ## Step 6: Review manifests
97
106
 
98
- ```bash
107
+ ```shell
99
108
  # Count resources
100
109
  grep "^kind:" dist/plone-classic.k8s.yaml | sort | uniq -c
101
110
 
@@ -105,19 +114,19 @@ kubectl apply --dry-run=client -f dist/plone-classic.k8s.yaml
105
114
 
106
115
  ## Step 7: Deploy
107
116
 
108
- ```bash
117
+ ```shell
109
118
  kubectl apply -f dist/plone-classic.k8s.yaml
110
119
  ```
111
120
 
112
121
  Or to a specific namespace:
113
122
 
114
- ```bash
123
+ ```shell
115
124
  kubectl apply -f dist/plone-classic.k8s.yaml -n plone
116
125
  ```
117
126
 
118
- ## Step 8: Monitor Deployment
127
+ ## Step 8: Monitor deployment
119
128
 
120
- ```bash
129
+ ```shell
121
130
  # Watch pods
122
131
  kubectl get pods -l app.kubernetes.io/part-of=plone -w
123
132
 
@@ -131,9 +140,9 @@ kubectl wait --for=condition=ready pod \
131
140
  Classic UI deploys fewer pods than Volto (no frontend pods).
132
141
  :::
133
142
 
134
- ## Step 9: Verify Services
143
+ ## Step 9: Verify services
135
144
 
136
- ```bash
145
+ ```shell
137
146
  kubectl get svc -l app.kubernetes.io/part-of=plone
138
147
  ```
139
148
 
@@ -142,14 +151,14 @@ You should see:
142
151
  - `plone-httpcache` (Varnish cache)
143
152
  - Database service
144
153
 
145
- ## Step 10: Check Ingress
154
+ ## Step 10: Check ingress
146
155
 
147
- ```bash
156
+ ```shell
148
157
  kubectl get ingress
149
158
  kubectl get certificate
150
159
  ```
151
160
 
152
- ## Step 11: Access Your Site
161
+ ## Step 11: Access your site
153
162
 
154
163
  Once DNS and TLS are ready:
155
164
 
@@ -157,7 +166,7 @@ Once DNS and TLS are ready:
157
166
  - **Testing (uncached)**: https://plone-test.example.com
158
167
  - **Maintenance**: https://plone-admin.example.com
159
168
 
160
- ### Create Plone Site
169
+ ### Create Plone site
161
170
 
162
171
  1. Access maintenance domain: https://plone-admin.example.com
163
172
  2. Click "Create a new Plone site"
@@ -168,7 +177,7 @@ Once DNS and TLS are ready:
168
177
  - **Add-ons**: Choose Classic UI add-ons
169
178
  4. Click "Create Plone Site"
170
179
 
171
- ## Key Differences from Volto
180
+ ## Key differences from Volto
172
181
 
173
182
  ### Architecture
174
183
 
@@ -184,7 +193,7 @@ Compared to Volto:
184
193
  Traffic → Ingress → {Varnish → Frontend, Backend}
185
194
  ```
186
195
 
187
- ### Ingress Routes
196
+ ### Ingress routes
188
197
 
189
198
  Classic UI uses virtual host rewriting for direct backend access:
190
199
 
@@ -192,7 +201,7 @@ Classic UI uses virtual host rewriting for direct backend access:
192
201
  - **Uncached**: Direct to backend with VirtualHostBase rewrite
193
202
  - **Maintenance**: Direct backend access with VirtualHostRoot
194
203
 
195
- ### No Frontend Service
204
+ ### No frontend service
196
205
 
197
206
  The manifest doesn't include:
198
207
  - Frontend deployment
@@ -203,11 +212,11 @@ This makes the deployment ~15% smaller and simpler to manage.
203
212
 
204
213
  ## Troubleshooting
205
214
 
206
- ### Backend Not Starting
215
+ ### Backend not starting
207
216
 
208
217
  Check backend logs:
209
218
 
210
- ```bash
219
+ ```shell
211
220
  kubectl logs -l app.kubernetes.io/name=plone-backend -f
212
221
  ```
213
222
 
@@ -216,24 +225,24 @@ Common issues:
216
225
  - Memory limits too low
217
226
  - Image pull errors
218
227
 
219
- ### Classic UI Interface Not Loading
228
+ ### Classic UI interface not loading
220
229
 
221
230
  1. Check if backend pods are running:
222
- ```bash
231
+ ```shell
223
232
  kubectl get pods -l app.kubernetes.io/name=plone-backend
224
233
  ```
225
234
 
226
235
  2. Verify virtual host rewriting in ingress:
227
- ```bash
236
+ ```shell
228
237
  kubectl describe ingress
229
238
  ```
230
239
 
231
240
  3. Check Varnish routing:
232
- ```bash
241
+ ```shell
233
242
  kubectl logs -l app.kubernetes.io/name=plone-httpcache
234
243
  ```
235
244
 
236
- ### Add-on Compatibility
245
+ ### Add-on compatibility
237
246
 
238
247
  Some add-ons are Volto-specific. For Classic UI:
239
248
  - Use Classic UI themes (not Volto themes)
@@ -253,7 +262,7 @@ See the [Production Volto deployment guide](deploy-production-volto.md) for deta
253
262
 
254
263
  ## Customization
255
264
 
256
- ### Backend Configuration
265
+ ### Backend configuration
257
266
 
258
267
  Edit `main.ts` to customize:
259
268
 
@@ -270,7 +279,7 @@ const plone = new Plone(this, 'plone', {
270
279
  })
271
280
  ```
272
281
 
273
- ### Varnish Caching
282
+ ### Varnish caching
274
283
 
275
284
  Edit `config/varnish.tpl.vcl` for caching rules specific to Classic UI.
276
285
 
@@ -287,7 +296,7 @@ backend: {
287
296
  ```
288
297
 
289
298
  Then:
290
- ```bash
299
+ ```shell
291
300
  npm run synth
292
301
  kubectl apply -f dist/plone-classic.k8s.yaml
293
302
  ```
@@ -303,20 +312,19 @@ Classic UI performance characteristics:
303
312
 
304
313
  ## Cleanup
305
314
 
306
- ```bash
315
+ ```shell
307
316
  kubectl delete -f dist/plone-classic.k8s.yaml
308
317
  ```
309
318
 
310
- ## Next Steps
319
+ ## Next steps
311
320
 
312
- - Add [Prometheus monitoring](../reference/configuration-options.md#monitoring)
313
- - Configure [CloudNativePG backups](https://cloudnative-pg.io/documentation/)
314
- - Customize [Classic UI theme](https://6.docs.plone.org/classic-ui/theming.html)
315
- - Set up [content migration](https://6.docs.plone.org/install/upgrade-guide.html)
321
+ - Follow {doc}`enable-prometheus-monitoring` to add Prometheus monitoring.
322
+ - Configure [CloudNativePG backups](https://cloudnative-pg.io/documentation/).
323
+ - Customize the Classic UI theme through [Plone 6 Classic UI documentation](https://6.docs.plone.org/classic-ui/).
316
324
 
317
- ## See Also
325
+ ## See also
318
326
 
319
- - [Deploy Production Volto](deploy-production-volto.md) - For modern React UI
320
- - [Setup Prerequisites](setup-prerequisites.md) - Cluster requirements
321
- - [Configuration Options](../reference/configuration-options.md) - API reference
322
- - [Plone 6 Classic UI Documentation](https://6.docs.plone.org/classic-ui/)
327
+ - {doc}`deploy-production-volto` For the modern React UI.
328
+ - {doc}`setup-prerequisites` Cluster requirements.
329
+ - {doc}`/reference/configuration-options` API reference.
330
+ - [Plone 6 Classic UI documentation](https://6.docs.plone.org/classic-ui/)
@@ -1,8 +1,17 @@
1
- # Deploy Production Volto Example
1
+ ---
2
+ myst:
3
+ html_meta:
4
+ "description": "Deploy the production-ready Volto example: React frontend, Plone REST API backend, PostgreSQL, Varnish caching, and ingress with TLS."
5
+ "property=og:description": "Deploy the production-ready Volto example: React frontend, Plone REST API backend, PostgreSQL, Varnish caching, and ingress with TLS."
6
+ "property=og:title": "Deploy production Volto example"
7
+ "keywords": "Plone, cdk8s, Kubernetes, Volto, production, PostgreSQL, Varnish, ingress, TLS"
8
+ ---
9
+
10
+ # Deploy production Volto example
2
11
 
3
12
  This guide shows you how to deploy the production-ready Volto example to your Kubernetes cluster.
4
13
 
5
- ## What You'll Deploy
14
+ ## What you'll deploy
6
15
 
7
16
  The [Production Volto example](https://github.com/bluedynamics/cdk8s-plone/tree/main/examples/production-volto) includes:
8
17
 
@@ -12,6 +21,8 @@ The [Production Volto example](https://github.com/bluedynamics/cdk8s-plone/tree/
12
21
  - **Ingress** with TLS (Traefik or Kong)
13
22
  - **Three access domains** (cached, uncached, maintenance)
14
23
 
24
+ (production-volto-prerequisites)=
25
+
15
26
  ## Prerequisites
16
27
 
17
28
  ### Required
@@ -23,45 +34,45 @@ Ensure you have these installed on your cluster:
23
34
  - [Kong Gateway](https://docs.konghq.com/gateway/latest/install/kubernetes/)
24
35
 
25
36
  2. **cert-manager** - For TLS certificates:
26
- ```bash
37
+ ```shell
27
38
  kubectl apply -f https://github.com/cert-manager/cert-manager/releases/download/v1.14.0/cert-manager.yaml
28
39
  ```
29
40
 
30
41
  3. **kube-httpcache Operator** - For Varnish caching:
31
- ```bash
42
+ ```shell
32
43
  kubectl apply -f https://github.com/mittwald/kube-httpcache/releases/latest/download/kube-httpcache.yaml
33
44
  ```
34
45
 
35
46
  4. **PostgreSQL Operator** - Choose one:
36
47
 
37
48
  **Option A: CloudNativePG** (recommended for production):
38
- ```bash
49
+ ```shell
39
50
  kubectl apply -f https://raw.githubusercontent.com/cloudnative-pg/cloudnative-pg/release-1.24/releases/cnpg-1.24.0.yaml
40
51
  ```
41
52
 
42
53
  **Option B: Bitnami** (simpler for testing):
43
- ```bash
54
+ ```shell
44
55
  kubectl create namespace plone
45
56
  ```
46
57
 
47
- ### Local Tools
58
+ ### Local tools
48
59
 
49
60
  - **Node.js 18+** and npm
50
61
  - **kubectl** configured for your cluster
51
62
  - **git** to clone the repository
52
63
 
53
- ## Step 1: Get the Example
64
+ ## Step 1: Get the example
54
65
 
55
66
  Clone the repository and navigate to the example:
56
67
 
57
- ```bash
68
+ ```shell
58
69
  git clone https://github.com/bluedynamics/cdk8s-plone.git
59
70
  cd cdk8s-plone/examples/production-volto
60
71
  ```
61
72
 
62
- ## Step 2: Install Dependencies
73
+ ## Step 2: Install dependencies
63
74
 
64
- ```bash
75
+ ```shell
65
76
  npm install
66
77
  ```
67
78
 
@@ -69,7 +80,7 @@ npm install
69
80
 
70
81
  Generate TypeScript bindings for Kubernetes CRDs:
71
82
 
72
- ```bash
83
+ ```shell
73
84
  npm run import
74
85
  ```
75
86
 
@@ -78,17 +89,17 @@ This imports:
78
89
  - CloudNativePG Cluster CRDs
79
90
  - Traefik Middleware CRDs
80
91
 
81
- ## Step 4: Configure Environment
92
+ ## Step 4: Configure environment
82
93
 
83
94
  Create a `.env` file from the example:
84
95
 
85
- ```bash
96
+ ```shell
86
97
  cp .env.example .env
87
98
  ```
88
99
 
89
100
  Edit `.env` with your settings:
90
101
 
91
- ```bash
102
+ ```shell
92
103
  # Your domains
93
104
  DOMAIN_CACHED=plone.example.com
94
105
  DOMAIN_UNCACHED=plone-test.example.com
@@ -109,21 +120,21 @@ DATABASE=cloudnativepg
109
120
  For production, use `cloudnativepg` for high availability. For testing, `bitnami` is simpler.
110
121
  :::
111
122
 
112
- ## Step 5: Generate Manifests
123
+ ## Step 5: Generate manifests
113
124
 
114
125
  Synthesize Kubernetes YAML:
115
126
 
116
- ```bash
127
+ ```shell
117
128
  npm run synth
118
129
  ```
119
130
 
120
131
  This creates `dist/plone-example.k8s.yaml` with all resources.
121
132
 
122
- ## Step 6: Review Generated Manifests
133
+ ## Step 6: Review generated manifests
123
134
 
124
135
  Inspect what will be deployed:
125
136
 
126
- ```bash
137
+ ```shell
127
138
  # Count resources
128
139
  grep "^kind:" dist/plone-example.k8s.yaml | sort | uniq -c
129
140
 
@@ -135,21 +146,21 @@ kubectl apply --dry-run=client -f dist/plone-example.k8s.yaml
135
146
 
136
147
  Deploy to your cluster:
137
148
 
138
- ```bash
149
+ ```shell
139
150
  kubectl apply -f dist/plone-example.k8s.yaml
140
151
  ```
141
152
 
142
153
  Or deploy to a specific namespace:
143
154
 
144
- ```bash
155
+ ```shell
145
156
  kubectl apply -f dist/plone-example.k8s.yaml -n plone
146
157
  ```
147
158
 
148
- ## Step 8: Monitor Deployment
159
+ ## Step 8: Monitor deployment
149
160
 
150
161
  Watch pods starting:
151
162
 
152
- ```bash
163
+ ```shell
153
164
  # Watch all pods
154
165
  kubectl get pods -l app.kubernetes.io/part-of=plone -w
155
166
 
@@ -161,15 +172,15 @@ kubectl get pods -l app.kubernetes.io/name=plone-httpcache
161
172
 
162
173
  Wait for all pods to be `Running`:
163
174
 
164
- ```bash
175
+ ```shell
165
176
  kubectl wait --for=condition=ready pod -l app.kubernetes.io/part-of=plone --timeout=300s
166
177
  ```
167
178
 
168
- ## Step 9: Verify Services
179
+ ## Step 9: Verify services
169
180
 
170
181
  Check that services are created:
171
182
 
172
- ```bash
183
+ ```shell
173
184
  kubectl get svc -l app.kubernetes.io/part-of=plone
174
185
  ```
175
186
 
@@ -179,21 +190,21 @@ You should see:
179
190
  - `plone-httpcache` (Varnish cache)
180
191
  - Database service (Bitnami or CloudNativePG)
181
192
 
182
- ## Step 10: Check Ingress
193
+ ## Step 10: Check ingress
183
194
 
184
195
  Verify ingress routes:
185
196
 
186
- ```bash
197
+ ```shell
187
198
  kubectl get ingress
188
199
  ```
189
200
 
190
201
  Check TLS certificates:
191
202
 
192
- ```bash
203
+ ```shell
193
204
  kubectl get certificate
194
205
  ```
195
206
 
196
- ## Step 11: Access Your Site
207
+ ## Step 11: Access your site
197
208
 
198
209
  Once DNS is configured and TLS certificates are issued:
199
210
 
@@ -201,7 +212,7 @@ Once DNS is configured and TLS certificates are issued:
201
212
  - **Testing (uncached)**: https://plone-test.example.com
202
213
  - **Maintenance**: https://plone-admin.example.com
203
214
 
204
- ### Create Plone Site
215
+ ### Create Plone site
205
216
 
206
217
  On first access to the maintenance domain:
207
218
 
@@ -215,11 +226,11 @@ On first access to the maintenance domain:
215
226
 
216
227
  ## Troubleshooting
217
228
 
218
- ### Pods Not Starting
229
+ ### Pods not starting
219
230
 
220
231
  Check pod logs:
221
232
 
222
- ```bash
233
+ ```shell
223
234
  # Backend logs
224
235
  kubectl logs -l app.kubernetes.io/name=plone-backend -f
225
236
 
@@ -230,11 +241,11 @@ kubectl logs -l app.kubernetes.io/name=plone-frontend -f
230
241
  kubectl logs -l postgresql=plone-postgresql -f
231
242
  ```
232
243
 
233
- ### Database Connection Issues
244
+ ### Database connection issues
234
245
 
235
246
  **CloudNativePG:**
236
247
 
237
- ```bash
248
+ ```shell
238
249
  # Check cluster status
239
250
  kubectl get cluster
240
251
 
@@ -244,7 +255,7 @@ kubectl get secret -l cnpg.io/cluster
244
255
 
245
256
  **Bitnami:**
246
257
 
247
- ```bash
258
+ ```shell
248
259
  # Check service
249
260
  kubectl get svc -l app.kubernetes.io/name=postgresql
250
261
 
@@ -252,9 +263,9 @@ kubectl get svc -l app.kubernetes.io/name=postgresql
252
263
  kubectl describe secret <postgresql-secret-name>
253
264
  ```
254
265
 
255
- ### TLS Certificate Issues
266
+ ### TLS certificate issues
256
267
 
257
- ```bash
268
+ ```shell
258
269
  # Check certificate status
259
270
  kubectl describe certificate
260
271
 
@@ -262,9 +273,9 @@ kubectl describe certificate
262
273
  kubectl logs -n cert-manager deployment/cert-manager
263
274
  ```
264
275
 
265
- ### Varnish Cache Not Working
276
+ ### Varnish cache not working
266
277
 
267
- ```bash
278
+ ```shell
268
279
  # Check httpcache logs
269
280
  kubectl logs -l app.kubernetes.io/name=plone-httpcache
270
281
 
@@ -272,7 +283,7 @@ kubectl logs -l app.kubernetes.io/name=plone-httpcache
272
283
  kubectl get pods -n kube-httpcache-system
273
284
  ```
274
285
 
275
- ## Updating Your Deployment
286
+ ## Updating your deployment
276
287
 
277
288
  After making changes to the example:
278
289
 
@@ -301,19 +312,18 @@ Then regenerate and reapply.
301
312
 
302
313
  Remove all resources:
303
314
 
304
- ```bash
315
+ ```shell
305
316
  kubectl delete -f dist/plone-example.k8s.yaml
306
317
  ```
307
318
 
308
- ## Next Steps
319
+ ## Next steps
309
320
 
310
- - Configure [monitoring and metrics](../reference/configuration-options.md#monitoring)
311
- - Set up [backups](../explanation/features.md#database-integration) for CloudNativePG
312
- - Customize [Varnish caching rules](https://github.com/bluedynamics/cdk8s-plone/blob/main/examples/production-volto/config/varnish.tpl.vcl)
313
- - Review [security best practices](../explanation/architecture.md#security)
321
+ - Configure monitoring and metrics through {doc}`enable-prometheus-monitoring`.
322
+ - Customize [Varnish caching rules](https://github.com/bluedynamics/cdk8s-plone/blob/main/examples/production-volto/config/varnish.tpl.vcl).
323
+ - Harden pods with {doc}`configure-security-context`.
314
324
 
315
- ## See Also
325
+ ## See also
316
326
 
317
- - [Deploy Classic UI Example](deploy-classic-ui.md) - For traditional Plone interface
318
- - [Setup Prerequisites](setup-prerequisites.md) - Detailed cluster setup
319
- - [Configuration Options](../reference/configuration-options.md) - API reference
327
+ - {doc}`deploy-classic-ui` For the traditional Plone interface.
328
+ - {doc}`setup-prerequisites` Detailed cluster setup.
329
+ - {doc}`/reference/configuration-options` API reference.
@@ -1,9 +1,18 @@
1
+ ---
2
+ myst:
3
+ html_meta:
4
+ "description": "Add the cloud-vinyl VinylCache operator to your Plone deployment for operator-managed Varnish caching."
5
+ "property=og:description": "Add the cloud-vinyl VinylCache operator to your Plone deployment for operator-managed Varnish caching."
6
+ "property=og:title": "Deploy with cloud-vinyl cache"
7
+ "keywords": "Plone, cdk8s, Kubernetes, Varnish, cloud-vinyl, VinylCache, operator, caching"
8
+ ---
9
+
1
10
  ```{image} ../_static/kup6s-icon-howto.svg
2
11
  :align: center
3
12
  :class: section-icon-large
4
13
  ```
5
14
 
6
- # Deploy with Cloud-Vinyl Cache
15
+ # Deploy with cloud-vinyl cache
7
16
 
8
17
  <div class="page-metadata">
9
18
  <div class="metadata-content">
@@ -21,7 +30,7 @@
21
30
 
22
31
  ## Steps
23
32
 
24
- ### 1. Add PloneVinylCache to Your Deployment
33
+ ### 1. Add PloneVinylCache to your deployment
25
34
 
26
35
  ```typescript
27
36
  import { Plone, PloneVinylCache } from '@bluedynamics/cdk8s-plone';
@@ -37,7 +46,7 @@ const cache = new PloneVinylCache(chart, 'cache', {
37
46
  });
38
47
  ```
39
48
 
40
- ### 2. Use the Cache Service in Your IngressRoute
49
+ ### 2. Use the cache service in your IngressRoute
41
50
 
42
51
  The cache exposes a service that should be used as the upstream in your IngressRoute:
43
52
 
@@ -46,9 +55,9 @@ The cache exposes a service that should be used as the upstream in your IngressR
46
55
  // instead of plone.frontendServiceName
47
56
  ```
48
57
 
49
- ### 3. Build and Deploy
58
+ ### 3. Build and deploy
50
59
 
51
- ```bash
60
+ ```shell
52
61
  npm run build
53
62
  # Review generated manifests
54
63
  # Deploy via ArgoCD or kubectl apply
@@ -56,7 +65,7 @@ npm run build
56
65
 
57
66
  ### 4. Verify
58
67
 
59
- ```bash
68
+ ```shell
60
69
  # Check VinylCache status
61
70
  kubectl get vinylcache -n <namespace>
62
71
 
@@ -66,7 +75,7 @@ kubectl get pods -n <namespace> -l app.kubernetes.io/managed-by=cloud-vinyl
66
75
 
67
76
  ## Customization
68
77
 
69
- ### Sizing the Cache Storage
78
+ ### Sizing the cache storage
70
79
 
71
80
  Without an explicit `storage` entry, the operator ships varnishd with its
72
81
  stock default (~100 MB malloc) — almost always too small. Set a malloc size
@@ -105,7 +114,7 @@ new PloneVinylCache(chart, 'cache', {
105
114
  });
106
115
  ```
107
116
 
108
- ### Cache Invalidation
117
+ ### Cache invalidation
109
118
 
110
119
  Invalidation is enabled by default (PURGE, BAN, xkey). Configure `plone.cachepurging` to point to the VinylCache invalidation proxy endpoint.
111
120
 
@@ -123,7 +132,7 @@ new PloneVinylCache(chart, 'cache', {
123
132
  });
124
133
  ```
125
134
 
126
- ### Shard Director Tuning
135
+ ### Shard director tuning
127
136
 
128
137
  For shard-based load distribution (the default), you can fine-tune the consistent-hash behavior. These options require **cloud-vinyl ≥ 0.4.2** to be honored by the generated VCL.
129
138