From 533551d4b331b41134cb3cc8585e0dafdc0e1aeb Mon Sep 17 00:00:00 2001 From: QYG2297248353 Date: Fri, 11 Jul 2025 06:34:02 +0000 Subject: [PATCH] Synced apps from source repository via GitHub Actions --- apps/outline/{0.85.0 => 0.85.1}/.env | 0 apps/outline/{0.85.0 => 0.85.1}/data.yml | 0 .../{0.85.0 => 0.85.1}/docker-compose.yml | 2 +- .../{0.85.0 => 0.85.1}/envs/default.env | 0 .../{0.85.0 => 0.85.1}/envs/global.env | 0 .../{0.85.0 => 0.85.1}/envs/outline.env | 0 .../{0.85.0 => 0.85.1}/scripts/init.sh | 0 .../{0.85.0 => 0.85.1}/scripts/uninstall.sh | 0 .../{0.85.0 => 0.85.1}/scripts/upgrade.sh | 0 apps/peer-ban-helper/7.4.15/.env | 9 + apps/peer-ban-helper/7.4.15/data.yml | 33 +++ .../peer-ban-helper/7.4.15/docker-compose.yml | 22 ++ apps/peer-ban-helper/7.4.15/envs/default.env | 2 + apps/peer-ban-helper/7.4.15/envs/global.env | 2 + apps/peer-ban-helper/7.4.15/scripts/init.sh | 17 ++ .../7.4.15/scripts/uninstall.sh | 10 + .../peer-ban-helper/7.4.15/scripts/upgrade.sh | 17 ++ apps/peer-ban-helper/README.md | 41 ++++ apps/peer-ban-helper/data.yml | 15 ++ apps/peer-ban-helper/logo.png | Bin 0 -> 24973 bytes apps/peer-ban-helper/logo.svg | 28 +++ apps/rustdesk-api/2.6.25/.env | 17 +- apps/rustdesk-api/2.6.25/conf/hbbr/run | 2 +- apps/rustdesk-api/2.6.25/conf/hbbs/run | 2 +- apps/rustdesk-api/2.6.25/data.yml | 34 ++- apps/rustdesk-api/2.6.25/docker-compose.yml | 6 +- apps/rustdesk-api/s6-latest/.env | 75 ++++++ apps/rustdesk-api/s6-latest/conf/hbbr/run | 5 + apps/rustdesk-api/s6-latest/conf/hbbs/run | 6 + apps/rustdesk-api/s6-latest/data.yml | 220 ++++++++++++++++++ .../rustdesk-api/s6-latest/docker-compose.yml | 40 ++++ apps/rustdesk-api/s6-latest/envs/default.env | 2 + apps/rustdesk-api/s6-latest/envs/global.env | 2 + apps/rustdesk-api/s6-latest/scripts/init.sh | 19 ++ .../s6-latest/scripts/uninstall.sh | 10 + .../rustdesk-api/s6-latest/scripts/upgrade.sh | 17 ++ 36 files changed, 631 insertions(+), 24 deletions(-) rename apps/outline/{0.85.0 => 0.85.1}/.env (100%) rename apps/outline/{0.85.0 => 0.85.1}/data.yml (100%) rename apps/outline/{0.85.0 => 0.85.1}/docker-compose.yml (92%) rename apps/outline/{0.85.0 => 0.85.1}/envs/default.env (100%) rename apps/outline/{0.85.0 => 0.85.1}/envs/global.env (100%) rename apps/outline/{0.85.0 => 0.85.1}/envs/outline.env (100%) rename apps/outline/{0.85.0 => 0.85.1}/scripts/init.sh (100%) rename apps/outline/{0.85.0 => 0.85.1}/scripts/uninstall.sh (100%) rename apps/outline/{0.85.0 => 0.85.1}/scripts/upgrade.sh (100%) create mode 100644 apps/peer-ban-helper/7.4.15/.env create mode 100644 apps/peer-ban-helper/7.4.15/data.yml create mode 100644 apps/peer-ban-helper/7.4.15/docker-compose.yml create mode 100644 apps/peer-ban-helper/7.4.15/envs/default.env create mode 100644 apps/peer-ban-helper/7.4.15/envs/global.env create mode 100644 apps/peer-ban-helper/7.4.15/scripts/init.sh create mode 100644 apps/peer-ban-helper/7.4.15/scripts/uninstall.sh create mode 100644 apps/peer-ban-helper/7.4.15/scripts/upgrade.sh create mode 100644 apps/peer-ban-helper/README.md create mode 100644 apps/peer-ban-helper/data.yml create mode 100644 apps/peer-ban-helper/logo.png create mode 100644 apps/peer-ban-helper/logo.svg create mode 100644 apps/rustdesk-api/s6-latest/.env create mode 100644 apps/rustdesk-api/s6-latest/conf/hbbr/run create mode 100644 apps/rustdesk-api/s6-latest/conf/hbbs/run create mode 100644 apps/rustdesk-api/s6-latest/data.yml create mode 100644 apps/rustdesk-api/s6-latest/docker-compose.yml create mode 100644 apps/rustdesk-api/s6-latest/envs/default.env create mode 100644 apps/rustdesk-api/s6-latest/envs/global.env create mode 100644 apps/rustdesk-api/s6-latest/scripts/init.sh create mode 100644 apps/rustdesk-api/s6-latest/scripts/uninstall.sh create mode 100644 apps/rustdesk-api/s6-latest/scripts/upgrade.sh diff --git a/apps/outline/0.85.0/.env b/apps/outline/0.85.1/.env similarity index 100% rename from apps/outline/0.85.0/.env rename to apps/outline/0.85.1/.env diff --git a/apps/outline/0.85.0/data.yml b/apps/outline/0.85.1/data.yml similarity index 100% rename from apps/outline/0.85.0/data.yml rename to apps/outline/0.85.1/data.yml diff --git a/apps/outline/0.85.0/docker-compose.yml b/apps/outline/0.85.1/docker-compose.yml similarity index 92% rename from apps/outline/0.85.0/docker-compose.yml rename to apps/outline/0.85.1/docker-compose.yml index a7e545d..4c6a9ad 100644 --- a/apps/outline/0.85.0/docker-compose.yml +++ b/apps/outline/0.85.1/docker-compose.yml @@ -10,7 +10,7 @@ services: - .env environment: - DATABASE_URL=postgres://${DB_USERNAME}:${DB_PASSWORD}@${DB_HOSTNAME}:${DB_PORT}/${DB_DATABASE_NAME} - image: outlinewiki/outline:0.85.0 + image: outlinewiki/outline:0.85.1 labels: createdBy: Apps networks: diff --git a/apps/outline/0.85.0/envs/default.env b/apps/outline/0.85.1/envs/default.env similarity index 100% rename from apps/outline/0.85.0/envs/default.env rename to apps/outline/0.85.1/envs/default.env diff --git a/apps/outline/0.85.0/envs/global.env b/apps/outline/0.85.1/envs/global.env similarity index 100% rename from apps/outline/0.85.0/envs/global.env rename to apps/outline/0.85.1/envs/global.env diff --git a/apps/outline/0.85.0/envs/outline.env b/apps/outline/0.85.1/envs/outline.env similarity index 100% rename from apps/outline/0.85.0/envs/outline.env rename to apps/outline/0.85.1/envs/outline.env diff --git a/apps/outline/0.85.0/scripts/init.sh b/apps/outline/0.85.1/scripts/init.sh similarity index 100% rename from apps/outline/0.85.0/scripts/init.sh rename to apps/outline/0.85.1/scripts/init.sh diff --git a/apps/outline/0.85.0/scripts/uninstall.sh b/apps/outline/0.85.1/scripts/uninstall.sh similarity index 100% rename from apps/outline/0.85.0/scripts/uninstall.sh rename to apps/outline/0.85.1/scripts/uninstall.sh diff --git a/apps/outline/0.85.0/scripts/upgrade.sh b/apps/outline/0.85.1/scripts/upgrade.sh similarity index 100% rename from apps/outline/0.85.0/scripts/upgrade.sh rename to apps/outline/0.85.1/scripts/upgrade.sh diff --git a/apps/peer-ban-helper/7.4.15/.env b/apps/peer-ban-helper/7.4.15/.env new file mode 100644 index 0000000..27fe51e --- /dev/null +++ b/apps/peer-ban-helper/7.4.15/.env @@ -0,0 +1,9 @@ +# 网络模式 [必填] +NETWORK_MODE=1panel-network + +# 数据持久化路径 [必填] +PEERBANHELPER_ROOT_PATH=/home/peerbanhelper + +# WebUI 端口 [必填] +PANEL_APP_PORT_HTTP=9898 + diff --git a/apps/peer-ban-helper/7.4.15/data.yml b/apps/peer-ban-helper/7.4.15/data.yml new file mode 100644 index 0000000..b13f187 --- /dev/null +++ b/apps/peer-ban-helper/7.4.15/data.yml @@ -0,0 +1,33 @@ +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: "/home/peerbanhelper" + edit: true + envKey: PEERBANHELPER_ROOT_PATH + labelZh: 数据持久化路径 + labelEn: Data persistence path + required: true + type: text + - default: 9898 + edit: true + envKey: PANEL_APP_PORT_HTTP + labelZh: WebUI 端口 + labelEn: WebUI port + required: true + rule: paramPort + type: number diff --git a/apps/peer-ban-helper/7.4.15/docker-compose.yml b/apps/peer-ban-helper/7.4.15/docker-compose.yml new file mode 100644 index 0000000..f8f4491 --- /dev/null +++ b/apps/peer-ban-helper/7.4.15/docker-compose.yml @@ -0,0 +1,22 @@ +networks: + 1panel-network: + external: true +services: + peerbanhelper: + container_name: peer-ban-helper + env_file: + - ./envs/global.env + - .env + environment: + - PUID=0 + - PGID=0 + - TZ=Asia/Shanghai + image: ghostchu/peerbanhelper:v7.4.15 + labels: + createdBy: Apps + network_mode: ${NETWORK_MODE:-host} + ports: + - ${PANEL_APP_PORT_HTTP}:9898 + restart: always + volumes: + - ${PEERBANHELPER_ROOT_PATH}/app:/app/data diff --git a/apps/peer-ban-helper/7.4.15/envs/default.env b/apps/peer-ban-helper/7.4.15/envs/default.env new file mode 100644 index 0000000..cd05f46 --- /dev/null +++ b/apps/peer-ban-helper/7.4.15/envs/default.env @@ -0,0 +1,2 @@ +# copyright© 2024 XinJiang Ms Studio +ENV_FILE=.env diff --git a/apps/peer-ban-helper/7.4.15/envs/global.env b/apps/peer-ban-helper/7.4.15/envs/global.env new file mode 100644 index 0000000..e10989f --- /dev/null +++ b/apps/peer-ban-helper/7.4.15/envs/global.env @@ -0,0 +1,2 @@ +# copyright© 2024 XinJiang Ms Studio +TZ=Asia/Shanghai diff --git a/apps/peer-ban-helper/7.4.15/scripts/init.sh b/apps/peer-ban-helper/7.4.15/scripts/init.sh new file mode 100644 index 0000000..07fb8c3 --- /dev/null +++ b/apps/peer-ban-helper/7.4.15/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/apps/peer-ban-helper/7.4.15/scripts/uninstall.sh b/apps/peer-ban-helper/7.4.15/scripts/uninstall.sh new file mode 100644 index 0000000..c86c4fb --- /dev/null +++ b/apps/peer-ban-helper/7.4.15/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/apps/peer-ban-helper/7.4.15/scripts/upgrade.sh b/apps/peer-ban-helper/7.4.15/scripts/upgrade.sh new file mode 100644 index 0000000..07fb8c3 --- /dev/null +++ b/apps/peer-ban-helper/7.4.15/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/apps/peer-ban-helper/README.md b/apps/peer-ban-helper/README.md new file mode 100644 index 0000000..82a9b67 --- /dev/null +++ b/apps/peer-ban-helper/README.md @@ -0,0 +1,41 @@ +# PeerBanHelper + +PeerBanHelper 是一个开放源代码的个人网络防火墙安全软件 + +![PeerBanHelper](https://file.lifebus.top/imgs/peerbanhelper_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) + +## 安装说明 + +所有安装在 Docker 中的下载器,必须使用 host 网络驱动程序。PBH 需要下载器能获得 Peer 的真实 IP,不能使用 bridge 桥接模式! + ++ qBittorrent/qBitorrent,4.5.0 或更高版本,不支持 XDown ++ BiglyBT(需要安装插件) ++ Deluge(需要安装插件) ++ Transmission (4.1.0-beta2 或更高版本) ++ BitComet v2.10 Beta6 [20240928] 或更高版本 (不支持 P2SP LTSeed 长效种子反吸血,因为 BitComet 暂时无法封禁长效连接) + +PeerBanHelper 仅支持对传统 IPv4 或 IPv6 地址的反吸血,如遇 I2P 或者 Tor 连接将主动忽略。 + +## 简介 + +PeerBanHelper 是一个开放源代码的个人网络防火墙安全软件。通过连接支持的应用程序(如:BitTorrent 客户端软件)的 Web API +接口获取受保护应用的连接信息,识别其中可能包含潜在安全威胁的连接并通知对应的应用程序主动断开其连接。 + +## 特性 + ++ PeerID 黑名单 ++ Client Name 黑名单 ++ IP/GeoIP/IP 类型 黑名单 ++ 虚假进度检查器(提供启发式客户端检测功能) ++ 自动连锁封禁 ++ 多拨追猎 ++ Peer ID/Client Name 伪装检查;通过 AviatorScript 引擎 实现 ++ 主动监测(提供本地数据分析功能) ++ 网络 IP 集规则订阅 ++ WebUI (目前支持:活跃封禁名单查看,历史封禁查询,封禁最频繁的 Top 50 IP,规则订阅管理,图表查看,Peer 列表查看) + +--- + +![Ms Studio](https://file.lifebus.top/imgs/ms_blank_001.png) diff --git a/apps/peer-ban-helper/data.yml b/apps/peer-ban-helper/data.yml new file mode 100644 index 0000000..d0fe79d --- /dev/null +++ b/apps/peer-ban-helper/data.yml @@ -0,0 +1,15 @@ +additionalProperties: + key: peer-ban-helper + name: PeerBanHelper + tags: + - WebSite + - Tool + - Local + shortDescZh: BT 反吸血工具 + shortDescEn: BT Anti-Siphon Tool + type: website + crossVersionUpdate: true + limit: 0 + website: https://github.com/PBH-BTN/PeerBanHelper/ + github: https://github.com/PBH-BTN/PeerBanHelper/ + document: https://github.com/PBH-BTN/PeerBanHelper/ diff --git a/apps/peer-ban-helper/logo.png b/apps/peer-ban-helper/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..b6bdcc08e5ddd164f6f65496941b59a01aa4d465 GIT binary patch literal 24973 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 XOfN0tTj-!300000NkvXXu0mjfz?`h( literal 0 KcmV+b0RR6000031 diff --git a/apps/peer-ban-helper/logo.svg b/apps/peer-ban-helper/logo.svg new file mode 100644 index 0000000..96a19a3 --- /dev/null +++ b/apps/peer-ban-helper/logo.svg @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + + + diff --git a/apps/rustdesk-api/2.6.25/.env b/apps/rustdesk-api/2.6.25/.env index 5e9e80c..96a0fb5 100644 --- a/apps/rustdesk-api/2.6.25/.env +++ b/apps/rustdesk-api/2.6.25/.env @@ -1,11 +1,11 @@ # 数据持久化路径 [必填] RUSTDESK_API_ROOT_PATH=/home/rustdesk-api -# WebUI 端口 [必填] +# WebUI API 端口 [必填] PANEL_APP_PORT_HTTP=21114 -# 服务端口 21115 [必填] -PANEL_APP_PORT_SERVER_1=21115 +# NAT 服务端口 [必填] +PANEL_APP_PORT_NAT=21115 # ID 服务端口 [必填] PANEL_APP_PORT_ID=21116 @@ -13,11 +13,11 @@ PANEL_APP_PORT_ID=21116 # 中继服务端口 [必填] PANEL_APP_PORT_SERVER=21117 -# 服务端口 21118 [必填] -PANEL_APP_PORT_SERVER_2=21118 +# WebSocket API 服务端口 [必填] +PANEL_APP_PORT_API_WS=21118 -# 服务端口 21119 [必填] -PANEL_APP_PORT_SERVER_3=21119 +# WebSocket Server 服务端口 [必填] +PANEL_APP_PORT_SERVER_WS=21119 # RustDesk 中级服务地址 [必填] RUSTDESK_SERVER_URL=http://127.0.0.1:21117 @@ -37,6 +37,9 @@ RUSTDESK_API_RUSTDESK_KEY= # 登录有效期 [必填] RUSTDESK_API_APP_TOKEN_EXPIRE=168h +# 启用个人版API [必填] +RUSTDESK_API_RUSTDESK_PERSONAL=1 + # 启用 Web Client [必填] RUSTDESK_API_APP_WEB_CLIENT=1 diff --git a/apps/rustdesk-api/2.6.25/conf/hbbr/run b/apps/rustdesk-api/2.6.25/conf/hbbr/run index 7d60256..55a0c25 100644 --- a/apps/rustdesk-api/2.6.25/conf/hbbr/run +++ b/apps/rustdesk-api/2.6.25/conf/hbbr/run @@ -1,5 +1,5 @@ #!/command/with-contenv sh cd /data || exit PARAMS= -[ "${ENCRYPTED_ONLY}" = "1" ] && PARAMS="-k ${KEY}" +[ "${ENCRYPTED_ONLY}" = "1" ] && PARAMS="-k ${RUSTDESK_API_RUSTDESK_KEY}" /usr/bin/hbbr $PARAMS diff --git a/apps/rustdesk-api/2.6.25/conf/hbbs/run b/apps/rustdesk-api/2.6.25/conf/hbbs/run index 44cdd52..d56d246 100644 --- a/apps/rustdesk-api/2.6.25/conf/hbbs/run +++ b/apps/rustdesk-api/2.6.25/conf/hbbs/run @@ -2,5 +2,5 @@ sleep 2 cd /data PARAMS= -[ "${ENCRYPTED_ONLY}" = "1" ] && PARAMS="-k ${KEY}" +[ "${ENCRYPTED_ONLY}" = "1" ] && PARAMS="-k ${RUSTDESK_API_RUSTDESK_KEY}" /usr/bin/hbbs -r $RELAY $PARAMS diff --git a/apps/rustdesk-api/2.6.25/data.yml b/apps/rustdesk-api/2.6.25/data.yml index 85393a6..7094413 100644 --- a/apps/rustdesk-api/2.6.25/data.yml +++ b/apps/rustdesk-api/2.6.25/data.yml @@ -10,16 +10,16 @@ additionalProperties: - default: 21114 edit: true envKey: PANEL_APP_PORT_HTTP - labelZh: WebUI 端口 - labelEn: WebUI port + labelZh: WebUI API 端口 + labelEn: WebUI API port required: true rule: paramPort type: number - default: 21115 edit: true - envKey: PANEL_APP_PORT_SERVER_1 - labelZh: 服务端口 21115 - labelEn: 服务端口 21115 + envKey: PANEL_APP_PORT_NAT + labelZh: NAT 服务端口 + labelEn: NAT Server Port required: true rule: paramPort type: number @@ -41,17 +41,17 @@ additionalProperties: type: number - default: 21118 edit: true - envKey: PANEL_APP_PORT_SERVER_2 - labelZh: 服务端口 21118 - labelEn: Server Port 21118 + envKey: PANEL_APP_PORT_API_WS + labelZh: WebSocket API 服务端口 + labelEn: WebSocket API Service Port required: true rule: paramPort type: number - default: 21119 edit: true - envKey: PANEL_APP_PORT_SERVER_3 - labelZh: 服务端口 21119 - labelEn: Server Port 21119 + envKey: PANEL_APP_PORT_SERVER_WS + labelZh: WebSocket Server 服务端口 + labelEn: WebSocket Server Service Port required: true rule: paramPort type: number @@ -97,6 +97,18 @@ additionalProperties: labelEn: Login validity period required: true type: text + - default: "1" + edit: true + envKey: RUSTDESK_API_RUSTDESK_PERSONAL + labelZh: 启用个人版API + labelEn: Enable personal API + required: true + type: select + values: + - label: 启用 + value: "1" + - label: 禁用 + value: "0" - default: "1" edit: true envKey: RUSTDESK_API_APP_WEB_CLIENT diff --git a/apps/rustdesk-api/2.6.25/docker-compose.yml b/apps/rustdesk-api/2.6.25/docker-compose.yml index 490a9d7..726b763 100644 --- a/apps/rustdesk-api/2.6.25/docker-compose.yml +++ b/apps/rustdesk-api/2.6.25/docker-compose.yml @@ -36,12 +36,12 @@ services: networks: - 1panel-network ports: - - ${PANEL_APP_PORT_SERVER_1}:21115 + - ${PANEL_APP_PORT_NAT}:21115 - ${PANEL_APP_PORT_ID}:21116 - ${PANEL_APP_PORT_ID}:21116/udp - ${PANEL_APP_PORT_SERVER}:21117 - - ${PANEL_APP_PORT_SERVER_2}:21118 - - ${PANEL_APP_PORT_SERVER_3}:21119 + - ${PANEL_APP_PORT_API_WS}:21118 + - ${PANEL_APP_PORT_SERVER_WS}:21119 restart: always volumes: - ${RUSTDESK_API_ROOT_PATH}/server-data:/data diff --git a/apps/rustdesk-api/s6-latest/.env b/apps/rustdesk-api/s6-latest/.env new file mode 100644 index 0000000..057e9b0 --- /dev/null +++ b/apps/rustdesk-api/s6-latest/.env @@ -0,0 +1,75 @@ +# 数据持久化路径 [必填] +RUSTDESK_API_ROOT_PATH=/home/rustdesk-api + +# WebUI API 端口 [必填] +PANEL_APP_PORT_HTTP=21114 + +# NAT 测试服务端口 [必填] +PANEL_APP_PORT_NAT=21115 + +# ID 服务端口 [必填] +PANEL_APP_PORT_ID=21116 + +# 中继服务端口 [必填] +PANEL_APP_PORT_SERVER=21117 + +# WebSocket API 服务端口 [必填] +PANEL_APP_PORT_API_WS=21118 + +# WebSocket Server 服务端口 [必填] +PANEL_APP_PORT_SERVER_WS=21119 + +# RustDesk 中级服务地址 [必填] +RUSTDESK_SERVER_URL=http://127.0.0.1:21117 + +# RustDesk ID 服务地址 [必填] +RUSTDESK_API_RUSTDESK_ID_SERVER=http://127.0.0.1:21116 + +# RustDesk API 服务地址 [必填] +RUSTDESK_API_RUSTDESK_API_SERVER=http://127.0.0.1:21114 + +# 后台页面标题 [必填] +RUSTDESK_API_ADMIN_TITLE=RustDesk API Admin + +# RustDesk API 密钥 [必填] +RUSTDESK_API_RUSTDESK_KEY= + +# 登录有效期 [必填] +RUSTDESK_API_APP_TOKEN_EXPIRE=168h + +# 启用个人版API [必填] +RUSTDESK_API_RUSTDESK_PERSONAL=1 + +# 启用 Web Client [必填] +RUSTDESK_API_APP_WEB_CLIENT=1 + +# 开启 Swagger 文档 [必填] +RUSTDESK_API_APP_SHOW_SWAGGER=1 + +# 启用注册 [必填] +RUSTDESK_API_APP_REGISTER=false + +# 登录策略 [必填] +RUSTDESK_API_APP_DISABLE_PWD_LOGIN=false + +# 启用代理 [必填] +RUSTDESK_API_PROXY_ENABLE=false + +# 代理地址 +RUSTDESK_API_PROXY_HOST= + +# 数据库类型 [必填] +RUSTDESK_API_GORM_TYPE=sqlite + +# 数据库地址 +RUSTDESK_API_MYSQL_ADDR=127.0.0.1:3306 + +# 数据库 名称 +RUSTDESK_API_MYSQL_DBNAME=rustdesk + +# 数据库 用户名 +RUSTDESK_API_MYSQL_USERNAME=rustdesk + +# 数据库 密码 +RUSTDESK_API_MYSQL_PASSWORD= + diff --git a/apps/rustdesk-api/s6-latest/conf/hbbr/run b/apps/rustdesk-api/s6-latest/conf/hbbr/run new file mode 100644 index 0000000..55a0c25 --- /dev/null +++ b/apps/rustdesk-api/s6-latest/conf/hbbr/run @@ -0,0 +1,5 @@ +#!/command/with-contenv sh +cd /data || exit +PARAMS= +[ "${ENCRYPTED_ONLY}" = "1" ] && PARAMS="-k ${RUSTDESK_API_RUSTDESK_KEY}" +/usr/bin/hbbr $PARAMS diff --git a/apps/rustdesk-api/s6-latest/conf/hbbs/run b/apps/rustdesk-api/s6-latest/conf/hbbs/run new file mode 100644 index 0000000..d56d246 --- /dev/null +++ b/apps/rustdesk-api/s6-latest/conf/hbbs/run @@ -0,0 +1,6 @@ +#!/command/with-contenv sh +sleep 2 +cd /data +PARAMS= +[ "${ENCRYPTED_ONLY}" = "1" ] && PARAMS="-k ${RUSTDESK_API_RUSTDESK_KEY}" +/usr/bin/hbbs -r $RELAY $PARAMS diff --git a/apps/rustdesk-api/s6-latest/data.yml b/apps/rustdesk-api/s6-latest/data.yml new file mode 100644 index 0000000..2dfdced --- /dev/null +++ b/apps/rustdesk-api/s6-latest/data.yml @@ -0,0 +1,220 @@ +additionalProperties: + formFields: + - default: "/home/rustdesk-api" + edit: true + envKey: RUSTDESK_API_ROOT_PATH + labelZh: 数据持久化路径 + labelEn: Data persistence path + required: true + type: text + - default: 21114 + edit: true + envKey: PANEL_APP_PORT_HTTP + labelZh: WebUI API 端口 + labelEn: WebUI API port + required: true + rule: paramPort + type: number + - default: 21115 + edit: true + envKey: PANEL_APP_PORT_NAT + labelZh: NAT 测试服务端口 + labelEn: NAT Test Server Port + required: true + rule: paramPort + type: number + - default: 21116 + edit: true + envKey: PANEL_APP_PORT_ID + labelZh: ID 服务端口 + labelEn: ID Server Port + required: true + rule: paramPort + type: number + - default: 21117 + edit: true + envKey: PANEL_APP_PORT_SERVER + labelZh: 中继服务端口 + labelEn: Intermediate Service Port + required: true + rule: paramPort + type: number + - default: 21118 + edit: true + envKey: PANEL_APP_PORT_API_WS + labelZh: WebSocket API 服务端口 + labelEn: WebSocket API Service Port + required: true + rule: paramPort + type: number + - default: 21119 + edit: true + envKey: PANEL_APP_PORT_SERVER_WS + labelZh: WebSocket Server 服务端口 + labelEn: WebSocket Server Service Port + required: true + rule: paramPort + type: number + - default: "http://127.0.0.1:21117" + edit: true + envKey: RUSTDESK_SERVER_URL + labelZh: RustDesk 中级服务地址 + labelEn: RustDesk Intermediate service address + required: true + type: text + - default: "http://127.0.0.1:21116" + edit: true + envKey: RUSTDESK_API_RUSTDESK_ID_SERVER + labelZh: RustDesk ID 服务地址 + labelEn: RustDesk ID server address + required: true + type: text + - default: "http://127.0.0.1:21114" + edit: true + envKey: RUSTDESK_API_RUSTDESK_API_SERVER + labelZh: RustDesk API 服务地址 + labelEn: RustDesk API server address + required: true + type: text + - default: "RustDesk API Admin" + edit: true + envKey: RUSTDESK_API_ADMIN_TITLE + labelZh: 后台页面标题 + labelEn: Admin page title + required: true + type: text + - default: "" + edit: true + envKey: RUSTDESK_API_RUSTDESK_KEY + labelZh: RustDesk API 密钥 + labelEn: RustDesk API key + required: true + type: password + - default: "168h" + edit: true + envKey: RUSTDESK_API_APP_TOKEN_EXPIRE + labelZh: 登录有效期 + labelEn: Login validity period + required: true + type: text + - default: "1" + edit: true + envKey: RUSTDESK_API_RUSTDESK_PERSONAL + labelZh: 启用个人版API + labelEn: Enable personal API + required: true + type: select + values: + - label: 启用 + value: "1" + - label: 禁用 + value: "0" + - default: "1" + edit: true + envKey: RUSTDESK_API_APP_WEB_CLIENT + labelZh: 启用 Web Client + labelEn: Enable Web Client + required: true + type: select + values: + - label: 启用 + value: "1" + - label: 禁用 + value: "0" + - default: "1" + edit: true + envKey: RUSTDESK_API_APP_SHOW_SWAGGER + labelZh: 开启 Swagger 文档 + labelEn: Enable Swagger docs + required: true + type: select + values: + - label: 启用 + value: "1" + - label: 禁用 + value: "0" + - default: "false" + edit: true + envKey: RUSTDESK_API_APP_REGISTER + labelZh: 启用注册 + labelEn: Enable register + required: true + type: select + values: + - label: 启用 + value: "true" + - label: 禁用 + value: "false" + - default: "false" + edit: true + envKey: RUSTDESK_API_APP_DISABLE_PWD_LOGIN + labelZh: 登录策略 + labelEn: Login strategy + required: true + type: select + values: + - label: 禁用密码登录 + value: "true" + - label: 允许密码登录 + value: "false" + - default: "false" + edit: true + envKey: RUSTDESK_API_PROXY_ENABLE + labelZh: 启用代理 + labelEn: Enable proxy + required: true + type: select + values: + - label: 启用 + value: "true" + - label: 禁用 + value: "false" + - default: "" + edit: true + envKey: RUSTDESK_API_PROXY_HOST + labelZh: 代理地址 + labelEn: Proxy address + required: false + type: text + - default: "sqlite" + edit: true + envKey: RUSTDESK_API_GORM_TYPE + labelZh: 数据库类型 + labelEn: Database type + required: true + type: select + values: + - label: sqlite + value: "sqlite" + - label: MySQL + value: "mysql" + - default: "127.0.0.1:3306" + edit: true + envKey: RUSTDESK_API_MYSQL_ADDR + labelZh: 数据库地址 + labelEn: Database Host + required: false + type: text + - default: "rustdesk" + edit: true + envKey: RUSTDESK_API_MYSQL_DBNAME + labelZh: 数据库 名称 + labelEn: Database Name + required: false + rule: paramCommon + type: text + - default: "rustdesk" + edit: true + envKey: RUSTDESK_API_MYSQL_USERNAME + labelZh: 数据库 用户名 + labelEn: Database Username + required: false + type: text + - default: "" + edit: true + envKey: RUSTDESK_API_MYSQL_PASSWORD + labelZh: 数据库 密码 + labelEn: Database Password + required: false + rule: paramComplexity + type: password diff --git a/apps/rustdesk-api/s6-latest/docker-compose.yml b/apps/rustdesk-api/s6-latest/docker-compose.yml new file mode 100644 index 0000000..3bc084b --- /dev/null +++ b/apps/rustdesk-api/s6-latest/docker-compose.yml @@ -0,0 +1,40 @@ +networks: + 1panel-network: + external: true +services: + rustdesk: + container_name: rustdesk-api + env_file: + - ./envs/global.env + - .env + environment: + - TZ=Asia/Shanghai + - RUSTDESK_API_LANG=zh-CN + image: lejianwen/rustdesk-server-s6:latest + labels: + createdBy: Apps + networks: + - 1panel-network + ports: + - ${PANEL_APP_PORT_HTTP}:21114 + - ${PANEL_APP_PORT_NAT}:21115 + - ${PANEL_APP_PORT_ID}:21116 + - ${PANEL_APP_PORT_ID}:21116/udp + - ${PANEL_APP_PORT_SERVER}:21117 + - ${PANEL_APP_PORT_API_WS}:21118 + - ${PANEL_APP_PORT_SERVER_WS}:21119 + restart: always + volumes: + - ${RUSTDESK_API_ROOT_PATH}/api-data:/app/data + rustdesk-server-s6: + environment: + - TZ=Asia/Shanghai + - MUST_LOGIN=N + - ENCRYPTED_ONLY=1 + - RUSTDESK_API_LANG=zh-CN + - RELAY=${RUSTDESK_SERVER_URL} + volumes: + - ${RUSTDESK_API_ROOT_PATH}/server-data:/data + - ${RUSTDESK_API_ROOT_PATH}/api-data:/app/data + - ${HBBR_RUN_FILE:-./conf/hbbr/run}:/etc/s6-overlay/s6-rc.d/hbbr/run + - ${HBBS_RUN_FILE:-./conf/hbbs/run}:/etc/s6-overlay/s6-rc.d/hbbs/run diff --git a/apps/rustdesk-api/s6-latest/envs/default.env b/apps/rustdesk-api/s6-latest/envs/default.env new file mode 100644 index 0000000..cd05f46 --- /dev/null +++ b/apps/rustdesk-api/s6-latest/envs/default.env @@ -0,0 +1,2 @@ +# copyright© 2024 XinJiang Ms Studio +ENV_FILE=.env diff --git a/apps/rustdesk-api/s6-latest/envs/global.env b/apps/rustdesk-api/s6-latest/envs/global.env new file mode 100644 index 0000000..e10989f --- /dev/null +++ b/apps/rustdesk-api/s6-latest/envs/global.env @@ -0,0 +1,2 @@ +# copyright© 2024 XinJiang Ms Studio +TZ=Asia/Shanghai diff --git a/apps/rustdesk-api/s6-latest/scripts/init.sh b/apps/rustdesk-api/s6-latest/scripts/init.sh new file mode 100644 index 0000000..b7348b2 --- /dev/null +++ b/apps/rustdesk-api/s6-latest/scripts/init.sh @@ -0,0 +1,19 @@ +#!/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 "HBBR_RUN_FILE=${CURRENT_DIR}/conf/hbbr/run" >> .env + echo "HBBS_RUN_FILE=${CURRENT_DIR}/conf/hbbs/run" >> .env + + echo "Check Finish." + +else + echo "Error: .env file not found." +fi diff --git a/apps/rustdesk-api/s6-latest/scripts/uninstall.sh b/apps/rustdesk-api/s6-latest/scripts/uninstall.sh new file mode 100644 index 0000000..c86c4fb --- /dev/null +++ b/apps/rustdesk-api/s6-latest/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/apps/rustdesk-api/s6-latest/scripts/upgrade.sh b/apps/rustdesk-api/s6-latest/scripts/upgrade.sh new file mode 100644 index 0000000..07fb8c3 --- /dev/null +++ b/apps/rustdesk-api/s6-latest/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