查看: 943|回复: 1

[工具分享] 1panel第三方应用库1panel-appstore

[复制链接]
累计签到:320 天
连续签到:9 天

926

主题

-17

回帖

1万

积分

热心会员

名望
126
星币
4532
星辰
9
好评
264
发表于 2024-2-27 15:16:00 | 显示全部楼层 |阅读模式

注册登录后全站资源免费查看下载

您需要 登录 才可以下载或查看,没有账号?立即注册

×
安装/使用方式
将 local_appstore_sync_helper.sh 放到 1panel 计划任务中,定时执行即可自动同步本仓库应用,默认无需修改脚本任何参数
特性
可一键更新同步1Panel官网的应用商店应用到本地环境
支持将任意第三方仓库的应用同步到1Panel的本地应用商店
支持github,gitlab,gitee等公开仓库、私有仓库
支持将多个分散的仓库应用同步到1Panel的本地应用商店
支持自定义拉取的分支、克隆深度、访问代/里等,方便灵活
同步脚本源码完全开源,可自行修改、扩展,可放心使用
使用场景
1Panel官方应用商店的应用更新慢,想要快速更新到本地进行使用
1Panel官方应用有BUG,或者版本太低,想要自己修改后使用
1Panel官方应用商店没有自己想要的应用,想要自己添加应用
由于某些原因没法上架到1Panel官方应用商店,定制自己的专属应用
用于快速调试开发1Panel应用,方便本地开发调试
想要将多个分散的仓库应用同步到1Panel的本地应用商店
效果演示
将1Panel appstore里最近更的应用一键同步到本地应用商店

使用教程
1. 使用1Panel创建计划任务

按上图方式创建计划任务。
然后将 local_appstore_sync_helper.sh 内容复制到脚本内容框中。
按需修改脚本中的配置项,具体的配置项说明见下文。
2. 执行同步脚本
点击执行按钮,可即可开始同步。

3. 查看同步脚本的执行情况
点击任务名称或【报告】按钮即可查看同步脚本的执行日志。

注意:目前1Panel的计划任务执行失败的话查看不了任何日志,这个时候去【主机】>【文件】然后进入:
/opt/1panel_hepler/logs
目录下查看同步脚本的执行日志即可。
4. 查看同步成功的本地应用
进入【应用商店】点击右上角的【更新应用列表】即可查看同步到的本地应用。

