巨二兔 发表于 2024-2-27 15:16:00

1panel第三方应用库1panel-appstore

安装/使用方式将 local_appstore_sync_helper.sh 放到 1panel 计划任务中,定时执行即可自动同步本仓库应用,默认无需修改脚本任何参数特性可一键更新同步1Panel官网的应用商店应用到本地环境支持将任意第三方仓库的应用同步到1Panel的本地应用商店支持github,gitlab,gitee等公开仓库、私有仓库支持将多个分散的仓库应用同步到1Panel的本地应用商店支持自定义拉取的分支、克隆深度、访问代/里等,方便灵活同步脚本源码完全开源,可自行修改、扩展,可放心使用使用场景1Panel官方应用商店的应用更新慢,想要快速更新到本地进行使用1Panel官方应用有BUG,或者版本太低,想要自己修改后使用1Panel官方应用商店没有自己想要的应用,想要自己添加应用由于某些原因没法上架到1Panel官方应用商店,定制自己的专属应用用于快速调试开发1Panel应用,方便本地开发调试想要将多个分散的仓库应用同步到1Panel的本地应用商店效果演示将1Panel appstore里最近更的应用一键同步到本地应用商店https://pic.imgdb.cn/item/65dd8b279f345e8d03c70112.jpg
使用教程1. 使用1Panel创建计划任务https://pic.imgdb.cn/item/65dd8b439f345e8d03c74f50.jpg
按上图方式创建计划任务。然后将 local_appstore_sync_helper.sh 内容复制到脚本内容框中。按需修改脚本中的配置项,具体的配置项说明见下文。2. 执行同步脚本点击执行按钮,可即可开始同步。https://pic.imgdb.cn/item/65dd8b549f345e8d03c7797f.jpg
3. 查看同步脚本的执行情况点击任务名称或【报告】按钮即可查看同步脚本的执行日志。https://pic.imgdb.cn/item/65dd8b689f345e8d03c7afd9.jpg
注意:目前1Panel的计划任务执行失败的话查看不了任何日志,这个时候去【主机】>【文件】然后进入:/opt/1panel_hepler/logs目录下查看同步脚本的执行日志即可。4. 查看同步成功的本地应用进入【应用商店】点击右上角的【更新应用列表】即可查看同步到的本地应用。https://pic.imgdb.cn/item/65dd8b279f345e8d03c70112.jpg
配置项详解local_appstore_sync_helper.sh 里包含了一些配置项,可以根据自己的需求进行修改。#!/bin/bash
# 直接执行或复制此脚本到 1Panel->计划任务中定时执行即可

# 1panel本地app的目录(如果不是默认安装,需修改该目录)
app_local_dir="/opt/1panel/resource/apps/local"

# AppStore的git仓库地址(必选)
#git_repo_url="https://github.com/okxlin/appstore"
git_repo_url="https://gitee.com/svip520/1panel-appstore"

# 访问git仓库的access token,访问私有仓库时用,优先级高于账密(可选)
# 建议使用access token,降低账密泄露的风险
git_access_token=""

# 访问git仓库的用户名,访问私有仓库时用(可选)
git_username=""
# 访问git仓库的密码,访问私有仓库时用(可选)
git_password=""

# 指定克隆的分支(可选)
git_branch=""
# 指定克隆的深度(可选)
git_depth=1

# 拉取远程仓库前是否清空本地app目录(可选)
clean_local_app=true
# 拉取远程仓库前是否清空远程app缓存(可选)
clean_remote_app_cache=false

# 设置克隆或拉取远程仓库时使用的代/里(可选)
proxyUrl=""
# 设置示例:
# proxyUrl="http://127.0.0.1:7890"
# proxyUrl="socks5://127.0.0.1:7890"
# proxyUrl="socks5://user:password@host:port"

# 将远程app store工程克隆到本地的工作目录
work_dir="/opt/1panel_hepler"

set -e

mkdir -p "$work_dir/logs"
log_file="$work_dir/logs/local_appstore_sync_helper_$(date +"%Y-%m-%d").log"
logs() {
local message="$1"

if [ -n "$log_file" ]; then
    mkdir -p "$(dirname "$log_file")"
    if [ $? -eq 0 ]; then
      echo -e "[$(date +"%Y-%m-%d %H:%M:%S")] $message"
      echo "[$(date +"%Y-%m-%d %H:%M:%S")] $message" >>"$log_file"
      return
    fi
fi

echo -e "$message"
}

