# services/health/sparkyfitness-server-deployment.yaml apiVersion: apps/v1 kind: Deployment metadata: name: sparkyfitness-server namespace: health labels: app: sparkyfitness-server spec: replicas: 1 selector: matchLabels: app: sparkyfitness-server strategy: type: RollingUpdate rollingUpdate: maxSurge: 0 maxUnavailable: 1 template: metadata: labels: app: sparkyfitness-server spec: affinity: nodeAffinity: requiredDuringSchedulingIgnoredDuringExecution: nodeSelectorTerms: - matchExpressions: - key: hardware operator: In values: ["rpi5", "rpi4"] - key: node-role.kubernetes.io/worker operator: Exists preferredDuringSchedulingIgnoredDuringExecution: - weight: 90 preference: matchExpressions: - key: hardware operator: In values: ["rpi5"] - weight: 70 preference: matchExpressions: - key: hardware operator: In values: ["rpi4"] securityContext: runAsUser: 1000 runAsGroup: 1000 fsGroup: 1000 fsGroupChangePolicy: OnRootMismatch initContainers: - name: init-data image: alpine:3.20 command: ["/bin/sh", "-c"] args: - | set -e mkdir -p /data/uploads /data/backup chown -R 1000:1000 /data securityContext: runAsUser: 0 runAsGroup: 0 volumeMounts: - name: sparkyfitness-data mountPath: /data containers: - name: sparkyfitness-server image: codewithcj/sparkyfitness_server:0.16.3.3 imagePullPolicy: IfNotPresent ports: - name: http containerPort: 3010 env: - name: SPARKY_FITNESS_SERVER_PORT value: "3010" - name: SPARKY_FITNESS_LOG_LEVEL value: INFO - name: NODE_ENV value: production - name: TZ value: Etc/UTC - name: SPARKY_FITNESS_FRONTEND_URL value: https://sparkyfitness.bstein.dev - name: SPARKY_FITNESS_DISABLE_SIGNUP value: "false" - name: SPARKY_FITNESS_DB_HOST valueFrom: secretKeyRef: name: sparkyfitness-db key: SPARKY_FITNESS_DB_HOST - name: SPARKY_FITNESS_DB_PORT valueFrom: secretKeyRef: name: sparkyfitness-db key: SPARKY_FITNESS_DB_PORT - name: SPARKY_FITNESS_DB_NAME valueFrom: secretKeyRef: name: sparkyfitness-db key: SPARKY_FITNESS_DB_NAME - name: SPARKY_FITNESS_DB_USER valueFrom: secretKeyRef: name: sparkyfitness-db key: SPARKY_FITNESS_DB_USER - name: SPARKY_FITNESS_DB_PASSWORD valueFrom: secretKeyRef: name: sparkyfitness-db key: SPARKY_FITNESS_DB_PASSWORD - name: SPARKY_FITNESS_APP_DB_USER valueFrom: secretKeyRef: name: sparkyfitness-db key: SPARKY_FITNESS_APP_DB_USER - name: SPARKY_FITNESS_APP_DB_PASSWORD valueFrom: secretKeyRef: name: sparkyfitness-db key: SPARKY_FITNESS_APP_DB_PASSWORD - name: SPARKY_FITNESS_API_ENCRYPTION_KEY valueFrom: secretKeyRef: name: sparkyfitness-secrets key: SPARKY_FITNESS_API_ENCRYPTION_KEY - name: JWT_SECRET valueFrom: secretKeyRef: name: sparkyfitness-secrets key: JWT_SECRET - name: SPARKY_FITNESS_ADMIN_EMAIL valueFrom: secretKeyRef: name: sparkyfitness-admin key: email volumeMounts: - name: sparkyfitness-data mountPath: /app/SparkyFitnessServer/uploads subPath: uploads - name: sparkyfitness-data mountPath: /app/SparkyFitnessServer/backup subPath: backup readinessProbe: httpGet: path: /health port: http initialDelaySeconds: 15 periodSeconds: 10 timeoutSeconds: 3 failureThreshold: 6 livenessProbe: httpGet: path: /health port: http initialDelaySeconds: 30 periodSeconds: 20 timeoutSeconds: 3 failureThreshold: 6 resources: requests: cpu: 200m memory: 512Mi limits: cpu: "1" memory: 2Gi volumes: - name: sparkyfitness-data persistentVolumeClaim: claimName: sparkyfitness-data