# MinIO — Ephemeral object storage for integration tests # Namespace is substituted at runtime via envsubst # No persistence — uses emptyDir # Credentials: minioadmin/minioadmin (hardcoded for ephemeral sandbox) # Includes a Job that waits for MinIO readiness and creates the stonks-normalized bucket --- apiVersion: apps/v1 kind: Deployment metadata: name: minio namespace: ${NAMESPACE} labels: app: minio tier: infra app.kubernetes.io/part-of: stonks-oracle spec: replicas: 1 selector: matchLabels: app: minio template: metadata: labels: app: minio tier: infra spec: automountServiceAccountToken: false imagePullSecrets: - name: dockerhub-credentials securityContext: runAsNonRoot: true runAsUser: 1000 runAsGroup: 1000 fsGroup: 1000 seccompProfile: type: RuntimeDefault containers: - name: minio image: minio/minio:latest imagePullPolicy: IfNotPresent args: ["server", "/data"] ports: - containerPort: 9000 protocol: TCP - containerPort: 9001 protocol: TCP env: - name: MINIO_ROOT_USER value: "minioadmin" - name: MINIO_ROOT_PASSWORD value: "minioadmin" securityContext: allowPrivilegeEscalation: false capabilities: drop: ["ALL"] resources: requests: cpu: 100m memory: 256Mi limits: cpu: 500m memory: 512Mi readinessProbe: httpGet: path: /minio/health/ready port: 9000 initialDelaySeconds: 5 periodSeconds: 5 timeoutSeconds: 3 failureThreshold: 6 livenessProbe: httpGet: path: /minio/health/live port: 9000 initialDelaySeconds: 15 periodSeconds: 10 timeoutSeconds: 3 failureThreshold: 3 volumeMounts: - name: data mountPath: /data volumes: - name: data emptyDir: sizeLimit: 1Gi --- apiVersion: v1 kind: Service metadata: name: minio namespace: ${NAMESPACE} labels: app: minio tier: infra app.kubernetes.io/part-of: stonks-oracle spec: selector: app: minio ports: - port: 9000 targetPort: 9000 protocol: TCP --- apiVersion: batch/v1 kind: Job metadata: name: minio-bucket-init namespace: ${NAMESPACE} labels: app: minio tier: infra app.kubernetes.io/part-of: stonks-oracle spec: backoffLimit: 4 template: metadata: labels: app: minio-bucket-init tier: infra spec: imagePullSecrets: - name: dockerhub-credentials automountServiceAccountToken: false securityContext: runAsNonRoot: true runAsUser: 1000 runAsGroup: 1000 seccompProfile: type: RuntimeDefault restartPolicy: OnFailure containers: - name: mc image: minio/mc:latest imagePullPolicy: IfNotPresent securityContext: allowPrivilegeEscalation: false capabilities: drop: ["ALL"] resources: requests: cpu: 50m memory: 64Mi limits: cpu: 250m memory: 128Mi command: ["/bin/sh", "-c"] env: - name: NO_PROXY value: "minio,.local,10.0.0.0/8,192.168.0.0/16" - name: no_proxy value: "minio,.local,10.0.0.0/8,192.168.0.0/16" args: - | echo "Waiting for MinIO to be ready..." until mc alias set sandbox http://minio:9000 minioadmin minioadmin 2>/dev/null; do echo "MinIO not ready, retrying in 2s..." sleep 2 done echo "MinIO is ready. Creating bucket..." mc mb --ignore-existing sandbox/stonks-normalized echo "Bucket stonks-normalized created successfully."