打败可道云!使用1Panel部署新一代WebOS(Win11风格)

搭建后的效果

桌面:


桌面右键菜单:
image
自带浏览器:

应用商店:

软件安装:

刚刚安装的应用展示:

安装这个可以在线编辑ppt、excel、word等:

性能方面,就服务器监控面板来看,单人使用没多少性能消耗

这些都是部署在雨云上面的

效果展示

(截图是从GitHub文档复制的,所以这些展示的图片是GitHub的链接,加载慢)

每次更新都会对效果作出调整,达到满意为止(你点一下这里查看官方演示 -_-)o )

登录

桌面

开始

设置

小工具

文件管理器

上传

新建

共享

文档编辑

图片编辑

在线音视频

休闲娱乐

应用商店

网盘模式

正文

由于某些原因,不得不拉取整个第三方库:
首先登录1Panel(以下简称1p)后台,点击计划任务-添加计划任务
雨云 支持预装1p了喔

频率改为每天一次

将同步代码复制到脚本内容中,并且根据个人实际情况修改,如果你的1p安装在默认目录下,那么无需修改,如果你安装在自定义目录下,需要修改app_local_dir的值,例如你的1p安装在"/server"目录下,那么这里需要修改为/server/1panel/resource/apps/local

完成后建议cd到这个目录看一下

image

确认无误后点击计划任务的“执行”,等待越2秒左右打开报告

此时,上面提到的目录中会多出一堆文件

之后在1p后台找到应用商店-更多-本地

点击“更新应用列表”即可

完整代码如下(由 https://blog.cnkj.site/archives/1696995023288 提供)

#!/bin/bash

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

# AppStore的git仓库地址(必选)
# git_repo_url="https://github.com/xxxily/local-appstore-for-1Panel"
# git_repo_url="https://github.com/1Panel-dev/appstore"
git_repo_url="https://github.com/okxlin/appstore"

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

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

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

# 拉取远程仓库前是否清空本地app目录(可选)
clean_local_app=false
# 拉取远程仓库前是否清空远程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/appstore"

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
    [a-zA-Z0-9.~_-]) 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: xxxily                                                #"
  logs "#  Github: https://github.com/xxxily/local-appstore-for-1Panel   #"
  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[1]}
    repo_projectname=${BASH_REMATCH[2]}
    # 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 "$@"

正文2

在成功拉去第三方库后,可以在后台-应用商店-其他-本地中找到WebOS

image

点击安装即可弹出配置页面:

避坑:版本必须选择latest,这是部署失败后我发现的,又或者是网络问题?

如果希望使用ip:port的形式访问,那么请勾选“端口外部访问”,若希望使用域名,则无需勾选,创建一个反向代理站点即可

这里以ip:port访问为例

等待其安装完成后,点击服务端口即可自动跳转

数据库配置中,若用于生产环境,请选择MySQL,自己搭建玩的随意

缓存配置中,若用于生产环境,,请选择Redis,自己搭建玩随意

修改管理员用户名和密码后,点击保存,稍等片刻即可自动登录至桌面

可以使用右键-全屏模式获得更好的体验

image

在这款WebOS中,浏览器是一个强大的存在

也有丰富的云盘支持(暂不支持ROS【minio】已提issue)

甚至可以把可道云挂载下来

遗憾的是,这里的S3桶是写死了亚马逊的Endpoint,如果你想,自行更改源码适配

image

不过,既然他支持了Alist,那么基本上所有网盘都能挂载了

甚至还支持文件同步协作:

设置相关

正如Win11,他的设置要在开始菜单中打开

如果你希望用他做网盘,可以切换至网盘模式:
image

这俩东西貌似是摆设:
image

如果对公提供服务,可以加广告:

但是需要开通高级功能:

好详细


这是什么啊

自动更新第三方仓库啊,use default clone就是clone默认分支

好像会显示失败

an?不会是因为连不上github吧?

美国机器