Last active 1740003215

tandoor.yaml Raw
1---
2apiVersion: v1
3kind: Namespace
4metadata:
5 name: tandoor
6---
7# kubectl -n tandoor create secret generic recipes --from-literal=postgresql-password=$(openssl rand -base64 33) --from-literal=postgresql-postgres-password=$(openssl rand -base64 33) --from-literal=secret-key=$(openssl rand -hex 32)
8#kind: Secret
9#apiVersion: v1
10#metadata:
11# name: recipes
12# namespace: tandoor
13#type: Opaque
14#data:
15# postgresql-password: ...
16# postgresql-postgres-password: ...
17# secret-key: ...
18---
19kind: ConfigMap
20apiVersion: v1
21metadata:
22 labels:
23 app: recipes
24 name: recipes-nginx-config
25 namespace: tandoor
26data:
27 nginx-config: |-
28 events {
29 worker_connections 1024;
30 }
31 http {
32 include mime.types;
33 server {
34 listen 80;
35 server_name _;
36
37 client_max_body_size 16M;
38
39 # serve static files
40 location /static/ {
41 alias /static/;
42 }
43 # serve media files
44 location /media/ {
45 alias /media/;
46 }
47 }
48 }
49---
50apiVersion: v1
51kind: ServiceAccount
52metadata:
53 name: recipes
54 namespace: tandoor
55---
56apiVersion: v1
57kind: PersistentVolumeClaim
58metadata:
59 name: recipes-media
60 namespace: tandoor
61 labels:
62 app: recipes
63spec:
64 accessModes:
65 - ReadWriteMany
66 resources:
67 requests:
68 storage: 100Gi
69 storageClassName: rook-cephfs
70---
71apiVersion: v1
72kind: PersistentVolumeClaim
73metadata:
74 name: recipes-static
75 namespace: tandoor
76 labels:
77 app: recipes
78spec:
79 accessModes:
80 - ReadWriteMany
81 resources:
82 requests:
83 storage: 100Gi
84 storageClassName: rook-cephfs
85---
86apiVersion: apps/v1
87kind: StatefulSet
88metadata:
89 labels:
90 app: recipes
91 tier: database
92 name: recipes-postgresql
93 namespace: tandoor
94spec:
95 replicas: 1
96 selector:
97 matchLabels:
98 app: recipes
99 serviceName: recipes-postgresql
100 updateStrategy:
101 type: RollingUpdate
102 template:
103 metadata:
104 annotations:
105 backup.velero.io/backup-volumes: data
106 labels:
107 app: recipes
108 tier: database
109 name: recipes-postgresql
110 spec:
111 containers:
112 - name: recipes-db
113 env:
114 - name: BITNAMI_DEBUG
115 value: "false"
116 - name: POSTGRESQL_PORT_NUMBER
117 value: "5432"
118 - name: POSTGRESQL_VOLUME_DIR
119 value: /bitnami/postgresql
120 - name: PGDATA
121 value: /bitnami/postgresql/data
122 - name: POSTGRES_USER
123 value: recipes
124 - name: POSTGRES_PASSWORD
125 valueFrom:
126 secretKeyRef:
127 name: recipes
128 key: postgresql-password
129 - name: POSTGRESQL_POSTGRES_PASSWORD
130 valueFrom:
131 secretKeyRef:
132 name: recipes
133 key: postgresql-postgres-password
134 - name: POSTGRES_DB
135 value: recipes
136 image: docker.io/bitnami/postgresql:15.5.0-debian-11-r17
137 imagePullPolicy: IfNotPresent
138 livenessProbe:
139 exec:
140 command:
141 - sh
142 - -c
143 - exec pg_isready -U "postgres" -d "wiki" -h 127.0.0.1 -p 5432
144 failureThreshold: 6
145 initialDelaySeconds: 30
146 periodSeconds: 10
147 successThreshold: 1
148 timeoutSeconds: 5
149 ports:
150 - containerPort: 5432
151 name: postgresql
152 protocol: TCP
153 readinessProbe:
154 exec:
155 command:
156 - sh
157 - -c
158 - -e
159 - |
160 pg_isready -U "postgres" -d "wiki" -h 127.0.0.1 -p 5432
161 [ -f /opt/bitnami/postgresql/tmp/.initialized ]
162 failureThreshold: 6
163 initialDelaySeconds: 5
164 periodSeconds: 10
165 successThreshold: 1
166 timeoutSeconds: 5
167 resources:
168 requests:
169 cpu: 250m
170 memory: 256Mi
171 securityContext:
172 runAsUser: 1001
173 terminationMessagePath: /dev/termination-log
174 terminationMessagePolicy: File
175 volumeMounts:
176 - mountPath: /bitnami/postgresql
177 name: data
178 dnsPolicy: ClusterFirst
179 initContainers:
180 - command:
181 - sh
182 - -c
183 - |
184 mkdir -p /bitnami/postgresql/data
185 chmod 700 /bitnami/postgresql/data
186 find /bitnami/postgresql -mindepth 0 -maxdepth 1 -not -name ".snapshot" -not -name "lost+found" | \
187 xargs chown -R 1001:1001
188 image: docker.io/bitnami/minideb:stretch
189 imagePullPolicy: Always
190 name: init-chmod-data
191 resources:
192 requests:
193 cpu: 250m
194 memory: 256Mi
195 securityContext:
196 runAsUser: 0
197 volumeMounts:
198 - mountPath: /bitnami/postgresql
199 name: data
200 restartPolicy: Always
201 securityContext:
202 fsGroup: 1001
203 serviceAccount: recipes
204 serviceAccountName: recipes
205 terminationGracePeriodSeconds: 30
206 volumeClaimTemplates:
207 - apiVersion: v1
208 kind: PersistentVolumeClaim
209 metadata:
210 name: data
211 spec:
212 accessModes:
213 - ReadWriteOnce
214 resources:
215 requests:
216 storage: 50Gi
217 volumeMode: Filesystem
218 storageClassName: rook-ssd-block
219---
220apiVersion: v1
221kind: Service
222metadata:
223 labels:
224 app: recipes
225 tier: database
226 name: recipes-postgresql
227 namespace: tandoor
228spec:
229 ports:
230 - name: postgresql
231 port: 5432
232 protocol: TCP
233 targetPort: postgresql
234 selector:
235 app: recipes
236 tier: database
237 sessionAffinity: None
238 type: ClusterIP
239---
240apiVersion: apps/v1
241kind: Deployment
242metadata:
243 name: recipes
244 namespace: tandoor
245 labels:
246 app: recipes
247 environment: production
248 tier: frontend
249spec:
250 replicas: 1
251 strategy:
252 type: Recreate
253 selector:
254 matchLabels:
255 app: recipes
256 environment: production
257 template:
258 metadata:
259 annotations:
260 backup.velero.io/backup-volumes: media,static
261 labels:
262 app: recipes
263 tier: frontend
264 environment: production
265 spec:
266 restartPolicy: Always
267 serviceAccount: recipes
268 serviceAccountName: recipes
269 initContainers:
270 - name: init-chmod-data
271 env:
272 - name: SECRET_KEY
273 valueFrom:
274 secretKeyRef:
275 name: recipes
276 key: secret-key
277 - name: DB_ENGINE
278 value: django.db.backends.postgresql
279 - name: POSTGRES_HOST
280 value: recipes-postgresql
281 - name: POSTGRES_PORT
282 value: "5432"
283 - name: POSTGRES_USER
284 value: postgres
285 - name: POSTGRES_DB
286 value: recipes
287 - name: POSTGRES_PASSWORD
288 valueFrom:
289 secretKeyRef:
290 name: recipes
291 key: postgresql-postgres-password
292 image: vabene1111/recipes
293 imagePullPolicy: Always
294 resources:
295 requests:
296 cpu: 250m
297 memory: 64Mi
298 command:
299 - sh
300 - -c
301 - |
302 set -e
303 source venv/bin/activate
304 echo "Updating database"
305 python manage.py migrate
306 python manage.py collectstatic_js_reverse
307 python manage.py collectstatic --noinput
308 echo "Setting media file attributes"
309 chown -R 65534:65534 /opt/recipes/mediafiles
310 find /opt/recipes/mediafiles -type d | xargs -r chmod 755
311 find /opt/recipes/mediafiles -type f | xargs -r chmod 644
312 echo "Done"
313 securityContext:
314 runAsUser: 0
315 volumeMounts:
316 - mountPath: /opt/recipes/mediafiles
317 name: media
318 # mount as subPath due to lost+found on ext4 pvc
319 subPath: files
320 - mountPath: /opt/recipes/staticfiles
321 name: static
322 # mount as subPath due to lost+found on ext4 pvc
323 subPath: files
324 containers:
325 - name: recipes-nginx
326 image: nginx:latest
327 imagePullPolicy: IfNotPresent
328 ports:
329 - containerPort: 80
330 protocol: TCP
331 name: http
332 - containerPort: 8080
333 protocol: TCP
334 name: gunicorn
335 resources:
336 requests:
337 cpu: 250m
338 memory: 64Mi
339 volumeMounts:
340 - mountPath: /media
341 name: media
342 # mount as subPath due to lost+found on ext4 pvc
343 subPath: files
344 - mountPath: /static
345 name: static
346 # mount as subPath due to lost+found on ext4 pvc
347 subPath: files
348 - name: nginx-config
349 mountPath: /etc/nginx/nginx.conf
350 subPath: nginx-config
351 readOnly: true
352 - name: recipes
353 image: vabene1111/recipes
354 imagePullPolicy: IfNotPresent
355 command:
356 - /opt/recipes/venv/bin/gunicorn
357 - -b
358 - :8080
359 - --access-logfile
360 - "-"
361 - --error-logfile
362 - "-"
363 - --log-level
364 - INFO
365 - recipes.wsgi
366 livenessProbe:
367 failureThreshold: 3
368 httpGet:
369 path: /
370 port: 8080
371 scheme: HTTP
372 periodSeconds: 30
373 readinessProbe:
374 httpGet:
375 path: /
376 port: 8080
377 scheme: HTTP
378 periodSeconds: 30
379 resources:
380 requests:
381 cpu: 250m
382 memory: 64Mi
383 volumeMounts:
384 - mountPath: /opt/recipes/mediafiles
385 name: media
386 # mount as subPath due to lost+found on ext4 pvc
387 subPath: files
388 - mountPath: /opt/recipes/staticfiles
389 name: static
390 # mount as subPath due to lost+found on ext4 pvc
391 subPath: files
392 env:
393 - name: DEBUG
394 value: "0"
395 - name: ALLOWED_HOSTS
396 value: '*'
397 - name: SECRET_KEY
398 valueFrom:
399 secretKeyRef:
400 name: recipes
401 key: secret-key
402 - name: GUNICORN_MEDIA
403 value: "0"
404 - name: DB_ENGINE
405 value: django.db.backends.postgresql
406 - name: POSTGRES_HOST
407 value: recipes-postgresql
408 - name: POSTGRES_PORT
409 value: "5432"
410 - name: POSTGRES_USER
411 value: postgres
412 - name: POSTGRES_DB
413 value: recipes
414 - name: POSTGRES_PASSWORD
415 valueFrom:
416 secretKeyRef:
417 name: recipes
418 key: postgresql-postgres-password
419 securityContext:
420 runAsUser: 65534
421 volumes:
422 - name: media
423 persistentVolumeClaim:
424 claimName: recipes-media
425 - name: static
426 persistentVolumeClaim:
427 claimName: recipes-static
428 - name: nginx-config
429 configMap:
430 name: recipes-nginx-config
431---
432apiVersion: v1
433kind: Service
434metadata:
435 name: recipes
436 namespace: tandoor
437 labels:
438 app: recipes
439 tier: frontend
440spec:
441 selector:
442 app: recipes
443 tier: frontend
444 environment: production
445 ports:
446 - port: 80
447 targetPort: http
448 name: http
449 protocol: TCP
450 - port: 8080
451 targetPort: gunicorn
452 name: gunicorn
453 protocol: TCP
454---
455apiVersion: networking.k8s.io/v1
456kind: Ingress
457metadata:
458 annotations:
459 kubernetes.io/tls-acme: "true"
460 cert-manager.io/cluster-issuer: letsencrypt-prod
461 name: recipes
462 namespace: tandoor
463spec:
464 ingressClassName: nginx
465 rules:
466 - host: recipes.tblflp.net
467 http:
468 paths:
469 - backend:
470 service:
471 name: recipes
472 port:
473 number: 8080
474 path: /
475 pathType: Prefix
476 - backend:
477 service:
478 name: recipes
479 port:
480 number: 80
481 path: /media
482 pathType: Prefix
483 - backend:
484 service:
485 name: recipes
486 port:
487 number: 80
488 path: /static
489 pathType: Prefix
490 tls:
491 - hosts:
492 - recipes.tblflp.net
493 secretName: recipes-local-tls