From 25f1082a4fed7300947e9b0a8833a031462c095d Mon Sep 17 00:00:00 2001 From: juzhiyuan Date: Wed, 11 Nov 2020 16:13:11 +0800 Subject: [PATCH 01/27] feat(doc): update README & deploy --- README.zh-CN.md | 71 +++++++++-------------- api/conf/conf.yaml | 24 ++++---- docs/deploy.zh-CN.md | 106 +++++++++++------------------------ docs/images/architecture.png | Bin 0 -> 162681 bytes 4 files changed, 74 insertions(+), 127 deletions(-) create mode 100644 docs/images/architecture.png diff --git a/README.zh-CN.md b/README.zh-CN.md index 3b4e53a34d..64028554f8 100644 --- a/README.zh-CN.md +++ b/README.zh-CN.md @@ -21,60 +21,43 @@ # Apache APISIX Dashboard -Apache APISIX Dashboard 项目的目标是为了让大家快速上手体验和学习 Apache APISIX,并不能直接用于生产环境。 +Apache APISIX Dashboard 旨在通过界面,让用户尽可能更方便地操作 [Apache APISIX](https://github.com/apache/apisix)。 -它的功能永远都是 Apache APISIX 的子集,也可能会滞后于 Apache APISIX 的快速迭代。 +![architecture](./docs/images/architecture.png) -如果你需要把 Apache APISIX Dashboard 项目用于生产系统,需要对用户权限、通讯安全、高可用、高级功能等方面做增强。 +注意:目前 Dashboard 尚未完整覆盖 Apache APISIX 的功能,[访问此处](https://github.com/apache/apisix-dashboard/milestones)以查看里程碑。 -## 安装 +## 目录结构 -提供多种方式来安装 Apache APISIX Dashboard - -### Docker - -通过下面的方法来启动一个可运行的版本 - -- [使用 Docker 一键部署](./docs/deploy-with-docker.zh-CN.md) - -### 从源代码构建 - -从源代码构建,首先先确认你的 `golang` 版本在 1.13 或者 更高的版本。 - -同样你也需要提前安装好 `Node.js` 和 `yarn`。 - -```sh -$ git clone -b v2.0 https://github.com/apache/apisix-dashboard.git -$ cd apisix-dashboard -$ make build ``` - -然后你可以在 `./output` 目录下找到运行 Apache APISIX Dashboard 需要的所有文件(配置文件、可执行文件、web静态资源) - -通过下面的命令启动 - -```sh -$ cd ./output -$ exec ./manager-api +. +├── CHANGELOG.md +├── CHANGELOG.zh-CN.md +├── CODE_OF_CONDUCT.md +├── CONTRIBUTING.md +├── Dockerfile +├── LICENSE +├── Makefile +├── NOTICE +├── README.md +├── README.zh-CN.md +├── api +├── docs +├── licenses +└── web ``` -`makefile` 提供以下几种命令 +1. `api` 目录用于存放 `manager-api` 源码,它用于为前端界面提供接口。 +2. `web` 目录用于存放前端源码。 -```text -Makefile rules: +## 构建并启动 - help: Show Makefile rules - build: Build Apache APISIX Dashboard, it contains web and manager-api - api-test: Run the tests of manager-api - api-run: Run the manager-api - api-stop: stop manager-api - go-lint: Lint Go source code - license-check: Check Apache APISIX Dashboard Source Codes for Apache License -``` +支持以下构建部署方式: -更详细的构建步骤参见这里 - [从源代码构建](./docs/deploy.zh-CN.md) +- [源码构建并启动](./docs/deploy.zh-CN.md) +- [Docker](./docs/deploy-with-docker.zh-CN.md) -### 对于开发者 +## 开发 Apache APISIX Dashboard 为 [Apache APISIX](https://github.com/apache/apisix) 提供管理界面,需要先[安装 APISIX](https://github.com/apache/apisix#configure-and-installation). @@ -101,6 +84,6 @@ Apache License 2.0, [LICENSE](https://github.com/apache/apisix-dashboard/blob/ma ## FAQ -1. 如果你需要 Vue.js 构建的 Apache APISIX Dashboard 1.0,请使用 [master-vue 分支](https://github.com/apache/apisix-dashboard/tree/master-vue)。 +1. 如您需要 Vue.js 构建的 Apache APISIX Dashboard 1.0,请使用 [master-vue 分支](https://github.com/apache/apisix-dashboard/tree/master-vue)。 2. 2.0 版本的控制台移除了[1.5 版本](https://github.com/apache/apisix-dashboard/tree/backup-1.5-latest)中的 MySQL,将直接操作 etcd。 3. 如果你使用 v2.0 以下版本的 Apache APISIX,需要注意 etcd v2 API 的数据与 v3 API 的数据是[不互通的](https://etcd.io/docs/v3.4.0/op-guide/v2-migration/)。Apache APISIX Dashboard v2.0 及以上版本使用 etcd v3 API,apisix 1.5 及以下版本使用 etcd v2 API。 diff --git a/api/conf/conf.yaml b/api/conf/conf.yaml index 49bf28fdeb..2270e72866 100644 --- a/api/conf/conf.yaml +++ b/api/conf/conf.yaml @@ -17,23 +17,25 @@ conf: listen: - host: 127.0.0.1 # `manager api` listening ip or host name - port: 8080 # `manager api` listening port + host: 127.0.0.1 # `manager api` listening ip or host name + port: 8080 # `manager api` listening port etcd: - endpoints: # supports defining multiple etcd host addresses for an etcd cluster + endpoints: # supports defining multiple etcd host addresses for an etcd cluster - 127.0.0.1:2379 log: error_log: - level: warn # supports levels, lower to higher: debug, info, warn, error, panic, fatal - file_path: logs/error.log # supports relative path, absolute path, standard output - # such as: logs/error.log, /tmp/logs/error.log, /dev/stdout, /dev/stderr + level: warn # supports levels, lower to higher: debug, info, warn, error, panic, fatal + file_path: + logs/error.log # supports relative path, absolute path, standard output + # such as: logs/error.log, /tmp/logs/error.log, /dev/stdout, /dev/stderr authentication: - secret: secret # secret for jwt token generation. - # *NOTE*: Highly recommended to modify this value to protect `manager api`. - # if it's default value, when `manager api` start , it will generate a random string to replace it. - expire_time: 3600 # jwt token expire time, in second + secret: + secret # secret for jwt token generation. + # NOTE: Highly recommended to modify this value to protect `manager api`. + # if it's default value, when `manager api` start , it will generate a random string to replace it. + expire_time: 3600 # jwt token expire time, in second users: - - username: admin # username and password for login `manager api` + - username: admin # username and password for login `manager api` password: admin - username: user password: user diff --git a/docs/deploy.zh-CN.md b/docs/deploy.zh-CN.md index e0a8ccefb9..e9825732f9 100644 --- a/docs/deploy.zh-CN.md +++ b/docs/deploy.zh-CN.md @@ -17,118 +17,80 @@ # --> -# 从源文件打包部署 +# 源码构建并启动 -## 克隆项目 - -```sh -$ git clone -b v2.0 https://github.com/apache/apisix-dashboard.git - -$ cd apisix-dashboard -``` +Dashboard 包含了 `manager-api` 与 `web` 两部分,其中 `web` 是*可选*的。 ## 构建 -### Manager-api 检查项 - -`manager-api` 用于为控制台提供接口,就像 Apache APISIX 和控制台之间的桥梁。下面是手动构建步骤: - -1. 需要预先安装 `Go` 1.13+ +### 环境准备 -注意:如果使用插件编排,需要同时预先安装 `Lua` 5.1+ ,后续版本会对此进行优化,取消对 `Lua` 的依赖。 +在构建之前,请确认您的环境中,已安装如下依赖: -2. 检查环境变量 +#### manager-api -- 对于大多数中国用户,我们可以使用 [Goproxy](https://goproxy.cn/) 加快模块下载速度。 +1. [Golang](https://golang.org/dl/) 1.13+:对于中国大陆的用户,可使用如下命令加快模块下载速度。 ```sh $ go env -w GOPROXY=https://goproxy.cn,direct ``` -### 前端 检查项 +2. [Lua](https://www.lua.org/download.html) 5.1+:仅在使用**插件编排**功能时,需要安装本依赖。在后续版本中,会对该部分进行优化以取消对其依赖。 -该项目使用 [Ant Design Pro](https://pro.ant.design) 初始化。以下是一些使用方法的快速指南。 +#### web -1. 确保你的设备已经安装了 `Node.js(版本 10.0.0+)`。 +> 若无前端控制台需求,可忽略下方依赖。 -2. 安装 [yarn](https://yarnpkg.com/)。 +1. [Node.js](https://nodejs.org/en/download/) 10.23.0+ +2. [Yarn](https://yarnpkg.com/getting-started/install) -### 开始构建 +### 克隆项目 + +```sh +$ git clone -b v2.0 https://github.com/apache/apisix-dashboard.git +``` +### 开始构建 ```sh +$ cd apisix-dashboard $ make build ``` -构建完成后的文件在根目录 `output` 下。 +构建完成后,构建结果将存放在根目录下 `output` 目录中。 + +注意:`make build` 将会构建 `manger-api` 与 `web`,使用 `make help` 命令以查看更多指令。 ## 启动 -1. 根据您的部署环境,检查并修改 `output/conf/conf.yaml` 中的配置。 - -例如: - -```yaml -conf: - listen: - host: 127.0.0.1 - port: 8080 - etcd: - endpoints: - - 127.0.0.1:2379 -authentication: - secret: secret - expire_time: 3600 - users: - - username: admin - password: admin - - username: user - password: user -``` +1. 根据您的部署环境,检查并修改 `output/conf/conf.yaml` 中的配置信息。 -2. 启动 Apache APISIX Dashboard +2. 启动 Dashboard ```sh $ cd ./output + $ ./manager-api +# 或后台常驻 +$ ./manager-api & ``` -3. 在浏览器中访问 `http://127.0.0.1:8080`,`8080` 是 manager-api 的默认监听端口。 - -4. 关闭 Apache APISIX Dashboard - -```sh -$ kill $(ps aux | grep 'manager-api' | awk '{print $2}') -``` +启动成功后,控制台将输出启动成功信息。 -## 打包 output 目录 +3. 在未修改配置的情况下,访问 `http://127.0.0.1:8080` 以使用有前端界面的控制台,默认用户密码均为 `admin`。 -你可以把刚刚 output 目录整体打包,copy 到其他地方解压运行,output 目录包含运行 Apache APISIX Dashboard 需要的所有文件(配置文件、可执行文件、web静态资源) +4. 停止 Dashboard ```sh -$ make release-src +$ kill $(ps aux | grep 'manager-api' | awk '{print $2}') ``` -## 配置参数 - -1. `conf.dag-lib-path` 参数需要使用绝对路径,可通过 `pwd` 指令获取。仅在使用插件编排功能时需要指定。 +## 其它 -2. `conf.listen.host` 默认为 `127.0.0.1`,这意味着只能在本地网络中访问,如需允许外部网络访问,请修改为 `0.0.0.0`,无需重新编译代码。 +### 打包构建结果 -3. `conf.etcd.endpoints` 用于配置 ETCD 实例,支持集群模式。 - -```yaml -conf: - etcd: - endpoints: - - 127.0.0.1:2379 - - 127.0.0.1:3379 -``` - -## 注意 - -1. 在编译 Manager API 后,如移动编译后产物到其它位置,启动时将会报错,这是由于配置文件**绝对路径**被固定在了产物中,需要在运行前,通过执行环境变量设置配置文件位置来解决。 +如有需要,在构建完成后使用如下命令,将会对 `output` 目录进行打包操作,以便您将构建结果移动到其它位置。 ```sh -$ export APISIX_CONF_PATH=/home/demo_user/workspace/apisix-dashboard/api/conf +$ make release-src ``` diff --git a/docs/images/architecture.png b/docs/images/architecture.png new file mode 100644 index 0000000000000000000000000000000000000000..2fee176db673b5f79fa5980ae66a104ebc2a7e0c GIT binary patch literal 162681 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ú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 literal 0 HcmV?d00001 From bedfbc56aad83c7a7b0294b1dba601daca11ca8a Mon Sep 17 00:00:00 2001 From: juzhiyuan Date: Wed, 11 Nov 2020 16:46:13 +0800 Subject: [PATCH 02/27] feat(docs): added FAQ --- README.zh-CN.md | 29 +++++---------- docs/FAQ.md | 22 +++++++++++ docs/FAQ.zh-CN.md | 56 ++++++++++++++++++++++++++++ docs/develop.zh-CN.md | 85 ++++++++++--------------------------------- 4 files changed, 106 insertions(+), 86 deletions(-) create mode 100644 docs/FAQ.md create mode 100644 docs/FAQ.zh-CN.md diff --git a/README.zh-CN.md b/README.zh-CN.md index 64028554f8..30aedfaeb4 100644 --- a/README.zh-CN.md +++ b/README.zh-CN.md @@ -52,38 +52,27 @@ Apache APISIX Dashboard 旨在通过界面,让用户尽可能更方便地操 ## 构建并启动 -支持以下构建部署方式: +支持以下方式: -- [源码构建并启动](./docs/deploy.zh-CN.md) +- [源码](./docs/deploy.zh-CN.md) - [Docker](./docs/deploy-with-docker.zh-CN.md) -## 开发 +## 本地开发 -Apache APISIX Dashboard 为 [Apache APISIX](https://github.com/apache/apisix) 提供管理界面,需要先[安装 APISIX](https://github.com/apache/apisix#configure-and-installation). - -然后请参考这里分别启动 `manager-api` 和 `web` - -- [开发 Apache APISIX Dashboard](./docs/develop.zh-CN.md) +请参考[开发指南](./docs/develop.zh-CN.md) ## 使用指南 -请参考 [用户指南](./docs/USER_GUIDE.zh-CN.md) - -## 里程碑 - -- [2.0](https://github.com/apache/apisix-dashboard/milestone/4) -- [2.1](https://github.com/apache/apisix-dashboard/milestone/5) +请参考[用户指南](./docs/USER_GUIDE.zh-CN.md) ## 贡献 请参考[贡献指南](./CONTRIBUTING.md)以获取更详细的流程。 -## License +## FAQ -Apache License 2.0, [LICENSE](https://github.com/apache/apisix-dashboard/blob/master/LICENSE) +请参考 [FAQ 汇总](./docs/FAQ.md)以查看更多已知问题。 -## FAQ +## License -1. 如您需要 Vue.js 构建的 Apache APISIX Dashboard 1.0,请使用 [master-vue 分支](https://github.com/apache/apisix-dashboard/tree/master-vue)。 -2. 2.0 版本的控制台移除了[1.5 版本](https://github.com/apache/apisix-dashboard/tree/backup-1.5-latest)中的 MySQL,将直接操作 etcd。 -3. 如果你使用 v2.0 以下版本的 Apache APISIX,需要注意 etcd v2 API 的数据与 v3 API 的数据是[不互通的](https://etcd.io/docs/v3.4.0/op-guide/v2-migration/)。Apache APISIX Dashboard v2.0 及以上版本使用 etcd v3 API,apisix 1.5 及以下版本使用 etcd v2 API。 +Apache License 2.0, [LICENSE](https://github.com/apache/apisix-dashboard/blob/master/LICENSE) \ No newline at end of file diff --git a/docs/FAQ.md b/docs/FAQ.md new file mode 100644 index 0000000000..7cd55f6bbb --- /dev/null +++ b/docs/FAQ.md @@ -0,0 +1,22 @@ + + +# FAQ + +TODO diff --git a/docs/FAQ.zh-CN.md b/docs/FAQ.zh-CN.md new file mode 100644 index 0000000000..2e481ddd33 --- /dev/null +++ b/docs/FAQ.zh-CN.md @@ -0,0 +1,56 @@ + + +# FAQ + +### Vue.js 版本的 Dashboard + +若您需要 Vue.js 构建的 Apache APISIX Dashboard 1.0,请使用 [master-vue 分支](https://github.com/apache/apisix-dashboard/tree/master-vue)。 + +### Dashboard 2.0 版本与 1.5 版本有什么差异? + +2.0 版本的控制台移除了[1.5 版本](https://github.com/apache/apisix-dashboard/tree/backup-1.5-latest)中的 MySQL,将直接操作 etcd。 + +### ETCD 兼容性问题 + +若您使用 v2.0 以下版本的 Apache APISIX,需要注意 etcd v2 API 的数据与 v3 API 的数据是[不互通的](https://etcd.io/docs/v3.4.0/op-guide/v2-migration/)。Apache APISIX Dashboard v2.0 及以上版本使用 etcd v3 API,apisix 1.5 及以下版本使用 etcd v2 API。 + +### 在 Apache APISIX 中修改插件 schema 或创建自定义插件后,为什么在控制台找不到? + +由于 Dashboard 缓存了 Apache APISIX 中插件的 jsonschema 数据,因此您在 Apache APISIX 中创建自定义插件后,需要同步 Dashboard 中的数据,当前**仅支持手动操作**,该问题会在后续版本得到优化。如下为操作步骤: + +1. 安装 `Lua` 与 `zip`。 + +2. 执行如下命令: + +```sh +# `$version` 为 `master` 或者 Apache APISIX 的版本号,如 2.0。 +$ api/build-tools/schema-sync.sh $version +``` + +若您有自定义插件,请确保该插件在 `apisix` 目录中,并使用如下命令: + +```sh +$ api/build-tools/schema-sync.sh /path/to/apisix + +# 示例: +$ api/build-tools/schema-sync.sh /usr/local/apisix +``` + +脚本执行完后,若您不是通过 `make api-run` 运行的,需要将 `api/conf/schema.json` 拷贝到 Apache APISIX Dashboard 的工作目录的 `conf` 目录下。 \ No newline at end of file diff --git a/docs/develop.zh-CN.md b/docs/develop.zh-CN.md index 3765fe7082..e69f87201f 100644 --- a/docs/develop.zh-CN.md +++ b/docs/develop.zh-CN.md @@ -17,99 +17,52 @@ # --> -# Apache APISIX Dashboard 开发 +# 开发指南 -## 前置条件 +Dashboard 包含了 `manager-api` 与 `web` 两部分,因此需要分别启动开发环境。 -```sh -$ git clone -b v2.0 https://github.com/apache/apisix-dashboard.git -$ cd apisix-dashboard -``` - -## 前端开发 +## 环境准备 -1. 确保你的设备已经安装了 `Node.js(version version 10.0.0+)`。 +在开发前,请参考该[指南](./deploy.zh-CN.md#环境准备)以安装依赖。 -2. 安装 [yarn](https://yarnpkg.com/)。 - -3. 安装依赖: +## 克隆项目 ```sh -$ yarn install -``` - -4. 若需要修改 manager-api 地址,请访问 `config/proxy.ts` 文件。 - -5. 启动 (开发模式) - -```sh -$ yarn start +$ git clone -b v2.0 https://github.com/apache/apisix-dashboard.git ``` -### 编写 E2E 测试案例 +## 开始开发 -请参考 [E2E 文档](../web/src/e2e/README.zh-CN.md)。 +### manager-api -## 开发 manager-api +1. 请在 `api/conf/conf.yaml` 中修改配置信息。 -### 启动 - -1. 修改配置文件 目录: `api/conf/conf.yaml` - -```yaml -conf: - listen: - host: 127.0.0.1 - port: 8080 - etcd: - endpoints: - - 127.0.0.1:2379 -authentication: - secret: secret - expire_time: 3600 - users: - - username: admin - password: admin - - username: user - password: user -``` - -2. 启动 (开发模式) +2. 启动开发模式 ```sh $ make api-run ``` -3. 关闭 (开发模式) +3. 关闭开发模式 ```sh $ make api-stop ``` -### 同步 jsonschema - -从 Apache APISIX 同步 jsonschema ,需要预安装 `Lua` 5.1+ 和 `zip` ,并执行命令 +4. 关于增加自定义插件或修改插件 schema 后在控制台显示异常的问题,请查阅 [FAQ 汇总](./FAQ.zh-CN.md)。 -```sh -$ api/build-tools/schema-sync.sh $version -``` +### web -注意:`$version` 为 `master` 或者 Apache APISIX 的版本号。 +1. 请在 `config/proxy.ts` 文件中修改 `manager-api` 地址。 -示例: +2. 启动开发模式 ```sh -# 使用 "master" -$ api/build-tools/schema-sync.sh master - -# 使用 Apache APISIX 的版本号 -$ api/build-tools/schema-sync.sh 2.0 -``` +$ cd /web -如果您有自定义插件,请确保您的自定义插件放在 APISIX 目录中,并将执行脚本的参数改为 APISIX 目录路径, 如: +$ yarn install -```sh -$ api/build-tools/schema-sync.sh /usr/local/apisix +$ yarn start ``` -脚本执行完后,如果您不是通过 `make api-run` 运行的,需要将 `api/conf/schema.json` 拷贝到 Apache APISIX Dashboard 的工作目录的 `conf` 目录下。 +3. 如编写 E2E 测试,请参考 [E2E 编写指南](../web/src/e2e/README.zh-CN.md) From da2c257fd58b7f1f538b834da0d9a431d5c59c46 Mon Sep 17 00:00:00 2001 From: juzhiyuan Date: Wed, 11 Nov 2020 16:51:38 +0800 Subject: [PATCH 03/27] fix: linkx --- README.zh-CN.md | 4 ++-- docs/FAQ.zh-CN.md | 10 +++++----- docs/develop.zh-CN.md | 2 +- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/README.zh-CN.md b/README.zh-CN.md index 30aedfaeb4..37cdbc1e7f 100644 --- a/README.zh-CN.md +++ b/README.zh-CN.md @@ -67,11 +67,11 @@ Apache APISIX Dashboard 旨在通过界面,让用户尽可能更方便地操 ## 贡献 -请参考[贡献指南](./CONTRIBUTING.md)以获取更详细的流程。 +请参考[贡献指南](./CONTRIBUTING.md)以获取更详细的流程 ## FAQ -请参考 [FAQ 汇总](./docs/FAQ.md)以查看更多已知问题。 +请参考 [FAQ 汇总](./docs/FAQ.zh-CN.md)以查看更多已知问题 ## License diff --git a/docs/FAQ.zh-CN.md b/docs/FAQ.zh-CN.md index 2e481ddd33..8ce83ec520 100644 --- a/docs/FAQ.zh-CN.md +++ b/docs/FAQ.zh-CN.md @@ -19,23 +19,23 @@ # FAQ -### Vue.js 版本的 Dashboard +### 1. Vue.js 版本的 Dashboard 若您需要 Vue.js 构建的 Apache APISIX Dashboard 1.0,请使用 [master-vue 分支](https://github.com/apache/apisix-dashboard/tree/master-vue)。 -### Dashboard 2.0 版本与 1.5 版本有什么差异? +### 2. Dashboard 2.0 版本与 1.5 版本有什么差异? 2.0 版本的控制台移除了[1.5 版本](https://github.com/apache/apisix-dashboard/tree/backup-1.5-latest)中的 MySQL,将直接操作 etcd。 -### ETCD 兼容性问题 +### 3. etcd 兼容性问题 若您使用 v2.0 以下版本的 Apache APISIX,需要注意 etcd v2 API 的数据与 v3 API 的数据是[不互通的](https://etcd.io/docs/v3.4.0/op-guide/v2-migration/)。Apache APISIX Dashboard v2.0 及以上版本使用 etcd v3 API,apisix 1.5 及以下版本使用 etcd v2 API。 -### 在 Apache APISIX 中修改插件 schema 或创建自定义插件后,为什么在控制台找不到? +### 4. 在 Apache APISIX 中修改插件 schema 或创建自定义插件后,为什么在控制台找不到? 由于 Dashboard 缓存了 Apache APISIX 中插件的 jsonschema 数据,因此您在 Apache APISIX 中创建自定义插件后,需要同步 Dashboard 中的数据,当前**仅支持手动操作**,该问题会在后续版本得到优化。如下为操作步骤: -1. 安装 `Lua` 与 `zip`。 +1. 安装 [Lua](https://www.lua.org/download.html) 与 `zip`。 2. 执行如下命令: diff --git a/docs/develop.zh-CN.md b/docs/develop.zh-CN.md index e69f87201f..5188ad10e2 100644 --- a/docs/develop.zh-CN.md +++ b/docs/develop.zh-CN.md @@ -49,7 +49,7 @@ $ make api-run $ make api-stop ``` -4. 关于增加自定义插件或修改插件 schema 后在控制台显示异常的问题,请查阅 [FAQ 汇总](./FAQ.zh-CN.md)。 +4. 关于增加自定义插件或修改插件 schema 后在控制台显示异常的问题,请查阅 [FAQ 汇总](./FAQ.zh-CN.md)关于该问题的描述。 ### web From 81ce834646897899b881bb61a0e3993c89125fc7 Mon Sep 17 00:00:00 2001 From: juzhiyuan Date: Wed, 11 Nov 2020 17:01:44 +0800 Subject: [PATCH 04/27] feat(docs): update deploy with docker --- docs/deploy-with-docker.zh-CN.md | 33 +++++++++++------------ docs/deploy.zh-CN.md | 4 +-- docs/examples/docker-conf-example.yaml | 36 -------------------------- 3 files changed, 19 insertions(+), 54 deletions(-) delete mode 100644 docs/examples/docker-conf-example.yaml diff --git a/docs/deploy-with-docker.zh-CN.md b/docs/deploy-with-docker.zh-CN.md index 98baf681ba..4ae5728c26 100644 --- a/docs/deploy-with-docker.zh-CN.md +++ b/docs/deploy-with-docker.zh-CN.md @@ -22,39 +22,40 @@ 1. 构建镜像 ```sh -# 注意:需手动指定 $tag -$ docker build -t apisix-dashboard:{$tag} . +# 在根目录下执行构建命令,请手动指定 tag。 +$ docker build -t apisix-dashboard:$tag . ``` 2. 准备配置文件 -在启动容器前,需要在**宿主主机**内准备配置文件 `conf.yaml`,以便覆盖容器内部默认的配置文件。请参考[示例配置文件](./examples/docker-conf-example.yaml)。 +在启动容器前,需要在**宿主主机**内准备配置文件 `conf.yaml`,以便覆盖容器内部默认的配置文件。 -示例配置说明: - -- `conf.listen.host` 为容器内监听 IP,必须为 `0.0.0.0`,这样宿主才能访问容器内网络。 -- `conf.listen.port` 为容器内监听端口,默认为 `8080`。如需修改,请同步修改 [Dockerfile](../Dockerfile)。 -- `conf.etcd.endpoints` 为 ETCD 主机列表,支持多个节点,请确保容器可以访问到这些主机,例如:示例配置中 `conf.etcd.endpoints` 为 `host.docker.internal` 旨在允许容器访问宿主主机上的网络。 +请参考[配置文件](./api/conf/conf.yaml)。 3. 启动容器 ```sh -$ docker run -d -p 80:8080 -v /path/to/conf.yaml:/usr/local/apisix-dashboard/conf/conf.yaml --name apisix-dashboard apisix-dashboard:{$tag} +$ docker run -d -p 80:8080 -v /path/to/conf.yaml:/usr/local/apisix-dashboard/conf/conf.yaml --name apisix-dashboard apisix-dashboard:$tag +``` + +4. 检查容器是否启动成功 + +```sh +$ docker ps -a ``` -现在你可以在浏览器中通过 `http://127.0.0.1` 使用 Dashboard。 +若容器 `apisix-dashboard` 状态正常,访问 `http://127.0.0.1:8080` 以使用有前端界面的控制台,默认用户密码均为 `admin`。 -## 注意 +## 其它 -1. 构建镜像后,如需修改配置文件,可通过使用 `docker -v /local-path-to-conf-file:/conf/conf.yaml` 参数指定 `manager-api` 所需要的配置文件,以便启动容器时动态加载配置文件。 -2. 中国用户可使用 `ENABLE_PROXY` 指令以加速所需依赖的下载。 +1. 对于中国大陆的用户,可启用 `ENABLE_PROXY` 参数加快模块下载速度。 ```sh -$ docker build -t apisix-dashboard:{$tag} . --build-arg ENABLE_PROXY=true +$ docker build -t apisix-dashboard:$tag . --build-arg ENABLE_PROXY=true ``` -3. 如果不是第一次构建,建议不要使用缓存。 +2. 如果不是第一次构建,建议不要使用缓存。 ```sh -$ docker build -t apisix-dashboard:{$tag} . --build-arg ENABLE_PROXY=true --no-cache=true +$ docker build -t apisix-dashboard:$tag . --build-arg ENABLE_PROXY=true --no-cache=true ``` diff --git a/docs/deploy.zh-CN.md b/docs/deploy.zh-CN.md index e9825732f9..9b3416ee89 100644 --- a/docs/deploy.zh-CN.md +++ b/docs/deploy.zh-CN.md @@ -23,6 +23,8 @@ Dashboard 包含了 `manager-api` 与 `web` 两部分,其中 `web` 是*可选* ## 构建 +本构建指南将包含 `web` 控制台。 + ### 环境准备 在构建之前,请确认您的环境中,已安装如下依赖: @@ -39,8 +41,6 @@ $ go env -w GOPROXY=https://goproxy.cn,direct #### web -> 若无前端控制台需求,可忽略下方依赖。 - 1. [Node.js](https://nodejs.org/en/download/) 10.23.0+ 2. [Yarn](https://yarnpkg.com/getting-started/install) diff --git a/docs/examples/docker-conf-example.yaml b/docs/examples/docker-conf-example.yaml deleted file mode 100644 index 47c801628e..0000000000 --- a/docs/examples/docker-conf-example.yaml +++ /dev/null @@ -1,36 +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. -# - -conf: - listen: - host: 0.0.0.0 - port: 8080 - etcd: - endpoints: - - 127.0.0.1:2379 -authentication: - secret: secret - expire_time: 3600 - users: - - username: admin - password: admin - - username: user - password: user From 63424f7f7018c5754b98129d6a908b18cb0d41e4 Mon Sep 17 00:00:00 2001 From: juzhiyuan Date: Wed, 11 Nov 2020 17:07:39 +0800 Subject: [PATCH 05/27] feat(docs): update FAQ --- docs/FAQ.zh-CN.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/FAQ.zh-CN.md b/docs/FAQ.zh-CN.md index 8ce83ec520..7e9a47df1e 100644 --- a/docs/FAQ.zh-CN.md +++ b/docs/FAQ.zh-CN.md @@ -53,4 +53,4 @@ $ api/build-tools/schema-sync.sh /path/to/apisix $ api/build-tools/schema-sync.sh /usr/local/apisix ``` -脚本执行完后,若您不是通过 `make api-run` 运行的,需要将 `api/conf/schema.json` 拷贝到 Apache APISIX Dashboard 的工作目录的 `conf` 目录下。 \ No newline at end of file +命令执行完成后,若您使用的是已经完成构建的二进制 `manager-api`,那么需要手动将 `api/conf/schema.json` 拷贝到 Dashboard **工作目录**下的 `conf` 目录中。其中,**工作目录**是指根据该[文档](./deploy.zh-CN.md)构建完成后,在根目录下生成的 `output` 目录或修改名称后的目录。 From fc051cd92338a15346219afbb72c044a594bd6d8 Mon Sep 17 00:00:00 2001 From: juzhiyuan Date: Wed, 11 Nov 2020 17:09:57 +0800 Subject: [PATCH 06/27] feat: update README --- README.zh-CN.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/README.zh-CN.md b/README.zh-CN.md index 37cdbc1e7f..d63d8f2b6f 100644 --- a/README.zh-CN.md +++ b/README.zh-CN.md @@ -21,7 +21,7 @@ # Apache APISIX Dashboard -Apache APISIX Dashboard 旨在通过界面,让用户尽可能更方便地操作 [Apache APISIX](https://github.com/apache/apisix)。 +Apache APISIX Dashboard 旨在通过前端界面,让用户尽可能更方便地操作 [Apache APISIX](https://github.com/apache/apisix)。 ![architecture](./docs/images/architecture.png) @@ -47,7 +47,7 @@ Apache APISIX Dashboard 旨在通过界面,让用户尽可能更方便地操 └── web ``` -1. `api` 目录用于存放 `manager-api` 源码,它用于为前端界面提供接口。 +1. `api` 目录用于存放 `manager-api` 源码,它用于管理 `etcd` 并为前端界面提供接口。 2. `web` 目录用于存放前端源码。 ## 构建并启动 @@ -65,7 +65,7 @@ Apache APISIX Dashboard 旨在通过界面,让用户尽可能更方便地操 请参考[用户指南](./docs/USER_GUIDE.zh-CN.md) -## 贡献 +## 参与贡献 请参考[贡献指南](./CONTRIBUTING.md)以获取更详细的流程 @@ -75,4 +75,4 @@ Apache APISIX Dashboard 旨在通过界面,让用户尽可能更方便地操 ## License -Apache License 2.0, [LICENSE](https://github.com/apache/apisix-dashboard/blob/master/LICENSE) \ No newline at end of file +Apache License 2.0, [LICENSE](https://github.com/apache/apisix-dashboard/blob/master/LICENSE) From 4d8eade0c52f5175b6f2dd64145051f15f05ed27 Mon Sep 17 00:00:00 2001 From: juzhiyuan Date: Wed, 11 Nov 2020 17:16:42 +0800 Subject: [PATCH 07/27] feat: update README --- README.zh-CN.md | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/README.zh-CN.md b/README.zh-CN.md index d63d8f2b6f..a004be3c27 100644 --- a/README.zh-CN.md +++ b/README.zh-CN.md @@ -21,12 +21,18 @@ # Apache APISIX Dashboard +## 介绍 + Apache APISIX Dashboard 旨在通过前端界面,让用户尽可能更方便地操作 [Apache APISIX](https://github.com/apache/apisix)。 -![architecture](./docs/images/architecture.png) +Dashboard 为控制平面,完成所有参数的校验;Apache APISIX 混合了数据平面与控制平面,会逐渐演进为纯粹的数据平面。 + +本项目包含了 `manager-api` 与前端界面,前者将逐渐替代 Apache APISIX 中的 `admin-api`,我们正在积极地迁移相关逻辑。 注意:目前 Dashboard 尚未完整覆盖 Apache APISIX 的功能,[访问此处](https://github.com/apache/apisix-dashboard/milestones)以查看里程碑。 +![architecture](./docs/images/architecture.png) + ## 目录结构 ``` From de3c20435ae831ca4acb24c80645cbd32ea55eb0 Mon Sep 17 00:00:00 2001 From: juzhiyuan Date: Wed, 11 Nov 2020 17:19:48 +0800 Subject: [PATCH 08/27] feta: update README --- README.zh-CN.md | 2 +- docs/deploy-with-docker.zh-CN.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/README.zh-CN.md b/README.zh-CN.md index a004be3c27..1d08b84d3a 100644 --- a/README.zh-CN.md +++ b/README.zh-CN.md @@ -81,4 +81,4 @@ Dashboard 为控制平面,完成所有参数的校验;Apache APISIX 混合 ## License -Apache License 2.0, [LICENSE](https://github.com/apache/apisix-dashboard/blob/master/LICENSE) +[Apache License 2.0](./LICENSE) diff --git a/docs/deploy-with-docker.zh-CN.md b/docs/deploy-with-docker.zh-CN.md index 4ae5728c26..28046f63aa 100644 --- a/docs/deploy-with-docker.zh-CN.md +++ b/docs/deploy-with-docker.zh-CN.md @@ -54,7 +54,7 @@ $ docker ps -a $ docker build -t apisix-dashboard:$tag . --build-arg ENABLE_PROXY=true ``` -2. 如果不是第一次构建,建议不要使用缓存。 +2. 如果多次构建,建议不使用缓存。 ```sh $ docker build -t apisix-dashboard:$tag . --build-arg ENABLE_PROXY=true --no-cache=true From bcfab4843479e03019ee1ee786851f6f79fd3b64 Mon Sep 17 00:00:00 2001 From: juzhiyuan Date: Wed, 11 Nov 2020 17:23:20 +0800 Subject: [PATCH 09/27] fix: link --- docs/deploy-with-docker.zh-CN.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/deploy-with-docker.zh-CN.md b/docs/deploy-with-docker.zh-CN.md index 28046f63aa..46d689e38c 100644 --- a/docs/deploy-with-docker.zh-CN.md +++ b/docs/deploy-with-docker.zh-CN.md @@ -30,7 +30,7 @@ $ docker build -t apisix-dashboard:$tag . 在启动容器前,需要在**宿主主机**内准备配置文件 `conf.yaml`,以便覆盖容器内部默认的配置文件。 -请参考[配置文件](./api/conf/conf.yaml)。 +请参考[配置文件](../api/conf/conf.yaml)。 3. 启动容器 From ba921e8e1d3cc6672184dc70eb2308b0fc820717 Mon Sep 17 00:00:00 2001 From: juzhiyuan Date: Wed, 11 Nov 2020 17:25:01 +0800 Subject: [PATCH 10/27] feat: update deploy with docker --- docs/deploy-with-docker.zh-CN.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/deploy-with-docker.zh-CN.md b/docs/deploy-with-docker.zh-CN.md index 46d689e38c..cd830cbbe7 100644 --- a/docs/deploy-with-docker.zh-CN.md +++ b/docs/deploy-with-docker.zh-CN.md @@ -54,7 +54,7 @@ $ docker ps -a $ docker build -t apisix-dashboard:$tag . --build-arg ENABLE_PROXY=true ``` -2. 如果多次构建,建议不使用缓存。 +2. 多次构建镜像时,不建议使用缓存。 ```sh $ docker build -t apisix-dashboard:$tag . --build-arg ENABLE_PROXY=true --no-cache=true From beb0a673bc828b1b7f3861a19c5c1948b494b4a0 Mon Sep 17 00:00:00 2001 From: juzhiyuan Date: Wed, 11 Nov 2020 18:58:37 +0800 Subject: [PATCH 11/27] feat(docs): added tip for some users --- docs/deploy-with-docker.zh-CN.md | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/docs/deploy-with-docker.zh-CN.md b/docs/deploy-with-docker.zh-CN.md index cd830cbbe7..62297a09d3 100644 --- a/docs/deploy-with-docker.zh-CN.md +++ b/docs/deploy-with-docker.zh-CN.md @@ -24,6 +24,9 @@ ```sh # 在根目录下执行构建命令,请手动指定 tag。 $ docker build -t apisix-dashboard:$tag . + +# 对于中国大陆的用户,可启用 `ENABLE_PROXY` 参数加快模块下载速度。 +$ docker build -t apisix-dashboard:$tag . --build-arg ENABLE_PROXY=true ``` 2. 准备配置文件 @@ -35,6 +38,7 @@ $ docker build -t apisix-dashboard:$tag . 3. 启动容器 ```sh +# /path/to/conf.yaml 需指向上述提到的配置文件 $ docker run -d -p 80:8080 -v /path/to/conf.yaml:/usr/local/apisix-dashboard/conf/conf.yaml --name apisix-dashboard apisix-dashboard:$tag ``` @@ -48,13 +52,7 @@ $ docker ps -a ## 其它 -1. 对于中国大陆的用户,可启用 `ENABLE_PROXY` 参数加快模块下载速度。 - -```sh -$ docker build -t apisix-dashboard:$tag . --build-arg ENABLE_PROXY=true -``` - -2. 多次构建镜像时,不建议使用缓存。 +1. 多次构建镜像时,不建议使用缓存。 ```sh $ docker build -t apisix-dashboard:$tag . --build-arg ENABLE_PROXY=true --no-cache=true From 95574ccf453358fdc7437fbd9767b974f8c31a10 Mon Sep 17 00:00:00 2001 From: juzhiyuan Date: Wed, 11 Nov 2020 19:30:49 +0800 Subject: [PATCH 12/27] feat(doc): improve deploy with docker --- docs/deploy-with-docker.zh-CN.md | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/docs/deploy-with-docker.zh-CN.md b/docs/deploy-with-docker.zh-CN.md index 62297a09d3..f8d69f0be7 100644 --- a/docs/deploy-with-docker.zh-CN.md +++ b/docs/deploy-with-docker.zh-CN.md @@ -31,9 +31,12 @@ $ docker build -t apisix-dashboard:$tag . --build-arg ENABLE_PROXY=true 2. 准备配置文件 -在启动容器前,需要在**宿主主机**内准备配置文件 `conf.yaml`,以便覆盖容器内部默认的配置文件。 +在启动容器前,需要在**宿主主机**内准备配置文件 `conf.yaml`,以便覆盖容器内部默认的[配置文件](../api/conf/conf.yaml)。 -请参考[配置文件](../api/conf/conf.yaml)。 +配置文件有如下注意事项: + +1. `conf.listen.host` 为 `0.0.0.0` 时,才能使外部网络访问到容器内的服务。 +1. `conf.etcd.endpoints` 可使用 `host.docker.internal:2379` 以便容器能够正常访问宿主机的 `etcd` 服务。 3. 启动容器 From 21bfc23c856ae48a6346fdb74b9b438b350d6183 Mon Sep 17 00:00:00 2001 From: juzhiyuan Date: Wed, 11 Nov 2020 19:36:15 +0800 Subject: [PATCH 13/27] feat(docs): improve deploy with docker --- docs/deploy-with-docker.zh-CN.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/deploy-with-docker.zh-CN.md b/docs/deploy-with-docker.zh-CN.md index f8d69f0be7..965001f52e 100644 --- a/docs/deploy-with-docker.zh-CN.md +++ b/docs/deploy-with-docker.zh-CN.md @@ -35,8 +35,8 @@ $ docker build -t apisix-dashboard:$tag . --build-arg ENABLE_PROXY=true 配置文件有如下注意事项: -1. `conf.listen.host` 为 `0.0.0.0` 时,才能使外部网络访问到容器内的服务。 -1. `conf.etcd.endpoints` 可使用 `host.docker.internal:2379` 以便容器能够正常访问宿主机的 `etcd` 服务。 +- `conf.listen.host` 为 `0.0.0.0` 时,才能使外部网络访问到容器内的服务。 +- `conf.etcd.endpoints` 必须能够在容器内访问 `etcd` 服务。例如:使用 `host.docker.internal:2379` 以便容器能够访问宿主机网络中的 `etcd`。 3. 启动容器 From fa8ae1455b991d1a826a36c1feb433a05c516234 Mon Sep 17 00:00:00 2001 From: juzhiyuan Date: Wed, 11 Nov 2020 19:36:50 +0800 Subject: [PATCH 14/27] feat(doc): update run with docker --- docs/deploy-with-docker.zh-CN.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/deploy-with-docker.zh-CN.md b/docs/deploy-with-docker.zh-CN.md index 965001f52e..ae30126736 100644 --- a/docs/deploy-with-docker.zh-CN.md +++ b/docs/deploy-with-docker.zh-CN.md @@ -41,7 +41,7 @@ $ docker build -t apisix-dashboard:$tag . --build-arg ENABLE_PROXY=true 3. 启动容器 ```sh -# /path/to/conf.yaml 需指向上述提到的配置文件 +# /path/to/conf.yaml 需使用 绝对路径 指向上述提到的配置文件 $ docker run -d -p 80:8080 -v /path/to/conf.yaml:/usr/local/apisix-dashboard/conf/conf.yaml --name apisix-dashboard apisix-dashboard:$tag ``` From d37a5fc32479bd58fe5898bc1e715365a1a5bd78 Mon Sep 17 00:00:00 2001 From: juzhiyuan Date: Wed, 11 Nov 2020 22:01:16 +0800 Subject: [PATCH 15/27] feat(doc): improve deploy --- docs/deploy-with-docker.zh-CN.md | 29 ++++++++++++++++++++++----- docs/deploy.zh-CN.md | 34 ++++++++++++++++---------------- 2 files changed, 41 insertions(+), 22 deletions(-) diff --git a/docs/deploy-with-docker.zh-CN.md b/docs/deploy-with-docker.zh-CN.md index ae30126736..1faea500ab 100644 --- a/docs/deploy-with-docker.zh-CN.md +++ b/docs/deploy-with-docker.zh-CN.md @@ -17,9 +17,20 @@ # --> -# 使用 Docker 部署 +# 使用 Docker 构建并启动 -1. 构建镜像 +使用 Docker 构建 Dashboard,您只需下载**根目录**中的 `Dockerfile` 文件到您的设备(无需下载源码),并根据本指南操作即可。 + +本构建指南产物中,将包含 `manager-api` 与 `web`。 + +## 环境准备 + +在使用 Docker 构建镜像、启动容器前,请确认您的环境中,已安装并运行如下依赖: + +1. [Docker](https://docs.docker.com/engine/install/) +2. [etcd](https://etcd.io/docs/v3.4.0/dl-build/) 3.4.0+ + +## 构建 ```sh # 在根目录下执行构建命令,请手动指定 tag。 @@ -29,7 +40,9 @@ $ docker build -t apisix-dashboard:$tag . $ docker build -t apisix-dashboard:$tag . --build-arg ENABLE_PROXY=true ``` -2. 准备配置文件 +## 启动 + +1. 准备配置文件 在启动容器前,需要在**宿主主机**内准备配置文件 `conf.yaml`,以便覆盖容器内部默认的[配置文件](../api/conf/conf.yaml)。 @@ -38,14 +51,14 @@ $ docker build -t apisix-dashboard:$tag . --build-arg ENABLE_PROXY=true - `conf.listen.host` 为 `0.0.0.0` 时,才能使外部网络访问到容器内的服务。 - `conf.etcd.endpoints` 必须能够在容器内访问 `etcd` 服务。例如:使用 `host.docker.internal:2379` 以便容器能够访问宿主机网络中的 `etcd`。 -3. 启动容器 +2. 启动 Dashboard ```sh # /path/to/conf.yaml 需使用 绝对路径 指向上述提到的配置文件 $ docker run -d -p 80:8080 -v /path/to/conf.yaml:/usr/local/apisix-dashboard/conf/conf.yaml --name apisix-dashboard apisix-dashboard:$tag ``` -4. 检查容器是否启动成功 +3. 检查容器是否启动成功 ```sh $ docker ps -a @@ -53,6 +66,12 @@ $ docker ps -a 若容器 `apisix-dashboard` 状态正常,访问 `http://127.0.0.1:8080` 以使用有前端界面的控制台,默认用户密码均为 `admin`。 +4. 停止 Dashboard + +```sh +$ docker stop apisix-dashboard +``` + ## 其它 1. 多次构建镜像时,不建议使用缓存。 diff --git a/docs/deploy.zh-CN.md b/docs/deploy.zh-CN.md index 9b3416ee89..d78cabd2cb 100644 --- a/docs/deploy.zh-CN.md +++ b/docs/deploy.zh-CN.md @@ -17,19 +17,17 @@ # --> -# 源码构建并启动 +# 使用源码构建并启动 Dashboard 包含了 `manager-api` 与 `web` 两部分,其中 `web` 是*可选*的。 -## 构建 - -本构建指南将包含 `web` 控制台。 +本构建指南产物中,将包含 `manager-api` 与 `web`。 -### 环境准备 +## 环境准备 -在构建之前,请确认您的环境中,已安装如下依赖: +在使用源码构建前,请确认您的环境中,已安装如下依赖: -#### manager-api +### manager-api 1. [Golang](https://golang.org/dl/) 1.13+:对于中国大陆的用户,可使用如下命令加快模块下载速度。 @@ -39,18 +37,18 @@ $ go env -w GOPROXY=https://goproxy.cn,direct 2. [Lua](https://www.lua.org/download.html) 5.1+:仅在使用**插件编排**功能时,需要安装本依赖。在后续版本中,会对该部分进行优化以取消对其依赖。 -#### web +### web 1. [Node.js](https://nodejs.org/en/download/) 10.23.0+ 2. [Yarn](https://yarnpkg.com/getting-started/install) -### 克隆项目 +## 克隆项目 ```sh $ git clone -b v2.0 https://github.com/apache/apisix-dashboard.git ``` -### 开始构建 +## 构建 ```sh $ cd apisix-dashboard @@ -63,9 +61,13 @@ $ make build ## 启动 -1. 根据您的部署环境,检查并修改 `output/conf/conf.yaml` 中的配置信息。 +1. 在构建完成后、启动前,请确认您的环境中,已安装如下依赖: -2. 启动 Dashboard +- [etcd](https://etcd.io/docs/v3.4.0/dl-build/) 3.4.0+ + +2. 根据您的部署环境,检查并修改 `output/conf/conf.yaml` 中的配置信息。 + +3. 启动 Dashboard ```sh $ cd ./output @@ -77,9 +79,9 @@ $ ./manager-api & 启动成功后,控制台将输出启动成功信息。 -3. 在未修改配置的情况下,访问 `http://127.0.0.1:8080` 以使用有前端界面的控制台,默认用户密码均为 `admin`。 +4. 在未修改配置的情况下,访问 `http://127.0.0.1:8080` 以使用有前端界面的控制台,默认用户密码均为 `admin`。 -4. 停止 Dashboard +5. 停止 Dashboard ```sh $ kill $(ps aux | grep 'manager-api' | awk '{print $2}') @@ -87,9 +89,7 @@ $ kill $(ps aux | grep 'manager-api' | awk '{print $2}') ## 其它 -### 打包构建结果 - -如有需要,在构建完成后使用如下命令,将会对 `output` 目录进行打包操作,以便您将构建结果移动到其它位置。 +1. 如有需要,在构建完成后使用如下命令,将会对 `output` 目录进行打包操作,以便您将构建结果移动到其它位置。 ```sh $ make release-src From 3589c1dcf0d6722464ad2d82d80b62d8709b28f6 Mon Sep 17 00:00:00 2001 From: juzhiyuan Date: Wed, 11 Nov 2020 22:07:03 +0800 Subject: [PATCH 16/27] feat(doc): added more info --- docs/deploy.zh-CN.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/deploy.zh-CN.md b/docs/deploy.zh-CN.md index d78cabd2cb..4912c2569e 100644 --- a/docs/deploy.zh-CN.md +++ b/docs/deploy.zh-CN.md @@ -61,7 +61,7 @@ $ make build ## 启动 -1. 在构建完成后、启动前,请确认您的环境中,已安装如下依赖: +1. 在构建完成后、启动前,请确认您的环境中,已安装并运行如下依赖: - [etcd](https://etcd.io/docs/v3.4.0/dl-build/) 3.4.0+ From 2dd4b2e8d0ad2f791e3fa1f8df0732faad77973a Mon Sep 17 00:00:00 2001 From: juzhiyuan Date: Wed, 11 Nov 2020 22:08:54 +0800 Subject: [PATCH 17/27] feat(doc): added more info --- docs/deploy-with-docker.zh-CN.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/deploy-with-docker.zh-CN.md b/docs/deploy-with-docker.zh-CN.md index 1faea500ab..3352f930b8 100644 --- a/docs/deploy-with-docker.zh-CN.md +++ b/docs/deploy-with-docker.zh-CN.md @@ -33,7 +33,7 @@ ## 构建 ```sh -# 在根目录下执行构建命令,请手动指定 tag。 +# 在 Dockerfile 所在目录下(默认为项目根目录)执行构建命令,请手动指定 tag。 $ docker build -t apisix-dashboard:$tag . # 对于中国大陆的用户,可启用 `ENABLE_PROXY` 参数加快模块下载速度。 From fe0063a5488377f437825432fd16e6ce987d517e Mon Sep 17 00:00:00 2001 From: juzhiyuan Date: Wed, 11 Nov 2020 22:11:22 +0800 Subject: [PATCH 18/27] feat(doc): remove extra info --- docs/deploy-with-docker.zh-CN.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/deploy-with-docker.zh-CN.md b/docs/deploy-with-docker.zh-CN.md index 3352f930b8..f84f56fa81 100644 --- a/docs/deploy-with-docker.zh-CN.md +++ b/docs/deploy-with-docker.zh-CN.md @@ -77,5 +77,5 @@ $ docker stop apisix-dashboard 1. 多次构建镜像时,不建议使用缓存。 ```sh -$ docker build -t apisix-dashboard:$tag . --build-arg ENABLE_PROXY=true --no-cache=true +$ docker build -t apisix-dashboard:$tag . --no-cache=true ``` From 701f87d90651bda748b0884a28042b90a7b9cca6 Mon Sep 17 00:00:00 2001 From: juzhiyuan Date: Thu, 12 Nov 2020 06:09:47 +0800 Subject: [PATCH 19/27] feat: added more detailed --- docs/develop.zh-CN.md | 22 +++++++++++++++------- 1 file changed, 15 insertions(+), 7 deletions(-) diff --git a/docs/develop.zh-CN.md b/docs/develop.zh-CN.md index 5188ad10e2..44aac7bdbe 100644 --- a/docs/develop.zh-CN.md +++ b/docs/develop.zh-CN.md @@ -33,17 +33,21 @@ $ git clone -b v2.0 https://github.com/apache/apisix-dashboard.git ## 开始开发 +```sh +$ cd apisix-dashboard +``` + ### manager-api 1. 请在 `api/conf/conf.yaml` 中修改配置信息。 -2. 启动开发模式 +2. 在根目录下,启动开发模式 ```sh $ make api-run ``` -3. 关闭开发模式 +3. 在根目录下,关闭开发模式 ```sh $ make api-stop @@ -53,16 +57,20 @@ $ make api-stop ### web -1. 请在 `config/proxy.ts` 文件中修改 `manager-api` 地址。 - -2. 启动开发模式 +1. 进入 `web` 目录。 ```sh -$ cd /web +$ cd ./web +``` + +2. 请在 `config/proxy.ts` 文件中修改 `manager-api` 地址。 +3. 启动开发模式 + +```sh $ yarn install $ yarn start ``` -3. 如编写 E2E 测试,请参考 [E2E 编写指南](../web/src/e2e/README.zh-CN.md) +4. 如编写 E2E 测试,请参考 [E2E 编写指南](../web/src/e2e/README.zh-CN.md) From 62e7a1521ce54cc1790ec2df63fd1e6600d1d7d7 Mon Sep 17 00:00:00 2001 From: nic-chen Date: Thu, 12 Nov 2020 09:19:29 +0800 Subject: [PATCH 20/27] fix: CI fail according `api/conf/conf.yaml ` is changed. --- api/test/shell/cli_test.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/api/test/shell/cli_test.sh b/api/test/shell/cli_test.sh index 5023df3f94..f3eab2afc5 100755 --- a/api/test/shell/cli_test.sh +++ b/api/test/shell/cli_test.sh @@ -46,7 +46,7 @@ fi #change level and path -sed -i 's/file_path: logs\/error.log/file_path: .\/error.log/' conf/conf.yaml +sed -i 's/logs\/error.log/.\/error.log/' conf/conf.yaml sed -i 's/warn/info/' conf/conf.yaml ./manager-api & From 8014a917dcfbc1a261bfbd72aedc6ac7737fa317 Mon Sep 17 00:00:00 2001 From: nic-chen Date: Fri, 13 Nov 2020 08:34:28 +0800 Subject: [PATCH 21/27] fix: revert changed --- api/test/shell/cli_test.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/api/test/shell/cli_test.sh b/api/test/shell/cli_test.sh index f3eab2afc5..5023df3f94 100755 --- a/api/test/shell/cli_test.sh +++ b/api/test/shell/cli_test.sh @@ -46,7 +46,7 @@ fi #change level and path -sed -i 's/logs\/error.log/.\/error.log/' conf/conf.yaml +sed -i 's/file_path: logs\/error.log/file_path: .\/error.log/' conf/conf.yaml sed -i 's/warn/info/' conf/conf.yaml ./manager-api & From de694e03bf851aa666f239a4b7a7435d6fc20309 Mon Sep 17 00:00:00 2001 From: juzhiyuan Date: Fri, 13 Nov 2020 17:36:41 +0800 Subject: [PATCH 22/27] feat(docs): improve English version --- README.md | 98 ++++++++++++-------------------- docs/FAQ.md | 36 +++++++++++- docs/deploy-with-docker.md | 59 +++++++++++++------ docs/deploy.md | 113 +++++++++++++------------------------ docs/develop.md | 82 ++++++++------------------- 5 files changed, 173 insertions(+), 215 deletions(-) diff --git a/README.md b/README.md index a85150005a..18ab012b3f 100644 --- a/README.md +++ b/README.md @@ -21,90 +21,64 @@ English | [简体中文](./README.zh-CN.md) # Apache APISIX Dashboard -Apache APISIX Dashboard for [Apache APISIX](https://github.com/apache/apisix) +## What's Apache APISIX Dashboard -The goal of Apache APISIX Dashboard project is to let users to quickly experience and learn Apache APISIX, but it still cannot be used directly in a production environment. +The Apache APISIX Dashboard is designed to make it as easy as possible for users to operate [Apache APISIX](https://github.com/apache/apisix) through a front-end interface. -Its function is always a subset of Apache APISIX, and may lag behind the rapid iteration of Apache APISIX. +The Dashboard is the control plane and performs all parameter checks; Apache APISIX mixes data and control planes and will evolve to a pure data plane. -If you need to use the Apache APISIX Dashboard project in a production system, you need to enhance user permissions, communication security, high availability and other advanced features. +This project includes `manager-api`, which will gradually replace `admin-api` in Apache APISIX, and the front-end interface, which we are actively migrating logic from. -## Installation +Note: Currently the Dashboard does not have complete coverage of Apache APISIX features, [visit here](https://github.com/apache/apisix-dashboard/milestones) to view the milestones. -Support multiple ways to install Apache APISIX Dashboard +![architecture](./docs/images/architecture.png) -### Docker +## Project structure -Start a runnable version by the following method - -- [Deploy With Docker](./docs/deploy-with-docker.md) - -### Build from Source Code - -To build Apache APISIX Dashboard from source code, first make sure that your `golang` version is 1.13 or greater. - -Also you need to make sure that `Node.js` and `yarn` are installed. - -```sh -$ git clone -b v2.0 https://github.com/apache/apisix-dashboard.git -$ cd apisix-dashboard -$ make build ``` - -Then you can find all files (configuration files, executable files, web static resources) needed to run Apache APISIX Dashboard in the `./output` directory. - -Start by the following commands. - -```sh -$ cd ./output -$ exec ./manager-api +. +├── CHANGELOG.md +├── CHANGELOG.zh-CN.md +├── CODE_OF_CONDUCT.md +├── CONTRIBUTING.md +├── Dockerfile +├── LICENSE +├── Makefile +├── NOTICE +├── README.md +├── README.zh-CN.md +├── api +├── docs +├── licenses +└── web ``` -`makefile` provides the following commands. +1. The `api` directory is used to store the `manager-api` source codes, which is used to manage `etcd` and provide an interface to the front-end interface. +2. The `web` directory is used to store the front-end source codes. -```text -Makefile rules: +## Build then launch - help: Show Makefile rules - build: Build Apache APISIX Dashboard, it contains web and manager-api - api-test: Run the tests of manager-api - api-run: Run the manager-api - api-stop: stop manager-api - go-lint: Lint Go source code - license-check: Check Apache APISIX Dashboard Source Codes for Apache License -``` +Support the following ways currently. -For more detailed construction steps, see - [Build from Source Codes](./docs/deploy.md) +- [Source Codes](./docs/deploy.md) +- [Docker](./docs/deploy-with-docker.md) -### For developer +## Development -Apache APISIX Dashboard provides a management interface for [Apache APISIX](https://github.com/apache/apisix), you need to [install APISIX first](https://github.com/apache/apisix#configure-and-installation). +Please refer to the [Development Guide](./docs/develop.md). -Please refer to here to start `manager-api` and `web`respectively. +## User Guide -- [Develop Apache APISIX Dashboard](./docs/develop.md) - -## User guide - -Please refer to [User Guide](./docs/USER_GUIDE.md) - -## Milestones - -- [2.0](https://github.com/apache/apisix-dashboard/milestone/4) -- [2.1](https://github.com/apache/apisix-dashboard/milestone/5) +Please refer to the [User Guide](./docs/USER_GUIDE.md). ## Contributing -See [CONTRIBUTING](./CONTRIBUTING.md) for details on submitting patches and the contribution workflow. - -## License - -Apache License 2.0, [LICENSE](https://github.com/apache/apisix-dashboard/blob/master/LICENSE) +Please refer to the [Contribution Guide](./CONTRIBUTING.md) for a more detailed infomation. ## FAQ -1. If you need the Apache APISIX Dashboard 1.0 which is built with Vue.js, please refer to [master-vue](https://github.com/apache/apisix-dashboard/tree/master-vue). +Please refer to the [FAQ](./docs/FAQ.zh-CN.md) for more known issues. -2. The Apache APISIX Dashboard 2.0 removes MySQL which [Apache APISIX Dashboard 1.5](https://github.com/apache/apisix-dashboard/tree/backup-1.5-latest) is relied on. +## License -3. If you are using APISIX 1.5 or below, kindly note that the v2 api store and v3 api store are [separate and isolated](https://etcd.io/docs/v3.4.0/op-guide/v2-migration/). Apache APISIX Dashboard v2.0 and above use the etcd v3 api, APISIX 1.5 and below use the etcd v2 api. +[Apache License 2.0](./LICENSE) diff --git a/docs/FAQ.md b/docs/FAQ.md index 7cd55f6bbb..ac1d047b2a 100644 --- a/docs/FAQ.md +++ b/docs/FAQ.md @@ -19,4 +19,38 @@ # FAQ -TODO +### 1. Vue.js version of the Dashboard + +If you need a Vue.js build of the Apache APISIX Dashboard 1.0, use the [master-vue branch](https://github.com/apache/apisix-dashboard/tree/master-vue). + +### What are the differences between Dashboard version 2.0 and version 1.5? + +The 2.0 version of the dashboard removed MySQL from [version 1.5](https://github.com/apache/apisix-dashboard/tree/backup-1.5-latest) and will operate directly on etcd. + +### 3. Etcd compatibility issues + +If you are using Apache APISIX below v2.0, be aware that the data from the etcd v2 API is [not compatible](https://etcd.io/docs/v3.4.0/op-guide/v2-migration/) with the data from the v3 API. Apache APISIX Dashboard v2.0 and above uses the etcd v3 API, and apisix 1.5 and below uses the etcd v2 API. + +### 4. After modifying the plugin schema or creating a custom plugin in Apache APISIX, why can't I find it on the dashboard? + +Since the Dashboard caches the jsonschema data of the plugins in Apache APISIX, you need to synchronize the data in the Dashboard after you create your custom plugins in Apache APISIX, which currently **only supports manual operation**, this issue will be optimized in the following versions. Please follow the following guide. + +1. Install [Lua](https://www.lua.org/download.html) and `zip`. + +2. Execute the following commands. + +```sh +# `$version` is the version number of Apache APISIX, e.g. master or 2.0. +$ api/build-tools/schema-sync.sh $version +``` + +If you have a custom plugin, make sure it is in the `apisix` directory and use the following command. + +```sh +$ api/build-tools/schema-sync.sh /path/to/apisix + +# e.g +$ api/build-tools/schema-sync.sh /usr/local/apisix +``` + +After the command finishes executing, if you are using a binary `manager-api` that has already been built, you will need to manually copy `api/conf/schema.json` to the `conf` directory under the Dashboard **working directory**. where **working directory** refers to the `conf` directory under this [document](./deploy.md) is the `output` directory, or the directory with the modified name, that is generated in the root directory after the build is complete. diff --git a/docs/deploy-with-docker.md b/docs/deploy-with-docker.md index 9b6f245b81..1a13f4afc0 100644 --- a/docs/deploy-with-docker.md +++ b/docs/deploy-with-docker.md @@ -17,42 +17,65 @@ # --> -# Deploy with Docker +# Building and Launching with Docker -1. Build image +To build a Dashboard with Docker, you simply download the `Dockerfile` file from the **root directory** to your device (no need to download all source codes) then follow this guide. + +The `manager-api` and `web` will be included in this build guide product. + +## Prerequisites + +Before using Docker to build images and start containers, make sure that the following dependencies are installed and running in your environment. + +1. [Docker](https://docs.docker.com/engine/install/) +2. [etcd](https://etcd.io/docs/v3.4.0/dl-build/) 3.4.0+ + +## Build ```sh -# NOTE: $tag should be set manually -$ docker build -t apisix-dashboard:{$tag} . +# Execute the build command in the directory where the Dockerfile is located (by default, the project root), specifying the tag manually. +$ docker build -t apisix-dashboard:$tag . + +# For users in mainland China, the `ENABLE_PROXY` parameter can be provided to speed up module downloads. +$ docker build -t apisix-dashboard:$tag . --build-arg ENABLE_PROXY=true ``` -2. Prepare the configuration file +## Launch -Before starting the container, the configuration file `conf.yaml` needs to be prepared inside the **host** to override the default configuration file inside the container. Please refer to [example configuration file](./examples/docker-conf-example.yaml). +1. Preparing configuration files -Example configuration notes: +Before starting the container, the configuration file `conf.yaml` needs to be prepared inside the **host** to override the default [configuration file](../api/conf/conf.yaml) inside the container. -- `conf.listen.host` To listen for IP within the container, it must be `0.0.0.0`, so the host can access the container's network. -- `conf.listen.port` The default is `8080` for the container listening port. If you need to change it, please change the [Dockerfile](../Dockerfile) too. -- `conf.etcd.endpoints` For the list of ETCD hosts, multiple nodes are connected with **English commas**. Make sure the container has access to these hosts. e.g. Example configuration `conf.etcd.endpoints` for `host.docker.internal` is intended to allow the container to access the network on the host. +Kindly note: -3. Run container +- Only when `conf.listen.host` is `0.0.0.0` can the external network access the services within the container. +- `conf.etcd.endpoints` must be able to access the `etcd` service within the container. For example: use `host.docker.internal:2379` so that the container can access `etcd` on the host network. + +2. Launch the Dashboard + +```sh +# /path/to/conf.yaml Requires an absolute path pointing to the configuration file mentioned above. +$ docker run -d -p 80:8080 -v /path/to/conf.yaml:/usr/local/apisix-dashboard/conf/conf.yaml --name apisix-dashboard apisix-dashboard:$tag +``` + +3. Check if the container started successfully ```sh -$ docker run -d -p 80:8080 -v /path/to/conf.yaml:/usr/local/apisix-dashboard/conf/conf.yaml --name apisix-dashboard apisix-dashboard:{$tag} +$ docker ps -a ``` -## Note +If the container `apisix-dashboard` is ok, access `http://127.0.0.1:8080` to use the dashboard with a front-end GUI, where the default username and password are `admin`. -1. After building the image, if you want to modify the configuration file, you can use the `docker -v /local-path-to-conf-file:/conf/conf.yaml` parameter to specify the configuration file required for `manager-api` to be loaded dynamically when the container is started. -2. For users in China, we could use the `ENABLE_PROXY` flag to speed up dependencies downloading. +4. Stop the Dashboard ```sh -$ docker build -t apisix-dashboard:{$tag} . --build-arg ENABLE_PROXY=true +$ docker stop apisix-dashboard ``` -3. If it's not the first time to build, it is recommended not to use cache. +## Other + +1. Caching is not recommended when building a image multiple times. ```sh -$ docker build -t apisix-dashboard:{$tag} . --build-arg ENABLE_PROXY=true --no-cache=true +$ docker build -t apisix-dashboard:$tag . --no-cache=true ``` diff --git a/docs/deploy.md b/docs/deploy.md index 95fcf142a8..d6bb72251c 100644 --- a/docs/deploy.md +++ b/docs/deploy.md @@ -17,116 +17,81 @@ # --> -# Deploy manually +# Build and launch with source codes -## Clone the project - -```sh -$ git clone -b v2.0 https://github.com/apache/apisix-dashboard.git - -$ cd apisix-dashboard -``` - -## Build +The Dashboard contains both `manager-api` and `web`, but `web` is _optional_. -### Manager-api dependencies +The `manager-api` and `web` will be included in this build guide product. -The `manager-api` is used to provide APIs for Apache APISIX Dashboard, just like a bridge between the Apache APISIX and the Apache APISIX Dashboard. Here are the steps to build it manually: +## Prerequisites -1. We need `Go` 1.13+ to be preinstalled. +Before using source codes to build, make sure that the following dependencies are installed in your environment. -NOTE: You also need to install `Lua` 5.1+ if you want to use the Plugin Orchestration, we will improve this part and omit Lua's dependency in the future. +### manager-api -2. Check environment variables - -- For most users in China, we could use [Goproxy](https://goproxy.cn/) to speed up downloading modules. +1. [Golang](https://golang.org/dl/) 1.13+: For users in mainland China, you can use the following command to speed up the module downloads. ```sh $ go env -w GOPROXY=https://goproxy.cn,direct ``` -### Web dependencies +2. [Lua](https://www.lua.org/download.html) 5.1+: This dependency needs to be installed only when using the **Plugin Orchestration** feature. In subsequent versions, this section will be optimized to remove the dependency. -This project is initialized with [Ant Design Pro](https://pro.ant.design). The following are some quick guides for how to use. +### web -1. Make sure you have `Node.js(version 10.0.0+)` installed on your machine. -2. Install [yarn](https://yarnpkg.com/). +1. [Node.js](https://nodejs.org/en/download/) 10.23.0+ +2. [Yarn](https://yarnpkg.com/getting-started/install) -### Build +## Clone the project ```sh -$ make build -``` - -The bundled files are located in the root directory `output`. - -## Run - -1. According to your deploy environment, check the related configurations in `output/conf/conf.yaml`, modify those variables if needed. - -Example: - -```yaml -conf: - listen: - host: 127.0.0.1 - port: 8080 - etcd: - endpoints: - - 127.0.0.1:2379 -authentication: - secret: secret - expire_time: 3600 - users: - - username: admin - password: admin - - username: user - password: user +$ git clone -b v2.0 https://github.com/apache/apisix-dashboard.git ``` -2. Run Apache APISIX Dashboard +## Build ```sh -$ cd ./output -$ ./manager-api +$ cd apisix-dashboard +$ make build ``` -3. Visit `http://127.0.0.1:8080` in your browser, `8080` is the default listen port of manager-api. +When the build is complete, the results are stored in the root `output` directory. -3. Stop Apache APISIX Dashboard +Note: `make build` will build `manger-api` and `web`, use the `make help` command to see more commands. -```sh -$ kill $(ps aux | grep 'manager-api' | awk '{print $2}') -``` +## Launch + +1. After the build is complete and before you start, make sure the following dependencies are installed and running in your environment. -## Package +- [etcd](https://etcd.io/docs/v3.4.0/dl-build/) 3.4.0+ -Package the output directory, the output directory contains all the files needed to run the Apache APISIX Dashboard (configuration files, executable files, web static resources) +2. Check and modify the configuration information in `output/conf/conf.yaml` according to your deployment environment. + +3. Launch the Dashboard ```sh -$ make release-src -``` +$ cd ./output + +$ ./manager-api -## Configuration +# or running in background +$ ./manager-api & +``` -1. `conf.dag-lib-path` must use absolute path, we could use `pwd` command. Only used when enable Plugin Orchestration. +After successful startup, the console will output a startup success message. -2. `conf.listen.host` is set to `127.0.0.1` so we could only visit it in private, we could change it to `0.0.0.0` to allow any visitors. +4. Without changing the configuration, access `http://127.0.0.1:8080` to use the dashboard with a front-end GUI, where the default username and password are `admin`. -3. `conf.etcd.endpoints` is used to set ETCD's instances address, it supports multiple instances mode. +5. Stop the Dashboard -```yaml -conf: - etcd: - endpoints: - - 127.0.0.1:2379 - - 127.0.0.1:3379 +```sh +$ kill $(ps aux | grep 'manager-api' | awk '{print $2}') ``` -## NOTE +## Other -1. After compiling the `manager-api`, if you move the compiled product to another location, an error will be reported at startup, this is because the configuration file's **absolute path** is fixed in the product and needs to be resolved by running an environment variable to set the location of the configuration file before running. +1. If necessary, using the following command after the build is complete will pack the `output` directory so that you can move the build to another location. ```sh -$ export APISIX_CONF_PATH=/home/demo_user/workspace/apisix-dashboard/api/conf +$ make release-src ``` diff --git a/docs/develop.md b/docs/develop.md index ff5f88ec63..42d977713e 100644 --- a/docs/develop.md +++ b/docs/develop.md @@ -17,98 +17,60 @@ # --> -# Apache APISIX Dashboard Devlopment +# Development Guide -## Dependencies +The Dashboard contains both `manager-api` and `web` parts, so you need to start the development environment separately. -```sh -$ git clone -b v2.0 https://github.com/apache/apisix-dashboard.git -$ cd apisix-dashboard -``` +## Prerequisites -## Web +Before development, refer to this [guide](./deploy.md) to install dependencies. -1. Make sure you have `Node.js(version version 10.0.0+)` installed on your machine. -2. Install [yarn](https://yarnpkg.com/). -3. Install dependencies: +## Clone the project ```sh -$ yarn install +$ git clone -b v2.0 https://github.com/apache/apisix-dashboard.git ``` -4. If we want to modify the API, please refer to the `config/proxy.ts` file. - -5. Start (the development mode) +## Start developing ```sh -$ yarn start +$ cd apisix-dashboard ``` -### Add E2E test cases - -Please refer to [E2E Documentation](../web/src/e2e/README.md). - -## Manager-api +### manager-api -### Start +1. Please change the configuration in `api/conf/conf.yaml`. -1. Modify `config.yaml` in `api/conf/conf.yaml` - -```yaml -conf: - listen: - host: 127.0.0.1 - port: 8080 - etcd: - endpoints: - - 127.0.0.1:2379 -authentication: - secret: secret - expire_time: 3600 - users: - - username: admin - password: admin - - username: user - password: user -``` - -2. Start (the development mode) +2. In the root directory, launch development mode. ```sh $ make api-run ``` -3. Stop (the development mode) +3. In the root directory, stop development mode. ```sh $ make api-stop ``` -### Sync jsonschema +4. Please refer to the [FAQ](./FAQ.md) about the problem of displaying exception in the dashboard after adding custom plugins or modifying plugin's schema. -To sync jsonschema from Apache APISIX, `Lua` 5.1+ and `zip` need to be preinstalled, then execute this command: +### web + +1. Go to the `web` directory. ```sh -$ api/build-tools/schema-sync.sh $version +$ cd ./web ``` -NOTE: `$version` should be `master` or Apache APISIX's version. +2. Please change the `manager-api` address in the `config/proxy.ts` file if needed. -Example: +3. Launch development mode ```sh -# Using "master" -$ api/build-tools/schema-sync.sh master - -# Using Apache APISIX's version -$ api/build-tools/schema-sync.sh 2.0 -``` - -If you have custom plugin, please make sure your custom plugin is placed in the APISIX directory, and change the parameters of the execution script to the APISIX directory path, example: +$ yarn install -```sh -$ api/build-tools/schema-sync.sh /usr/local/apisix +$ yarn start ``` -After the script is executed, if you are not running it by `make api-run`, you need to copy `api/conf/schema.json` to `conf` directory under the working directory of Apache APISIX Dashboard. - +4. If writing an E2E test, refer to the [E2E Writing Guide](../web/src/e2e/README.md) From 775d102c4ad71dad11d6e9370f739041f6344160 Mon Sep 17 00:00:00 2001 From: juzhiyuan Date: Fri, 13 Nov 2020 17:41:01 +0800 Subject: [PATCH 23/27] feat(docs): use frontend instead, just like backend --- .github/workflows/frontend-e2e-test.yml | 6 +++--- CHANGELOG.md | 6 +++--- README.md | 8 ++++---- docs/deploy-with-docker.md | 2 +- docs/deploy.md | 2 +- web/src/pages/Route/transform.ts | 2 +- 6 files changed, 13 insertions(+), 13 deletions(-) diff --git a/.github/workflows/frontend-e2e-test.yml b/.github/workflows/frontend-e2e-test.yml index c834c01dee..0f1ab8316a 100644 --- a/.github/workflows/frontend-e2e-test.yml +++ b/.github/workflows/frontend-e2e-test.yml @@ -1,4 +1,4 @@ -name: Front-end e2e test +name: frontend e2e test on: push: @@ -14,7 +14,7 @@ defaults: jobs: web-e2e: - name: Front-end e2e test + name: frontend e2e test runs-on: ubuntu-latest steps: - name: Checkout @@ -36,5 +36,5 @@ jobs: if: steps.node_modules_cache_id.outputs.cache-hit != 'true' run: yarn install - - name: Start Front-end then test + - name: Start frontend then test run: yarn test:e2e diff --git a/CHANGELOG.md b/CHANGELOG.md index 3c6c4ae367..a6a0fa26ad 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -29,10 +29,10 @@ This is a release candidate. # Core -- Refactor front-end with Admin-API. +- Refactor frontend with Admin-API. - Manager-API removes dependency on MySQL. - Support plugin orchestration. -- Setting standards for front-end internationalization. +- Setting standards for frontend internationalization. - New deployment pattern. - Add more test cases. - Document Enhancement. @@ -40,7 +40,7 @@ This is a release candidate. - Improve CI testing. - Support log save to local file. - Optimize the deployment process. -- Add E2E test examples to the front-end. [#619](https://github.com/apache/apisix-dashboard/pull/619) +- Add E2E test examples to the frontend. [#619](https://github.com/apache/apisix-dashboard/pull/619) - Fix the Promethues plugin updating incorrect values when updating routes. [#666](https://github.com/apache/apisix-dashboard/pull/666) - Fix page display exceptions when the Redirect option is selected as Enable HTTPS in the Route page. [#692](https://github.com/apache/apisix-dashboard/pull/692) diff --git a/README.md b/README.md index 18ab012b3f..e1db75417b 100644 --- a/README.md +++ b/README.md @@ -23,11 +23,11 @@ English | [简体中文](./README.zh-CN.md) ## What's Apache APISIX Dashboard -The Apache APISIX Dashboard is designed to make it as easy as possible for users to operate [Apache APISIX](https://github.com/apache/apisix) through a front-end interface. +The Apache APISIX Dashboard is designed to make it as easy as possible for users to operate [Apache APISIX](https://github.com/apache/apisix) through a frontend interface. The Dashboard is the control plane and performs all parameter checks; Apache APISIX mixes data and control planes and will evolve to a pure data plane. -This project includes `manager-api`, which will gradually replace `admin-api` in Apache APISIX, and the front-end interface, which we are actively migrating logic from. +This project includes `manager-api`, which will gradually replace `admin-api` in Apache APISIX, and the frontend interface, which we are actively migrating logic from. Note: Currently the Dashboard does not have complete coverage of Apache APISIX features, [visit here](https://github.com/apache/apisix-dashboard/milestones) to view the milestones. @@ -53,8 +53,8 @@ Note: Currently the Dashboard does not have complete coverage of Apache APISIX f └── web ``` -1. The `api` directory is used to store the `manager-api` source codes, which is used to manage `etcd` and provide an interface to the front-end interface. -2. The `web` directory is used to store the front-end source codes. +1. The `api` directory is used to store the `manager-api` source codes, which is used to manage `etcd` and provide an interface to the frontend interface. +2. The `web` directory is used to store the frontend source codes. ## Build then launch diff --git a/docs/deploy-with-docker.md b/docs/deploy-with-docker.md index 1a13f4afc0..28d4d1da6f 100644 --- a/docs/deploy-with-docker.md +++ b/docs/deploy-with-docker.md @@ -64,7 +64,7 @@ $ docker run -d -p 80:8080 -v /path/to/conf.yaml:/usr/local/apisix-dashboard/con $ docker ps -a ``` -If the container `apisix-dashboard` is ok, access `http://127.0.0.1:8080` to use the dashboard with a front-end GUI, where the default username and password are `admin`. +If the container `apisix-dashboard` is ok, access `http://127.0.0.1:8080` to use the dashboard with a frontend GUI, where the default username and password are `admin`. 4. Stop the Dashboard diff --git a/docs/deploy.md b/docs/deploy.md index d6bb72251c..3da7b3ebc1 100644 --- a/docs/deploy.md +++ b/docs/deploy.md @@ -80,7 +80,7 @@ $ ./manager-api & After successful startup, the console will output a startup success message. -4. Without changing the configuration, access `http://127.0.0.1:8080` to use the dashboard with a front-end GUI, where the default username and password are `admin`. +4. Without changing the configuration, access `http://127.0.0.1:8080` to use the dashboard with a frontend GUI, where the default username and password are `admin`. 5. Stop the Dashboard diff --git a/web/src/pages/Route/transform.ts b/web/src/pages/Route/transform.ts index 69ac7d9b0c..f95e9d92a0 100644 --- a/web/src/pages/Route/transform.ts +++ b/web/src/pages/Route/transform.ts @@ -69,7 +69,7 @@ export const transformStepData = ({ data.plugins!.redirect = redirect; } - // Remove some of the front-end custom variables + // Remove some of the frontend custom variables return omit(data, [ 'advancedMatchingRules', 'upstreamHostList', From 1925da2509f074e769dea55ca515aae5b2da5255 Mon Sep 17 00:00:00 2001 From: juzhiyuan Date: Fri, 13 Nov 2020 17:43:12 +0800 Subject: [PATCH 24/27] feat(docs): remove extra statements --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index e1db75417b..ac4640f185 100644 --- a/README.md +++ b/README.md @@ -27,7 +27,7 @@ The Apache APISIX Dashboard is designed to make it as easy as possible for users The Dashboard is the control plane and performs all parameter checks; Apache APISIX mixes data and control planes and will evolve to a pure data plane. -This project includes `manager-api`, which will gradually replace `admin-api` in Apache APISIX, and the frontend interface, which we are actively migrating logic from. +This project includes `manager-api`, which will gradually replace `admin-api` in Apache APISIX. Note: Currently the Dashboard does not have complete coverage of Apache APISIX features, [visit here](https://github.com/apache/apisix-dashboard/milestones) to view the milestones. From d55aa90e8fa4573b259fb47d71980cd6191099e8 Mon Sep 17 00:00:00 2001 From: juzhiyuan Date: Fri, 13 Nov 2020 17:51:36 +0800 Subject: [PATCH 25/27] feat(docs): update typo --- README.md | 4 ++-- docs/deploy-with-docker.md | 2 +- docs/deploy.md | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index ac4640f185..ac4e185e9e 100644 --- a/README.md +++ b/README.md @@ -53,7 +53,7 @@ Note: Currently the Dashboard does not have complete coverage of Apache APISIX f └── web ``` -1. The `api` directory is used to store the `manager-api` source codes, which is used to manage `etcd` and provide an interface to the frontend interface. +1. The `api` directory is used to store the `manager-api` source codes, which is used to manage `etcd` and provide APIs to the frontend interface. 2. The `web` directory is used to store the frontend source codes. ## Build then launch @@ -77,7 +77,7 @@ Please refer to the [Contribution Guide](./CONTRIBUTING.md) for a more detailed ## FAQ -Please refer to the [FAQ](./docs/FAQ.zh-CN.md) for more known issues. +Please refer to the [FAQ](./docs/FAQ.md) for more known issues. ## License diff --git a/docs/deploy-with-docker.md b/docs/deploy-with-docker.md index 28d4d1da6f..4d89f0f1a0 100644 --- a/docs/deploy-with-docker.md +++ b/docs/deploy-with-docker.md @@ -64,7 +64,7 @@ $ docker run -d -p 80:8080 -v /path/to/conf.yaml:/usr/local/apisix-dashboard/con $ docker ps -a ``` -If the container `apisix-dashboard` is ok, access `http://127.0.0.1:8080` to use the dashboard with a frontend GUI, where the default username and password are `admin`. +If the container `apisix-dashboard` is ok, visit `http://127.0.0.1:8080` to use the dashboard with GUI, where the default username and password are `admin`. 4. Stop the Dashboard diff --git a/docs/deploy.md b/docs/deploy.md index 3da7b3ebc1..a403c7c24c 100644 --- a/docs/deploy.md +++ b/docs/deploy.md @@ -80,7 +80,7 @@ $ ./manager-api & After successful startup, the console will output a startup success message. -4. Without changing the configuration, access `http://127.0.0.1:8080` to use the dashboard with a frontend GUI, where the default username and password are `admin`. +4. Without changing the configuration, visit `http://127.0.0.1:8080` to use the dashboard with GUI, where the default username and password are `admin`. 5. Stop the Dashboard From 699774e69ca3ef6a051383c944f9c59df1aa734a Mon Sep 17 00:00:00 2001 From: juzhiyuan Date: Fri, 13 Nov 2020 18:07:43 +0800 Subject: [PATCH 26/27] feat(docs): remove startup with message --- docs/deploy.md | 2 -- docs/deploy.zh-CN.md | 2 -- 2 files changed, 4 deletions(-) diff --git a/docs/deploy.md b/docs/deploy.md index a403c7c24c..db3fdab287 100644 --- a/docs/deploy.md +++ b/docs/deploy.md @@ -78,8 +78,6 @@ $ ./manager-api $ ./manager-api & ``` -After successful startup, the console will output a startup success message. - 4. Without changing the configuration, visit `http://127.0.0.1:8080` to use the dashboard with GUI, where the default username and password are `admin`. 5. Stop the Dashboard diff --git a/docs/deploy.zh-CN.md b/docs/deploy.zh-CN.md index 4912c2569e..b68d7c0731 100644 --- a/docs/deploy.zh-CN.md +++ b/docs/deploy.zh-CN.md @@ -77,8 +77,6 @@ $ ./manager-api $ ./manager-api & ``` -启动成功后,控制台将输出启动成功信息。 - 4. 在未修改配置的情况下,访问 `http://127.0.0.1:8080` 以使用有前端界面的控制台,默认用户密码均为 `admin`。 5. 停止 Dashboard From a57d29c67d9155476afdd3b4971b989c1329085f Mon Sep 17 00:00:00 2001 From: juzhiyuan Date: Fri, 13 Nov 2020 18:09:40 +0800 Subject: [PATCH 27/27] feat: update CI's name --- .github/workflows/frontend-e2e-test.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/frontend-e2e-test.yml b/.github/workflows/frontend-e2e-test.yml index 0f1ab8316a..1753ac20fe 100644 --- a/.github/workflows/frontend-e2e-test.yml +++ b/.github/workflows/frontend-e2e-test.yml @@ -1,4 +1,4 @@ -name: frontend e2e test +name: Frontend e2e test on: push: @@ -14,7 +14,7 @@ defaults: jobs: web-e2e: - name: frontend e2e test + name: Frontend e2e test runs-on: ubuntu-latest steps: - name: Checkout