# 函数: url_encode
# 参数:
#   - url: 需要进行编码的字符串
# 返回值:
#   经过URL编码后的字符串
function url_encode() {
local string=$1
local length="${#string}"
local url_encoded_string=""
local c

for ((i = 0; i < length; i++)); do
    c=${string:i:1}
    case "$c" in
    ) url_encoded_string+=$c ;;
    *) url_encoded_string+=$(printf '%%%02X' "'$c") ;;
    esac
done

echo "$url_encoded_string"
}

# 定义函数,接收一个URL参数和可选的替换字符串参数
replace_protocol() {
local url=$1
local replacement=$2

# 如果没有提供替换字符串,则删除"http://"或"https://"
if [[ -z $replacement ]]; then
    local new_url=$(echo $url | sed "s/http:\/\///" | sed "s/https:\/\///")
else
    local new_url=$(echo $url | sed "s/http:\/\//${replacement}/" | sed "s/https:\/\//${replacement}/")
fi

# 输出替换后的URL
echo $new_url
}

# 函数: clone_git_repo
# 参数:
#   - url: Git仓库URL
#   - username: 账号(可选)
#   - password: 密码(可选)
#   - access_token: 访问令牌(可选)
#   - branch: 克隆分支(可选)
#   - depth: 克隆深度(可选,默认为0,即克隆整个仓库)
function clone_git_repo() {
local url=$1
local username=$2
local password=$3
local access_token=$4
local branch=$5
local depth=$6

branch=${branch:+--branch $branch}
depth=${depth:+--depth $depth}

echo "branch: $branch, depth: $depth"

if [[ -n $access_token ]]; then
    echo "use access_token to clone"
    local fix_url=$(replace_protocol "$url")
    git clone "https://oauth2:$access_token@$fix_url" $branch $depth
elif [[ -n $username && -n $password ]]; then
    local encoded_username=$(url_encode "$username")
    local encoded_password=$(url_encode "$password")
    local fix_url=$(replace_protocol "$url")

    # echo "use username and password to clone, encoded_username: $encoded_username, encoded_password: $encoded_password, fix_url: $fix_url"
    echo "use username and password to clone"

    git clone "https://$encoded_username:$encoded_password@$fix_url" $branch $depth
else
    echo "use default clone"
    git clone "$url" $branch $depth
fi
}

# 取消代/里
function proxy_off() {
unset http_proxy
unset https_proxy
unset ALL_PROXY
unset no_proxy
logs "Proxy Off"
}

# 开启代/里
function proxy_on() {
proxy_url="http://127.0.0.1:7890"
match_str="://"

if [ -n "$1" ]; then
    if [[ $1 =~ $match_str ]]; then
      proxy_url=$1
    else
      logs "Incorrect proxy_url, use defualt proxy_url"
      return
    fi
fi

export http_proxy=$proxy_url
export https_proxy=$proxy_url
export ALL_PROXY=$proxy_url
export no_proxy="localhost,127.0.0.1,localaddress,.localdomain.com"
logs "Proxy On $proxy_url"
}

function scriptInfo() {
echo ""
logs "##################################################################"
logs "#    Name: local appstore sync helper for 1Panel               #"
logs "# Version: v1.0.0                                                #"
logs "#Author: nameless                                              #"
logs "#Github: https://gitee.com/svip520/1panel-appstore             #"
logs "##################################################################"
echo ""
}

