From ee6bfd966314e9c4e10518088a7276e1ca07e112 Mon Sep 17 00:00:00 2001 From: QYG2297248353 Date: Mon, 28 Jul 2025 04:07:03 +0000 Subject: [PATCH] Processed apps directory via GitHub Actions --- appstore/metatube-server-memory/1.3.1/.env | 15 ++ .../metatube-server-memory/1.3.1/data.yml | 47 ++++++ .../1.3.1/docker-compose.yml | 20 +++ .../1.3.1}/envs/default.env | 0 .../1.3.1}/envs/global.env | 0 .../1.3.1}/scripts/init.sh | 0 .../1.3.1}/scripts/uninstall.sh | 0 .../1.3.1}/scripts/upgrade.sh | 0 appstore/metatube-server-memory/README.md | 87 ++++++++++ appstore/metatube-server-memory/data.yml | 15 ++ appstore/metatube-server-memory/logo.png | Bin 0 -> 81365 bytes appstore/openpanel/25.6.5.41-alpine/.env | 51 ++++++ .../config/clickhouse-config.xml | 29 ++++ .../config/clickhouse-user-config.xml | 8 + .../25.6.5.41-alpine/config/init-db.sh | 6 + appstore/openpanel/25.6.5.41-alpine/data.yml | 148 ++++++++++++++++++ .../25.6.5.41-alpine/docker-compose.yml | 41 +++++ .../25.6.5.41-alpine}/envs/default.env | 0 .../25.6.5.41-alpine}/envs/global.env | 0 .../25.6.5.41-alpine/scripts/init.sh | 22 +++ .../25.6.5.41-alpine}/scripts/uninstall.sh | 0 .../25.6.5.41-alpine}/scripts/upgrade.sh | 0 appstore/openpanel/README.md | 50 ++++++ appstore/openpanel/data.yml | 14 ++ appstore/openpanel/logo.png | Bin 0 -> 11061 bytes appstore/umami-mysql/{2.18.1 => 2.19.0}/.env | 0 .../umami-mysql/{2.18.1 => 2.19.0}/data.yml | 0 .../{2.18.1 => 2.19.0}/docker-compose.yml | 2 +- .../umami-mysql/2.19.0}/envs/default.env | 0 .../umami-mysql/2.19.0}/envs/global.env | 0 .../2.19.0}/scripts/init.sh | 0 .../umami-mysql/2.19.0/scripts/uninstall.sh | 10 ++ .../umami-mysql/2.19.0/scripts/upgrade.sh | 17 ++ appstore/umami/{2.18.1 => 2.19.0}/.env | 0 appstore/umami/{2.18.1 => 2.19.0}/data.yml | 0 .../{2.18.1 => 2.19.0}/docker-compose.yml | 2 +- .../umami/2.19.0}/envs/default.env | 0 .../umami/2.19.0}/envs/global.env | 0 appstore/umami/2.19.0/scripts/init.sh | 17 ++ appstore/umami/2.19.0/scripts/uninstall.sh | 10 ++ appstore/umami/2.19.0/scripts/upgrade.sh | 17 ++ dockge/metatube-server-memory/.env | 15 ++ .../metatube-server-memory/docker-compose.yml | 20 +++ .../metatube-server-memory/envs/default.env | 2 + dockge/metatube-server-memory/envs/global.env | 2 + dockge/openpanel/.env | 51 ++++++ dockge/openpanel/config/clickhouse-config.xml | 29 ++++ .../config/clickhouse-user-config.xml | 8 + dockge/openpanel/config/init-db.sh | 6 + dockge/openpanel/docker-compose.yml | 41 +++++ dockge/openpanel/envs/default.env | 2 + dockge/openpanel/envs/global.env | 2 + dockge/umami-mysql/docker-compose.yml | 2 +- .../.env | 0 .../docker-compose.yml | 2 +- dockge/umami-mysql_2_16_0/envs/default.env | 2 + dockge/umami-mysql_2_16_0/envs/global.env | 2 + dockge/umami/docker-compose.yml | 2 +- dockge/{umami_2_18_1 => umami_2_16_0}/.env | 0 .../docker-compose.yml | 2 +- dockge/umami_2_16_0/envs/default.env | 2 + dockge/umami_2_16_0/envs/global.env | 2 + 62 files changed, 816 insertions(+), 6 deletions(-) create mode 100644 appstore/metatube-server-memory/1.3.1/.env create mode 100644 appstore/metatube-server-memory/1.3.1/data.yml create mode 100644 appstore/metatube-server-memory/1.3.1/docker-compose.yml rename appstore/{umami-mysql/2.18.1 => metatube-server-memory/1.3.1}/envs/default.env (100%) rename appstore/{umami-mysql/2.18.1 => metatube-server-memory/1.3.1}/envs/global.env (100%) rename appstore/{umami-mysql/2.18.1 => metatube-server-memory/1.3.1}/scripts/init.sh (100%) rename appstore/{umami-mysql/2.18.1 => metatube-server-memory/1.3.1}/scripts/uninstall.sh (100%) rename appstore/{umami-mysql/2.18.1 => metatube-server-memory/1.3.1}/scripts/upgrade.sh (100%) create mode 100644 appstore/metatube-server-memory/README.md create mode 100644 appstore/metatube-server-memory/data.yml create mode 100644 appstore/metatube-server-memory/logo.png create mode 100644 appstore/openpanel/25.6.5.41-alpine/.env create mode 100644 appstore/openpanel/25.6.5.41-alpine/config/clickhouse-config.xml create mode 100644 appstore/openpanel/25.6.5.41-alpine/config/clickhouse-user-config.xml create mode 100644 appstore/openpanel/25.6.5.41-alpine/config/init-db.sh create mode 100644 appstore/openpanel/25.6.5.41-alpine/data.yml create mode 100644 appstore/openpanel/25.6.5.41-alpine/docker-compose.yml rename appstore/{umami/2.18.1 => openpanel/25.6.5.41-alpine}/envs/default.env (100%) rename appstore/{umami/2.18.1 => openpanel/25.6.5.41-alpine}/envs/global.env (100%) create mode 100644 appstore/openpanel/25.6.5.41-alpine/scripts/init.sh rename appstore/{umami/2.18.1 => openpanel/25.6.5.41-alpine}/scripts/uninstall.sh (100%) rename appstore/{umami/2.18.1 => openpanel/25.6.5.41-alpine}/scripts/upgrade.sh (100%) create mode 100644 appstore/openpanel/README.md create mode 100644 appstore/openpanel/data.yml create mode 100644 appstore/openpanel/logo.png rename appstore/umami-mysql/{2.18.1 => 2.19.0}/.env (100%) rename appstore/umami-mysql/{2.18.1 => 2.19.0}/data.yml (100%) rename appstore/umami-mysql/{2.18.1 => 2.19.0}/docker-compose.yml (91%) rename {dockge/umami-mysql_2_18_1 => appstore/umami-mysql/2.19.0}/envs/default.env (100%) rename {dockge/umami-mysql_2_18_1 => appstore/umami-mysql/2.19.0}/envs/global.env (100%) rename appstore/{umami/2.18.1 => umami-mysql/2.19.0}/scripts/init.sh (100%) create mode 100644 appstore/umami-mysql/2.19.0/scripts/uninstall.sh create mode 100644 appstore/umami-mysql/2.19.0/scripts/upgrade.sh rename appstore/umami/{2.18.1 => 2.19.0}/.env (100%) rename appstore/umami/{2.18.1 => 2.19.0}/data.yml (100%) rename appstore/umami/{2.18.1 => 2.19.0}/docker-compose.yml (90%) rename {dockge/umami_2_18_1 => appstore/umami/2.19.0}/envs/default.env (100%) rename {dockge/umami_2_18_1 => appstore/umami/2.19.0}/envs/global.env (100%) create mode 100644 appstore/umami/2.19.0/scripts/init.sh create mode 100644 appstore/umami/2.19.0/scripts/uninstall.sh create mode 100644 appstore/umami/2.19.0/scripts/upgrade.sh create mode 100644 dockge/metatube-server-memory/.env create mode 100644 dockge/metatube-server-memory/docker-compose.yml create mode 100644 dockge/metatube-server-memory/envs/default.env create mode 100644 dockge/metatube-server-memory/envs/global.env create mode 100644 dockge/openpanel/.env create mode 100644 dockge/openpanel/config/clickhouse-config.xml create mode 100644 dockge/openpanel/config/clickhouse-user-config.xml create mode 100644 dockge/openpanel/config/init-db.sh create mode 100644 dockge/openpanel/docker-compose.yml create mode 100644 dockge/openpanel/envs/default.env create mode 100644 dockge/openpanel/envs/global.env rename dockge/{umami-mysql_2_18_1 => umami-mysql_2_16_0}/.env (100%) rename dockge/{umami-mysql_2_18_1 => umami-mysql_2_16_0}/docker-compose.yml (91%) create mode 100644 dockge/umami-mysql_2_16_0/envs/default.env create mode 100644 dockge/umami-mysql_2_16_0/envs/global.env rename dockge/{umami_2_18_1 => umami_2_16_0}/.env (100%) rename dockge/{umami_2_18_1 => umami_2_16_0}/docker-compose.yml (90%) create mode 100644 dockge/umami_2_16_0/envs/default.env create mode 100644 dockge/umami_2_16_0/envs/global.env diff --git a/appstore/metatube-server-memory/1.3.1/.env b/appstore/metatube-server-memory/1.3.1/.env new file mode 100644 index 000000000..eeec6f970 --- /dev/null +++ b/appstore/metatube-server-memory/1.3.1/.env @@ -0,0 +1,15 @@ +# 网络模式 [必填] +NETWORK_MODE=1panel-network + +# WebUI 端口 [必填] +PANEL_APP_PORT_HTTP=8080 + +# 访问令牌 [必填] +TOKEN= + +# 请求超时时间 [必填] +REQUEST_TIMEOUT=1m + +# 网络代理 (HTTP/Socket5) +HTTP_PROXY= + diff --git a/appstore/metatube-server-memory/1.3.1/data.yml b/appstore/metatube-server-memory/1.3.1/data.yml new file mode 100644 index 000000000..80552a017 --- /dev/null +++ b/appstore/metatube-server-memory/1.3.1/data.yml @@ -0,0 +1,47 @@ +additionalProperties: + formFields: + - default: "1panel-network" + edit: true + envKey: NETWORK_MODE + labelZh: 网络模式 + labelEn: Network mode + required: true + type: select + values: + - label: 主机网络模式 + value: "host" + - label: 桥接网络模式 + value: "bridge" + - label: 无网络模式 + value: "none" + - label: 1panel-network + value: "1panel-network" + - default: 8080 + edit: true + envKey: PANEL_APP_PORT_HTTP + labelZh: WebUI 端口 + labelEn: WebUI port + required: true + rule: paramPort + type: number + - default: "" + edit: true + envKey: TOKEN + labelZh: 访问令牌 + labelEn: Access Token + required: true + type: password + - default: "1m" + edit: true + envKey: REQUEST_TIMEOUT + labelZh: 请求超时时间 + labelEn: Request Timeout + required: true + type: text + - default: "" + edit: true + envKey: HTTP_PROXY + labelZh: 网络代理 (HTTP/Socket5) + labelEn: Network Proxy (HTTP/Socket5) + required: false + type: text diff --git a/appstore/metatube-server-memory/1.3.1/docker-compose.yml b/appstore/metatube-server-memory/1.3.1/docker-compose.yml new file mode 100644 index 000000000..d77daeff5 --- /dev/null +++ b/appstore/metatube-server-memory/1.3.1/docker-compose.yml @@ -0,0 +1,20 @@ +networks: + 1panel-network: + external: true +services: + metatube-server: + container_name: metatube-server-memory + env_file: + - ./envs/global.env + - .env + environment: + - HTTPS_PROXY=${HTTP_PROXY} + - DB_AUTO_MIGRATE=true + - PORT=${PANEL_APP_PORT_HTTP} + image: ghcr.io/metatube-community/metatube-server:1.3.1 + labels: + createdBy: Apps + network_mode: ${NETWORK_MODE} + ports: + - ${PANEL_APP_PORT_HTTP}:${PANEL_APP_PORT_HTTP} + restart: always diff --git a/appstore/umami-mysql/2.18.1/envs/default.env b/appstore/metatube-server-memory/1.3.1/envs/default.env similarity index 100% rename from appstore/umami-mysql/2.18.1/envs/default.env rename to appstore/metatube-server-memory/1.3.1/envs/default.env diff --git a/appstore/umami-mysql/2.18.1/envs/global.env b/appstore/metatube-server-memory/1.3.1/envs/global.env similarity index 100% rename from appstore/umami-mysql/2.18.1/envs/global.env rename to appstore/metatube-server-memory/1.3.1/envs/global.env diff --git a/appstore/umami-mysql/2.18.1/scripts/init.sh b/appstore/metatube-server-memory/1.3.1/scripts/init.sh similarity index 100% rename from appstore/umami-mysql/2.18.1/scripts/init.sh rename to appstore/metatube-server-memory/1.3.1/scripts/init.sh diff --git a/appstore/umami-mysql/2.18.1/scripts/uninstall.sh b/appstore/metatube-server-memory/1.3.1/scripts/uninstall.sh similarity index 100% rename from appstore/umami-mysql/2.18.1/scripts/uninstall.sh rename to appstore/metatube-server-memory/1.3.1/scripts/uninstall.sh diff --git a/appstore/umami-mysql/2.18.1/scripts/upgrade.sh b/appstore/metatube-server-memory/1.3.1/scripts/upgrade.sh similarity index 100% rename from appstore/umami-mysql/2.18.1/scripts/upgrade.sh rename to appstore/metatube-server-memory/1.3.1/scripts/upgrade.sh diff --git a/appstore/metatube-server-memory/README.md b/appstore/metatube-server-memory/README.md new file mode 100644 index 000000000..cb5c78eb4 --- /dev/null +++ b/appstore/metatube-server-memory/README.md @@ -0,0 +1,87 @@ +# MetaTube 服务端 + +为 Jellyfin/Emby/Plex 开发的超级好用的元数据插件 + +![MetaTube](https://file.lifebus.top/imgs/metatube.png) + +![](https://img.shields.io/badge/%E6%96%B0%E7%96%86%E8%90%8C%E6%A3%AE%E8%BD%AF%E4%BB%B6%E5%BC%80%E5%8F%91%E5%B7%A5%E4%BD%9C%E5%AE%A4-%E6%8F%90%E4%BE%9B%E6%8A%80%E6%9C%AF%E6%94%AF%E6%8C%81-blue) + +## 应用特性 + ++ 完整数据:包括标题、简介、演员、标签、评分等内容。 ++ 完整搜索:支持通过众多的刮削源搜索影片和演员信息。 ++ 预告功能:无需下载完整预告视频即可在线观看预告片。 ++ 计划任务:自动整理影片标签以及在后台自动更新插件。 ++ 人脸识别:内置的人脸识别以人脸为中心裁剪海报图像。 ++ 自动翻译:支持将特定的元数据内容翻译成需要的语言。 + +## 应用说明 + +该应用为 MetaTube 服务端,用于为 Jellyfin/Emby/Plex 提供元数据插件。 + +优先推荐部署在: 云服务器(美国/日本) + +如果您的网络环境不适合部署服务端,可以尝试配置网络代理。仅支持 HTTP 代理 / Socks5 代理。 + +## 插件安装 + +### Jellyfin + +1. 进入 Jellyfin 控制台 > 插件目录/存储库 > 设置,点击添加 +2. 输入存储库名称:MetaTube +3. 输入存储库 + +```url +# URL for GitHub +https://raw.githubusercontent.com/metatube-community/jellyfin-plugin-metatube/dist/manifest.json +``` + +4. 在插件目录下找到 MetaTube,点击安装 +5. 重启 Jellyfin + +> 适用于中国大陆的存储库 +> +> ```url +> # URL for jsDelivr +> https://cdn.jsdelivr.net/gh/metatube-community/jellyfin-plugin-metatube@dist/manifest.json +> ``` + +### Emby + +1. 从 Releases 下载 MetaTube 最新插件 +2. 解压出 MetaTube.dll 文件 +3. 将 dll 文件复制到 Emby 插件目录 +4. 重启 Emby 服务 + +> PS:Emby 后续插件更新由计划任务在后台自动完成。 + +### Plex + +1. 从 [GitHub](https://github.com/metatube-community/metatube-plex-plugins/archive/refs/heads/main.zip) + 或 [Releases](https://github.com/metatube-community/metatube-plex-plugins/releases) 下载最新的插件 + zip 文件 +2. 将解压后的 MetaTube.bundle 文件夹移入 Plex 插件目录的根目录 +3. 其中文件夹 MetaTubeHelper.bundle 为辅助插件,可选择性安装 +4. 重启 Plex 服务 + +### 常见 Emby 插件应用目录 + +#### 群晖 + +`/volume1/Emby/plugins` + +#### Windows + +`emby\programdata\plugins` + +#### Docker + +`<配置文件夹>/plugins` + +#### Linux(供参考) + +`/var/lib/emby-server/plugins/` + +--- + +![Ms Studio](https://file.lifebus.top/imgs/ms_blank_001.png) diff --git a/appstore/metatube-server-memory/data.yml b/appstore/metatube-server-memory/data.yml new file mode 100644 index 000000000..90e33526a --- /dev/null +++ b/appstore/metatube-server-memory/data.yml @@ -0,0 +1,15 @@ +additionalProperties: + key: metatube-server-memory + name: MetaTube (内存模式) + tags: + - WebSite + - Tool + - Local + shortDescZh: 为 Jellyfin/Emby/Plex 开发的超级好用的成人元数据刮削插件 + shortDescEn: A super easy-to-use adult metadata scraping plugin developed for Jellyfin/Emby/Plex + type: website + crossVersionUpdate: true + limit: 0 + website: https://github.com/metatube-community/ + github: https://github.com/metatube-community/ + document: https://metatube-community.github.io/ diff --git a/appstore/metatube-server-memory/logo.png b/appstore/metatube-server-memory/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..5671ce95914065f8f449194b45e5f02a6a0f304d GIT binary patch literal 81365 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⁣4~ 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 M$C{5y9-0UJKdX`1mjD0& literal 0 HcmV?d00001 diff --git a/appstore/openpanel/25.6.5.41-alpine/.env b/appstore/openpanel/25.6.5.41-alpine/.env new file mode 100644 index 000000000..e3d40eb70 --- /dev/null +++ b/appstore/openpanel/25.6.5.41-alpine/.env @@ -0,0 +1,51 @@ +# Postgres 服务 (前置检查) +PANEL_POSTGRES_TYPE=postgresql + +# Redis 服务 (前置检查) [必填] +PANEL_REDIS_TYPE=redis + +# 数据持久化路径 [必填] +CLICKHOUSE_SERVER_ROOT_PATH=/home/clickhouse-server + +# WebUI 端口 [必填] +PANEL_APP_PORT_HTTP=8123 + +# Native/TCP 通讯端口 [必填] +PANEL_APP_PORT_NATIVE_TCP=9000 + +# 服务器通信端口 [必填] +PANEL_APP_PORT_INTER_SERVER=9009 + +# ClickHouse 访问地址 [必填] +CLICKHOUSE_URL=http://127.0.0.1:8123/openpanel + +# Redis 地址 [必填] +REDIS_URL=redis://127.0.0.1:6379 + +# Redis 地址 [必填] +DATABASE_URL=postgresql://postgres_user:postgres_pass@127.0.0.1:5432/postgres_db_name?schema=public + +# 开放注册 [必填] +ALLOW_REGISTRATION=false + +# 开放邀请 [必填] +ALLOW_INVITATION=false + +# 邮件发送 (Resend) API KEY +RESEND_API_KEY= + +# 邮件发送者地址 +EMAIL_SENDER= + +# Github 客户端 ID (OAuth2) +GITHUB_CLIENT_ID= + +# Github 客户端密钥 (OAuth2) +GITHUB_CLIENT_SECRET= + +# Google 客户端 ID (OAuth2) +GOOGLE_CLIENT_ID= + +# Google 客户端密钥 (OAuth2) +GOOGLE_CLIENT_SECRET= + diff --git a/appstore/openpanel/25.6.5.41-alpine/config/clickhouse-config.xml b/appstore/openpanel/25.6.5.41-alpine/config/clickhouse-config.xml new file mode 100644 index 000000000..659577864 --- /dev/null +++ b/appstore/openpanel/25.6.5.41-alpine/config/clickhouse-config.xml @@ -0,0 +1,29 @@ + + + warning + true + + + 10 + + + + + + + + + + + + 0.0.0.0 + 0.0.0.0 + op-ch + + + + 1 + replica1 + openpanel_cluster + + diff --git a/appstore/openpanel/25.6.5.41-alpine/config/clickhouse-user-config.xml b/appstore/openpanel/25.6.5.41-alpine/config/clickhouse-user-config.xml new file mode 100644 index 000000000..ae6a6b948 --- /dev/null +++ b/appstore/openpanel/25.6.5.41-alpine/config/clickhouse-user-config.xml @@ -0,0 +1,8 @@ + + + + 0 + 0 + + + \ No newline at end of file diff --git a/appstore/openpanel/25.6.5.41-alpine/config/init-db.sh b/appstore/openpanel/25.6.5.41-alpine/config/init-db.sh new file mode 100644 index 000000000..e86d8af32 --- /dev/null +++ b/appstore/openpanel/25.6.5.41-alpine/config/init-db.sh @@ -0,0 +1,6 @@ +#!/bin/bash +set -e + +clickhouse client -n <<-EOSQL + CREATE DATABASE IF NOT EXISTS openpanel; +EOSQL \ No newline at end of file diff --git a/appstore/openpanel/25.6.5.41-alpine/data.yml b/appstore/openpanel/25.6.5.41-alpine/data.yml new file mode 100644 index 000000000..23c435d68 --- /dev/null +++ b/appstore/openpanel/25.6.5.41-alpine/data.yml @@ -0,0 +1,148 @@ +additionalProperties: + formFields: + - child: + default: "" + envKey: PANEL_POSTGRES_SERVICE + required: true + type: service + default: postgresql + envKey: PANEL_POSTGRES_TYPE + labelZh: Postgres 服务 (前置检查) + labelEn: Postgres Service (Pre-check) + required: false + type: apps + values: + - label: PostgreSQL + value: postgresql + - child: + default: "" + envKey: PANEL_REDIS_SERVICE + required: true + type: service + default: redis + envKey: PANEL_REDIS_TYPE + labelZh: Redis 服务 (前置检查) + labelEn: Redis Service (Pre-check) + required: true + type: apps + values: + - label: Redis + value: redis + - default: "/home/clickhouse-server" + edit: true + envKey: CLICKHOUSE_SERVER_ROOT_PATH + labelZh: 数据持久化路径 + labelEn: Data persistence path + required: true + type: text + - default: 8123 + edit: true + envKey: PANEL_APP_PORT_HTTP + labelZh: WebUI 端口 + labelEn: WebUI port + required: true + rule: paramPort + type: number + - default: 9000 + edit: true + envKey: PANEL_APP_PORT_NATIVE_TCP + labelZh: Native/TCP 通讯端口 + labelEn: Native/TCP interface + required: true + rule: paramPort + type: number + - default: 9009 + edit: true + envKey: PANEL_APP_PORT_INTER_SERVER + labelZh: 服务器通信端口 + labelEn: Inter-server communication + required: true + rule: paramPort + type: number + - default: "http://127.0.0.1:8123/openpanel" + edit: true + envKey: CLICKHOUSE_URL + labelZh: ClickHouse 访问地址 + labelEn: ClickHouse URL + required: true + type: text + - default: "redis://127.0.0.1:6379" + edit: true + envKey: REDIS_URL + labelZh: Redis 地址 + labelEn: Redis Url + required: true + type: text + - default: "postgresql://postgres_user:postgres_pass@127.0.0.1:5432/postgres_db_name?schema=public" + edit: true + envKey: DATABASE_URL + labelZh: Redis 地址 + labelEn: Redis Url + required: true + type: text + - default: "false" + edit: true + envKey: ALLOW_REGISTRATION + labelZh: 开放注册 + labelEn: Open Registration + required: true + type: select + values: + - label: 允许注册 + value: "true" + - label: 禁止注册 + value: "false" + - default: "false" + edit: true + envKey: ALLOW_INVITATION + labelZh: 开放邀请 + labelEn: Open Invitation + required: true + type: select + values: + - label: 允许邀请 + value: "true" + - label: 禁止邀请 + value: "false" + - default: "" + edit: true + envKey: RESEND_API_KEY + labelZh: 邮件发送 (Resend) API KEY + labelEn: Email (Resend) Send API KEY + required: false + type: text + - default: "" + edit: true + envKey: EMAIL_SENDER + labelZh: 邮件发送者地址 + labelEn: Email Sender Address + required: false + type: text + - default: "" + edit: true + envKey: GITHUB_CLIENT_ID + labelZh: Github 客户端 ID (OAuth2) + labelEn: Github Client ID (OAuth2) + required: false + type: text + - default: "" + edit: true + envKey: GITHUB_CLIENT_SECRET + labelZh: Github 客户端密钥 (OAuth2) + labelEn: Github Client Secret (OAuth2) + required: false + type: text + - default: "" + edit: true + envKey: GOOGLE_CLIENT_ID + labelZh: Google 客户端 ID (OAuth2) + labelEn: Google Client ID (OAuth2) + required: false + type: text + - default: "" + edit: true + envKey: GOOGLE_CLIENT_SECRET + labelZh: Google 客户端密钥 (OAuth2) + labelEn: Google Client Secret (OAuth2) + required: false + type: text diff --git a/appstore/openpanel/25.6.5.41-alpine/docker-compose.yml b/appstore/openpanel/25.6.5.41-alpine/docker-compose.yml new file mode 100644 index 000000000..dd3009ac6 --- /dev/null +++ b/appstore/openpanel/25.6.5.41-alpine/docker-compose.yml @@ -0,0 +1,41 @@ +networks: + 1panel-network: + external: true +services: + clickhouse-server: + container_name: openpanel + env_file: + - ./envs/global.env + - .env + environment: + - TZ=Asia/Shanghai + - DATABASE_URL_DIRECT=${DATABASE_URL} + - BATCH_SIZE=5000 + - BATCH_INTERVAL=10000 + - CONCURRENCY=10 + - WORKER_PORT=9999 + - API_PORT=3333 + - NEXT_PUBLIC_API_URL="http://localhost:3333" + - NEXT_PUBLIC_DASHBOARD_URL="http://localhost:3000" + - GITHUB_REDIRECT_URI=https://openpanel.domain.com/api/oauth/github/callback + - GOOGLE_REDIRECT_URI=https://openpanel.domain.com/api/oauth/google/callback + image: clickhouse/clickhouse-server:25.6.5.41-alpine + labels: + createdBy: Apps + networks: + - 1panel-network + ports: + - ${PANEL_APP_PORT_HTTP}:8123 + - ${PANEL_APP_PORT_NATIVE_TCP}:9000 + - ${PANEL_APP_PORT_INTER_SERVER}:9009 + restart: always + ulimits: + nofile: + hard: 262144 + soft: 262144 + volumes: + - ${CLICKHOUSE_SERVER_ROOT_PATH}/data:/var/lib/clickhouse + - ${CLICKHOUSE_SERVER_ROOT_PATH}/logs:/var/log/clickhouse-server + - ${CLICKHOUSE_SERVER_ROOT_PATH}/config/op-config.xml:/etc/clickhouse-server/config.d/op-config.xml + - ${CLICKHOUSE_SERVER_ROOT_PATH}/config/op-user-config.xml:/etc/clickhouse-server/users.d/op-user-config.xml + - ${CLICKHOUSE_SERVER_ROOT_PATH}/config/init-db.sh:/docker-entrypoint-initdb.d/init-db.sh diff --git a/appstore/umami/2.18.1/envs/default.env b/appstore/openpanel/25.6.5.41-alpine/envs/default.env similarity index 100% rename from appstore/umami/2.18.1/envs/default.env rename to appstore/openpanel/25.6.5.41-alpine/envs/default.env diff --git a/appstore/umami/2.18.1/envs/global.env b/appstore/openpanel/25.6.5.41-alpine/envs/global.env similarity index 100% rename from appstore/umami/2.18.1/envs/global.env rename to appstore/openpanel/25.6.5.41-alpine/envs/global.env diff --git a/appstore/openpanel/25.6.5.41-alpine/scripts/init.sh b/appstore/openpanel/25.6.5.41-alpine/scripts/init.sh new file mode 100644 index 000000000..80c647873 --- /dev/null +++ b/appstore/openpanel/25.6.5.41-alpine/scripts/init.sh @@ -0,0 +1,22 @@ +#!/bin/bash + +if [ -f .env ]; then + source .env + + # setup-1 add default values + CURRENT_DIR=$(pwd) + sed -i '/^ENV_FILE=/d' .env + sed -i '/^GLOBAL_ENV_FILE=/d' .env + echo "ENV_FILE=${CURRENT_DIR}/.env" >> .env + echo "GLOBAL_ENV_FILE=${CURRENT_DIR}/envs/global.env" >> .env + + if [ ! -d $CLICKHOUSE_SERVER_ROOT_PATH/config ]; then + mkdir -p $CLICKHOUSE_SERVER_ROOT_PATH/config + fi + cp -rn ./config/* $CLICKHOUSE_SERVER_ROOT_PATH/config/ + + echo "Check Finish." + +else + echo "Error: .env file not found." +fi diff --git a/appstore/umami/2.18.1/scripts/uninstall.sh b/appstore/openpanel/25.6.5.41-alpine/scripts/uninstall.sh similarity index 100% rename from appstore/umami/2.18.1/scripts/uninstall.sh rename to appstore/openpanel/25.6.5.41-alpine/scripts/uninstall.sh diff --git a/appstore/umami/2.18.1/scripts/upgrade.sh b/appstore/openpanel/25.6.5.41-alpine/scripts/upgrade.sh similarity index 100% rename from appstore/umami/2.18.1/scripts/upgrade.sh rename to appstore/openpanel/25.6.5.41-alpine/scripts/upgrade.sh diff --git a/appstore/openpanel/README.md b/appstore/openpanel/README.md new file mode 100644 index 000000000..c18c4d704 --- /dev/null +++ b/appstore/openpanel/README.md @@ -0,0 +1,50 @@ +# Openpanel + +Openpanel 是一个开源网络和产品分析平台,它结合了 Mixpanel 的强大功能和 Plausible 的易用性,是最好的 Google Analytics +替代品之一。 + +![Openpanel](https://file.lifebus.top/imgs/openpanel_cover.png) + +![](https://img.shields.io/badge/%E6%96%B0%E7%96%86%E8%90%8C%E6%A3%AE%E8%BD%AF%E4%BB%B6%E5%BC%80%E5%8F%91%E5%B7%A5%E4%BD%9C%E5%AE%A4-%E6%8F%90%E4%BE%9B%E6%8A%80%E6%9C%AF%E6%94%AF%E6%8C%81-blue) + +## 特性 + +### 网络分析 + ++ 实时数据 :实时查看访客活动 ++ 流量来源 :了解访客来自哪里 ++ 地理洞察 :追踪访客位置和趋势 ++ 设备分析 :监控不同设备的使用情况 ++ 页面性能 :分析访问量最大的页面 + +### 产品分析 + ++ 事件跟踪 :监控用户操作和交互 ++ 用户资料 :建立详细的用户旅程洞察 ++ 漏斗 :分析转化路径 ++ 留存率 :跟踪用户参与度 ++ 自定义属性 :为事件添加上下文 + +## 快速开始 SDK + +### 脚本标签 + +```html + + + +``` + +--- + +![Ms Studio](https://file.lifebus.top/imgs/ms_blank_001.png) diff --git a/appstore/openpanel/data.yml b/appstore/openpanel/data.yml new file mode 100644 index 000000000..ecb0a43fb --- /dev/null +++ b/appstore/openpanel/data.yml @@ -0,0 +1,14 @@ +additionalProperties: + key: openpanel + name: Openpanel + tags: + - WebSite + - Local + shortDescZh: 开源网络和产品分析平台 + shortDescEn: An open source network and product analysis platform + type: website + crossVersionUpdate: true + limit: 0 + website: https://openpanel.dev/ + github: https://github.com/Openpanel-dev/openpanel/ + document: https://openpanel.dev/ diff --git a/appstore/openpanel/logo.png b/appstore/openpanel/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..827e9529e99648d871d489663b880d6e24e8d849 GIT binary patch literal 11061 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 .env + echo "GLOBAL_ENV_FILE=${CURRENT_DIR}/envs/global.env" >> .env + + echo "Check Finish." + +else + echo "Error: .env file not found." +fi diff --git a/appstore/umami/2.18.1/.env b/appstore/umami/2.19.0/.env similarity index 100% rename from appstore/umami/2.18.1/.env rename to appstore/umami/2.19.0/.env diff --git a/appstore/umami/2.18.1/data.yml b/appstore/umami/2.19.0/data.yml similarity index 100% rename from appstore/umami/2.18.1/data.yml rename to appstore/umami/2.19.0/data.yml diff --git a/appstore/umami/2.18.1/docker-compose.yml b/appstore/umami/2.19.0/docker-compose.yml similarity index 90% rename from appstore/umami/2.18.1/docker-compose.yml rename to appstore/umami/2.19.0/docker-compose.yml index 9bbf23909..f8dc6fb29 100644 --- a/appstore/umami/2.18.1/docker-compose.yml +++ b/appstore/umami/2.19.0/docker-compose.yml @@ -12,7 +12,7 @@ services: - REMOVE_TRAILING_SLASH = 1 - DATABASE_TYPE=postgresql - DATABASE_URL=postgresql://${DB_USERNAME}:${DB_PASSWORD}@${DB_HOSTNAME}:${DB_PORT}/${DB_DATABASE_NAME} - image: umamisoftware/umami:postgresql-v2.18.1 + image: umamisoftware/umami:postgresql-v2.19.0 labels: createdBy: Apps networks: diff --git a/dockge/umami_2_18_1/envs/default.env b/appstore/umami/2.19.0/envs/default.env similarity index 100% rename from dockge/umami_2_18_1/envs/default.env rename to appstore/umami/2.19.0/envs/default.env diff --git a/dockge/umami_2_18_1/envs/global.env b/appstore/umami/2.19.0/envs/global.env similarity index 100% rename from dockge/umami_2_18_1/envs/global.env rename to appstore/umami/2.19.0/envs/global.env diff --git a/appstore/umami/2.19.0/scripts/init.sh b/appstore/umami/2.19.0/scripts/init.sh new file mode 100644 index 000000000..07fb8c3fe --- /dev/null +++ b/appstore/umami/2.19.0/scripts/init.sh @@ -0,0 +1,17 @@ +#!/bin/bash + +if [ -f .env ]; then + source .env + + # setup-1 add default values + CURRENT_DIR=$(pwd) + sed -i '/^ENV_FILE=/d' .env + sed -i '/^GLOBAL_ENV_FILE=/d' .env + echo "ENV_FILE=${CURRENT_DIR}/.env" >> .env + echo "GLOBAL_ENV_FILE=${CURRENT_DIR}/envs/global.env" >> .env + + echo "Check Finish." + +else + echo "Error: .env file not found." +fi diff --git a/appstore/umami/2.19.0/scripts/uninstall.sh b/appstore/umami/2.19.0/scripts/uninstall.sh new file mode 100644 index 000000000..c86c4fbca --- /dev/null +++ b/appstore/umami/2.19.0/scripts/uninstall.sh @@ -0,0 +1,10 @@ +#!/bin/bash + +if [ -f .env ]; then + source .env + + echo "Check Finish." + +else + echo "Error: .env file not found." +fi diff --git a/appstore/umami/2.19.0/scripts/upgrade.sh b/appstore/umami/2.19.0/scripts/upgrade.sh new file mode 100644 index 000000000..07fb8c3fe --- /dev/null +++ b/appstore/umami/2.19.0/scripts/upgrade.sh @@ -0,0 +1,17 @@ +#!/bin/bash + +if [ -f .env ]; then + source .env + + # setup-1 add default values + CURRENT_DIR=$(pwd) + sed -i '/^ENV_FILE=/d' .env + sed -i '/^GLOBAL_ENV_FILE=/d' .env + echo "ENV_FILE=${CURRENT_DIR}/.env" >> .env + echo "GLOBAL_ENV_FILE=${CURRENT_DIR}/envs/global.env" >> .env + + echo "Check Finish." + +else + echo "Error: .env file not found." +fi diff --git a/dockge/metatube-server-memory/.env b/dockge/metatube-server-memory/.env new file mode 100644 index 000000000..eeec6f970 --- /dev/null +++ b/dockge/metatube-server-memory/.env @@ -0,0 +1,15 @@ +# 网络模式 [必填] +NETWORK_MODE=1panel-network + +# WebUI 端口 [必填] +PANEL_APP_PORT_HTTP=8080 + +# 访问令牌 [必填] +TOKEN= + +# 请求超时时间 [必填] +REQUEST_TIMEOUT=1m + +# 网络代理 (HTTP/Socket5) +HTTP_PROXY= + diff --git a/dockge/metatube-server-memory/docker-compose.yml b/dockge/metatube-server-memory/docker-compose.yml new file mode 100644 index 000000000..d77daeff5 --- /dev/null +++ b/dockge/metatube-server-memory/docker-compose.yml @@ -0,0 +1,20 @@ +networks: + 1panel-network: + external: true +services: + metatube-server: + container_name: metatube-server-memory + env_file: + - ./envs/global.env + - .env + environment: + - HTTPS_PROXY=${HTTP_PROXY} + - DB_AUTO_MIGRATE=true + - PORT=${PANEL_APP_PORT_HTTP} + image: ghcr.io/metatube-community/metatube-server:1.3.1 + labels: + createdBy: Apps + network_mode: ${NETWORK_MODE} + ports: + - ${PANEL_APP_PORT_HTTP}:${PANEL_APP_PORT_HTTP} + restart: always diff --git a/dockge/metatube-server-memory/envs/default.env b/dockge/metatube-server-memory/envs/default.env new file mode 100644 index 000000000..cd05f46e6 --- /dev/null +++ b/dockge/metatube-server-memory/envs/default.env @@ -0,0 +1,2 @@ +# copyright© 2024 XinJiang Ms Studio +ENV_FILE=.env diff --git a/dockge/metatube-server-memory/envs/global.env b/dockge/metatube-server-memory/envs/global.env new file mode 100644 index 000000000..e10989fe4 --- /dev/null +++ b/dockge/metatube-server-memory/envs/global.env @@ -0,0 +1,2 @@ +# copyright© 2024 XinJiang Ms Studio +TZ=Asia/Shanghai diff --git a/dockge/openpanel/.env b/dockge/openpanel/.env new file mode 100644 index 000000000..e3d40eb70 --- /dev/null +++ b/dockge/openpanel/.env @@ -0,0 +1,51 @@ +# Postgres 服务 (前置检查) +PANEL_POSTGRES_TYPE=postgresql + +# Redis 服务 (前置检查) [必填] +PANEL_REDIS_TYPE=redis + +# 数据持久化路径 [必填] +CLICKHOUSE_SERVER_ROOT_PATH=/home/clickhouse-server + +# WebUI 端口 [必填] +PANEL_APP_PORT_HTTP=8123 + +# Native/TCP 通讯端口 [必填] +PANEL_APP_PORT_NATIVE_TCP=9000 + +# 服务器通信端口 [必填] +PANEL_APP_PORT_INTER_SERVER=9009 + +# ClickHouse 访问地址 [必填] +CLICKHOUSE_URL=http://127.0.0.1:8123/openpanel + +# Redis 地址 [必填] +REDIS_URL=redis://127.0.0.1:6379 + +# Redis 地址 [必填] +DATABASE_URL=postgresql://postgres_user:postgres_pass@127.0.0.1:5432/postgres_db_name?schema=public + +# 开放注册 [必填] +ALLOW_REGISTRATION=false + +# 开放邀请 [必填] +ALLOW_INVITATION=false + +# 邮件发送 (Resend) API KEY +RESEND_API_KEY= + +# 邮件发送者地址 +EMAIL_SENDER= + +# Github 客户端 ID (OAuth2) +GITHUB_CLIENT_ID= + +# Github 客户端密钥 (OAuth2) +GITHUB_CLIENT_SECRET= + +# Google 客户端 ID (OAuth2) +GOOGLE_CLIENT_ID= + +# Google 客户端密钥 (OAuth2) +GOOGLE_CLIENT_SECRET= + diff --git a/dockge/openpanel/config/clickhouse-config.xml b/dockge/openpanel/config/clickhouse-config.xml new file mode 100644 index 000000000..659577864 --- /dev/null +++ b/dockge/openpanel/config/clickhouse-config.xml @@ -0,0 +1,29 @@ + + + warning + true + + + 10 + + + + + + + + + + + + 0.0.0.0 + 0.0.0.0 + op-ch + + + + 1 + replica1 + openpanel_cluster + + diff --git a/dockge/openpanel/config/clickhouse-user-config.xml b/dockge/openpanel/config/clickhouse-user-config.xml new file mode 100644 index 000000000..ae6a6b948 --- /dev/null +++ b/dockge/openpanel/config/clickhouse-user-config.xml @@ -0,0 +1,8 @@ + + + + 0 + 0 + + + \ No newline at end of file diff --git a/dockge/openpanel/config/init-db.sh b/dockge/openpanel/config/init-db.sh new file mode 100644 index 000000000..e86d8af32 --- /dev/null +++ b/dockge/openpanel/config/init-db.sh @@ -0,0 +1,6 @@ +#!/bin/bash +set -e + +clickhouse client -n <<-EOSQL + CREATE DATABASE IF NOT EXISTS openpanel; +EOSQL \ No newline at end of file diff --git a/dockge/openpanel/docker-compose.yml b/dockge/openpanel/docker-compose.yml new file mode 100644 index 000000000..dd3009ac6 --- /dev/null +++ b/dockge/openpanel/docker-compose.yml @@ -0,0 +1,41 @@ +networks: + 1panel-network: + external: true +services: + clickhouse-server: + container_name: openpanel + env_file: + - ./envs/global.env + - .env + environment: + - TZ=Asia/Shanghai + - DATABASE_URL_DIRECT=${DATABASE_URL} + - BATCH_SIZE=5000 + - BATCH_INTERVAL=10000 + - CONCURRENCY=10 + - WORKER_PORT=9999 + - API_PORT=3333 + - NEXT_PUBLIC_API_URL="http://localhost:3333" + - NEXT_PUBLIC_DASHBOARD_URL="http://localhost:3000" + - GITHUB_REDIRECT_URI=https://openpanel.domain.com/api/oauth/github/callback + - GOOGLE_REDIRECT_URI=https://openpanel.domain.com/api/oauth/google/callback + image: clickhouse/clickhouse-server:25.6.5.41-alpine + labels: + createdBy: Apps + networks: + - 1panel-network + ports: + - ${PANEL_APP_PORT_HTTP}:8123 + - ${PANEL_APP_PORT_NATIVE_TCP}:9000 + - ${PANEL_APP_PORT_INTER_SERVER}:9009 + restart: always + ulimits: + nofile: + hard: 262144 + soft: 262144 + volumes: + - ${CLICKHOUSE_SERVER_ROOT_PATH}/data:/var/lib/clickhouse + - ${CLICKHOUSE_SERVER_ROOT_PATH}/logs:/var/log/clickhouse-server + - ${CLICKHOUSE_SERVER_ROOT_PATH}/config/op-config.xml:/etc/clickhouse-server/config.d/op-config.xml + - ${CLICKHOUSE_SERVER_ROOT_PATH}/config/op-user-config.xml:/etc/clickhouse-server/users.d/op-user-config.xml + - ${CLICKHOUSE_SERVER_ROOT_PATH}/config/init-db.sh:/docker-entrypoint-initdb.d/init-db.sh diff --git a/dockge/openpanel/envs/default.env b/dockge/openpanel/envs/default.env new file mode 100644 index 000000000..cd05f46e6 --- /dev/null +++ b/dockge/openpanel/envs/default.env @@ -0,0 +1,2 @@ +# copyright© 2024 XinJiang Ms Studio +ENV_FILE=.env diff --git a/dockge/openpanel/envs/global.env b/dockge/openpanel/envs/global.env new file mode 100644 index 000000000..e10989fe4 --- /dev/null +++ b/dockge/openpanel/envs/global.env @@ -0,0 +1,2 @@ +# copyright© 2024 XinJiang Ms Studio +TZ=Asia/Shanghai diff --git a/dockge/umami-mysql/docker-compose.yml b/dockge/umami-mysql/docker-compose.yml index 2bc7a13bc..63d1197b2 100644 --- a/dockge/umami-mysql/docker-compose.yml +++ b/dockge/umami-mysql/docker-compose.yml @@ -12,7 +12,7 @@ services: - REMOVE_TRAILING_SLASH = 1 - DATABASE_TYPE=mysql - DATABASE_URL=mysql://${DB_USERNAME}:${DB_PASSWORD}@${DB_HOSTNAME}:${DB_PORT}/${DB_DATABASE_NAME} - image: umamisoftware/umami:mysql-v2.16.0 + image: umamisoftware/umami:mysql-v2.19.0 labels: createdBy: Apps networks: diff --git a/dockge/umami-mysql_2_18_1/.env b/dockge/umami-mysql_2_16_0/.env similarity index 100% rename from dockge/umami-mysql_2_18_1/.env rename to dockge/umami-mysql_2_16_0/.env diff --git a/dockge/umami-mysql_2_18_1/docker-compose.yml b/dockge/umami-mysql_2_16_0/docker-compose.yml similarity index 91% rename from dockge/umami-mysql_2_18_1/docker-compose.yml rename to dockge/umami-mysql_2_16_0/docker-compose.yml index 0347d07c0..2bc7a13bc 100644 --- a/dockge/umami-mysql_2_18_1/docker-compose.yml +++ b/dockge/umami-mysql_2_16_0/docker-compose.yml @@ -12,7 +12,7 @@ services: - REMOVE_TRAILING_SLASH = 1 - DATABASE_TYPE=mysql - DATABASE_URL=mysql://${DB_USERNAME}:${DB_PASSWORD}@${DB_HOSTNAME}:${DB_PORT}/${DB_DATABASE_NAME} - image: umamisoftware/umami:mysql-v2.18.1 + image: umamisoftware/umami:mysql-v2.16.0 labels: createdBy: Apps networks: diff --git a/dockge/umami-mysql_2_16_0/envs/default.env b/dockge/umami-mysql_2_16_0/envs/default.env new file mode 100644 index 000000000..cd05f46e6 --- /dev/null +++ b/dockge/umami-mysql_2_16_0/envs/default.env @@ -0,0 +1,2 @@ +# copyright© 2024 XinJiang Ms Studio +ENV_FILE=.env diff --git a/dockge/umami-mysql_2_16_0/envs/global.env b/dockge/umami-mysql_2_16_0/envs/global.env new file mode 100644 index 000000000..e10989fe4 --- /dev/null +++ b/dockge/umami-mysql_2_16_0/envs/global.env @@ -0,0 +1,2 @@ +# copyright© 2024 XinJiang Ms Studio +TZ=Asia/Shanghai diff --git a/dockge/umami/docker-compose.yml b/dockge/umami/docker-compose.yml index 7f7a58660..f8dc6fb29 100644 --- a/dockge/umami/docker-compose.yml +++ b/dockge/umami/docker-compose.yml @@ -12,7 +12,7 @@ services: - REMOVE_TRAILING_SLASH = 1 - DATABASE_TYPE=postgresql - DATABASE_URL=postgresql://${DB_USERNAME}:${DB_PASSWORD}@${DB_HOSTNAME}:${DB_PORT}/${DB_DATABASE_NAME} - image: umamisoftware/umami:postgresql-v2.16.0 + image: umamisoftware/umami:postgresql-v2.19.0 labels: createdBy: Apps networks: diff --git a/dockge/umami_2_18_1/.env b/dockge/umami_2_16_0/.env similarity index 100% rename from dockge/umami_2_18_1/.env rename to dockge/umami_2_16_0/.env diff --git a/dockge/umami_2_18_1/docker-compose.yml b/dockge/umami_2_16_0/docker-compose.yml similarity index 90% rename from dockge/umami_2_18_1/docker-compose.yml rename to dockge/umami_2_16_0/docker-compose.yml index 9bbf23909..7f7a58660 100644 --- a/dockge/umami_2_18_1/docker-compose.yml +++ b/dockge/umami_2_16_0/docker-compose.yml @@ -12,7 +12,7 @@ services: - REMOVE_TRAILING_SLASH = 1 - DATABASE_TYPE=postgresql - DATABASE_URL=postgresql://${DB_USERNAME}:${DB_PASSWORD}@${DB_HOSTNAME}:${DB_PORT}/${DB_DATABASE_NAME} - image: umamisoftware/umami:postgresql-v2.18.1 + image: umamisoftware/umami:postgresql-v2.16.0 labels: createdBy: Apps networks: diff --git a/dockge/umami_2_16_0/envs/default.env b/dockge/umami_2_16_0/envs/default.env new file mode 100644 index 000000000..cd05f46e6 --- /dev/null +++ b/dockge/umami_2_16_0/envs/default.env @@ -0,0 +1,2 @@ +# copyright© 2024 XinJiang Ms Studio +ENV_FILE=.env diff --git a/dockge/umami_2_16_0/envs/global.env b/dockge/umami_2_16_0/envs/global.env new file mode 100644 index 000000000..e10989fe4 --- /dev/null +++ b/dockge/umami_2_16_0/envs/global.env @@ -0,0 +1,2 @@ +# copyright© 2024 XinJiang Ms Studio +TZ=Asia/Shanghai