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:23 UTC

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

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