From 559223f71a7a6b663ce40d0d5f706f2f466542d2 Mon Sep 17 00:00:00 2001 From: raoxiaoyan Date: Mon, 2 Nov 2020 14:32:23 +0800 Subject: [PATCH] =?UTF-8?q?1=E3=80=81=E5=A2=9E=E5=8A=A0=E5=8D=87=E7=BA=A7?= =?UTF-8?q?=E6=96=87=E6=A1=A3=EF=BC=9B=202=E3=80=81=E6=9B=B4=E6=96=B0?= =?UTF-8?q?=E7=89=88=E6=9C=AC=E5=8F=B7=E4=B8=BA1.3.0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.en.md | 78 ++++++++++++++++++++++++++------ README.md | 13 ++++++ docs/upgrade.md | 14 ++++++ docs/upgrade/1.2.xto1.3.xlog.md | 33 ++++++++++++++ docs/wechat.jpg | Bin 0 -> 32527 bytes kongx-common/pom.xml | 2 +- kongx-serve/pom.xml | 4 +- pom.xml | 2 +- 8 files changed, 128 insertions(+), 18 deletions(-) create mode 100644 docs/upgrade.md create mode 100644 docs/upgrade/1.2.xto1.3.xlog.md create mode 100644 docs/wechat.jpg diff --git a/README.en.md b/README.en.md index a2ec889..16f104d 100644 --- a/README.en.md +++ b/README.en.md @@ -1,13 +1,36 @@ -#kongx +# kongx + -#### Description kongx是网关kong的可视化界面管理平台(参考konga的部分界面布局方式),能够集中化管理应用不同环境的网关配置,提供同步各环境的网关配置功能,并且具备规范的权限管理、参数配置、环境管理及日志审计等特性。 基于Spring Boot和Spring Cloud开发,打包后可以直接运行,不需要额外安装Tomcat等应用容器 -#### Screenshots -![](https://gitee.com/raoxy/kongx/blob/master/docs/screen.png) -#### Features +Kongx 使用指南请参考:[Wiki](https://www.kancloud.cn/raoxiaoyan/kongx/1984321) + +平台快速部署请参见[Quick Start](https://www.kancloud.cn/raoxiaoyan/kongx/1984323) + +系统环境默认用户:admin/123456(部署登录后,请前往'个人设置'页面,及时修改密码) +## Screenshots +![](./docs/screen.png) + +![](./docs/services.png) + +![](./docs/service1.png) + +![](./docs/kong%20shell.png) + +![](./docs/user.png) + +![](./docs/env.png) + +![](./docs/params.png) + +![](./docs/log.png) + +![](./docs/synclog.png) + + +## Features - Kong Manage:Upstream,Service,Route,Plugin,Consumer等 - 同步Kong配置:同步不同环境间的kong配置,便于多环境同一项目配置管理; @@ -15,15 +38,42 @@ kongx是网关kong的可视化界面管理平台(参考konga的部分界面布 - 参数管理:具有良好的扩展性,基于平台的参数管理可扩展多环境及服务管理;包括:环境管理、参数参数等 - 日志管理:平台具有完善的日志审计功能,包括:同步日志、操作日志; -#### Quick start -[快速安装](https://gitee.com/raoxy/kongx/wikis/pages?sort_id=2979225&doc_id=983590) +## Kong插件列表 +- [官网插件](https://docs.konghq.com/hub/) +- [灰度插件canary](https://gitee.com/raoxy/kong-plugins-canary) +- [防攻击 kong_injection](https://github.com/ror6ax/kong_injection) -#### Kong网关插件列表 -- [灰度插件Canary](https://gitee.com/raoxy/kong-plugins-canary) -- [...] +## kong最佳实践 -#### kong网关最佳实践 - -- Kong与consul自主发现服务 +- [Kong与consul自主发现服务](https://www.kancloud.cn/raoxiaoyan/kongx/1984357) - 如何应用灰度插件(canary)及使用场景介绍 -- 整理中...尽情期待 \ No newline at end of file +- kong插件开发实践 +- 整理中...尽情期待 + + +## kongx与kong版本关系 + + +## RoadMap +1、初步计划kongx自适应kong后续所有版本; + +2、增加shell界面和可视化管理界面; + +## 技术支持 +![](./docs/Kongx技术支持1群聊二维码.png) + +## 版本支持 +| 序号 | kongx版本 | Kong版本 | 说明 | +| --- | --- | --- | --- | +| 1 | 1.2.x | 1.2.x | 1.2.x测试| +| 1 | 1.3.x | 1.2.x、1.3.x+ | 只做过1.2.x、1.3.x测试,对1.4.x以上版本与1.3.x对比差异,原则上基础功能全部可用,(参考差异对比)[https://www.kancloud.cn/raoxiaoyan/kongx/1991178]| + +## 升级历史 +- 1.3.x发布版本(2020/11/10) +> 1. 增加upstream被动健康检查的配置 +> 2. 所有页面由弹窗改为面包屑导航 +> 3. 增加版本自适应功能,1.3.x可适配至kong所有版本(1.3.x,1.4.x,1.5.x,2.0.x,2.1.x) +> +## 参考链接 +- [Kong官网](https://docs.konghq.com/1.2.x/admin-api/) +- [OpenResty最佳实践](https://www.kancloud.cn/kancloud/openresty-best-practices/50428) \ No newline at end of file diff --git a/README.md b/README.md index e2eeea8..a711bab 100644 --- a/README.md +++ b/README.md @@ -50,6 +50,10 @@ Kongx 使用指南请参考:[Wiki](https://www.kancloud.cn/raoxiaoyan/kongx/19 - kong插件开发实践 - 整理中...尽情期待 + +## kongx与kong版本关系 + + ## RoadMap 1、初步计划kongx自适应kong后续所有版本; @@ -57,6 +61,15 @@ Kongx 使用指南请参考:[Wiki](https://www.kancloud.cn/raoxiaoyan/kongx/19 ## 技术支持 ![](./docs/Kongx技术支持1群聊二维码.png) + +## 版本支持 +| 序号 | kongx版本 | Kong版本 | 说明 | +| --- | --- | --- | --- | +| 1 | 1.2.x | 1.2.x | 1.2.x测试| +| 1 | 1.3.0 | 1.2.x、1.3.x+ | 目前仅针对kong版本1.2.x、1.3.x测试通过,对1.4.x以上版本与1.3.x对比差异,原则上基础功能全部可用,(参考差异对比)[https://www.kancloud.cn/raoxiaoyan/kongx/1991178]| + +## Upgrade +[更新历史](docs/upgrade.md) ## 参考链接 - [Kong官网](https://docs.konghq.com/1.2.x/admin-api/) - [OpenResty最佳实践](https://www.kancloud.cn/kancloud/openresty-best-practices/50428) \ No newline at end of file diff --git a/docs/upgrade.md b/docs/upgrade.md new file mode 100644 index 0000000..16917ca --- /dev/null +++ b/docs/upgrade.md @@ -0,0 +1,14 @@ +## 升级向导 +- 1.3.0发布(2020/11/10) +> 1. 增加certificate及ca_certificate +> 2. 增加upstream被动健康检查的配置 +> 3. 所有页面由弹窗改为面包屑导航 +> 4. 增加版本自适应功能,1.3.0可适配至kong所有版本(1.2.x、1.3.x,1.4.x,1.5.x,2.0.x,2.1.x) + +## 1. 升级到1.3.0 +参考Kongx [Quick Start](https://www.kancloud.cn/raoxiaoyan/kongx/1984323)即可 +## 2. 1.2.x升级到1.3.0 +由1.2.x升级到1.3.0只需要两个步骤: + +2.1、 下载1.3.0的kongx安装包; +2.2、 下载数据库升级脚本,[1.2.xto1.3.0.sql](./upgrade/1.2.xto1.3.xlog.md) diff --git a/docs/upgrade/1.2.xto1.3.xlog.md b/docs/upgrade/1.2.xto1.3.xlog.md new file mode 100644 index 0000000..e75b19c --- /dev/null +++ b/docs/upgrade/1.2.xto1.3.xlog.md @@ -0,0 +1,33 @@ +# 1.2.x 升级1.3.0 sql脚本 +```sql +INSERT INTO `kongx_system_function` (`parent_id`, `code`, `name`, `menu_icon`, `visit_view`, `visit_path`, `use_yn`, `menu_type`, `application_code`, `sort_order`) VALUES ('5', '', 'Snis', 'icon-sni', 'views/gateway/sni/index', 'snis', 'y', 'menu', 'kongx', '7'); +INSERT INTO `kongx_system_function` (`parent_id`, `code`, `name`, `menu_icon`, `visit_view`, `visit_path`, `use_yn`, `menu_type`, `application_code`, `sort_order`) VALUES ('5', '', 'Certificates', 'icon-certificate', 'views/gateway/certificate/index', 'certificate', 'y', 'menu', 'kongx', '8'); +INSERT INTO `kongx_system_function` (`parent_id`, `code`, `name`, `menu_icon`, `visit_view`, `visit_path`, `use_yn`, `menu_type`, `application_code`, `sort_order`) VALUES ('53', 'consumer_add', '新增consumer', '', '', '', 'y', 'point', 'kongx', '999'); +INSERT INTO `kongx_system_function` (`parent_id`, `code`, `name`, `menu_icon`, `visit_view`, `visit_path`, `use_yn`, `menu_type`, `application_code`, `sort_order`) VALUES ('53', 'consumer_update', '更新consumer', '', '', '', 'y', 'point', 'kongx', '999'); +INSERT INTO `kongx_system_function` (`parent_id`, `code`, `name`, `menu_icon`, `visit_view`, `visit_path`, `use_yn`, `menu_type`, `application_code`, `sort_order`) VALUES ('53', 'consumer_delete', '删除consumer', '', '', '', 'y', 'point', 'kongx', '999'); +INSERT INTO `kongx_system_function` (`parent_id`, `code`, `name`, `menu_icon`, `visit_view`, `visit_path`, `use_yn`, `menu_type`, `application_code`, `sort_order`) VALUES ('60', 'certificate_view', '查看certificate', '', '', '', 'y', 'point', 'kongx', '999'); +INSERT INTO `kongx_system_function` (`parent_id`, `code`, `name`, `menu_icon`, `visit_view`, `visit_path`, `use_yn`, `menu_type`, `application_code`, `sort_order`) VALUES ('60', 'certificate_add', '新增certificate', '', '', '', 'y', 'point', 'kongx', '999'); +INSERT INTO `kongx_system_function` (`parent_id`, `code`, `name`, `menu_icon`, `visit_view`, `visit_path`, `use_yn`, `menu_type`, `application_code`, `sort_order`) VALUES ('60', 'certificate_update', '修改certificate', '', '', '', 'y', 'point', 'kongx', '999'); +INSERT INTO `kongx_system_function` (`parent_id`, `code`, `name`, `menu_icon`, `visit_view`, `visit_path`, `use_yn`, `menu_type`, `application_code`, `sort_order`) VALUES ('60', 'certificate_delete', '删除certificate', '', '', '', 'y', 'point', 'kongx', '999'); + +insert into kongx_system_role_function(role_id,half_checked,function_id) +select * from ( +select '1' role_id,'n' half_checked,'-1' as function_id +union all +select '1' role_id,'n' half_checked,id as function_id from kongx_system_function +) a +where not EXISTS (select * from kongx_system_role_function b where a.function_id=b.function_id and b.role_id=a.role_id); + + +insert into kongx_system_role_function(role_id,half_checked,function_id) +select * from ( +select '2' role_id,'y' half_checked,'-1' as function_id +union +select '2' role_id,'y' half_checked,id as function_id from kongx_system_function where name in ('Gateway','Upstreams','Services','Routes','Plugins','Kong Shell','Consumers','Certificates','日志管理') +union +select '2' role_id,'n' half_checked,id as function_id from kongx_system_function where code in ('service_view','upstream_view','route_view','plugin_view','consumer_view','certificate_view') +union +select '2' role_id,'n' half_checked,id as function_id from kongx_system_function where name='操作日志' +) a +where not EXISTS (select * from kongx_system_role_function b where a.function_id=b.function_id and b.role_id=a.role_id); +``` \ No newline at end of file diff --git a/docs/wechat.jpg b/docs/wechat.jpg new file mode 100644 index 0000000000000000000000000000000000000000..de9109348eb13f17c0085519874f2170aeae9a7e GIT binary patch literal 32527 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

qSr{X)^F~WyP6I?FG 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 literal 0 HcmV?d00001 diff --git a/kongx-common/pom.xml b/kongx-common/pom.xml index b7da931..7d7e449 100644 --- a/kongx-common/pom.xml +++ b/kongx-common/pom.xml @@ -5,7 +5,7 @@ kongx com.kongx - 1.2.x + 1.3.0 4.0.0 diff --git a/kongx-serve/pom.xml b/kongx-serve/pom.xml index 116dcd5..4457ed5 100644 --- a/kongx-serve/pom.xml +++ b/kongx-serve/pom.xml @@ -5,7 +5,7 @@ kongx com.kongx - 1.2.x + 1.3.0 4.0.0 @@ -14,7 +14,7 @@ com.kongx kongx-common - 1.2.x + 1.3.0 diff --git a/pom.xml b/pom.xml index cb2ca9d..e12b873 100644 --- a/pom.xml +++ b/pom.xml @@ -13,7 +13,7 @@ com.kongx kongx pom - 1.2.x + 1.3.0 kongx-serve kongx-common