From 9c81d7d300e396e88aa1b6d5f46349993047aca1 Mon Sep 17 00:00:00 2001 From: okxlin Date: Fri, 10 May 2024 00:57:21 +0800 Subject: [PATCH] =?UTF-8?q?feat:=E6=B7=BB=E5=8A=A0sub-store=E5=88=B0?= =?UTF-8?q?=E5=88=97=E8=A1=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/sub-store/README.md | 61 +++++++++++++++++++++++ apps/sub-store/data.yml | 19 +++++++ apps/sub-store/latest/.env.sample | 6 +++ apps/sub-store/latest/data.yml | 38 ++++++++++++++ apps/sub-store/latest/docker-compose.yml | 22 ++++++++ apps/sub-store/logo.png | Bin 0 -> 5638 bytes 6 files changed, 146 insertions(+) create mode 100644 apps/sub-store/README.md create mode 100644 apps/sub-store/data.yml create mode 100644 apps/sub-store/latest/.env.sample create mode 100644 apps/sub-store/latest/data.yml create mode 100644 apps/sub-store/latest/docker-compose.yml create mode 100644 apps/sub-store/logo.png diff --git a/apps/sub-store/README.md b/apps/sub-store/README.md new file mode 100644 index 00000000..75323881 --- /dev/null +++ b/apps/sub-store/README.md @@ -0,0 +1,61 @@ +
+
+Sub-Store +
+
+

Sub-Store

+

+ +

+Advanced Subscription Manager for QX, Loon, Surge, Stash and Shadowrocket. +

