本帖最后由 156608225 于 2024-4-7 17:10 编辑
又造了一个小玩具,这次是给群晖(其他Nas理论上也能用没测试)的,因为很简单所以没去搜索别人是不是做过类似的。
需求就是需要对群晖中的某个指定的子目录开启webdav服务
在群晖中开启共享都是基于系统用户密码的,共享的范围太大,创建个临时用户又不值当(最重要的是强迫症不想创建,临时账户感觉就是个精神污染)
用docker多好呀,不管是来还是扔都是打包的,直接上干货
如果自己从头操作的话需要点门槛,如golang编译、docker镜像打包
如果拿来主义的话有支持docker的群晖即可,下载打包好的镜像导入
https://lucy.lanzoue.com/b0kmx9e2b
密码:52pj
1. 开启webdav服务的主程序(golang编写)
[Golang] 纯文本查看 复制代码 package main
import (
"flag"
"golang.org/x/net/webdav"
"net/http"
)
func main() {
var addr *string
var path *string
var usr *string
var pwd *string
addr = flag.String("addr", ":8088", "")
path = flag.String("path", "./files", "")
usr = flag.String("usr", "admin", "")
pwd = flag.String("pwd", "123456", "")
flag.Parse()
fs := &webdav.Handler{
FileSystem: webdav.Dir(*path),
LockSystem: webdav.NewMemLS(),
}
http.HandleFunc("/", func(w http.ResponseWriter, req *http.Request) {
// 获取用户名/密码
username, password, ok := req.BasicAuth()
if !ok {
w.Header().Set("WWW-Authenticate", `Basic realm="Restricted"`)
w.WriteHeader(http.StatusUnauthorized)
return
}
// 验证用户名/密码
if username != *usr || password != *pwd {
http.Error(w, "WebDAV: need authorized!", http.StatusUnauthorized)
return
}
fs.ServeHTTP(w, req)
})
http.ListenAndServe(*addr, nil)
}
2. 制作docker镜像
先准备一个Dockerfile文件,跟编译出的MyWebdav放一起:
# 使用Alpine镜像作为基础镜像
FROM alpine:3.5
# 设置工作目录
WORKDIR /home
# 将编译好的程序复制到镜像中
COPY ./MyWebdav .
# 设置容器启动时运行的命令
CMD ["./MyWebdav"]
然后做镜像
docker build -t mydav .
docker save -o mydav.tar mydav
3. 把制作的mydav.tar导入群晖的容器管理,然后启动新的容器,命令行配置端口、目录、账号密码
4. 在需要webdav服务的地方配置好即可
|