From 87dac5de9379da89b9a805ce709bd4abc43a9a39 Mon Sep 17 00:00:00 2001 From: Meng Sen Date: Tue, 30 Jan 2024 10:52:06 +0800 Subject: [PATCH] Add Nacos-2.2.0 (#863) * Add Nacos-2.2.0 * Add Sentinel-Dashboard --- apps/nacos/2.2.0-derby/data.yml | 88 +++++++ apps/nacos/2.2.0-derby/docker-compose.yml | 27 ++ apps/nacos/2.2.0-mysql/data.yml | 156 ++++++++++++ apps/nacos/2.2.0-mysql/derby-schema.sql | 231 ++++++++++++++++++ apps/nacos/2.2.0-mysql/docker-compose.yml | 32 +++ apps/nacos/2.2.0-mysql/mysql-schema.sql | 221 +++++++++++++++++ apps/nacos/README.md | 89 +++++++ apps/nacos/data.yml | 19 ++ apps/nacos/logo.png | Bin 0 -> 12708 bytes 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 16 files changed, 989 insertions(+) create mode 100644 apps/nacos/2.2.0-derby/data.yml create mode 100644 apps/nacos/2.2.0-derby/docker-compose.yml create mode 100644 apps/nacos/2.2.0-mysql/data.yml create mode 100644 apps/nacos/2.2.0-mysql/derby-schema.sql create mode 100644 apps/nacos/2.2.0-mysql/docker-compose.yml create mode 100644 apps/nacos/2.2.0-mysql/mysql-schema.sql create mode 100644 apps/nacos/README.md create mode 100644 apps/nacos/data.yml create mode 100644 apps/nacos/logo.png 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 diff --git a/apps/nacos/2.2.0-derby/data.yml b/apps/nacos/2.2.0-derby/data.yml new file mode 100644 index 000000000..81b683454 --- /dev/null +++ b/apps/nacos/2.2.0-derby/data.yml @@ -0,0 +1,88 @@ +additionalProperties: + formFields: + - default: "serverIdentity" + edit: true + envKey: NACOS_AUTH_IDENTITY_KEY + labelEn: Nacos auth identity key + labelZh: Nacos身份验证密钥键 + required: true + type: text + - default: "security" + edit: true + envKey: NACOS_AUTH_IDENTITY_VALUE + labelEn: Nacos auth identity value + labelZh: Nacos身份验证密钥值 + required: true + type: text + - default: "SecretKey012345678901234567890123456789012345678901234567890123456789" + edit: true + envKey: NACOS_AUTH_TOKEN + labelEn: Nacos auth token + labelZh: Nacos身份验证令牌 + required: true + type: text + - default: 8848 + edit: true + envKey: PANEL_APP_PORT_HTTP + labelEn: Nacos run port + labelZh: Nacos 运行端口 + required: true + rule: paramPort + type: number + - default: 9848 + edit: true + envKey: NACOS_COMMUNICATION_PORT + labelEn: Nacos communication port + labelZh: Nacos 通讯端口 + required: true + rule: paramPort + type: number + - default: "/home/nacos" + edit: true + envKey: NACOS_DATA_ROOT_PATH + labelEn: Nacos root directory of data storage + labelZh: Nacos 数据存储根目录 + required: true + type: text + - default: "" + edit: true + envKey: NACOS_SERVER_IP + labelEn: IP can be specified in multi network card mode + labelZh: 多网卡模式下可以指定IP + required: false + type: text + - default: "2g" + edit: true + envKey: JVM_XMS + labelEn: JVM_XMS + labelZh: JVM_XMS + required: true + type: text + - default: "2g" + edit: true + envKey: JVM_XMX + labelEn: JVM_XMX + labelZh: JVM_XMX + required: true + type: text + - default: "1g" + edit: true + envKey: JVM_XMN + labelEn: JVM_XMN + labelZh: JVM_XMN + required: true + type: text + - default: "128m" + edit: true + envKey: JVM_MS + labelEn: JVM_MS + labelZh: JVM_MS + required: true + type: text + - default: "320m" + edit: true + envKey: JVM_MMS + labelEn: JVM_MMS + labelZh: JVM_MMS + required: true + type: text diff --git a/apps/nacos/2.2.0-derby/docker-compose.yml b/apps/nacos/2.2.0-derby/docker-compose.yml new file mode 100644 index 000000000..7055992c0 --- /dev/null +++ b/apps/nacos/2.2.0-derby/docker-compose.yml @@ -0,0 +1,27 @@ +version: "2" +services: + nacos: + image: nacos/nacos-server:v2.2.0 + container_name: ${CONTAINER_NAME}-standalone + restart: always + environment: + - PREFER_HOST_MODE=hostname + - MODE=standalone + - JVM_XMS=${JVM_XMS} + - JVM_XMX=${JVM_XMX} + - JVM_XMN=${JVM_XMN} + - JVM_MS=${JVM_MS} + - JVM_MMS=${JVM_MMS} + - NACOS_AUTH_IDENTITY_KEY=${NACOS_AUTH_IDENTITY_KEY} + - NACOS_AUTH_IDENTITY_VALUE=${NACOS_AUTH_IDENTITY_VALUE} + - NACOS_AUTH_TOKEN=${NACOS_AUTH_TOKEN} + - NACOS_SERVER_IP=${NACOS_SERVER_IP} + volumes: + - ${NACOS_DATA_ROOT_PATH}/logs:/home/nacos/logs + - ${NACOS_DATA_ROOT_PATH}/data:/home/nacos/data + ports: + - "${PANEL_APP_PORT_HTTP}:8848" + - "${NACOS_COMMUNICATION_PORT}:9848" +networks: + 1panel-network: + external: true diff --git a/apps/nacos/2.2.0-mysql/data.yml b/apps/nacos/2.2.0-mysql/data.yml new file mode 100644 index 000000000..85cce1914 --- /dev/null +++ b/apps/nacos/2.2.0-mysql/data.yml @@ -0,0 +1,156 @@ +additionalProperties: + formFields: + - child: + default: "" + envKey: PANEL_DB_HOST + required: true + type: service + default: mysql + envKey: PANEL_DB_TYPE + labelEn: Database Service + labelZh: 数据库服务 + required: true + type: apps + values: + - label: MySQL + value: mysql + - label: MariaDB + value: mariadb + - default: "serverIdentity" + edit: true + envKey: NACOS_AUTH_IDENTITY_KEY + labelEn: Nacos auth identity key + labelZh: Nacos身份验证密钥键 + required: true + type: text + - default: "security" + edit: true + envKey: NACOS_AUTH_IDENTITY_VALUE + labelEn: Nacos auth identity value + labelZh: Nacos身份验证密钥值 + required: true + type: text + - default: "SecretKey012345678901234567890123456789012345678901234567890123456789" + edit: true + envKey: NACOS_AUTH_TOKEN + labelEn: Nacos auth token + labelZh: Nacos身份验证令牌 + required: true + type: text + - default: 8848 + edit: true + envKey: PANEL_APP_PORT_HTTP + labelEn: Nacos run port + labelZh: Nacos 运行端口 + required: true + rule: paramPort + type: number + - default: 9848 + edit: true + envKey: NACOS_COMMUNICATION_PORT + labelEn: Nacos communication port + labelZh: Nacos 通讯端口 + required: true + rule: paramPort + type: number + - default: "/home/nacos" + edit: true + envKey: NACOS_DATA_ROOT_PATH + labelEn: Nacos root directory of data storage + labelZh: Nacos 数据存储根目录 + required: true + type: text + - default: "" + edit: true + envKey: NACOS_SERVER_IP + labelEn: IP can be specified in multi network card mode + labelZh: 多网卡模式下可以指定IP + required: false + type: text + - default: "mysql" + edit: true + envKey: SPRING_DATASOURCE_PLATFORM + labelEn: Database type + labelZh: 数据库驱动类型 + required: true + type: select + values: + - label: MySQL + value: mysql + - default: "" + edit: true + envKey: MYSQL_SERVICE_HOST + labelEn: Database host IP + labelZh: 数据库主机IP + required: true + type: text + - default: "nacos" + edit: true + envKey: MYSQL_SERVICE_DB_NAME + labelEn: Database Name + labelZh: 数据库名称 + required: true + type: text + - default: 3306 + edit: true + envKey: MYSQL_SERVICE_PORT + labelEn: Database Port + labelZh: 数据库端口 + rule: paramPort + type: number + - default: "nacos" + edit: true + envKey: MYSQL_SERVICE_USER + labelEn: Database Connection Users + labelZh: 数据库连接用户 + required: true + type: text + - default: "nacos" + edit: true + envKey: MYSQL_SERVICE_PASSWORD + labelEn: Database connection password + labelZh: 数据库连接密码 + required: true + type: password + - default: "characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useUnicode=true&useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true" + edit: true + envKey: MYSQL_SERVICE_DB_PARAM + labelEn: Database connection parameters + labelZh: 数据库连接参数 + required: true + type: text + - default: "2g" + edit: true + envKey: JVM_XMS + labelEn: JVM_XMS + labelZh: JVM_XMS + required: true + type: text + - default: "2g" + edit: true + envKey: JVM_XMX + labelEn: JVM_XMX + labelZh: JVM_XMX + required: true + type: text + - default: "1g" + edit: true + envKey: JVM_XMN + labelEn: JVM_XMN + labelZh: JVM_XMN + required: true + type: text + - default: "128m" + edit: true + envKey: JVM_MS + labelEn: JVM_MS + labelZh: JVM_MS + required: true + type: text + - default: "320m" + edit: true + envKey: JVM_MMS + labelEn: JVM_MMS + labelZh: JVM_MMS + required: true + type: text diff --git a/apps/nacos/2.2.0-mysql/derby-schema.sql b/apps/nacos/2.2.0-mysql/derby-schema.sql new file mode 100644 index 000000000..0f8dbbe70 --- /dev/null +++ b/apps/nacos/2.2.0-mysql/derby-schema.sql @@ -0,0 +1,231 @@ +/* + * Copyright 1999-2018 Alibaba Group Holding Ltd. + * + * Licensed 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. + */ + +CREATE SCHEMA nacos AUTHORIZATION nacos; + +CREATE TABLE config_info ( + id bigint NOT NULL generated by default as identity, + data_id varchar(255) NOT NULL, + group_id varchar(128) NOT NULL, + tenant_id varchar(128) default '', + app_name varchar(128), + content CLOB, + md5 varchar(32) DEFAULT NULL, + gmt_create timestamp NOT NULL DEFAULT '2010-05-05 00:00:00', + gmt_modified timestamp NOT NULL DEFAULT '2010-05-05 00:00:00', + src_user varchar(128) DEFAULT NULL, + src_ip varchar(50) DEFAULT NULL, + c_desc varchar(256) DEFAULT NULL, + c_use varchar(64) DEFAULT NULL, + effect varchar(64) DEFAULT NULL, + type varchar(64) DEFAULT NULL, + c_schema LONG VARCHAR DEFAULT NULL, + encrypted_data_key LONG VARCHAR DEFAULT NULL, + constraint configinfo_id_key PRIMARY KEY (id), + constraint uk_configinfo_datagrouptenant UNIQUE (data_id,group_id,tenant_id)); + +CREATE INDEX configinfo_dataid_key_idx ON config_info(data_id); +CREATE INDEX configinfo_groupid_key_idx ON config_info(group_id); +CREATE INDEX configinfo_dataid_group_key_idx ON config_info(data_id, group_id); + +CREATE TABLE his_config_info ( + id bigint NOT NULL, + nid bigint NOT NULL generated by default as identity, + data_id varchar(255) NOT NULL, + group_id varchar(128) NOT NULL, + tenant_id varchar(128) default '', + app_name varchar(128), + content CLOB, + md5 varchar(32) DEFAULT NULL, + gmt_create timestamp NOT NULL DEFAULT '2010-05-05 00:00:00.000', + gmt_modified timestamp NOT NULL DEFAULT '2010-05-05 00:00:00.000', + src_user varchar(128), + src_ip varchar(50) DEFAULT NULL, + op_type char(10) DEFAULT NULL, + encrypted_data_key LONG VARCHAR DEFAULT NULL, + constraint hisconfiginfo_nid_key PRIMARY KEY (nid)); + +CREATE INDEX hisconfiginfo_dataid_key_idx ON his_config_info(data_id); +CREATE INDEX hisconfiginfo_gmt_create_idx ON his_config_info(gmt_create); +CREATE INDEX hisconfiginfo_gmt_modified_idx ON his_config_info(gmt_modified); + + +CREATE TABLE config_info_beta ( + id bigint NOT NULL generated by default as identity, + data_id varchar(255) NOT NULL, + group_id varchar(128) NOT NULL, + tenant_id varchar(128) default '', + app_name varchar(128), + content CLOB, + beta_ips varchar(1024), + md5 varchar(32) DEFAULT NULL, + gmt_create timestamp NOT NULL DEFAULT '2010-05-05 00:00:00', + gmt_modified timestamp NOT NULL DEFAULT '2010-05-05 00:00:00', + src_user varchar(128), + src_ip varchar(50) DEFAULT NULL, + encrypted_data_key LONG VARCHAR DEFAULT NULL, + constraint configinfobeta_id_key PRIMARY KEY (id), + constraint uk_configinfobeta_datagrouptenant UNIQUE (data_id,group_id,tenant_id)); + +CREATE TABLE config_info_tag ( + id bigint NOT NULL generated by default as identity, + data_id varchar(255) NOT NULL, + group_id varchar(128) NOT NULL, + tenant_id varchar(128) default '', + tag_id varchar(128) NOT NULL, + app_name varchar(128), + content CLOB, + md5 varchar(32) DEFAULT NULL, + gmt_create timestamp NOT NULL DEFAULT '2010-05-05 00:00:00', + gmt_modified timestamp NOT NULL DEFAULT '2010-05-05 00:00:00', + src_user varchar(128), + src_ip varchar(50) DEFAULT NULL, + constraint configinfotag_id_key PRIMARY KEY (id), + constraint uk_configinfotag_datagrouptenanttag UNIQUE (data_id,group_id,tenant_id,tag_id)); + +CREATE TABLE config_info_aggr ( + id bigint NOT NULL generated by default as identity, + data_id varchar(255) NOT NULL, + group_id varchar(128) NOT NULL, + tenant_id varchar(128) default '', + datum_id varchar(255) NOT NULL, + app_name varchar(128), + content CLOB, + gmt_modified timestamp NOT NULL DEFAULT '2010-05-05 00:00:00', + constraint configinfoaggr_id_key PRIMARY KEY (id), + constraint uk_configinfoaggr_datagrouptenantdatum UNIQUE (data_id,group_id,tenant_id,datum_id)); + +CREATE TABLE app_list ( + id bigint NOT NULL generated by default as identity, + app_name varchar(128) NOT NULL, + is_dynamic_collect_disabled smallint DEFAULT 0, + last_sub_info_collected_time timestamp DEFAULT '1970-01-01 08:00:00.0', + sub_info_lock_owner varchar(128), + sub_info_lock_time timestamp DEFAULT '1970-01-01 08:00:00.0', + constraint applist_id_key PRIMARY KEY (id), + constraint uk_appname UNIQUE (app_name)); + +CREATE TABLE app_configdata_relation_subs ( + id bigint NOT NULL generated by default as identity, + app_name varchar(128) NOT NULL, + data_id varchar(255) NOT NULL, + group_id varchar(128) NOT NULL, + gmt_modified timestamp DEFAULT '2010-05-05 00:00:00', + constraint configdatarelationsubs_id_key PRIMARY KEY (id), + constraint uk_app_sub_config_datagroup UNIQUE (app_name, data_id, group_id)); + + +CREATE TABLE app_configdata_relation_pubs ( + id bigint NOT NULL generated by default as identity, + app_name varchar(128) NOT NULL, + data_id varchar(255) NOT NULL, + group_id varchar(128) NOT NULL, + gmt_modified timestamp DEFAULT '2010-05-05 00:00:00', + constraint configdatarelationpubs_id_key PRIMARY KEY (id), + constraint uk_app_pub_config_datagroup UNIQUE (app_name, data_id, group_id)); + +CREATE TABLE config_tags_relation ( + id bigint NOT NULL, + tag_name varchar(128) NOT NULL, + tag_type varchar(64) DEFAULT NULL, + data_id varchar(255) NOT NULL, + group_id varchar(128) NOT NULL, + tenant_id varchar(128) DEFAULT '', + nid bigint NOT NULL generated by default as identity, + constraint config_tags_id_key PRIMARY KEY (nid), + constraint uk_configtagrelation_configidtag UNIQUE (id, tag_name, tag_type)); + +CREATE INDEX config_tags_tenant_id_idx ON config_tags_relation(tenant_id); + +CREATE TABLE group_capacity ( + id bigint NOT NULL generated by default as identity, + group_id varchar(128) DEFAULT '', + quota int DEFAULT 0, + usage int DEFAULT 0, + max_size int DEFAULT 0, + max_aggr_count int DEFAULT 0, + max_aggr_size int DEFAULT 0, + max_history_count int DEFAULT 0, + gmt_create timestamp DEFAULT '2010-05-05 00:00:00', + gmt_modified timestamp DEFAULT '2010-05-05 00:00:00', + constraint group_capacity_id_key PRIMARY KEY (id), + constraint uk_group_id UNIQUE (group_id)); + +CREATE TABLE tenant_capacity ( + id bigint NOT NULL generated by default as identity, + tenant_id varchar(128) DEFAULT '', + quota int DEFAULT 0, + usage int DEFAULT 0, + max_size int DEFAULT 0, + max_aggr_count int DEFAULT 0, + max_aggr_size int DEFAULT 0, + max_history_count int DEFAULT 0, + gmt_create timestamp DEFAULT '2010-05-05 00:00:00', + gmt_modified timestamp DEFAULT '2010-05-05 00:00:00', + constraint tenant_capacity_id_key PRIMARY KEY (id), + constraint uk_tenant_id UNIQUE (tenant_id)); + +CREATE TABLE tenant_info ( + id bigint NOT NULL generated by default as identity, + kp varchar(128) NOT NULL, + tenant_id varchar(128) DEFAULT '', + tenant_name varchar(128) DEFAULT '', + tenant_desc varchar(256) DEFAULT NULL, + create_source varchar(32) DEFAULT NULL, + gmt_create bigint NOT NULL, + gmt_modified bigint NOT NULL, + constraint tenant_info_id_key PRIMARY KEY (id), + constraint uk_tenant_info_kptenantid UNIQUE (kp,tenant_id)); +CREATE INDEX tenant_info_tenant_id_idx ON tenant_info(tenant_id); + +CREATE TABLE users ( + username varchar(50) NOT NULL PRIMARY KEY, + password varchar(500) NOT NULL, + enabled boolean NOT NULL DEFAULT true +); + +CREATE TABLE roles ( + username varchar(50) NOT NULL, + role varchar(50) NOT NULL, + constraint uk_username_role UNIQUE (username,role) +); + +CREATE TABLE permissions ( + role varchar(50) NOT NULL, + resource varchar(512) NOT NULL, + action varchar(8) NOT NULL, + constraint uk_role_permission UNIQUE (role,resource,action) +); + +INSERT INTO users (username, password, enabled) VALUES ('nacos', '$2a$10$EuWPZHzz32dJN7jexM34MOeYirDdFAZm2kuWj7VEOJhhZkDrxfvUu', TRUE); + +INSERT INTO roles (username, role) VALUES ('nacos', 'ROLE_ADMIN'); + + +/******************************************/ +/* ipv6 support */ +/******************************************/ +ALTER TABLE `config_info_tag` +MODIFY COLUMN `src_ip` varchar(50) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL COMMENT 'source ip' AFTER `src_user`; + +ALTER TABLE `his_config_info` +MODIFY COLUMN `src_ip` varchar(50) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL AFTER `src_user`; + +ALTER TABLE `config_info` +MODIFY COLUMN `src_ip` varchar(50) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL COMMENT 'source ip' AFTER `src_user`; + +ALTER TABLE `config_info_beta` +MODIFY COLUMN `src_ip` varchar(50) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL COMMENT 'source ip' AFTER `src_user`; \ No newline at end of file diff --git a/apps/nacos/2.2.0-mysql/docker-compose.yml b/apps/nacos/2.2.0-mysql/docker-compose.yml new file mode 100644 index 000000000..956ebb5b3 --- /dev/null +++ b/apps/nacos/2.2.0-mysql/docker-compose.yml @@ -0,0 +1,32 @@ +version: "2" +services: + nacos: + image: nacos/nacos-server:v2.2.0 + container_name: ${CONTAINER_NAME}-mysql + restart: always + environment: + - PREFER_HOST_MODE=hostname + - MODE=standalone + - JVM_XMS=${JVM_XMS} + - JVM_XMX=${JVM_XMX} + - JVM_XMN=${JVM_XMN} + - JVM_MS=${JVM_MS} + - JVM_MMS=${JVM_MMS} + - NACOS_AUTH_IDENTITY_KEY=${NACOS_AUTH_IDENTITY_KEY} + - NACOS_AUTH_IDENTITY_VALUE=${NACOS_AUTH_IDENTITY_VALUE} + - NACOS_AUTH_TOKEN=${NACOS_AUTH_TOKEN} + - NACOS_SERVER_IP=${NACOS_SERVER_IP} + - SPRING_DATASOURCE_PLATFORM=${SPRING_DATASOURCE_PLATFORM} + - MYSQL_SERVICE_HOST=${MYSQL_SERVICE_HOST} + - MYSQL_SERVICE_PORT=${MYSQL_SERVICE_PORT} + - MYSQL_SERVICE_USER=${MYSQL_SERVICE_USER} + - MYSQL_SERVICE_PASSWORD=${MYSQL_SERVICE_PASSWORD} + - MYSQL_SERVICE_DB_NAME=${MYSQL_SERVICE_DB_NAME} + volumes: + - ./log/standalone-logs/:/home/nacos/logs + ports: + - "${PANEL_APP_PORT_HTTP}:8848" + - "${NACOS_COMMUNICATION_PORT}:9848" +networks: + 1panel-network: + external: true diff --git a/apps/nacos/2.2.0-mysql/mysql-schema.sql b/apps/nacos/2.2.0-mysql/mysql-schema.sql new file mode 100644 index 000000000..146626488 --- /dev/null +++ b/apps/nacos/2.2.0-mysql/mysql-schema.sql @@ -0,0 +1,221 @@ +/* + * Copyright 1999-2018 Alibaba Group Holding Ltd. + * + * Licensed 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. + */ + +/******************************************/ +/* 数据库全名 = nacos_config */ +/* 表名称 = config_info */ +/******************************************/ +CREATE TABLE `config_info` ( + `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'id', + `data_id` varchar(255) NOT NULL COMMENT 'data_id', + `group_id` varchar(128) DEFAULT NULL, + `content` longtext NOT NULL COMMENT 'content', + `md5` varchar(32) DEFAULT NULL COMMENT 'md5', + `gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '修改时间', + `src_user` text COMMENT 'source user', + `src_ip` varchar(50) DEFAULT NULL COMMENT 'source ip', + `app_name` varchar(128) DEFAULT NULL, + `tenant_id` varchar(128) DEFAULT '' COMMENT '租户字段', + `c_desc` varchar(256) DEFAULT NULL, + `c_use` varchar(64) DEFAULT NULL, + `effect` varchar(64) DEFAULT NULL, + `type` varchar(64) DEFAULT NULL, + `c_schema` text, + `encrypted_data_key` text NOT NULL COMMENT '秘钥', + PRIMARY KEY (`id`), + UNIQUE KEY `uk_configinfo_datagrouptenant` (`data_id`,`group_id`,`tenant_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='config_info'; + +/******************************************/ +/* 数据库全名 = nacos_config */ +/* 表名称 = config_info_aggr */ +/******************************************/ +CREATE TABLE `config_info_aggr` ( + `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'id', + `data_id` varchar(255) NOT NULL COMMENT 'data_id', + `group_id` varchar(128) NOT NULL COMMENT 'group_id', + `datum_id` varchar(255) NOT NULL COMMENT 'datum_id', + `content` longtext NOT NULL COMMENT '内容', + `gmt_modified` datetime NOT NULL COMMENT '修改时间', + `app_name` varchar(128) DEFAULT NULL, + `tenant_id` varchar(128) DEFAULT '' COMMENT '租户字段', + PRIMARY KEY (`id`), + UNIQUE KEY `uk_configinfoaggr_datagrouptenantdatum` (`data_id`,`group_id`,`tenant_id`,`datum_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='增加租户字段'; + + +/******************************************/ +/* 数据库全名 = nacos_config */ +/* 表名称 = config_info_beta */ +/******************************************/ +CREATE TABLE `config_info_beta` ( + `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'id', + `data_id` varchar(255) NOT NULL COMMENT 'data_id', + `group_id` varchar(128) NOT NULL COMMENT 'group_id', + `app_name` varchar(128) DEFAULT NULL COMMENT 'app_name', + `content` longtext NOT NULL COMMENT 'content', + `beta_ips` varchar(1024) DEFAULT NULL COMMENT 'betaIps', + `md5` varchar(32) DEFAULT NULL COMMENT 'md5', + `gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '修改时间', + `src_user` text COMMENT 'source user', + `src_ip` varchar(50) DEFAULT NULL COMMENT 'source ip', + `tenant_id` varchar(128) DEFAULT '' COMMENT '租户字段', + `encrypted_data_key` text NOT NULL COMMENT '秘钥', + PRIMARY KEY (`id`), + UNIQUE KEY `uk_configinfobeta_datagrouptenant` (`data_id`,`group_id`,`tenant_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='config_info_beta'; + +/******************************************/ +/* 数据库全名 = nacos_config */ +/* 表名称 = config_info_tag */ +/******************************************/ +CREATE TABLE `config_info_tag` ( + `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'id', + `data_id` varchar(255) NOT NULL COMMENT 'data_id', + `group_id` varchar(128) NOT NULL COMMENT 'group_id', + `tenant_id` varchar(128) DEFAULT '' COMMENT 'tenant_id', + `tag_id` varchar(128) NOT NULL COMMENT 'tag_id', + `app_name` varchar(128) DEFAULT NULL COMMENT 'app_name', + `content` longtext NOT NULL COMMENT 'content', + `md5` varchar(32) DEFAULT NULL COMMENT 'md5', + `gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '修改时间', + `src_user` text COMMENT 'source user', + `src_ip` varchar(50) DEFAULT NULL COMMENT 'source ip', + PRIMARY KEY (`id`), + UNIQUE KEY `uk_configinfotag_datagrouptenanttag` (`data_id`,`group_id`,`tenant_id`,`tag_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='config_info_tag'; + +/******************************************/ +/* 数据库全名 = nacos_config */ +/* 表名称 = config_tags_relation */ +/******************************************/ +CREATE TABLE `config_tags_relation` ( + `id` bigint(20) NOT NULL COMMENT 'id', + `tag_name` varchar(128) NOT NULL COMMENT 'tag_name', + `tag_type` varchar(64) DEFAULT NULL COMMENT 'tag_type', + `data_id` varchar(255) NOT NULL COMMENT 'data_id', + `group_id` varchar(128) NOT NULL COMMENT 'group_id', + `tenant_id` varchar(128) DEFAULT '' COMMENT 'tenant_id', + `nid` bigint(20) NOT NULL AUTO_INCREMENT, + PRIMARY KEY (`nid`), + UNIQUE KEY `uk_configtagrelation_configidtag` (`id`,`tag_name`,`tag_type`), + KEY `idx_tenant_id` (`tenant_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='config_tag_relation'; + +/******************************************/ +/* 数据库全名 = nacos_config */ +/* 表名称 = group_capacity */ +/******************************************/ +CREATE TABLE `group_capacity` ( + `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键ID', + `group_id` varchar(128) NOT NULL DEFAULT '' COMMENT 'Group ID,空字符表示整个集群', + `quota` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '配额,0表示使用默认值', + `usage` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '使用量', + `max_size` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '单个配置大小上限,单位为字节,0表示使用默认值', + `max_aggr_count` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '聚合子配置最大个数,,0表示使用默认值', + `max_aggr_size` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '单个聚合数据的子配置大小上限,单位为字节,0表示使用默认值', + `max_history_count` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '最大变更历史数量', + `gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '修改时间', + PRIMARY KEY (`id`), + UNIQUE KEY `uk_group_id` (`group_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='集群、各Group容量信息表'; + +/******************************************/ +/* 数据库全名 = nacos_config */ +/* 表名称 = his_config_info */ +/******************************************/ +CREATE TABLE `his_config_info` ( + `id` bigint(20) unsigned NOT NULL, + `nid` bigint(20) unsigned NOT NULL AUTO_INCREMENT, + `data_id` varchar(255) NOT NULL, + `group_id` varchar(128) NOT NULL, + `app_name` varchar(128) DEFAULT NULL COMMENT 'app_name', + `content` longtext NOT NULL, + `md5` varchar(32) DEFAULT NULL, + `gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, + `gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, + `src_user` text, + `src_ip` varchar(50) DEFAULT NULL, + `op_type` char(10) DEFAULT NULL, + `tenant_id` varchar(128) DEFAULT '' COMMENT '租户字段', + `encrypted_data_key` text NOT NULL COMMENT '秘钥', + PRIMARY KEY (`nid`), + KEY `idx_gmt_create` (`gmt_create`), + KEY `idx_gmt_modified` (`gmt_modified`), + KEY `idx_did` (`data_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='多租户改造'; + + +/******************************************/ +/* 数据库全名 = nacos_config */ +/* 表名称 = tenant_capacity */ +/******************************************/ +CREATE TABLE `tenant_capacity` ( + `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键ID', + `tenant_id` varchar(128) NOT NULL DEFAULT '' COMMENT 'Tenant ID', + `quota` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '配额,0表示使用默认值', + `usage` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '使用量', + `max_size` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '单个配置大小上限,单位为字节,0表示使用默认值', + `max_aggr_count` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '聚合子配置最大个数', + `max_aggr_size` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '单个聚合数据的子配置大小上限,单位为字节,0表示使用默认值', + `max_history_count` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '最大变更历史数量', + `gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '修改时间', + PRIMARY KEY (`id`), + UNIQUE KEY `uk_tenant_id` (`tenant_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='租户容量信息表'; + + +CREATE TABLE `tenant_info` ( + `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'id', + `kp` varchar(128) NOT NULL COMMENT 'kp', + `tenant_id` varchar(128) default '' COMMENT 'tenant_id', + `tenant_name` varchar(128) default '' COMMENT 'tenant_name', + `tenant_desc` varchar(256) DEFAULT NULL COMMENT 'tenant_desc', + `create_source` varchar(32) DEFAULT NULL COMMENT 'create_source', + `gmt_create` bigint(20) NOT NULL COMMENT '创建时间', + `gmt_modified` bigint(20) NOT NULL COMMENT '修改时间', + PRIMARY KEY (`id`), + UNIQUE KEY `uk_tenant_info_kptenantid` (`kp`,`tenant_id`), + KEY `idx_tenant_id` (`tenant_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='tenant_info'; + +CREATE TABLE `users` ( + `username` varchar(50) NOT NULL PRIMARY KEY, + `password` varchar(500) NOT NULL, + `enabled` boolean NOT NULL +); + +CREATE TABLE `roles` ( + `username` varchar(50) NOT NULL, + `role` varchar(50) NOT NULL, + UNIQUE INDEX `idx_user_role` (`username` ASC, `role` ASC) USING BTREE +); + +CREATE TABLE `permissions` ( + `role` varchar(50) NOT NULL, + `resource` varchar(255) NOT NULL, + `action` varchar(8) NOT NULL, + UNIQUE INDEX `uk_role_permission` (`role`,`resource`,`action`) USING BTREE +); + +INSERT INTO users (username, password, enabled) VALUES ('nacos', '$2a$10$EuWPZHzz32dJN7jexM34MOeYirDdFAZm2kuWj7VEOJhhZkDrxfvUu', TRUE); + +INSERT INTO roles (username, role) VALUES ('nacos', 'ROLE_ADMIN'); diff --git a/apps/nacos/README.md b/apps/nacos/README.md new file mode 100644 index 000000000..5df940eb5 --- /dev/null +++ b/apps/nacos/README.md @@ -0,0 +1,89 @@ +# Nacos + +Nacos `/nɑ:kəʊs/` 是 Dynamic Naming and Configuration Service的首字母简称,一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。 + +Nacos 致力于帮助您发现、配置和管理微服务。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据及流量管理。 + +Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。 Nacos 是构建以“服务”为中心的现代应用架构 ( +例如微服务范式、云原生范式) 的服务基础设施。 + +## 快速启动 + +访问地址 +`http://IP:8848/nacos` + +> 用户名 +> nacos +> +> 密码 +> nacos + +## Nacos 的关键特性 + +### 服务发现和服务健康监测 + +Nacos 支持基于 DNS 和基于 RPC 的服务发现。服务提供者使用 原生SDK、OpenAPI、或一个独立的Agent TODO注册 Service +后,服务消费者可以使用DNS TODO 或HTTP&API查找和发现服务。 + +Nacos 提供对服务的实时的健康检查,阻止向不健康的主机或服务实例发送请求。Nacos 支持传输层 (PING 或 TCP)和应用层 (如 +HTTP、MySQL、用户自定义)的健康检查。 对于复杂的云环境和网络拓扑环境中(如 VPC、边缘网络等)服务的健康检查,Nacos 提供了 agent +上报模式和服务端主动检测2种健康检查模式。Nacos 还提供了统一的健康检查仪表盘,帮助您根据健康状态管理服务的可用性及流量。 + +### 动态配置服务 + +动态配置服务可以让您以中心化、外部化和动态化的方式管理所有环境的应用配置和服务配置。 + +动态配置消除了配置变更时重新部署应用和服务的需要,让配置管理变得更加高效和敏捷。 + +配置中心化管理让实现无状态服务变得更简单,让服务按需弹性扩展变得更容易。 + +Nacos 提供了一个简洁易用的UI (控制台样例 Demo) 帮助您管理所有的服务和应用的配置。Nacos +还提供包括配置版本跟踪、金丝雀发布、一键回滚配置以及客户端配置更新状态跟踪在内的一系列开箱即用的配置管理特性,帮助您更安全地在生产环境中管理配置变更和降低配置变更带来的风险。 + +### 动态 DNS 服务 + +动态 DNS 服务支持权重路由,让您更容易地实现中间层负载均衡、更灵活的路由策略、流量控制以及数据中心内网的简单DNS解析服务。动态DNS服务还能让您更容易地实现以 +DNS 协议为基础的服务发现,以帮助您消除耦合到厂商私有服务发现 API 上的风险。 + +Nacos 提供了一些简单的 DNS APIs TODO 帮助您管理服务的关联域名和可用的 IP 列表. + +### 服务及其元数据管理 + +Nacos 能让您从微服务平台建设的视角管理数据中心的所有服务及元数据,包括管理服务的描述、生命周期、服务的静态依赖分析、服务的健康状态、服务的流量管理、路由及安全策略、服务的 +SLA 以及最首要的 metrics 统计数据。 + +## 版本说明 + +### 2.2.0-derby + +derby 单机模式 + +数据存于本地文件目录 +`/home/nacos` + +### 2.2.0-mysql + +derby 单机模式 + mysql +数据存于mysql + +#### 数据库初始化 + +下载数据库文件 `mysql-schema.sql` + +[https://github.com/alibaba/nacos/tree/develop/distribution/conf](https://github.com/alibaba/nacos/tree/develop/distribution/conf) + +导入数据文件 `mysql-schema.sql` 或通过工具导入/执行语句 + +```shell +mysql -uroot -p123456 -h127.0.0.1 -P3306 nacos < mysql-schema.sql +``` + +## 参数调优 + +```shell +- JVM_XMS=64m #-Xms default :2g +- JVM_XMX=64m #-Xmx default :2g +- JVM_XMN=16m #-Xmn default :1g +- JVM_MS=8m #-XX:MetaspaceSize default :128m +- JVM_MMS=8m #-XX:MaxMetaspaceSize default :320m +``` diff --git a/apps/nacos/data.yml b/apps/nacos/data.yml new file mode 100644 index 000000000..8011019f0 --- /dev/null +++ b/apps/nacos/data.yml @@ -0,0 +1,19 @@ +name: Nacos +tags: + - 中间件 +title: Nacos +type: 中间件 +description: 动态服务发现、配置管理和服务管理平台 +additionalProperties: + key: nacos + name: Nacos + tags: + - Middleware + shortDescZh: 动态命名和配置服务 + shortDescEn: Dynamic Naming and Configuration Service + type: runtime + crossVersionUpdate: false + limit: 1 + website: https://nacos.io/ + github: https://github.com/alibaba/nacos + document: https://github.com/alibaba/nacos/blob/develop/README.md diff --git a/apps/nacos/logo.png b/apps/nacos/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..33270c30e3504acbddcc93eed4ac84d5f781fdb7 GIT binary patch literal 12708 zcmV;VFPx#32;bRa{vGqB>(^xB>_oNB=7(L03=XMR7L;)|1K~z z9p3jT#ri*#|23-pKal#>p{&dbg_c}lQ1ONa40000000000000000000000000000000000000000 z00000000000000000000000000000000000000000000000000000000000000000 z00000000000000000000000000000000000000000000000000000000000000000 z00000000000000000000000000000000000000000000000000000000000000000 z00000000000000000000000000000000000000000000000000000000000000000 z00000000000000000000000000000000000000000000000000000000000000000 z00000000000000000000000000000000000000000000x;^=rjKP~6;`O(q6f9a#@ z%cj51=VwQ*1Fi4oNU(RRu_7gjvpJd}oco>gg z%;SHnNAKQ$zLS|7dACwkUB6FnH~riDqbtmY{A(_n=lK41d#N~`)QX}gr$t##r_<`Q zmuL4yt^#VXFHI|zb^Vu^L+~$ zIc^))>Y=Khs!ys^ZnZ|9WNDSix;!>Qovh1cv{deIlt`J}%}8z<%Key^cr}t+ z2<6dfRU<>!8Vcm32)UfLb+UTfUI&}ZtA@31S+llrU8$3`;a~dw#YiR}yAS;f^X;KC zxqs=F`WE-wJr3*0Y4cDlRf!C#tU_7Nx7D_e^JN^l*wIk zF#O6y%w%%KtNhoPmFl#~Vp}Jh-nA){?XagQmD^ZV&hv4eg-EWJ$+k{*sT@)&_s>T% z`S`7c;Mv1w^34^`bQte$*$d0aFmG+LxhR!Y65Bdi7s@THDwC5ciCLbfy*k;9UB_AT zVR-+#e=(BDCs!snx-{`Jd2r?3@;r9mT6eDP#C2IFLoP$>8XnGKN3x#n)HSkwU#*i_ z^*|_iaS7>s}YJ zTtu?2lIeg@Cg&rWdZ>~*eT?pjQi8zJ?FX}g?^*}f)u z(B*QuAJXlG)O9jlYhNS&@MQ8aPhEqL50uH|hV{_kLb*3tv0PBDY*Ds#vWyza=Aqml$>dXAPHr;giImBkUg?LfD3g^uhDfe1D8tdZa1^~< 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 用户名 +> 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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