+ +[![Build](https://github.com/sub-store-org/Sub-Store/actions/workflows/main.yml/badge.svg)](https://github.com/sub-store-org/Sub-Store/actions/workflows/main.yml) ![GitHub](https://img.shields.io/github/license/sub-store-org/Sub-Store) ![GitHub issues](https://img.shields.io/github/issues/sub-store-org/Sub-Store) ![GitHub closed pull requests](https://img.shields.io/github/issues-pr-closed-raw/Peng-Ym/Sub-Store) ![Lines of code](https://img.shields.io/tokei/lines/github/sub-store-org/Sub-Store) ![Size](https://img.shields.io/github/languages/code-size/sub-store-org/Sub-Store) +sub-store-org%2FSub-Store | Trendshift +[!["Buy Me A Coffee"](https://www.buymeacoffee.com/assets/img/custom_images/orange_img.png)](https://www.buymeacoffee.com/PengYM) + +Core functionalities: + +1. Conversion among various formats. +2. Subscription formatting. +3. Collect multiple subscriptions in one URL. + + +*** +## 镜像地址 + +- https://hub.docker.com/r/xream/sub-store + +## 使用示例 + +### 一键配置打开 本地前端+本地后端 + +[`http://127.0.0.1:3001?api=http://127.0.0.1:3001/2cXaAxRGfddmGz2yx1wA`](http://127.0.0.1:3001/?api=http://127.0.0.1:3001/2cXaAxRGfddmGz2yx1wA) + +意思是 后端地址为 `http://127.0.0.1:3001/2cXaAxRGfddmGz2yx1wA` + +简单验证一下 `http://127.0.0.1:3001/2cXaAxRGfddmGz2yx1wA/api/utils/env` 可以看到版本信息 + +同样此 URL 也可以作为健康检查的 URL + +## 启动 + +数据文件夹: `/root/sub-store-data` + +端口: `3001` + +监听: `127.0.0.1` // 本示例中演示的是本地版, 局域网直接访问等场景请自己设置 + +后端前缀: `/2cXaAxRGfddmGz2yx1wA` + +定时任务: `55 23 * * *` 每天 23 点 55 分(避开部分机场后端每天0点定时重启) + +> 本示例中演示的定时任务环境变量为 `SUB_STORE_CRON`, 此时使用的是系统的 `crond`; 如果有问题, 可以使用 `SUB_STORE_BACKEND_CRON`, 此时将使用 Node 版 `node-cron` + +推送服务: `https://api.day.app/XXXXXXXXXXXX/[推送标题]/[推送内容]?group=SubStore&autoCopy=1&isArchive=1&sound=shake&level=timeSensitive&icon=https%3A%2F%2Fraw.githubusercontent.com%2F58xinian%2Ficon%2Fmaster%2FSub-Store1.png` + +> 支持 Bark/PushPlus 等服务. 形如: `https://api.day.app/XXXXXXXXX/[推送标题]/[推送内容]?group=SubStore&autoCopy=1&isArchive=1&sound=shake&level=timeSensitive` 或 `http://www.pushplus.plus/send?token=XXXXXXXXX&title=[推送标题]&content=[推送内容]&channel=wechat` 的 URL, `[推送标题]` 和 `[推送内容]` 会被自动替换. + +``` +docker run -it -d --restart=always -e "SUB_STORE_PUSH_SERVICE=https://api.day.app/XXXXXXXXXXXX/[推送标题]/[推送内容]?group=SubStore&autoCopy=1&isArchive=1&sound=shake&level=timeSensitive&icon=https%3A%2F%2Fraw.githubusercontent.com%2F58xinian%2Ficon%2Fmaster%2FSub-Store1.png" -e "SUB_STORE_CRON=55 23 * * *" -e SUB_STORE_FRONTEND_BACKEND_PATH=/2cXaAxRGfddmGz2yx1wA -p 127.0.0.1:3001:3001 -v /root/sub-store-data:/opt/app/data --name sub-store xream/sub-store +``` \ No newline at end of file diff --git a/apps/sub-store/data.yml b/apps/sub-store/data.yml new file mode 100644 index 00000000..45ad1c63 --- /dev/null +++ b/apps/sub-store/data.yml @@ -0,0 +1,19 @@ +name: Sub-Store +tags: + - 工具 +title: 适用于 QX、Loon、Surge、Stash 和 Shadowrocket 的高级订阅管理器 +description: 适用于 QX、Loon、Surge、Stash 和 Shadowrocket 的高级订阅管理器 +additionalProperties: + key: sub-store + name: Sub-Store + tags: + - Tool + shortDescZh: 适用于 QX、Loon、Surge、Stash 和 Shadowrocket 的高级订阅管理器 + shortDescEn: Advanced Subscription Manager for QX, Loon, Surge, Stash and Shadowrocket + type: tool + crossVersionUpdate: true + limit: 0 + recommend: 0 + website: https://hub.docker.com/r/xream/sub-store + github: https://github.com/sub-store-org/Sub-Store + document: https://www.notion.so/Sub-Store-6259586994d34c11a4ced5c406264b46 diff --git a/apps/sub-store/latest/.env.sample b/apps/sub-store/latest/.env.sample new file mode 100644 index 00000000..965972f5 --- /dev/null +++ b/apps/sub-store/latest/.env.sample @@ -0,0 +1,6 @@ +CONTAINER_NAME="sub-store" +PANEL_APP_PORT_HTTP="40232" +DATA_PATH="./data" +SUB_STORE_CRON="55 23 * * *" +SUB_STORE_FRONTEND_BACKEND_PATH="/2cXaAxRGfddmGz2yx1wA" +SUB_STORE_PUSH_SERVICE="https://api.day.app/XXXXXXXXXXXX/[推送标题]/[推送内容]?group=SubStore&autoCopy=1&isArchive=1&sound=shake&level=timeSensitive&icon=https%3A%2F%2Fraw.githubusercontent.com%2F58xinian%2Ficon%2Fmaster%2FSub-Store1.png" diff --git a/apps/sub-store/latest/data.yml b/apps/sub-store/latest/data.yml new file mode 100644 index 00000000..25baadca --- /dev/null +++ b/apps/sub-store/latest/data.yml @@ -0,0 +1,38 @@ +additionalProperties: + formFields: + - default: 40232 + edit: true + envKey: PANEL_APP_PORT_HTTP + labelEn: Port + labelZh: 端口 + required: true + rule: paramPort + type: number + - default: 'https://api.day.app/XXXXXXXXXXXX/[推送标题]/[推送内容]?group=SubStore&autoCopy=1&isArchive=1&sound=shake&level=timeSensitive&icon=https%3A%2F%2Fraw.githubusercontent.com%2F58xinian%2Ficon%2Fmaster%2FSub-Store1.png' + edit: true + envKey: SUB_STORE_PUSH_SERVICE + labelEn: Push Service URL + labelZh: 推送服务 URL + required: true + type: text + - default: "55 23 * * *" + edit: true + envKey: SUB_STORE_CRON + labelEn: Cron Schedule + labelZh: Cron 定时任务 + required: true + type: text + - default: "/2cXaAxRGfddmGz2yx1wA" + edit: true + envKey: SUB_STORE_FRONTEND_BACKEND_PATH + labelEn: Frontend Backend Path + labelZh: 前端后端路径 + required: true + type: text + - default: "./data" + edit: true + envKey: DATA_PATH + labelEn: Data Directory + labelZh: 数据目录 + required: true + type: text diff --git a/apps/sub-store/latest/docker-compose.yml b/apps/sub-store/latest/docker-compose.yml new file mode 100644 index 00000000..f3dfefe1 --- /dev/null +++ b/apps/sub-store/latest/docker-compose.yml @@ -0,0 +1,22 @@ +version: '3' +services: + sub-store: + image: xream/sub-store:latest + container_name: ${CONTAINER_NAME} + restart: always + networks: + - 1panel-network + ports: + - "${PANEL_APP_PORT_HTTP}:3001" + environment: + - SUB_STORE_PUSH_SERVICE=${SUB_STORE_PUSH_SERVICE} + - SUB_STORE_CRON=${SUB_STORE_CRON} + - SUB_STORE_FRONTEND_BACKEND_PATH=${SUB_STORE_FRONTEND_BACKEND_PATH} + volumes: + - ${DATA_PATH}:/opt/app/data + labels: + createdBy: "Apps" + +networks: + 1panel-network: + external: true \ No newline at end of file diff --git a/apps/sub-store/logo.png b/apps/sub-store/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..5215d6e0d14ca05eaadfe9a4344c3536293313f4 GIT binary patch literal 5638 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