function main() {
scriptInfo

if [ ! -d "$app_local_dir" ]; then
    logs "未检测到1panel的app目录,请检查1panel是否安装正确,或修改脚本中的app_local_dir变量"
    exit 1
fi

# 检查地址结尾是否包含.git,如果不包含则自动补全
if [[ "$git_repo_url" != *".git" ]]; then
    git_repo_url="${git_repo_url}.git"
fi

local repo_username=""
local repo_projectname=""

# 使用正则表达式匹配仓库地址中的用户名和项目名
if [[ $git_repo_url =~ .*\/(.*)\/(.*)\.git ]]; then
    repo_username=${BASH_REMATCH}
    repo_projectname=${BASH_REMATCH}
    # logs "用户名: $repo_username"
    # logs "项目名: $repo_projectname"
fi

if [ -z "$repo_username" ] || [ -z "$repo_projectname" ]; then
    logs "无法提取用户名和项目名,请检查git_repo_url变量提供的地址是否正确"
    exit 1
fi

mkdir -p "$work_dir/temp"

local repo_user_dir="$work_dir/temp/$repo_username"
local repo_dir="$repo_user_dir/$repo_projectname"

# 根据clean_remote_app_cache变量的值决定是否清空远程app的缓存数据
if [ "$clean_remote_app_cache" = true ] && [ -d "$repo_dir" ]; then
    rm -rf "$repo_dir"
    logs "已清空远程app的缓存数据"
fi

# 根据proxyUrl变量的值决定是否开启代/里
if [ -n "$proxyUrl" ]; then
    proxy_on "$proxyUrl"
fi

# clone或拉取远程仓库最/新代码
logs "准备获取远程仓库最/新代码:$git_repo_url"
if [ -d "$repo_dir" ]; then
    logs "执行git pull操作"
    cd "$repo_dir"

    # 强行拉取最/新代码
    git pull --force 2>>"$log_file"
else
    logs "执行git clone操作"
    mkdir -p "$repo_user_dir"
    cd "$repo_user_dir"

    clone_git_repo "$git_repo_url" "$git_username" "$git_password" "$git_access_token" "$git_branch" "$git_depth" 2>>"$log_file"
fi

logs "远程仓库最/新代码获取完成"

if [ ! -d "$repo_dir/apps" ]; then
    logs "未检测到apps目录,请检查远程仓库是否正确"
    exit 1
fi

# 根据clean_local_app变量的值决定是否清空本地app目录
if [ "$clean_local_app" = true ]; then
    rm -rf "$app_local_dir"/*
    logs "已清空本地原有的app"
fi

# 将远程仓库的apps目录下的所有app复制到本地app_local_dir目录下
cd "$repo_dir"
cp -rf apps/* "$app_local_dir"

pwd
ls -lah
du -sh

# 根据clean_remote_app_cache变量的值决定是否清空远程app的缓存数据
if [ "$clean_remote_app_cache" = true ]; then
    rm -rf "$repo_dir"
fi

if [ -n "$proxyUrl" ]; then
    proxy_off
fi

logs "1panel本地app同步成功,enjoy it!"
}

main "$@"

各个配置项的具体说明如下:

配置项必选使用说明
app_local_dir是1Panel本地app的目录(如果不是默认安装,需修改该目录)
git_repo_url是AppStore的git仓库地址,直接复制链接地址即可,脚本会自动补充链接需要的字段
git_access_token否访问git仓库的access token,访问私有仓库时用,优先级高于账密
git_username否访问git仓库的用户名,访问私有仓库时用
git_password否访问git仓库的密码,访问私有仓库时用;脚本已增加了对特殊字符的支持
git_branch否指定克隆的分支,不指定则使用仓库的默认分支
git_depth否指定克隆的深度,层级越多克隆越慢,建议默认即可
clean_local_app否拉取远程仓库前是否清空本地app目录,可以把不需要旧应用清除掉,保持跟线上的一致
如果要同步多个仓库的应用,则必须设定为flase,否则只会看到最/后一个的同步结果
clean_remote_app_cache否拉取远程仓库前是否清空远程app缓存,相当于重新clone远程app仓库
proxyUrl否设置克隆或拉取远程仓库时使用的代/里,一般来说国内克隆GitHub仓的时候用得到
work_dir是将远程app store工程克隆到本地的工作目录,用于临时存放克隆下来的文件和脚本工作日志
1Panel应用源
应用源地址说明
https://github.com/1Panel-dev/appstore1Panel官方应用商店
https://github.com/qwenode/1panel-appstore基于1Panel的又一个第三方应用商店
https://github.com/okxlin/appstore基于1Panel的第三方应用商店
https://gitee.com/svip520/1panel-appstore无名的1Panel应用商店

直接将上面的应用源地址粘贴到git_repo_url变量里即可使用

PS: 如需集成多个应用源到自己的系统里,只需新建多个定时任务,然后设定不同的git_repo_url变量即可,另外不同地址的应用源更新频率不一样,建议根据自己的需求来设定不同任务的执行周期。

exlse@foxmail.c 发表于 2024-3-4 10:57:20

6666666
页: [1]
查看完整版本: 1panel第三方应用库1panel-appstore