$^IVxu+OSC!yZ+`XTTSkDfx-KA)e0I@Tw+{+%9mV3{kT?XG5
zM8{mW
HANIx+e
zRD`iavHHRqw*%Fkcbfx!=(Nvg60*fE)wZ|z-{*lZ?NG1bbT#Xf9dP?1rROLgarC*E
z6{6{cn&Cb~2T8UDo_nRkrP*?82a%6JSp!By#Pf#gdzR11fwQt$RVFEhMLVuLCne*i
z=iTbRyHv;;R9DT^dCx8mTsXQs07>bUe(K(tvu`_RmhuLtN1FBcKIu`wYZB;4_@h8C
z)JfsmcZ|+-XtW}hoo}vDC}?_q(lzNss|X9@*gG*OKTqK#&-LpOpgEt$2p&BQ0>ySGD}iUp6`YS90YDgRp%ya%FiN}r61*kSPJLY
zjni~BgM5#K59!#yD_tU-l(;|?X*1}9uVUNoWWZ^U&!KQfm)3=bv|{av)tQUg-#*-e
z-wm7S(msWD^jj|tWdOyzeHUaV@zxnA?d*Z{v+=-UOk(+SVR%51D%UgYV?{BPTOGev
z1sxZgE;DT=$-zdWvvb{j-6n!dBYW9ItRfyBz;6KP@C)^aF=1u3Y7#`6yI}dw|n31ay(6Jqq=8PYjGv<_X^f4Aokkc!8iv~;}v_}`i=yIlOA(w5_N(`jCDNe<>
znRLs(+%kz_ghaI`zu0H%0soB1Xck-LA5c(feo>{iMLj}d7}LdukA$Q;_7-n)%MM7S
zp&lDqpAruj(9$R*bvxaGg={5GvyY**9QevbBc5kBIM|J3pXgjjE!9*~*SF%$>rF1R
z3b{R#ezQ>KQ@AZBSvMOy5F7Qb+w+M)(Y^iXdQVk9>Vx&5h8re>N!A9l6dR?NvmSwW
zQ3p@s2S0qKJI|I45+|y7Zp67ioVKVpjS_u8AJtRM3bw*i^KKH8-#AFK!K0VHD}2c<
z*vXSUI=hYv>Fbgi5*ibfGl6waPSXt)?FM_%yC?CHi*l^g*KhCN#rG5ifi|jd`xKr0
zk~AhB=h;HmW*q*ey;Mfid2XN_={VCR5jH(KA3N4phM&^K>q{6ZtF5hUiK*PFe2=8G
SpqaN&7Atc*vnM9!/dev/null || true
diff --git a/apps/smokeping-linuxserver/2.9.0/scripts/uninstall.sh b/apps/smokeping-linuxserver/2.9.0/scripts/uninstall.sh
new file mode 100755
index 000000000..ab8a8d674
--- /dev/null
+++ b/apps/smokeping-linuxserver/2.9.0/scripts/uninstall.sh
@@ -0,0 +1,2 @@
+#!/bin/bash
+docker-compose down --volumes
diff --git a/apps/smokeping-linuxserver/2.9.0/scripts/upgrade.sh b/apps/smokeping-linuxserver/2.9.0/scripts/upgrade.sh
new file mode 100755
index 000000000..6e877466e
--- /dev/null
+++ b/apps/smokeping-linuxserver/2.9.0/scripts/upgrade.sh
@@ -0,0 +1,2 @@
+#!/usr/bin/env bash
+set -euo pipefail
diff --git a/apps/smokeping-linuxserver/README.md b/apps/smokeping-linuxserver/README.md
new file mode 100644
index 000000000..ade4fdb23
--- /dev/null
+++ b/apps/smokeping-linuxserver/README.md
@@ -0,0 +1,32 @@
+# SmokePing LinuxServer
+
+## 产品介绍
+
+SmokePing LinuxServer 使用 LinuxServer.io 维护的 `linuxserver/smokeping` 镜像,提供 SmokePing 网络延迟监控 能力。
+
+## 主要功能
+
+- 通过 Web UI 进行 network latency monitoring 配置
+- 持久化保存配置和业务数据
+- 使用 80 端口提供 Web 管理界面
+- 支持自定义时区
+
+## 访问说明
+
+安装完成后,通过 1Panel 应用入口或 `http://服务器地址:HTTP端口` 访问 Web 界面。首次启动后请按应用页面提示完成初始化配置。
+
+## Introduction
+
+SmokePing LinuxServer uses the LinuxServer.io maintained `linuxserver/smokeping` image for network latency monitoring.
+
+## Features
+
+- Manage the application from the Web UI
+- Persist configuration and application data
+- Expose the Web interface on port 80
+- Configure the container time zone
+
+## Links
+
+- LinuxServer image documentation:
+- Project website:
diff --git a/apps/smokeping-linuxserver/data.yml b/apps/smokeping-linuxserver/data.yml
new file mode 100644
index 000000000..be7f5388a
--- /dev/null
+++ b/apps/smokeping-linuxserver/data.yml
@@ -0,0 +1,30 @@
+name: SmokePing LinuxServer
+tags:
+- DevOps
+title: SmokePing 网络延迟监控
+description: SmokePing 网络延迟监控
+additionalProperties:
+ key: smokeping-linuxserver
+ name: SmokePing LinuxServer
+ tags:
+ - DevOps
+ shortDescZh: SmokePing 网络延迟监控
+ shortDescEn: Network latency monitoring maintained by LinuxServer.io
+ description:
+ en: Network latency monitoring maintained by LinuxServer.io
+ zh: SmokePing 网络延迟监控
+ zh-Hant: SmokePing 網路延遲監控
+ ja: LinuxServer.io が保守するネットワーク遅延監視ツール
+ ko: LinuxServer.io에서 유지 관리하는 네트워크 지연 시간 모니터링 도구
+ ru: Мониторинг сетевой задержки, поддерживаемый LinuxServer.io
+ ms: Pemantauan kependaman rangkaian yang diselenggara oleh LinuxServer.io
+ pt-br: Monitoramento de latência de rede mantido pela LinuxServer.io
+ type: tool
+ crossVersionUpdate: true
+ limit: 0
+ website: https://oss.oetiker.ch/smokeping/
+ github: https://github.com/linuxserver/docker-smokeping
+ document: https://docs.linuxserver.io/images/docker-smokeping/
+ architectures:
+ - amd64
+ - arm64
diff --git a/apps/smokeping-linuxserver/latest/.env.sample b/apps/smokeping-linuxserver/latest/.env.sample
new file mode 100644
index 000000000..5cb726a35
--- /dev/null
+++ b/apps/smokeping-linuxserver/latest/.env.sample
@@ -0,0 +1,5 @@
+CONTAINER_NAME=
+PANEL_APP_PORT_HTTP=80
+CONFIG_PATH=./data/config
+DATA_PATH=./data/data
+TIME_ZONE=Asia/Shanghai
diff --git a/apps/smokeping-linuxserver/latest/data.yml b/apps/smokeping-linuxserver/latest/data.yml
new file mode 100644
index 000000000..5594a9ac3
--- /dev/null
+++ b/apps/smokeping-linuxserver/latest/data.yml
@@ -0,0 +1,67 @@
+additionalProperties:
+ formFields:
+ - default: 80
+ edit: true
+ envKey: PANEL_APP_PORT_HTTP
+ labelEn: HTTP Port
+ labelZh: HTTP 端口
+ label:
+ en: HTTP Port
+ zh: HTTP 端口
+ zh-Hant: HTTP 連接埠
+ ja: HTTP ポート
+ ko: HTTP 포트
+ ru: HTTP-порт
+ ms: Port HTTP
+ pt-br: Porta HTTP
+ required: true
+ type: number
+ rule: paramPort
+ - default: ./data/config
+ edit: true
+ envKey: CONFIG_PATH
+ labelEn: Config folder path
+ labelZh: 配置文件路径
+ label:
+ en: Config folder path
+ zh: 配置文件路径
+ zh-Hant: 設定檔資料夾路徑
+ ja: 設定フォルダーのパス
+ ko: 설정 폴더 경로
+ ru: Путь к папке конфигурации
+ ms: Laluan folder konfigurasi
+ pt-br: Caminho da pasta de configuração
+ required: true
+ type: text
+ - default: ./data/data
+ edit: true
+ envKey: DATA_PATH
+ labelEn: Data folder path
+ labelZh: 数据目录
+ label:
+ en: Data folder path
+ zh: 数据目录
+ zh-Hant: 資料目錄
+ ja: データディレクトリ
+ ko: 데이터 디렉터리
+ ru: Каталог данных
+ ms: Laluan data
+ pt-br: Caminho de dados
+ required: true
+ type: text
+ - default: Asia/Shanghai
+ edit: true
+ envKey: TIME_ZONE
+ labelEn: Time zone
+ labelZh: 时区
+ label:
+ en: Time zone
+ zh: 时区
+ zh-Hant: 時區
+ ja: タイムゾーン
+ ko: 시간대
+ ru: Часовой пояс
+ ms: Zon waktu
+ pt-br: Fuso horário
+ required: true
+ type: text
diff --git a/apps/smokeping-linuxserver/latest/data/.gitkeep b/apps/smokeping-linuxserver/latest/data/.gitkeep
new file mode 100644
index 000000000..e69de29bb
diff --git a/apps/smokeping-linuxserver/latest/docker-compose.yml b/apps/smokeping-linuxserver/latest/docker-compose.yml
new file mode 100644
index 000000000..270e4537a
--- /dev/null
+++ b/apps/smokeping-linuxserver/latest/docker-compose.yml
@@ -0,0 +1,21 @@
+networks:
+ 1panel-network:
+ external: true
+services:
+ smokeping:
+ image: "linuxserver/smokeping:latest"
+ container_name: ${CONTAINER_NAME}
+ restart: always
+ networks:
+ - 1panel-network
+ ports:
+ - "${PANEL_APP_PORT_HTTP}:80"
+ volumes:
+ - "${CONFIG_PATH}:/config"
+ - "${DATA_PATH}:/data"
+ environment:
+ - PUID=1000
+ - PGID=1000
+ - TZ=${TIME_ZONE}
+ labels:
+ createdBy: "Apps"
diff --git a/apps/smokeping-linuxserver/latest/scripts/init.sh b/apps/smokeping-linuxserver/latest/scripts/init.sh
new file mode 100755
index 000000000..85efa250f
--- /dev/null
+++ b/apps/smokeping-linuxserver/latest/scripts/init.sh
@@ -0,0 +1,4 @@
+#!/usr/bin/env bash
+set -euo pipefail
+mkdir -p ./data/config ./data/data
+chown -R 1000:1000 ./data 2>/dev/null || true
diff --git a/apps/smokeping-linuxserver/latest/scripts/uninstall.sh b/apps/smokeping-linuxserver/latest/scripts/uninstall.sh
new file mode 100755
index 000000000..ab8a8d674
--- /dev/null
+++ b/apps/smokeping-linuxserver/latest/scripts/uninstall.sh
@@ -0,0 +1,2 @@
+#!/bin/bash
+docker-compose down --volumes
diff --git a/apps/smokeping-linuxserver/latest/scripts/upgrade.sh b/apps/smokeping-linuxserver/latest/scripts/upgrade.sh
new file mode 100755
index 000000000..6e877466e
--- /dev/null
+++ b/apps/smokeping-linuxserver/latest/scripts/upgrade.sh
@@ -0,0 +1,2 @@
+#!/usr/bin/env bash
+set -euo pipefail
diff --git a/apps/smokeping-linuxserver/logo.png b/apps/smokeping-linuxserver/logo.png
new file mode 100644
index 0000000000000000000000000000000000000000..4cb43322a0fb719855e70a64bc1a398cdde0d022
GIT binary patch
literal 3363
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
QbF+ZHwux3P#6I%B01UmA`2YX_
literal 0
HcmV?d00001
diff --git a/apps/syncthing-linuxserver/2.1.1/.env.sample b/apps/syncthing-linuxserver/2.1.1/.env.sample
new file mode 100644
index 000000000..875880bd2
--- /dev/null
+++ b/apps/syncthing-linuxserver/2.1.1/.env.sample
@@ -0,0 +1,9 @@
+CONTAINER_NAME=
+PANEL_APP_PORT_HTTP=8384
+PANEL_APP_PORT_SYNC_TCP=22000
+PANEL_APP_PORT_SYNC_UDP=22000
+PANEL_APP_PORT_DISCOVERY=21027
+CONFIG_PATH=./data/config
+DATA1_PATH=./data/data1
+DATA2_PATH=./data/data2
+TIME_ZONE=Asia/Shanghai
diff --git a/apps/syncthing-linuxserver/2.1.1/data.yml b/apps/syncthing-linuxserver/2.1.1/data.yml
new file mode 100644
index 000000000..50cefd7c5
--- /dev/null
+++ b/apps/syncthing-linuxserver/2.1.1/data.yml
@@ -0,0 +1,134 @@
+additionalProperties:
+ formFields:
+ - default: 8384
+ edit: true
+ envKey: PANEL_APP_PORT_HTTP
+ labelEn: HTTP Port
+ labelZh: HTTP 端口
+ label:
+ en: HTTP Port
+ zh: HTTP 端口
+ zh-Hant: HTTP 連接埠
+ ja: HTTP ポート
+ ko: HTTP 포트
+ ru: HTTP-порт
+ ms: Port HTTP
+ pt-br: Porta HTTP
+ required: true
+ type: number
+ rule: paramPort
+ - default: 22000
+ edit: true
+ envKey: PANEL_APP_PORT_SYNC_TCP
+ labelEn: Sync Tcp Port
+ labelZh: Sync Tcp 端口
+ label:
+ en: Sync Tcp Port
+ zh: Sync Tcp 端口
+ zh-Hant: Sync Tcp 連接埠
+ ja: Sync Tcp ポート
+ ko: Sync Tcp 포트
+ ru: Порт Sync Tcp
+ ms: Port Sync Tcp
+ pt-br: Porta Sync Tcp
+ required: true
+ type: number
+ rule: paramPort
+ - default: 22000
+ edit: true
+ envKey: PANEL_APP_PORT_SYNC_UDP
+ labelEn: Sync Udp Port
+ labelZh: Sync Udp 端口
+ label:
+ en: Sync Udp Port
+ zh: Sync Udp 端口
+ zh-Hant: Sync Udp 連接埠
+ ja: Sync Udp ポート
+ ko: Sync Udp 포트
+ ru: Порт Sync Udp
+ ms: Port Sync Udp
+ pt-br: Porta Sync Udp
+ required: true
+ type: number
+ rule: paramPort
+ - default: 21027
+ edit: true
+ envKey: PANEL_APP_PORT_DISCOVERY
+ labelEn: Discovery Port
+ labelZh: Discovery 端口
+ label:
+ en: Discovery Port
+ zh: Discovery 端口
+ zh-Hant: Discovery 連接埠
+ ja: Discovery ポート
+ ko: Discovery 포트
+ ru: Порт Discovery
+ ms: Port Discovery
+ pt-br: Porta Discovery
+ required: true
+ type: number
+ rule: paramPort
+ - default: ./data/config
+ edit: true
+ envKey: CONFIG_PATH
+ labelEn: Config folder path
+ labelZh: 配置文件路径
+ label:
+ en: Config folder path
+ zh: 配置文件路径
+ zh-Hant: 設定檔資料夾路徑
+ ja: 設定フォルダーのパス
+ ko: 설정 폴더 경로
+ ru: Путь к папке конфигурации
+ ms: Laluan folder konfigurasi
+ pt-br: Caminho da pasta de configuração
+ required: true
+ type: text
+ - default: ./data/data1
+ edit: true
+ envKey: DATA1_PATH
+ labelEn: Data 1 path
+ labelZh: 数据目录 1
+ label:
+ en: Data 1 path
+ zh: 数据目录 1
+ zh-Hant: 資料目錄 1
+ ja: データディレクトリ 1
+ ko: 데이터 디렉터리 1
+ ru: Каталог данных 1
+ ms: Laluan data 1
+ pt-br: Caminho de dados 1
+ required: true
+ type: text
+ - default: ./data/data2
+ edit: true
+ envKey: DATA2_PATH
+ labelEn: Data 2 path
+ labelZh: 数据目录 2
+ label:
+ en: Data 2 path
+ zh: 数据目录 2
+ zh-Hant: 資料目錄 2
+ ja: データディレクトリ 2
+ ko: 데이터 디렉터리 2
+ ru: Каталог данных 2
+ ms: Laluan data 2
+ pt-br: Caminho de dados 2
+ required: true
+ type: text
+ - default: Asia/Shanghai
+ edit: true
+ envKey: TIME_ZONE
+ labelEn: Time zone
+ labelZh: 时区
+ label:
+ en: Time zone
+ zh: 时区
+ zh-Hant: 時區
+ ja: タイムゾーン
+ ko: 시간대
+ ru: Часовой пояс
+ ms: Zon waktu
+ pt-br: Fuso horário
+ required: true
+ type: text
diff --git a/apps/syncthing-linuxserver/2.1.1/data/.gitkeep b/apps/syncthing-linuxserver/2.1.1/data/.gitkeep
new file mode 100644
index 000000000..e69de29bb
diff --git a/apps/syncthing-linuxserver/2.1.1/docker-compose.yml b/apps/syncthing-linuxserver/2.1.1/docker-compose.yml
new file mode 100644
index 000000000..05afcf736
--- /dev/null
+++ b/apps/syncthing-linuxserver/2.1.1/docker-compose.yml
@@ -0,0 +1,25 @@
+networks:
+ 1panel-network:
+ external: true
+services:
+ syncthing:
+ image: "linuxserver/syncthing:2.1.1"
+ container_name: ${CONTAINER_NAME}
+ restart: always
+ networks:
+ - 1panel-network
+ ports:
+ - "${PANEL_APP_PORT_HTTP}:8384"
+ - "${PANEL_APP_PORT_SYNC_TCP}:22000/tcp"
+ - "${PANEL_APP_PORT_SYNC_UDP}:22000/udp"
+ - "${PANEL_APP_PORT_DISCOVERY}:21027/udp"
+ volumes:
+ - "${CONFIG_PATH}:/config"
+ - "${DATA1_PATH}:/data1"
+ - "${DATA2_PATH}:/data2"
+ environment:
+ - PUID=1000
+ - PGID=1000
+ - TZ=${TIME_ZONE}
+ labels:
+ createdBy: "Apps"
diff --git a/apps/syncthing-linuxserver/2.1.1/scripts/init.sh b/apps/syncthing-linuxserver/2.1.1/scripts/init.sh
new file mode 100755
index 000000000..087f34018
--- /dev/null
+++ b/apps/syncthing-linuxserver/2.1.1/scripts/init.sh
@@ -0,0 +1,4 @@
+#!/usr/bin/env bash
+set -euo pipefail
+mkdir -p ./data/config ./data/data1 ./data/data2
+chown -R 1000:1000 ./data 2>/dev/null || true
diff --git a/apps/syncthing-linuxserver/2.1.1/scripts/uninstall.sh b/apps/syncthing-linuxserver/2.1.1/scripts/uninstall.sh
new file mode 100755
index 000000000..ab8a8d674
--- /dev/null
+++ b/apps/syncthing-linuxserver/2.1.1/scripts/uninstall.sh
@@ -0,0 +1,2 @@
+#!/bin/bash
+docker-compose down --volumes
diff --git a/apps/syncthing-linuxserver/2.1.1/scripts/upgrade.sh b/apps/syncthing-linuxserver/2.1.1/scripts/upgrade.sh
new file mode 100755
index 000000000..6e877466e
--- /dev/null
+++ b/apps/syncthing-linuxserver/2.1.1/scripts/upgrade.sh
@@ -0,0 +1,2 @@
+#!/usr/bin/env bash
+set -euo pipefail
diff --git a/apps/syncthing-linuxserver/README.md b/apps/syncthing-linuxserver/README.md
new file mode 100644
index 000000000..ecd0feb48
--- /dev/null
+++ b/apps/syncthing-linuxserver/README.md
@@ -0,0 +1,32 @@
+# Syncthing LinuxServer
+
+## 产品介绍
+
+Syncthing LinuxServer 使用 LinuxServer.io 维护的 `linuxserver/syncthing` 镜像,提供 Syncthing 文件同步 能力。
+
+## 主要功能
+
+- 通过 Web UI 进行 file synchronization 配置
+- 持久化保存配置和业务数据
+- 使用 8384 端口提供 Web 管理界面
+- 支持自定义时区
+
+## 访问说明
+
+安装完成后,通过 1Panel 应用入口或 `http://服务器地址:HTTP端口` 访问 Web 界面。首次启动后请按应用页面提示完成初始化配置。
+
+## Introduction
+
+Syncthing LinuxServer uses the LinuxServer.io maintained `linuxserver/syncthing` image for file synchronization.
+
+## Features
+
+- Manage the application from the Web UI
+- Persist configuration and application data
+- Expose the Web interface on port 8384
+- Configure the container time zone
+
+## Links
+
+- LinuxServer image documentation:
+- Project website:
diff --git a/apps/syncthing-linuxserver/data.yml b/apps/syncthing-linuxserver/data.yml
new file mode 100644
index 000000000..0890a11a8
--- /dev/null
+++ b/apps/syncthing-linuxserver/data.yml
@@ -0,0 +1,30 @@
+name: Syncthing LinuxServer
+tags:
+- Storage
+title: Syncthing 文件同步
+description: Syncthing 文件同步
+additionalProperties:
+ key: syncthing-linuxserver
+ name: Syncthing LinuxServer
+ tags:
+ - Storage
+ shortDescZh: Syncthing 文件同步
+ shortDescEn: File synchronization maintained by LinuxServer.io
+ description:
+ en: File synchronization maintained by LinuxServer.io
+ zh: Syncthing 文件同步
+ zh-Hant: Syncthing 檔案同步
+ ja: LinuxServer.io が保守するファイル同期サービス
+ ko: LinuxServer.io에서 유지 관리하는 파일 동기화 서비스
+ ru: Синхронизация файлов, поддерживаемая LinuxServer.io
+ ms: Penyegerakan fail yang diselenggara oleh LinuxServer.io
+ pt-br: Sincronização de arquivos mantida pela LinuxServer.io
+ type: tool
+ crossVersionUpdate: true
+ limit: 0
+ website: https://syncthing.net/
+ github: https://github.com/linuxserver/docker-syncthing
+ document: https://docs.linuxserver.io/images/docker-syncthing/
+ architectures:
+ - amd64
+ - arm64
diff --git a/apps/syncthing-linuxserver/latest/.env.sample b/apps/syncthing-linuxserver/latest/.env.sample
new file mode 100644
index 000000000..875880bd2
--- /dev/null
+++ b/apps/syncthing-linuxserver/latest/.env.sample
@@ -0,0 +1,9 @@
+CONTAINER_NAME=
+PANEL_APP_PORT_HTTP=8384
+PANEL_APP_PORT_SYNC_TCP=22000
+PANEL_APP_PORT_SYNC_UDP=22000
+PANEL_APP_PORT_DISCOVERY=21027
+CONFIG_PATH=./data/config
+DATA1_PATH=./data/data1
+DATA2_PATH=./data/data2
+TIME_ZONE=Asia/Shanghai
diff --git a/apps/syncthing-linuxserver/latest/data.yml b/apps/syncthing-linuxserver/latest/data.yml
new file mode 100644
index 000000000..50cefd7c5
--- /dev/null
+++ b/apps/syncthing-linuxserver/latest/data.yml
@@ -0,0 +1,134 @@
+additionalProperties:
+ formFields:
+ - default: 8384
+ edit: true
+ envKey: PANEL_APP_PORT_HTTP
+ labelEn: HTTP Port
+ labelZh: HTTP 端口
+ label:
+ en: HTTP Port
+ zh: HTTP 端口
+ zh-Hant: HTTP 連接埠
+ ja: HTTP ポート
+ ko: HTTP 포트
+ ru: HTTP-порт
+ ms: Port HTTP
+ pt-br: Porta HTTP
+ required: true
+ type: number
+ rule: paramPort
+ - default: 22000
+ edit: true
+ envKey: PANEL_APP_PORT_SYNC_TCP
+ labelEn: Sync Tcp Port
+ labelZh: Sync Tcp 端口
+ label:
+ en: Sync Tcp Port
+ zh: Sync Tcp 端口
+ zh-Hant: Sync Tcp 連接埠
+ ja: Sync Tcp ポート
+ ko: Sync Tcp 포트
+ ru: Порт Sync Tcp
+ ms: Port Sync Tcp
+ pt-br: Porta Sync Tcp
+ required: true
+ type: number
+ rule: paramPort
+ - default: 22000
+ edit: true
+ envKey: PANEL_APP_PORT_SYNC_UDP
+ labelEn: Sync Udp Port
+ labelZh: Sync Udp 端口
+ label:
+ en: Sync Udp Port
+ zh: Sync Udp 端口
+ zh-Hant: Sync Udp 連接埠
+ ja: Sync Udp ポート
+ ko: Sync Udp 포트
+ ru: Порт Sync Udp
+ ms: Port Sync Udp
+ pt-br: Porta Sync Udp
+ required: true
+ type: number
+ rule: paramPort
+ - default: 21027
+ edit: true
+ envKey: PANEL_APP_PORT_DISCOVERY
+ labelEn: Discovery Port
+ labelZh: Discovery 端口
+ label:
+ en: Discovery Port
+ zh: Discovery 端口
+ zh-Hant: Discovery 連接埠
+ ja: Discovery ポート
+ ko: Discovery 포트
+ ru: Порт Discovery
+ ms: Port Discovery
+ pt-br: Porta Discovery
+ required: true
+ type: number
+ rule: paramPort
+ - default: ./data/config
+ edit: true
+ envKey: CONFIG_PATH
+ labelEn: Config folder path
+ labelZh: 配置文件路径
+ label:
+ en: Config folder path
+ zh: 配置文件路径
+ zh-Hant: 設定檔資料夾路徑
+ ja: 設定フォルダーのパス
+ ko: 설정 폴더 경로
+ ru: Путь к папке конфигурации
+ ms: Laluan folder konfigurasi
+ pt-br: Caminho da pasta de configuração
+ required: true
+ type: text
+ - default: ./data/data1
+ edit: true
+ envKey: DATA1_PATH
+ labelEn: Data 1 path
+ labelZh: 数据目录 1
+ label:
+ en: Data 1 path
+ zh: 数据目录 1
+ zh-Hant: 資料目錄 1
+ ja: データディレクトリ 1
+ ko: 데이터 디렉터리 1
+ ru: Каталог данных 1
+ ms: Laluan data 1
+ pt-br: Caminho de dados 1
+ required: true
+ type: text
+ - default: ./data/data2
+ edit: true
+ envKey: DATA2_PATH
+ labelEn: Data 2 path
+ labelZh: 数据目录 2
+ label:
+ en: Data 2 path
+ zh: 数据目录 2
+ zh-Hant: 資料目錄 2
+ ja: データディレクトリ 2
+ ko: 데이터 디렉터리 2
+ ru: Каталог данных 2
+ ms: Laluan data 2
+ pt-br: Caminho de dados 2
+ required: true
+ type: text
+ - default: Asia/Shanghai
+ edit: true
+ envKey: TIME_ZONE
+ labelEn: Time zone
+ labelZh: 时区
+ label:
+ en: Time zone
+ zh: 时区
+ zh-Hant: 時區
+ ja: タイムゾーン
+ ko: 시간대
+ ru: Часовой пояс
+ ms: Zon waktu
+ pt-br: Fuso horário
+ required: true
+ type: text
diff --git a/apps/syncthing-linuxserver/latest/data/.gitkeep b/apps/syncthing-linuxserver/latest/data/.gitkeep
new file mode 100644
index 000000000..e69de29bb
diff --git a/apps/syncthing-linuxserver/latest/docker-compose.yml b/apps/syncthing-linuxserver/latest/docker-compose.yml
new file mode 100644
index 000000000..347d5cb31
--- /dev/null
+++ b/apps/syncthing-linuxserver/latest/docker-compose.yml
@@ -0,0 +1,25 @@
+networks:
+ 1panel-network:
+ external: true
+services:
+ syncthing:
+ image: "linuxserver/syncthing:latest"
+ container_name: ${CONTAINER_NAME}
+ restart: always
+ networks:
+ - 1panel-network
+ ports:
+ - "${PANEL_APP_PORT_HTTP}:8384"
+ - "${PANEL_APP_PORT_SYNC_TCP}:22000/tcp"
+ - "${PANEL_APP_PORT_SYNC_UDP}:22000/udp"
+ - "${PANEL_APP_PORT_DISCOVERY}:21027/udp"
+ volumes:
+ - "${CONFIG_PATH}:/config"
+ - "${DATA1_PATH}:/data1"
+ - "${DATA2_PATH}:/data2"
+ environment:
+ - PUID=1000
+ - PGID=1000
+ - TZ=${TIME_ZONE}
+ labels:
+ createdBy: "Apps"
diff --git a/apps/syncthing-linuxserver/latest/scripts/init.sh b/apps/syncthing-linuxserver/latest/scripts/init.sh
new file mode 100755
index 000000000..087f34018
--- /dev/null
+++ b/apps/syncthing-linuxserver/latest/scripts/init.sh
@@ -0,0 +1,4 @@
+#!/usr/bin/env bash
+set -euo pipefail
+mkdir -p ./data/config ./data/data1 ./data/data2
+chown -R 1000:1000 ./data 2>/dev/null || true
diff --git a/apps/syncthing-linuxserver/latest/scripts/uninstall.sh b/apps/syncthing-linuxserver/latest/scripts/uninstall.sh
new file mode 100755
index 000000000..ab8a8d674
--- /dev/null
+++ b/apps/syncthing-linuxserver/latest/scripts/uninstall.sh
@@ -0,0 +1,2 @@
+#!/bin/bash
+docker-compose down --volumes
diff --git a/apps/syncthing-linuxserver/latest/scripts/upgrade.sh b/apps/syncthing-linuxserver/latest/scripts/upgrade.sh
new file mode 100755
index 000000000..6e877466e
--- /dev/null
+++ b/apps/syncthing-linuxserver/latest/scripts/upgrade.sh
@@ -0,0 +1,2 @@
+#!/usr/bin/env bash
+set -euo pipefail
diff --git a/apps/syncthing-linuxserver/logo.png b/apps/syncthing-linuxserver/logo.png
new file mode 100644
index 0000000000000000000000000000000000000000..ded5f274ff3de2485793c4d2fa2ede0bfe58cf04
GIT binary patch
literal 5839
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
Z{{TJ9`kg1QWt;#2002ovPDHLkV1nSVg^&OM
literal 0
HcmV?d00001
diff --git a/apps/transmission-linuxserver/4.1.2/.env.sample b/apps/transmission-linuxserver/4.1.2/.env.sample
new file mode 100644
index 000000000..733c2e1ad
--- /dev/null
+++ b/apps/transmission-linuxserver/4.1.2/.env.sample
@@ -0,0 +1,8 @@
+CONTAINER_NAME=
+PANEL_APP_PORT_HTTP=9091
+PANEL_APP_PORT_PEER_TCP=51413
+PANEL_APP_PORT_PEER_UDP=51413
+CONFIG_PATH=./data/config
+DOWNLOADS_PATH=./data/downloads
+WATCH_PATH=./data/watch
+TIME_ZONE=Asia/Shanghai
diff --git a/apps/transmission-linuxserver/4.1.2/data.yml b/apps/transmission-linuxserver/4.1.2/data.yml
new file mode 100644
index 000000000..17fd62043
--- /dev/null
+++ b/apps/transmission-linuxserver/4.1.2/data.yml
@@ -0,0 +1,117 @@
+additionalProperties:
+ formFields:
+ - default: 9091
+ edit: true
+ envKey: PANEL_APP_PORT_HTTP
+ labelEn: HTTP Port
+ labelZh: HTTP 端口
+ label:
+ en: HTTP Port
+ zh: HTTP 端口
+ zh-Hant: HTTP 連接埠
+ ja: HTTP ポート
+ ko: HTTP 포트
+ ru: HTTP-порт
+ ms: Port HTTP
+ pt-br: Porta HTTP
+ required: true
+ type: number
+ rule: paramPort
+ - default: 51413
+ edit: true
+ envKey: PANEL_APP_PORT_PEER_TCP
+ labelEn: Peer Tcp Port
+ labelZh: Peer Tcp 端口
+ label:
+ en: Peer Tcp Port
+ zh: Peer Tcp 端口
+ zh-Hant: Peer Tcp 連接埠
+ ja: Peer Tcp ポート
+ ko: Peer Tcp 포트
+ ru: Порт Peer Tcp
+ ms: Port Peer Tcp
+ pt-br: Porta Peer Tcp
+ required: true
+ type: number
+ rule: paramPort
+ - default: 51413
+ edit: true
+ envKey: PANEL_APP_PORT_PEER_UDP
+ labelEn: Peer Udp Port
+ labelZh: Peer Udp 端口
+ label:
+ en: Peer Udp Port
+ zh: Peer Udp 端口
+ zh-Hant: Peer Udp 連接埠
+ ja: Peer Udp ポート
+ ko: Peer Udp 포트
+ ru: Порт Peer Udp
+ ms: Port Peer Udp
+ pt-br: Porta Peer Udp
+ required: true
+ type: number
+ rule: paramPort
+ - default: ./data/config
+ edit: true
+ envKey: CONFIG_PATH
+ labelEn: Config folder path
+ labelZh: 配置文件路径
+ label:
+ en: Config folder path
+ zh: 配置文件路径
+ zh-Hant: 設定檔資料夾路徑
+ ja: 設定フォルダーのパス
+ ko: 설정 폴더 경로
+ ru: Путь к папке конфигурации
+ ms: Laluan folder konfigurasi
+ pt-br: Caminho da pasta de configuração
+ required: true
+ type: text
+ - default: ./data/downloads
+ edit: true
+ envKey: DOWNLOADS_PATH
+ labelEn: Downloads path
+ labelZh: 下载目录
+ label:
+ en: Downloads path
+ zh: 下载目录
+ zh-Hant: 下載目錄
+ ja: ダウンロードディレクトリ
+ ko: 다운로드 디렉터리
+ ru: Каталог загрузок
+ ms: Laluan muat turun
+ pt-br: Caminho de downloads
+ required: true
+ type: text
+ - default: ./data/watch
+ edit: true
+ envKey: WATCH_PATH
+ labelEn: Watch folder path
+ labelZh: 监控目录
+ label:
+ en: Watch folder path
+ zh: 监控目录
+ zh-Hant: 監控目錄
+ ja: 監視フォルダー
+ ko: 감시 폴더
+ ru: Каталог наблюдения
+ ms: Laluan folder pantau
+ pt-br: Caminho da pasta monitorada
+ required: true
+ type: text
+ - default: Asia/Shanghai
+ edit: true
+ envKey: TIME_ZONE
+ labelEn: Time zone
+ labelZh: 时区
+ label:
+ en: Time zone
+ zh: 时区
+ zh-Hant: 時區
+ ja: タイムゾーン
+ ko: 시간대
+ ru: Часовой пояс
+ ms: Zon waktu
+ pt-br: Fuso horário
+ required: true
+ type: text
diff --git a/apps/transmission-linuxserver/4.1.2/data/.gitkeep b/apps/transmission-linuxserver/4.1.2/data/.gitkeep
new file mode 100644
index 000000000..e69de29bb
diff --git a/apps/transmission-linuxserver/4.1.2/docker-compose.yml b/apps/transmission-linuxserver/4.1.2/docker-compose.yml
new file mode 100644
index 000000000..f672edc6d
--- /dev/null
+++ b/apps/transmission-linuxserver/4.1.2/docker-compose.yml
@@ -0,0 +1,24 @@
+networks:
+ 1panel-network:
+ external: true
+services:
+ transmission:
+ image: "linuxserver/transmission:4.1.2"
+ container_name: ${CONTAINER_NAME}
+ restart: always
+ networks:
+ - 1panel-network
+ ports:
+ - "${PANEL_APP_PORT_HTTP}:9091"
+ - "${PANEL_APP_PORT_PEER_TCP}:51413"
+ - "${PANEL_APP_PORT_PEER_UDP}:51413/udp"
+ volumes:
+ - "${CONFIG_PATH}:/config"
+ - "${DOWNLOADS_PATH}:/downloads"
+ - "${WATCH_PATH}:/watch"
+ environment:
+ - PUID=1000
+ - PGID=1000
+ - TZ=${TIME_ZONE}
+ labels:
+ createdBy: "Apps"
diff --git a/apps/transmission-linuxserver/4.1.2/scripts/init.sh b/apps/transmission-linuxserver/4.1.2/scripts/init.sh
new file mode 100755
index 000000000..d1c00f8ea
--- /dev/null
+++ b/apps/transmission-linuxserver/4.1.2/scripts/init.sh
@@ -0,0 +1,4 @@
+#!/usr/bin/env bash
+set -euo pipefail
+mkdir -p ./data/config ./data/downloads ./data/watch
+chown -R 1000:1000 ./data 2>/dev/null || true
diff --git a/apps/transmission-linuxserver/4.1.2/scripts/uninstall.sh b/apps/transmission-linuxserver/4.1.2/scripts/uninstall.sh
new file mode 100755
index 000000000..ab8a8d674
--- /dev/null
+++ b/apps/transmission-linuxserver/4.1.2/scripts/uninstall.sh
@@ -0,0 +1,2 @@
+#!/bin/bash
+docker-compose down --volumes
diff --git a/apps/transmission-linuxserver/4.1.2/scripts/upgrade.sh b/apps/transmission-linuxserver/4.1.2/scripts/upgrade.sh
new file mode 100755
index 000000000..6e877466e
--- /dev/null
+++ b/apps/transmission-linuxserver/4.1.2/scripts/upgrade.sh
@@ -0,0 +1,2 @@
+#!/usr/bin/env bash
+set -euo pipefail
diff --git a/apps/transmission-linuxserver/README.md b/apps/transmission-linuxserver/README.md
new file mode 100644
index 000000000..63333f3ee
--- /dev/null
+++ b/apps/transmission-linuxserver/README.md
@@ -0,0 +1,32 @@
+# Transmission LinuxServer
+
+## 产品介绍
+
+Transmission LinuxServer 使用 LinuxServer.io 维护的 `linuxserver/transmission` 镜像,提供 Transmission 下载管理 能力。
+
+## 主要功能
+
+- 通过 Web UI 进行 download management 配置
+- 持久化保存配置和业务数据
+- 使用 9091 端口提供 Web 管理界面
+- 支持自定义时区
+
+## 访问说明
+
+安装完成后,通过 1Panel 应用入口或 `http://服务器地址:HTTP端口` 访问 Web 界面。首次启动后请按应用页面提示完成初始化配置。
+
+## Introduction
+
+Transmission LinuxServer uses the LinuxServer.io maintained `linuxserver/transmission` image for download management.
+
+## Features
+
+- Manage the application from the Web UI
+- Persist configuration and application data
+- Expose the Web interface on port 9091
+- Configure the container time zone
+
+## Links
+
+- LinuxServer image documentation:
+- Project website:
diff --git a/apps/transmission-linuxserver/data.yml b/apps/transmission-linuxserver/data.yml
new file mode 100644
index 000000000..a95c56413
--- /dev/null
+++ b/apps/transmission-linuxserver/data.yml
@@ -0,0 +1,30 @@
+name: Transmission LinuxServer
+tags:
+- Tool
+title: Transmission 下载管理
+description: Transmission 下载管理
+additionalProperties:
+ key: transmission-linuxserver
+ name: Transmission LinuxServer
+ tags:
+ - Tool
+ shortDescZh: Transmission 下载管理
+ shortDescEn: Torrent download manager maintained by LinuxServer.io
+ description:
+ en: Torrent download manager maintained by LinuxServer.io
+ zh: Transmission 下载管理
+ zh-Hant: Transmission 下載管理
+ ja: LinuxServer.io が保守する Torrent ダウンロード管理ツール
+ ko: LinuxServer.io에서 유지 관리하는 토렌트 다운로드 관리자
+ ru: Менеджер торрент-загрузок, поддерживаемый LinuxServer.io
+ ms: Pengurus muat turun torrent yang diselenggara oleh LinuxServer.io
+ pt-br: Gerenciador de downloads torrent mantido pela LinuxServer.io
+ type: tool
+ crossVersionUpdate: true
+ limit: 0
+ website: https://transmissionbt.com/
+ github: https://github.com/linuxserver/docker-transmission
+ document: https://docs.linuxserver.io/images/docker-transmission/
+ architectures:
+ - amd64
+ - arm64
diff --git a/apps/transmission-linuxserver/latest/.env.sample b/apps/transmission-linuxserver/latest/.env.sample
new file mode 100644
index 000000000..733c2e1ad
--- /dev/null
+++ b/apps/transmission-linuxserver/latest/.env.sample
@@ -0,0 +1,8 @@
+CONTAINER_NAME=
+PANEL_APP_PORT_HTTP=9091
+PANEL_APP_PORT_PEER_TCP=51413
+PANEL_APP_PORT_PEER_UDP=51413
+CONFIG_PATH=./data/config
+DOWNLOADS_PATH=./data/downloads
+WATCH_PATH=./data/watch
+TIME_ZONE=Asia/Shanghai
diff --git a/apps/transmission-linuxserver/latest/data.yml b/apps/transmission-linuxserver/latest/data.yml
new file mode 100644
index 000000000..17fd62043
--- /dev/null
+++ b/apps/transmission-linuxserver/latest/data.yml
@@ -0,0 +1,117 @@
+additionalProperties:
+ formFields:
+ - default: 9091
+ edit: true
+ envKey: PANEL_APP_PORT_HTTP
+ labelEn: HTTP Port
+ labelZh: HTTP 端口
+ label:
+ en: HTTP Port
+ zh: HTTP 端口
+ zh-Hant: HTTP 連接埠
+ ja: HTTP ポート
+ ko: HTTP 포트
+ ru: HTTP-порт
+ ms: Port HTTP
+ pt-br: Porta HTTP
+ required: true
+ type: number
+ rule: paramPort
+ - default: 51413
+ edit: true
+ envKey: PANEL_APP_PORT_PEER_TCP
+ labelEn: Peer Tcp Port
+ labelZh: Peer Tcp 端口
+ label:
+ en: Peer Tcp Port
+ zh: Peer Tcp 端口
+ zh-Hant: Peer Tcp 連接埠
+ ja: Peer Tcp ポート
+ ko: Peer Tcp 포트
+ ru: Порт Peer Tcp
+ ms: Port Peer Tcp
+ pt-br: Porta Peer Tcp
+ required: true
+ type: number
+ rule: paramPort
+ - default: 51413
+ edit: true
+ envKey: PANEL_APP_PORT_PEER_UDP
+ labelEn: Peer Udp Port
+ labelZh: Peer Udp 端口
+ label:
+ en: Peer Udp Port
+ zh: Peer Udp 端口
+ zh-Hant: Peer Udp 連接埠
+ ja: Peer Udp ポート
+ ko: Peer Udp 포트
+ ru: Порт Peer Udp
+ ms: Port Peer Udp
+ pt-br: Porta Peer Udp
+ required: true
+ type: number
+ rule: paramPort
+ - default: ./data/config
+ edit: true
+ envKey: CONFIG_PATH
+ labelEn: Config folder path
+ labelZh: 配置文件路径
+ label:
+ en: Config folder path
+ zh: 配置文件路径
+ zh-Hant: 設定檔資料夾路徑
+ ja: 設定フォルダーのパス
+ ko: 설정 폴더 경로
+ ru: Путь к папке конфигурации
+ ms: Laluan folder konfigurasi
+ pt-br: Caminho da pasta de configuração
+ required: true
+ type: text
+ - default: ./data/downloads
+ edit: true
+ envKey: DOWNLOADS_PATH
+ labelEn: Downloads path
+ labelZh: 下载目录
+ label:
+ en: Downloads path
+ zh: 下载目录
+ zh-Hant: 下載目錄
+ ja: ダウンロードディレクトリ
+ ko: 다운로드 디렉터리
+ ru: Каталог загрузок
+ ms: Laluan muat turun
+ pt-br: Caminho de downloads
+ required: true
+ type: text
+ - default: ./data/watch
+ edit: true
+ envKey: WATCH_PATH
+ labelEn: Watch folder path
+ labelZh: 监控目录
+ label:
+ en: Watch folder path
+ zh: 监控目录
+ zh-Hant: 監控目錄
+ ja: 監視フォルダー
+ ko: 감시 폴더
+ ru: Каталог наблюдения
+ ms: Laluan folder pantau
+ pt-br: Caminho da pasta monitorada
+ required: true
+ type: text
+ - default: Asia/Shanghai
+ edit: true
+ envKey: TIME_ZONE
+ labelEn: Time zone
+ labelZh: 时区
+ label:
+ en: Time zone
+ zh: 时区
+ zh-Hant: 時區
+ ja: タイムゾーン
+ ko: 시간대
+ ru: Часовой пояс
+ ms: Zon waktu
+ pt-br: Fuso horário
+ required: true
+ type: text
diff --git a/apps/transmission-linuxserver/latest/data/.gitkeep b/apps/transmission-linuxserver/latest/data/.gitkeep
new file mode 100644
index 000000000..e69de29bb
diff --git a/apps/transmission-linuxserver/latest/docker-compose.yml b/apps/transmission-linuxserver/latest/docker-compose.yml
new file mode 100644
index 000000000..65e01099e
--- /dev/null
+++ b/apps/transmission-linuxserver/latest/docker-compose.yml
@@ -0,0 +1,24 @@
+networks:
+ 1panel-network:
+ external: true
+services:
+ transmission:
+ image: "linuxserver/transmission:latest"
+ container_name: ${CONTAINER_NAME}
+ restart: always
+ networks:
+ - 1panel-network
+ ports:
+ - "${PANEL_APP_PORT_HTTP}:9091"
+ - "${PANEL_APP_PORT_PEER_TCP}:51413"
+ - "${PANEL_APP_PORT_PEER_UDP}:51413/udp"
+ volumes:
+ - "${CONFIG_PATH}:/config"
+ - "${DOWNLOADS_PATH}:/downloads"
+ - "${WATCH_PATH}:/watch"
+ environment:
+ - PUID=1000
+ - PGID=1000
+ - TZ=${TIME_ZONE}
+ labels:
+ createdBy: "Apps"
diff --git a/apps/transmission-linuxserver/latest/scripts/init.sh b/apps/transmission-linuxserver/latest/scripts/init.sh
new file mode 100755
index 000000000..d1c00f8ea
--- /dev/null
+++ b/apps/transmission-linuxserver/latest/scripts/init.sh
@@ -0,0 +1,4 @@
+#!/usr/bin/env bash
+set -euo pipefail
+mkdir -p ./data/config ./data/downloads ./data/watch
+chown -R 1000:1000 ./data 2>/dev/null || true
diff --git a/apps/transmission-linuxserver/latest/scripts/uninstall.sh b/apps/transmission-linuxserver/latest/scripts/uninstall.sh
new file mode 100755
index 000000000..ab8a8d674
--- /dev/null
+++ b/apps/transmission-linuxserver/latest/scripts/uninstall.sh
@@ -0,0 +1,2 @@
+#!/bin/bash
+docker-compose down --volumes
diff --git a/apps/transmission-linuxserver/latest/scripts/upgrade.sh b/apps/transmission-linuxserver/latest/scripts/upgrade.sh
new file mode 100755
index 000000000..6e877466e
--- /dev/null
+++ b/apps/transmission-linuxserver/latest/scripts/upgrade.sh
@@ -0,0 +1,2 @@
+#!/usr/bin/env bash
+set -euo pipefail
diff --git a/apps/transmission-linuxserver/logo.png b/apps/transmission-linuxserver/logo.png
new file mode 100644
index 0000000000000000000000000000000000000000..d93a4e8bc48a42f4d6cf65df88470fe630d9cd6f
GIT binary patch
literal 6164
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
aP5F;Az`3w}lK49x0DypX)vML4BmM^={qTGM
literal 0
HcmV?d00001