Compare commits
28 Commits
8d802c8230
...
main
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
a3e8267c15 | ||
|
|
23c702366e | ||
|
|
8afde061c1 | ||
|
|
83cb701d50 | ||
|
|
a6c0bb929f | ||
|
|
4e95736763 | ||
|
|
875a1e5b26 | ||
|
|
344edd86a7 | ||
|
|
2e263c753f | ||
|
|
c70e096c66 | ||
|
|
101d835a55 | ||
|
|
5d61c901df | ||
|
|
8aaa7ff167 | ||
|
|
c1bde3d82f | ||
|
|
2586156515 | ||
|
|
3d998a91b1 | ||
|
|
256f789a4e | ||
|
|
075e751ffb | ||
|
|
3068236ec2 | ||
|
|
b59a915e9a | ||
|
|
1437b0576d | ||
|
|
d7d69bdecc | ||
|
|
163a75f7cd | ||
|
|
eafd3cfedb | ||
|
|
1b0af4422b | ||
|
|
4a1189173d | ||
|
|
193cc4b774 | ||
|
|
a066f54328 |
15
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
|
||||
@@ -16,3 +19,5 @@ npm run serve
|
||||
```
|
||||
https://netlify.com/
|
||||
```
|
||||
|
||||
### 注意,2026年升级到node20,模板升级到3.9.2
|
||||
|
||||
16
blog/2022-12-01-soul/index.md
Normal file
@@ -0,0 +1,16 @@
|
||||
---
|
||||
slug: soul
|
||||
title: 心路分享
|
||||
authors: [teasiu]
|
||||
tags: [my soul]
|
||||
---
|
||||
|
||||
## 心路分享
|
||||
|
||||
如果没有天赋,那就不断的重复,如果不是天才,那就一步一步地来,
|
||||
慢也好,步子小也好,只要再往前走就好;
|
||||
所有的努力,不是为了让别人觉得你多了不起,
|
||||
而是让自己打心眼里看得起自己;
|
||||
那些看似不起眼的日复一日,会在将来的某一天,
|
||||
让你突然看到坚持的意义。
|
||||
|
||||
BIN
blog/2022-12-01-soul/teasiu.jpg
Normal file
|
After Width: | Height: | Size: 26 KiB |
@@ -7,6 +7,8 @@ sidebar_position: 1
|
||||
|
||||
本手册由作者神雕热心撰写。由于工作量大,未详尽之处,敬请理解。
|
||||
|
||||
<a href="/docs/tutorial-extras/start" class="hinas-button">前往快速开始</a>
|
||||
|
||||
## 海纳思系统介绍:
|
||||
|
||||
英文名称 Hi-NAS ,中文名称:海纳思
|
||||
|
||||
@@ -113,13 +113,6 @@ bash <(curl https://ecoo.top/n2_upgrade.sh)
|
||||
bash <(curl https://ecoo.top/mv300_upgrade.sh)
|
||||
```
|
||||
|
||||
### 玩客云 S805 机型
|
||||
|
||||
```bash
|
||||
bash <(curl https://ecoo.top/s805_upgrade.sh)
|
||||
```
|
||||
|
||||
|
||||
## 常用脚本ota更新
|
||||
|
||||
- ota常用的脚本更新命令:
|
||||
|
||||
@@ -8,6 +8,11 @@ sidebar_position: 4
|
||||
|
||||
## 原理
|
||||
|
||||
:::caution
|
||||
注意:本章节仅仅适合海思芯片CPU的机顶盒设备。
|
||||
如果你不清楚,请勿试用!直到你完全理解什么叫做芯片为止!
|
||||
:::
|
||||
|
||||
机顶盒的mac地址由启动阶段的 ```bootargs.bin``` 进行传递。
|
||||
|
||||
作者为了便利用户更改,制作了```mkbootargs```的程序提供在线制作```bootargs.bin```文件。
|
||||
@@ -74,14 +79,32 @@ http://192.168.xx.xx/macedit.php
|
||||
```
|
||||
|
||||
|
||||
|
||||
:::caution
|
||||
以下内容适合几乎所有机型!
|
||||
:::
|
||||
## 软改mac
|
||||
|
||||
上面的方法是硬改mac,这里也阐述一下软改的办法:
|
||||
|
||||
```bash
|
||||
vi /etc/network/interfaces.d/eth0 # 编辑配置文件
|
||||
# 增加下面的内容 (实际内容可按需修改)
|
||||
pre-up ifconfig eth0 hw ether 00:11:22:33:44:66
|
||||
vi /etc/netplan/10-dhcp-all-interfaces.yaml
|
||||
```
|
||||
添加你的 mac 地址
|
||||
|
||||
```bash
|
||||
network:
|
||||
version: 2
|
||||
renderer: networkd
|
||||
ethernets:
|
||||
all-eth-interfaces:
|
||||
match:
|
||||
name: "e*"
|
||||
dhcp4: yes
|
||||
dhcp6: yes
|
||||
ipv6-privacy: yes
|
||||
# 添加固定MAC地址配置
|
||||
macaddress: "00:11:22:33:44:66"
|
||||
```
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -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` 获得穿透分配的域名;
|
||||
|
||||
|
||||
@@ -19,8 +19,8 @@ sidebar_position: 9
|
||||
在终端中输入如下命令即可更新:
|
||||
|
||||
```bash
|
||||
sudo apt-get update
|
||||
sudo apt-get search histb kernel
|
||||
sudo apt update
|
||||
sudo apt search histb kernel
|
||||
```
|
||||
|
||||
你会得到一个类似下图的匹配你的机顶盒的海思新内核。
|
||||
@@ -29,9 +29,9 @@ sudo apt-get search histb kernel
|
||||
|
||||
接着执行你机顶盒对应的机型安装新内核,最后重启系统即可。
|
||||
```
|
||||
sudo apt install kernel-hi3798mv200-82120168
|
||||
sudo apt install kernel-hi3798mv200-82082668
|
||||
或者例如:
|
||||
sudo apt install kernel-hi3798mv100-82120168
|
||||
sudo apt install kernel-hi3798mv100-81082668
|
||||
```
|
||||
|
||||
|
||||
@@ -106,10 +106,10 @@ dd if=hi_kernel-hi3798mv200-n2ns1.bin of=/dev/mmcblk0p6 bs=1024 count=40960
|
||||
社区版内核编号规则如下:
|
||||
|
||||
```
|
||||
系统版本 : Ubuntu 20.04.6 LTS | V20231201-4.4.35_ecoo_82111968-64
|
||||
系统版本 : Ubuntu 20.04.6 LTS | V20251001-4.4.35_ecoo_82082668-64
|
||||
```
|
||||
|
||||
其中:```82111968``` 第二个数字 2 代表mv200系列, 1119 代表 2023版本的11月19日
|
||||
其中:```82082668``` 第二个数字 2 代表mv200系列, 0826 代表 2025版本的08月26日
|
||||
|
||||
其它自行推算。
|
||||
|
||||
|
||||
@@ -44,7 +44,7 @@ CPU Rockchip RK3566
|
||||
|
||||
瑞芯微-海纳思专用刷机固件下载地址 :
|
||||
|
||||
地址1[Rockchip_3566_oect_for_hinas.zip](https://alist.ecoo.top/d/rockchip/Rockchip_3566_oect_for_hinas.zip?sign=NyuYGBTE5N6XnLOp4eWUk-8S5uc1SteBbM9rzy7HkLs=:0)
|
||||
地址1[Rockchip_3566_oect_for_hinas.zip](https://alist.ecoo.top/rockchip/)
|
||||
|
||||
地址2[Rockchip_3566_oect_for_hinas.zip](https://www.ecoo.top/update/soft_init/rk3566/Rockchip_3566_oect_for_hinas.zip)
|
||||
|
||||
|
||||
@@ -20,7 +20,7 @@ sidebar_position: 1
|
||||
|
||||
- 建议使用 SSH 终端管理器登录后台
|
||||
|
||||
Windows 操作系统可以使用 [putty](https://www.chiark.greenend.org.uk/~sgtatham/putty/latest.html) 工具或者 [MobaXterm](https://node.histb.com:9088/update/soft_init/MobaXterm.zip) 工具,
|
||||
Windows 操作系统可以使用 [putty](https://www.chiark.greenend.org.uk/~sgtatham/putty/latest.html) 工具或者 [MobaXterm](https://node4.histb.com:9088/update/soft_init/MobaXterm.zip) 工具,
|
||||
|
||||
Linux 操作系统直接 `ssh root@<IP>`
|
||||
|
||||
@@ -35,7 +35,7 @@ sidebar_position: 1
|
||||

|
||||
|
||||
|
||||
## 2.修改密码:
|
||||
## 2.修改后台(终端)密码:
|
||||
|
||||
终端输入以下命令进行更改:
|
||||
|
||||
@@ -55,11 +55,12 @@ root@hi3798mv200:~#
|
||||
|
||||
**注意**:密码是不会显示的,盲敲输入后按回车即可。
|
||||
|
||||
## 3.注册和登录管理页面
|
||||
## 3.首次使用需要设置首页登陆(前端)密码
|
||||
|
||||

|
||||

|
||||
|
||||

|
||||
为了您的系统安全,首次设置密码时,需要证明设备在您身边,所以限制必须局域网 IP 才能打开首页;
|
||||
如果您的局域网 IP 不在白名单内,可以去 SSH 后台自行修改文档:```/var/www/html/ip_whitelist_check.php```
|
||||
|
||||
|
||||
## 4.阅读手册
|
||||
|
||||
|
Before Width: | Height: | Size: 32 KiB |
BIN
docs/tutorial-extras/img/login1.png
Normal file
|
After Width: | Height: | Size: 43 KiB |
|
Before Width: | Height: | Size: 38 KiB |
@@ -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
@@ -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
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"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -28,3 +28,23 @@
|
||||
--ifm-color-primary-lightest: #4fddbf;
|
||||
--docusaurus-highlighted-code-line-bg: rgba(0, 0, 0, 0.3);
|
||||
}
|
||||
/* 自定义按钮样式 - 适配Docusaurus Classic主题 */
|
||||
.hinas-button {
|
||||
display: inline-block;
|
||||
background-color: #165DFF;
|
||||
color: #fff !important;
|
||||
padding: 10px 24px;
|
||||
border-radius: 4px;
|
||||
text-decoration: none !important;
|
||||
font-size: 14px;
|
||||
font-weight: 500;
|
||||
transition: background-color 0.2s ease;
|
||||
border: none;
|
||||
cursor: pointer;
|
||||
margin: 24px 0;
|
||||
}
|
||||
|
||||
.hinas-button:hover {
|
||||
background-color: #0F4BD8;
|
||||
color: #fff !important;
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
@@ -3,47 +3,50 @@
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||
<title>海纳思系统官方通告</title>
|
||||
<meta name="description" content="海纳思系统官方通告页面,提供广告位招租信息及系统使用统计。">
|
||||
<title>每晚8点直播使用教程</title>
|
||||
<meta name="description" content="每晚8点直播使用教程,详细讲解各类使用方法">
|
||||
<style>
|
||||
body {
|
||||
max-width: 40em;
|
||||
max-width: 800px; /* 扩大页面最大宽度,适配图片显示 */
|
||||
margin: 0 auto;
|
||||
padding: 20px;
|
||||
font-family: Tahoma, Verdana, Arial, sans-serif;
|
||||
text-align: center; /* 全局文本居中,方便主题文字和图片对齐 */
|
||||
}
|
||||
#cookieConsent {
|
||||
background: #f1f1f1;
|
||||
padding: 10px;
|
||||
margin: 10px 0;
|
||||
border-radius: 4px;
|
||||
/* 图片样式:居中、自适应宽度、不超出容器 */
|
||||
.ad-image {
|
||||
display: block;
|
||||
margin: 20px auto; /* 上下间距,左右自动居中 */
|
||||
max-width: 100%; /* 响应式,不超出容器宽度 */
|
||||
height: auto; /* 保持图片宽高比 */
|
||||
border: none; /* 去除默认边框 */
|
||||
}
|
||||
h1 {
|
||||
color: #333; /* 标题颜色更舒适 */
|
||||
margin-bottom: 30px;
|
||||
}
|
||||
footer {
|
||||
margin-top: 30px;
|
||||
color: #666;
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<header>
|
||||
<h1>海纳思系统官方广告位招租</h1>
|
||||
<h1>每晚8点直播使用教程</h1>
|
||||
</header>
|
||||
|
||||
<h2>42000+装机数</h2>
|
||||
<h2>日活8000+</h2>
|
||||
<h2>日增约100台</h2>
|
||||
<h2>要求:符合海纳思服务器的环境需求</h2>
|
||||
<h2>捐助并投放,与作者共赢!请联系:<a href="mailto:teasiu@163.com">teasiu@163.com</a></h2>
|
||||
|
||||
<div id="visitCounter"></div>
|
||||
<!-- 居中显示ad.jpg图片 -->
|
||||
<img src="ad.jpg" alt="直播使用教程相关图片" class="ad-image">
|
||||
|
||||
<footer>
|
||||
版权 © <span id="currentYear"></span> <a href="https://www.ecoo.top/">www.ecoo.top</a>
|
||||
</footer>
|
||||
|
||||
|
||||
|
||||
<script>
|
||||
// 动态年份
|
||||
document.getElementById('currentYear').textContent = new Date().getFullYear();
|
||||
|
||||
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
|
||||
BIN
static/ad.jpg
|
Before Width: | Height: | Size: 80 KiB After Width: | Height: | Size: 232 KiB |
BIN
static/ad1.jpg
Normal file
|
After Width: | Height: | Size: 80 KiB |
@@ -1,14 +1,12 @@
|
||||
#!/bin/bash
|
||||
|
||||
dlfile="mv100-99.flash.gz"
|
||||
|
||||
echo "
|
||||
+----------------------------------------------------------------------
|
||||
| 海纳思系统hi3798mv100升级系统专用脚本温馨提示:
|
||||
+----------------------------------------------------------------------
|
||||
| 此专用脚本可以让你在任意版本的NAS系统下一键升级到20251001,
|
||||
| 此专用脚本可以让你在任意版本的NAS系统下一键升级到20260101,
|
||||
+----------------------------------------------------------------------
|
||||
| 升级20251001版专用,原系统将完全清除,请注意保存资料。
|
||||
| 升级20260101版专用,原系统将完全清除,请注意保存资料。
|
||||
+----------------------------------------------------------------------
|
||||
| 如果不确定,请按CTRL+C结束此脚本.
|
||||
+----------------------------------------------------------------------
|
||||
@@ -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,21 +1,20 @@
|
||||
#!/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 "
|
||||
+----------------------------------------------------------------------
|
||||
| 海纳思系统hi3798mv200升级系统专用脚本温馨提示:
|
||||
+----------------------------------------------------------------------
|
||||
| 此专用脚本可以让你在任意版本的NAS系统下一键升级到20251001,
|
||||
| 此专用脚本可以让你在任意版本的NAS系统下一键升级到20260101,
|
||||
+----------------------------------------------------------------------
|
||||
| 升级20251001版专用,原系统将完全清除,请注意保存资料。
|
||||
| 升级20260101版专用,原系统将完全清除,请注意保存资料。
|
||||
+----------------------------------------------------------------------
|
||||
| 如果不确定,请按CTRL+C结束此脚本.
|
||||
+----------------------------------------------------------------------
|
||||
@@ -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,14 +1,12 @@
|
||||
#!/bin/bash
|
||||
|
||||
dlfile="mv300-99.flash.gz" # 文件路径
|
||||
|
||||
echo "
|
||||
+----------------------------------------------------------------------
|
||||
| 海纳思系统hi3798mv300升级系统专用脚本温馨提示:
|
||||
+----------------------------------------------------------------------
|
||||
| 此专用脚本可以让你在任意版本的NAS系统下一键升级到20251001,
|
||||
| 此专用脚本可以让你在任意版本的NAS系统下一键升级到20260101,
|
||||
+----------------------------------------------------------------------
|
||||
| 升级20251001版专用,原系统将完全清除,请注意保存资料。
|
||||
| 升级20260101版专用,原系统将完全清除,请注意保存资料。
|
||||
+----------------------------------------------------------------------
|
||||
| 如果不确定,请按CTRL+C结束此脚本.
|
||||
+----------------------------------------------------------------------
|
||||
@@ -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
|
||||
|
||||
@@ -50,9 +50,9 @@ echo "
|
||||
+----------------------------------------------------------------------
|
||||
| 海纳思系统hi3798mv200升级系统 N2 恩兔 专用脚本温馨提示:
|
||||
+----------------------------------------------------------------------
|
||||
| 此专用脚本可以让你在任意版本的NAS系统下一键升级到20251001,
|
||||
| 此专用脚本可以让你在任意版本的NAS系统下一键升级到20260101,
|
||||
+----------------------------------------------------------------------
|
||||
| 升级20251001版专用,原系统将完全清除,请注意保存资料。
|
||||
| 升级20260101版专用,原系统将完全清除,请注意保存资料。
|
||||
+----------------------------------------------------------------------
|
||||
| 如果不确定,请按CTRL+C结束此脚本.
|
||||
+----------------------------------------------------------------------
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||