feat: allow deploying with standalone mode (#665)

Signed-off-by: Ashish Tiwari <ashishjaitiwari15112000@gmail.com>
diff --git a/charts/apisix/README.md b/charts/apisix/README.md
index 3b9b239..fc39224 100644
--- a/charts/apisix/README.md
+++ b/charts/apisix/README.md
@@ -120,7 +120,7 @@
 | dashboard.config.conf.etcd.prefix | string | `"/apisix"` | apisix configurations prefix |
 | dashboard.config.conf.etcd.username | string | `nil` | Specifies etcd basic auth username if enable etcd auth |
 | dashboard.enabled | bool | `false` |  |
-| deployment.mode | string | `"traditional"` | Apache APISIX deployment mode Optional: traditional, decoupled  ref: https://apisix.apache.org/docs/apisix/deployment-modes/ |
+| deployment.mode | string | `"traditional"` | Apache APISIX deployment mode Optional: traditional, decoupled, standalone  ref: https://apisix.apache.org/docs/apisix/deployment-modes/ |
 | deployment.role | string | `"traditional"` | Deployment role Optional: traditional, data_plane, control_plane  ref: https://apisix.apache.org/docs/apisix/deployment-modes/ |
 | discovery.enabled | bool | `false` | Enable or disable Apache APISIX integration service discovery |
 | discovery.registry | object | `{}` | Registry is the same to the one in APISIX [config-default.yaml](https://github.com/apache/apisix/blob/master/conf/config-default.yaml#L281), and refer to such file for more setting details. also refer to [this documentation for integration service discovery](https://apisix.apache.org/docs/apisix/discovery) |
diff --git a/charts/apisix/templates/_pod.tpl b/charts/apisix/templates/_pod.tpl
index 5677349..bfa5543 100644
--- a/charts/apisix/templates/_pod.tpl
+++ b/charts/apisix/templates/_pod.tpl
@@ -29,6 +29,9 @@
         {{- . | toYaml | nindent 8 }}
       {{- end }}
       image: "{{ .Values.apisix.image.repository }}:{{ default .Chart.AppVersion .Values.apisix.image.tag }}"
+      {{- if eq .Values.deployment.mode "standalone" }}
+      command: ["sh", "-c","ln -s /apisix-config/apisix.yaml /usr/local/apisix/conf/apisix.yaml && /docker-entrypoint.sh docker-start"]
+      {{- end }}
       imagePullPolicy: {{ .Values.apisix.image.pullPolicy }}
       env:
       {{- if .Values.apisix.timezone }}
@@ -133,6 +136,10 @@
               - -c
               - "sleep 30"
       volumeMounts:
+      {{- if eq .Values.deployment.mode "standalone" }}
+        - mountPath: /apisix-config
+          name: apisix-admin
+      {{- end }}
       {{- if .Values.apisix.setIDFromPodUID }}
         - mountPath: /usr/local/apisix/conf/apisix.uid
           name: id
@@ -198,6 +205,11 @@
     {{- toYaml .Values.extraInitContainers | nindent 4 }}
     {{- end }}
   volumes:
+    {{- if eq .Values.deployment.mode "standalone" }}
+    - configMap:
+        name: apisix.yaml
+      name: apisix-admin
+    {{- end }}
     - configMap:
         name: {{ include "apisix.fullname" . }}
       name: apisix-config
diff --git a/charts/apisix/templates/apisix-config-configmap.yaml b/charts/apisix/templates/apisix-config-configmap.yaml
new file mode 100644
index 0000000..bcd297a
--- /dev/null
+++ b/charts/apisix/templates/apisix-config-configmap.yaml
@@ -0,0 +1,32 @@
+#
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements.  See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License.  You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+{{- if eq .Values.deployment.mode "standalone" }}
+kind: ConfigMap
+apiVersion: v1
+metadata:
+  name: apisix.yaml
+data:
+  apisix.yaml: |
+    routes:
+    -
+      uri: /hi
+      upstream:
+        nodes:
+          "127.0.0.1:1980": 1
+        type: roundrobin
+    #END
+{{- end }}
\ No newline at end of file
diff --git a/charts/apisix/templates/configmap.yaml b/charts/apisix/templates/configmap.yaml
index 436bb54..0edb553 100644
--- a/charts/apisix/templates/configmap.yaml
+++ b/charts/apisix/templates/configmap.yaml
@@ -53,7 +53,11 @@
         {{- end }}
       {{- end }}
       enable_heartbeat: true
+      {{- if eq .Values.deployment.mode "standalone" }}
+      enable_admin: false
+      {{ else }}
       enable_admin: {{ .Values.admin.enabled }}
+      {{- end }}
       enable_admin_cors: {{ .Values.admin.cors }}
       enable_debug: false
       {{- if or .Values.customPlugins.enabled .Values.apisix.luaModuleHook.enabled }}
@@ -307,9 +311,10 @@
         config_provider: etcd
       {{- end }}
 
+ 
       {{- if eq .Values.deployment.role "data_plane" }}
       role_data_plane:
-        config_provider: etcd
+        config_provider: {{- eq .Values.deployment.mode "standalone" | ternary "yaml" "etcd" | indent 1 }}
       {{- end }}
 
       {{- if not (eq .Values.deployment.role "data_plane") }}
@@ -353,7 +358,7 @@
             {{- end }}
             role: viewer
       {{- end }}
-
+      {{- if not (eq .Values.deployment.mode "standalone")}}
       etcd:
       {{- if .Values.etcd.enabled }}
         host:                          # it's possible to define multiple etcd hosts addresses of the same etcd cluster.
@@ -379,6 +384,7 @@
           sni: "{{ .Values.etcd.auth.tls.sni }}"
         {{- end }}
       {{- end }}
+      {{- end }}
 
       
 {{- end }}
diff --git a/charts/apisix/values.yaml b/charts/apisix/values.yaml
index 4d3f560..a04e3c1 100644
--- a/charts/apisix/values.yaml
+++ b/charts/apisix/values.yaml
@@ -207,7 +207,7 @@
 
 deployment:
   # -- Apache APISIX deployment mode
-  # Optional: traditional, decoupled
+  # Optional: traditional, decoupled, standalone
   #
   # ref: https://apisix.apache.org/docs/apisix/deployment-modes/
   mode: traditional
diff --git a/docs/en/latest/FAQ.md b/docs/en/latest/FAQ.md
index 2c5c5e6..a5d85c2 100644
--- a/docs/en/latest/FAQ.md
+++ b/docs/en/latest/FAQ.md
@@ -39,260 +39,7 @@
 
 ### How to install Apache APISIX running in standalone mode?
 
-Helm chart does not provide a direct way to deploy Apache APISIX running in standalone mode. You can install it in the following manner.
-
-Create a `deploy.yaml` with the following content.
-
-<Tabs
-  groupId="version"
-  defaultValue="3.0.0-beta"
-  values={[
-    {label: '3.0.0-beta', value: '3.0.0-beta'},
-    {label: '2.15', value: '2.15'},
-  ]}>
-
-<TabItem value="3.0.0-beta">
-
-```yaml
-# deploy.yaml
-kind: ConfigMap
-apiVersion: v1
-metadata:
-  name: apisix-gw-config.yaml
-data:
-  config.yaml: |
-    deployment:
-      role: data_plane
-      role_data_plane:
-        config_provider: yaml
----
-kind: ConfigMap
-apiVersion: v1
-metadata:
-  name: apisix.yaml
-data:
-  apisix.yaml: |
-    routes:
-      -
-        uri: /hi
-        upstream:
-          nodes:
-            "127.0.0.1:1980": 1
-          type: roundrobin
-    #END
----
-apiVersion: apps/v1
-kind: Deployment
-metadata:
-  name: apisix-deployment
-spec:
-  replicas: 1
-  selector:
-    matchLabels:
-      app: apisix-deployment
-  strategy:
-    rollingUpdate:
-      maxSurge: 50%
-      maxUnavailable: 1
-    type: RollingUpdate
-  template:
-    metadata:
-      labels:
-        app: apisix-deployment
-    spec:
-      terminationGracePeriodSeconds: 0
-      containers: 
-        - livenessProbe:
-            failureThreshold: 3
-            initialDelaySeconds: 1
-            periodSeconds: 2
-            successThreshold: 1
-            tcpSocket:
-              port: 9080
-            timeoutSeconds: 2
-          readinessProbe:
-            failureThreshold: 3
-            initialDelaySeconds: 1
-            periodSeconds: 2
-            successThreshold: 1
-            tcpSocket:
-              port: 9080
-            timeoutSeconds: 2
-          image: "apache/apisix:2.99.0-centos"
-          imagePullPolicy: IfNotPresent
-          name: apisix-deployment
-          # Create a soft link to link the apisix.yaml file in the mount directory to /usr/local/apisix/conf/apisix.yaml.
-          command: ["sh", "-c","ln -s /apisix-config/apisix.yaml /usr/local/apisix/conf/apisix.yaml && /docker-entrypoint.sh docker-start"]
-          ports:
-            - containerPort: 9080
-              name: "http"
-              protocol: "TCP"
-            - containerPort: 9443
-              name: "https"
-              protocol: "TCP"
-              
-          volumeMounts:
-            - mountPath: /usr/local/apisix/conf/config.yaml
-              name: apisix-config-yaml-configmap
-              subPath: config.yaml
-            # configMap directory mounts
-            - mountPath: /apisix-config
-              name: apisix-admin
-      volumes:
-        - configMap:
-            name: apisix-gw-config.yaml
-          name: apisix-config-yaml-configmap
-        - configMap:
-            name: apisix.yaml
-          name: apisix-admin
----
-apiVersion: v1
-kind: Service
-metadata:
-  name: apisix-service
-spec:
-  selector:
-    app: apisix-deployment
-  ports:
-    - name: http
-      port: 9080
-      protocol: TCP
-      targetPort: 9080
-    - name: https
-      port: 9443
-      protocol: TCP
-      targetPort: 9443
-  type: NodePort
-```
-
-</TabItem>
-
-<TabItem value="2.15">
-
-```yaml
-# deploy.yaml
-kind: ConfigMap
-apiVersion: v1
-metadata:
-  name: apisix-gw-config.yaml
-data:
-  config.yaml: |
-    apisix:
-      enable_admin: false
-      config_center: yaml
----
-kind: ConfigMap
-apiVersion: v1
-metadata:
-  name: apisix.yaml
-data:
-  apisix.yaml: |
-    routes:
-      -
-        uri: /hi
-        upstream:
-          nodes:
-            "127.0.0.1:1980": 1
-          type: roundrobin
-    #END
----
-apiVersion: apps/v1
-kind: Deployment
-metadata:
-  name: apisix-deployment
-spec:
-  replicas: 1
-  selector:
-    matchLabels:
-      app: apisix-deployment
-  strategy:
-    rollingUpdate:
-      maxSurge: 50%
-      maxUnavailable: 1
-    type: RollingUpdate
-  template:
-    metadata:
-      labels:
-        app: apisix-deployment
-    spec:
-      terminationGracePeriodSeconds: 0
-      containers: 
-        - livenessProbe:
-            failureThreshold: 3
-            initialDelaySeconds: 1
-            periodSeconds: 2
-            successThreshold: 1
-            tcpSocket:
-              port: 9080
-            timeoutSeconds: 2
-          readinessProbe:
-            failureThreshold: 3
-            initialDelaySeconds: 1
-            periodSeconds: 2
-            successThreshold: 1
-            tcpSocket:
-              port: 9080
-            timeoutSeconds: 2
-          image: "apache/apisix:2.15.0-alpine"
-          imagePullPolicy: IfNotPresent
-          name: apisix-deployment
-          # Create a soft link to link the apisix.yaml file in the mount directory to /usr/local/apisix/conf/apisix.yaml.
-          command: ["sh", "-c", "ln -s /apisix-config/apisix.yaml /usr/local/apisix/conf/apisix.yaml && /usr/bin/apisix init && /usr/bin/apisix init_etcd && /usr/local/openresty/bin/openresty -p /usr/local/apisix -g 'daemon off;'"]
-          ports:
-            - containerPort: 9080
-              name: "http"
-              protocol: "TCP"
-            - containerPort: 9443
-              name: "https"
-              protocol: "TCP"
-          volumeMounts:
-            - mountPath: /usr/local/apisix/conf/config.yaml
-              name: apisix-config-yaml-configmap
-              subPath: config.yaml
-            # configMap directory mounts
-            - mountPath: /apisix-config
-              name: apisix-admin
-      volumes:
-        - configMap:
-            name: apisix-gw-config.yaml
-          name: apisix-config-yaml-configmap
-        - configMap:
-            name: apisix.yaml
-          name: apisix-admin
----
-apiVersion: v1
-kind: Service
-metadata:
-  name: apisix-service
-spec:
-  selector:
-    app: apisix-deployment
-  ports:
-    - name: http
-      port: 9080
-      protocol: TCP
-      targetPort: 9080
-    - name: https
-      port: 9443
-      protocol: TCP
-      targetPort: 9443
-  type: NodePort
-```
-
-</TabItem>
-
-</Tabs>
-
-Apply the configuration in `deploy.yaml` to pod.
-
-```shell
-kubectl apply -f deploy.yaml
-```
-
-:::note
-1. The mount of the `apisix.yaml` file requires the injection of the softlink command, so do not change the configMap mount directory to `/usr/local/apisix/conf`, to avoid other configuration files being overwritten.
-2. The `apisix.yaml` is mounted as a configMap, so there will be a delay in reloading the rules after `apisix.yaml` is changed; please refer to this [document](https://kubernetes.io/docs/concepts/configuration/configmap/#mounted-configmaps-are-updated-automatically) for details. 
-:::
+helm install apisix apisix/apisix  --set deployment.mode=standalone --set etcd.enabled=false --set deployment.role=data_plane
 
 ### Why get 403 when I access Apache APISIX admin api?