zdir3个人网盘dockerfile打包
zdir3是用golang编写的个人网盘,但是最新的zdir4改成收费并且不再开源。
个人感觉zdir3已经够用,但是有几个问题,纯https访问时,列表链接还是返回的https,所以需要自己重新打包成docker,但是源码的dockerfile已经无法打包。
zdir3项目地址:GitHub - helloxz/zdir: A multifunctional private storage program that integrates file indexing, online preview, and sharing, supporting both WebDAV and cloud download.
下载源码后在代码根目录新建Dockerfile,内容如下
# 第一阶段:构建应用
FROM golang:alpine AS builderWORKDIR /app# 设置环境变量
ENV GO111MODULE=on
ENV CGO_ENABLED=0
#ENV GIN_MODE=release# 拷贝 go.mod 和 go.sum 到工作目录
COPY go.mod ./
COPY go.sum ./# 下载依赖
RUN go mod download# 拷贝源代码到工作目录
COPY cli ./cli
COPY config ./config
COPY controller ./controller
COPY docker ./docker
COPY model ./model
COPY router ./router
COPY sh ./sh
COPY sql ./sql
COPY templates ./templates
COPY compile.sh ./
COPY config.simple.ini ./
COPY main.go ./
COPY run.xml ./
COPY README.md ./
COPY ./docker/run.sh ./# 安装 upx
RUN apk add --no-cache upx# 构建应用并压缩
RUN go build -ldflags "-s -w" -o zdir main.go# 第二阶段:创建最小化运行时镜像
FROM alpine:3.16# 设置环境变量
ENV GIN_MODE=release# 安装时区
RUN apk add --no-cache tzdataWORKDIR /data/apps/zdir# 从构建阶段复制可执行文件和资源文件夹
COPY --from=builder /app/zdir .
COPY --from=builder /app/README.md .
COPY --from=builder /app/sh ./sh
COPY --from=builder /app/templates ./templates
COPY --from=builder /app/sql ./sql
COPY --from=builder /app/run.sh ./RUN cp run.sh /usr/sbin/run.sh && chmod +x /usr/sbin/run.shEXPOSE 6080
CMD ["/usr/sbin/run.sh"]
使用下面的命令打包
docker build -t my-zdir3 .
这个代码打包后跟作者提供的3.2.0的docker不一样,控制台没有输出日志.
找到代码router/router.go,删除或者注释掉下面的内容
f, _ := os.Create("logs/zdir.log")gin.DefaultWriter = io.MultiWriter(f)//日志同时输出到控制台gin.DefaultWriter = io.MultiWriter(f, os.Stdout)
这样打包就能输出控制台日志了。
我们还需要兼容https
找到代码config/ini_config.go的Public_domain函数,替换为下面的内容
func Public_domain(c *gin.Context) string {// 获取请求hosthost := c.Request.Host// 从请求中获取当前协议(http 或 https)scheme := "http"if c.Request.URL.Scheme == "https" || c.GetHeader("X-Forwarded-Proto") == "https" {scheme = "https"}// 载入配置文件,通过cfg调用domain := viper.GetString("storages.public_domain")// 如果公共存储域名为空,则构造默认值if domain == "" {domain = scheme + "://" + host + "/public"}return domain
}
若有nginx,则检查nginx配置是否设置了 proxy_set_header X-Forwarded-Proto $scheme;没有则忽略此步骤
一个典型的nginx配置如下
server {#listen 80;#listen [::]:80;listen 443 ssl;server_name zdir.example.com;client_max_body_size 500M;ssl_certificate /etc/letsencrypt/cert/example.com/fullchain.pem;ssl_certificate_key /etc/letsencrypt/cert/example.com/privkey.pem;location =/robots.txt {default_type text/html;add_header Content-Type "text/plain; charset=UTF-8";return 200 "User-Agent: *\nDisallow: /";}location / {if ($block_ip) {return 403; # 返回 403 Forbidden}proxy_pass http://zdir:80;proxy_set_header Host $host;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;proxy_set_header X-Real-IP $remote_addr;proxy_set_header X-Forwarded-Proto $scheme;}
}