配置项详解
local_appstore_sync_helper.sh 里包含了一些配置项,可以根据自己的需求进行修改。
  1. #!/bin/bash
  2. # 直接执行或复制此脚本到 1Panel->计划任务中定时执行即可

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

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

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

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

  15. # 指定克隆的分支(可选)
  16. git_branch=""
  17. # 指定克隆的深度(可选)
  18. git_depth=1

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

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

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

  31. set -e

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

  36.   if [ -n "$log_file" ]; then
  37.     mkdir -p "$(dirname "$log_file")"
  38.     if [ $? -eq 0 ]; then
  39.       echo -e "[$(date +"%Y-%m-%d %H:%M:%S")] $message"
  40.       echo "[$(date +"%Y-%m-%d %H:%M:%S")] $message" >>"$log_file"
  41.       return
  42.     fi
  43.   fi

  44.   echo -e "$message"
  45. }

  46. # 函数: url_encode
  47. # 参数:
  48. #   - url: 需要进行编码的字符串
  49. # 返回值:
  50. #   经过URL编码后的字符串
  51. function url_encode() {
  52.   local string=$1
  53.   local length="${#string}"
  54.   local url_encoded_string=""
  55.   local c

  56.   for ((i = 0; i < length; i++)); do
  57.     c=${string:i:1}
  58.     case "$c" in
  59.     [a-zA-Z0-9.~_-]) url_encoded_string+=$c ;;
  60.     *) url_encoded_string+=$(printf '%%%02X' "'$c") ;;
  61.     esac
  62.   done

  63.   echo "$url_encoded_string"
  64. }

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

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

  75.   # 输出替换后的URL
  76.   echo $new_url
  77. }

  78. # 函数: clone_git_repo
  79. # 参数:
  80. #   - url: Git仓库URL
  81. #   - username: 账号(可选)
  82. #   - password: 密码(可选)
  83. #   - access_token: 访问令牌(可选)
  84. #   - branch: 克隆分支(可选)
  85. #   - depth: 克隆深度(可选,默认为0,即克隆整个仓库)
  86. function clone_git_repo() {
  87.   local url=$1
  88.   local username=$2
  89.   local password=$3
  90.   local access_token=$4
  91.   local branch=$5
  92.   local depth=$6

  93.   branch=${branch:+--branch $branch}
  94.   depth=${depth:+--depth $depth}

  95.   echo "branch: $branch, depth: $depth"

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

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

  106.     git clone "https://$encoded_username:$encoded_password@$fix_url" $branch $depth
  107.   else
  108.     echo "use default clone"
  109.     git clone "$url" $branch $depth
  110.   fi
  111. }

  112. # 取消代/里
  113. function proxy_off() {
  114.   unset http_proxy
  115.   unset https_proxy
  116.   unset ALL_PROXY
  117.   unset no_proxy
  118.   logs "Proxy Off"
  119. }

  120. # 开启代/里
  121. function proxy_on() {
  122.   proxy_url="http://127.0.0.1:7890"
  123.   match_str="://"

  124.   if [ -n "$1" ]; then
  125.     if [[ $1 =~ $match_str ]]; then
  126.       proxy_url=$1
  127.     else
  128.       logs "Incorrect proxy_url, use defualt proxy_url"
  129.       return
  130.     fi
  131.   fi

  132.   export http_proxy=$proxy_url
  133.   export https_proxy=$proxy_url
  134.   export ALL_PROXY=$proxy_url
  135.   export no_proxy="localhost,127.0.0.1,localaddress,.localdomain.com"
  136.   logs "Proxy On $proxy_url"
  137. }

  138. function scriptInfo() {
  139.   echo ""
  140.   logs "##################################################################"
  141.   logs "#    Name: local appstore sync helper for 1Panel                 #"
  142.   logs "# Version: v1.0.0                                                #"
  143.   logs "#  Author: nameless                                              #"
  144.   logs "#  Github: https://gitee.com/svip520/1panel-appstore             #"
  145.   logs "##################################################################"
  146.   echo ""
  147. }

  148. function main() {
  149.   scriptInfo

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

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

  158.   local repo_username=""
  159.   local repo_projectname=""

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

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

  171.   mkdir -p "$work_dir/temp"

  172.   local repo_user_dir="$work_dir/temp/$repo_username"
  173.   local repo_dir="$repo_user_dir/$repo_projectname"

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

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

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

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

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

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

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

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

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

  209.   pwd
  210.   ls -lah
  211.   du -sh

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

  216.   if [ -n "$proxyUrl" ]; then
  217.     proxy_off
  218.   fi

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

  221. 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变量即可,另外不同地址的应用源更新频率不一样,建议根据自己的需求来设定不同任务的执行周期。

默认签名:偏爱是我家,发展靠大家! 社区反馈邮箱Mail To:service@pai.al或paijishu@outlook.com
回复

使用道具 举报

累计签到:51 天
连续签到:1 天

1

主题

78

回帖

526

积分

星空

名望
40
星币
233
星辰
0
好评
0
发表于 2024-3-4 10:57:20 来自手机 | 显示全部楼层
6666666
默认签名:偏爱是我家,发展靠大家! 社区反馈邮箱Mail To:service@pai.al或paijishu@outlook.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|偏爱技术社区-偏爱技术吧-源码-科学刀-我爱辅助-娱乐网--教开服-游戏源码

偏爱技术社区-偏爱技术吧-源码-科学刀-我爱辅助-娱乐网-游戏源码

Powered by Discuz! X3.5

GMT+8, 2024-11-12 10:46 , Processed in 0.085127 second(s), 36 queries .

快速回复 返回顶部 返回列表