Compare commits
18 Commits
3068236ec2
...
main
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
a3e8267c15 | ||
|
|
23c702366e | ||
|
|
8afde061c1 | ||
|
|
83cb701d50 | ||
|
|
a6c0bb929f | ||
|
|
4e95736763 | ||
|
|
875a1e5b26 | ||
|
|
344edd86a7 | ||
|
|
2e263c753f | ||
|
|
c70e096c66 | ||
|
|
101d835a55 | ||
|
|
5d61c901df | ||
|
|
8aaa7ff167 | ||
|
|
c1bde3d82f | ||
|
|
2586156515 | ||
|
|
3d998a91b1 | ||
|
|
256f789a4e | ||
|
|
075e751ffb |
17
README.md
17
README.md
@@ -1,12 +1,15 @@
|
||||
# Histb Doc
|
||||
|
||||
```bash
|
||||
bash node-16-devsource.sh
|
||||
apt-get install -y nodejs git
|
||||
# 移除旧版
|
||||
apt-get remove -y nodejs
|
||||
|
||||
curl -sL https://dl.yarnpkg.com/debian/pubkey.gpg | gpg --dearmor | sudo tee /usr/share/keyrings/yarnkey.gpg >/dev/null
|
||||
echo "deb [signed-by=/usr/share/keyrings/yarnkey.gpg] https://dl.yarnpkg.com/debian stable main" | tee /etc/apt/sources.list.d/yarn.list
|
||||
apt-get update && apt-get install -y yarn
|
||||
# 添加 Node 20 源并安装
|
||||
curl -fsSL https://deb.nodesource.com/setup_20.x | bash -
|
||||
apt-get install -y nodejs
|
||||
|
||||
# 验证
|
||||
node -v # 应显示 v20.x.x
|
||||
|
||||
npm install
|
||||
npm run build
|
||||
@@ -15,4 +18,6 @@ npm run serve
|
||||
|
||||
```
|
||||
https://netlify.com/
|
||||
```
|
||||
```
|
||||
|
||||
### 注意,2026年升级到node20,模板升级到3.9.2
|
||||
|
||||
@@ -82,7 +82,7 @@ remotePort = 21590
|
||||
从上面的配置可以看出来,一旦你开通了 frpc 账号,别人就可以从扫描作者的 frps 服务器端口,进而入侵你的盒子。
|
||||
开通后,你的 22 端口就会通过 frps 的 21590 暴露在互联网上。
|
||||
所以:请务必更改你的后台密码为高强度密码!
|
||||
这个非常重要。修改密码教程看这里:[开始使用-密码修改](/docs/tutorial-extras/start#修改密码)
|
||||
这个非常重要。修改密码教程看这里:[开始使用-密码修改](/docs/tutorial-extras/start)
|
||||
:::
|
||||
|
||||
客户端远程登录示例:21590 端口是一个例子,请填写你的盒子实际分配的端口。
|
||||
@@ -202,7 +202,7 @@ systemctl restart frpc #重启服务
|
||||
|
||||
## 拓展 (机智的用法)
|
||||
|
||||
如果你使用的是 [宝塔专用固件](/baota.html),你就可以轻松搭建自己的站点。
|
||||
如果你使用的是 [宝塔专用固件],你就可以轻松搭建自己的站点。
|
||||
|
||||
第一步: `kaitong-frp` 获得穿透分配的域名;
|
||||
|
||||
|
||||
@@ -1,8 +1,9 @@
|
||||
// @ts-check
|
||||
// Note: type annotations allow type checking and IDEs autocompletion
|
||||
|
||||
const lightCodeTheme = require('prism-react-renderer/themes/github');
|
||||
const darkCodeTheme = require('prism-react-renderer/themes/dracula');
|
||||
const {themes: prismThemes} = require('prism-react-renderer');
|
||||
const lightCodeTheme = prismThemes.github;
|
||||
const darkCodeTheme = prismThemes.dracula;
|
||||
|
||||
/** @type {import('@docusaurus/types').Config} */
|
||||
const config = {
|
||||
@@ -11,9 +12,13 @@ const config = {
|
||||
url: 'https://doc.ecoo.top',
|
||||
baseUrl: '/',
|
||||
onBrokenLinks: 'throw',
|
||||
onBrokenMarkdownLinks: 'warn',
|
||||
// onBrokenMarkdownLinks: 'warn',
|
||||
favicon: 'img/favicon.ico',
|
||||
|
||||
markdown: {
|
||||
hooks: {
|
||||
onBrokenMarkdownLinks: 'warn',
|
||||
},
|
||||
},
|
||||
// GitHub pages deployment config.
|
||||
// If you aren't using GitHub pages, you don't need these.
|
||||
organizationName: 'teasiu', // Usually your GitHub org/user name.
|
||||
@@ -34,19 +39,12 @@ const config = {
|
||||
({
|
||||
docs: {
|
||||
sidebarPath: require.resolve('./sidebars.js'),
|
||||
// Please change this to your repo.
|
||||
// Remove this to remove the "edit this page" links.
|
||||
editUrl: ({ docPath }) => {
|
||||
return `https://holocron.so/github/pr/teasiu/doc/main/editor/docs/${docPath}`
|
||||
},
|
||||
editUrl: 'https://github.com/teasiu/doc/edit/main/',
|
||||
},
|
||||
blog: {
|
||||
showReadingTime: true,
|
||||
// Please change this to your repo.
|
||||
// Remove this to remove the "edit this page" links.
|
||||
editUrl: ({ docPath }) => {
|
||||
return `https://holocron.so/github/pr/teasiu/doc/main/editor/blog/${docPath}`
|
||||
},
|
||||
showReadingTime: true,
|
||||
onUntruncatedBlogPosts: 'ignore',
|
||||
editUrl: 'https://github.com/teasiu/doc/edit/main/',
|
||||
},
|
||||
theme: {
|
||||
customCss: require.resolve('./src/css/custom.css'),
|
||||
@@ -79,7 +77,7 @@ const config = {
|
||||
title: 'HiNas',
|
||||
logo: {
|
||||
alt: 'histb Logo',
|
||||
src: 'https://doc.ecoo.top/img/hinaslogo01.png',
|
||||
src: '/img/hinaslogo01.png',
|
||||
},
|
||||
items: [
|
||||
{
|
||||
|
||||
6
netlify.toml
Normal file
6
netlify.toml
Normal file
@@ -0,0 +1,6 @@
|
||||
[build]
|
||||
command = "npm run build"
|
||||
publish = "build"
|
||||
|
||||
[build.environment]
|
||||
NODE_VERSION = "20"
|
||||
@@ -1,365 +0,0 @@
|
||||
#!/bin/bash
|
||||
|
||||
# Discussion, issues and change requests at:
|
||||
# https://github.com/nodesource/distributions
|
||||
#
|
||||
# Script to install the NodeSource Node.js 16.x repo onto a
|
||||
# Debian or Ubuntu system.
|
||||
#
|
||||
# Run as root or insert `sudo -E` before `bash`:
|
||||
#
|
||||
# curl -sL https://deb.nodesource.com/setup_16.x | bash -
|
||||
# or
|
||||
# wget -qO- https://deb.nodesource.com/setup_16.x | bash -
|
||||
#
|
||||
# CONTRIBUTIONS TO THIS SCRIPT
|
||||
#
|
||||
# This script is built from a template in
|
||||
# https://github.com/nodesource/distributions/tree/master/deb/src
|
||||
# please don't submit pull requests against the built scripts.
|
||||
#
|
||||
|
||||
|
||||
export DEBIAN_FRONTEND=noninteractive
|
||||
SCRSUFFIX="_16.x"
|
||||
NODENAME="Node.js 16.x"
|
||||
NODEREPO="node_16.x"
|
||||
NODEPKG="nodejs"
|
||||
|
||||
print_status() {
|
||||
echo
|
||||
echo "## $1"
|
||||
echo
|
||||
}
|
||||
|
||||
if test -t 1; then # if terminal
|
||||
ncolors=$(which tput > /dev/null && tput colors) # supports color
|
||||
if test -n "$ncolors" && test $ncolors -ge 8; then
|
||||
termcols=$(tput cols)
|
||||
bold="$(tput bold)"
|
||||
underline="$(tput smul)"
|
||||
standout="$(tput smso)"
|
||||
normal="$(tput sgr0)"
|
||||
black="$(tput setaf 0)"
|
||||
red="$(tput setaf 1)"
|
||||
green="$(tput setaf 2)"
|
||||
yellow="$(tput setaf 3)"
|
||||
blue="$(tput setaf 4)"
|
||||
magenta="$(tput setaf 5)"
|
||||
cyan="$(tput setaf 6)"
|
||||
white="$(tput setaf 7)"
|
||||
fi
|
||||
fi
|
||||
|
||||
print_bold() {
|
||||
title="$1"
|
||||
text="$2"
|
||||
|
||||
echo
|
||||
echo "${red}================================================================================${normal}"
|
||||
echo "${red}================================================================================${normal}"
|
||||
echo
|
||||
echo -e " ${bold}${yellow}${title}${normal}"
|
||||
echo
|
||||
echo -en " ${text}"
|
||||
echo
|
||||
echo "${red}================================================================================${normal}"
|
||||
echo "${red}================================================================================${normal}"
|
||||
}
|
||||
|
||||
bail() {
|
||||
echo 'Error executing command, exiting'
|
||||
exit 1
|
||||
}
|
||||
|
||||
exec_cmd_nobail() {
|
||||
echo "+ $1"
|
||||
bash -c "$1"
|
||||
}
|
||||
|
||||
exec_cmd() {
|
||||
exec_cmd_nobail "$1" || bail
|
||||
}
|
||||
|
||||
node_deprecation_warning() {
|
||||
if [[ "X${NODENAME}" == "Xio.js 1.x" ||
|
||||
"X${NODENAME}" == "Xio.js 2.x" ||
|
||||
"X${NODENAME}" == "Xio.js 3.x" ||
|
||||
"X${NODENAME}" == "XNode.js 0.10" ||
|
||||
"X${NODENAME}" == "XNode.js 0.12" ||
|
||||
"X${NODENAME}" == "XNode.js 4.x LTS Argon" ||
|
||||
"X${NODENAME}" == "XNode.js 5.x" ||
|
||||
"X${NODENAME}" == "XNode.js 6.x LTS Boron" ||
|
||||
"X${NODENAME}" == "XNode.js 7.x" ||
|
||||
"X${NODENAME}" == "XNode.js 8.x LTS Carbon" ||
|
||||
"X${NODENAME}" == "XNode.js 9.x" ||
|
||||
"X${NODENAME}" == "XNode.js 10.x" ||
|
||||
"X${NODENAME}" == "XNode.js 11.x" ||
|
||||
"X${NODENAME}" == "XNode.js 12.x" ||
|
||||
"X${NODENAME}" == "XNode.js 13.x" ||
|
||||
"X${NODENAME}" == "XNode.js 15.x" ||
|
||||
"X${NODENAME}" == "XNode.js 17.x" ]]; then
|
||||
|
||||
print_bold \
|
||||
" DEPRECATION WARNING " "\
|
||||
${bold}${NODENAME} is no longer actively supported!${normal}
|
||||
|
||||
${bold}You will not receive security or critical stability updates${normal} for this version.
|
||||
|
||||
You should migrate to a supported version of Node.js as soon as possible.
|
||||
Use the installation script that corresponds to the version of Node.js you
|
||||
wish to install. e.g.
|
||||
|
||||
* ${green}https://deb.nodesource.com/setup_14.x — Node.js 14 LTS \"Fermium\"${normal} (recommended)
|
||||
* ${green}https://deb.nodesource.com/setup_16.x — Node.js 16 \"Gallium\"${normal}
|
||||
* ${green}https://deb.nodesource.com/setup_18.x — Node.js 18 \"Eighteen\"${normal} (current)
|
||||
|
||||
Please see ${bold}https://github.com/nodejs/Release${normal} for details about which
|
||||
version may be appropriate for you.
|
||||
|
||||
The ${bold}NodeSource${normal} Node.js distributions repository contains
|
||||
information both about supported versions of Node.js and supported Linux
|
||||
distributions. To learn more about usage, see the repository:
|
||||
${bold}https://github.com/nodesource/distributions${normal}
|
||||
"
|
||||
echo
|
||||
echo "Continuing in 20 seconds ..."
|
||||
echo
|
||||
sleep 20
|
||||
fi
|
||||
}
|
||||
|
||||
script_deprecation_warning() {
|
||||
if [ "X${SCRSUFFIX}" == "X" ]; then
|
||||
print_bold \
|
||||
" SCRIPT DEPRECATION WARNING " "\
|
||||
This script, located at ${bold}https://deb.nodesource.com/setup${normal}, used to
|
||||
install Node.js 0.10, is deprecated and will eventually be made inactive.
|
||||
|
||||
You should use the script that corresponds to the version of Node.js you
|
||||
wish to install. e.g.
|
||||
|
||||
* ${green}https://deb.nodesource.com/setup_14.x — Node.js 14 LTS \"Fermium\"${normal} (recommended)
|
||||
* ${green}https://deb.nodesource.com/setup_16.x — Node.js 16 \"Gallium\"${normal}
|
||||
* ${green}https://deb.nodesource.com/setup_18.x — Node.js 18 \"Eighteen\"${normal} (current)
|
||||
|
||||
Please see ${bold}https://github.com/nodejs/Release${normal} for details about which
|
||||
version may be appropriate for you.
|
||||
|
||||
The ${bold}NodeSource${normal} Node.js Linux distributions GitHub repository contains
|
||||
information about which versions of Node.js and which Linux distributions
|
||||
are supported and how to use the install scripts.
|
||||
${bold}https://github.com/nodesource/distributions${normal}
|
||||
"
|
||||
|
||||
echo
|
||||
echo "Continuing in 20 seconds (press Ctrl-C to abort) ..."
|
||||
echo
|
||||
sleep 20
|
||||
fi
|
||||
}
|
||||
|
||||
setup() {
|
||||
|
||||
script_deprecation_warning
|
||||
node_deprecation_warning
|
||||
|
||||
print_status "Installing the NodeSource ${NODENAME} repo..."
|
||||
|
||||
if $(uname -m | grep -Eq ^armv6); then
|
||||
print_status "You appear to be running on ARMv6 hardware. Unfortunately this is not currently supported by the NodeSource Linux distributions. Please use the 'linux-armv6l' binary tarballs available directly from nodejs.org for Node.js 4 and later."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
PRE_INSTALL_PKGS=""
|
||||
|
||||
# Check that HTTPS transport is available to APT
|
||||
# (Check snaked from: https://get.docker.io/ubuntu/)
|
||||
|
||||
if [ ! -e /usr/lib/apt/methods/https ]; then
|
||||
PRE_INSTALL_PKGS="${PRE_INSTALL_PKGS} apt-transport-https"
|
||||
fi
|
||||
|
||||
if [ ! -x /usr/bin/lsb_release ]; then
|
||||
PRE_INSTALL_PKGS="${PRE_INSTALL_PKGS} lsb-release"
|
||||
fi
|
||||
|
||||
if [ ! -x /usr/bin/curl ] && [ ! -x /usr/bin/wget ]; then
|
||||
PRE_INSTALL_PKGS="${PRE_INSTALL_PKGS} curl"
|
||||
fi
|
||||
|
||||
# Used by apt-key to add new keys
|
||||
|
||||
if [ ! -x /usr/bin/gpg ]; then
|
||||
PRE_INSTALL_PKGS="${PRE_INSTALL_PKGS} gnupg"
|
||||
fi
|
||||
|
||||
# Populating Cache
|
||||
print_status "Populating apt-get cache..."
|
||||
exec_cmd 'apt-get update'
|
||||
|
||||
if [ "X${PRE_INSTALL_PKGS}" != "X" ]; then
|
||||
print_status "Installing packages required for setup:${PRE_INSTALL_PKGS}..."
|
||||
# This next command needs to be redirected to /dev/null or the script will bork
|
||||
# in some environments
|
||||
exec_cmd "apt-get install -y${PRE_INSTALL_PKGS} > /dev/null 2>&1"
|
||||
fi
|
||||
|
||||
IS_PRERELEASE=$(lsb_release -d | grep 'Ubuntu .*development' >& /dev/null; echo $?)
|
||||
if [[ $IS_PRERELEASE -eq 0 ]]; then
|
||||
print_status "Your distribution, identified as \"$(lsb_release -d -s)\", is a pre-release version of Ubuntu. NodeSource does not maintain official support for Ubuntu versions until they are formally released. You can try using the manual installation instructions available at https://github.com/nodesource/distributions and use the latest supported Ubuntu version name as the distribution identifier, although this is not guaranteed to work."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
DISTRO=$(lsb_release -c -s)
|
||||
|
||||
check_alt() {
|
||||
if [ "X${DISTRO}" == "X${2}" ]; then
|
||||
echo
|
||||
echo "## You seem to be using ${1} version ${DISTRO}."
|
||||
echo "## This maps to ${3} \"${4}\"... Adjusting for you..."
|
||||
DISTRO="${4}"
|
||||
fi
|
||||
}
|
||||
|
||||
check_alt "Astra Linux" "orel" "Debian" "stretch"
|
||||
check_alt "BOSS" "anokha" "Debian" "wheezy"
|
||||
check_alt "BOSS" "anoop" "Debian" "jessie"
|
||||
check_alt "BOSS" "drishti" "Debian" "stretch"
|
||||
check_alt "BOSS" "unnati" "Debian" "buster"
|
||||
check_alt "BOSS" "urja" "Debian" "bullseye"
|
||||
check_alt "bunsenlabs" "bunsen-hydrogen" "Debian" "jessie"
|
||||
check_alt "bunsenlabs" "helium" "Debian" "stretch"
|
||||
check_alt "bunsenlabs" "lithium" "Debian" "buster"
|
||||
check_alt "Devuan" "jessie" "Debian" "jessie"
|
||||
check_alt "Devuan" "ascii" "Debian" "stretch"
|
||||
check_alt "Devuan" "beowulf" "Debian" "buster"
|
||||
check_alt "Devuan" "chimaera" "Debian" "bullseye"
|
||||
check_alt "Devuan" "ceres" "Debian" "sid"
|
||||
check_alt "Deepin" "panda" "Debian" "sid"
|
||||
check_alt "Deepin" "unstable" "Debian" "sid"
|
||||
check_alt "Deepin" "stable" "Debian" "buster"
|
||||
check_alt "Deepin" "apricot" "Debian" "buster"
|
||||
check_alt "elementaryOS" "luna" "Ubuntu" "precise"
|
||||
check_alt "elementaryOS" "freya" "Ubuntu" "trusty"
|
||||
check_alt "elementaryOS" "loki" "Ubuntu" "xenial"
|
||||
check_alt "elementaryOS" "juno" "Ubuntu" "bionic"
|
||||
check_alt "elementaryOS" "hera" "Ubuntu" "bionic"
|
||||
check_alt "elementaryOS" "odin" "Ubuntu" "focal"
|
||||
check_alt "elementaryOS" "jolnir" "Ubuntu" "focal"
|
||||
check_alt "Kali" "sana" "Debian" "jessie"
|
||||
check_alt "Kali" "kali-rolling" "Debian" "bullseye"
|
||||
check_alt "Linux Mint" "maya" "Ubuntu" "precise"
|
||||
check_alt "Linux Mint" "qiana" "Ubuntu" "trusty"
|
||||
check_alt "Linux Mint" "rafaela" "Ubuntu" "trusty"
|
||||
check_alt "Linux Mint" "rebecca" "Ubuntu" "trusty"
|
||||
check_alt "Linux Mint" "rosa" "Ubuntu" "trusty"
|
||||
check_alt "Linux Mint" "sarah" "Ubuntu" "xenial"
|
||||
check_alt "Linux Mint" "serena" "Ubuntu" "xenial"
|
||||
check_alt "Linux Mint" "sonya" "Ubuntu" "xenial"
|
||||
check_alt "Linux Mint" "sylvia" "Ubuntu" "xenial"
|
||||
check_alt "Linux Mint" "tara" "Ubuntu" "bionic"
|
||||
check_alt "Linux Mint" "tessa" "Ubuntu" "bionic"
|
||||
check_alt "Linux Mint" "tina" "Ubuntu" "bionic"
|
||||
check_alt "Linux Mint" "tricia" "Ubuntu" "bionic"
|
||||
check_alt "Linux Mint" "ulyana" "Ubuntu" "focal"
|
||||
check_alt "Linux Mint" "ulyssa" "Ubuntu" "focal"
|
||||
check_alt "Linux Mint" "uma" "Ubuntu" "focal"
|
||||
check_alt "Linux Mint" "una" "Ubuntu" "focal"
|
||||
check_alt "Linux Mint" "vanessa" "Ubuntu" "jammy"
|
||||
check_alt "Liquid Lemur" "lemur-3" "Debian" "stretch"
|
||||
check_alt "LMDE" "betsy" "Debian" "jessie"
|
||||
check_alt "LMDE" "cindy" "Debian" "stretch"
|
||||
check_alt "LMDE" "debbie" "Debian" "buster"
|
||||
check_alt "LMDE" "elsie" "Debian" "bullseye"
|
||||
check_alt "MX Linux 17" "Horizon" "Debian" "stretch"
|
||||
check_alt "MX Linux 18" "Continuum" "Debian" "stretch"
|
||||
check_alt "MX Linux 19" "patito feo" "Debian" "buster"
|
||||
check_alt "MX Linux 21" "wildflower" "Debian" "bullseye"
|
||||
check_alt "Pardus" "onyedi" "Debian" "stretch"
|
||||
check_alt "Parrot" "ara" "Debian" "bullseye"
|
||||
check_alt "PureOS" "green" "Debian" "sid"
|
||||
check_alt "PureOS" "amber" "Debian" "buster"
|
||||
check_alt "PureOS" "byzantium" "Debian" "bullseye"
|
||||
check_alt "SolydXK" "solydxk-9" "Debian" "stretch"
|
||||
check_alt "Sparky Linux" "Tyche" "Debian" "stretch"
|
||||
check_alt "Sparky Linux" "Nibiru" "Debian" "buster"
|
||||
check_alt "Sparky Linux" "Po-Tolo" "Debian" "bullseye"
|
||||
check_alt "Tanglu" "chromodoris" "Debian" "jessie"
|
||||
check_alt "Trisquel" "toutatis" "Ubuntu" "precise"
|
||||
check_alt "Trisquel" "belenos" "Ubuntu" "trusty"
|
||||
check_alt "Trisquel" "flidas" "Ubuntu" "xenial"
|
||||
check_alt "Trisquel" "etiona" "Ubuntu" "bionic"
|
||||
check_alt "Ubilinux" "dolcetto" "Debian" "stretch"
|
||||
check_alt "Uruk GNU/Linux" "lugalbanda" "Ubuntu" "xenial"
|
||||
|
||||
if [ "X${DISTRO}" == "Xdebian" ]; then
|
||||
print_status "Unknown Debian-based distribution, checking /etc/debian_version..."
|
||||
NEWDISTRO=$([ -e /etc/debian_version ] && cut -d/ -f1 < /etc/debian_version)
|
||||
if [ "X${NEWDISTRO}" == "X" ]; then
|
||||
print_status "Could not determine distribution from /etc/debian_version..."
|
||||
else
|
||||
DISTRO=$NEWDISTRO
|
||||
print_status "Found \"${DISTRO}\" in /etc/debian_version..."
|
||||
fi
|
||||
fi
|
||||
|
||||
print_status "Confirming \"${DISTRO}\" is supported..."
|
||||
|
||||
if [ -x /usr/bin/curl ]; then
|
||||
exec_cmd_nobail "curl -sLf -o /dev/null 'https://deb.nodesource.com/${NODEREPO}/dists/${DISTRO}/Release'"
|
||||
RC=$?
|
||||
else
|
||||
exec_cmd_nobail "wget -qO /dev/null -o /dev/null 'https://deb.nodesource.com/${NODEREPO}/dists/${DISTRO}/Release'"
|
||||
RC=$?
|
||||
fi
|
||||
|
||||
if [[ $RC != 0 ]]; then
|
||||
print_status "Your distribution, identified as \"${DISTRO}\", is not currently supported, please contact NodeSource at https://github.com/nodesource/distributions/issues if you think this is incorrect or would like your distribution to be considered for support"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if [ -f "/etc/apt/sources.list.d/chris-lea-node_js-$DISTRO.list" ]; then
|
||||
print_status 'Removing Launchpad PPA Repository for NodeJS...'
|
||||
|
||||
exec_cmd_nobail 'add-apt-repository -y -r ppa:chris-lea/node.js'
|
||||
exec_cmd "rm -f /etc/apt/sources.list.d/chris-lea-node_js-${DISTRO}.list"
|
||||
fi
|
||||
|
||||
print_status 'Adding the NodeSource signing key to your keyring...'
|
||||
keyring='/usr/share/keyrings'
|
||||
node_key_url="https://deb.nodesource.com/gpgkey/nodesource.gpg.key"
|
||||
local_node_key="$keyring/nodesource.gpg"
|
||||
|
||||
if [ -x /usr/bin/curl ]; then
|
||||
exec_cmd "curl -s $node_key_url | gpg --dearmor | tee $local_node_key >/dev/null"
|
||||
else
|
||||
exec_cmd "wget -q -O - $node_key_url | gpg --dearmor | tee $local_node_key >/dev/null"
|
||||
fi
|
||||
|
||||
print_status "Creating apt sources list file for the NodeSource ${NODENAME} repo..."
|
||||
|
||||
exec_cmd "echo 'deb [signed-by=$local_node_key] https://deb.nodesource.com/${NODEREPO} ${DISTRO} main' > /etc/apt/sources.list.d/nodesource.list"
|
||||
exec_cmd "echo 'deb-src [signed-by=$local_node_key] https://deb.nodesource.com/${NODEREPO} ${DISTRO} main' >> /etc/apt/sources.list.d/nodesource.list"
|
||||
|
||||
print_status 'Running `apt-get update` for you...'
|
||||
|
||||
exec_cmd 'apt-get update'
|
||||
|
||||
yarn_site='https://dl.yarnpkg.com/debian'
|
||||
yarn_key_url="$yarn_site/pubkey.gpg"
|
||||
local_yarn_key="$keyring/yarnkey.gpg"
|
||||
|
||||
print_status """Run \`${bold}sudo apt-get install -y ${NODEPKG}${normal}\` to install ${NODENAME} and npm
|
||||
## You may also need development tools to build native addons:
|
||||
sudo apt-get install gcc g++ make
|
||||
## To install the Yarn package manager, run:
|
||||
curl -sL $yarn_key_url | gpg --dearmor | sudo tee $local_yarn_key >/dev/null
|
||||
echo \"deb [signed-by=$local_yarn_key] $yarn_site stable main\" | sudo tee /etc/apt/sources.list.d/yarn.list
|
||||
sudo apt-get update && sudo apt-get install yarn
|
||||
"""
|
||||
|
||||
}
|
||||
|
||||
## Defer setup until we have the complete script
|
||||
setup
|
||||
22026
package-lock.json
generated
22026
package-lock.json
generated
File diff suppressed because it is too large
Load Diff
25
package.json
25
package.json
@@ -14,18 +14,21 @@
|
||||
"write-heading-ids": "docusaurus write-heading-ids"
|
||||
},
|
||||
"dependencies": {
|
||||
"@docusaurus/core": "^2.4.3",
|
||||
"@docusaurus/plugin-sitemap": "^2.4.3",
|
||||
"@docusaurus/preset-classic": "^2.4.3",
|
||||
"@easyops-cn/docusaurus-search-local": "^0.40.1",
|
||||
"@mdx-js/react": "^1.6.22",
|
||||
"clsx": "^1.2.1",
|
||||
"prism-react-renderer": "^1.3.5",
|
||||
"react": "^17.0.2",
|
||||
"react-dom": "^17.0.2"
|
||||
"@docusaurus/core": "3.9.2",
|
||||
"@docusaurus/plugin-sitemap": "3.9.2",
|
||||
"@docusaurus/preset-classic": "3.9.2",
|
||||
"@easyops-cn/docusaurus-search-local": "^0.52.3",
|
||||
"clsx": "^2.1.1",
|
||||
"prism-react-renderer": "^2.4.1",
|
||||
"react": "^18.3.1",
|
||||
"react-dom": "^18.3.1"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@docusaurus/module-type-aliases": "^2.4.3"
|
||||
"@docusaurus/module-type-aliases": "3.9.2",
|
||||
"@docusaurus/types": "3.9.2"
|
||||
},
|
||||
"overrides": {
|
||||
"webpack": "5.88.2"
|
||||
},
|
||||
"browserslist": {
|
||||
"production": [
|
||||
@@ -40,6 +43,6 @@
|
||||
]
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=16.14"
|
||||
"node": ">=18.0"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -6,95 +6,170 @@ import Layout from '@theme/Layout';
|
||||
import useBaseUrl from "@docusaurus/useBaseUrl";
|
||||
import HomepageFeatures from '@site/src/components/HomepageFeatures';
|
||||
import Amlogic from '@site/src/components/Amlogic';
|
||||
|
||||
import styles from './index.module.css';
|
||||
|
||||
const stats = [
|
||||
{ value: '~3W', label: '满载功耗' },
|
||||
{ value: '4核', label: 'ARM CPU' },
|
||||
{ value: '1.6GHz', label: '最高主频' },
|
||||
// { value: '一杯奶茶', label: '全年电费' },
|
||||
];
|
||||
|
||||
function HomepageHeader() {
|
||||
const {siteConfig} = useDocusaurusContext();
|
||||
const { siteConfig } = useDocusaurusContext();
|
||||
return (
|
||||
<header className={clsx('hero hero--primary', styles.heroBanner)}>
|
||||
<header className={styles.heroBanner}>
|
||||
<div className={styles.heroGrid} />
|
||||
<div className={styles.heroGlow} />
|
||||
<div className={styles.heroGlowRight} />
|
||||
<div className="container">
|
||||
<img src="https://doc.ecoo.top/img/hinas01.svg" alt="Logo" />
|
||||
<h1 className="hero__title">{siteConfig.title}</h1>
|
||||
<p className="hero__subtitle">{siteConfig.tagline}</p>
|
||||
<div className={styles.buttons}>
|
||||
<Link className="button button--secondary button--lg" style={{marginTop: "1rem", marginRight: ".5rem", marginLeft: ".5rem", display: "flex"}} to={useBaseUrl("docs/category/机顶盒刷机教程")}>保姆级刷机教程</Link>
|
||||
<Link className="button button--secondary button--lg" style={{marginTop: "1rem", marginRight: ".5rem", marginLeft: ".5rem", display: "flex"}} to="download">最新固件下载</Link>
|
||||
<Link className="button button--secondary button--lg" style={{marginTop: "1rem", marginRight: ".5rem", marginLeft: ".5rem", display: "flex"}} to={useBaseUrl("devices")}>设备支持适配表</Link>
|
||||
</div>
|
||||
<br></br>
|
||||
<div className={styles.buttons}>
|
||||
<Link
|
||||
className="button button--success button--lg" style={{marginTop: "1rem", marginRight: ".5rem", marginLeft: ".5rem", display: "flex"}}
|
||||
to={useBaseUrl("news")}>
|
||||
系统最新升级公告
|
||||
</Link>
|
||||
<Link
|
||||
className="button button--success button--lg" style={{marginTop: "1rem", marginRight: ".5rem", marginLeft: ".5rem", display: "flex"}}
|
||||
to={useBaseUrl("docs/intro")}>
|
||||
海纳思系统使用手册
|
||||
</Link>
|
||||
<div className={styles.heroContent}>
|
||||
<img
|
||||
src="/img/hinas01.svg"
|
||||
alt="HiNas Logo"
|
||||
className={styles.heroLogo}
|
||||
/>
|
||||
<h1 className={styles.heroTitle}>{siteConfig.title}</h1>
|
||||
<p className={styles.heroSubtitle}>{siteConfig.tagline}</p>
|
||||
|
||||
<div className={styles.statsRow}>
|
||||
{stats.map((s) => (
|
||||
<div key={s.label} className={styles.statItem}>
|
||||
<span className={styles.statValue}>{s.value}</span>
|
||||
<span className={styles.statLabel}>{s.label}</span>
|
||||
</div>
|
||||
))}
|
||||
</div>
|
||||
|
||||
<div className={styles.buttonGroup}>
|
||||
<Link className={clsx(styles.btn, styles.btnPrimary)} to={useBaseUrl('docs/category/机顶盒刷机教程')}>
|
||||
📖 保姆级刷机教程
|
||||
</Link>
|
||||
<Link className={clsx(styles.btn, styles.btnPrimary)} to="download">
|
||||
⬇️ 最新固件下载
|
||||
</Link>
|
||||
<Link className={clsx(styles.btn, styles.btnPrimary)} to={useBaseUrl('devices')}>
|
||||
📋 设备适配表
|
||||
</Link>
|
||||
</div>
|
||||
<div className={styles.buttonGroup}>
|
||||
<Link className={clsx(styles.btn, styles.btnSecondary)} to={useBaseUrl('news')}>
|
||||
📣 系统升级公告
|
||||
</Link>
|
||||
<Link className={clsx(styles.btn, styles.btnSecondary)} to={useBaseUrl('docs/intro')}>
|
||||
📚 海纳思使用手册
|
||||
</Link>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div className={styles.heroWave}>
|
||||
<svg viewBox="0 0 1440 80" preserveAspectRatio="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M0,40 C360,80 1080,0 1440,40 L1440,80 L0,80 Z" fill="var(--ifm-background-color)" />
|
||||
</svg>
|
||||
</div>
|
||||
</header>
|
||||
);
|
||||
}
|
||||
|
||||
function PolicyPersistence() {
|
||||
const {siteConfig} = useDocusaurusContext();
|
||||
function SectionPersistence() {
|
||||
return (
|
||||
<div className={styles.policypersistence}>
|
||||
<div className="container text--center">
|
||||
<div className="row">
|
||||
<div className="col" style={{marginBlock: "auto"}}>
|
||||
<h2>开源,免费,易用的家用 Linux 服务器系统</h2>
|
||||
<p>
|
||||
海纳思系统,一个基于开源 Linux Ubuntu 20.04 LTS 打造的 NAS 系统,<br />
|
||||
开发者精心打造,已开发和内置丰富的程序和功能,内网穿透,网盘共享,<br />
|
||||
远程下载,Docker安装,个人博客,网络建站,socks5服务,ftp上传下载,<br />
|
||||
webdav接口,终端控制,一键还原,计划任务等等。<br />
|
||||
<section className={styles.section}>
|
||||
<div className="container">
|
||||
<div className={styles.sectionInner}>
|
||||
<div className={styles.sectionText}>
|
||||
<span className={styles.sectionBadge}>✦ 开源 · 免费 · 易用</span>
|
||||
<h2 className={styles.sectionTitle}>家用 Linux 服务器系统</h2>
|
||||
<p className={styles.sectionDesc}>
|
||||
海纳思系统,基于 Ubuntu 20.04 LTS 打造的 NAS 系统,开发者精心内置丰富功能:
|
||||
</p>
|
||||
<div className={styles.tagCloud}>
|
||||
{['内网穿透','网盘共享','远程下载','Docker','个人博客','网络建站','Socks5','FTP','WebDAV','终端控制','一键还原','计划任务'].map(tag => (
|
||||
<span key={tag} className={styles.tag}>{tag}</span>
|
||||
))}
|
||||
</div>
|
||||
</div>
|
||||
<div style={{marginInline: "auto"}}>
|
||||
<img src="img/about.png" alt="Policy Persistence" width="400" height="466" />
|
||||
<div className={styles.sectionImageWrap}>
|
||||
<div className={styles.imageGlow} />
|
||||
<img src="img/about.png" alt="系统功能概览" className={styles.sectionImg} width="400" height="466" />
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
);
|
||||
}
|
||||
|
||||
function PolicyEnforcement() {
|
||||
const {siteConfig} = useDocusaurusContext();
|
||||
function SectionEnforcement() {
|
||||
return (
|
||||
<div className={styles.policyenforcement}>
|
||||
<div className="container text--center">
|
||||
<div className="row">
|
||||
<div style={{marginInline: "auto"}}>
|
||||
<img height="250" width="400" src="img/huawei.png" alt="homepage" />
|
||||
<section className={clsx(styles.section, styles.sectionAlt)}>
|
||||
<div className="container">
|
||||
<div className={clsx(styles.sectionInner, styles.sectionReverse)}>
|
||||
<div className={styles.sectionImageWrap}>
|
||||
<div className={styles.imageGlow} />
|
||||
<img src="img/huawei.png" alt="海思机顶盒" className={styles.sectionImg} height="250" width="400" />
|
||||
</div>
|
||||
<div className="col" style={{marginBlock: "auto"}}>
|
||||
<h2>将千家万户的机顶盒打造成一台超低功耗的 Linux 服务器</h2>
|
||||
<p>实测功耗约 3 瓦,全年无休≈18元/年,一杯奶茶钱,养活它一年。<br />
|
||||
盒子4核心CPU,内核频率达1.4GHz-1.6GHz,流畅运行各项 NAS 程序。<br />
|
||||
作为家用存储,Linux 学习,学生技术孵化,网络下载,组网跳板,均可。<br />
|
||||
网页建站,内网穿越,公网映射,科学上网,跑脚本,定时任务等,更佳。<br />
|
||||
我是小盒子,也是大世界!千家万户都有一个机顶盒,开启您的探索之旅!</p>
|
||||
<div className={styles.sectionText}>
|
||||
<span className={styles.sectionBadge}>✦ 变废为宝</span>
|
||||
<h2 className={styles.sectionTitle}>将机顶盒变成超低功耗服务器</h2>
|
||||
<p className={styles.sectionDesc}>
|
||||
实测功耗约 3 瓦,全年无休电费 ≈18 元/年,一杯奶茶钱养活它一年。
|
||||
盒子 4 核 CPU,主频达 1.4~1.6GHz,流畅运行各类 NAS 程序。
|
||||
</p>
|
||||
<ul className={styles.featureList}>
|
||||
<li>家用存储 / Linux 学习 / 学生技术孵化</li>
|
||||
<li>网页建站 / 内网穿透 / 公网映射</li>
|
||||
<li>科学上网 / 跑脚本 / 定时任务</li>
|
||||
</ul>
|
||||
<blockquote className={styles.sectionQuote}>
|
||||
"我是小盒子,也是大世界!千家万户都有一个机顶盒,开启您的探索之旅!"
|
||||
</blockquote>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
);
|
||||
}
|
||||
|
||||
function OpenCollective() {
|
||||
return (
|
||||
<iframe title="Sponsors" src="juanzhu.html" style={{width: "100%", height: "900px", display: "block"}}></iframe>
|
||||
);
|
||||
return (
|
||||
<section className={styles.donateSection}>
|
||||
<div className="container">
|
||||
<div className={styles.donateTitleWrap}>
|
||||
<h2 className={styles.donateTitle}>捐助作者,持续开发</h2>
|
||||
<p className={styles.donateSubtitle}>您的支持是项目持续进步的动力</p>
|
||||
</div>
|
||||
<div className={styles.donateRow}>
|
||||
<div className={clsx(styles.donateCard, styles.donateCardBlue)}>
|
||||
<div className={styles.donateCardAccent} />
|
||||
<div className={styles.donateQrWrap}>
|
||||
<img src="img/danote.png" alt="作者赞赏码" className={styles.donateQr} />
|
||||
</div>
|
||||
<div className={styles.donateCardBody}>
|
||||
<h3 className={styles.donateCardTitle}>作者赞赏码</h3>
|
||||
<p className={styles.donateCaption}>
|
||||
作者"神雕"开发的固件和提供的个人网站,为了持续维护和进步,呼吁有能力的网友支持本站持续运作和固件持续开发更新。不胜感激! 您的捐助将用于本站的服务器架设和固件升级维护。
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
<div className={clsx(styles.donateCard, styles.donateCardCyan)}>
|
||||
<div className={styles.donateCardAccent} />
|
||||
<div className={styles.donateQrWrap}>
|
||||
<img src="img/alipay.png" alt="支付宝" className={styles.donateQr} />
|
||||
</div>
|
||||
<div className={styles.donateCardBody}>
|
||||
<h3 className={styles.donateCardTitle}>支付宝 / 远程协助</h3>
|
||||
<p className={styles.donateCaption}>
|
||||
可以抽出时间为小白网友提供付费远程协助,包括刷机、运维、疑难解决等需求。已组建微信群,加微信注明入群将定期邀请加入。
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
);
|
||||
}
|
||||
|
||||
export default function Home() {
|
||||
const {siteConfig} = useDocusaurusContext();
|
||||
const { siteConfig } = useDocusaurusContext();
|
||||
return (
|
||||
<Layout
|
||||
title={`e酷网 ${siteConfig.title}`}
|
||||
@@ -103,8 +178,8 @@ export default function Home() {
|
||||
<main>
|
||||
<HomepageFeatures />
|
||||
<Amlogic />
|
||||
<PolicyPersistence />
|
||||
<PolicyEnforcement />
|
||||
<SectionPersistence />
|
||||
<SectionEnforcement />
|
||||
<OpenCollective />
|
||||
</main>
|
||||
</Layout>
|
||||
|
||||
@@ -1,40 +1,485 @@
|
||||
/**
|
||||
* CSS files with the .module.css suffix will be treated as CSS modules
|
||||
* and scoped locally.
|
||||
*/
|
||||
|
||||
/* ===== Hero ===== */
|
||||
.heroBanner {
|
||||
padding: 4rem 0;
|
||||
text-align: center;
|
||||
position: relative;
|
||||
overflow: hidden;
|
||||
padding: 5rem 0 6rem;
|
||||
text-align: center;
|
||||
background: linear-gradient(160deg, #071525 0%, #0d2137 45%, #071525 100%);
|
||||
color: #fff;
|
||||
}
|
||||
|
||||
@media screen and (max-width: 996px) {
|
||||
.heroBanner {
|
||||
padding: 2rem;
|
||||
.heroGrid {
|
||||
position: absolute;
|
||||
inset: 0;
|
||||
background-image:
|
||||
linear-gradient(rgba(6, 182, 212, 0.07) 1px, transparent 1px),
|
||||
linear-gradient(90deg, rgba(6, 182, 212, 0.07) 1px, transparent 1px);
|
||||
background-size: 48px 48px;
|
||||
pointer-events: none;
|
||||
}
|
||||
|
||||
.heroGlow {
|
||||
position: absolute;
|
||||
top: -200px;
|
||||
left: 30%;
|
||||
width: 600px;
|
||||
height: 600px;
|
||||
background: radial-gradient(circle, rgba(6, 182, 212, 0.16) 0%, transparent 65%);
|
||||
pointer-events: none;
|
||||
}
|
||||
|
||||
.heroGlowRight {
|
||||
position: absolute;
|
||||
bottom: -150px;
|
||||
right: 20%;
|
||||
width: 400px;
|
||||
height: 400px;
|
||||
background: radial-gradient(circle, rgba(56, 189, 248, 0.1) 0%, transparent 65%);
|
||||
pointer-events: none;
|
||||
}
|
||||
|
||||
.heroContent {
|
||||
position: relative;
|
||||
z-index: 1;
|
||||
}
|
||||
|
||||
.heroLogo {
|
||||
height: 120px;
|
||||
margin-bottom: 1.5rem;
|
||||
filter: drop-shadow(0 0 32px rgba(6, 182, 212, 0.5));
|
||||
animation: floatLogo 4s ease-in-out infinite;
|
||||
}
|
||||
|
||||
@keyframes floatLogo {
|
||||
0%, 100% { transform: translateY(0); }
|
||||
50% { transform: translateY(-8px); }
|
||||
}
|
||||
|
||||
.heroTitle {
|
||||
font-size: 3rem;
|
||||
font-weight: 700;
|
||||
margin-bottom: 0.75rem;
|
||||
background: linear-gradient(90deg, #38bdf8, #06b6d4, #67e8f9);
|
||||
-webkit-background-clip: text;
|
||||
-webkit-text-fill-color: transparent;
|
||||
background-clip: text;
|
||||
}
|
||||
|
||||
.heroSubtitle {
|
||||
font-size: 1.15rem;
|
||||
color: rgba(255, 255, 255, 0.6);
|
||||
margin-bottom: 2.5rem;
|
||||
letter-spacing: 0.05em;
|
||||
}
|
||||
|
||||
/* Wave bottom of hero */
|
||||
.heroWave {
|
||||
position: absolute;
|
||||
bottom: 0;
|
||||
left: 0;
|
||||
width: 100%;
|
||||
line-height: 0;
|
||||
}
|
||||
|
||||
.heroWave svg {
|
||||
display: block;
|
||||
width: 100%;
|
||||
height: 80px;
|
||||
}
|
||||
|
||||
/* ===== Stats ===== */
|
||||
.statsRow {
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
flex-wrap: wrap;
|
||||
gap: 1rem;
|
||||
margin-bottom: 2.5rem;
|
||||
}
|
||||
|
||||
.statItem {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
align-items: center;
|
||||
padding: 0.75rem 1.5rem;
|
||||
border: 1px solid rgba(6, 182, 212, 0.2);
|
||||
border-radius: 12px;
|
||||
background: rgba(6, 182, 212, 0.07);
|
||||
min-width: 90px;
|
||||
transition: all 0.25s ease;
|
||||
}
|
||||
|
||||
.statItem:hover {
|
||||
border-color: rgba(6, 182, 212, 0.55);
|
||||
background: rgba(6, 182, 212, 0.12);
|
||||
transform: translateY(-3px);
|
||||
}
|
||||
|
||||
.statValue {
|
||||
font-size: 1.5rem;
|
||||
font-weight: 700;
|
||||
color: #38bdf8;
|
||||
line-height: 1.2;
|
||||
}
|
||||
|
||||
.statLabel {
|
||||
font-size: 0.78rem;
|
||||
color: rgba(255, 255, 255, 0.5);
|
||||
margin-top: 0.25rem;
|
||||
}
|
||||
|
||||
/* ===== Buttons ===== */
|
||||
.buttonGroup {
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
flex-wrap: wrap;
|
||||
gap: 0.75rem;
|
||||
margin-bottom: 0.75rem;
|
||||
}
|
||||
|
||||
.btn {
|
||||
display: inline-flex;
|
||||
align-items: center;
|
||||
gap: 0.35rem;
|
||||
padding: 0.6rem 1.4rem;
|
||||
border-radius: 8px;
|
||||
font-size: 0.95rem;
|
||||
font-weight: 500;
|
||||
text-decoration: none !important;
|
||||
transition: all 0.22s ease;
|
||||
white-space: nowrap;
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
.btnPrimary {
|
||||
background: #0891b2;
|
||||
color: #fff !important;
|
||||
border: 1px solid transparent;
|
||||
}
|
||||
|
||||
.btnPrimary:hover {
|
||||
background: #0e7490;
|
||||
transform: translateY(-2px);
|
||||
box-shadow: 0 8px 24px rgba(6, 182, 212, 0.38);
|
||||
color: #fff !important;
|
||||
}
|
||||
|
||||
.btnSecondary {
|
||||
background: rgba(255,255,255,0.05);
|
||||
color: #7dd3fc !important;
|
||||
border: 1px solid rgba(6, 182, 212, 0.32);
|
||||
}
|
||||
|
||||
.btnSecondary:hover {
|
||||
background: rgba(6, 182, 212, 0.12);
|
||||
border-color: #06b6d4;
|
||||
color: #bae6fd !important;
|
||||
transform: translateY(-2px);
|
||||
}
|
||||
|
||||
/* ===== Sections ===== */
|
||||
.section {
|
||||
padding: 5rem 0;
|
||||
}
|
||||
|
||||
.sectionAlt {
|
||||
background: var(--ifm-color-emphasis-100);
|
||||
}
|
||||
|
||||
.sectionInner {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 4rem;
|
||||
}
|
||||
|
||||
.sectionReverse {
|
||||
flex-direction: row-reverse;
|
||||
}
|
||||
|
||||
.sectionText {
|
||||
flex: 1;
|
||||
}
|
||||
|
||||
.sectionImageWrap {
|
||||
flex: 1;
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
position: relative;
|
||||
}
|
||||
|
||||
.imageGlow {
|
||||
position: absolute;
|
||||
inset: -20px;
|
||||
background: radial-gradient(ellipse at center, rgba(6, 182, 212, 0.12) 0%, transparent 70%);
|
||||
border-radius: 24px;
|
||||
pointer-events: none;
|
||||
}
|
||||
|
||||
.sectionImg {
|
||||
max-width: 100%;
|
||||
border-radius: 16px;
|
||||
box-shadow: 0 16px 48px rgba(0, 0, 0, 0.14);
|
||||
transition: transform 0.35s ease, box-shadow 0.35s ease;
|
||||
position: relative;
|
||||
z-index: 1;
|
||||
}
|
||||
|
||||
.sectionImg:hover {
|
||||
transform: translateY(-6px) scale(1.01);
|
||||
box-shadow: 0 24px 60px rgba(0, 0, 0, 0.2);
|
||||
}
|
||||
|
||||
.sectionBadge {
|
||||
display: inline-block;
|
||||
padding: 0.3rem 1rem;
|
||||
background: rgba(8, 145, 178, 0.1);
|
||||
color: #0891b2;
|
||||
border: 1px solid rgba(6, 182, 212, 0.25);
|
||||
border-radius: 100px;
|
||||
font-size: 0.8rem;
|
||||
font-weight: 600;
|
||||
margin-bottom: 1rem;
|
||||
letter-spacing: 0.04em;
|
||||
}
|
||||
|
||||
:global([data-theme='dark']) .sectionBadge {
|
||||
background: rgba(6, 182, 212, 0.12);
|
||||
color: #38bdf8;
|
||||
border-color: rgba(6, 182, 212, 0.28);
|
||||
}
|
||||
|
||||
.sectionTitle {
|
||||
font-size: 1.9rem;
|
||||
font-weight: 700;
|
||||
margin-bottom: 1rem;
|
||||
line-height: 1.35;
|
||||
}
|
||||
|
||||
.sectionDesc {
|
||||
color: var(--ifm-color-emphasis-700);
|
||||
line-height: 1.85;
|
||||
font-size: 1rem;
|
||||
margin-bottom: 1rem;
|
||||
}
|
||||
|
||||
/* Tag cloud */
|
||||
.tagCloud {
|
||||
display: flex;
|
||||
flex-wrap: wrap;
|
||||
gap: 0.5rem;
|
||||
margin-top: 1rem;
|
||||
}
|
||||
|
||||
.tag {
|
||||
display: inline-block;
|
||||
padding: 0.25rem 0.75rem;
|
||||
background: var(--ifm-color-emphasis-100);
|
||||
border: 1px solid var(--ifm-color-emphasis-300);
|
||||
border-radius: 6px;
|
||||
font-size: 0.82rem;
|
||||
color: var(--ifm-color-emphasis-700);
|
||||
transition: all 0.2s;
|
||||
}
|
||||
|
||||
.tag:hover {
|
||||
border-color: #06b6d4;
|
||||
color: #0891b2;
|
||||
background: rgba(6, 182, 212, 0.06);
|
||||
}
|
||||
|
||||
:global([data-theme='dark']) .tag:hover {
|
||||
color: #38bdf8;
|
||||
}
|
||||
|
||||
/* Feature list */
|
||||
.featureList {
|
||||
list-style: none;
|
||||
padding: 0;
|
||||
margin-top: 1.25rem;
|
||||
margin-bottom: 1.5rem;
|
||||
}
|
||||
|
||||
.featureList li {
|
||||
padding: 0.45rem 0 0.45rem 1.5rem;
|
||||
position: relative;
|
||||
color: var(--ifm-color-emphasis-700);
|
||||
font-size: 0.95rem;
|
||||
border-bottom: 1px solid var(--ifm-color-emphasis-200);
|
||||
}
|
||||
|
||||
.featureList li:last-child {
|
||||
border-bottom: none;
|
||||
}
|
||||
|
||||
.featureList li::before {
|
||||
content: '▸';
|
||||
position: absolute;
|
||||
left: 0;
|
||||
color: #06b6d4;
|
||||
font-size: 0.9rem;
|
||||
}
|
||||
|
||||
/* Quote */
|
||||
.sectionQuote {
|
||||
margin: 0;
|
||||
padding: 1rem 1.25rem;
|
||||
border-left: 3px solid #06b6d4;
|
||||
background: rgba(6, 182, 212, 0.05);
|
||||
border-radius: 0 8px 8px 0;
|
||||
font-style: italic;
|
||||
color: var(--ifm-color-emphasis-600);
|
||||
font-size: 0.92rem;
|
||||
line-height: 1.7;
|
||||
}
|
||||
|
||||
:global([data-theme='dark']) .sectionQuote {
|
||||
background: rgba(6, 182, 212, 0.08);
|
||||
}
|
||||
|
||||
/* ===== Donate Section ===== */
|
||||
.donateSection {
|
||||
padding: 5rem 0;
|
||||
background: linear-gradient(180deg, var(--ifm-color-emphasis-100) 0%, var(--ifm-background-color) 100%);
|
||||
}
|
||||
|
||||
.donateTitleWrap {
|
||||
text-align: center;
|
||||
margin-bottom: 2.5rem;
|
||||
}
|
||||
|
||||
.donateTitle {
|
||||
font-size: 1.75rem;
|
||||
font-weight: 700;
|
||||
margin-bottom: 0.5rem;
|
||||
}
|
||||
|
||||
.donateSubtitle {
|
||||
color: var(--ifm-color-emphasis-600);
|
||||
font-size: 0.95rem;
|
||||
margin: 0;
|
||||
}
|
||||
|
||||
.donateRow {
|
||||
display: flex;
|
||||
flex-wrap: wrap;
|
||||
justify-content: center;
|
||||
gap: 2rem;
|
||||
}
|
||||
|
||||
.donateCard {
|
||||
flex: 1;
|
||||
max-width: 320px;
|
||||
min-width: 260px;
|
||||
background: var(--ifm-background-color);
|
||||
border-radius: 16px;
|
||||
border: 1px solid var(--ifm-color-emphasis-200);
|
||||
overflow: hidden;
|
||||
box-shadow: 0 4px 24px rgba(0, 0, 0, 0.07);
|
||||
transition: transform 0.3s ease, box-shadow 0.3s ease;
|
||||
}
|
||||
|
||||
.donateCard:hover {
|
||||
transform: translateY(-8px);
|
||||
box-shadow: 0 16px 48px rgba(0, 0, 0, 0.13);
|
||||
}
|
||||
|
||||
.donateCardAccent {
|
||||
height: 4px;
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
.donateCardBlue .donateCardAccent {
|
||||
background: linear-gradient(90deg, #0ea5e9, #38bdf8);
|
||||
}
|
||||
|
||||
.donateCardCyan .donateCardAccent {
|
||||
background: linear-gradient(90deg, #06b6d4, #22d3ee);
|
||||
}
|
||||
|
||||
.donateQrWrap {
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
padding: 1.5rem 1.5rem 1rem;
|
||||
background: var(--ifm-color-emphasis-100);
|
||||
}
|
||||
|
||||
.donateQr {
|
||||
width: 160px;
|
||||
height: 160px;
|
||||
object-fit: contain;
|
||||
border-radius: 12px;
|
||||
box-shadow: 0 4px 16px rgba(0,0,0,0.1);
|
||||
}
|
||||
|
||||
.donateCardBody {
|
||||
padding: 1.25rem 1.5rem 1.5rem;
|
||||
}
|
||||
|
||||
.donateCardTitle {
|
||||
font-size: 1rem;
|
||||
font-weight: 700;
|
||||
margin-bottom: 0.75rem;
|
||||
color: var(--ifm-color-emphasis-900);
|
||||
}
|
||||
|
||||
.donateCaption {
|
||||
font-size: 0.875rem;
|
||||
color: var(--ifm-color-emphasis-600);
|
||||
line-height: 1.75;
|
||||
margin: 0;
|
||||
}
|
||||
|
||||
/* ===== Responsive ===== */
|
||||
@media (max-width: 996px) {
|
||||
.sectionInner,
|
||||
.sectionReverse {
|
||||
flex-direction: column !important;
|
||||
gap: 2.5rem;
|
||||
}
|
||||
|
||||
.sectionImageWrap {
|
||||
width: 100%;
|
||||
}
|
||||
}
|
||||
|
||||
.buttons {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
flex-wrap: wrap;
|
||||
margin-top: 5px;
|
||||
}
|
||||
@media (max-width: 768px) {
|
||||
.heroBanner {
|
||||
padding: 3.5rem 0 5rem;
|
||||
}
|
||||
|
||||
.policypersistence {
|
||||
padding: 60px 0;
|
||||
font-size: 1.3rem;
|
||||
justify-content: center;
|
||||
line-height: 40px;
|
||||
background-color: var(--ifm-color-emphasis-100);
|
||||
}
|
||||
.heroTitle {
|
||||
font-size: 2.2rem;
|
||||
}
|
||||
|
||||
.policyenforcement {
|
||||
padding: 60px 0;
|
||||
font-size: 1.3rem;
|
||||
justify-content: center;
|
||||
line-height: 40px;
|
||||
}
|
||||
.heroLogo {
|
||||
height: 90px;
|
||||
}
|
||||
|
||||
.heroSubtitle {
|
||||
font-size: 1rem;
|
||||
}
|
||||
|
||||
.statsRow {
|
||||
gap: 0.75rem;
|
||||
}
|
||||
|
||||
.statItem {
|
||||
padding: 0.6rem 1rem;
|
||||
min-width: 76px;
|
||||
}
|
||||
|
||||
.statValue {
|
||||
font-size: 1.25rem;
|
||||
}
|
||||
|
||||
.sectionTitle {
|
||||
font-size: 1.5rem;
|
||||
}
|
||||
|
||||
.section {
|
||||
padding: 3rem 0;
|
||||
}
|
||||
|
||||
.donateSection {
|
||||
padding: 3rem 0;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,7 +1,5 @@
|
||||
#!/bin/bash
|
||||
|
||||
dlfile="mv100-99.flash.gz"
|
||||
|
||||
echo "
|
||||
+----------------------------------------------------------------------
|
||||
| 海纳思系统hi3798mv100升级系统专用脚本温馨提示:
|
||||
@@ -19,47 +17,86 @@ read -p "继续执行?[y/n]: " result
|
||||
temp_file=$(mktemp)
|
||||
curl -sSL https://hi.ecoo.top/mirror-utils.sh > $temp_file
|
||||
if [ ! -f /etc/public-download.sh ] || [ "$(cat $temp_file|md5sum|awk '{print $1}')" != "$(cat /etc/public-download.sh|md5sum|awk '{print $1}')" ]; then
|
||||
cp $temp_file /etc/public-download.sh
|
||||
cp $temp_file /etc/public-download.sh
|
||||
fi
|
||||
rm -f $temp_file
|
||||
source /etc/public-download.sh
|
||||
|
||||
if [ $(whoami) != "root" ];then
|
||||
_exit 1 "请使用root权限切换用户!"
|
||||
if [ $(whoami) != "root" ]; then
|
||||
_exit 1 "请使用root权限切换用户!"
|
||||
fi
|
||||
|
||||
model=$(cpuid)
|
||||
platform=hi3798mv100
|
||||
|
||||
if [ "$(echo ${model})" != "$platform" ];then
|
||||
_exit 1 "本升级程序仅支持${platform}机型!"
|
||||
if [ "$(echo ${model})" != "$platform" ]; then
|
||||
_exit 1 "本升级程序仅支持${platform}机型!"
|
||||
fi
|
||||
|
||||
promode=$(uname -r|cut -c 13-)
|
||||
if [ $promode = 16010066 ];then
|
||||
_exit 1 "专业版用户请使用vipupgrade命令进行升级!"
|
||||
if [ $promode = 16010066 ]; then
|
||||
_exit 1 "专业版用户请使用vipupgrade命令进行升级!"
|
||||
fi
|
||||
|
||||
space_left=$(df -hT|grep /dev/root|awk '{print $4}')
|
||||
if [ "$(expr $(echo ${space_left%%G}) \> 1)" != 1 ];then
|
||||
_exit 1 "请确保剩余空间大于1G!"
|
||||
# ---------------------------------------------------------------
|
||||
# 检测 /tmp 剩余空间,不足 400M 时尝试扩容或清理
|
||||
# ---------------------------------------------------------------
|
||||
printStr yellow "检测 /tmp 可用空间..."
|
||||
TMP_AVAIL=$(df -T | grep '/tmp' | awk '{print int($5)}') # 单位:KB
|
||||
|
||||
if [ "${TMP_AVAIL}" -lt 409600 ]; then # 409600 KB = 400M
|
||||
printStr yellow "/tmp 剩余空间不足 400M(当前 ${TMP_AVAIL} KB),尝试 remount 扩容..."
|
||||
|
||||
mount -o remount,size=500M /tmp 2>/dev/null
|
||||
if [ $? -eq 0 ]; then
|
||||
printStr green "/tmp 已扩容至 500M"
|
||||
else
|
||||
printStr yellow "remount 失败,尝试清理 /tmp 旧文件..."
|
||||
# 删除超过 1 天的普通文件
|
||||
find /tmp -type f -mtime +1 -delete 2>/dev/null
|
||||
# 删除同名残留包(防止上次下载中断)
|
||||
rm -f /tmp/${dlfile}
|
||||
|
||||
# 清理后再次尝试扩容
|
||||
mount -o remount,size=400M /tmp 2>/dev/null
|
||||
if [ $? -eq 0 ]; then
|
||||
printStr green "清理后 remount 成功,/tmp 已扩容至 400M"
|
||||
else
|
||||
# 最后兜底:检查清理后实际剩余空间是否已满足要求
|
||||
TMP_AVAIL=$(df -T | grep '/tmp' | awk '{print int($5)}')
|
||||
if [ "${TMP_AVAIL}" -lt 409600 ]; then
|
||||
_exit 1 "/tmp 空间不足且无法扩容(当前 ${TMP_AVAIL} KB),请手动清理后重试!"
|
||||
else
|
||||
printStr green "清理后 /tmp 剩余空间已满足要求(${TMP_AVAIL} KB)"
|
||||
fi
|
||||
fi
|
||||
fi
|
||||
else
|
||||
printStr green "/tmp 剩余空间充足(${TMP_AVAIL} KB),继续..."
|
||||
fi
|
||||
# ---------------------------------------------------------------
|
||||
|
||||
printStr yellow "检测并选定下载节点..."
|
||||
get_mirror_url
|
||||
|
||||
printStr yellow "下载刷机包..."
|
||||
dl_get update/system/${dlfile} /${dlfile}
|
||||
dl_get update/system/${dlfile} /tmp/${dlfile}
|
||||
|
||||
printStr yellow "校验刷机包..."
|
||||
echo "${NODE_URL}/update/system/${dlfile}.md5sum"
|
||||
[ "$(get_md5 -c ${NODE_URL}/update/system/${dlfile}.md5sum ${dlfile})" != "$(get_md5 -l /${dlfile})" ] && _exit 1 "文件校验失败,请重试"
|
||||
[ "$(get_md5 -c ${NODE_URL}/update/system/${dlfile}.md5sum ${dlfile})" != "$(get_md5 -l /tmp/${dlfile})" ] && \
|
||||
_exit 1 "文件校验失败,请重试"
|
||||
printStr green "下载完成!"
|
||||
|
||||
printStr yellow "刷机中,请勿断电..."
|
||||
gunzip -c /${dlfile} | dd of=/dev/mmcblk0 bs=1024 seek=1024 status=progress conv=sync
|
||||
gunzip -c /tmp/${dlfile} | dd of=/dev/mmcblk0 bs=1024 seek=1024 status=progress conv=sync
|
||||
|
||||
[[ $? == 0 ]] && printStr yellow "
|
||||
if [[ $? == 0 ]]; then
|
||||
rm -f /tmp/${dlfile} # 刷机成功后清理临时文件
|
||||
printStr yellow "
|
||||
==============================================================
|
||||
恭喜刷机已完成,系统重启中,待初始化5-8分钟结束后即可登录。
|
||||
==============================================================" && reboot || \
|
||||
_exit 1 "刷机失败"
|
||||
=============================================================="
|
||||
reboot
|
||||
else
|
||||
_exit 1 "刷机失败"
|
||||
fi
|
||||
|
||||
@@ -1,12 +1,11 @@
|
||||
#!/bin/bash
|
||||
|
||||
if [ -f /sys/firmware/devicetree/base/my_board_info/custom_id ];then
|
||||
custom_id=$(tr -d '\0' < /sys/firmware/devicetree/base/my_board_info/custom_id)
|
||||
if [ "${custom_id}" = "n2ns1" ];then
|
||||
dlfile="n2-99.flash.gz"
|
||||
fi
|
||||
else
|
||||
dlfile="mv200-99.flash.gz"
|
||||
dlfile="mv200-99.flash.gz"
|
||||
fi
|
||||
|
||||
echo "
|
||||
@@ -26,55 +25,90 @@ read -p "继续执行?[y/n]: " result
|
||||
temp_file=$(mktemp)
|
||||
curl -sSL https://hi.ecoo.top/mirror-utils.sh > $temp_file
|
||||
if [ ! -f /etc/public-download.sh ] || [ "$(cat $temp_file|md5sum|awk '{print $1}')" != "$(cat /etc/public-download.sh|md5sum|awk '{print $1}')" ]; then
|
||||
cp $temp_file /etc/public-download.sh
|
||||
cp $temp_file /etc/public-download.sh
|
||||
fi
|
||||
rm -f $temp_file
|
||||
source /etc/public-download.sh
|
||||
|
||||
model=$(cpuid)
|
||||
platform=hi3798mv200
|
||||
|
||||
if [ "$(echo ${model})" != "$platform" ];then
|
||||
_exit 1 "本升级程序仅支持${platform}机型!"
|
||||
if [ "$(echo ${model})" != "$platform" ]; then
|
||||
_exit 1 "本升级程序仅支持${platform}机型!"
|
||||
fi
|
||||
|
||||
if [ $(whoami) != "root" ];then
|
||||
_exit 1 "请使用root权限切换系统命令!"
|
||||
if [ $(whoami) != "root" ]; then
|
||||
_exit 1 "请使用root权限切换系统命令!"
|
||||
fi
|
||||
|
||||
is64bit=$(getconf LONG_BIT)
|
||||
if [ "${is64bit}" != '64' ];then
|
||||
_exit 1 "抱歉, 当前系统切换版本不支持32位系统, 请使用64位系统!";
|
||||
if [ "${is64bit}" != '64' ]; then
|
||||
_exit 1 "抱歉, 当前系统切换版本不支持32位系统, 请使用64位系统!"
|
||||
fi
|
||||
promode=$(uname -r|cut -c 13-)
|
||||
if [ $promode = 26010066 ];then
|
||||
_exit 1 "专业版用户请使用vipupgrade命令进行升级!"
|
||||
fi
|
||||
#nasversion=`cat /etc/nasversion`
|
||||
#if [ $nasversion = "20230101" ];then
|
||||
# _exit 1 "已经是20230101最新版,无需升级系统!"
|
||||
#fi
|
||||
|
||||
space_left=$(df -hT|grep /dev/root|awk '{print $4}')
|
||||
if [ "$(expr $(echo ${space_left%%G}) \> 1)" != 1 ];then
|
||||
_exit 1 "请确保剩余空间大于1G!"
|
||||
promode=$(uname -r|cut -c 13-)
|
||||
if [ $promode = 26010066 ]; then
|
||||
_exit 1 "专业版用户请使用vipupgrade命令进行升级!"
|
||||
fi
|
||||
|
||||
# ---------------------------------------------------------------
|
||||
# 检测 /tmp 剩余空间,不足 400M 时尝试扩容或清理
|
||||
# ---------------------------------------------------------------
|
||||
printStr yellow "检测 /tmp 可用空间..."
|
||||
TMP_AVAIL=$(df -T | grep '/tmp' | awk '{print int($5)}') # 单位:KB
|
||||
|
||||
if [ "${TMP_AVAIL}" -lt 409600 ]; then # 409600 KB = 400M
|
||||
printStr yellow "/tmp 剩余空间不足 400M(当前 ${TMP_AVAIL} KB),尝试 remount 扩容..."
|
||||
|
||||
mount -o remount,size=500M /tmp 2>/dev/null
|
||||
if [ $? -eq 0 ]; then
|
||||
printStr green "/tmp 已扩容至 500M"
|
||||
else
|
||||
printStr yellow "remount 失败,尝试清理 /tmp 旧文件..."
|
||||
# 删除超过 1 天的普通文件
|
||||
find /tmp -type f -mtime +1 -delete 2>/dev/null
|
||||
# 删除同名残留包(防止上次下载中断)
|
||||
rm -f /tmp/${dlfile}
|
||||
|
||||
# 清理后再次尝试扩容
|
||||
mount -o remount,size=400M /tmp 2>/dev/null
|
||||
if [ $? -eq 0 ]; then
|
||||
printStr green "清理后 remount 成功,/tmp 已扩容至 400M"
|
||||
else
|
||||
# 最后兜底:检查清理后实际剩余空间是否已满足要求
|
||||
TMP_AVAIL=$(df -T | grep '/tmp' | awk '{print int($5)}')
|
||||
if [ "${TMP_AVAIL}" -lt 409600 ]; then
|
||||
_exit 1 "/tmp 空间不足且无法扩容(当前 ${TMP_AVAIL} KB),请手动清理后重试!"
|
||||
else
|
||||
printStr green "清理后 /tmp 剩余空间已满足要求(${TMP_AVAIL} KB)"
|
||||
fi
|
||||
fi
|
||||
fi
|
||||
else
|
||||
printStr green "/tmp 剩余空间充足(${TMP_AVAIL} KB),继续..."
|
||||
fi
|
||||
# ---------------------------------------------------------------
|
||||
|
||||
printStr yellow "检测并选定下载节点..."
|
||||
get_mirror_url
|
||||
|
||||
printStr yellow "下载刷机包..."
|
||||
dl_get update/system/${dlfile} /${dlfile}
|
||||
dl_get update/system/${dlfile} /tmp/${dlfile}
|
||||
|
||||
printStr yellow "校验刷机包..."
|
||||
[ "$(get_md5 -c ${NODE_URL}/update/system/${dlfile}.md5sum ${dlfile})" != "$(get_md5 -l /${dlfile})" ] && _exit 1 "文件校验失败,请重试"
|
||||
[ "$(get_md5 -c ${NODE_URL}/update/system/${dlfile}.md5sum ${dlfile})" != "$(get_md5 -l /tmp/${dlfile})" ] && \
|
||||
_exit 1 "文件校验失败,请重试"
|
||||
printStr green "下载完成!"
|
||||
|
||||
printStr yellow "刷机中,请勿断电..."
|
||||
gunzip -c /${dlfile} | dd of=/dev/mmcblk0 bs=1024 seek=1024 status=progress conv=sync
|
||||
gunzip -c /tmp/${dlfile} | dd of=/dev/mmcblk0 bs=1024 seek=1024 status=progress conv=sync
|
||||
|
||||
[[ $? == 0 ]] && printStr yellow "
|
||||
if [[ $? == 0 ]]; then
|
||||
rm -f /tmp/${dlfile} # 刷机成功后清理临时文件
|
||||
printStr yellow "
|
||||
==============================================================
|
||||
刷机已完成,请手工关闭电源并再次开启,等待初始化5-8分钟即可。
|
||||
==============================================================" && reboot || \
|
||||
_exit 1 "刷机失败"
|
||||
|
||||
=============================================================="
|
||||
reboot
|
||||
else
|
||||
_exit 1 "刷机失败"
|
||||
fi
|
||||
|
||||
@@ -1,7 +1,5 @@
|
||||
#!/bin/bash
|
||||
|
||||
dlfile="mv300-99.flash.gz" # 文件路径
|
||||
|
||||
echo "
|
||||
+----------------------------------------------------------------------
|
||||
| 海纳思系统hi3798mv300升级系统专用脚本温馨提示:
|
||||
@@ -19,56 +17,90 @@ read -p "继续执行?[y/n]: " result
|
||||
temp_file=$(mktemp)
|
||||
curl -sSL https://hi.ecoo.top/mirror-utils.sh > $temp_file
|
||||
if [ ! -f /etc/public-download.sh ] || [ "$(cat $temp_file|md5sum|awk '{print $1}')" != "$(cat /etc/public-download.sh|md5sum|awk '{print $1}')" ]; then
|
||||
cp $temp_file /etc/public-download.sh
|
||||
cp $temp_file /etc/public-download.sh
|
||||
fi
|
||||
rm -f $temp_file
|
||||
source /etc/public-download.sh
|
||||
|
||||
model=$(cpuid)
|
||||
platform=hi3798mv300
|
||||
|
||||
if [ "$(echo ${model})" != "$platform" ];then
|
||||
_exit 1 "本升级程序仅支持${platform}机型!"
|
||||
if [ "$(echo ${model})" != "$platform" ]; then
|
||||
_exit 1 "本升级程序仅支持${platform}机型!"
|
||||
fi
|
||||
|
||||
if [ $(whoami) != "root" ];then
|
||||
_exit 1 "请使用root权限切换系统命令!"
|
||||
if [ $(whoami) != "root" ]; then
|
||||
_exit 1 "请使用root权限切换系统命令!"
|
||||
fi
|
||||
|
||||
is64bit=$(getconf LONG_BIT)
|
||||
if [ "${is64bit}" != '64' ];then
|
||||
_exit 1 "抱歉, 当前系统切换版本不支持32位系统, 请使用64位系统!";
|
||||
if [ "${is64bit}" != '64' ]; then
|
||||
_exit 1 "抱歉, 当前系统切换版本不支持32位系统, 请使用64位系统!"
|
||||
fi
|
||||
|
||||
promode=$(uname -r|cut -c 13-)
|
||||
if [ $promode = 36010066 ];then
|
||||
_exit 1 "专业版用户请使用vipupgrade命令进行升级!"
|
||||
if [ $promode = 36010066 ]; then
|
||||
_exit 1 "专业版用户请使用vipupgrade命令进行升级!"
|
||||
fi
|
||||
#nasversion=`cat /etc/nasversion`
|
||||
#if [ $nasversion = "20230101" ];then
|
||||
# _exit 1 "已经是20230101最新版,无需升级系统!"
|
||||
#fi
|
||||
|
||||
space_left=$(df -hT|grep /dev/root|awk '{print $4}')
|
||||
if [ "$(expr $(echo ${space_left%%G}) \> 1)" != 1 ];then
|
||||
_exit 1 "请确保剩余空间大于1G!"
|
||||
# ---------------------------------------------------------------
|
||||
# 检测 /tmp 剩余空间,不足 500M 时尝试扩容或清理
|
||||
# ---------------------------------------------------------------
|
||||
printStr yellow "检测 /tmp 可用空间..."
|
||||
TMP_AVAIL=$(df -T | grep '/tmp' | awk '{print int($5)}') # 单位:KB
|
||||
|
||||
if [ "${TMP_AVAIL}" -lt 512000 ]; then # 512000 KB ≈ 500M
|
||||
printStr yellow "/tmp 剩余空间不足 500M(当前 ${TMP_AVAIL} KB),尝试 remount 扩容..."
|
||||
|
||||
mount -o remount,size=500M /tmp 2>/dev/null
|
||||
if [ $? -eq 0 ]; then
|
||||
printStr green "/tmp 已扩容至 500M"
|
||||
else
|
||||
printStr yellow "remount 失败,尝试清理 /tmp 旧文件..."
|
||||
# 删除超过 1 天的普通文件
|
||||
find /tmp -type f -mtime +1 -delete 2>/dev/null
|
||||
# 删除同名残留包(防止上次下载中断)
|
||||
rm -f /tmp/${dlfile}
|
||||
|
||||
# 清理后再次尝试扩容
|
||||
mount -o remount,size=450M /tmp 2>/dev/null
|
||||
if [ $? -eq 0 ]; then
|
||||
printStr green "清理后 remount 成功,/tmp 已扩容至 450M"
|
||||
else
|
||||
# 最后再检查一次实际剩余空间,也许清理后已经够用
|
||||
TMP_AVAIL=$(df -T | grep '/tmp' | awk '{print int($5)}')
|
||||
if [ "${TMP_AVAIL}" -lt 498000 ]; then
|
||||
_exit 1 "/tmp 空间不足且无法扩容(当前 ${TMP_AVAIL} KB),请手动清理后重试!"
|
||||
else
|
||||
printStr green "清理后 /tmp 剩余空间已满足要求(${TMP_AVAIL} KB)"
|
||||
fi
|
||||
fi
|
||||
fi
|
||||
else
|
||||
printStr green "/tmp 剩余空间充足(${TMP_AVAIL} KB),继续..."
|
||||
fi
|
||||
# ---------------------------------------------------------------
|
||||
|
||||
printStr yellow "检测并选定下载节点..."
|
||||
get_mirror_url
|
||||
|
||||
|
||||
printStr yellow "下载刷机包..."
|
||||
dl_get update/system/${dlfile} /${dlfile}
|
||||
dl_get update/system/${dlfile} /tmp/${dlfile}
|
||||
|
||||
printStr yellow "校验刷机包..."
|
||||
[ "$(get_md5 -c ${NODE_URL}/update/system/${dlfile}.md5sum ${dlfile})" != "$(get_md5 -l /${dlfile})" ] && _exit 1 "文件校验失败,请重试"
|
||||
[ "$(get_md5 -c ${NODE_URL}/update/system/${dlfile}.md5sum ${dlfile})" != "$(get_md5 -l /tmp/${dlfile})" ] && \
|
||||
_exit 1 "文件校验失败,请重试"
|
||||
printStr green "下载完成!"
|
||||
|
||||
printStr yellow "刷机中,请勿断电..."
|
||||
gunzip -c /${dlfile} | dd of=/dev/mmcblk0 bs=1024 seek=1024 status=progress conv=sync
|
||||
gunzip -c /tmp/${dlfile} | dd of=/dev/mmcblk0 bs=1024 seek=1024 status=progress conv=sync
|
||||
|
||||
[[ $? == 0 ]] && printStr yellow "
|
||||
if [[ $? == 0 ]]; then
|
||||
rm -f /tmp/${dlfile} # 刷机成功后清理临时文件
|
||||
printStr yellow "
|
||||
==============================================================
|
||||
刷机已完成,请手工关闭电源并再次开启,等待初始化5-8分钟即可。
|
||||
==============================================================" && reboot || \
|
||||
_exit 1 "刷机失败"
|
||||
=============================================================="
|
||||
reboot
|
||||
else
|
||||
_exit 1 "刷机失败"
|
||||
fi
|
||||
|
||||
@@ -170,12 +170,12 @@ if [ ! -s /etc/xiaoya/docker_address.txt ]; then
|
||||
fi
|
||||
docker stop xiaoya
|
||||
docker rm xiaoya
|
||||
docker rmi registry.cn-hangzhou.aliyuncs.com/histb/xiaoya:latest
|
||||
docker pull registry.cn-hangzhou.aliyuncs.com/histb/xiaoya:latest
|
||||
docker rmi registry.cn-hangzhou.aliyuncs.com/ecoo/xiaoya:latest
|
||||
docker pull registry.cn-hangzhou.aliyuncs.com/ecoo/xiaoya:latest
|
||||
if [[ -f /etc/xiaoya/proxy.txt ]] && [[ -s /etc/xiaoya/proxy.txt ]]; then
|
||||
proxy_url=$(head -n1 /etc/xiaoya/proxy.txt)
|
||||
docker run -d -p 5678:80 -p 2345:2345 -p 2346:2346 --env HTTP_PROXY="$proxy_url" --env HTTPS_PROXY="$proxy_url" --env no_proxy="*.aliyundrive.com" -v /etc/xiaoya:/data --restart=always --name=xiaoya registry.cn-hangzhou.aliyuncs.com/histb/xiaoya:latest
|
||||
docker run -d -p 5678:80 -p 2345:2345 -p 2346:2346 --env HTTP_PROXY="$proxy_url" --env HTTPS_PROXY="$proxy_url" --env no_proxy="*.aliyundrive.com" -v /etc/xiaoya:/data --restart=always --name=xiaoya registry.cn-hangzhou.aliyuncs.com/ecoo/xiaoya:latest
|
||||
else
|
||||
docker run -d -p 5678:80 -p 2345:2345 -p 2346:2346 -v /etc/xiaoya:/data --restart=always --name=xiaoya registry.cn-hangzhou.aliyuncs.com/histb/xiaoya:latest
|
||||
docker run -d -p 5678:80 -p 2345:2345 -p 2346:2346 -v /etc/xiaoya:/data --restart=always --name=xiaoya registry.cn-hangzhou.aliyuncs.com/ecoo/xiaoya:latest
|
||||
fi
|
||||
|
||||
|
||||
Reference in New Issue
Block a user