From b95303276771e4d17761e84768cc06a30fe337b2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=90=8C=E6=A3=AE?= Date: Thu, 1 Feb 2024 11:49:48 +0800 Subject: [PATCH] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E5=AE=89=E8=A3=85=E8=84=9A?= =?UTF-8?q?=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 27 +++++----- apps/sentinel-dashboard/1.8.6/data.yml | 18 +++++++ .../1.8.6/docker-compose.yml | 12 +++++ apps/sentinel-dashboard/README.md | 47 ++++++++++++++++++ apps/sentinel-dashboard/data.yml | 19 +++++++ apps/sentinel-dashboard/latest/data.yml | 18 +++++++ .../latest/docker-compose.yml | 12 +++++ apps/sentinel-dashboard/logo.png | Bin 0 -> 12548 bytes install.sh | 46 +++++++++++++++++ 9 files changed, 187 insertions(+), 12 deletions(-) create mode 100644 apps/sentinel-dashboard/1.8.6/data.yml create mode 100644 apps/sentinel-dashboard/1.8.6/docker-compose.yml create mode 100644 apps/sentinel-dashboard/README.md create mode 100644 apps/sentinel-dashboard/data.yml create mode 100644 apps/sentinel-dashboard/latest/data.yml create mode 100644 apps/sentinel-dashboard/latest/docker-compose.yml create mode 100644 apps/sentinel-dashboard/logo.png create mode 100644 install.sh diff --git a/README.md b/README.md index 1c369db76..766536ce4 100644 --- a/README.md +++ b/README.md @@ -1,20 +1,23 @@ # 1Panel 应用商店 -[1Panel](https://github.com/1Panel-dev/1Panel) 应用商店的官方存储库,包含了所有可以在 [1Panel](https://github.com/1Panel-dev/1Panel) 应用商店安装的应用程序。 +当前仓库由 `新疆萌森软件开发工作室` 维护,我们致力于为 1Panel 用户提供更多的应用程序。 -当前已上架的应用及其安装量信息请浏览:https://apps.fit2cloud.com/1panel +## 上线应用 -1Panel 应用商店应用上架的标准: +- [x] [Nacos](https://nacos.io/) +- [x] [Sentinel-Dashboard](https://sentinelguard.io/) +- [x] [Elastic](https://www.elastic.co/) + - [x] [Elasticsearch](https://www.elastic.co/elasticsearch/) + - [x] [Kibana](https://www.elastic.co/kibana/) + - [ ] [Logstash](https://www.elastic.co/logstash/) +- [ ] [Immich](https://immich.app/) - - 知名且活跃的开源项目 - - 有相当规模的安装量 - - 官方提供 Docker 镜像 +## 脚本安装 -## 问题反馈 +```shell +git clone -b localApps https://github.com/QYG2297248353/appstore-1panel /opt/1panel/resource/apps/local/appstore-localApps -如果您在使用过程中遇到什么问题,或有进一步的需求需要反馈,请提交 GitHub Issue 到 [1Panel 项目的主仓库](https://github.com/1Panel-dev/1Panel/issues) - -## 制作本地应用 - -[如何提交自己想要的应用](https://github.com/1Panel-dev/appstore/wiki/%E5%A6%82%E4%BD%95%E6%8F%90%E4%BA%A4%E8%87%AA%E5%B7%B1%E6%83%B3%E8%A6%81%E7%9A%84%E5%BA%94%E7%94%A8) +cp -rf /opt/1panel/resource/apps/local/appstore-localApps/apps/* /opt/1panel/resource/apps/local/ +rm -rf /opt/1panel/resource/apps/local/appstore-localApps +``` diff --git a/apps/sentinel-dashboard/1.8.6/data.yml b/apps/sentinel-dashboard/1.8.6/data.yml new file mode 100644 index 000000000..ca5f82f11 --- /dev/null +++ b/apps/sentinel-dashboard/1.8.6/data.yml @@ -0,0 +1,18 @@ +additionalProperties: + formFields: + - default: 8858 + edit: true + envKey: PANEL_APP_PORT_HTTP + labelEn: Web port + labelZh: Web 端口 + required: true + rule: paramPort + type: number + - default: 8719 + edit: true + envKey: COMMUNICATION_PORT + labelEn: Communication port + labelZh: 通讯端口 + required: true + rule: paramPort + type: number diff --git a/apps/sentinel-dashboard/1.8.6/docker-compose.yml b/apps/sentinel-dashboard/1.8.6/docker-compose.yml new file mode 100644 index 000000000..f6fa92041 --- /dev/null +++ b/apps/sentinel-dashboard/1.8.6/docker-compose.yml @@ -0,0 +1,12 @@ +version: "3" +services: + "sentinel-dashboard": + image: bladex/sentinel-dashboard:1.8.6 + container_name: ${CONTAINER_NAME} + restart: always + ports: + - "${PANEL_APP_PORT_HTTP}:8858" + - "${COMMUNICATION_PORT}:8719" +networks: + 1panel-network: + external: true diff --git a/apps/sentinel-dashboard/README.md b/apps/sentinel-dashboard/README.md new file mode 100644 index 000000000..c59ae8bde --- /dev/null +++ b/apps/sentinel-dashboard/README.md @@ -0,0 +1,47 @@ +# Sentinel-Dashboard + +随着微服务的流行,服务和服务之间的稳定性变得越来越重要。Sentinel是面向分布式、多语言异构化服务架构的流量治理组件,主要以流量为切入点,从流量路由、流量控制、流量整形、熔断降级、系统自适应过载保护、热点流量防护等多个维度来帮助开发者保障微服务的稳定性。 + +## 快速启动 + +访问地址 +`http://IP:8858/sentinel` + +> 用户名 +> sentinel +> +> 密码 +> sentinel + +## Sentinel 的历史 + ++ 2012 年,Sentinel 诞生,主要功能为入口流量控制。 ++ 2013-2017 年,Sentinel 在阿里巴巴集团内部迅速发展,成为基础技术模块,覆盖了所有的核心场景。Sentinel 也因此积累了大量的流量归整场景以及生产实践。 ++ 2018 年,Sentinel 开源,并持续演进。 ++ 2019 年,Sentinel 朝着多语言扩展的方向不断探索,推出 C++ 原生版本,同时针对 Service Mesh 场景也推出了 Envoy 集群流量控制支持,以解决 + Service Mesh 架构下多语言限流的问题。 ++ 2020 年,推出 Sentinel Go 版本,继续朝着云原生方向演进。 ++ 2021 年,Sentinel 正在朝着 2.0 云原生高可用决策中心组件进行演进;同时推出了 Sentinel Rust 原生版本。同时我们也在 Rust + 社区进行了 Envoy WASM extension 及 eBPF extension 等场景探索。 ++ 2022 年,Sentinel 品牌升级为流量治理,领域涵盖流量路由/调度、流量染色、流控降级、过载保护/实例摘除等;同时社区将流量治理相关标准抽出到 + OpenSergo 标准中,Sentinel 作为流量治理标准实现。 + +## Sentinel 基本概念 + +### 资源 + +资源是 Sentinel 的关键概念。它可以是 Java 应用程序中的任何内容,例如,由应用程序提供的服务,或由应用程序调用的其它应用提供的服务,甚至可以是一段代码。在接下来的文档中,我们都会用资源来描述代码块。 + +只要通过 Sentinel API 定义的代码,就是资源,能够被 Sentinel 保护起来。大部分情况下,可以使用方法签名,URL,甚至服务名称作为资源名来标示资源。 + +### 规则 + +围绕资源的实时状态设定的规则,可以包括流量控制规则、熔断降级规则以及系统保护规则。所有规则可以动态实时调整。 + +## Sentinel 是如何工作的 + +Sentinel 的主要工作机制如下: + ++ 对主流框架提供适配或者显示的 API,来定义需要保护的资源,并提供设施对资源进行实时统计和调用链路分析。 ++ 根据预设的规则,结合对资源的实时统计信息,对流量进行控制。同时,Sentinel 提供开放的接口,方便您定义及改变规则。 ++ Sentinel 提供实时的监控系统,方便您快速了解目前系统的状态。 diff --git a/apps/sentinel-dashboard/data.yml b/apps/sentinel-dashboard/data.yml new file mode 100644 index 000000000..e222608ef --- /dev/null +++ b/apps/sentinel-dashboard/data.yml @@ -0,0 +1,19 @@ +name: sentinel-dashboard +tags: + - 中间件 +title: Sentinel-Dashboard +type: 中间件 +description: 阿里巴巴流量卫兵 +additionalProperties: + key: sentinel-dashboard + name: Sentinel-Dashboard + tags: + - Middleware + shortDescZh: 阿里巴巴流量卫兵 + shortDescEn: Alibaba Traffic Guard + type: runtime + crossVersionUpdate: false + limit: 0 + website: https://sentinelguard.io/ + github: https://github.com/alibaba/Sentinel + document: https://sentinelguard.io/zh-cn/docs/introduction.html diff --git a/apps/sentinel-dashboard/latest/data.yml b/apps/sentinel-dashboard/latest/data.yml new file mode 100644 index 000000000..ca5f82f11 --- /dev/null +++ b/apps/sentinel-dashboard/latest/data.yml @@ -0,0 +1,18 @@ +additionalProperties: + formFields: + - default: 8858 + edit: true + envKey: PANEL_APP_PORT_HTTP + labelEn: Web port + labelZh: Web 端口 + required: true + rule: paramPort + type: number + - default: 8719 + edit: true + envKey: COMMUNICATION_PORT + labelEn: Communication port + labelZh: 通讯端口 + required: true + rule: paramPort + type: number diff --git a/apps/sentinel-dashboard/latest/docker-compose.yml b/apps/sentinel-dashboard/latest/docker-compose.yml new file mode 100644 index 000000000..bff233bc5 --- /dev/null +++ b/apps/sentinel-dashboard/latest/docker-compose.yml @@ -0,0 +1,12 @@ +version: "3" +services: + "sentinel-dashboard": + image: bladex/sentinel-dashboard:latest + container_name: ${CONTAINER_NAME} + restart: always + ports: + - "${PANEL_APP_PORT_HTTP}:8858" + - "${COMMUNICATION_PORT}:8719" +networks: + 1panel-network: + external: true diff --git a/apps/sentinel-dashboard/logo.png b/apps/sentinel-dashboard/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..3f493afc779f6e2021bbbcae4696dce4b7a6219d GIT binary patch literal 12548 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 /dev/null 2>&1 || { + echo >&2 "Error: $1 is not installed. Please install it and try again." + exit 1 + } +} + +check_command "git" +check_command "cp" +check_command "rm" +check_command "echo" + +echo "$(date): Step 1 - Cloning repository..." +git clone -b localApps https://github.com/QYG2297248353/appstore-1panel /opt/1panel/resource/apps/local/appstore-localApps + +apps_directory="/opt/1panel/resource/apps/local/appstore-localApps/apps" +local_directory="/opt/1panel/resource/apps/local/" + +for app_directory in $apps_directory/*; do + app_name=$(basename "$app_directory") + + if [ -d "$local_directory/$app_name" ]; then + rm -rf "$local_directory/$app_name" + cp -r "$app_directory" "$local_directory/" + echo "$(date): Step 2 - Copied and replaced directory $app_directory to $local_directory/" + else + cp -r "$app_directory" "$local_directory/" + echo "$(date): Step 2 - Copied directory $app_directory to $local_directory/" + fi +done + +for app_directory in $apps_directory/*; do + app_name=$(basename "$app_directory") + + if [ ! -d "$local_directory/$app_name" ]; then + cp -r "$app_directory" "$local_directory/" + echo "$(date): Step 3 - Copied directory $app_directory to $local_directory/" + fi +done + +# 步骤 4: 删除appstore-localApps目录 +echo "$(date): Step 4 - Deleting directory /opt/1panel/resource/apps/local/appstore-localApps..." +rm -rf "/opt/1panel/resource/apps/local/appstore-localApps" +echo "$(date): Step 4 - Deleted directory /opt/1panel/resource/apps/local/appstore-localApps"