From 0689f83f289cc983d1ed6f4c16e2c1af5d452382 Mon Sep 17 00:00:00 2001 From: Meng Sen Date: Tue, 5 Aug 2025 11:04:41 +0800 Subject: [PATCH] =?UTF-8?q?=E5=8F=91=E5=B8=83=E5=BA=94=E7=94=A8=20KSpeeder?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Meng Sen --- apps/kspeeder/0.3.0/data.yml | 25 ++++++++++++++ apps/kspeeder/0.3.0/docker-compose.yml | 24 +++++++++++++ apps/kspeeder/0.3.0/envs/default.env | 2 ++ apps/kspeeder/0.3.0/envs/global.env | 2 ++ apps/kspeeder/0.3.0/scripts/init.sh | 17 ++++++++++ apps/kspeeder/0.3.0/scripts/uninstall.sh | 10 ++++++ apps/kspeeder/0.3.0/scripts/upgrade.sh | 17 ++++++++++ apps/kspeeder/README.md | 41 +++++++++++++++++++++++ apps/kspeeder/data.yml | 14 ++++++++ apps/kspeeder/logo.png | Bin 0 -> 13127 bytes apps/kspeeder/logo.svg | 5 +++ 11 files changed, 157 insertions(+) create mode 100644 apps/kspeeder/0.3.0/data.yml create mode 100644 apps/kspeeder/0.3.0/docker-compose.yml create mode 100644 apps/kspeeder/0.3.0/envs/default.env create mode 100644 apps/kspeeder/0.3.0/envs/global.env create mode 100644 apps/kspeeder/0.3.0/scripts/init.sh create mode 100644 apps/kspeeder/0.3.0/scripts/uninstall.sh create mode 100644 apps/kspeeder/0.3.0/scripts/upgrade.sh create mode 100644 apps/kspeeder/README.md create mode 100644 apps/kspeeder/data.yml create mode 100644 apps/kspeeder/logo.png create mode 100644 apps/kspeeder/logo.svg diff --git a/apps/kspeeder/0.3.0/data.yml b/apps/kspeeder/0.3.0/data.yml new file mode 100644 index 000000000..2806d8b15 --- /dev/null +++ b/apps/kspeeder/0.3.0/data.yml @@ -0,0 +1,25 @@ +additionalProperties: + formFields: + - default: "/home/kspeeder" + edit: true + envKey: KSPEEDER_ROOT_PATH + labelZh: 数据持久化路径 + labelEn: Data persistence path + required: true + type: text + - default: 5003 + edit: true + envKey: PANEL_APP_PORT_HTTP + labelZh: WebUI 管理监控 + labelEn: WebUI Manage Monitoring + required: true + rule: paramPort + type: number + - default: 5443 + edit: true + envKey: PANEL_APP_PORT_API + labelZh: 主服务端口 + labelEn: Primary Service Port + required: true + rule: paramPort + type: number diff --git a/apps/kspeeder/0.3.0/docker-compose.yml b/apps/kspeeder/0.3.0/docker-compose.yml new file mode 100644 index 000000000..8cbeea00a --- /dev/null +++ b/apps/kspeeder/0.3.0/docker-compose.yml @@ -0,0 +1,24 @@ +networks: + 1panel-network: + external: true + +services: + kspeeder: + image: linkease/kspeeder:0.3.0 + container_name: ${CONTAINER_NAME} + labels: + createdBy: "Apps" + restart: always + networks: + - 1panel-network + ports: + - ${PANEL_APP_PORT_HTTP}:5003 + - ${PANEL_APP_PORT_API}:5443 + env_file: + - ${GLOBAL_ENV_FILE:-/etc/1panel/envs/global.env} + - ${ENV_FILE:-/etc/1panel/envs/default.env} + volumes: + - ${KSPEEDER_ROOT_PATH}/data:/kspeeder-data + - ${KSPEEDER_ROOT_PATH}/config:/kspeeder-config + environment: + - TZ=Asia/Shanghai diff --git a/apps/kspeeder/0.3.0/envs/default.env b/apps/kspeeder/0.3.0/envs/default.env new file mode 100644 index 000000000..cd05f46e6 --- /dev/null +++ b/apps/kspeeder/0.3.0/envs/default.env @@ -0,0 +1,2 @@ +# copyright© 2024 XinJiang Ms Studio +ENV_FILE=.env diff --git a/apps/kspeeder/0.3.0/envs/global.env b/apps/kspeeder/0.3.0/envs/global.env new file mode 100644 index 000000000..e10989fe4 --- /dev/null +++ b/apps/kspeeder/0.3.0/envs/global.env @@ -0,0 +1,2 @@ +# copyright© 2024 XinJiang Ms Studio +TZ=Asia/Shanghai diff --git a/apps/kspeeder/0.3.0/scripts/init.sh b/apps/kspeeder/0.3.0/scripts/init.sh new file mode 100644 index 000000000..07fb8c3fe --- /dev/null +++ b/apps/kspeeder/0.3.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/apps/kspeeder/0.3.0/scripts/uninstall.sh b/apps/kspeeder/0.3.0/scripts/uninstall.sh new file mode 100644 index 000000000..c86c4fbca --- /dev/null +++ b/apps/kspeeder/0.3.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/apps/kspeeder/0.3.0/scripts/upgrade.sh b/apps/kspeeder/0.3.0/scripts/upgrade.sh new file mode 100644 index 000000000..07fb8c3fe --- /dev/null +++ b/apps/kspeeder/0.3.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/apps/kspeeder/README.md b/apps/kspeeder/README.md new file mode 100644 index 000000000..12666901d --- /dev/null +++ b/apps/kspeeder/README.md @@ -0,0 +1,41 @@ +# KSpeeder + +Docker镜像加速专家 多镜像并发下载,动态负载均衡,断点续传支持,Docker镜像代理服务 + +![KSpeeder](https://file.lifebus.top/imgs/kspeeder_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 KSpeeder 是一个基于 Alpine Linux 的 KSpeeder 容器化部署方案。KSpeeder 是一个用于优化 Docker +镜像仓库访问的工具,它提供了智能镜像源选择、下载加速、状态监控等功能。本项目提供了多架构支持,可以在不同的硬件平台上运行。 + +## 软件特性 + +### Docker 镜像仓库代理服务 + ++ 支持 HTTPS 协议 ++ 自动配置 Docker 镜像源 ++ 支持证书自动获取和缓存 ++ 支持多架构(AMD64/ARM64/ARM) ++ 智能镜像源选择和自动切换 ++ 实时下载速度监控 ++ 可视化状态监控界面 + +### 限速文件服务器 + ++ 支持可配置的带宽限制 ++ 基于目录的文件服务 ++ HTTP 协议支持 + +### 网络优化 + ++ 支持 HTTP/2 协议 ++ 支持自定义超时设置 ++ 内置连接池管理 ++ 异步读取优化 + +--- + +![Ms Studio](https://file.lifebus.top/imgs/ms_blank_001.png) diff --git a/apps/kspeeder/data.yml b/apps/kspeeder/data.yml new file mode 100644 index 000000000..d45ba630e --- /dev/null +++ b/apps/kspeeder/data.yml @@ -0,0 +1,14 @@ +additionalProperties: + key: kspeeder + name: KSpeeder + tags: + - WebSite + - Local + shortDescZh: Docker镜像加速专家 + shortDescEn: Docker Image Accelerator Expert + type: website + crossVersionUpdate: true + limit: 0 + website: https://kspeeder.istoreos.com/ + github: https://github.com/linkease/docker_kspeeder/ + document: https://kspeeder.istoreos.com/ diff --git a/apps/kspeeder/logo.png b/apps/kspeeder/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..10bd02829ce048733552ba1db3905a529f000e2e GIT binary patch literal 13127 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 literal 0 KcmV+b0RR6000031 diff --git a/apps/kspeeder/logo.svg b/apps/kspeeder/logo.svg new file mode 100644 index 000000000..2b11bf83d --- /dev/null +++ b/apps/kspeeder/logo.svg @@ -0,0 +1,5 @@ + + + + +