apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: ipfs-cluster
spec:
  serviceName: ipfs-cluster
  replicas: 1
  selector:
    matchLabels:
      app: ipfs-cluster
  template:
    metadata:
      labels:
        app: ipfs-cluster
    spec:
      initContainers:
        - name: configure-ipfs
          image: ipfs/kubo:latest
          imagePullPolicy: IfNotPresent
          securityContext:
            runAsUser: 0
          command: ['sh', '/custom/configure-ipfs.sh']
          volumeMounts:
            - name: ipfs-storage
              mountPath: /data/ipfs
            - name: configure-script
              mountPath: /custom

      containers:
        - name: ipfs
          image: ipfs/kubo:latest
          imagePullPolicy: IfNotPresent
          env:
            - name: IPFS_FD_MAX
              value: '4096'
          ports:
            - name: swarm
              protocol: TCP
              containerPort: 4001
            - name: swarm-udp
              protocol: UDP
              containerPort: 4001
            - name: api
              protocol: TCP
              containerPort: 5001
            - name: ws
              protocol: TCP
              containerPort: 8081
            - name: http
              protocol: TCP
              containerPort: 8080
          livenessProbe:
            tcpSocket:
              port: swarm
            initialDelaySeconds: 30
            timeoutSeconds: 5
            periodSeconds: 15
          volumeMounts:
            - name: ipfs-storage
              mountPath: /data/ipfs
            - name: configure-script
              mountPath: /custom
          resources:
            requests:
              cpu: '100m'
              memory: '256Mi'
            limits:
              cpu: '500m'
              memory: '512Mi'

        - name: ipfs-cluster
          image: ipfs/ipfs-cluster:latest
          imagePullPolicy: IfNotPresent
          command: ['sh', '/custom/entrypoint.sh']
          env:
            - name: BOOTSTRAP_PEER_ID
              valueFrom:
                configMapKeyRef:
                  name: env-config
                  key: bootstrap-peer-id
            - name: BOOTSTRAP_PEER_PRIV_KEY
              valueFrom:
                secretKeyRef:
                  name: ipfs-cluster-secret
                  key: bootstrap-peer-priv-key
            - name: CLUSTER_SECRET
              valueFrom:
                secretKeyRef:
                  name: ipfs-cluster-secret
                  key: cluster-secret
            - name: CLUSTER_MONITOR_PING_INTERVAL
              value: '3m'
            - name: SVC_NAME
              valueFrom:
                configMapKeyRef:
                  name: env-config
                  key: CLUSTER_SVC_NAME
          ports:
            - name: api-http
              containerPort: 9094
              protocol: TCP
            - name: proxy-http
              containerPort: 9095
              protocol: TCP
            - name: cluster-swarm
              containerPort: 9096
              protocol: TCP
          livenessProbe:
            tcpSocket:
              port: cluster-swarm
            initialDelaySeconds: 5
            timeoutSeconds: 5
            periodSeconds: 10
          volumeMounts:
            - name: cluster-storage
              mountPath: /data/ipfs-cluster
            - name: configure-script
              mountPath: /custom
          resources:
            requests:
              cpu: '100m'
              memory: '128Mi'
            limits:
              cpu: '500m'
              memory: '512Mi'

      volumes:
        - name: configure-script
          configMap:
            name: ipfs-cluster-set-bootstrap-conf
            defaultMode: 0755

  volumeClaimTemplates:
    - metadata:
        name: cluster-storage
      spec:
        storageClassName: ipfs-storage-class
        accessModes: ['ReadWriteOnce']
        resources:
          requests:
            storage: 1Gi
    - metadata:
        name: ipfs-storage
      spec:
        storageClassName: ipfs-storage-class
        accessModes: ['ReadWriteOnce']
        resources:
          requests:
            storage: 5Gi
