From 3b9eac12c2c771a74a74f37290ce2cf7766f1dc9 Mon Sep 17 00:00:00 2001 From: QYG2297248353 Date: Mon, 10 Feb 2025 09:20:47 +0000 Subject: [PATCH] Processed apps directory via GitHub Actions --- appstore/casdoor/{1.828.0 => 1.831.0}/.env | 0 .../config/init_data.json | 0 .../casdoor/{1.828.0 => 1.831.0}/data.yml | 0 .../{1.828.0 => 1.831.0}/docker-compose.yml | 2 +- .../{1.828.0 => 1.831.0}/envs/casdoor.env | 0 .../{1.828.0 => 1.831.0}/envs/default.env | 0 .../{1.828.0 => 1.831.0}/envs/global.env | 0 .../{1.828.0 => 1.831.0}/scripts/init.sh | 0 .../{1.828.0 => 1.831.0}/scripts/uninstall.sh | 0 .../{1.828.0 => 1.831.0}/scripts/upgrade.sh | 0 appstore/dashdot-gpu/5.9.0/docker-compose.yml | 2 + appstore/deeplx/{1.0.3.1 => 1.0.4.1}/.env | 0 appstore/deeplx/{1.0.3.1 => 1.0.4.1}/data.yml | 0 .../{1.0.3.1 => 1.0.4.1}/docker-compose.yml | 2 +- .../{1.0.3.1 => 1.0.4.1}/envs/default.env | 0 .../{1.0.3.1 => 1.0.4.1}/envs/global.env | 0 .../{1.0.3.1 => 1.0.4.1}/scripts/init.sh | 0 .../{1.0.3.1 => 1.0.4.1}/scripts/uninstall.sh | 0 .../{1.0.3.1 => 1.0.4.1}/scripts/upgrade.sh | 0 appstore/ollama/0.5.7/.env | 21 ++++ appstore/ollama/0.5.7/data.yml | 71 +++++++++++++ appstore/ollama/0.5.7/docker-compose.yml | 30 ++++++ .../0.5.7}/envs/default.env | 0 .../0.5.7}/envs/global.env | 0 .../0.5.7}/scripts/init.sh | 0 .../0.5.7}/scripts/uninstall.sh | 0 .../0.5.7}/scripts/upgrade.sh | 0 appstore/ollama/README.md | 96 ++++++++++++++++++ appstore/ollama/data.yml | 15 +++ appstore/ollama/logo.png | Bin 0 -> 50341 bytes appstore/open-webui/0.5.10/.env | 30 ++++++ appstore/open-webui/0.5.10/data.yml | 78 ++++++++++++++ appstore/open-webui/0.5.10/docker-compose.yml | 27 +++++ appstore/open-webui/0.5.10/envs/default.env | 2 + appstore/open-webui/0.5.10/envs/global.env | 2 + appstore/open-webui/0.5.10/scripts/init.sh | 17 ++++ .../open-webui/0.5.10/scripts/uninstall.sh | 10 ++ appstore/open-webui/0.5.10/scripts/upgrade.sh | 17 ++++ appstore/open-webui/README.md | 61 +++++++++++ appstore/open-webui/data.yml | 15 +++ appstore/open-webui/logo.png | Bin 0 -> 10655 bytes .../rsshub/{2025-02-08 => 2025-02-09}/.env | 0 .../{2025-02-08 => 2025-02-09}/data.yml | 0 .../docker-compose.yml | 2 +- appstore/rsshub/2025-02-09/envs/default.env | 2 + appstore/rsshub/2025-02-09/envs/global.env | 2 + appstore/rsshub/2025-02-09/scripts/init.sh | 17 ++++ .../rsshub/2025-02-09/scripts/uninstall.sh | 10 ++ appstore/rsshub/2025-02-09/scripts/upgrade.sh | 17 ++++ dockge/casdoor/docker-compose.yml | 2 +- dockge/dashdot-gpu/docker-compose.yml | 2 + dockge/deeplx/docker-compose.yml | 2 +- dockge/ollama/.env | 21 ++++ dockge/ollama/docker-compose.yml | 30 ++++++ dockge/ollama/envs/default.env | 2 + dockge/ollama/envs/global.env | 2 + dockge/open-webui/.env | 30 ++++++ dockge/open-webui/docker-compose.yml | 27 +++++ dockge/open-webui/envs/default.env | 2 + dockge/open-webui/envs/global.env | 2 + dockge/rsshub/docker-compose.yml | 2 +- 61 files changed, 666 insertions(+), 6 deletions(-) rename appstore/casdoor/{1.828.0 => 1.831.0}/.env (100%) rename appstore/casdoor/{1.828.0 => 1.831.0}/config/init_data.json (100%) rename appstore/casdoor/{1.828.0 => 1.831.0}/data.yml (100%) rename appstore/casdoor/{1.828.0 => 1.831.0}/docker-compose.yml (93%) rename appstore/casdoor/{1.828.0 => 1.831.0}/envs/casdoor.env (100%) rename appstore/casdoor/{1.828.0 => 1.831.0}/envs/default.env (100%) rename appstore/casdoor/{1.828.0 => 1.831.0}/envs/global.env (100%) rename appstore/casdoor/{1.828.0 => 1.831.0}/scripts/init.sh (100%) rename appstore/casdoor/{1.828.0 => 1.831.0}/scripts/uninstall.sh (100%) rename appstore/casdoor/{1.828.0 => 1.831.0}/scripts/upgrade.sh (100%) rename appstore/deeplx/{1.0.3.1 => 1.0.4.1}/.env (100%) rename appstore/deeplx/{1.0.3.1 => 1.0.4.1}/data.yml (100%) rename appstore/deeplx/{1.0.3.1 => 1.0.4.1}/docker-compose.yml (88%) rename appstore/deeplx/{1.0.3.1 => 1.0.4.1}/envs/default.env (100%) rename appstore/deeplx/{1.0.3.1 => 1.0.4.1}/envs/global.env (100%) rename appstore/deeplx/{1.0.3.1 => 1.0.4.1}/scripts/init.sh (100%) rename appstore/deeplx/{1.0.3.1 => 1.0.4.1}/scripts/uninstall.sh (100%) rename appstore/deeplx/{1.0.3.1 => 1.0.4.1}/scripts/upgrade.sh (100%) create mode 100644 appstore/ollama/0.5.7/.env create mode 100644 appstore/ollama/0.5.7/data.yml create mode 100644 appstore/ollama/0.5.7/docker-compose.yml rename appstore/{rsshub/2025-02-08 => ollama/0.5.7}/envs/default.env (100%) rename appstore/{rsshub/2025-02-08 => ollama/0.5.7}/envs/global.env (100%) rename appstore/{rsshub/2025-02-08 => ollama/0.5.7}/scripts/init.sh (100%) rename appstore/{rsshub/2025-02-08 => ollama/0.5.7}/scripts/uninstall.sh (100%) rename appstore/{rsshub/2025-02-08 => ollama/0.5.7}/scripts/upgrade.sh (100%) create mode 100644 appstore/ollama/README.md create mode 100644 appstore/ollama/data.yml create mode 100644 appstore/ollama/logo.png create mode 100644 appstore/open-webui/0.5.10/.env create mode 100644 appstore/open-webui/0.5.10/data.yml create mode 100644 appstore/open-webui/0.5.10/docker-compose.yml create mode 100644 appstore/open-webui/0.5.10/envs/default.env create mode 100644 appstore/open-webui/0.5.10/envs/global.env create mode 100644 appstore/open-webui/0.5.10/scripts/init.sh create mode 100644 appstore/open-webui/0.5.10/scripts/uninstall.sh create mode 100644 appstore/open-webui/0.5.10/scripts/upgrade.sh create mode 100644 appstore/open-webui/README.md create mode 100644 appstore/open-webui/data.yml create mode 100644 appstore/open-webui/logo.png rename appstore/rsshub/{2025-02-08 => 2025-02-09}/.env (100%) rename appstore/rsshub/{2025-02-08 => 2025-02-09}/data.yml (100%) rename appstore/rsshub/{2025-02-08 => 2025-02-09}/docker-compose.yml (97%) create mode 100644 appstore/rsshub/2025-02-09/envs/default.env create mode 100644 appstore/rsshub/2025-02-09/envs/global.env create mode 100644 appstore/rsshub/2025-02-09/scripts/init.sh create mode 100644 appstore/rsshub/2025-02-09/scripts/uninstall.sh create mode 100644 appstore/rsshub/2025-02-09/scripts/upgrade.sh create mode 100644 dockge/ollama/.env create mode 100644 dockge/ollama/docker-compose.yml create mode 100644 dockge/ollama/envs/default.env create mode 100644 dockge/ollama/envs/global.env create mode 100644 dockge/open-webui/.env create mode 100644 dockge/open-webui/docker-compose.yml create mode 100644 dockge/open-webui/envs/default.env create mode 100644 dockge/open-webui/envs/global.env diff --git a/appstore/casdoor/1.828.0/.env b/appstore/casdoor/1.831.0/.env similarity index 100% rename from appstore/casdoor/1.828.0/.env rename to appstore/casdoor/1.831.0/.env diff --git a/appstore/casdoor/1.828.0/config/init_data.json b/appstore/casdoor/1.831.0/config/init_data.json similarity index 100% rename from appstore/casdoor/1.828.0/config/init_data.json rename to appstore/casdoor/1.831.0/config/init_data.json diff --git a/appstore/casdoor/1.828.0/data.yml b/appstore/casdoor/1.831.0/data.yml similarity index 100% rename from appstore/casdoor/1.828.0/data.yml rename to appstore/casdoor/1.831.0/data.yml diff --git a/appstore/casdoor/1.828.0/docker-compose.yml b/appstore/casdoor/1.831.0/docker-compose.yml similarity index 93% rename from appstore/casdoor/1.828.0/docker-compose.yml rename to appstore/casdoor/1.831.0/docker-compose.yml index 39e82b12a..e30257916 100644 --- a/appstore/casdoor/1.828.0/docker-compose.yml +++ b/appstore/casdoor/1.831.0/docker-compose.yml @@ -14,7 +14,7 @@ services: - verificationCodeTimeout=10 - appname=casdoor - authState=casdoor - image: casbin/casdoor:v1.828.0 + image: casbin/casdoor:v1.831.0 labels: createdBy: Apps networks: diff --git a/appstore/casdoor/1.828.0/envs/casdoor.env b/appstore/casdoor/1.831.0/envs/casdoor.env similarity index 100% rename from appstore/casdoor/1.828.0/envs/casdoor.env rename to appstore/casdoor/1.831.0/envs/casdoor.env diff --git a/appstore/casdoor/1.828.0/envs/default.env b/appstore/casdoor/1.831.0/envs/default.env similarity index 100% rename from appstore/casdoor/1.828.0/envs/default.env rename to appstore/casdoor/1.831.0/envs/default.env diff --git a/appstore/casdoor/1.828.0/envs/global.env b/appstore/casdoor/1.831.0/envs/global.env similarity index 100% rename from appstore/casdoor/1.828.0/envs/global.env rename to appstore/casdoor/1.831.0/envs/global.env diff --git a/appstore/casdoor/1.828.0/scripts/init.sh b/appstore/casdoor/1.831.0/scripts/init.sh similarity index 100% rename from appstore/casdoor/1.828.0/scripts/init.sh rename to appstore/casdoor/1.831.0/scripts/init.sh diff --git a/appstore/casdoor/1.828.0/scripts/uninstall.sh b/appstore/casdoor/1.831.0/scripts/uninstall.sh similarity index 100% rename from appstore/casdoor/1.828.0/scripts/uninstall.sh rename to appstore/casdoor/1.831.0/scripts/uninstall.sh diff --git a/appstore/casdoor/1.828.0/scripts/upgrade.sh b/appstore/casdoor/1.831.0/scripts/upgrade.sh similarity index 100% rename from appstore/casdoor/1.828.0/scripts/upgrade.sh rename to appstore/casdoor/1.831.0/scripts/upgrade.sh diff --git a/appstore/dashdot-gpu/5.9.0/docker-compose.yml b/appstore/dashdot-gpu/5.9.0/docker-compose.yml index 45133b1f2..307f9bab5 100644 --- a/appstore/dashdot-gpu/5.9.0/docker-compose.yml +++ b/appstore/dashdot-gpu/5.9.0/docker-compose.yml @@ -10,6 +10,8 @@ services: devices: - capabilities: - gpu + devices: + - /dev/dri:/dev/dri env_file: - ./envs/global.env - .env diff --git a/appstore/deeplx/1.0.3.1/.env b/appstore/deeplx/1.0.4.1/.env similarity index 100% rename from appstore/deeplx/1.0.3.1/.env rename to appstore/deeplx/1.0.4.1/.env diff --git a/appstore/deeplx/1.0.3.1/data.yml b/appstore/deeplx/1.0.4.1/data.yml similarity index 100% rename from appstore/deeplx/1.0.3.1/data.yml rename to appstore/deeplx/1.0.4.1/data.yml diff --git a/appstore/deeplx/1.0.3.1/docker-compose.yml b/appstore/deeplx/1.0.4.1/docker-compose.yml similarity index 88% rename from appstore/deeplx/1.0.3.1/docker-compose.yml rename to appstore/deeplx/1.0.4.1/docker-compose.yml index a4c16de69..636edd138 100644 --- a/appstore/deeplx/1.0.3.1/docker-compose.yml +++ b/appstore/deeplx/1.0.4.1/docker-compose.yml @@ -9,7 +9,7 @@ services: - .env environment: - PORT=1188 - image: qyg2297248353/deeplx:v1.0.3.1 + image: qyg2297248353/deeplx:v1.0.4.1 labels: createdBy: Apps networks: diff --git a/appstore/deeplx/1.0.3.1/envs/default.env b/appstore/deeplx/1.0.4.1/envs/default.env similarity index 100% rename from appstore/deeplx/1.0.3.1/envs/default.env rename to appstore/deeplx/1.0.4.1/envs/default.env diff --git a/appstore/deeplx/1.0.3.1/envs/global.env b/appstore/deeplx/1.0.4.1/envs/global.env similarity index 100% rename from appstore/deeplx/1.0.3.1/envs/global.env rename to appstore/deeplx/1.0.4.1/envs/global.env diff --git a/appstore/deeplx/1.0.3.1/scripts/init.sh b/appstore/deeplx/1.0.4.1/scripts/init.sh similarity index 100% rename from appstore/deeplx/1.0.3.1/scripts/init.sh rename to appstore/deeplx/1.0.4.1/scripts/init.sh diff --git a/appstore/deeplx/1.0.3.1/scripts/uninstall.sh b/appstore/deeplx/1.0.4.1/scripts/uninstall.sh similarity index 100% rename from appstore/deeplx/1.0.3.1/scripts/uninstall.sh rename to appstore/deeplx/1.0.4.1/scripts/uninstall.sh diff --git a/appstore/deeplx/1.0.3.1/scripts/upgrade.sh b/appstore/deeplx/1.0.4.1/scripts/upgrade.sh similarity index 100% rename from appstore/deeplx/1.0.3.1/scripts/upgrade.sh rename to appstore/deeplx/1.0.4.1/scripts/upgrade.sh diff --git a/appstore/ollama/0.5.7/.env b/appstore/ollama/0.5.7/.env new file mode 100644 index 000000000..068b1ff26 --- /dev/null +++ b/appstore/ollama/0.5.7/.env @@ -0,0 +1,21 @@ +# 数据持久化路径 [必填] +OLLAMA_ROOT_PATH=/home/ollama + +# WebUI 端口 [必填] +PANEL_APP_PORT_HTTP=11434 + +# 最大加载模型数量 [必填] +OLLAMA_MAX_LOADED_MODELS=1 + +# 最大队列长度 [必填] +OLLAMA_MAX_QUEUE=512 + +# 并行推理数量 [必填] +OLLAMA_NUM_PARALLEL=1 + +# 缓存类型 [必填] +OLLAMA_KV_CACHE_TYPE=f16 + +# 启用 Flash Attention [必填] +OLLAMA_FLASH_ATTENTION=0 + diff --git a/appstore/ollama/0.5.7/data.yml b/appstore/ollama/0.5.7/data.yml new file mode 100644 index 000000000..5ba0061cc --- /dev/null +++ b/appstore/ollama/0.5.7/data.yml @@ -0,0 +1,71 @@ +additionalProperties: + formFields: + - default: "/home/ollama" + edit: true + envKey: OLLAMA_ROOT_PATH + labelZh: 数据持久化路径 + labelEn: Data persistence path + required: true + type: text + - default: 11434 + edit: true + envKey: PANEL_APP_PORT_HTTP + labelZh: WebUI 端口 + labelEn: WebUI port + required: true + rule: paramPort + type: number + - default: 1 + edit: true + envKey: OLLAMA_MAX_LOADED_MODELS + labelZh: 最大加载模型数量 + labelEn: Maximum number of loaded models + required: true + rule: paramPort + type: number + - default: 512 + edit: true + envKey: OLLAMA_MAX_QUEUE + labelZh: 最大队列长度 + labelEn: Maximum queue length + required: true + rule: paramPort + type: number + - default: "1" + edit: true + envKey: OLLAMA_NUM_PARALLEL + labelZh: 并行推理数量 + labelEn: Number of parallel inferences + required: true + type: select + values: + - label: "1" + value: "1" + - label: "4" + value: "4" + - default: "f16" + edit: true + envKey: OLLAMA_KV_CACHE_TYPE + labelZh: 缓存类型 + labelEn: Cache type + required: true + type: select + values: + - label: "f16" + value: "f16" + - label: "q8_0" + value: "q8_0" + - label: "q4_0" + value: "q4_0" + - default: "0" + edit: true + envKey: OLLAMA_FLASH_ATTENTION + labelZh: 启用 Flash Attention + labelEn: Enable Flash Attention + required: true + type: select + values: + - label: "启用" + value: "1" + - label: "禁用" + value: "0" diff --git a/appstore/ollama/0.5.7/docker-compose.yml b/appstore/ollama/0.5.7/docker-compose.yml new file mode 100644 index 000000000..a8b3a9c91 --- /dev/null +++ b/appstore/ollama/0.5.7/docker-compose.yml @@ -0,0 +1,30 @@ +networks: + 1panel-network: + external: true +services: + ollama: + container_name: ollama + devices: + - /dev/dri:/dev/dri + env_file: + - ./envs/global.env + - .env + environment: + - TZ=Asia/Shanghai + - OLLAMA_HOST=0.0.0.0 + - OLLAMA_PORT=11434 + - OLLAMA_MAX_LOADED_MODELS=1 + - OLLAMA_NUM_PARALLEL=1 + - OLLAMA_MAX_QUEUE=512 + - OLLAMA_FLASH_ATTENTION=0 + - OLLAMA_KV_CACHE_TYPE=f16 + image: ollama/ollama:0.5.7 + labels: + createdBy: Apps + networks: + - 1panel-network + ports: + - ${PANEL_APP_PORT_HTTP}:11434 + restart: always + volumes: + - ${OLLAMA_ROOT_PATH}/data:/root/.ollama diff --git a/appstore/rsshub/2025-02-08/envs/default.env b/appstore/ollama/0.5.7/envs/default.env similarity index 100% rename from appstore/rsshub/2025-02-08/envs/default.env rename to appstore/ollama/0.5.7/envs/default.env diff --git a/appstore/rsshub/2025-02-08/envs/global.env b/appstore/ollama/0.5.7/envs/global.env similarity index 100% rename from appstore/rsshub/2025-02-08/envs/global.env rename to appstore/ollama/0.5.7/envs/global.env diff --git a/appstore/rsshub/2025-02-08/scripts/init.sh b/appstore/ollama/0.5.7/scripts/init.sh similarity index 100% rename from appstore/rsshub/2025-02-08/scripts/init.sh rename to appstore/ollama/0.5.7/scripts/init.sh diff --git a/appstore/rsshub/2025-02-08/scripts/uninstall.sh b/appstore/ollama/0.5.7/scripts/uninstall.sh similarity index 100% rename from appstore/rsshub/2025-02-08/scripts/uninstall.sh rename to appstore/ollama/0.5.7/scripts/uninstall.sh diff --git a/appstore/rsshub/2025-02-08/scripts/upgrade.sh b/appstore/ollama/0.5.7/scripts/upgrade.sh similarity index 100% rename from appstore/rsshub/2025-02-08/scripts/upgrade.sh rename to appstore/ollama/0.5.7/scripts/upgrade.sh diff --git a/appstore/ollama/README.md b/appstore/ollama/README.md new file mode 100644 index 000000000..6755732dd --- /dev/null +++ b/appstore/ollama/README.md @@ -0,0 +1,96 @@ +# Ollama + +一站式大模型部署平台 + + + +![](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) + +## 模型列表 + +Ollama支持可用的型号列表 [ollama.com/library](https://ollama.com/library 'Ollama 模型库) + +下面是一些可以下载的示例模型: + +| Model | Parameters | Size | Download | +|--------------------|------------|-------|----------------------------------| +| DeepSeek-R1 | 7B | 4.7GB | `ollama run deepseek-r1` | +| DeepSeek-R1 | 671B | 404GB | `ollama run deepseek-r1:671b` | +| Llama 3.3 | 70B | 43GB | `ollama run llama3.3` | +| Llama 3.2 | 3B | 2.0GB | `ollama run llama3.2` | +| Llama 3.2 | 1B | 1.3GB | `ollama run llama3.2:1b` | +| Llama 3.2 Vision | 11B | 7.9GB | `ollama run llama3.2-vision` | +| Llama 3.2 Vision | 90B | 55GB | `ollama run llama3.2-vision:90b` | +| Llama 3.1 | 8B | 4.7GB | `ollama run llama3.1` | +| Llama 3.1 | 405B | 231GB | `ollama run llama3.1:405b` | +| Phi 4 | 14B | 9.1GB | `ollama run phi4` | +| Phi 3 Mini | 3.8B | 2.3GB | `ollama run phi3` | +| Gemma 2 | 2B | 1.6GB | `ollama run gemma2:2b` | +| Gemma 2 | 9B | 5.5GB | `ollama run gemma2` | +| Gemma 2 | 27B | 16GB | `ollama run gemma2:27b` | +| Mistral | 7B | 4.1GB | `ollama run mistral` | +| Moondream 2 | 1.4B | 829MB | `ollama run moondream` | +| Neural Chat | 7B | 4.1GB | `ollama run neural-chat` | +| Starling | 7B | 4.1GB | `ollama run starling-lm` | +| Code Llama | 7B | 3.8GB | `ollama run codellama` | +| Llama 2 Uncensored | 7B | 3.8GB | `ollama run llama2-uncensored` | +| LLaVA | 7B | 4.5GB | `ollama run llava` | +| Solar | 10.7B | 6.1GB | `ollama run solar` | + +> 您应该至少有8 GB的RAM来运行7B型号,16 GB来运行13B型号,32 GB来运行33B型号。 + +## 基本命令 + +### 拉取一个模型 + +```sh +ollama pull llama3.2 +``` + +此命令也可用于更新本地模型。仅拉取差异。 + +### 移除一个模型 + +```sh +ollama rm llama3.2 +``` + +### 复制一个模型 + +```sh +ollama cp llama3.2 my-model +``` + +### 显示模型信息 + +```sh +ollama show llama3.2 +``` + +### 列出你电脑上的所有模型 + +```sh +ollama list +``` + +### 列出当前已加载的模型 + +```sh +ollama ps +``` + +### 停止正在运行的模型 + +```sh +ollama stop llama3.2 +``` + +### 启动 Ollama + +```sh +ollama serve +``` + +--- + +![Ms Studio](https://file.lifebus.top/imgs/ms_blank_001.png) diff --git a/appstore/ollama/data.yml b/appstore/ollama/data.yml new file mode 100644 index 000000000..96a7a5f62 --- /dev/null +++ b/appstore/ollama/data.yml @@ -0,0 +1,15 @@ +additionalProperties: + key: ollama + name: Ollama + tags: + - WebSite + - AI + - Local + shortDescZh: 一站式大模型部署平台 + shortDescEn: Get up and running with large language models + type: website + crossVersionUpdate: true + limit: 0 + website: https://ollama.com/ + github: https://github.com/ollama/ollama/ + document: https://ollama.com/ diff --git a/appstore/ollama/logo.png b/appstore/ollama/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..213da6d826132cde77e0ae23e8daac9f58338807 GIT binary patch literal 50341 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 literal 0 HcmV?d00001 diff --git a/appstore/open-webui/0.5.10/.env b/appstore/open-webui/0.5.10/.env new file mode 100644 index 000000000..125959f94 --- /dev/null +++ b/appstore/open-webui/0.5.10/.env @@ -0,0 +1,30 @@ +# 数据持久化路径 [必填] +OPEN_WEBUI_ROOT_PATH=/home/open-webui + +# WebUI 端口 [必填] +PANEL_APP_PORT_HTTP=8080 + +# Ollama 服务地址 [必填] +OLLAMA_BASE_URL=http://127.0.0.1:11434 + +# Ollama 负载均衡服务列表 +OLLAMA_BASE_URLS= + +# 访问令牌密钥 +WEBUI_SECRET_KEY= + +# 应用名称 [必填] +WEBUI_NAME=Open WebUI + +# 应用服务地址 [必填] +WEBUI_URL=http://localhost:8080 + +# 离线模式 [必填] +HF_HUB_OFFLINE=0 + +# 网络代理 +http_proxy= + +# 忽略代理 +no_proxy= + diff --git a/appstore/open-webui/0.5.10/data.yml b/appstore/open-webui/0.5.10/data.yml new file mode 100644 index 000000000..3c87483a6 --- /dev/null +++ b/appstore/open-webui/0.5.10/data.yml @@ -0,0 +1,78 @@ +additionalProperties: + formFields: + - default: "/home/open-webui" + edit: true + envKey: OPEN_WEBUI_ROOT_PATH + labelZh: 数据持久化路径 + labelEn: Data persistence path + required: true + type: text + - default: 8080 + edit: true + envKey: PANEL_APP_PORT_HTTP + labelZh: WebUI 端口 + labelEn: WebUI port + required: true + rule: paramPort + type: number + - default: "http://127.0.0.1:11434" + edit: true + envKey: OLLAMA_BASE_URL + labelZh: Ollama 服务地址 + labelEn: Ollama service address + required: true + type: text + - default: "" + edit: true + envKey: OLLAMA_BASE_URLS + labelZh: Ollama 负载均衡服务列表 + labelEn: Ollama load balancing service list + required: false + type: text + - default: "" + edit: true + envKey: WEBUI_SECRET_KEY + labelZh: 访问令牌密钥 + labelEn: Access token key + required: false + type: text + - default: "Open WebUI" + edit: true + envKey: WEBUI_NAME + labelZh: 应用名称 + labelEn: Application name + required: true + type: text + - default: "http://localhost:8080" + edit: true + envKey: WEBUI_URL + labelZh: 应用服务地址 + labelEn: Application service address + required: true + type: text + - default: "0" + edit: true + envKey: HF_HUB_OFFLINE + labelZh: 离线模式 + labelEn: Offline mode + required: true + type: select + values: + - label: 启用 + value: "1" + - label: 禁用 + value: "0" + - default: "" + edit: true + envKey: http_proxy + labelZh: 网络代理 + labelEn: Network proxy + required: false + type: text + - default: "" + edit: true + envKey: no_proxy + labelZh: 忽略代理 + labelEn: Ignore proxy + required: false + type: text diff --git a/appstore/open-webui/0.5.10/docker-compose.yml b/appstore/open-webui/0.5.10/docker-compose.yml new file mode 100644 index 000000000..d7058670b --- /dev/null +++ b/appstore/open-webui/0.5.10/docker-compose.yml @@ -0,0 +1,27 @@ +networks: + 1panel-network: + external: true +services: + open-webui: + container_name: open-webui + devices: + - /dev/dri:/dev/dri + env_file: + - ./envs/global.env + - .env + environment: + - TZ=Asia/Shanghai + - PORT=8080 + - ENABLE_OLLAMA_API=True + - ENABLE_OPENAI_API=False + - https_proxy=${http_proxy} + image: ghcr.io/open-webui/open-webui:v0.5.10 + labels: + createdBy: Apps + networks: + - 1panel-network + ports: + - ${PANEL_APP_PORT_HTTP}:8080 + restart: always + volumes: + - ${OPEN_WEBUI_ROOT_PATH}/data:/app/backend/data diff --git a/appstore/open-webui/0.5.10/envs/default.env b/appstore/open-webui/0.5.10/envs/default.env new file mode 100644 index 000000000..cd05f46e6 --- /dev/null +++ b/appstore/open-webui/0.5.10/envs/default.env @@ -0,0 +1,2 @@ +# copyright© 2024 XinJiang Ms Studio +ENV_FILE=.env diff --git a/appstore/open-webui/0.5.10/envs/global.env b/appstore/open-webui/0.5.10/envs/global.env new file mode 100644 index 000000000..e10989fe4 --- /dev/null +++ b/appstore/open-webui/0.5.10/envs/global.env @@ -0,0 +1,2 @@ +# copyright© 2024 XinJiang Ms Studio +TZ=Asia/Shanghai diff --git a/appstore/open-webui/0.5.10/scripts/init.sh b/appstore/open-webui/0.5.10/scripts/init.sh new file mode 100644 index 000000000..07fb8c3fe --- /dev/null +++ b/appstore/open-webui/0.5.10/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/open-webui/0.5.10/scripts/uninstall.sh b/appstore/open-webui/0.5.10/scripts/uninstall.sh new file mode 100644 index 000000000..c86c4fbca --- /dev/null +++ b/appstore/open-webui/0.5.10/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/open-webui/0.5.10/scripts/upgrade.sh b/appstore/open-webui/0.5.10/scripts/upgrade.sh new file mode 100644 index 000000000..07fb8c3fe --- /dev/null +++ b/appstore/open-webui/0.5.10/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/appstore/open-webui/README.md b/appstore/open-webui/README.md new file mode 100644 index 000000000..cf6207752 --- /dev/null +++ b/appstore/open-webui/README.md @@ -0,0 +1,61 @@ +# Open Webui + +用户友好的 AI 界面 + +![Open Webui](https://file.lifebus.top/imgs/open-webui_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) + +## 简介 + +Open WebUI 是一个可扩展的、功能丰富且用户友好的自托管 AI 平台,旨在完全离线运行。它支持各种 LLM 运行器,如 Ollama 和兼容 +OpenAI 的 API,内置 RAG 推理引擎,使其成为强大的 AI 部署解决方案。 + +## 特性 + +🚀 轻松设置:使用 Docker 或 Kubernetes(kubectl、kustomize 或 helm)无缝安装,以获得无烦恼的体验,支持带有:ollama和:cuda标签的镜像。 + +🤝 奥拉马/开放 AI API 集成:轻松集成与奥拉马模型兼容的 API,实现多功能的对话。自定义开放 AI API URL,以连接到 +LMStudio、GroqCloud、Mistral、OpenRouter 等。 + +🛡️ 细粒度权限和用户组:通过允许管理员创建详细的用户角色和权限,我们确保了一个安全用户环境。这种细粒度不仅增强了安全性,还允许定制用户体验,培养用户之间的所有权和责任感。 + +手机 响应式设计:在桌面电脑、笔记本电脑和移动设备上享受无缝体验。 + +手机 渐进式 Web 应用(PWA):使用我们的 PWA,在您的移动设备上享受原生应用般的体验,提供本地主机上的离线访问和无缝的用户界面。 + +✒️🔢 全 Markdown 和 LaTeX 支持:通过全面的 Markdown 和 LaTeX 功能提升您的 LLM 体验,丰富您的交互。 + +🎤📹 免提语音/视频通话:体验集成免提语音和视频通话功能的无缝通信,让您享受更加生动和互动的聊天环境。 + +🛠️ 模型构建器:通过 Web 界面轻松创建 Ollama 模型。创建和添加自定义角色/代理,自定义聊天元素,并通过开放 WebUI 社区集成轻松导入模型。 + +🐍 原生 Python 函数调用工具:通过工具工作区内置代码编辑器支持,增强您的 LLMs。通过简单添加您的纯 Python 函数,实现与 LLMs +的无缝集成。 + +📚 本地 RAG 集成:深入了解聊天交互的未来,利用突破性的检索增强生成(RAG)支持。此功能无缝将文档交互集成到您的聊天体验中。 +您可以直接将文档加载到聊天中,或将文件添加到您的文档库中,使用查询前的#命令轻松访问它们。 + +🔍 Web Search for RAG:使用 SearXNG、Google PSE、Brave Search、serpstack、serper、Serply、DuckDuckGo、TavilySearch、SearchApi 和 +Bing 等提供商进行网络搜索,并将结果直接注入到您的聊天体验中。 + +🌐 网页浏览功能:使用#命令后跟 URL,无缝将网站集成到您的聊天体验中。此功能允许您直接将网络内容融入对话中,增强您互动的丰富性和深度。 + +🎨 图像生成集成:无缝集成图像生成功能,使用 AUTOMATIC1111 API 或 ComfyUI(本地)以及 OpenAI 的 +DALL-E(外部)等选项,通过动态视觉内容丰富您的聊天体验。 + +⚙️ 多种模型对话:轻松同时与各种模型互动,利用它们的独特优势以获得最佳响应。通过并行利用多样化的模型集来提升您的体验。 + +基于角色的访问控制(RBAC):通过受限权限确保安全访问;只有授权人员可以访问您的 Ollama,且模型创建/提取的专属权限仅限于管理员。 + +🌐🌍 多语言支持:使用我们的国际化(i18n)支持,用您喜欢的语言体验 Open WebUI。加入我们,扩展我们的支持语言!我们正在积极寻找贡献者! + +🧩 管道,开放 WebUI 插件支持:通过管道插件框架无缝将自定义逻辑和 Python 库集成到 Open WebUI 中。启动您的管道实例,将 OpenAI +URL 设置为管道 URL,探索无限可能。示例包括函数调用、用户速率限制以控制访问、使用 Langfuse 等工具进行使用监控、与 +LibreTranslate 的实时翻译以支持多语言、有毒信息过滤等更多功能。 + +🌟 持续更新:我们致力于通过定期更新、修复和新功能来改进 Open WebUI。 + +--- + +![Ms Studio](https://file.lifebus.top/imgs/ms_blank_001.png) diff --git a/appstore/open-webui/data.yml b/appstore/open-webui/data.yml new file mode 100644 index 000000000..a5fd6e98d --- /dev/null +++ b/appstore/open-webui/data.yml @@ -0,0 +1,15 @@ +additionalProperties: + key: open-webui + name: Open Webui + tags: + - WebSite + - AI + - Local + shortDescZh: 用户友好的 AI 界面 + shortDescEn: User-friendly AI interface + type: website + crossVersionUpdate: true + limit: 0 + website: https://openwebui.com/ + github: https://github.com/open-webui/open-webui/ + document: https://docs.openwebui.com/ diff --git a/appstore/open-webui/logo.png b/appstore/open-webui/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..63735ad4616fa452325af0fe351139dca01ca0ab GIT binary patch literal 10655 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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/rsshub/2025-02-09/scripts/uninstall.sh b/appstore/rsshub/2025-02-09/scripts/uninstall.sh new file mode 100644 index 000000000..c86c4fbca --- /dev/null +++ b/appstore/rsshub/2025-02-09/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/rsshub/2025-02-09/scripts/upgrade.sh b/appstore/rsshub/2025-02-09/scripts/upgrade.sh new file mode 100644 index 000000000..07fb8c3fe --- /dev/null +++ b/appstore/rsshub/2025-02-09/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/casdoor/docker-compose.yml b/dockge/casdoor/docker-compose.yml index 39e82b12a..e30257916 100644 --- a/dockge/casdoor/docker-compose.yml +++ b/dockge/casdoor/docker-compose.yml @@ -14,7 +14,7 @@ services: - verificationCodeTimeout=10 - appname=casdoor - authState=casdoor - image: casbin/casdoor:v1.828.0 + image: casbin/casdoor:v1.831.0 labels: createdBy: Apps networks: diff --git a/dockge/dashdot-gpu/docker-compose.yml b/dockge/dashdot-gpu/docker-compose.yml index 45133b1f2..307f9bab5 100644 --- a/dockge/dashdot-gpu/docker-compose.yml +++ b/dockge/dashdot-gpu/docker-compose.yml @@ -10,6 +10,8 @@ services: devices: - capabilities: - gpu + devices: + - /dev/dri:/dev/dri env_file: - ./envs/global.env - .env diff --git a/dockge/deeplx/docker-compose.yml b/dockge/deeplx/docker-compose.yml index a4c16de69..636edd138 100644 --- a/dockge/deeplx/docker-compose.yml +++ b/dockge/deeplx/docker-compose.yml @@ -9,7 +9,7 @@ services: - .env environment: - PORT=1188 - image: qyg2297248353/deeplx:v1.0.3.1 + image: qyg2297248353/deeplx:v1.0.4.1 labels: createdBy: Apps networks: diff --git a/dockge/ollama/.env b/dockge/ollama/.env new file mode 100644 index 000000000..068b1ff26 --- /dev/null +++ b/dockge/ollama/.env @@ -0,0 +1,21 @@ +# 数据持久化路径 [必填] +OLLAMA_ROOT_PATH=/home/ollama + +# WebUI 端口 [必填] +PANEL_APP_PORT_HTTP=11434 + +# 最大加载模型数量 [必填] +OLLAMA_MAX_LOADED_MODELS=1 + +# 最大队列长度 [必填] +OLLAMA_MAX_QUEUE=512 + +# 并行推理数量 [必填] +OLLAMA_NUM_PARALLEL=1 + +# 缓存类型 [必填] +OLLAMA_KV_CACHE_TYPE=f16 + +# 启用 Flash Attention [必填] +OLLAMA_FLASH_ATTENTION=0 + diff --git a/dockge/ollama/docker-compose.yml b/dockge/ollama/docker-compose.yml new file mode 100644 index 000000000..a8b3a9c91 --- /dev/null +++ b/dockge/ollama/docker-compose.yml @@ -0,0 +1,30 @@ +networks: + 1panel-network: + external: true +services: + ollama: + container_name: ollama + devices: + - /dev/dri:/dev/dri + env_file: + - ./envs/global.env + - .env + environment: + - TZ=Asia/Shanghai + - OLLAMA_HOST=0.0.0.0 + - OLLAMA_PORT=11434 + - OLLAMA_MAX_LOADED_MODELS=1 + - OLLAMA_NUM_PARALLEL=1 + - OLLAMA_MAX_QUEUE=512 + - OLLAMA_FLASH_ATTENTION=0 + - OLLAMA_KV_CACHE_TYPE=f16 + image: ollama/ollama:0.5.7 + labels: + createdBy: Apps + networks: + - 1panel-network + ports: + - ${PANEL_APP_PORT_HTTP}:11434 + restart: always + volumes: + - ${OLLAMA_ROOT_PATH}/data:/root/.ollama diff --git a/dockge/ollama/envs/default.env b/dockge/ollama/envs/default.env new file mode 100644 index 000000000..cd05f46e6 --- /dev/null +++ b/dockge/ollama/envs/default.env @@ -0,0 +1,2 @@ +# copyright© 2024 XinJiang Ms Studio +ENV_FILE=.env diff --git a/dockge/ollama/envs/global.env b/dockge/ollama/envs/global.env new file mode 100644 index 000000000..e10989fe4 --- /dev/null +++ b/dockge/ollama/envs/global.env @@ -0,0 +1,2 @@ +# copyright© 2024 XinJiang Ms Studio +TZ=Asia/Shanghai diff --git a/dockge/open-webui/.env b/dockge/open-webui/.env new file mode 100644 index 000000000..125959f94 --- /dev/null +++ b/dockge/open-webui/.env @@ -0,0 +1,30 @@ +# 数据持久化路径 [必填] +OPEN_WEBUI_ROOT_PATH=/home/open-webui + +# WebUI 端口 [必填] +PANEL_APP_PORT_HTTP=8080 + +# Ollama 服务地址 [必填] +OLLAMA_BASE_URL=http://127.0.0.1:11434 + +# Ollama 负载均衡服务列表 +OLLAMA_BASE_URLS= + +# 访问令牌密钥 +WEBUI_SECRET_KEY= + +# 应用名称 [必填] +WEBUI_NAME=Open WebUI + +# 应用服务地址 [必填] +WEBUI_URL=http://localhost:8080 + +# 离线模式 [必填] +HF_HUB_OFFLINE=0 + +# 网络代理 +http_proxy= + +# 忽略代理 +no_proxy= + diff --git a/dockge/open-webui/docker-compose.yml b/dockge/open-webui/docker-compose.yml new file mode 100644 index 000000000..d7058670b --- /dev/null +++ b/dockge/open-webui/docker-compose.yml @@ -0,0 +1,27 @@ +networks: + 1panel-network: + external: true +services: + open-webui: + container_name: open-webui + devices: + - /dev/dri:/dev/dri + env_file: + - ./envs/global.env + - .env + environment: + - TZ=Asia/Shanghai + - PORT=8080 + - ENABLE_OLLAMA_API=True + - ENABLE_OPENAI_API=False + - https_proxy=${http_proxy} + image: ghcr.io/open-webui/open-webui:v0.5.10 + labels: + createdBy: Apps + networks: + - 1panel-network + ports: + - ${PANEL_APP_PORT_HTTP}:8080 + restart: always + volumes: + - ${OPEN_WEBUI_ROOT_PATH}/data:/app/backend/data diff --git a/dockge/open-webui/envs/default.env b/dockge/open-webui/envs/default.env new file mode 100644 index 000000000..cd05f46e6 --- /dev/null +++ b/dockge/open-webui/envs/default.env @@ -0,0 +1,2 @@ +# copyright© 2024 XinJiang Ms Studio +ENV_FILE=.env diff --git a/dockge/open-webui/envs/global.env b/dockge/open-webui/envs/global.env new file mode 100644 index 000000000..e10989fe4 --- /dev/null +++ b/dockge/open-webui/envs/global.env @@ -0,0 +1,2 @@ +# copyright© 2024 XinJiang Ms Studio +TZ=Asia/Shanghai diff --git a/dockge/rsshub/docker-compose.yml b/dockge/rsshub/docker-compose.yml index d41de1c15..881ac3005 100644 --- a/dockge/rsshub/docker-compose.yml +++ b/dockge/rsshub/docker-compose.yml @@ -57,7 +57,7 @@ services: - -f - http://localhost:1200/healthz?key=${ACCESS_KEY} timeout: 10s - image: diygod/rsshub:2025-02-08 + image: diygod/rsshub:2025-02-09 labels: createdBy: Apps networks: