以前写过h5ai在Debian下的教程,这次博主找到一篇更简单的,直接利用Caddy这个轻量级的Http程序就能搭建,简单方便。

转载声明
本站转载自https://doub.io/jzzy-3/

Caddy FileManager扩展介绍

FileManager 是基于Caddy 的扩展。它提供文件管理界面,可用于 上传/下载/删除/预览和重命名 等该目录中的文件。

  1. 支持 执行 Linux命令。
  2. 支持 上传文件(不支持文件夹)
  3. 支持 管理 多用户权限。
  4. 支持 搜索 文件/文件夹。
  5. 支持 批量 压缩文件下载。
  6. 支持 在线浏览 图片/文本/视频等文件。
  7. 支持 新建/重命名/移动/编辑/删除 文件和文件夹等操作。
  8. 部署简单。
  9. 等等 …

Caddy 文档:https://caddyserver.com/docs/filemanager

Github 项目:https://github.com/hacdias/caddy-filemanager

搜索 文件/文件夹和执行 Linux命令不知道是我姿势错误,还是其他原因,一直没什么反应和效果。。。

前面的几篇教程,我都用到了Caddy,大家应该都能看出来Caddy的易用性,所以本篇教程也很简单,唯一的难点就是 对一些扩展参数的理解,所以我会提供一些示例,不懂的也可以留言。

安装 Caddy

注意:Caddy脚本今天更新了 v1.0.1 版本,新增安装时可选 扩展参数的功能,所以使用旧版本Caddy的,请卸载重装!
wget -N --no-check-certificate https://softs.pw/Bash/caddy_install.sh && chmod +x caddy_install.sh && bash caddy_install.sh install filemanager
 
# 如果上面这个脚本无法下载,尝试使用备用下载:
wget -N --no-check-certificate https://raw.githubusercontent.com/ToyoDAdoubi/doubi/master/caddy_install.sh && chmod +x caddy_install.sh && bash caddy_install.sh install filemanager
安装Caddy成功后,继续新建一个用于使用的虚拟主机文件夹,例如 file(可以自己改):
mkdir /usr/local/caddy/www && mkdir /usr/local/caddy/www/file

配置 Caddy

首先,我们先讲一下,FileManager扩展各个参数。
filemanager [baseurl] {
    show           directory
    styles         filepath
    allow_new      [true|false]
    allow_edit     [true|false]
    allow_commands [true|false]
    allow_command  command
    block_command  command
    allow          [url|dotfiles]
    allow_r        regex
    block          [url|dotfiles]
    block_r        regex
}
  1. filemanager 的参数 baseurl 是要流量的文件管理器的URL。默认是 / (比如 /doubi 那么访问入口就是 http://ip/doubi )。
  2. show 的参数 directory 是要浏览的文件管理器的文件夹路径,可以使相对或绝对路径。默认是 ./ (服务器上面文件的绝对或相对路径)。
  3. styles 的参数 filepath 是式样表文件的相对或绝对路径,该文件不需要从网络访问(一般可以无视)。
  4. allow_new 是设置 创建 新文件或新文件夹 的权限开关,默认是允许 true (不允许则是 false)。
  5. allow_edit 是设置 编辑/重命名/删除 文件或文件夹 的权限开关,默认是允许 true (不允许则是 false)。
  6. alow_commands 是设置 执行Linux命令 的权限开关,默认是允许 true (不允许则是 false)。
  7. allow_command 是允许执行的 Linux命令。
  8. block_command 是禁止执行的 Linux命令。
  9. allow_command 和 block_command 的参数 command 是Linux命令,默认运行 git/svn/hg (比如这些命令:cp / mv / rm 等)。
  10. allow 是允许访问特定文件或文件夹,可以使用 dotfiles 来允许访问文件或文件夹。
  11. block 是阻止访问特定文件或文件夹,可以使用 dotfiles 来阻止访问文件或文件夹,被阻止的文件或者文件夹将不会显示在 文件管理界面。
  12. allow_r 和 block_r 是上面命令的扩展,可以使用 正则表达式,正则表达式用于匹配 URL,而不是内部路径文件。

我也只是临时了解了一下这个扩展,试了下,就 allow 和 block 我搞不懂,下面我就要根据我的理解来写出各种示例供大家参考和理解了。

配置示例

以下示例中,虚拟主机文件夹皆为 /usr/local/caddy/www/file

示例域名皆为 toyoo.ml

IP HTTP

本示例是,绑定虚拟主机为IP(即通过IP访问),HTTP协议(80端口)。

不需要用户名和密码即可访问,允许 新建/删除/移动/重命名 文件或文件夹等操作,同时允许使用Linux命令 mv

echo ":80 {
	root /usr/local/caddy/www/file
	gzip
	filemanager / {
		show /usr/local/caddy/www/file
		allow_new true
		allow_edit true
		allow_commands true
		allow_command mv
	}
}" > /usr/local/caddy/Caddyfile

域名 HTTP

本示例是,绑定虚拟主机为域名(即通过域名访问),HTTP协议(80端口)。

不需要用户名和密码即可访问,允许 新建/删除/移动/重命名 文件或文件夹等操作,同时允许使用Linux命令 mv

echo "http://toyoo.ml {
	root /usr/local/caddy/www/file
	gzip
	filemanager / {
		show /usr/local/caddy/www/file
		allow_new true
		allow_edit true
		allow_commands true
		allow_command mv
	}
}" > /usr/local/caddy/Caddyfile

域名 HTTPS

本示例是,绑定虚拟主机为域名(即通过域名访问),HTTPS协议(443端口)。

不需要用户名和密码即可访问,允许 新建/删除/移动/重命名 文件或文件夹等操作,同时允许使用Linux命令 mv

如果你有 SSL证书和密匙的话,把 SSL证书(xxx.crt)和密匙(xxx.key)文件放到 /root 文件夹下(也可以是其他文件夹,自己改下面代码),然后这样做:

echo "https://toyoo.ml {
	root /usr/local/caddy/www/file
	tls /root/xxx.crt /root/xxx.key
	gzip
	filemanager / {
		show /usr/local/caddy/www/file
		allow_new true
		allow_edit true
		allow_commands true
		allow_command mv
	}
}" > /usr/local/caddy/Caddyfile

如果你没有 SSL证书和密匙,那么你可以这样做:

下面的 xxxx@xxx.xx 改成你的邮箱,同时需要注意的是,申请 SSL证书前,请务必提前解析好域名记录(解析后最好等一会,以全球生效),否则 Caddy会申请并配置失败!

echo "https://toyoo.ml {
	root /usr/local/caddy/www/file
	tls xxxx@xxx.xx
	gzip
	filemanager / {
		show /usr/local/caddy/www/file
		allow_new true
		allow_edit true
		allow_commands true
		allow_command mv
	}
}" > /usr/local/caddy/Caddyfile

域名 HTTP重定向 HTTPS

本示例是,域名HTTP重定向为HTTPS。

当你是手动指定 SSL证书和密匙 来配置的话,Caddy只会监听 443端口(https),并不会自动设置 80端口(http)的重定向,如果要做重定向的话,可以这样做:

下面的示例代码中,是把 http://toyoo.ml 重定向到了 https://toyoo.ml 。
echo "http://toyoo.ml {
	redir https://toyoo.ml{url}
}
https://toyoo.ml {
	gzip
	tls /root/xxx.crt /root/xxx.key
	...
}" > /usr/local/caddy/Caddyfile

单用户/多用户 说明

这里会简单解释一下 单用户/多用户 配置后,权限的分配问题。
filemanager {
	# 在前面是设定 全局配置的,所有用户都会继承全局配置。
	allow_commands false # 这个全局配置代表所有用户都无法执行 Linux命令。
	allow_new false # 这个全局配置代表所有用户都无法新建 文件或文件夹。
	user1:
	# 用户名下面就是该用户 user1 的具体配置,只针对该用户。
	# 该用户的配置可以覆盖 同名的全局配置。
	allow_commands trus # 这个用户配置,会覆盖全局配置,user1 用户允许执行 Linux命令。
	# 该用户 user1 无法新建 文件或文件夹。
	user2:
	# 用户名下面就是该用户 user2 的具体配置,只针对该用户。
	# 该用户的配置可以覆盖 同名的全局配置。
	allow_new true # 该用户 user2 可以新建 文件或文件夹,覆盖全局配置。
}

设置用户名和密码(单用户)

本示例是,绑定虚拟主机为域名(即通过域名访问),HTTP协议(80端口)。

需要用户名和密码登录( user/doub.io ),允许 新建/删除/移动/重命名 文件或文件夹等操作,同时允许使用Linux命令 cp

因为只有一个用户,所以不需要设置全局配置。

echo "http://toyoo.ml {
	root /usr/local/caddy/www/file
	gzip
	basicauth / user doub.io
	filemanager / {
		show /usr/local/caddy/www/file
		user:
		allow_new true
		allow_edit true
		allow_commands true
		allow_command cp
	}
}" > /usr/local/caddy/Caddyfile

多用户配置

本示例是,绑定虚拟主机为域名(即通过域名访问),HTTP协议(80端口)。

需要用户名和密码登录,多用户,分别是 admin 和 user 用户。

admin 用户(相当于管理员)允许 允许 新建/删除/移动/重命名 文件或文件夹等操作,同时允许使用Linux命令 cp

user 用户(相当于游客)只允许浏览 文件管理器的内容和信息,其他任何操作都无法执行。

echo "http://toyoo.ml {
	root /usr/local/caddy/www/file
	gzip
	basicauth / admin doubi233
	basicauth / user doub.io
	filemanager / {
		show /usr/local/caddy/www/file
		allow_commands false
		admin:
		allow_new true
		allow_edit true
		allow_commands true
		allow_command cp
		user:
		allow_new false
		allow_edit false
	}
}" > /usr/local/caddy/Caddyfile
修改完配置后,请重启 Caddy 以生效。
service caddy restart
然后尝试访问 IP或域名 查看是否正常。

FileManager 使用说明

界面介绍

进入文件管理界面后,界面大概如下(可能随版本更新会有差别)。

  1. 顶部中间 是 搜索栏 和 Linux命令执行栏。
  2. 顶部右边 是退出当前用户的按钮(如果设置了用户账号)。
  3. 中部左边 是一个可以返回上一级目录的按钮和当前文件夹名字。
  4. 中部右边 是一系列的操作按钮,在不同情况下会不同,当前是选择文件的情况下。

操作按钮从左到右分别是:

  1. 新窗口 打开文件或下载文件
  2. 移动 文件/文件夹
  3. 重命名 文件/文件夹
  4. 切换 显示状态(方块和列表)
  5. 上传 文件(不支持文件夹)
  6. 压缩 下载(这个是会把你选择的文件/文件夹 压缩到一个文件然后下载,CTRL + 鼠标左键 可以选择多个文件或文件夹)
  7. 查看 当前选中文件的信息(目前还未开放)

下面的自然就是文件和文件夹了。

使用技巧

一些按键有对应的作用:

  1. F1 – 查看帮助
  2. F2 – 重命名 文件/文件夹
  3. DEL – 删除所选 文件/文件夹
  4. ESC – 清除当前选择 或 关闭提示
  5. CTRL + S – 保存下载 文件/文件夹(zip压缩)
  6. CTRL + 鼠标左键 单击 – 选择多个文件/文件夹
  7. 鼠标左键 双击 – 打开文件/文件夹
  8. 鼠标左键 单击 – 选择文件/文件夹

暂时不能用的按键:

  1. Alt + 鼠标左键 单击 – 选择一组文件

Caddy 使用说明

启动:service caddy start

停止:service caddy stop

重启:service caddy restart

查看状态:service caddy status

查看Caddy启动日志: tail -f /tmp/caddy.log

Caddy配置文件位置:/usr/local/caddy/Caddyfile

其他说明

启动显示成功,但是实际未运行

因为 服务脚本判断的问题,只判断了nohub是否运行 Caddy成功,但没有判断 Caddy 是否保持正常运行。

你可以理解为,nohub成功启动了 Caddy,但是 Caddy因为配置文件错误等原因,启动后又退出了。

所以这种情况下,你应该去查看启动日志:

  1. tail f /tmp/caddy.log

单网站/多网站

当然,上面的几个示例,实际上都算是单网站。

最后一句代码都是 }" > /usr/local/caddy/Caddyfile ,也就是清空了 Caddy配置文件,然后再写入了配置信息。

如果你要设置多个网站,那么把最后一句代码改成 }" >> /usr/local/caddy/Caddyfile 即可,注意是把 > 改成 >> ,这样就不会清空原来的配置信息了,而是会把要添加的配置信息加到配置文件最后!

Caddy启动失败,打开 http://ip 显示的是 It works !

一些系统会自带 apache2 ,而 apache2 会占用80端口,导致Caddy无法绑定端口,所以只要关掉就好了。
netstat -lntp
# 我们可以通过这个命令查看是不是被其他软件占用了 80 端口。

不过 apache2 会默认开机自启动,如果不需要可以关闭自启动或者卸载 apache2 。

停止 Apache2

service apache2 stop
# 尝试使用上面这个关闭,如果没效果或者提示什么错误无法关闭,那就用下面这个强行关闭进程。
kill -9 $(ps -ef|grep "apache2"|grep -v "grep"|awk '{print $2}')
取消开机自启动
# 以下代码仅限 Debian/Ubuntu 系统 #
update-rc.d -f apache2 remove
卸载 Apache2
# 以下代码仅限 Debian/Ubuntu 系统 #
apt-get remove --purge apache2
关闭 Apache2后,就可以尝试启动 Caddy ,并试试能不能打开网页。
service caddy start

如果你是 Aria2 教程里过来的,那么请看这个示例和说明

使用这个扩展的时候,请先确定你的caddy安装了这个扩展(2017/03/23 17:50 以前通过我网站其他教程安装的皆没有),否则请卸载重装!
卸载 Caddy:
bash caddy_install.sh uninstall

使用这个扩展,那么就不需要 caddy 自带的列表功能了,所以可以删除参数 browse ,然后如下设置即可。

需要用户名和密码登录,允许 新建/删除/移动/重命名 文件或文件夹等操作,同时允许使用Linux命令 cp

因为只有一个用户,所以不需要设置全局配置,你访问下载的BT文件就可以通过 http://ip或域名/Download/ 来访问和操作了,用户名和密码是 user233 / doub.io 。

更多的示例,请查看这里

echo -e "http://toyoo.ml {
root /usr/local/caddy/www/aria2
gzip
basicauth / user233 doub.io
filemanager /Download {
show /usr/local/caddy/www/aria2/Download
user233:
allow_new true
allow_edit true
allow_commands true
}
}" > /usr/local/caddy/Caddyfile

启动 Caddy后,无法访问

iptables -I INPUT -m state --state NEW -m tcp -p tcp --dport 端口 -j ACCEPT
iptables -I INPUT -m state --state NEW -m udp -p udp --dport 端口 -j ACCEPT
 
# 删除防火墙规则,内容一样把 -I 换成 -D 就行了:
iptables -D INPUT -m state --state NEW -m tcp -p tcp --dport 端口 -j ACCEPT
iptables -D INPUT -m state --state NEW -m udp -p udp --dport 端口 -j ACCEPT