apiVersion: v1 kind: Namespace metadata: name: paprika-api --- apiVersion: v1 kind: Secret metadata: name: api-secrets namespace: paprika-api type: Opaque stringData: APP_KEY: rIkZNEpVHFAyKJSPq3t8aue0NzaIgF83 # Change this if needed DB_PASSWORD: Paprika_2025 DB_USER: paprika DB_DATABASE: paprika --- apiVersion: v1 kind: PersistentVolumeClaim metadata: name: postgres-pvc namespace: paprika-api spec: accessModes: - ReadWriteOnce resources: requests: storage: 1Gi --- apiVersion: v1 kind: PersistentVolumeClaim metadata: name: paprika-uploads-pvc namespace: paprika-api spec: accessModes: - ReadWriteOnce resources: requests: storage: 1Gi --- apiVersion: apps/v1 kind: Deployment metadata: name: postgres namespace: paprika-api spec: replicas: 1 selector: matchLabels: app: postgres template: metadata: labels: app: postgres spec: containers: - name: postgres image: postgres:16-alpine ports: - containerPort: 5432 env: - name: POSTGRES_USER valueFrom: secretKeyRef: name: api-secrets key: DB_USER - name: POSTGRES_PASSWORD valueFrom: secretKeyRef: name: api-secrets key: DB_PASSWORD - name: POSTGRES_DB valueFrom: secretKeyRef: name: api-secrets key: DB_DATABASE volumeMounts: - name: postgres-storage mountPath: /var/lib/postgresql/data volumes: - name: postgres-storage persistentVolumeClaim: claimName: postgres-pvc --- apiVersion: v1 kind: Service metadata: name: postgres namespace: paprika-api spec: selector: app: postgres ports: - port: 5432 targetPort: 5432 --- apiVersion: apps/v1 kind: Deployment metadata: name: paprika-api namespace: paprika-api spec: replicas: 1 selector: matchLabels: app: paprika-api template: metadata: labels: app: paprika-api spec: containers: - name: paprika-api image: paprika-api:latest # Update with your image imagePullPolicy: Never ports: - containerPort: 3333 env: - name: NODE_ENV value: production - name: APP_KEY valueFrom: secretKeyRef: name: api-secrets key: APP_KEY - name: DB_HOST value: postgres - name: DB_PORT value: "5432" - name: DB_USER valueFrom: secretKeyRef: name: api-secrets key: DB_USER - name: DB_PASSWORD valueFrom: secretKeyRef: name: api-secrets key: DB_PASSWORD - name: DB_DATABASE valueFrom: secretKeyRef: name: api-secrets key: DB_DATABASE - name: PORT value: "3333" - name: HOST value: 0.0.0.0 - name: LOG_LEVEL value: info - name: LIMITER_STORE value: database - name: TZ value: UTC - name: DRIVE_DISK value: fs volumeMounts: - name: uploads-storage mountPath: /app/storage/uploads volumes: - name: uploads-storage persistentVolumeClaim: claimName: paprika-uploads-pvc --- apiVersion: v1 kind: Service metadata: name: paprika-api namespace: paprika-api spec: selector: app: paprika-api ports: - port: 80 targetPort: 3333 --- apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: paprika-api-ingress namespace: paprika-api annotations: kubernetes.io/ingress.class: traefik # k3s uses traefik by default spec: rules: - host: dave.dev # Update with your domain http: paths: - path: /api pathType: Prefix backend: service: name: paprika-api port: number: 80