Index: k8s/backend.yaml
===================================================================
--- k8s/backend.yaml	(revision c0086c00a5899d38577d47ee07ef2f1dc672069e)
+++ k8s/backend.yaml	(revision c0086c00a5899d38577d47ee07ef2f1dc672069e)
@@ -0,0 +1,66 @@
+apiVersion: apps/v1
+kind: Deployment
+metadata:
+  name: backend
+  namespace: trekr
+spec:
+  replicas: 1
+  selector:
+    matchLabels:
+      app: backend
+  template:
+    metadata:
+      labels:
+        app: backend
+    spec:
+      initContainers:
+        - name: wait-for-postgres
+          image: postgres:16-alpine
+          command: [sh, -c, until pg_isready -h postgres -p 5432 -U trekr; do sleep 2; done]
+      containers:
+        - name: backend
+          image: trekr-backend:latest  # overwritten by pipeline via kubectl set image
+          env:
+            - name: SPRING_DATASOURCE_URL
+              value: jdbc:postgresql://postgres:5432/trekr
+            - name: SPRING_DATASOURCE_USERNAME
+              value: trekr
+            - name: SPRING_DATASOURCE_PASSWORD
+              valueFrom:
+                secretKeyRef:
+                  name: trekr-secrets
+                  key: db-password
+            - name: SPRING_JPA_HIBERNATE_DDL_AUTO
+              value: none
+            - name: JWT_SECRET
+              valueFrom:
+                secretKeyRef:
+                  name: trekr-secrets
+                  key: jwt-secret
+          ports:
+            - containerPort: 8080
+          readinessProbe:
+            httpGet:
+              path: /api/auth/ping
+              port: 8080
+            initialDelaySeconds: 20
+            periodSeconds: 10
+            failureThreshold: 6
+          livenessProbe:
+            httpGet:
+              path: /api/auth/ping
+              port: 8080
+            initialDelaySeconds: 60
+            periodSeconds: 15
+---
+apiVersion: v1
+kind: Service
+metadata:
+  name: backend
+  namespace: trekr
+spec:
+  selector:
+    app: backend
+  ports:
+    - port: 8080
+      targetPort: 8080
Index: k8s/frontend.yaml
===================================================================
--- k8s/frontend.yaml	(revision c0086c00a5899d38577d47ee07ef2f1dc672069e)
+++ k8s/frontend.yaml	(revision c0086c00a5899d38577d47ee07ef2f1dc672069e)
@@ -0,0 +1,40 @@
+apiVersion: apps/v1
+kind: Deployment
+metadata:
+  name: frontend
+  namespace: trekr
+spec:
+  replicas: 1
+  selector:
+    matchLabels:
+      app: frontend
+  template:
+    metadata:
+      labels:
+        app: frontend
+    spec:
+      containers:
+        - name: frontend
+          image: trekr-frontend:latest  # overwritten by pipeline via kubectl set image
+          ports:
+            - containerPort: 80
+          readinessProbe:
+            httpGet:
+              path: /
+              port: 80
+            initialDelaySeconds: 5
+            periodSeconds: 5
+---
+apiVersion: v1
+kind: Service
+metadata:
+  name: frontend
+  namespace: trekr
+spec:
+  type: NodePort
+  selector:
+    app: frontend
+  ports:
+    - port: 80
+      targetPort: 80
+      nodePort: 30080
Index: k8s/namespace.yaml
===================================================================
--- k8s/namespace.yaml	(revision c0086c00a5899d38577d47ee07ef2f1dc672069e)
+++ k8s/namespace.yaml	(revision c0086c00a5899d38577d47ee07ef2f1dc672069e)
@@ -0,0 +1,4 @@
+apiVersion: v1
+kind: Namespace
+metadata:
+  name: trekr
Index: k8s/postgres.yaml
===================================================================
--- k8s/postgres.yaml	(revision c0086c00a5899d38577d47ee07ef2f1dc672069e)
+++ k8s/postgres.yaml	(revision c0086c00a5899d38577d47ee07ef2f1dc672069e)
@@ -0,0 +1,71 @@
+apiVersion: v1
+kind: PersistentVolumeClaim
+metadata:
+  name: postgres-pvc
+  namespace: trekr
+spec:
+  accessModes: [ReadWriteOnce]
+  resources:
+    requests:
+      storage: 5Gi
+---
+apiVersion: apps/v1
+kind: StatefulSet
+metadata:
+  name: postgres
+  namespace: trekr
+spec:
+  serviceName: postgres
+  replicas: 1
+  selector:
+    matchLabels:
+      app: postgres
+  template:
+    metadata:
+      labels:
+        app: postgres
+    spec:
+      containers:
+        - name: postgres
+          image: postgres:16-alpine
+          env:
+            - name: POSTGRES_DB
+              value: trekr
+            - name: POSTGRES_USER
+              value: trekr
+            - name: POSTGRES_PASSWORD
+              valueFrom:
+                secretKeyRef:
+                  name: trekr-secrets
+                  key: db-password
+          ports:
+            - containerPort: 5432
+          volumeMounts:
+            - name: data
+              mountPath: /var/lib/postgresql/data
+            - name: init-sql
+              mountPath: /docker-entrypoint-initdb.d
+          readinessProbe:
+            exec:
+              command: [pg_isready, -U, trekr, -d, trekr]
+            initialDelaySeconds: 5
+            periodSeconds: 5
+      volumes:
+        - name: data
+          persistentVolumeClaim:
+            claimName: postgres-pvc
+        - name: init-sql
+          configMap:
+            name: trekr-db-init
+---
+apiVersion: v1
+kind: Service
+metadata:
+  name: postgres
+  namespace: trekr
+spec:
+  selector:
+    app: postgres
+  ports:
+    - port: 5432
+      targetPort: 5432
