之前一直在使用 ssh 来做文件存储与分享,因为 SSH 的特殊性,使用非常不便。便想建一个轻便的私人网盘。经过对开源私有云(ownCloud/nextCloud/kodExplorer/…)的查找、安装、卸载流程,最终留下了德国人 larsjung 开发的 h5ai。
h5ai 相对于其它私有云来说功能简单、体积轻便(1MB左右)、页面排版自动适应 PC 和移动端、支持包括中文在内的多语言显示,采用 NodeJs 框架开发,编译完成后为 PHP 程序。
h5ai 通过不同的视图来对服务器端的目录和文件进行查看。可以在线预览 PDF、文档、脚本(语言高亮)、图片、视频、下载(二维码)等等。
因为它重在文件索引与分享,所以不支持文件上传。
它有许多设置,可以对页面排版进行修改,如皮肤、侧边栏、搜索、下载,生成视频和图片缩略图等等。
作者提供的一个 Demo:H5ai - Demo
h5ai可以部署在 Apache / lighttpd / nginx / caddy 等等 Web 服务器上。
我们需要准备一个 WEB 环境,可以使用 Nginx、Lighttpd,Caddy, Apache 等等都可以。在这里,我们使用 Web 服务器界的新起之秀 Caddy。
详见 Web server - Caddy
:~$ apt-get install php7.3-fpm php7.3-cgi php7.3-gd php7.3-json
h5ai 下载目录
v0.29.2,截止2019-09-22最新的正式版本。
v0.29.2+025~a1bb755,截止2019-09-22最新的开发版。
在这里,我们下载最新的开发版「v0.29.2+025~a1bb755」并解压至网站目录/var/www/
下。
:~$ 7z x h5ai-0.29.2+025~a1bb755.zip -o/var/www
网站根目录
├──── _h5ai
├──── _h5ai ─── private
├──── _h5ai ─── public
├──── 分享的文件
├──── 分享的文件夹 ─── 分享的文件
└──── 分享的文件夹
将需要分享的文件放在网站根目录下即可,而 h5ai 程序全部在_h5ai
文件夹里。
程序默认 _h5ai
和 .
开头的文件不显示,可以修改配置options.json
文件来自定义不想分享的文件。
h5ai 的index.php
不在根目录下,所以需要在服务器上指定它的路径。
index-file.names
来指定首页的路径。index-file.names += ("/_h5ai/public/index.php")
index
来指定首页的路径。index "/_h5ai/public/index.php"
因为 h5ai 所有的 URI
都会在服务端重定向至 /_h5a/public/index.php
并由它来生成页面,所以在 Caddy 里使用 index
指定网站首页后,浏览我们的网站时会出现很多 404
错误。
这点在 lighttpd / nginx / apache 下默认自动修正了,所以不需要其它设置。
而 Caddy 与 PHP 存在一些兼容性问题,无法自动处理这个问题。所以这里需要而使用rewrite
指令来将所有的 URI
重写至 /_h5ai/public/index.php
。
假设我的网站域名为 www.shixuen.com
:~$ cat >> /etc/caddy/Caddyfile <
此时,在浏览器中输入网址 http://www.shixuen.com
即可浏览网站。
/run/php/php7.3-fpm.sock
即 php7.3-fpm 所绑定的网络端口,如果查找它?
:~$ netstat -anpl | grep php | grep LISTENING
unix 2 [ ACC ] STREAM LISTENING 816733 7346/php-fpm: pool /run/php/php7.3-fpm.sock
http://www.shixuen.com/_h5ai/public/index.php
。server software(服务器)
一栏PDF thumbs(PDF缩略图)
,提示缺少convert(imagemagick)
程序,此功能为 PDF文档生成缩略图。imagemagick
::~$ apt-get install imagemagick
至此,我们私有云就布置完成了,可以为我们提供服务了。
h5ai 的配置文件为_h5ai/private/conf/options.json
,修改它对 h5ai 的功能进行增减。
/*
Password hash.
SHA512 hash of the info page password, the preset password is the empty string.
Online hash generator: https://md5hashing.net/hash/sha512
*/
"passhash": "cf83e1357eefb8bdf1542850d66d8007d620e4050b5715dc83f4a921d36ce9ce47d0d13c5d85f2b0ff8318d2877eec2f63b931bd47417a81a538327af927da3e",
passhash
即 password hash 的缩写,它的值为密码经过 SHA512 hash 计算后的结果。
cf83e1357....da3e
这串字符为空字符的 SHA512 哈希值。
所以我们在上面 3、h5ai 环境与功能的自检 步骤里不用输入密码即可登录。
如何修改默认密码?
cf83e1357....da3e
换成我们刚刚生成的 SHA512 值即可。配置文件里给出的密码在线生成网址 md5hashing.net
不安全,它默认保存我们的密码与对应的 Hash 值,这不就是在人为增加地下黑产的密码数据库么!
所以在这里推荐使用 emn178 开源的静态网页版的密码生成工具 online-tools。
sha512.html
) "view": {
"binaryPrefix": false,
"disableSidebar": true,
"fallbackMode": false,
"fastBrowsing": true,
"fonts": ["Ubuntu", "Roboto", "Helvetica", "Arial", "sans-serif"],
"fontsMono": ["Ubuntu Mono", "Monaco", "Lucida Sans Typewriter", "monospace"],
"hidden": ["^\\.", "^_h5ai"],
"hideFolders": false,
"hideIf403": true,
"hideParentFolder": false,
"maxIconSize": 40,
"modes": ["details", "grid", "icons"],
"modeToggle": false,
"setParentFolderLabels": true,
"sizes": [20, 40, 60, 80, 100, 140, 180, 220, 260, 300],
"theme": "default",
"unmanaged": ["index.html", "index.htm", "index.php"],
"unmanagedInNewWindow": false
},
.
开头的文件,如 .htaccess
,.gitignor
等等。_h5ai
开头的文件或文件夹,如 _h5ai
,_h5ai.header.html
等等。__
开头的文件或文件夹,如 __tmp
,__aaa__
等等。.sh
结尾的文件或文件夹,如 bash.sh
,scripts.sh
等等。robots.txt
开头的文件或文件夹,如 robots.txt
, robots.txt.bak
等等。_h5ai/public/images/theme
里的每个文件夹都是一种图标,默认带了 2 套,另一套图标名为 comity
。 "info": {
"enabled": false,
"show": false,
"qrcode": true,
"qrFill": "#999",
"qrBack": "#fff"
},
"download": {
"enabled": false,
"type": "php-tar",
"packageName": null,
"alwaysVisible": false
},
"select": {
"enabled": true,
"clickndrag": true,
"checkboxes": false
},
选择的设置
下载的设置
tar
程序来下载文件,单线程,同一时间只能下载一个文件。zip
程序来下载文件,单线程,同一时间只能下载一个文件。null
时压缩包名称当前文件夹的名称, "l10n": {
"enabled": true,
"lang": "en",
"useBrowserLang": true
},
en
为英文,zh-cn
为中文简体,zh-tw
为中文繁体。 "resources": {
"scripts": [],
"styles": [
"//fonts.googleapis.com/css?family=Ubuntu:300,400,700%7CUbuntu+Mono:400,700"
]
},
在这里添加的第三方脚本与 CSS 会自动生成 标签插入所有页面的
中。
默认从 _h5ai/public/ext/
里加载不以「 http://、https://、/ 」开头的脚本与 CSS 文件。
因为 h5ai 需要从 fonts.googleapis.com
下载所需的字体,所以国内的用户加载网页非常缓慢。
解决此问题有三种方法:
fonts.googleapis.com
更换为国内的镜像网站。如中科大。 "resources": {
"scripts": [],
"styles": [
"//fonts.lug.ustc.edu.cn/css?family=Ubuntu:300,400,700%7CUbuntu+Mono:400,700"
]
},
中科大 | 对应 | 谷歌字体 |
---|---|---|
fonts.lug.ustc.edu.cn | --> | fonts.googleapis.com |
ajax.lug.ustc.edu.cn | --> | ajax.googleapis.com |
google-themes.lug.ustc.edu.cn | --> | themes.googleusercontent.com |
fonts-gstatic.lug.ustc.edu.cn | --> | fonts.gstatic.com |
#!/bin/bash
ext_dir="/var/www/_h5ai/public/ext"
# 将谷歌字体的 css 下载到 _h5ai/public/ext 下
curl -sL -H "User-Agent:Mozilla/5.0 (X11; Linux x86_64; rv:69.1) Gecko/20100101 Firefox/69.1" \
-o "$ext_dir/fonts.google.css" \
"https://fonts.googleapis.com/css?family=Ubuntu:300,400,700%7CUbuntu+Mono:400,700"
# 将 css 文件里的所需的字体下载至 _h5ai/public/ext/fonts 下
# 并将 css 文件里字体的路径更改为 _h5ai/public/ext/fonts
mkdir -p "$ext_dir/fonts"
if [ -d "$ext_dir/fonts" ]; then
cd "$ext_dir/fonts"
wget $(grep "https" "$ext_dir/fonts.google.css" | awk -F '[()]' '{print $6}')
sed -i 's|https://.*/|/_h5ai/public/ext/fonts/|' "$ext_dir/fonts.google.css"
fi
options.json
将谷歌字体换成本地字体 "resources": {
"scripts": [],
"styles": [
"fonts.google.css"
]
},
当分享的文件夹太多时,为了方便区分,可以在文件夹下创建指定名称的文件来提供简介。
这些信息显示在页面文件夹列表的上面或下面。如下面两副图:
_h5ai.header.html
或 _h5ai.header.md
,以提供此文件夹简介。
_h5ai.header
的内容被添加在里。所以页面里不能包含
等标签。
_h5ai.header.html:
<h1 style="text-align:center">This is a header messageh1>
<p style="text-align:center">
The header is read from file <code>_h5ai.header.htmlcode>. The content of this file will be enclosed by div tags.
p>
_h5ai.header.md:
# This is a header message
The header is read from file `_h5ai.header.html`.The content of this file will be enclosed by div tags.
_h5ai.footer.html
或 _h5ai.footer.md
,以提供此文件夹简介。
_h5ai.footer
的内容被添加在里。所以页面里不能包含
等标签。
_h5ai.footer.html:
<p style="text-align:center">
The footer is read from file _h5ai.footer.html.The content of this file will be enclosed by div tags.
p>
<p style="text-align:center">
<strong>Notestrong>: all files and directories of name _h5ai* are hidden from the index by default.
p>
_h5ai.footer.md:
The footer is read from file `_h5ai.footer.html`. The content of this file will be enclosed by div tags.
**Note**: all files and directories of name `_h5ai*` are hidden from the index by default.
因为 h5ai 采用原生的 HTML5 标签来播放,所以它只能播放浏览器原生支持的视频格式。
HTML5 原生支持的视频格式
Format | Media Type |
---|---|
MP4 | video/mp4 |
WebM | video/webm |
Ogg | video/ogg |
各个浏览器支持的视频格式
Browser | MP4 | WebM | Ogg |
---|---|---|---|
Internet Explorer | YES | NO | NO |
Chrome | YES | YES | YES |
Firefox | YES | YES | YES |
Safari | YES | NO | NO |
Opera | YES (from Opera 25) | YES | YES |
因为 HTML5 功能简陋,开发者们就发明了各种视频插件。
国人 Pearlulu 已经为 h5ai 的 v0.29.2 版本添加了 DPlayer 插件,并写了个 shell script 以将视频文件转换成 hls 格式。我们可以直接下载使用。
下载地址: h5ai_dplayer_hls_0.29.2
这个版本因为作者 larsjung 更新了许多 JS 基础模块,所以最终由 Node.Js 生成的代码变动比较大。
我们将 Pearlulu 为 DPlayer 添加的代码微调并添加到 h5ai-0.29.2+025~a1bb755 版本里。
添加完成后,使用方法同 Pearlulu-h5ai_dplayer_hls。
/* 添加 hls.js / DPlayer.min.js / DPlayer.min.css */
"resources": {
"scripts": [
"//cdn.jsdelivr.net/npm/hls.js@latest",
"//github.com/MoePlayer/DPlayer/raw/master/dist/DPlayer.min.js"
],
"styles": [
"fonts.google.css",
"//github.com/MoePlayer/DPlayer/raw/master/dist/DPlayer.min.css"
]
},
...
"view":
...
"hidden":
_h5ai/public/js/scripts.js
文件scripts.js
被压缩了,所以我们需要先将它解压还原。#!/bin/bash
_scripts_js="/var/www/_h5ai/public/js/scripts.js"
if [ $(cat $_scripts_js | wc -l) -lt 3000 ]; then
echo "请先将 scripts.js 解压"
echo "解压后的文件行数超过3500行"
exit 1
fi
if [ $(grep "v0.29.2+025\~a1bb755" "$_scripts_js" | wc -l) -eq 0 ]; then
echo "h5ai的版本不正确"
exit 1
fi
sed -i '/^\s\+e\.stopPropagation(),\s\+e\.preventDefault()$/,/^\s\+var\s*t\s*=\s*e.keyCode;/{
/^\s\+var\s*\w\s*=\s*e.keyCode;/i\
if (document.querySelector("#dplayer")) {\
return;\
}
}' "$_scripts_js"
sed -i '/^\s\+.*
修改完成的 h5ai 下载地址:h5ai_dplayer_hls-0.29.2+025~a1bb755.7z
访问密码:8888
网上关于 php.ini
的安全设置里,一般为这几项:
/var/www/
(网站根目录)# 禁止命令执行函数
disable_functions = system,passthru,exec,shell_exec,popen,pcntl_exec,proc_open
# 禁止文件操作函数
isable_functions=chdir,chroot,dir,getcwd,opendir,readdir,scandir,fopen,unlink,delete,copy,mkdir,rmdir,rename,file,file_get_contents,fputs,fwrite,chgrp,chmod,chow
/usr/local/apache2/logs/php_error.log
(日志文件路径)因为 h5ai 需要使用 opendir / readdir / scandir / fopen / file_get_contents / exec / passthru
这几个函数,以实现页面功能,所以我们要在 disable functions
里删除它们。
options.json
,如果不允许使用此函数,页面无法显示。Reference:
- Caddy
- Lighttpd
- h5ai-Web,h5ai-Download,h5ai-github
- h5ai-Third Edition-DPlayer-hls
- DPlayer-Web,DPlayer-github
- hls-wikiPedia
- dash-wikiPedia
- sha512-online-tools