You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@apisix.apache.org by ju...@apache.org on 2020/10/29 10:08:22 UTC

[apisix-dashboard] branch feat-adjust-folder created (now 24587f9)

This is an automated email from the ASF dual-hosted git repository.

juzhiyuan pushed a change to branch feat-adjust-folder
in repository https://gitbox.apache.org/repos/asf/apisix-dashboard.git.


      at 24587f9  feat: refactor api & frontend

This branch includes the following new commits:

     new 24587f9  feat: refactor api & frontend

The 1 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.



[apisix-dashboard] 01/01: feat: refactor api & frontend

Posted by ju...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

juzhiyuan pushed a commit to branch feat-adjust-folder
in repository https://gitbox.apache.org/repos/asf/apisix-dashboard.git

commit 24587f9aab90fe401e582b473eae4a6a781001a8
Author: juzhiyuan <ju...@apache.org>
AuthorDate: Thu Oct 29 18:08:08 2020 +0800

    feat: refactor api & frontend
---
 .asf.yaml                                          |   1 -
 .dockerignore                                      |   1 -
 .github/workflows/deploy-api.yml                   |  60 --
 .github/workflows/deploy-frontend.yml              |  22 -
 .gitignore                                         |   5 +-
 Dockerfile                                         |  37 -
 README.md                                          |   1 -
 README.zh-CN.md                                    |   1 -
 api/build.sh                                       |  11 +-
 api/conf/conf.go                                   |   2 +-
 api/conf/conf.json                                 |  31 -
 api/run.sh                                         |   2 +-
 compose/README.md                                  |  35 -
 compose/apisix_conf/config.yaml                    |  38 -
 compose/dashboard_conf/nginx.conf                  |  39 -
 compose/docker-compose.yml                         | 134 ---
 compose/grafana_conf/config/grafana.ini            | 756 -----------------
 .../dashboards/apisix_http_prometheus.json         | 933 ---------------------
 .../grafana_conf/provisioning/dashboards/all.yaml  |  27 -
 .../grafana_conf/provisioning/datasources/all.yaml |  25 -
 compose/manager_conf/entry.sh                      |  38 -
 compose/prometheus_conf/prometheus.yml             |  39 -
 docker/nginx.conf                                  |  38 -
 docs/deploy.md                                     |   6 +-
 docs/deploy.zh-CN.md                               |   6 +-
 .editorconfig => frontend/.editorconfig            |   0
 .eslintignore => frontend/.eslintignore            |   0
 .eslintrc.js => frontend/.eslintrc.js              |   0
 .prettierignore => frontend/.prettierignore        |   0
 .prettierrc.js => frontend/.prettierrc.js          |   0
 .stylelintrc.js => frontend/.stylelintrc.js        |   0
 {config => frontend/config}/config.ts              |   1 +
 {config => frontend/config}/defaultSettings.ts     |   0
 {config => frontend/config}/proxy.ts               |   0
 {config => frontend/config}/routes.ts              |   0
 jest.config.js => frontend/jest.config.js          |   0
 jsconfig.json => frontend/jsconfig.json            |   0
 {mock => frontend/mock}/notices.ts                 |   0
 {mock => frontend/mock}/route.ts                   |   0
 {mock => frontend/mock}/user.ts                    |   0
 package.json => frontend/package.json              |   0
 {public => frontend/public}/empty.svg              |   0
 {public => frontend/public}/favicon.png            | Bin
 {scripts => frontend/scripts}/verifyCommit.js      |   0
 {src => frontend/src}/access.ts                    |   0
 {src => frontend/src}/app.tsx                      |   0
 {src => frontend/src}/assets/logo.svg              |   0
 .../src}/components/ActionBar/ActionBar.tsx        |   0
 .../src}/components/ActionBar/index.ts             |   0
 .../src}/components/ActionBar/locales/en-US.ts     |   0
 .../src}/components/ActionBar/locales/zh-CN.ts     |   0
 {src => frontend/src}/components/Footer/index.tsx  |   0
 .../src}/components/HeaderDropdown/index.less      |   0
 .../src}/components/HeaderDropdown/index.tsx       |   0
 .../src}/components/NoticeIcon/NoticeList.less     |   0
 .../src}/components/NoticeIcon/NoticeList.tsx      |   0
 .../src}/components/NoticeIcon/index.less          |   0
 .../src}/components/NoticeIcon/index.tsx           |   0
 .../src}/components/PageLoading/index.tsx          |   0
 .../components/RightContent/AvatarDropdown.tsx     |   0
 .../src}/components/RightContent/index.less        |   0
 .../src}/components/RightContent/index.tsx         |   0
 .../src}/components/Upstream/UpstreamForm.tsx      |   0
 .../src}/components/Upstream/constant.ts           |   0
 {src => frontend/src}/components/Upstream/index.ts |   0
 {src => frontend/src}/constants.ts                 |   0
 .../src}/e2e/__mocks__/antd-pro-merge-less.js      |   0
 {src => frontend/src}/e2e/baseLayout.e2e.js        |   0
 {src => frontend/src}/global.less                  |   0
 {src => frontend/src}/global.tsx                   |   0
 {src => frontend/src}/helpers.tsx                  |   0
 {src => frontend/src}/iconfont.ts                  |   0
 {src => frontend/src}/locales/en-US.ts             |   0
 {src => frontend/src}/locales/en-US/component.ts   |   0
 .../src}/locales/en-US/globalHeader.ts             |   0
 {src => frontend/src}/locales/en-US/menu.ts        |   0
 {src => frontend/src}/locales/en-US/pwa.ts         |   0
 .../src/locales/en-US}/setting.ts                  |   0
 .../src}/locales/en-US/settingDrawer.ts            |   0
 {src => frontend/src}/locales/zh-CN.ts             |   0
 {src => frontend/src}/locales/zh-CN/component.ts   |   0
 .../src}/locales/zh-CN/globalHeader.ts             |   0
 {src => frontend/src}/locales/zh-CN/menu.ts        |   0
 {src => frontend/src}/locales/zh-CN/pwa.ts         |   0
 .../src/locales/zh-CN}/setting.ts                  |   0
 .../src}/locales/zh-CN/settingDrawer.ts            |   0
 {src => frontend/src}/manifest.json                |   0
 {src => frontend/src}/pages/404.tsx                |   0
 {src => frontend/src}/pages/Consumer/Create.tsx    |   0
 {src => frontend/src}/pages/Consumer/List.tsx      |   0
 .../src}/pages/Consumer/components/Preview.tsx     |   0
 .../src}/pages/Consumer/components/Step1.tsx       |   0
 .../Route => frontend/src/pages/Consumer}/index.ts |   0
 .../src}/pages/Consumer/locales/en-US.ts           |   0
 .../src}/pages/Consumer/locales/zh-CN.ts           |   0
 {src => frontend/src}/pages/Consumer/service.ts    |   0
 {src => frontend/src}/pages/Consumer/typing.d.ts   |   0
 {src => frontend/src}/pages/Metrics/Metrics.tsx    |   0
 {src => frontend/src}/pages/Metrics/index.ts       |   0
 .../src}/pages/Metrics/locales/en-US.ts            |   0
 .../src}/pages/Metrics/locales/zh-CN.ts            |   0
 {src => frontend/src}/pages/Metrics/service.ts     |   0
 {src => frontend/src}/pages/Route/Create.less      |   0
 {src => frontend/src}/pages/Route/Create.tsx       |   0
 {src => frontend/src}/pages/Route/List.tsx         |   0
 .../Route/components/CreateStep4/CreateStep4.tsx   |   0
 .../pages/Route/components/CreateStep4/index.ts    |   0
 .../Route/components/ResultView/ResultView.tsx     |   0
 .../pages/Route/components/ResultView/index.ts     |   0
 .../Route/components/Step1/MatchingRulesView.tsx   |   0
 .../src}/pages/Route/components/Step1/MetaView.tsx |   0
 .../Route/components/Step1/RequestConfigView.tsx   |   0
 .../src}/pages/Route/components/Step1/index.tsx    |   0
 .../Route/components/Step2/RequestRewriteView.tsx  |   0
 .../src}/pages/Route/components/Step2/index.tsx    |   0
 .../src}/pages/Route/components/Step3/index.tsx    |   0
 {src => frontend/src}/pages/Route/constants.ts     |   0
 .../Consumer => frontend/src/pages/Route}/index.ts |   0
 {src => frontend/src}/pages/Route/locales/en-US.ts |   0
 {src => frontend/src}/pages/Route/locales/zh-CN.ts |   0
 {src => frontend/src}/pages/Route/service.ts       |   0
 {src => frontend/src}/pages/Route/transform.ts     |   0
 {src => frontend/src}/pages/Route/typing.d.ts      |   0
 {src => frontend/src}/pages/SSL/Create.less        |   0
 {src => frontend/src}/pages/SSL/Create.tsx         |   0
 {src => frontend/src}/pages/SSL/List.tsx           |   0
 .../pages/SSL/components/CertificateForm/index.tsx |   0
 .../SSL/components/CertificateUploader/index.tsx   |   0
 .../src}/pages/SSL/components/Step1/index.tsx      |   0
 .../src}/pages/SSL/components/Step2/index.tsx      |   0
 {src => frontend/src}/pages/SSL/locales/en-US.ts   |   0
 {src => frontend/src}/pages/SSL/locales/zh-CN.ts   |   0
 {src => frontend/src}/pages/SSL/service.ts         |   0
 {src => frontend/src}/pages/SSL/style.less         |   0
 {src => frontend/src}/pages/SSL/typing.d.ts        |   0
 {src => frontend/src}/pages/Setting/Setting.tsx    |   0
 {src => frontend/src}/pages/Setting/index.ts       |   0
 .../src}/pages/Setting/locales/en-US.ts            |   0
 .../src}/pages/Setting/locales/zh-CN.ts            |   0
 {src => frontend/src}/pages/Setting/service.ts     |   0
 {src => frontend/src}/pages/Setting/style.less     |   0
 {src => frontend/src}/pages/Setting/typingd.d.ts   |   0
 {src => frontend/src}/pages/Upstream/Create.tsx    |   0
 {src => frontend/src}/pages/Upstream/List.tsx      |   0
 .../src}/pages/Upstream/components/Step1.tsx       |   0
 {src => frontend/src}/pages/Upstream/constants.ts  |   0
 {src => frontend/src}/pages/Upstream/index.ts      |   0
 .../src}/pages/Upstream/locales/en-US.ts           |   0
 .../src}/pages/Upstream/locales/zh-CN.ts           |   0
 {src => frontend/src}/pages/Upstream/service.ts    |   0
 {src => frontend/src}/pages/Upstream/transform.ts  |   0
 {src => frontend/src}/pages/Upstream/typing.d.ts   |   0
 {src => frontend/src}/pages/User/Login.less        |   0
 {src => frontend/src}/pages/User/Login.tsx         |   0
 {src => frontend/src}/pages/User/Logout.tsx        |   0
 .../pages/User/components/LoginMethodExample.tsx   |   0
 .../pages/User/components/LoginMethodPassword.tsx  |   0
 {src => frontend/src}/pages/User/index.ts          |   0
 {src => frontend/src}/pages/User/locales/en-US.ts  |   0
 {src => frontend/src}/pages/User/locales/zh-CN.ts  |   0
 {src => frontend/src}/pages/User/typing.d.ts       |   0
 {src => frontend/src}/pages/document.ejs           |   0
 {src => frontend/src}/service-worker.js            |   0
 {src => frontend/src}/services/API.d.ts            |   0
 {src => frontend/src}/services/user.ts             |   0
 {src => frontend/src}/typings.d.ts                 |   0
 {tests => frontend/tests}/PuppeteerEnvironment.js  |   0
 {tests => frontend/tests}/beforeTest.js            |   0
 {tests => frontend/tests}/getBrowser.js            |   0
 {tests => frontend/tests}/run-tests.js             |   0
 tsconfig.json => frontend/tsconfig.json            |   0
 yarn.lock => frontend/yarn.lock                    |   0
 172 files changed, 25 insertions(+), 2264 deletions(-)

diff --git a/.asf.yaml b/.asf.yaml
index b2617d9..59b805a 100644
--- a/.asf.yaml
+++ b/.asf.yaml
@@ -24,7 +24,6 @@ github:
     - api-management
     - apisix
     - devops
-    - docker
 
   enabled_merge_buttons:
     squash: true
