From df69783338fce54deef7b8e060bb9f4e41cb4698 Mon Sep 17 00:00:00 2001 From: wanghe Date: Thu, 7 Dec 2023 15:16:21 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=96=B0=E5=A2=9E=20Elasticsearch=20(#?= =?UTF-8?q?672)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/elasticsearch/7.17.15/data.yml | 38 ++++++++++++++++ .../7.17.15/data/backup/.gitkeep | 0 .../7.17.15/data/conf/elasticsearch.yml | 6 +++ apps/elasticsearch/7.17.15/data/data/.gitkeep | 0 apps/elasticsearch/7.17.15/docker-compose.yml | 31 +++++++++++++ apps/elasticsearch/7.17.15/scripts/init.sh | 3 ++ apps/elasticsearch/8.11.1/data.yml | 38 ++++++++++++++++ .../elasticsearch/8.11.1/data/backup/.gitkeep | 0 .../8.11.1/data/conf/elasticsearch.yml | 6 +++ apps/elasticsearch/8.11.1/data/data/.gitkeep | 0 apps/elasticsearch/8.11.1/docker-compose.yml | 31 +++++++++++++ apps/elasticsearch/8.11.1/scripts/init.sh | 3 ++ apps/elasticsearch/README.md | 42 ++++++++++++++++++ apps/elasticsearch/data.yml | 20 +++++++++ apps/elasticsearch/logo.png | Bin 0 -> 7877 bytes 15 files changed, 218 insertions(+) create mode 100644 apps/elasticsearch/7.17.15/data.yml create mode 100644 apps/elasticsearch/7.17.15/data/backup/.gitkeep create mode 100644 apps/elasticsearch/7.17.15/data/conf/elasticsearch.yml create mode 100644 apps/elasticsearch/7.17.15/data/data/.gitkeep create mode 100644 apps/elasticsearch/7.17.15/docker-compose.yml create mode 100644 apps/elasticsearch/7.17.15/scripts/init.sh create mode 100644 apps/elasticsearch/8.11.1/data.yml create mode 100644 apps/elasticsearch/8.11.1/data/backup/.gitkeep create mode 100644 apps/elasticsearch/8.11.1/data/conf/elasticsearch.yml create mode 100644 apps/elasticsearch/8.11.1/data/data/.gitkeep create mode 100644 apps/elasticsearch/8.11.1/docker-compose.yml create mode 100644 apps/elasticsearch/8.11.1/scripts/init.sh create mode 100644 apps/elasticsearch/README.md create mode 100644 apps/elasticsearch/data.yml create mode 100644 apps/elasticsearch/logo.png diff --git a/apps/elasticsearch/7.17.15/data.yml b/apps/elasticsearch/7.17.15/data.yml new file mode 100644 index 000000000..d961350aa --- /dev/null +++ b/apps/elasticsearch/7.17.15/data.yml @@ -0,0 +1,38 @@ +additionalProperties: + formFields: + - default: 9200 + edit: true + envKey: PANEL_APP_PORT_HTTP + labelEn: HTTP Port + labelZh: HTTP端口 + required: true + rule: paramPort + type: number + - default: "true" + edit: true + envKey: ELASTIC_SECURITY + labelEn: Password Verification + labelZh: 开启密码验证 + required: true + type: select + values: + - label: "True" + value: "true" + - label: "False" + value: "false" + - default: "Elastic" + edit: true + envKey: ELASTIC_PASSWORD + labelEn: Password + labelZh: 密码 + random: true + required: true + rule: paramComplexity + type: password + - default: "ES_JAVA_OPTS=-Xlog:disable -Xlog:gc=debug:stderr -Xms512m -Xmx512m" + edit: true + envKey: P_ES_JAVA_OPTS + labelEn: ES JAVA OPTS + labelZh: ES JAVA OPTS + required: true + type: text \ No newline at end of file diff --git a/apps/elasticsearch/7.17.15/data/backup/.gitkeep b/apps/elasticsearch/7.17.15/data/backup/.gitkeep new file mode 100644 index 000000000..e69de29bb diff --git a/apps/elasticsearch/7.17.15/data/conf/elasticsearch.yml b/apps/elasticsearch/7.17.15/data/conf/elasticsearch.yml new file mode 100644 index 000000000..a60e2bdba --- /dev/null +++ b/apps/elasticsearch/7.17.15/data/conf/elasticsearch.yml @@ -0,0 +1,6 @@ +cluster.name: "docker-cluster" +network.host: 0.0.0.0 +path.repo: ["/usr/share/elasticsearch/backup"] +http.cors.enabled: true +http.cors.allow-origin: "*" +http.cors.allow-headers: X-Requested-With,Content-Type,Content-Length,Authorization \ No newline at end of file diff --git a/apps/elasticsearch/7.17.15/data/data/.gitkeep b/apps/elasticsearch/7.17.15/data/data/.gitkeep new file mode 100644 index 000000000..e69de29bb diff --git a/apps/elasticsearch/7.17.15/docker-compose.yml b/apps/elasticsearch/7.17.15/docker-compose.yml new file mode 100644 index 000000000..4b81083ee --- /dev/null +++ b/apps/elasticsearch/7.17.15/docker-compose.yml @@ -0,0 +1,31 @@ +version: '3' +services: + elasticsearch: + container_name: ${CONTAINER_NAME} + restart: always + networks: + - 1panel-network + ports: + - "${PANEL_APP_PORT_HTTP}:9200" + volumes: + - "./data/data:/usr/share/elasticsearch/data" + - "./data/backup:/usr/share/elasticsearch/backup" + - "./data/conf/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml" + image: elasticsearch:7.17.15 + ulimits: + memlock: + soft: -1 + hard: -1 + nofile: + soft: 65536 + hard: 65536 + environment: + - discovery.type=single-node + - ELASTIC_PASSWORD=${ELASTIC_PASSWORD} + - xpack.security.enabled=${ELASTIC_SECURITY} + - ${P_ES_JAVA_OPTS} + labels: + createdBy: "Apps" +networks: + 1panel-network: + external: true diff --git a/apps/elasticsearch/7.17.15/scripts/init.sh b/apps/elasticsearch/7.17.15/scripts/init.sh new file mode 100644 index 000000000..4e811c86a --- /dev/null +++ b/apps/elasticsearch/7.17.15/scripts/init.sh @@ -0,0 +1,3 @@ +#!/bin/bash + +chown -R 1000:1000 data \ No newline at end of file diff --git a/apps/elasticsearch/8.11.1/data.yml b/apps/elasticsearch/8.11.1/data.yml new file mode 100644 index 000000000..d961350aa --- /dev/null +++ b/apps/elasticsearch/8.11.1/data.yml @@ -0,0 +1,38 @@ +additionalProperties: + formFields: + - default: 9200 + edit: true + envKey: PANEL_APP_PORT_HTTP + labelEn: HTTP Port + labelZh: HTTP端口 + required: true + rule: paramPort + type: number + - default: "true" + edit: true + envKey: ELASTIC_SECURITY + labelEn: Password Verification + labelZh: 开启密码验证 + required: true + type: select + values: + - label: "True" + value: "true" + - label: "False" + value: "false" + - default: "Elastic" + edit: true + envKey: ELASTIC_PASSWORD + labelEn: Password + labelZh: 密码 + random: true + required: true + rule: paramComplexity + type: password + - default: "ES_JAVA_OPTS=-Xlog:disable -Xlog:gc=debug:stderr -Xms512m -Xmx512m" + edit: true + envKey: P_ES_JAVA_OPTS + labelEn: ES JAVA OPTS + labelZh: ES JAVA OPTS + required: true + type: text \ No newline at end of file diff --git a/apps/elasticsearch/8.11.1/data/backup/.gitkeep b/apps/elasticsearch/8.11.1/data/backup/.gitkeep new file mode 100644 index 000000000..e69de29bb diff --git a/apps/elasticsearch/8.11.1/data/conf/elasticsearch.yml b/apps/elasticsearch/8.11.1/data/conf/elasticsearch.yml new file mode 100644 index 000000000..a60e2bdba --- /dev/null +++ b/apps/elasticsearch/8.11.1/data/conf/elasticsearch.yml @@ -0,0 +1,6 @@ +cluster.name: "docker-cluster" +network.host: 0.0.0.0 +path.repo: ["/usr/share/elasticsearch/backup"] +http.cors.enabled: true +http.cors.allow-origin: "*" +http.cors.allow-headers: X-Requested-With,Content-Type,Content-Length,Authorization \ No newline at end of file diff --git a/apps/elasticsearch/8.11.1/data/data/.gitkeep b/apps/elasticsearch/8.11.1/data/data/.gitkeep new file mode 100644 index 000000000..e69de29bb diff --git a/apps/elasticsearch/8.11.1/docker-compose.yml b/apps/elasticsearch/8.11.1/docker-compose.yml new file mode 100644 index 000000000..9c36b9b32 --- /dev/null +++ b/apps/elasticsearch/8.11.1/docker-compose.yml @@ -0,0 +1,31 @@ +version: '3' +services: + elasticsearch: + container_name: ${CONTAINER_NAME} + restart: always + networks: + - 1panel-network + ports: + - "${PANEL_APP_PORT_HTTP}:9200" + volumes: + - "./data/data:/usr/share/elasticsearch/data" + - "./data/backup:/usr/share/elasticsearch/backup" + - "./data/conf/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml" + image: elasticsearch:8.11.1 + ulimits: + memlock: + soft: -1 + hard: -1 + nofile: + soft: 65536 + hard: 65536 + environment: + - discovery.type=single-node + - ELASTIC_PASSWORD=${ELASTIC_PASSWORD} + - xpack.security.enabled=${ELASTIC_SECURITY} + - ${P_ES_JAVA_OPTS} + labels: + createdBy: "Apps" +networks: + 1panel-network: + external: true diff --git a/apps/elasticsearch/8.11.1/scripts/init.sh b/apps/elasticsearch/8.11.1/scripts/init.sh new file mode 100644 index 000000000..4e811c86a --- /dev/null +++ b/apps/elasticsearch/8.11.1/scripts/init.sh @@ -0,0 +1,3 @@ +#!/bin/bash + +chown -R 1000:1000 data \ No newline at end of file diff --git a/apps/elasticsearch/README.md b/apps/elasticsearch/README.md new file mode 100644 index 000000000..ca0da3d56 --- /dev/null +++ b/apps/elasticsearch/README.md @@ -0,0 +1,42 @@ +# 默认账户 + +- 默认账户: elastic + +# Elasticsearch + +**Elasticsearch** 是一种分布式 RESTful 搜索引擎,针对生产规模工作负载的速度和相关性进行了优化。您可以使用 Elasticsearch 对海量数据集执行实时搜索应用程序。 + +# 主要功能: + +## 全文搜索 + + - 支持全文搜索和查询,能够快速地在大规模数据集中找到相关的文档。 + - 采用分词、词干化等技术,提供高效的文本搜索。 + +## 分布式性能 + + - 能够水平扩展,轻松地将数据分布到多个节点,实现高性能的数据存储和检索。 + +## 实时数据 + + - 支持实时数据的索引和搜索,能够快速响应新数据的添加、更新和删除操作。 + +## 多种数据类型支持 + + - 可以处理结构化数据、半结构化数据和非结构化数据,如文本、地理空间数据等。 + +## 强大的聚合分析 + + - 提供丰富的聚合功能,能够对数据进行各种汇总、统计和分析操作。 + +## RESTful API + + - 使用简单的HTTP请求,与Elasticsearch交互,执行索引、搜索、管理等操作。 + +## 灵活的插件和生态系统 + + - 具有丰富的插件生态系统,可以扩展其功能,满足不同场景下的需求。 + +## 可视化工具 + + - 有多种可视化工具和仪表盘,如Kibana,用于展示和分析Elasticsearch中的数据。 \ No newline at end of file diff --git a/apps/elasticsearch/data.yml b/apps/elasticsearch/data.yml new file mode 100644 index 000000000..fb07d97b9 --- /dev/null +++ b/apps/elasticsearch/data.yml @@ -0,0 +1,20 @@ +name: Elasticsearch +tags: + - 数据库 +title: Elasticsearch +type: 数据库 +description: 免费开放、分布式、RESTful 搜索引擎 +additionalProperties: + key: elasticsearch + name: Elasticsearch + tags: + - Database + shortDescZh: 免费开放、分布式、RESTful 搜索引擎 + shortDescEn: Free and Open, Distributed, RESTful Search Engine + type: runtime + crossVersionUpdate: false + limit: 0 + recommend: 0 + website: https://www.elastic.co + github: https://github.com/elastic/elasticsearch + document: https://www.elastic.co/guide/en/elasticsearch/reference/8.11/elasticsearch-intro.html \ No newline at end of file diff --git a/apps/elasticsearch/logo.png b/apps/elasticsearch/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..5b5ec38fa7beb646928e85f0c8c1698ef3851d17 GIT binary patch literal 7877 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 literal 0 HcmV?d00001