From e783b70609076aef992ea2da080d13cce90c4f09 Mon Sep 17 00:00:00 2001 From: Meng Sen Date: Mon, 1 Sep 2025 11:57:10 +0800 Subject: [PATCH] =?UTF-8?q?=E5=8F=91=E5=B8=83=E5=BA=94=E7=94=A8=20Termix?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Meng Sen --- apps/termix/README.md | 47 ++++++++++++++ apps/termix/data.yml | 14 +++++ apps/termix/latest/data.yml | 17 +++++ apps/termix/latest/docker-compose.yml | 23 +++++++ apps/termix/latest/envs/default.env | 2 + apps/termix/latest/envs/global.env | 2 + apps/termix/latest/scripts/init.sh | 17 +++++ apps/termix/latest/scripts/uninstall.sh | 10 +++ apps/termix/latest/scripts/upgrade.sh | 17 +++++ apps/termix/logo.png | Bin 0 -> 9840 bytes apps/termix/logo.svg | 80 ++++++++++++++++++++++++ 11 files changed, 229 insertions(+) create mode 100644 apps/termix/README.md create mode 100644 apps/termix/data.yml create mode 100644 apps/termix/latest/data.yml create mode 100644 apps/termix/latest/docker-compose.yml create mode 100644 apps/termix/latest/envs/default.env create mode 100644 apps/termix/latest/envs/global.env create mode 100644 apps/termix/latest/scripts/init.sh create mode 100644 apps/termix/latest/scripts/uninstall.sh create mode 100644 apps/termix/latest/scripts/upgrade.sh create mode 100644 apps/termix/logo.png create mode 100644 apps/termix/logo.svg diff --git a/apps/termix/README.md b/apps/termix/README.md new file mode 100644 index 000000000..243afa071 --- /dev/null +++ b/apps/termix/README.md @@ -0,0 +1,47 @@ +# Termix + +服务器管理平台 + +![Termix](https://file.lifebus.top/imgs/termix_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) + +## 简介 + +Termix 是一个基于 Web 的服务器管理平台,具有 SSH 终端、隧道和文件编辑功能。 + +## 特性 + +### SSH 终端访问 + +功能齐全的终端,支持分屏(最多 4 个面板)和选项卡系统 + +### SSH 隧道管理 + +通过自动重新连接和运行状况监控创建和管理 SSH 隧道 + +### 远程文件编辑器 + +使用语法突出显示、文件管理功能(上传、删除、重命名、删除文件)直接在远程服务器上编辑文件 + +### SSH 主机管理器 + +使用标签和文件夹保存、组织和管理您的 SSH 连接 + +### 服务器统计信息 + +查看任何 SSH 服务器上的 CPU、内存和 HDD 使用情况 + +### 用户身份验证 + +通过管理控制和 OIDC 支持进行安全用户管理,并计划提供更多身份验证类型 + +### 现代 UI + +使用 React、Tailwind CSS 和 Shadcn 构建的干净界面 + + + +--- + +![Ms Studio](https://file.lifebus.top/imgs/ms_blank_001.png) diff --git a/apps/termix/data.yml b/apps/termix/data.yml new file mode 100644 index 000000000..e946bb50b --- /dev/null +++ b/apps/termix/data.yml @@ -0,0 +1,14 @@ +additionalProperties: + key: termix + name: Termix + tags: + - WebSite + - Local + shortDescZh: 服务器管理平台 + shortDescEn: Server management platform + type: website + crossVersionUpdate: true + limit: 0 + website: https://docs.termix.site/ + github: https://github.com/LukeGus/Termix/ + document: https://docs.termix.site/ diff --git a/apps/termix/latest/data.yml b/apps/termix/latest/data.yml new file mode 100644 index 000000000..6a8ce7fb5 --- /dev/null +++ b/apps/termix/latest/data.yml @@ -0,0 +1,17 @@ +additionalProperties: + formFields: + - default: "/home/termix" + edit: true + envKey: TERMIX_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 diff --git a/apps/termix/latest/docker-compose.yml b/apps/termix/latest/docker-compose.yml new file mode 100644 index 000000000..0fefeb8d0 --- /dev/null +++ b/apps/termix/latest/docker-compose.yml @@ -0,0 +1,23 @@ +networks: + 1panel-network: + external: true + +services: + termix: + image: ghcr.io/lukegus/termix:latest + container_name: ${CONTAINER_NAME} + labels: + createdBy: "Apps" + restart: always + networks: + - 1panel-network + ports: + - ${PANEL_APP_PORT_HTTP}:8080 + env_file: + - ${GLOBAL_ENV_FILE:-/etc/1panel/envs/global.env} + - ${ENV_FILE:-/etc/1panel/envs/default.env} + volumes: + - ${TERMIX_ROOT_PATH}/data:/app/data + environment: + - TZ=Asia/Shanghai + - PORT=8080 diff --git a/apps/termix/latest/envs/default.env b/apps/termix/latest/envs/default.env new file mode 100644 index 000000000..cd05f46e6 --- /dev/null +++ b/apps/termix/latest/envs/default.env @@ -0,0 +1,2 @@ +# copyright© 2024 XinJiang Ms Studio +ENV_FILE=.env diff --git a/apps/termix/latest/envs/global.env b/apps/termix/latest/envs/global.env new file mode 100644 index 000000000..e10989fe4 --- /dev/null +++ b/apps/termix/latest/envs/global.env @@ -0,0 +1,2 @@ +# copyright© 2024 XinJiang Ms Studio +TZ=Asia/Shanghai diff --git a/apps/termix/latest/scripts/init.sh b/apps/termix/latest/scripts/init.sh new file mode 100644 index 000000000..07fb8c3fe --- /dev/null +++ b/apps/termix/latest/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/termix/latest/scripts/uninstall.sh b/apps/termix/latest/scripts/uninstall.sh new file mode 100644 index 000000000..c86c4fbca --- /dev/null +++ b/apps/termix/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/termix/latest/scripts/upgrade.sh b/apps/termix/latest/scripts/upgrade.sh new file mode 100644 index 000000000..07fb8c3fe --- /dev/null +++ b/apps/termix/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 diff --git a/apps/termix/logo.png b/apps/termix/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..42b51d50198a748cbd3430d04d122b810788a5c8 GIT binary patch literal 9840 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 zBmnH+zdt_rxzENYKl!g>baXT#BF>&Y7vKBd3-Pm`z0ubtf&h@Co(6yi9{An(z2Cbw z&foU4pS>P`_jj+xE3f>YUcNK{u!YJ4!2bRFchp+$l*|X=aZwaiM9{_fbN&~>rqu09n+vEE`{Naydety2n zmjD1NP-y@-efq6<>7~DlAN}aZRX!E~s92=|;5*;>^C}+)0QAU?ZUh7X><$6|0Axr2 z0Due$005970RR9pw4;XsZRgQPKYM*Ifg-;1oj;G$r#l~ic;wl;<|)AprmYG9&;1K!yYW0LYL4 z000>h001CE0ssJHNB{tU3<&@LkRbs805T*106>NW007940000P5&!@oLjnK*WJmx2 zfD8!$0FWU8001&1002OS1ONcYkN^Mx84>^hAVc+j7horR?D#!#rua)#g7UANelr1K!yYW0LYL4000>h001CE0ssJHNB{tU3<&@LkRbs8 z05T*106>Pa*dFior~WbC`OKMq7XzR#?s@v-ap<|)AprmYG9&;1K!yYW0LYL4000>h001CE0ssJHNB{tU3<&@LkRbs8 z05T*106>NW007940000P5&!@oLjnK*WJmx2fD8!$0FWU8001&1002OS1ONcYkN^Mx z84>^hAVUHG0Axr20Due$005970RR9pR2vx?X{B6v?AZOiFAV_Dl@ljkO}b7G003l2 z004jt2><|)AprmYG9&;1K!yYW0LYL4000>h001CE0ssJHsNU}a?1bjtW;FLM_q!Ny zgZkx0)Guf8PY~FJviSD-`4ex%JD)kz?_$6W?s@v-apNW007940000P5&!@oLjnK*WJmx2fD8!$0FWU8001&1002OS1ONcYkN^Mx84>^h zAVUHG0Axr20Due$005970RR9pBme+Fh6Dfr$dCX402vYh03bsG003l2004jt2><|) zAprmYG9&;1K!yYW0LYL4000>h001CE^?ny%C)6+3V|Zq`-^G9%)Guf8&kxw8Y9k{f zt&|Io9lO8xr2zoCa^l3RN!J+y0Due$005970RR9pBme+Fh6Dfr$dCX402vYh03bsG z003l2004jt2><|)AprmYG9&;1K!yYW0LYL4000>h001CE0ssJHNB{tU3<&@LkRbs8 z05Vh?85wD%TsSs%d+$pF0CZ(;?o!fq$pHWWxOEr;0Due$005970RR9pBme+Fh6Dfr z$dCX402vYh03bsG003mDo_gWE_x@IIO9B9N?e*7xnsi-q02m*)6)*tYDhvStK!yYW z0LYL4000>h001CE0ssJHNB{tU3<&@LkRbs805T*106>NW007940000P5&!@oLjnK* zWJmx2fD8!$0FWU8001&1002OS1ONcYkN^Mx84>^hAVUHG0Axr20Due$005970RR9p zByBYquK)lB4oO5oQ~&@#h6Dfr$dCX402vYh03bsG003l2004jt2><|)AprmYG9&;1 zK!yYW0LYL4000>h001CE0ssJHNB{tU3<&@LkRbs805T*106>NW007940000P5&!@o zLjnK*WJmx2fD8!$0FWU8001&1002OS1ONcYkN^Mx84>^hAVUHG0Axr20Due$00597 z0RR9pBme+Fh6Dfr$dCX402vYh03bsG003l2004jt2><|)AprmYG9&;1K!yYW0LYL4 z000>h001CE0ssJHNB{tU3<&@LkRbs805T*106>NW007940000P5&!@oLjnK*WJmx2 zfD8!$0FWU8001&H5D}+RE^IcNy)O*_P}Z|?)}w<$L*EiJ{lbMJIf zJOH3-v$L0yyZ;9U240MI09agHd^UAIfa&SCx+^6BP^kiS^Tql3`5SrwqSb1>kaDM9 z007uM&YgQF=H@P?UVgp7zkVy==Th&Uo_@=U008K-X0sWmPyaIc`c|v;V*CGJ4*-jc zi!Y~623%TNvLXNg`fPgotwKxx78e(<*Yktx|K_&aZo3o_{~_fmSFX&(;9x!W?j0*w zTmYb3Gc#x6%$f9gd97CKi_K>9`m+BUP6M2upMN2BPk>lU9<~SufSolzf2HW8{2N;T zu`vL|wS@5L)TgbiG~?vSpPCN<06S!9X)#Wo{ArP{|7f*Zf4cF{1~>jev)Q~@uh);% zYPI{)9=aOm&b=EG6Z@jkxGlLb06;PG^H<_$Kl_J5m48Hhb8&I;zi<4*_XU86hRDHH&ZU}ok_{Nfk?T(t5(wXm@8A0y&@UGSdiXJd49Zww6$7b++K@Sbz$-ibHg zd?PMhO4_XV2CY`>PZk#!JMQsQ+wK7)BO}j8#KVPOIU>f!ZjY&{J7awO_A<8vK$b3C zI3F`JXNv6bcY|83_U!!p{1>;pCgC{~BO@a}h=`;~ftwi{yFJFoZ;w0fI2`qQz3gKE z;Fh(tv>0=9m)3UMUFzmhuPrPre0sYxeo_KJ3=a<7#L7xDW@j(O+}x$A_SHGHu(0rnlmq^f0>GNCdjhsH zI9QK*z2lSw0J!OO*|OixYpqu6k;TQuqz(Ow1b|oz0pBV+CjbEGi5C_Y7QUF$@^35J zY-SF`6gSA@i`P9vV0DwxJs?}n3BH_g3jmPrRIAnc;=;nhN2;j&qpBW&jn;Yu zzPi>UV2%I)l+bFmo*ft%c(I$V{!V%l0M?lp85wyzBK}Q8JSYqRz?LpX#LKN#>&1w8 zIdx5c8NChwH)u2(_toq52P5LHwOs| + + + + + + + + + >_ + + + + + + + + +