diff --git a/.dockerignore b/.dockerignore
deleted file mode 100644
index 3c3629e..0000000
--- a/.dockerignore
+++ /dev/null
@@ -1 +0,0 @@
-node_modules
diff --git a/.github/workflows/deploy-api.yml b/.github/workflows/deploy-api.yml
deleted file mode 100644
index 823e81e..0000000
--- a/.github/workflows/deploy-api.yml
+++ /dev/null
@@ -1,60 +0,0 @@
-name: Deploy API to Azure
-
-on:
-  push:
-    branches:
-      - master
-
-jobs:
-  build:
-    runs-on: ubuntu-latest
-
-    services:
-      etcd:
-        image: bitnami/etcd:3.3.13-r80
-        ports:
-          - 2379:2379
-          - 2380:2380
-        env:
-          ALLOW_NONE_AUTHENTICATION: yes
-
-    steps:
-      - uses: actions/checkout@v2
-
-      - name: license check
-        run: |
-          make license-check
-
-      - name: get lua lib
-        run: |
-          wget https://github.com/api7/dag-to-lua/archive/v1.1.tar.gz
-          sudo mkdir -p /go/manager-api/dag-to-lua/
-          tar -zxvf v1.1.tar.gz
-          sudo mv ./dag-to-lua-1.1/lib/* /go/manager-api/dag-to-lua/
-
-      - name: install runtime
-        run: |
-          sudo apt-get update
-          sudo apt-get install lua5.1
-          sudo add-apt-repository ppa:longsleep/golang-backports
-          sudo apt update
-          export GO111MOUDULE=on
-          sudo apt install golang-1.14-go
-
-      - name: run test
-        working-directory: ./api
-        run: |
-          export APIX_ETCD_ENDPOINTS=127.0.0.1:2379
-          go test ./...
-
-      - uses: Azure/docker-login@v1
-        with:
-          login-server: apisixacr.azurecr.cn
-          username: ${{ secrets.REGISTRY_USERNAME }}
-          password: ${{ secrets.REGISTRY_PASSWORD }}
-
-      - name: build and push docker image
-        working-directory: ./api
-        run: |
-          docker build . -t apisixacr.azurecr.cn/managerapi:${{ github.sha }}
-          docker push apisixacr.azurecr.cn/managerapi:${{ github.sha }}
diff --git a/.github/workflows/deploy-frontend.yml b/.github/workflows/deploy-frontend.yml
deleted file mode 100644
index 9998d50..0000000
--- a/.github/workflows/deploy-frontend.yml
+++ /dev/null
@@ -1,22 +0,0 @@
-name: Deploy frontend to Azure
-
-on:
-  push:
-    branches: [master]
-
-jobs:
-  build:
-    runs-on: ubuntu-latest
-
-    steps:
-      - uses: actions/checkout@v2
-
-      - uses: Azure/docker-login@v1
-        with:
-          login-server: apisixacr.azurecr.cn
-          username: ${{ secrets.REGISTRY_USERNAME }}
-          password: ${{ secrets.REGISTRY_PASSWORD }}
-
-      - run: |
-          docker build . -t apisixacr.azurecr.cn/dashboard:${{ github.sha }}
-          docker push apisixacr.azurecr.cn/dashboard:${{ github.sha }}
diff --git a/.gitignore b/.gitignore
index 571eb5b..0aedbea 100644
--- a/.gitignore
+++ b/.gitignore
@@ -7,7 +7,7 @@
 _roadhog-api-doc
 
 # production
-/dist
+dist
 /.vscode
 
 # misc
@@ -44,3 +44,6 @@ build
 manager-api
 conf.json
 conf.json-e
+
+output
+default.etcd
diff --git a/Dockerfile b/Dockerfile
deleted file mode 100644
index 90d4fde..0000000
--- a/Dockerfile
+++ /dev/null
@@ -1,37 +0,0 @@
-#
-# 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.
-#
-
-# phase-build
-FROM node:12 as builder
-
-WORKDIR /usr/src/app/
-USER root
-
-COPY package.json ./
-COPY yarn.lock ./
-RUN yarn
-
-COPY ./ ./
-RUN yarn build && rm -rf /usr/src/app/node_modules
-
-# phase-run
-FROM nginx:1.16-alpine
-
-COPY ./docker/nginx.conf /etc/nginx/conf.d/default.conf
-COPY --from=builder /usr/src/app/dist /usr/share/nginx/html
-
-EXPOSE 80
diff --git a/README.md b/README.md
index 783f49e..157fc5e 100644
--- a/README.md
+++ b/README.md
@@ -32,7 +32,6 @@ Please refer to [User Guide](./docs/USER_GUIDE.md)
 ## Deployment
 
 - [Deploy Manually](./docs/deploy.md)
-- [Deploy with Docker](./compose/README.md)
 
 ## Development
 
diff --git a/README.zh-CN.md b/README.zh-CN.md
index e60a1b9..07099e3 100644
--- a/README.zh-CN.md
+++ b/README.zh-CN.md
@@ -32,7 +32,6 @@
 当前支持如下方式部署:
 
 - [手动部署](./docs/deploy.zh-CN.md)
-- [使用 Docker 部署](./compose/README.md)
 
 ## 开发
 
diff --git a/api/build.sh b/api/build.sh
index 17867a5..4c4131a 100755
--- a/api/build.sh
+++ b/api/build.sh
@@ -19,13 +19,18 @@
 export ENV=local
 pwd=`pwd`
 
+mkdir -p output
+
 # get dag-to-lua lib
 if [[ ! -f "dag-to-lua-1.1/lib/dag-to-lua.lua" ]]; then
-    wget https://github.com/api7/dag-to-lua/archive/v1.1.tar.gz
+    wget https://github.com/api7/dag-to-lua/archive/v1.1.tar.gz -P ./output
+    cd ./output
     tar -zxvf v1.1.tar.gz
+    rm v1.1.tar.gz
+    cd ..
 fi
 
 # build
-cd ./api && go build -o ../manager-api .
+cd ./api && go build -o ../output/manager-api .
 
-echo "done."
+echo "Build the Manager API successfully"
diff --git a/api/conf/conf.go b/api/conf/conf.go
index 11ff773..2644424 100644
--- a/api/conf/conf.go
+++ b/api/conf/conf.go
@@ -29,7 +29,7 @@ import (
 )
 
 const (
-	WebDir = "./dist"
+	WebDir = "./output/html"
 
 	EnvPROD  = "prod"
 	EnvBETA  = "beta"
diff --git a/api/conf/conf.json b/api/conf/conf.json
deleted file mode 100644
index c369afe..0000000
--- a/api/conf/conf.json
+++ /dev/null
@@ -1,31 +0,0 @@
-{
-  "conf": {
-    "syslog": {
-      "host": "127.0.0.1"
-    },
-    "listen": {
-      "host": "127.0.0.1",
-      "port": 8080
-    },
-    "dag-lib-path": "",
-    "etcd": {
-      "endpoints": "127.0.0.1:2379"
-    }
-  },
-  "authentication": {
-    "session": {
-      "secret": "secret",
-      "expireTime": 3600
-    },
-    "user": [
-      {
-        "username": "admin",
-        "password": "admin"
-      },
-      {
-        "username": "user",
-        "password": "user"
-      }
-    ]
-  }
-}
diff --git a/api/run.sh b/api/run.sh
index 40fd4a7..fe76b90 100755
--- a/api/run.sh
+++ b/api/run.sh
@@ -20,4 +20,4 @@ export ENV=local
 pwd=`pwd`
 
 
-exec ./manager-api
+exec ./output/manager-api
diff --git a/compose/README.md b/compose/README.md
deleted file mode 100644
index 98bce58..0000000
--- a/compose/README.md
+++ /dev/null
@@ -1,35 +0,0 @@
-<!--
-#
-# 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.
-#
--->
-
-# docker-compose
-
-This folder stores the `docker-compose` file for `manager-api`.
-
-## Deploy
-
-1. Run docker-compose
-
-```sh
-$ cd apisix-dashboard/compose
-
-# For most users in China, please use some proxy services like https://www.daocloud.io/mirror to speed up your Docker images pulling.
-$ docker-compose -p dashboard up -d
-```
-
-2. Visit `http://127.0.0.1/` in the browser.
diff --git a/compose/apisix_conf/config.yaml b/compose/apisix_conf/config.yaml
deleted file mode 100644
index 4fd7ff2..0000000
--- a/compose/apisix_conf/config.yaml
+++ /dev/null
@@ -1,38 +0,0 @@
-#
-# 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.
-#
-# PLEASE DO NOT UPDATE THIS FILE!
-# If you want to set the specified configuration value, you can set the new
-# value in the conf/config.yaml file.
-#
-apisix:
-  allow_admin:
-    - 0.0.0.0/0
-  admin_key:
-    - name: 'admin'
-      key: edd1c9f034335f136f87ad84b625c8f1
-      role:
-        admin # admin: manage all configuration data
-        # viewer: only can view configuration data
-    - name: 'viewer'
-      key: 4054f7cf07e344346cd3f287985e76a1
-      role: viewer
-
-etcd:
-  host: # it's possible to define multiple etcd hosts addresses of the same etcd cluster.
-    - 'http://192.17.5.10:2379' # multiple etcd address
-  prefix: '/apisix' # apisix configurations prefix
-  timeout: 30 # 30 seconds
diff --git a/compose/dashboard_conf/nginx.conf b/compose/dashboard_conf/nginx.conf
deleted file mode 100644
index dcdfde8..0000000
--- a/compose/dashboard_conf/nginx.conf
+++ /dev/null
@@ -1,39 +0,0 @@
-#
-# 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.
-#
-
-server {
-    listen 80;
-    # gzip config
-    gzip on;
-    gzip_min_length 1k;
-    gzip_comp_level 9;
-    gzip_types text/plain text/css text/javascript application/json application/javascript application/x-javascript application/xml;
-    gzip_vary on;
-    gzip_disable "MSIE [1-6]\.";
-
-    root /usr/share/nginx/html;
-    include /etc/nginx/mime.types;
-
-    location / {
-        try_files $uri $uri/ /index.html;
-    }
-
-    location /apisix/admin {
-        proxy_pass http://manager:8080/apisix/admin;
-    }
-}
-
diff --git a/compose/docker-compose.yml b/compose/docker-compose.yml
deleted file mode 100644
index 4e1e601..0000000
--- a/compose/docker-compose.yml
+++ /dev/null
@@ -1,134 +0,0 @@
-#
-# 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.
-#
-version: '3'
-
-services:
-  apisix:
-    image: apache/apisix:dev
-    restart: always
-    volumes:
-      - ./apisix_log:/usr/local/apisix/logs
-      - ./apisix_conf/config.yaml:/usr/local/apisix/conf/config.yaml:ro
-    depends_on:
-      - etcd
-    ##network_mode: host
-    ports:
-      - '9080:9080/tcp'
-      - '9443:9443/tcp'
-    networks:
-      apisix-dashboard:
-        ipv4_address: 192.17.5.11
-
-  etcd:
-    image: bitnami/etcd:3.4.9
-    user: root
-    restart: always
-    volumes:
-      - ./etcd_data:/etcd_data
-    environment:
-      ETCD_DATA_DIR: /etcd_data
-      ETCD_ENABLE_V2: 'true'
-      ALLOW_NONE_AUTHENTICATION: 'yes'
-      ETCD_ADVERTISE_CLIENT_URLS: 'http://0.0.0.0:2379'
-      ETCD_LISTEN_CLIENT_URLS: 'http://0.0.0.0:2379'
-    ports:
-      - '2379:2379/tcp'
-    networks:
-      apisix-dashboard:
-        ipv4_address: 192.17.5.10
-
-  web1:
-    image: ruby:2-alpine
-    command: sh -c "mkdir -p /tmp/www && echo 'web1' > /tmp/www/web1.txt && ruby -run -ehttpd /tmp/www -p8000"
-    restart: always
-    ports:
-      - '9081:8000/tcp'
-    networks:
-      apisix-dashboard:
-        ipv4_address: 192.17.5.12
-
-  web2:
-    image: ruby:2-alpine
-    command: sh -c "mkdir -p /tmp/www && echo 'web2' > /tmp/www/web2.txt && ruby -run -ehttpd /tmp/www -p8000"
-    restart: always
-    ports:
-      - '9082:8000/tcp'
-    networks:
-      apisix-dashboard:
-        ipv4_address: 192.17.5.13
-
-  manager:
-    build:
-      context: ./../api
-      dockerfile: Dockerfile
-    restart: always
-    ports:
-      - '8080:8080/tcp'
-    environment:
-      - ENV=prod
-    volumes:
-      - ./manager_conf/entry.sh:/go/manager-api/entry.sh
-    networks:
-      apisix-dashboard:
-        ipv4_address: 192.17.5.15
-
-  prometheus:
-    image: prom/prometheus
-    hostname: prometheus
-    restart: always
-    volumes:
-      - ./prometheus_conf/prometheus.yml:/etc/prometheus/prometheus.yml
-    ports:
-      - '9090:9090'
-    networks:
-      apisix-dashboard:
-        ipv4_address: 192.17.5.16
-
-  grafana:
-    image: grafana/grafana
-    container_name: grafana
-    hostname: grafana
-    restart: always
-    ports:
-      - '3000:3000'
-    volumes:
-      - './grafana_conf/provisioning:/etc/grafana/provisioning'
-      - './grafana_conf/dashboards:/var/lib/grafana/dashboards'
-      - './grafana_conf/config/grafana.ini:/etc/grafana/grafana.ini'
-    networks:
-      apisix-dashboard:
-        ipv4_address: 192.17.5.17
-
-  dashboard:
-    build:
-      context: ./..
-      dockerfile: Dockerfile
-    restart: always
-    ports:
-      - '80:80/tcp'
-    volumes:
-      - './dashboard_conf/nginx.conf:/etc/nginx/conf.d/default.conf'
-    networks:
-      apisix-dashboard:
-        ipv4_address: 192.17.5.18
-
-networks:
-  apisix-dashboard:
-    driver: bridge
-    ipam:
-      config:
-        - subnet: 192.17.0.0/16
diff --git a/compose/grafana_conf/config/grafana.ini b/compose/grafana_conf/config/grafana.ini
deleted file mode 100644
index cb6a737..0000000
--- a/compose/grafana_conf/config/grafana.ini
+++ /dev/null
@@ -1,756 +0,0 @@
-##################### Grafana Configuration Example #####################
-#
-# Everything has defaults so you only need to uncomment things you want to
-# change
-
-# possible values : production, development
-;app_mode = production
-
-# instance name, defaults to HOSTNAME environment variable value or hostname if HOSTNAME var is empty
-;instance_name = ${HOSTNAME}
-
-#################################### Paths ####################################
-[paths]
-# Path to where grafana can store temp files, sessions, and the sqlite3 db (if that is used)
-;data = /var/lib/grafana
-
-# Temporary files in `data` directory older than given duration will be removed
-;temp_data_lifetime = 24h
-
-# Directory where grafana can store logs
-;logs = /var/log/grafana
-
-# Directory where grafana will automatically scan and look for plugins
-;plugins = /var/lib/grafana/plugins
-
-# folder that contains provisioning config files that grafana will apply on startup and while running.
-;provisioning = conf/provisioning
-
-#################################### Server ####################################
-[server]
-# Protocol (http, https, h2, socket)
-;protocol = http
-
-# The ip address to bind to, empty will bind to all interfaces
-;http_addr =
-
-# The http port  to use
-;http_port = 3000
-
-# The public facing domain name used to access grafana from a browser
-;domain = localhost
-
-# Redirect to correct domain if host header does not match domain
-# Prevents DNS rebinding attacks
-;enforce_domain = false
-
-# The full public facing url you use in browser, used for redirects and emails
-# If you use reverse proxy and sub path specify full url (with sub path)
-;root_url = %(protocol)s://%(domain)s:%(http_port)s/
-
-# Serve Grafana from subpath specified in `root_url` setting. By default it is set to `false` for compatibility reasons.
-;serve_from_sub_path = false
-
-# Log web requests
-;router_logging = false
-
-# the path relative working path
-;static_root_path = public
-
-# enable gzip
-;enable_gzip = false
-
-# https certs & key file
-;cert_file =
-;cert_key =
-
-# Unix socket path
-;socket =
-
-#################################### Database ####################################
-[database]
-# You can configure the database connection by specifying type, host, name, user and password
-# as separate properties or as on string using the url properties.
-
-# Either "mysql", "postgres" or "sqlite3", it's your choice
-;type = sqlite3
-;host = 127.0.0.1:3306
-;name = grafana
-;user = root
-# If the password contains # or ; you have to wrap it with triple quotes. Ex """#password;"""
-;password =
-
-# Use either URL or the previous fields to configure the database
-# Example: mysql://user:secret@host:port/database
-;url =
-
-# For "postgres" only, either "disable", "require" or "verify-full"
-;ssl_mode = disable
-
-;ca_cert_path =
-;client_key_path =
-;client_cert_path =
-;server_cert_name =
-
-# For "sqlite3" only, path relative to data_path setting
-;path = grafana.db
-
-# Max idle conn setting default is 2
-;max_idle_conn = 2
-
-# Max conn setting default is 0 (mean not set)
-;max_open_conn =
-
-# Connection Max Lifetime default is 14400 (means 14400 seconds or 4 hours)
-;conn_max_lifetime = 14400
-
-# Set to true to log the sql calls and execution times.
-;log_queries =
-
-# For "sqlite3" only. cache mode setting used for connecting to the database. (private, shared)
-;cache_mode = private
-
-#################################### Cache server #############################
-[remote_cache]
-# Either "redis", "memcached" or "database" default is "database"
-;type = database
-
-# cache connectionstring options
-# database: will use Grafana primary database.
-# redis: config like redis server e.g. `addr=127.0.0.1:6379,pool_size=100,db=0,ssl=false`. Only addr is required. ssl may be 'true', 'false', or 'insecure'.
-# memcache: 127.0.0.1:11211
-;connstr =
-
-#################################### Data proxy ###########################
-[dataproxy]
-
-# This enables data proxy logging, default is false
-;logging = false
-
-# How long the data proxy should wait before timing out default is 30 (seconds)
-;timeout = 30
-
-# If enabled and user is not anonymous, data proxy will add X-Grafana-User header with username into the request, default is false.
-;send_user_header = false
-
-#################################### Analytics ####################################
-[analytics]
-# Server reporting, sends usage counters to stats.grafana.org every 24 hours.
-# No ip addresses are being tracked, only simple counters to track
-# running instances, dashboard and error counts. It is very helpful to us.
-# Change this option to false to disable reporting.
-;reporting_enabled = true
-
-# Set to false to disable all checks to https://grafana.net
-# for new vesions (grafana itself and plugins), check is used
-# in some UI views to notify that grafana or plugin update exists
-# This option does not cause any auto updates, nor send any information
-# only a GET request to http://grafana.com to get latest versions
-;check_for_updates = true
-
-# Google Analytics universal tracking code, only enabled if you specify an id here
-;google_analytics_ua_id =
-
-# Google Tag Manager ID, only enabled if you specify an id here
-;google_tag_manager_id =
-
-#################################### Security ####################################
-[security]
-# disable creation of admin user on first start of grafana
-;disable_initial_admin_creation = false
-
-# default admin user, created on startup
-;admin_user = admin
-
-# default admin password, can be changed before first start of grafana,  or in profile settings
-;admin_password = admin
-
-# used for signing
-;secret_key = SW2YcwTIb9zpOOhoPsMm
-
-# disable gravatar profile images
-;disable_gravatar = false
-
-# data source proxy whitelist (ip_or_domain:port separated by spaces)
-;data_source_proxy_whitelist =
-
-# disable protection against brute force login attempts
-;disable_brute_force_login_protection = false
-
-# set to true if you host Grafana behind HTTPS. default is false.
-;cookie_secure = false
-
-# set cookie SameSite attribute. defaults to `lax`. can be set to "lax", "strict", "none" and "disabled"
-;cookie_samesite = none
-
-# set to true if you want to allow browsers to render Grafana in a <frame>, <iframe>, <embed> or <object>. default is false.
-allow_embedding = true
-
-# Set to true if you want to enable http strict transport security (HSTS) response header.
-# This is only sent when HTTPS is enabled in this configuration.
-# HSTS tells browsers that the site should only be accessed using HTTPS.
-# The default version will change to true in the next minor release, 6.3.
-;strict_transport_security = false
-
-# Sets how long a browser should cache HSTS. Only applied if strict_transport_security is enabled.
-;strict_transport_security_max_age_seconds = 86400
-
-# Set to true if to enable HSTS preloading option. Only applied if strict_transport_security is enabled.
-;strict_transport_security_preload = false
-
-# Set to true if to enable the HSTS includeSubDomains option. Only applied if strict_transport_security is enabled.
-;strict_transport_security_subdomains = false
-
-# Set to true to enable the X-Content-Type-Options response header.
-# The X-Content-Type-Options response HTTP header is a marker used by the server to indicate that the MIME types advertised
-# in the Content-Type headers should not be changed and be followed. The default will change to true in the next minor release, 6.3.
-;x_content_type_options = false
-
-# Set to true to enable the X-XSS-Protection header, which tells browsers to stop pages from loading
-# when they detect reflected cross-site scripting (XSS) attacks. The default will change to true in the next minor release, 6.3.
-;x_xss_protection = false
-
-#################################### Snapshots ###########################
-[snapshots]
-# snapshot sharing options
-;external_enabled = true
-;external_snapshot_url = https://snapshots-origin.raintank.io
-;external_snapshot_name = Publish to snapshot.raintank.io
-
-# Set to true to enable this Grafana instance act as an external snapshot server and allow unauthenticated requests for
-# creating and deleting snapshots.
-;public_mode = false
-
-# remove expired snapshot
-;snapshot_remove_expired = true
-
-#################################### Dashboards History ##################
-[dashboards]
-# Number dashboard versions to keep (per dashboard). Default: 20, Minimum: 1
-;versions_to_keep = 20
-
-# Minimum dashboard refresh interval. When set, this will restrict users to set the refresh interval of a dashboard lower than given interval. Per default this is 5 seconds.
-# The interval string is a possibly signed sequence of decimal numbers, followed by a unit suffix (ms, s, m, h, d), e.g. 30s or 1m.
-;min_refresh_interval = 5s
-
-#################################### Users ###############################
-[users]
-# disable user signup / registration
-;allow_sign_up = true
-
-# Allow non admin users to create organizations
-;allow_org_create = true
-
-# Set to true to automatically assign new users to the default organization (id 1)
-;auto_assign_org = true
-
-# Set this value to automatically add new users to the provided organization (if auto_assign_org above is set to true)
-;auto_assign_org_id = 1
-
-# Default role new users will be automatically assigned (if disabled above is set to true)
-;auto_assign_org_role = Viewer
-
-# Require email validation before sign up completes
-;verify_email_enabled = false
-
-# Background text for the user field on the login page
-;login_hint = email or username
-;password_hint = password
-
-# Default UI theme ("dark" or "light")
-;default_theme = dark
-
-# External user management, these options affect the organization users view
-;external_manage_link_url =
-;external_manage_link_name =
-;external_manage_info =
-
-# Viewers can edit/inspect dashboard settings in the browser. But not save the dashboard.
-;viewers_can_edit = false
-
-# Editors can administrate dashboard, folders and teams they create
-;editors_can_admin = false
-
-[auth]
-# Login cookie name
-;login_cookie_name = grafana_session
-
-# The lifetime (days) an authenticated user can be inactive before being required to login at next visit. Default is 7 days,
-;login_maximum_inactive_lifetime_days = 7
-
-# The maximum lifetime (days) an authenticated user can be logged in since login time before being required to login. Default is 30 days.
-;login_maximum_lifetime_days = 30
-
-# How often should auth tokens be rotated for authenticated users when being active. The default is each 10 minutes.
-;token_rotation_interval_minutes = 10
-
-# Set to true to disable (hide) the login form, useful if you use OAuth, defaults to false
-;disable_login_form = false
-
-# Set to true to disable the signout link in the side menu. useful if you use auth.proxy, defaults to false
-;disable_signout_menu = false
-
-# URL to redirect the user to after sign out
-;signout_redirect_url =
-
-# Set to true to attempt login with OAuth automatically, skipping the login screen.
-# This setting is ignored if multiple OAuth providers are configured.
-;oauth_auto_login = false
-
-# OAuth state max age cookie duration. Defaults to 60 seconds.
-;oauth_state_cookie_max_age = 60
-
-# limit of api_key seconds to live before expiration
-;api_key_max_seconds_to_live = -1
-
-#################################### Anonymous Auth ######################
-[auth.anonymous]
-# enable anonymous access
-enabled = true
-
-# specify organization name that should be used for unauthenticated users
-;org_name = Main Org.
-
-# specify role for unauthenticated users
-;org_role = Viewer
-
-#################################### Github Auth ##########################
-[auth.github]
-;enabled = false
-;allow_sign_up = true
-;client_id = some_id
-;client_secret = some_secret
-;scopes = user:email,read:org
-;auth_url = https://github.com/login/oauth/authorize
-;token_url = https://github.com/login/oauth/access_token
-;api_url = https://api.github.com/user
-;allowed_domains =
-;team_ids =
-;allowed_organizations =
-
-#################################### GitLab Auth #########################
-[auth.gitlab]
-;enabled = false
-;allow_sign_up = true
-;client_id = some_id
-;client_secret = some_secret
-;scopes = api
-;auth_url = https://gitlab.com/oauth/authorize
-;token_url = https://gitlab.com/oauth/token
-;api_url = https://gitlab.com/api/v4
-;allowed_domains =
-;allowed_groups =
-
-#################################### Google Auth ##########################
-[auth.google]
-;enabled = false
-;allow_sign_up = true
-;client_id = some_client_id
-;client_secret = some_client_secret
-;scopes = https://www.googleapis.com/auth/userinfo.profile https://www.googleapis.com/auth/userinfo.email
-;auth_url = https://accounts.google.com/o/oauth2/auth
-;token_url = https://accounts.google.com/o/oauth2/token
-;api_url = https://www.googleapis.com/oauth2/v1/userinfo
-;allowed_domains =
-;hosted_domain =
-
-#################################### Grafana.com Auth ####################
-[auth.grafana_com]
-;enabled = false
-;allow_sign_up = true
-;client_id = some_id
-;client_secret = some_secret
-;scopes = user:email
-;allowed_organizations =
-
-#################################### Azure AD OAuth #######################
-[auth.azuread]
-;name = Azure AD
-;enabled = false
-;allow_sign_up = true
-;client_id = some_client_id
-;client_secret = some_client_secret
-;scopes = openid email profile
-;auth_url = https://login.microsoftonline.com/<tenant-id>/oauth2/v2.0/authorize
-;token_url = https://login.microsoftonline.com/<tenant-id>/oauth2/v2.0/token
-;allowed_domains =
-;allowed_groups =
-
-#################################### Okta OAuth #######################
-[auth.okta]
-;name = Okta
-;enabled = false
-;allow_sign_up = true
-;client_id = some_id
-;client_secret = some_secret
-;scopes = openid profile email groups
-;auth_url = https://<tenant-id>.okta.com/oauth2/v1/authorize
-;token_url = https://<tenant-id>.okta.com/oauth2/v1/token
-;api_url = https://<tenant-id>.okta.com/oauth2/v1/userinfo
-;allowed_domains =
-;allowed_groups =
-;role_attribute_path =
-
-#################################### Generic OAuth ##########################
-[auth.generic_oauth]
-;enabled = false
-;name = OAuth
-;allow_sign_up = true
-;client_id = some_id
-;client_secret = some_secret
-;scopes = user:email,read:org
-;email_attribute_name = email:primary
-;email_attribute_path =
-;auth_url = https://foo.bar/login/oauth/authorize
-;token_url = https://foo.bar/login/oauth/access_token
-;api_url = https://foo.bar/user
-;allowed_domains =
-;team_ids =
-;allowed_organizations =
-;role_attribute_path =
-;tls_skip_verify_insecure = false
-;tls_client_cert =
-;tls_client_key =
-;tls_client_ca =
-
-#################################### Basic Auth ##########################
-[auth.basic]
-;enabled = true
-
-#################################### Auth Proxy ##########################
-[auth.proxy]
-;enabled = false
-;header_name = X-WEBAUTH-USER
-;header_property = username
-;auto_sign_up = true
-;sync_ttl = 60
-;whitelist = 192.168.1.1, 192.168.2.1
-;headers = Email:X-User-Email, Name:X-User-Name
-# Read the auth proxy docs for details on what the setting below enables
-;enable_login_token = false
-
-#################################### Auth LDAP ##########################
-[auth.ldap]
-;enabled = false
-;config_file = /etc/grafana/ldap.toml
-;allow_sign_up = true
-
-# LDAP backround sync (Enterprise only)
-# At 1 am every day
-;sync_cron = "0 0 1 * * *"
-;active_sync_enabled = true
-
-#################################### SMTP / Emailing ##########################
-[smtp]
-;enabled = false
-;host = localhost:25
-;user =
-# If the password contains # or ; you have to wrap it with triple quotes. Ex """#password;"""
-;password =
-;cert_file =
-;key_file =
-;skip_verify = false
-;from_address = admin@grafana.localhost
-;from_name = Grafana
-# EHLO identity in SMTP dialog (defaults to instance_name)
-;ehlo_identity = dashboard.example.com
-
-[emails]
-;welcome_email_on_sign_up = false
-;templates_pattern = emails/*.html
-
-#################################### Logging ##########################
-[log]
-# Either "console", "file", "syslog". Default is console and  file
-# Use space to separate multiple modes, e.g. "console file"
-;mode = console file
-
-# Either "debug", "info", "warn", "error", "critical", default is "info"
-;level = info
-
-# optional settings to set different levels for specific loggers. Ex filters = sqlstore:debug
-;filters =
-
-# For "console" mode only
-[log.console]
-;level =
-
-# log line format, valid options are text, console and json
-;format = console
-
-# For "file" mode only
-[log.file]
-;level =
-
-# log line format, valid options are text, console and json
-;format = text
-
-# This enables automated log rotate(switch of following options), default is true
-;log_rotate = true
-
-# Max line number of single file, default is 1000000
-;max_lines = 1000000
-
-# Max size shift of single file, default is 28 means 1 << 28, 256MB
-;max_size_shift = 28
-
-# Segment log daily, default is true
-;daily_rotate = true
-
-# Expired days of log file(delete after max days), default is 7
-;max_days = 7
-
-[log.syslog]
-;level =
-
-# log line format, valid options are text, console and json
-;format = text
-
-# Syslog network type and address. This can be udp, tcp, or unix. If left blank, the default unix endpoints will be used.
-;network =
-;address =
-
-# Syslog facility. user, daemon and local0 through local7 are valid.
-;facility =
-
-# Syslog tag. By default, the process' argv[0] is used.
-;tag =
-
-#################################### Usage Quotas ########################
-[quota]
-; enabled = false
-
-#### set quotas to -1 to make unlimited. ####
-# limit number of users per Org.
-; org_user = 10
-
-# limit number of dashboards per Org.
-; org_dashboard = 100
-
-# limit number of data_sources per Org.
-; org_data_source = 10
-
-# limit number of api_keys per Org.
-; org_api_key = 10
-
-# limit number of orgs a user can create.
-; user_org = 10
-
-# Global limit of users.
-; global_user = -1
-
-# global limit of orgs.
-; global_org = -1
-
-# global limit of dashboards
-; global_dashboard = -1
-
-# global limit of api_keys
-; global_api_key = -1
-
-# global limit on number of logged in users.
-; global_session = -1
-
-#################################### Alerting ############################
-[alerting]
-# Disable alerting engine & UI features
-;enabled = true
-# Makes it possible to turn off alert rule execution but alerting UI is visible
-;execute_alerts = true
-
-# Default setting for new alert rules. Defaults to categorize error and timeouts as alerting. (alerting, keep_state)
-;error_or_timeout = alerting
-
-# Default setting for how Grafana handles nodata or null values in alerting. (alerting, no_data, keep_state, ok)
-;nodata_or_nullvalues = no_data
-
-# Alert notifications can include images, but rendering many images at the same time can overload the server
-# This limit will protect the server from render overloading and make sure notifications are sent out quickly
-;concurrent_render_limit = 5
-
-
-# Default setting for alert calculation timeout. Default value is 30
-;evaluation_timeout_seconds = 30
-
-# Default setting for alert notification timeout. Default value is 30
-;notification_timeout_seconds = 30
-
-# Default setting for max attempts to sending alert notifications. Default value is 3
-;max_attempts = 3
-
-# Makes it possible to enforce a minimal interval between evaluations, to reduce load on the backend
-;min_interval_seconds = 1
-
-#################################### Explore #############################
-[explore]
-# Enable the Explore section
-;enabled = true
-
-#################################### Internal Grafana Metrics ##########################
-# Metrics available at HTTP API Url /metrics
-[metrics]
-# Disable / Enable internal metrics
-;enabled           = true
-# Graphite Publish interval
-;interval_seconds  = 10
-# Disable total stats (stat_totals_*) metrics to be generated
-;disable_total_stats = false
-
-#If both are set, basic auth will be required for the metrics endpoint.
-; basic_auth_username =
-; basic_auth_password =
-
-# Send internal metrics to Graphite
-[metrics.graphite]
-# Enable by setting the address setting (ex localhost:2003)
-;address =
-;prefix = prod.grafana.%(instance_name)s.
-
-#################################### Grafana.com integration  ##########################
-# Url used to import dashboards directly from Grafana.com
-[grafana_com]
-;url = https://grafana.com
-
-#################################### Distributed tracing ############
-[tracing.jaeger]
-# Enable by setting the address sending traces to jaeger (ex localhost:6831)
-;address = localhost:6831
-# Tag that will always be included in when creating new spans. ex (tag1:value1,tag2:value2)
-;always_included_tag = tag1:value1
-# Type specifies the type of the sampler: const, probabilistic, rateLimiting, or remote
-;sampler_type = const
-# jaeger samplerconfig param
-# for "const" sampler, 0 or 1 for always false/true respectively
-# for "probabilistic" sampler, a probability between 0 and 1
-# for "rateLimiting" sampler, the number of spans per second
-# for "remote" sampler, param is the same as for "probabilistic"
-# and indicates the initial sampling rate before the actual one
-# is received from the mothership
-;sampler_param = 1
-# Whether or not to use Zipkin propagation (x-b3- HTTP headers).
-;zipkin_propagation = false
-# Setting this to true disables shared RPC spans.
-# Not disabling is the most common setting when using Zipkin elsewhere in your infrastructure.
-;disable_shared_zipkin_spans = false
-
-#################################### External image storage ##########################
-[external_image_storage]
-# Used for uploading images to public servers so they can be included in slack/email messages.
-# you can choose between (s3, webdav, gcs, azure_blob, local)
-;provider =
-
-[external_image_storage.s3]
-;endpoint =
-;path_style_access =
-;bucket =
-;region =
-;path =
-;access_key =
-;secret_key =
-
-[external_image_storage.webdav]
-;url =
-;public_url =
-;username =
-;password =
-
-[external_image_storage.gcs]
-;key_file =
-;bucket =
-;path =
-
-[external_image_storage.azure_blob]
-;account_name =
-;account_key =
-;container_name =
-
-[external_image_storage.local]
-# does not require any configuration
-
-[rendering]
-# Options to configure a remote HTTP image rendering service, e.g. using https://github.com/grafana/grafana-image-renderer.
-# URL to a remote HTTP image renderer service, e.g. http://localhost:8081/render, will enable Grafana to render panels and dashboards to PNG-images using HTTP requests to an external service.
-;server_url =
-# If the remote HTTP image renderer service runs on a different server than the Grafana server you may have to configure this to a URL where Grafana is reachable, e.g. http://grafana.domain/.
-;callback_url =
-# Concurrent render request limit affects when the /render HTTP endpoint is used. Rendering many images at the same time can overload the server,
-# which this setting can help protect against by only allowing a certain amount of concurrent requests.
-;concurrent_render_request_limit = 30
-
-[panels]
-# If set to true Grafana will allow script tags in text panels. Not recommended as it enable XSS vulnerabilities.
-;disable_sanitize_html = false
-
-[plugins]
-;enable_alpha = false
-;app_tls_skip_verify_insecure = false
-# Enter a comma-separated list of plugin identifiers to identify plugins that are allowed to be loaded even if they lack a valid signature.
-;allow_loading_unsigned_plugins =
-
-#################################### Grafana Image Renderer Plugin ##########################
-[plugin.grafana-image-renderer]
-# Instruct headless browser instance to use a default timezone when not provided by Grafana, e.g. when rendering panel image of alert.
-# See ICU’s metaZones.txt (https://cs.chromium.org/chromium/src/third_party/icu/source/data/misc/metaZones.txt) for a list of supported
-# timezone IDs. Fallbacks to TZ environment variable if not set.
-;rendering_timezone =
-
-# Instruct headless browser instance to use a default language when not provided by Grafana, e.g. when rendering panel image of alert.
-# Please refer to the HTTP header Accept-Language to understand how to format this value, e.g. 'fr-CH, fr;q=0.9, en;q=0.8, de;q=0.7, *;q=0.5'.
-;rendering_language =
-
-# Instruct headless browser instance to use a default device scale factor when not provided by Grafana, e.g. when rendering panel image of alert.
-# Default is 1. Using a higher value will produce more detailed images (higher DPI), but will require more disk space to store an image.
-;rendering_viewport_device_scale_factor =
-
-# Instruct headless browser instance whether to ignore HTTPS errors during navigation. Per default HTTPS errors are not ignored. Due to
-# the security risk it's not recommended to ignore HTTPS errors.
-;rendering_ignore_https_errors =
-
-# Instruct headless browser instance whether to capture and log verbose information when rendering an image. Default is false and will
-# only capture and log error messages. When enabled, debug messages are captured and logged as well.
-# For the verbose information to be included in the Grafana server log you have to adjust the rendering log level to debug, configure
-# [log].filter = rendering:debug.
-;rendering_verbose_logging =
-
-# Instruct headless browser instance whether to output its debug and error messages into running process of remote rendering service.
-# Default is false. This can be useful to enable (true) when troubleshooting.
-;rendering_dumpio =
-
-# Additional arguments to pass to the headless browser instance. Default is --no-sandbox. The list of Chromium flags can be found
-# here (https://peter.sh/experiments/chromium-command-line-switches/). Multiple arguments is separated with comma-character.
-;rendering_args =
-
-# You can configure the plugin to use a different browser binary instead of the pre-packaged version of Chromium.
-# Please note that this is not recommended, since you may encounter problems if the installed version of Chrome/Chromium is not
-# compatible with the plugin.
-;rendering_chrome_bin =
-
-# Instruct how headless browser instances are created. Default is 'default' and will create a new browser instance on each request.
-# Mode 'clustered' will make sure that only a maximum of browsers/incognito pages can execute concurrently.
-# Mode 'reusable' will have one browser instance and will create a new incognito page on each request.
-;rendering_mode =
-
-# When rendering_mode = clustered you can instruct how many browsers or incognito pages can execute concurrently. Default is 'browser'
-# and will cluster using browser instances.
-# Mode 'context' will cluster using incognito pages.
-;rendering_clustering_mode =
-# When rendering_mode = clustered you can define maximum number of browser instances/incognito pages that can execute concurrently..
-;rendering_clustering_max_concurrency =
-
-# Limit the maxiumum viewport width, height and device scale factor that can be requested.
-;rendering_viewport_max_width =
-;rendering_viewport_max_height =
-;rendering_viewport_max_device_scale_factor =
-
-# Change the listening host and port of the gRPC server. Default host is 127.0.0.1 and default port is 0 and will automatically assign
-# a port not in use.
-;grpc_host =
-;grpc_port =
-
-[enterprise]
-# Path to a valid Grafana Enterprise license.jwt file
-;license_path =
-
-[feature_toggles]
-# enable features, separated by spaces
-;enable =
diff --git a/compose/grafana_conf/dashboards/apisix_http_prometheus.json b/compose/grafana_conf/dashboards/apisix_http_prometheus.json
deleted file mode 100644
index ad1e23f..0000000
--- a/compose/grafana_conf/dashboards/apisix_http_prometheus.json
+++ /dev/null
@@ -1,933 +0,0 @@
-{
-  "annotations": {
-    "list": [
-      {
-        "builtIn": 1,
-        "datasource": "apisix",
-        "enable": true,
-        "hide": true,
-        "iconColor": "rgba(0, 211, 255, 1)",
-        "limit": 100,
-        "name": "Annotations & Alerts",
-        "showIn": 0,
-        "type": "dashboard"
-      }
-    ]
-  },
-  "description": "MicroService API Gateway Apache APISIX",
-  "editable": true,
-  "gnetId": 11719,
-  "graphTooltip": 0,
-  "id": 10,
-  "iteration": 1591947413854,
-  "links": [],
-  "panels": [
-    {
-      "collapsed": false,
-      "datasource": "apisix",
-      "gridPos": {
-        "h": 1,
-        "w": 24,
-        "x": 0,
-        "y": 0
-      },
-      "id": 10,
-      "panels": [],
-      "title": "Nginx",
-      "type": "row"
-    },
-    {
-      "cacheTimeout": null,
-      "colorBackground": false,
-      "colorValue": false,
-      "colors": ["#299c46", "rgba(237, 129, 40, 0.89)", "#d44a3a"],
-      "datasource": "apisix",
-      "description": "",
-      "fieldConfig": {
-        "defaults": {
-          "custom": {}
-        },
-        "overrides": []
-      },
-      "format": "none",
-      "gauge": {
-        "maxValue": 100,
-        "minValue": 0,
-        "show": false,
-        "thresholdLabels": false,
-        "thresholdMarkers": true
-      },
-      "gridPos": {
-        "h": 5,
-        "w": 5,
-        "x": 0,
-        "y": 1
-      },
-      "id": 8,
-      "interval": null,
-      "links": [],
-      "mappingType": 1,
-      "mappingTypes": [
-        {
-          "name": "value to text",
-          "value": 1
-        },
-        {
-          "name": "range to text",
-          "value": 2
-        }
-      ],
-      "maxDataPoints": 100,
-      "nullPointMode": "connected",
-      "nullText": null,
-      "postfix": "",
-      "postfixFontSize": "50%",
-      "prefix": "",
-      "prefixFontSize": "50%",
-      "rangeMaps": [
-        {
-          "from": "null",
-          "text": "N/A",
-          "to": "null"
-        }
-      ],
-      "sparkline": {
-        "fillColor": "rgba(31, 118, 189, 0.18)",
-        "full": true,
-        "lineColor": "rgb(31, 120, 193)",
-        "show": true,
-        "ymax": null,
-        "ymin": null
-      },
-      "tableColumn": "Total",
-      "targets": [
-        {
-          "expr": "sum(apisix_nginx_http_current_connections{state=\"total\", instance=~\"$instance\"})",
-          "intervalFactor": 2,
-          "legendFormat": "Total",
-          "refId": "A"
-        }
-      ],
-      "thresholds": "",
-      "timeFrom": null,
-      "timeShift": null,
-      "title": "Total Connections",
-      "type": "singlestat",
-      "valueFontSize": "80%",
-      "valueMaps": [
-        {
-          "op": "=",
-          "text": "N/A",
-          "value": "null"
-        }
-      ],
-      "valueName": "current"
-    },
-    {
-      "cacheTimeout": null,
-      "colorBackground": false,
-      "colorValue": false,
-      "colors": ["#299c46", "rgba(237, 129, 40, 0.89)", "#d44a3a"],
-      "datasource": "apisix",
-      "description": "",
-      "fieldConfig": {
-        "defaults": {
-          "custom": {}
-        },
-        "overrides": []
-      },
-      "format": "none",
-      "gauge": {
-        "maxValue": 100,
-        "minValue": 0,
-        "show": false,
-        "thresholdLabels": false,
-        "thresholdMarkers": true
-      },
-      "gridPos": {
-        "h": 5,
-        "w": 5,
-        "x": 5,
-        "y": 1
-      },
-      "id": 16,
-      "interval": null,
-      "links": [],
-      "mappingType": 1,
-      "mappingTypes": [
-        {
-          "name": "value to text",
-          "value": 1
-        },
-        {
-          "name": "range to text",
-          "value": 2
-        }
-      ],
-      "maxDataPoints": 100,
-      "nullPointMode": "connected",
-      "nullText": null,
-      "postfix": "",
-      "postfixFontSize": "50%",
-      "prefix": "",
-      "prefixFontSize": "50%",
-      "rangeMaps": [
-        {
-          "from": "null",
-          "text": "N/A",
-          "to": "null"
-        }
-      ],
-      "sparkline": {
-        "fillColor": "rgba(31, 118, 189, 0.18)",
-        "full": true,
-        "lineColor": "rgb(31, 120, 193)",
-        "show": true,
-        "ymax": null,
-        "ymin": null
-      },
-      "tableColumn": "Accepted",
-      "targets": [
-        {
-          "expr": "sum(apisix_nginx_http_current_connections{state=\"accepted\", instance=~\"$instance\"})",
-          "intervalFactor": 2,
-          "legendFormat": "Accepted",
-          "refId": "A"
-        }
-      ],
-      "thresholds": "",
-      "timeFrom": null,
-      "timeShift": null,
-      "title": "Accepted Connections",
-      "type": "singlestat",
-      "valueFontSize": "80%",
-      "valueMaps": [
-        {
-          "op": "=",
-          "text": "N/A",
-          "value": "null"
-        }
-      ],
-      "valueName": "current"
-    },
-    {
-      "cacheTimeout": null,
-      "colorBackground": false,
-      "colorValue": false,
-      "colors": ["#299c46", "rgba(237, 129, 40, 0.89)", "#d44a3a"],
-      "datasource": "apisix",
-      "description": "",
-      "fieldConfig": {
-        "defaults": {
-          "custom": {}
-        },
-        "overrides": []
-      },
-      "format": "none",
-      "gauge": {
-        "maxValue": 100,
-        "minValue": 0,
-        "show": false,
-        "thresholdLabels": false,
-        "thresholdMarkers": true
-      },
-      "gridPos": {
-        "h": 5,
-        "w": 5,
-        "x": 10,
-        "y": 1
-      },
-      "id": 11,
-      "interval": null,
-      "links": [],
-      "mappingType": 1,
-      "mappingTypes": [
-        {
-          "name": "value to text",
-          "value": 1
-        },
-        {
-          "name": "range to text",
-          "value": 2
-        }
-      ],
-      "maxDataPoints": 100,
-      "nullPointMode": "connected",
-      "nullText": null,
-      "postfix": "",
-      "postfixFontSize": "50%",
-      "prefix": "",
-      "prefixFontSize": "50%",
-      "rangeMaps": [
-        {
-          "from": "null",
-          "text": "N/A",
-          "to": "null"
-        }
-      ],
-      "sparkline": {
-        "fillColor": "rgba(31, 118, 189, 0.18)",
-        "full": true,
-        "lineColor": "rgb(31, 120, 193)",
-        "show": true,
-        "ymax": null,
-        "ymin": null
-      },
-      "tableColumn": "Total",
-      "targets": [
-        {
-          "expr": "sum(apisix_nginx_http_current_connections{state=\"handled\", instance=~\"$instance\"})",
-          "intervalFactor": 2,
-          "legendFormat": "Total",
-          "refId": "A"
-        }
-      ],
-      "thresholds": "",
-      "timeFrom": null,
-      "timeShift": null,
-      "title": "Handled Connections",
-      "type": "singlestat",
-      "valueFontSize": "80%",
-      "valueMaps": [
-        {
-          "op": "=",
-          "text": "N/A",
-          "value": "null"
-        }
-      ],
-      "valueName": "current"
-    },
-    {
-      "aliasColors": {},
-      "bars": false,
-      "dashLength": 10,
-      "dashes": false,
-      "datasource": "apisix",
-      "fieldConfig": {
-        "defaults": {
-          "custom": {}
-        },
-        "overrides": []
-      },
-      "fill": 1,
-      "fillGradient": 0,
-      "gridPos": {
-        "h": 6,
-        "w": 15,
-        "x": 0,
-        "y": 6
-      },
-      "hiddenSeries": false,
-      "id": 17,
-      "legend": {
-        "alignAsTable": false,
-        "avg": false,
-        "current": false,
-        "max": false,
-        "min": false,
-        "rightSide": false,
-        "show": true,
-        "total": false,
-        "values": false
-      },
-      "lines": true,
-      "linewidth": 1,
-      "nullPointMode": "null",
-      "options": {
-        "dataLinks": []
-      },
-      "percentage": false,
-      "pointradius": 2,
-      "points": false,
-      "renderer": "flot",
-      "seriesOverrides": [],
-      "spaceLength": 10,
-      "stack": false,
-      "steppedLine": false,
-      "targets": [
-        {
-          "expr": "sum(apisix_nginx_http_current_connections{state=~\"active|reading|writing|waiting\", instance=~\"$instance\"}) by (state)",
-          "intervalFactor": 1,
-          "legendFormat": "{{state}}",
-          "refId": "A"
-        }
-      ],
-      "thresholds": [],
-      "timeFrom": null,
-      "timeRegions": [],
-      "timeShift": null,
-      "title": "Nginx connection state",
-      "tooltip": {
-        "shared": true,
-        "sort": 0,
-        "value_type": "individual"
-      },
-      "type": "graph",
-      "xaxis": {
-        "buckets": null,
-        "mode": "time",
-        "name": null,
-        "show": true,
-        "values": []
-      },
-      "yaxes": [
-        {
-          "format": "short",
-          "label": null,
-          "logBase": 1,
-          "max": null,
-          "min": null,
-          "show": true
-        },
-        {
-          "format": "short",
-          "label": null,
-          "logBase": 1,
-          "max": null,
-          "min": null,
-          "show": true
-        }
-      ],
-      "yaxis": {
-        "align": false,
-        "alignLevel": null
-      }
-    },
-    {
-      "collapsed": false,
-      "datasource": "apisix",
-      "gridPos": {
-        "h": 1,
-        "w": 24,
-        "x": 0,
-        "y": 12
-      },
-      "id": 13,
-      "panels": [],
-      "title": "Bandwidth",
-      "type": "row"
-    },
-    {
-      "aliasColors": {},
-      "bars": false,
-      "dashLength": 10,
-      "dashes": false,
-      "datasource": "apisix",
-      "fieldConfig": {
-        "defaults": {
-          "custom": {}
-        },
-        "overrides": []
-      },
-      "fill": 1,
-      "fillGradient": 0,
-      "gridPos": {
-        "h": 6,
-        "w": 15,
-        "x": 0,
-        "y": 13
-      },
-      "hiddenSeries": false,
-      "id": 6,
-      "legend": {
-        "alignAsTable": true,
-        "avg": true,
-        "current": true,
-        "max": true,
-        "min": true,
-        "rightSide": true,
-        "show": true,
-        "total": false,
-        "values": true
-      },
-      "lines": true,
-      "linewidth": 1,
-      "nullPointMode": "null",
-      "options": {
-        "dataLinks": []
-      },
-      "percentage": false,
-      "pointradius": 2,
-      "points": false,
-      "renderer": "flot",
-      "seriesOverrides": [],
-      "spaceLength": 10,
-      "stack": false,
-      "steppedLine": false,
-      "targets": [
-        {
-          "expr": "sum(rate(apisix_bandwidth{instance=~\"$instance\"}[30s])) by (type)",
-          "legendFormat": "{{type}}",
-          "refId": "A"
-        }
-      ],
-      "thresholds": [],
-      "timeFrom": null,
-      "timeRegions": [],
-      "timeShift": null,
-      "title": "Total Bandwidth",
-      "tooltip": {
-        "shared": true,
-        "sort": 0,
-        "value_type": "individual"
-      },
-      "type": "graph",
-      "xaxis": {
-        "buckets": null,
-        "mode": "time",
-        "name": null,
-        "show": true,
-        "values": []
-      },
-      "yaxes": [
-        {
-          "format": "short",
-          "label": null,
-          "logBase": 1,
-          "max": null,
-          "min": null,
-          "show": true
-        },
-        {
-          "format": "short",
-          "label": null,
-          "logBase": 1,
-          "max": null,
-          "min": null,
-          "show": true
-        }
-      ],
-      "yaxis": {
-        "align": false,
-        "alignLevel": null
-      }
-    },
-    {
-      "aliasColors": {},
-      "bars": false,
-      "dashLength": 10,
-      "dashes": false,
-      "datasource": "apisix",
-      "fieldConfig": {
-        "defaults": {
-          "custom": {}
-        },
-        "overrides": []
-      },
-      "fill": 1,
-      "fillGradient": 0,
-      "gridPos": {
-        "h": 6,
-        "w": 7,
-        "x": 0,
-        "y": 19
-      },
-      "hiddenSeries": false,
-      "id": 19,
-      "legend": {
-        "avg": false,
-        "current": false,
-        "max": false,
-        "min": false,
-        "show": true,
-        "total": false,
-        "values": false
-      },
-      "lines": true,
-      "linewidth": 1,
-      "nullPointMode": "null",
-      "options": {
-        "dataLinks": []
-      },
-      "percentage": false,
-      "pointradius": 2,
-      "points": false,
-      "renderer": "flot",
-      "seriesOverrides": [],
-      "spaceLength": 10,
-      "stack": false,
-      "steppedLine": false,
-      "targets": [
-        {
-          "expr": "sum(rate(apisix_bandwidth{type=\"egress\", service =~\"$service\",route=~\"$route\",instance=~\"$instance\"}[1m])) by (service)",
-          "legendFormat": "service:{{service}}",
-          "refId": "A"
-        },
-        {
-          "expr": "sum(rate(apisix_bandwidth{type=\"egress\", service =~\"$service\",route=~\"$route\",instance=~\"$instance\"}[1m])) by (route)",
-          "legendFormat": "route:{{route}}",
-          "refId": "B"
-        }
-      ],
-      "thresholds": [],
-      "timeFrom": null,
-      "timeRegions": [],
-      "timeShift": null,
-      "title": "Egress per service/route",
-      "tooltip": {
-        "shared": true,
-        "sort": 0,
-        "value_type": "individual"
-      },
-      "type": "graph",
-      "xaxis": {
-        "buckets": null,
-        "mode": "time",
-        "name": null,
-        "show": true,
-        "values": []
-      },
-      "yaxes": [
-        {
-          "format": "short",
-          "label": null,
-          "logBase": 1,
-          "max": null,
-          "min": null,
-          "show": true
-        },
-        {
-          "format": "short",
-          "label": null,
-          "logBase": 1,
-          "max": null,
-          "min": null,
-          "show": true
-        }
-      ],
-      "yaxis": {
-        "align": false,
-        "alignLevel": null
-      }
-    },
-    {
-      "aliasColors": {},
-      "bars": false,
-      "dashLength": 10,
-      "dashes": false,
-      "datasource": "apisix",
-      "fieldConfig": {
-        "defaults": {
-          "custom": {}
-        },
-        "overrides": []
-      },
-      "fill": 1,
-      "fillGradient": 0,
-      "gridPos": {
-        "h": 6,
-        "w": 8,
-        "x": 7,
-        "y": 19
-      },
-      "hiddenSeries": false,
-      "id": 21,
-      "legend": {
-        "avg": false,
-        "current": false,
-        "max": false,
-        "min": false,
-        "show": true,
-        "total": false,
-        "values": false
-      },
-      "lines": true,
-      "linewidth": 1,
-      "nullPointMode": "null",
-      "options": {
-        "dataLinks": []
-      },
-      "percentage": false,
-      "pointradius": 2,
-      "points": false,
-      "renderer": "flot",
-      "seriesOverrides": [],
-      "spaceLength": 10,
-      "stack": false,
-      "steppedLine": false,
-      "targets": [
-        {
-          "expr": "sum(irate(apisix_bandwidth{type=\"ingress\", service =~\"$service\",route=~\"$route\",instance=~\"$instance\"}[1m])) by (service)",
-          "legendFormat": "service:{{service}}",
-          "refId": "A"
-        },
-        {
-          "expr": "sum(irate(apisix_bandwidth{type=\"ingress\", service =~\"$service\",route=~\"$route\",instance=~\"$instance\"}[1m])) by (route)",
-          "legendFormat": "route:{{route}}",
-          "refId": "B"
-        }
-      ],
-      "thresholds": [],
-      "timeFrom": null,
-      "timeRegions": [],
-      "timeShift": null,
-      "title": "Ingress per service/route",
-      "tooltip": {
-        "shared": true,
-        "sort": 0,
-        "value_type": "individual"
-      },
-      "type": "graph",
-      "xaxis": {
-        "buckets": null,
-        "mode": "time",
-        "name": null,
-        "show": true,
-        "values": []
-      },
-      "yaxes": [
-        {
-          "format": "short",
-          "label": null,
-          "logBase": 1,
-          "max": null,
-          "min": null,
-          "show": true
-        },
-        {
-          "format": "short",
-          "label": null,
-          "logBase": 1,
-          "max": null,
-          "min": null,
-          "show": true
-        }
-      ],
-      "yaxis": {
-        "align": false,
-        "alignLevel": null
-      }
-    },
-    {
-      "collapsed": false,
-      "datasource": "apisix",
-      "gridPos": {
-        "h": 1,
-        "w": 24,
-        "x": 0,
-        "y": 25
-      },
-      "id": 15,
-      "panels": [],
-      "title": "HTTP Status",
-      "type": "row"
-    },
-    {
-      "aliasColors": {},
-      "bars": false,
-      "cacheTimeout": null,
-      "dashLength": 10,
-      "dashes": false,
-      "datasource": "apisix",
-      "fieldConfig": {
-        "defaults": {
-          "custom": {}
-        },
-        "overrides": []
-      },
-      "fill": 3,
-      "fillGradient": 0,
-      "gridPos": {
-        "h": 6,
-        "w": 15,
-        "x": 0,
-        "y": 26
-      },
-      "hiddenSeries": false,
-      "id": 2,
-      "interval": "",
-      "legend": {
-        "avg": false,
-        "current": false,
-        "max": false,
-        "min": false,
-        "show": true,
-        "total": false,
-        "values": false
-      },
-      "lines": true,
-      "linewidth": 1,
-      "links": [],
-      "nullPointMode": "null",
-      "options": {
-        "dataLinks": []
-      },
-      "percentage": false,
-      "pluginVersion": "6.5.2",
-      "pointradius": 2,
-      "points": false,
-      "renderer": "flot",
-      "seriesOverrides": [
-        {
-          "alias": "state",
-          "lines": true
-        }
-      ],
-      "spaceLength": 10,
-      "stack": false,
-      "steppedLine": false,
-      "targets": [
-        {
-          "expr": "sum(rate(apisix_http_status{code=~\"2..\",service=~\"$service\",route=~\"$route\",instance=~\"$instance\"}[30s])) by (status_2xx)",
-          "instant": false,
-          "intervalFactor": 1,
-          "legendFormat": "{{status_2xx}}",
-          "refId": "A"
-        },
-        {
-          "expr": "sum(rate(apisix_http_status{code=~\"3..\",service=~\"$service\",route=~\"$route\",instance=~\"$instance\"}[30s])) by (status_3xx)",
-          "legendFormat": "{{status_3xx}}",
-          "refId": "D"
-        },
-        {
-          "expr": "sum(rate(apisix_http_status{code=~\"4..\",service=~\"$service\",route=~\"$route\",instance=~\"$instance\"}[30s])) by (status_4xx)",
-          "intervalFactor": 1,
-          "legendFormat": "{{status_4xx}}",
-          "refId": "B"
-        },
-        {
-          "expr": "sum(rate(apisix_http_status{code=~\"5..\",service=~\"$service\",route=~\"$route\",instance=~\"$instance\"}[30s])) by (status_5xx)",
-          "legendFormat": "{{status_5xx}}",
-          "refId": "C"
-        }
-      ],
-      "thresholds": [],
-      "timeFrom": null,
-      "timeRegions": [],
-      "timeShift": null,
-      "title": "Service HTTP Code",
-      "tooltip": {
-        "shared": true,
-        "sort": 0,
-        "value_type": "individual"
-      },
-      "type": "graph",
-      "xaxis": {
-        "buckets": null,
-        "mode": "time",
-        "name": null,
-        "show": true,
-        "values": []
-      },
-      "yaxes": [
-        {
-          "format": "short",
-          "label": null,
-          "logBase": 1,
-          "max": null,
-          "min": null,
-          "show": true
-        },
-        {
-          "format": "short",
-          "label": null,
-          "logBase": 1,
-          "max": null,
-          "min": null,
-          "show": true
-        }
-      ],
-      "yaxis": {
-        "align": false,
-        "alignLevel": null
-      }
-    }
-  ],
-  "refresh": "5s",
-  "schemaVersion": 25,
-  "style": "dark",
-  "tags": [],
-  "templating": {
-    "list": [
-      {
-        "allValue": ".*",
-        "current": {
-          "selected": false,
-          "text": "All",
-          "value": "$__all"
-        },
-        "datasource": "apisix",
-        "definition": "label_values(apisix_http_status,service)",
-        "hide": 0,
-        "includeAll": true,
-        "label": null,
-        "multi": true,
-        "name": "service",
-        "options": [],
-        "query": "label_values(apisix_http_status,service)",
-        "refresh": 1,
-        "regex": "",
-        "skipUrlSync": false,
-        "sort": 1,
-        "tagValuesQuery": "",
-        "tags": [],
-        "tagsQuery": "",
-        "type": "query",
-        "useTags": false
-      },
-      {
-        "allValue": ".*",
-        "current": {
-          "selected": false,
-          "text": "All",
-          "value": "$__all"
-        },
-        "datasource": "apisix",
-        "definition": "label_values(apisix_http_status,route)",
-        "hide": 0,
-        "includeAll": true,
-        "label": null,
-        "multi": true,
-        "name": "route",
-        "options": [],
-        "query": "label_values(apisix_http_status,route)",
-        "refresh": 1,
-        "regex": "",
-        "skipUrlSync": false,
-        "sort": 1,
-        "tagValuesQuery": "",
-        "tags": [],
-        "tagsQuery": "",
-        "type": "query",
-        "useTags": false
-      },
-      {
-        "allValue": ".*",
-        "current": {
-          "selected": false,
-          "text": "All",
-          "value": "$__all"
-        },
-        "datasource": "apisix",
-        "definition": "label_values(apisix_http_status,instance)",
-        "hide": 0,
-        "includeAll": true,
-        "label": null,
-        "multi": true,
-        "name": "instance",
-        "options": [],
-        "query": "label_values(apisix_http_status,instance)",
-        "refresh": 2,
-        "regex": ".*",
-        "skipUrlSync": false,
-        "sort": 1,
-        "tagValuesQuery": "",
-        "tags": [],
-        "tagsQuery": "",
-        "type": "query",
-        "useTags": false
-      }
-    ]
-  },
-  "time": {
-    "from": "now-30m",
-    "to": "now"
-  },
-  "timepicker": {
-    "refresh_intervals": ["5s", "10s", "30s", "1m", "5m", "15m", "30m", "1h", "2h", "1d"]
-  },
-  "timezone": "",
-  "title": "Apache APISIX",
-  "uid": "bLlNuRLWz",
-  "version": 1
-}
diff --git a/compose/grafana_conf/provisioning/dashboards/all.yaml b/compose/grafana_conf/provisioning/dashboards/all.yaml
deleted file mode 100644
index d239437..0000000
--- a/compose/grafana_conf/provisioning/dashboards/all.yaml
+++ /dev/null
@@ -1,27 +0,0 @@
-#
-# 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.
-#
-apiVersion: 1
-
-providers:
-  - name: 'default'
-    orgId: 1
-    folder: ''
-    type: file
-    disableDeletion: false
-    editable: false
-    options:
-      path: /var/lib/grafana/dashboards
diff --git a/compose/grafana_conf/provisioning/datasources/all.yaml b/compose/grafana_conf/provisioning/datasources/all.yaml
deleted file mode 100644
index 0f72aed..0000000
--- a/compose/grafana_conf/provisioning/datasources/all.yaml
+++ /dev/null
@@ -1,25 +0,0 @@
-#
-# 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.
-#
-datasources:
-  - access: 'proxy'
-    editable: true
-    is_default: true
-    name: 'apisix'
-    org_id: 1
-    type: 'prometheus'
-    url: 'http://prometheus:9090'
-    version: 1
diff --git a/compose/manager_conf/entry.sh b/compose/manager_conf/entry.sh
deleted file mode 100755
index 34ca263..0000000
--- a/compose/manager_conf/entry.sh
+++ /dev/null
@@ -1,38 +0,0 @@
-#
-# 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.
-#
-
-#!/bin/sh
-
-pwd=`pwd`
-
-# config
-cp ${pwd}/api/conf/conf_preview.json ${pwd}/conf.json
-
-export APIX_ETCD_ENDPOINTS="192.17.5.10:2379"
-
-export SYSLOG_HOST=127.0.0.1
-
-if [[ "$unamestr" == 'Darwin' ]]; then
-	sed -i '' -e "s%#syslogAddress#%`echo $SYSLOG_HOST`%g" ${pwd}/conf.json
-else
-	sed -i -e "s%#syslogAddress#%`echo $SYSLOG_HOST`%g" ${pwd}/conf.json
-fi
-
-cp ${pwd}/conf.json ${pwd}/api/conf/conf.json
-
-cd /go/manager-api
-exec ./manager-api
diff --git a/compose/prometheus_conf/prometheus.yml b/compose/prometheus_conf/prometheus.yml
deleted file mode 100644
index 50b5aa9..0000000
--- a/compose/prometheus_conf/prometheus.yml
+++ /dev/null
@@ -1,39 +0,0 @@
-#
-# 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.
-#
-global:
-  scrape_interval: 15s # By default, scrape targets every 15 seconds.
-
-  # Attach these labels to any time series or alerts when communicating with
-  # external systems (federation, remote storage, Alertmanager).
-  external_labels:
-    monitor: 'codelab-monitor'
-
-# A scrape configuration containing exactly one endpoint to scrape:
-# Here it's Prometheus itself.
-scrape_configs:
-  # The job name is added as a label `job=<job_name>` to any timeseries scraped from this config.
-  - job_name: 'prometheus'
-
-    # Override the global default and scrape targets from this job every 5 seconds.
-    scrape_interval: 5s
-
-    static_configs:
-      - targets: ['localhost:9090']
-  - job_name: 'apisix'
-    metrics_path: '/apisix/prometheus/metrics'
-    static_configs:
-      - targets: ['192.17.5.11:9080']
diff --git a/docker/nginx.conf b/docker/nginx.conf
deleted file mode 100644
index a596506..0000000
--- a/docker/nginx.conf
+++ /dev/null
@@ -1,38 +0,0 @@
-#
-# 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.
-#
-
-server {
-    listen 80;
-    # gzip config
-    gzip on;
-    gzip_min_length 1k;
-    gzip_comp_level 9;
-    gzip_types text/plain text/css text/javascript application/json application/javascript application/x-javascript application/xml;
-    gzip_vary on;
-    gzip_disable "MSIE [1-6]\.";
-
-    root /usr/share/nginx/html;
-    include /etc/nginx/mime.types;
-
-    location / {
-        try_files $uri $uri/ /index.html;
-    }
-
-    location /apisix/admin {
-        proxy_pass http://manager:8080/apisix/admin;
-    }
-}
diff --git a/docs/deploy.md b/docs/deploy.md
index d1a19fd..b384f1d 100644
--- a/docs/deploy.md
+++ b/docs/deploy.md
@@ -55,6 +55,8 @@ $ go env -w GOPROXY=https://goproxy.cn,direct
 $ api/build.sh
 ```
 
+The bundled files are located in the root directory `/output`.
+
 ## Build the frontend
 
 This project is initialized with [Ant Design Pro](https://pro.ant.design). The following are some quick guides for how to use.
@@ -64,6 +66,8 @@ This project is initialized with [Ant Design Pro](https://pro.ant.design). The f
 3. Install dependencies:
 
 ```sh
+$ cd /frontend
+
 $ yarn install
 ```
 
@@ -73,7 +77,7 @@ $ yarn install
 $ yarn build
 ```
 
-5. The bundled files are under `/dist` folder if the step 4 is successful.
+The bundled files are located in the root directory `/output/html`.
 
 ## Run
 
diff --git a/docs/deploy.zh-CN.md b/docs/deploy.zh-CN.md
index ae003fb..c65ea58 100644
--- a/docs/deploy.zh-CN.md
+++ b/docs/deploy.zh-CN.md
@@ -55,6 +55,8 @@ $ go env -w GOPROXY=https://goproxy.cn,direct
 $ api/build.sh
 ```
 
+构建完成后的文件在根目录 `/output` 下。
+
 ## 构建前端
 
 该项目使用 [Ant Design Pro](https://pro.ant.design) 初始化。以下是一些使用方法的快速指南。
@@ -66,6 +68,8 @@ $ api/build.sh
 3. 安装依赖:
 
 ```sh
+$ cd /frontend
+
 $ yarn install
 ```
 
@@ -75,7 +79,7 @@ $ yarn install
 $ yarn build
 ```
 
-5. 如果第 4 步成功的话,那么构建后的文件在 `/dist` 目录下。
+构建完成后的文件在根目录 `/output/html` 目录下。
 
 ## 启动
 
diff --git a/.editorconfig b/frontend/.editorconfig
similarity index 100%
rename from .editorconfig
rename to frontend/.editorconfig
diff --git a/.eslintignore b/frontend/.eslintignore
similarity index 100%
rename from .eslintignore
rename to frontend/.eslintignore
diff --git a/.eslintrc.js b/frontend/.eslintrc.js
similarity index 100%
rename from .eslintrc.js
rename to frontend/.eslintrc.js
diff --git a/.prettierignore b/frontend/.prettierignore
similarity index 100%
rename from .prettierignore
rename to frontend/.prettierignore
diff --git a/.prettierrc.js b/frontend/.prettierrc.js
similarity index 100%
rename from .prettierrc.js
rename to frontend/.prettierrc.js
diff --git a/.stylelintrc.js b/frontend/.stylelintrc.js
similarity index 100%
rename from .stylelintrc.js
rename to frontend/.stylelintrc.js
diff --git a/config/config.ts b/frontend/config/config.ts
similarity index 98%
rename from config/config.ts
rename to frontend/config/config.ts
index e826c76..f71d512 100644
--- a/config/config.ts
+++ b/frontend/config/config.ts
@@ -61,4 +61,5 @@ export default defineConfig({
   manifest: {
     basePath: '/',
   },
+  outputPath: '../output/html'
 });
diff --git a/config/defaultSettings.ts b/frontend/config/defaultSettings.ts
similarity index 100%
rename from config/defaultSettings.ts
rename to frontend/config/defaultSettings.ts
diff --git a/config/proxy.ts b/frontend/config/proxy.ts
similarity index 100%
rename from config/proxy.ts
rename to frontend/config/proxy.ts
diff --git a/config/routes.ts b/frontend/config/routes.ts
similarity index 100%
rename from config/routes.ts
rename to frontend/config/routes.ts
diff --git a/jest.config.js b/frontend/jest.config.js
similarity index 100%
rename from jest.config.js
rename to frontend/jest.config.js
diff --git a/jsconfig.json b/frontend/jsconfig.json
similarity index 100%
rename from jsconfig.json
rename to frontend/jsconfig.json
diff --git a/mock/notices.ts b/frontend/mock/notices.ts
similarity index 100%
rename from mock/notices.ts
rename to frontend/mock/notices.ts
diff --git a/mock/route.ts b/frontend/mock/route.ts
similarity index 100%
rename from mock/route.ts
rename to frontend/mock/route.ts
diff --git a/mock/user.ts b/frontend/mock/user.ts
similarity index 100%
rename from mock/user.ts
rename to frontend/mock/user.ts
diff --git a/package.json b/frontend/package.json
similarity index 100%
rename from package.json
rename to frontend/package.json
diff --git a/public/empty.svg b/frontend/public/empty.svg
similarity index 100%
rename from public/empty.svg
rename to frontend/public/empty.svg
diff --git a/public/favicon.png b/frontend/public/favicon.png
similarity index 100%
rename from public/favicon.png
rename to frontend/public/favicon.png
diff --git a/scripts/verifyCommit.js b/frontend/scripts/verifyCommit.js
similarity index 100%
rename from scripts/verifyCommit.js
rename to frontend/scripts/verifyCommit.js
diff --git a/src/access.ts b/frontend/src/access.ts
similarity index 100%
rename from src/access.ts
rename to frontend/src/access.ts
diff --git a/src/app.tsx b/frontend/src/app.tsx
similarity index 100%
rename from src/app.tsx
rename to frontend/src/app.tsx
diff --git a/src/assets/logo.svg b/frontend/src/assets/logo.svg
similarity index 100%
rename from src/assets/logo.svg
rename to frontend/src/assets/logo.svg
diff --git a/src/components/ActionBar/ActionBar.tsx b/frontend/src/components/ActionBar/ActionBar.tsx
similarity index 100%
rename from src/components/ActionBar/ActionBar.tsx
rename to frontend/src/components/ActionBar/ActionBar.tsx
diff --git a/src/components/ActionBar/index.ts b/frontend/src/components/ActionBar/index.ts
similarity index 100%
rename from src/components/ActionBar/index.ts
rename to frontend/src/components/ActionBar/index.ts
diff --git a/src/components/ActionBar/locales/en-US.ts b/frontend/src/components/ActionBar/locales/en-US.ts
similarity index 100%
rename from src/components/ActionBar/locales/en-US.ts
rename to frontend/src/components/ActionBar/locales/en-US.ts
diff --git a/src/components/ActionBar/locales/zh-CN.ts b/frontend/src/components/ActionBar/locales/zh-CN.ts
similarity index 100%
rename from src/components/ActionBar/locales/zh-CN.ts
rename to frontend/src/components/ActionBar/locales/zh-CN.ts
diff --git a/src/components/Footer/index.tsx b/frontend/src/components/Footer/index.tsx
similarity index 100%
rename from src/components/Footer/index.tsx
rename to frontend/src/components/Footer/index.tsx
diff --git a/src/components/HeaderDropdown/index.less b/frontend/src/components/HeaderDropdown/index.less
similarity index 100%
rename from src/components/HeaderDropdown/index.less
rename to frontend/src/components/HeaderDropdown/index.less
diff --git a/src/components/HeaderDropdown/index.tsx b/frontend/src/components/HeaderDropdown/index.tsx
similarity index 100%
rename from src/components/HeaderDropdown/index.tsx
rename to frontend/src/components/HeaderDropdown/index.tsx
diff --git a/src/components/NoticeIcon/NoticeList.less b/frontend/src/components/NoticeIcon/NoticeList.less
similarity index 100%
rename from src/components/NoticeIcon/NoticeList.less
rename to frontend/src/components/NoticeIcon/NoticeList.less
diff --git a/src/components/NoticeIcon/NoticeList.tsx b/frontend/src/components/NoticeIcon/NoticeList.tsx
similarity index 100%
rename from src/components/NoticeIcon/NoticeList.tsx
rename to frontend/src/components/NoticeIcon/NoticeList.tsx
diff --git a/src/components/NoticeIcon/index.less b/frontend/src/components/NoticeIcon/index.less
similarity index 100%
rename from src/components/NoticeIcon/index.less
rename to frontend/src/components/NoticeIcon/index.less
diff --git a/src/components/NoticeIcon/index.tsx b/frontend/src/components/NoticeIcon/index.tsx
similarity index 100%
rename from src/components/NoticeIcon/index.tsx
rename to frontend/src/components/NoticeIcon/index.tsx
diff --git a/src/components/PageLoading/index.tsx b/frontend/src/components/PageLoading/index.tsx
similarity index 100%
rename from src/components/PageLoading/index.tsx
rename to frontend/src/components/PageLoading/index.tsx
diff --git a/src/components/RightContent/AvatarDropdown.tsx b/frontend/src/components/RightContent/AvatarDropdown.tsx
similarity index 100%
rename from src/components/RightContent/AvatarDropdown.tsx
rename to frontend/src/components/RightContent/AvatarDropdown.tsx
diff --git a/src/components/RightContent/index.less b/frontend/src/components/RightContent/index.less
similarity index 100%
rename from src/components/RightContent/index.less
rename to frontend/src/components/RightContent/index.less
diff --git a/src/components/RightContent/index.tsx b/frontend/src/components/RightContent/index.tsx
similarity index 100%
rename from src/components/RightContent/index.tsx
rename to frontend/src/components/RightContent/index.tsx
diff --git a/src/components/Upstream/UpstreamForm.tsx b/frontend/src/components/Upstream/UpstreamForm.tsx
similarity index 100%
rename from src/components/Upstream/UpstreamForm.tsx
rename to frontend/src/components/Upstream/UpstreamForm.tsx
diff --git a/src/components/Upstream/constant.ts b/frontend/src/components/Upstream/constant.ts
similarity index 100%
rename from src/components/Upstream/constant.ts
rename to frontend/src/components/Upstream/constant.ts
diff --git a/src/components/Upstream/index.ts b/frontend/src/components/Upstream/index.ts
similarity index 100%
rename from src/components/Upstream/index.ts
rename to frontend/src/components/Upstream/index.ts
diff --git a/src/constants.ts b/frontend/src/constants.ts
similarity index 100%
rename from src/constants.ts
rename to frontend/src/constants.ts
diff --git a/src/e2e/__mocks__/antd-pro-merge-less.js b/frontend/src/e2e/__mocks__/antd-pro-merge-less.js
similarity index 100%
rename from src/e2e/__mocks__/antd-pro-merge-less.js
rename to frontend/src/e2e/__mocks__/antd-pro-merge-less.js
diff --git a/src/e2e/baseLayout.e2e.js b/frontend/src/e2e/baseLayout.e2e.js
similarity index 100%
rename from src/e2e/baseLayout.e2e.js
rename to frontend/src/e2e/baseLayout.e2e.js
diff --git a/src/global.less b/frontend/src/global.less
similarity index 100%
rename from src/global.less
rename to frontend/src/global.less
diff --git a/src/global.tsx b/frontend/src/global.tsx
similarity index 100%
rename from src/global.tsx
rename to frontend/src/global.tsx
diff --git a/src/helpers.tsx b/frontend/src/helpers.tsx
similarity index 100%
rename from src/helpers.tsx
rename to frontend/src/helpers.tsx
diff --git a/src/iconfont.ts b/frontend/src/iconfont.ts
similarity index 100%
rename from src/iconfont.ts
rename to frontend/src/iconfont.ts
diff --git a/src/locales/en-US.ts b/frontend/src/locales/en-US.ts
similarity index 100%
rename from src/locales/en-US.ts
rename to frontend/src/locales/en-US.ts
diff --git a/src/locales/en-US/component.ts b/frontend/src/locales/en-US/component.ts
similarity index 100%
rename from src/locales/en-US/component.ts
rename to frontend/src/locales/en-US/component.ts
diff --git a/src/locales/en-US/globalHeader.ts b/frontend/src/locales/en-US/globalHeader.ts
similarity index 100%
rename from src/locales/en-US/globalHeader.ts
rename to frontend/src/locales/en-US/globalHeader.ts
diff --git a/src/locales/en-US/menu.ts b/frontend/src/locales/en-US/menu.ts
similarity index 100%
rename from src/locales/en-US/menu.ts
rename to frontend/src/locales/en-US/menu.ts
diff --git a/src/locales/en-US/pwa.ts b/frontend/src/locales/en-US/pwa.ts
similarity index 100%
rename from src/locales/en-US/pwa.ts
rename to frontend/src/locales/en-US/pwa.ts
diff --git a/src/locales/zh-CN/setting.ts b/frontend/src/locales/en-US/setting.ts
similarity index 100%
rename from src/locales/zh-CN/setting.ts
rename to frontend/src/locales/en-US/setting.ts
diff --git a/src/locales/en-US/settingDrawer.ts b/frontend/src/locales/en-US/settingDrawer.ts
similarity index 100%
rename from src/locales/en-US/settingDrawer.ts
rename to frontend/src/locales/en-US/settingDrawer.ts
diff --git a/src/locales/zh-CN.ts b/frontend/src/locales/zh-CN.ts
similarity index 100%
rename from src/locales/zh-CN.ts
rename to frontend/src/locales/zh-CN.ts
diff --git a/src/locales/zh-CN/component.ts b/frontend/src/locales/zh-CN/component.ts
similarity index 100%
rename from src/locales/zh-CN/component.ts
rename to frontend/src/locales/zh-CN/component.ts
diff --git a/src/locales/zh-CN/globalHeader.ts b/frontend/src/locales/zh-CN/globalHeader.ts
similarity index 100%
rename from src/locales/zh-CN/globalHeader.ts
rename to frontend/src/locales/zh-CN/globalHeader.ts
diff --git a/src/locales/zh-CN/menu.ts b/frontend/src/locales/zh-CN/menu.ts
similarity index 100%
rename from src/locales/zh-CN/menu.ts
rename to frontend/src/locales/zh-CN/menu.ts
diff --git a/src/locales/zh-CN/pwa.ts b/frontend/src/locales/zh-CN/pwa.ts
similarity index 100%
rename from src/locales/zh-CN/pwa.ts
rename to frontend/src/locales/zh-CN/pwa.ts
diff --git a/src/locales/en-US/setting.ts b/frontend/src/locales/zh-CN/setting.ts
similarity index 100%
rename from src/locales/en-US/setting.ts
rename to frontend/src/locales/zh-CN/setting.ts
diff --git a/src/locales/zh-CN/settingDrawer.ts b/frontend/src/locales/zh-CN/settingDrawer.ts
similarity index 100%
rename from src/locales/zh-CN/settingDrawer.ts
rename to frontend/src/locales/zh-CN/settingDrawer.ts
diff --git a/src/manifest.json b/frontend/src/manifest.json
similarity index 100%
rename from src/manifest.json
rename to frontend/src/manifest.json
diff --git a/src/pages/404.tsx b/frontend/src/pages/404.tsx
similarity index 100%
rename from src/pages/404.tsx
rename to frontend/src/pages/404.tsx
diff --git a/src/pages/Consumer/Create.tsx b/frontend/src/pages/Consumer/Create.tsx
similarity index 100%
rename from src/pages/Consumer/Create.tsx
rename to frontend/src/pages/Consumer/Create.tsx
diff --git a/src/pages/Consumer/List.tsx b/frontend/src/pages/Consumer/List.tsx
similarity index 100%
rename from src/pages/Consumer/List.tsx
rename to frontend/src/pages/Consumer/List.tsx
diff --git a/src/pages/Consumer/components/Preview.tsx b/frontend/src/pages/Consumer/components/Preview.tsx
similarity index 100%
rename from src/pages/Consumer/components/Preview.tsx
rename to frontend/src/pages/Consumer/components/Preview.tsx
diff --git a/src/pages/Consumer/components/Step1.tsx b/frontend/src/pages/Consumer/components/Step1.tsx
similarity index 100%
rename from src/pages/Consumer/components/Step1.tsx
rename to frontend/src/pages/Consumer/components/Step1.tsx
diff --git a/src/pages/Route/index.ts b/frontend/src/pages/Consumer/index.ts
similarity index 100%
rename from src/pages/Route/index.ts
rename to frontend/src/pages/Consumer/index.ts
diff --git a/src/pages/Consumer/locales/en-US.ts b/frontend/src/pages/Consumer/locales/en-US.ts
similarity index 100%
rename from src/pages/Consumer/locales/en-US.ts
rename to frontend/src/pages/Consumer/locales/en-US.ts
diff --git a/src/pages/Consumer/locales/zh-CN.ts b/frontend/src/pages/Consumer/locales/zh-CN.ts
similarity index 100%
rename from src/pages/Consumer/locales/zh-CN.ts
rename to frontend/src/pages/Consumer/locales/zh-CN.ts
diff --git a/src/pages/Consumer/service.ts b/frontend/src/pages/Consumer/service.ts
similarity index 100%
rename from src/pages/Consumer/service.ts
rename to frontend/src/pages/Consumer/service.ts
diff --git a/src/pages/Consumer/typing.d.ts b/frontend/src/pages/Consumer/typing.d.ts
similarity index 100%
rename from src/pages/Consumer/typing.d.ts
rename to frontend/src/pages/Consumer/typing.d.ts
diff --git a/src/pages/Metrics/Metrics.tsx b/frontend/src/pages/Metrics/Metrics.tsx
similarity index 100%
rename from src/pages/Metrics/Metrics.tsx
rename to frontend/src/pages/Metrics/Metrics.tsx
diff --git a/src/pages/Metrics/index.ts b/frontend/src/pages/Metrics/index.ts
similarity index 100%
rename from src/pages/Metrics/index.ts
rename to frontend/src/pages/Metrics/index.ts
diff --git a/src/pages/Metrics/locales/en-US.ts b/frontend/src/pages/Metrics/locales/en-US.ts
similarity index 100%
rename from src/pages/Metrics/locales/en-US.ts
rename to frontend/src/pages/Metrics/locales/en-US.ts
diff --git a/src/pages/Metrics/locales/zh-CN.ts b/frontend/src/pages/Metrics/locales/zh-CN.ts
similarity index 100%
rename from src/pages/Metrics/locales/zh-CN.ts
rename to frontend/src/pages/Metrics/locales/zh-CN.ts
diff --git a/src/pages/Metrics/service.ts b/frontend/src/pages/Metrics/service.ts
similarity index 100%
rename from src/pages/Metrics/service.ts
rename to frontend/src/pages/Metrics/service.ts
diff --git a/src/pages/Route/Create.less b/frontend/src/pages/Route/Create.less
similarity index 100%
rename from src/pages/Route/Create.less
rename to frontend/src/pages/Route/Create.less
diff --git a/src/pages/Route/Create.tsx b/frontend/src/pages/Route/Create.tsx
similarity index 100%
rename from src/pages/Route/Create.tsx
rename to frontend/src/pages/Route/Create.tsx
diff --git a/src/pages/Route/List.tsx b/frontend/src/pages/Route/List.tsx
similarity index 100%
rename from src/pages/Route/List.tsx
rename to frontend/src/pages/Route/List.tsx
diff --git a/src/pages/Route/components/CreateStep4/CreateStep4.tsx b/frontend/src/pages/Route/components/CreateStep4/CreateStep4.tsx
similarity index 100%
rename from src/pages/Route/components/CreateStep4/CreateStep4.tsx
rename to frontend/src/pages/Route/components/CreateStep4/CreateStep4.tsx
diff --git a/src/pages/Route/components/CreateStep4/index.ts b/frontend/src/pages/Route/components/CreateStep4/index.ts
similarity index 100%
rename from src/pages/Route/components/CreateStep4/index.ts
rename to frontend/src/pages/Route/components/CreateStep4/index.ts
diff --git a/src/pages/Route/components/ResultView/ResultView.tsx b/frontend/src/pages/Route/components/ResultView/ResultView.tsx
similarity index 100%
rename from src/pages/Route/components/ResultView/ResultView.tsx
rename to frontend/src/pages/Route/components/ResultView/ResultView.tsx
diff --git a/src/pages/Route/components/ResultView/index.ts b/frontend/src/pages/Route/components/ResultView/index.ts
similarity index 100%
rename from src/pages/Route/components/ResultView/index.ts
rename to frontend/src/pages/Route/components/ResultView/index.ts
diff --git a/src/pages/Route/components/Step1/MatchingRulesView.tsx b/frontend/src/pages/Route/components/Step1/MatchingRulesView.tsx
similarity index 100%
rename from src/pages/Route/components/Step1/MatchingRulesView.tsx
rename to frontend/src/pages/Route/components/Step1/MatchingRulesView.tsx
diff --git a/src/pages/Route/components/Step1/MetaView.tsx b/frontend/src/pages/Route/components/Step1/MetaView.tsx
similarity index 100%
rename from src/pages/Route/components/Step1/MetaView.tsx
rename to frontend/src/pages/Route/components/Step1/MetaView.tsx
diff --git a/src/pages/Route/components/Step1/RequestConfigView.tsx b/frontend/src/pages/Route/components/Step1/RequestConfigView.tsx
similarity index 100%
rename from src/pages/Route/components/Step1/RequestConfigView.tsx
rename to frontend/src/pages/Route/components/Step1/RequestConfigView.tsx
diff --git a/src/pages/Route/components/Step1/index.tsx b/frontend/src/pages/Route/components/Step1/index.tsx
similarity index 100%
rename from src/pages/Route/components/Step1/index.tsx
rename to frontend/src/pages/Route/components/Step1/index.tsx
diff --git a/src/pages/Route/components/Step2/RequestRewriteView.tsx b/frontend/src/pages/Route/components/Step2/RequestRewriteView.tsx
similarity index 100%
rename from src/pages/Route/components/Step2/RequestRewriteView.tsx
rename to frontend/src/pages/Route/components/Step2/RequestRewriteView.tsx
diff --git a/src/pages/Route/components/Step2/index.tsx b/frontend/src/pages/Route/components/Step2/index.tsx
similarity index 100%
rename from src/pages/Route/components/Step2/index.tsx
rename to frontend/src/pages/Route/components/Step2/index.tsx
diff --git a/src/pages/Route/components/Step3/index.tsx b/frontend/src/pages/Route/components/Step3/index.tsx
similarity index 100%
rename from src/pages/Route/components/Step3/index.tsx
rename to frontend/src/pages/Route/components/Step3/index.tsx
diff --git a/src/pages/Route/constants.ts b/frontend/src/pages/Route/constants.ts
similarity index 100%
rename from src/pages/Route/constants.ts
rename to frontend/src/pages/Route/constants.ts
diff --git a/src/pages/Consumer/index.ts b/frontend/src/pages/Route/index.ts
similarity index 100%
rename from src/pages/Consumer/index.ts
rename to frontend/src/pages/Route/index.ts
diff --git a/src/pages/Route/locales/en-US.ts b/frontend/src/pages/Route/locales/en-US.ts
similarity index 100%
rename from src/pages/Route/locales/en-US.ts
rename to frontend/src/pages/Route/locales/en-US.ts
diff --git a/src/pages/Route/locales/zh-CN.ts b/frontend/src/pages/Route/locales/zh-CN.ts
similarity index 100%
rename from src/pages/Route/locales/zh-CN.ts
rename to frontend/src/pages/Route/locales/zh-CN.ts
diff --git a/src/pages/Route/service.ts b/frontend/src/pages/Route/service.ts
similarity index 100%
rename from src/pages/Route/service.ts
rename to frontend/src/pages/Route/service.ts
diff --git a/src/pages/Route/transform.ts b/frontend/src/pages/Route/transform.ts
similarity index 100%
rename from src/pages/Route/transform.ts
rename to frontend/src/pages/Route/transform.ts
diff --git a/src/pages/Route/typing.d.ts b/frontend/src/pages/Route/typing.d.ts
similarity index 100%
rename from src/pages/Route/typing.d.ts
rename to frontend/src/pages/Route/typing.d.ts
diff --git a/src/pages/SSL/Create.less b/frontend/src/pages/SSL/Create.less
similarity index 100%
rename from src/pages/SSL/Create.less
rename to frontend/src/pages/SSL/Create.less
diff --git a/src/pages/SSL/Create.tsx b/frontend/src/pages/SSL/Create.tsx
similarity index 100%
rename from src/pages/SSL/Create.tsx
rename to frontend/src/pages/SSL/Create.tsx
diff --git a/src/pages/SSL/List.tsx b/frontend/src/pages/SSL/List.tsx
similarity index 100%
rename from src/pages/SSL/List.tsx
rename to frontend/src/pages/SSL/List.tsx
diff --git a/src/pages/SSL/components/CertificateForm/index.tsx b/frontend/src/pages/SSL/components/CertificateForm/index.tsx
similarity index 100%
rename from src/pages/SSL/components/CertificateForm/index.tsx
rename to frontend/src/pages/SSL/components/CertificateForm/index.tsx
diff --git a/src/pages/SSL/components/CertificateUploader/index.tsx b/frontend/src/pages/SSL/components/CertificateUploader/index.tsx
similarity index 100%
rename from src/pages/SSL/components/CertificateUploader/index.tsx
rename to frontend/src/pages/SSL/components/CertificateUploader/index.tsx
diff --git a/src/pages/SSL/components/Step1/index.tsx b/frontend/src/pages/SSL/components/Step1/index.tsx
similarity index 100%
rename from src/pages/SSL/components/Step1/index.tsx
rename to frontend/src/pages/SSL/components/Step1/index.tsx
diff --git a/src/pages/SSL/components/Step2/index.tsx b/frontend/src/pages/SSL/components/Step2/index.tsx
similarity index 100%
rename from src/pages/SSL/components/Step2/index.tsx
rename to frontend/src/pages/SSL/components/Step2/index.tsx
diff --git a/src/pages/SSL/locales/en-US.ts b/frontend/src/pages/SSL/locales/en-US.ts
similarity index 100%
rename from src/pages/SSL/locales/en-US.ts
rename to frontend/src/pages/SSL/locales/en-US.ts
diff --git a/src/pages/SSL/locales/zh-CN.ts b/frontend/src/pages/SSL/locales/zh-CN.ts
similarity index 100%
rename from src/pages/SSL/locales/zh-CN.ts
rename to frontend/src/pages/SSL/locales/zh-CN.ts
diff --git a/src/pages/SSL/service.ts b/frontend/src/pages/SSL/service.ts
similarity index 100%
rename from src/pages/SSL/service.ts
rename to frontend/src/pages/SSL/service.ts
diff --git a/src/pages/SSL/style.less b/frontend/src/pages/SSL/style.less
similarity index 100%
rename from src/pages/SSL/style.less
rename to frontend/src/pages/SSL/style.less
diff --git a/src/pages/SSL/typing.d.ts b/frontend/src/pages/SSL/typing.d.ts
similarity index 100%
rename from src/pages/SSL/typing.d.ts
rename to frontend/src/pages/SSL/typing.d.ts
diff --git a/src/pages/Setting/Setting.tsx b/frontend/src/pages/Setting/Setting.tsx
similarity index 100%
rename from src/pages/Setting/Setting.tsx
rename to frontend/src/pages/Setting/Setting.tsx
diff --git a/src/pages/Setting/index.ts b/frontend/src/pages/Setting/index.ts
similarity index 100%
rename from src/pages/Setting/index.ts
rename to frontend/src/pages/Setting/index.ts
diff --git a/src/pages/Setting/locales/en-US.ts b/frontend/src/pages/Setting/locales/en-US.ts
similarity index 100%
rename from src/pages/Setting/locales/en-US.ts
rename to frontend/src/pages/Setting/locales/en-US.ts
diff --git a/src/pages/Setting/locales/zh-CN.ts b/frontend/src/pages/Setting/locales/zh-CN.ts
similarity index 100%
rename from src/pages/Setting/locales/zh-CN.ts
rename to frontend/src/pages/Setting/locales/zh-CN.ts
diff --git a/src/pages/Setting/service.ts b/frontend/src/pages/Setting/service.ts
similarity index 100%
rename from src/pages/Setting/service.ts
rename to frontend/src/pages/Setting/service.ts
diff --git a/src/pages/Setting/style.less b/frontend/src/pages/Setting/style.less
similarity index 100%
rename from src/pages/Setting/style.less
rename to frontend/src/pages/Setting/style.less
diff --git a/src/pages/Setting/typingd.d.ts b/frontend/src/pages/Setting/typingd.d.ts
similarity index 100%
rename from src/pages/Setting/typingd.d.ts
rename to frontend/src/pages/Setting/typingd.d.ts
diff --git a/src/pages/Upstream/Create.tsx b/frontend/src/pages/Upstream/Create.tsx
similarity index 100%
rename from src/pages/Upstream/Create.tsx
rename to frontend/src/pages/Upstream/Create.tsx
diff --git a/src/pages/Upstream/List.tsx b/frontend/src/pages/Upstream/List.tsx
similarity index 100%
rename from src/pages/Upstream/List.tsx
rename to frontend/src/pages/Upstream/List.tsx
diff --git a/src/pages/Upstream/components/Step1.tsx b/frontend/src/pages/Upstream/components/Step1.tsx
similarity index 100%
rename from src/pages/Upstream/components/Step1.tsx
rename to frontend/src/pages/Upstream/components/Step1.tsx
diff --git a/src/pages/Upstream/constants.ts b/frontend/src/pages/Upstream/constants.ts
similarity index 100%
rename from src/pages/Upstream/constants.ts
rename to frontend/src/pages/Upstream/constants.ts
diff --git a/src/pages/Upstream/index.ts b/frontend/src/pages/Upstream/index.ts
similarity index 100%
rename from src/pages/Upstream/index.ts
rename to frontend/src/pages/Upstream/index.ts
diff --git a/src/pages/Upstream/locales/en-US.ts b/frontend/src/pages/Upstream/locales/en-US.ts
similarity index 100%
rename from src/pages/Upstream/locales/en-US.ts
rename to frontend/src/pages/Upstream/locales/en-US.ts
diff --git a/src/pages/Upstream/locales/zh-CN.ts b/frontend/src/pages/Upstream/locales/zh-CN.ts
similarity index 100%
rename from src/pages/Upstream/locales/zh-CN.ts
rename to frontend/src/pages/Upstream/locales/zh-CN.ts
diff --git a/src/pages/Upstream/service.ts b/frontend/src/pages/Upstream/service.ts
similarity index 100%
rename from src/pages/Upstream/service.ts
rename to frontend/src/pages/Upstream/service.ts
diff --git a/src/pages/Upstream/transform.ts b/frontend/src/pages/Upstream/transform.ts
similarity index 100%
rename from src/pages/Upstream/transform.ts
rename to frontend/src/pages/Upstream/transform.ts
diff --git a/src/pages/Upstream/typing.d.ts b/frontend/src/pages/Upstream/typing.d.ts
similarity index 100%
rename from src/pages/Upstream/typing.d.ts
rename to frontend/src/pages/Upstream/typing.d.ts
diff --git a/src/pages/User/Login.less b/frontend/src/pages/User/Login.less
similarity index 100%
rename from src/pages/User/Login.less
rename to frontend/src/pages/User/Login.less
diff --git a/src/pages/User/Login.tsx b/frontend/src/pages/User/Login.tsx
similarity index 100%
rename from src/pages/User/Login.tsx
rename to frontend/src/pages/User/Login.tsx
diff --git a/src/pages/User/Logout.tsx b/frontend/src/pages/User/Logout.tsx
similarity index 100%
rename from src/pages/User/Logout.tsx
rename to frontend/src/pages/User/Logout.tsx
diff --git a/src/pages/User/components/LoginMethodExample.tsx b/frontend/src/pages/User/components/LoginMethodExample.tsx
similarity index 100%
rename from src/pages/User/components/LoginMethodExample.tsx
rename to frontend/src/pages/User/components/LoginMethodExample.tsx
diff --git a/src/pages/User/components/LoginMethodPassword.tsx b/frontend/src/pages/User/components/LoginMethodPassword.tsx
similarity index 100%
rename from src/pages/User/components/LoginMethodPassword.tsx
rename to frontend/src/pages/User/components/LoginMethodPassword.tsx
diff --git a/src/pages/User/index.ts b/frontend/src/pages/User/index.ts
similarity index 100%
rename from src/pages/User/index.ts
rename to frontend/src/pages/User/index.ts
diff --git a/src/pages/User/locales/en-US.ts b/frontend/src/pages/User/locales/en-US.ts
similarity index 100%
rename from src/pages/User/locales/en-US.ts
rename to frontend/src/pages/User/locales/en-US.ts
diff --git a/src/pages/User/locales/zh-CN.ts b/frontend/src/pages/User/locales/zh-CN.ts
similarity index 100%
rename from src/pages/User/locales/zh-CN.ts
rename to frontend/src/pages/User/locales/zh-CN.ts
diff --git a/src/pages/User/typing.d.ts b/frontend/src/pages/User/typing.d.ts
similarity index 100%
rename from src/pages/User/typing.d.ts
rename to frontend/src/pages/User/typing.d.ts
diff --git a/src/pages/document.ejs b/frontend/src/pages/document.ejs
similarity index 100%
rename from src/pages/document.ejs
rename to frontend/src/pages/document.ejs
diff --git a/src/service-worker.js b/frontend/src/service-worker.js
similarity index 100%
rename from src/service-worker.js
rename to frontend/src/service-worker.js
diff --git a/src/services/API.d.ts b/frontend/src/services/API.d.ts
similarity index 100%
rename from src/services/API.d.ts
rename to frontend/src/services/API.d.ts
diff --git a/src/services/user.ts b/frontend/src/services/user.ts
similarity index 100%
rename from src/services/user.ts
rename to frontend/src/services/user.ts
diff --git a/src/typings.d.ts b/frontend/src/typings.d.ts
similarity index 100%
rename from src/typings.d.ts
rename to frontend/src/typings.d.ts
diff --git a/tests/PuppeteerEnvironment.js b/frontend/tests/PuppeteerEnvironment.js
similarity index 100%
rename from tests/PuppeteerEnvironment.js
rename to frontend/tests/PuppeteerEnvironment.js
diff --git a/tests/beforeTest.js b/frontend/tests/beforeTest.js
similarity index 100%
rename from tests/beforeTest.js
rename to frontend/tests/beforeTest.js
diff --git a/tests/getBrowser.js b/frontend/tests/getBrowser.js
similarity index 100%
rename from tests/getBrowser.js
rename to frontend/tests/getBrowser.js
diff --git a/tests/run-tests.js b/frontend/tests/run-tests.js
similarity index 100%
rename from tests/run-tests.js
rename to frontend/tests/run-tests.js
diff --git a/tsconfig.json b/frontend/tsconfig.json
similarity index 100%
rename from tsconfig.json
rename to frontend/tsconfig.json
diff --git a/yarn.lock b/frontend/yarn.lock
similarity index 100%
rename from yarn.lock
rename to frontend/yarn.lock