apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: elasticsearch
  namespace: $NAMESPACE
spec:
  serviceName: elasticsearch
  replicas: 1
  selector:
    matchLabels:
      app: elasticsearch
  template:
    metadata:
      labels:
        app: elasticsearch
    spec:
      nodeSelector:
        doks.digitalocean.com/node-pool: standard
      terminationGracePeriodSeconds: 300
      initContainers:
      # NOTE:
      # This is to fix the permission on the volume
      # By default elasticsearch container is not run as
      # non root user.
      # https://www.elastic.co/guide/en/elasticsearch/reference/current/docker.html#_notes_for_production_use_and_defaults
      - name: fix-the-volume-permission
        image: busybox
        command:
        - sh
        - -c
        - chown -R 1000:1000 /usr/share/elasticsearch/data
        securityContext:
          privileged: true
        volumeMounts:
        - name: data
          mountPath: /usr/share/elasticsearch/data
      # NOTE:
      # To increase the default vm.max_map_count to 262144
      # https://www.elastic.co/guide/en/elasticsearch/reference/current/docker.html#docker-cli-run-prod-mode
      - name: increase-the-vm-max-map-count
        image: busybox
        command:
        - sysctl
        - -w
        - vm.max_map_count=262144
        securityContext:
          privileged: true
      # To increase the ulimit
      # https://www.elastic.co/guide/en/elasticsearch/reference/current/docker.html#_notes_for_production_use_and_defaults
      - name: increase-the-ulimit
        image: busybox
        command:
        - sh
        - -c
        - ulimit -n 65536
        securityContext:
          privileged: true
      containers:
      - name: elasticsearch
        image: docker.elastic.co/elasticsearch/elasticsearch-oss:7.8.1
        ports:
        - containerPort: 9200
          name: http
        - containerPort: 9300
          name: tcp
        # NOTE: you can increase this resources
        # resources:
        #   requests:
        #     memory: 8Gi
        #   limits:
        #     memory: 16Gi
        env:
          # NOTE: the cluster name; update this
          - name: cluster.name
            value: elasticsearch-cluster
          - name: node.name
            valueFrom:
              fieldRef:
                fieldPath: metadata.name
          - name: cluster.initial_master_nodes
            value: "elasticsearch-0" # ,elasticsearch-1,elasticsearch-2.elasticsearch.production.svc.cluster.local,elasticsearch-3.elasticsearch.production.svc.cluster.local,elasticsearch-4.elasticsearch.production.svc.cluster.local"
          # NOTE: This will tell the elasticsearch node where to connect to other nodes to form a cluster
          - name: discovery.zen.ping.unicast.hosts
            value: "elasticsearch-0.elasticsearch.production.svc.cluster.local" # ,elasticsearch-1.elasticsearch.production.svc.cluster.local"
          - name: thread_pool.write.queue_size
            value: "1000"
          - name: reindex.remote.whitelist
            value: 178.128.132.236:9200

          # NOTE: You can increase the heap size
          - name: ES_JAVA_OPTS
            value: -Xms1g -Xmx1g
          # - name: ES_JAVA_OPTS
          #   value: -Xms4g -Xmx4g
          - name: NETWORK_HOST # for vpn to be able to access (bind to any local ip)
            value: "site,local"
        volumeMounts:
        - name: data
          mountPath: /usr/share/elasticsearch/data
  volumeClaimTemplates:
  - metadata:
      name: data
    spec:
      accessModes:
        - ReadWriteOnce
      storageClassName: do-block-storage
      resources:
        requests:
          storage: 50Gi
