Skip to content

🚀 使用 Docker Compose 部署 go webdav

🚀 使用 Docker Compose 部署 Go WebDAV

本教程将详细介绍如何使用 Docker Compose 部署 Go WebDAV 服务器,这是一个基于 Go 语言开发的轻量级 WebDAV 服务,允许您通过网络访问、修改和管理文件。

📦 项目简介

WebDAV(Web-based Distributed Authoring and Versioning)是一种基于 HTTP 协议的文件共享协议,它扩展了 HTTP,允许客户端在远程服务器上进行文件创作和版本控制。 Go WebDAV 服务器使用 Go 语言实现,具有轻量、高效的特点,支持多用户、多目录映射及灵活的权限控制。

核心优势: - 跨平台操作:像操作本地文件一样管理远程文件,支持文件的增、删、改、查以及创建目录等。 - 灵活的权限管理:可以为不同目录设置独立的访问权限(读写或只读)和用户认证。 - 轻量高效:基于 Go 语言,通常具有较小的资源占用和较高的性能。 - 便于共享与协作:基于 HTTP/HTTPS,便于在广域网共享文件,许多移动端文件管理 APP 也支持 WebDAV 协议。

⚙️ 部署前准备

  1. 环境要求

    • 已安装 DockerDocker Compose
    • 系统内存:建议 1GB 以上。
    • 确保服务器的 65131 端口(或您自定义的其他端口)未被占用。
  2. 加载镜像 如果您已拥有 go_webdav 的镜像文件(如 117503445/go_webdav),请先使用以下命令加载镜像(假设镜像文件位于 /root/117503445_go_webdav.tar): bash docker load -i /root/117503445_go_webdav.tar

  3. 创建项目目录 建议创建一个独立的目录来管理所有部署文件。 bash mkdir -p /opt/docker/go_webdav cd /opt/docker/go_webdav

🛠️ 配置 Docker Compose

基于您提供的配置,创建 docker-compose.yml 文件:

#docker load -i /root/117503445_go_webdav.tar

services:
  go_webdav:
    image: 117503445/go_webdav  # 本地加载的镜像(需提前执行 docker load)
    restart: unless-stopped     # 容器退出后自动重启(除非手动停止,确保服务稳定)
    container_name: go_webdav   # 容器名称,便于管理(如停止/查看日志)
    volumes:
      #- ./data:/data

      #- /mnt/10t/file/lucky:/mnt/2 #lucky要用的,写出到ssl证书的路径。
      #- /mnt/10t/file/media:/mnt/media
      #- ./mnt/0:/mnt/0

      # 1. WebDAV 共享目录:主机 /mnt/10t/file/webdav/0 → 容器 /mnt/0
      - /mnt/10t/file/webdav/0:/mnt/0
      #- /mnt/10t/file/1:/mnt/file
      #- /mnt/10t/videos:/mnt/videos

      # 2. 服务器大容量磁盘:主机 /mnt/10t → 容器 /mnt/10t(用于访问媒体库等大文件)
      - /mnt/10t:/mnt/10t
      # 3. WebDAV 根目录:主机 /mnt/10t/file/webdav → 容器 /webdav(核心共享目录)
      - /mnt/10t/file/webdav:/webdav
      #- /mnt/10t/file/Immich/Photos/admin:/immich/admin
      #- /mnt/10t/file/Immich/Photos/library/library:/immich/library
      # 4. Immich 照片目录:主机 /mnt/10t/file/Immich/Photos → 容器 /immich(照片共享)
      - /mnt/10t/file/Immich/Photos:/immich
    deploy:
     resources:
       limits:  # 资源限制(防止占用过多服务器资源,可根据配置调整)
        cpus: '1.0'  # 限制CPU使用,可根据实际情况调整
        memory: 1G    # 限制内存使用,可根据实际情况调整

    environment:
      #- PUID=1000
      #- PGID=1000
      #- PUID=101
      #- PGID=65533
      - PUID=0   # 运行用户 ID(0 为 root 权限,避免目录访问权限问题,新手不建议修改)
      - PGID=0   # 运行用户组 ID(与 PUID 一致)

      #- dav=/pw,/data/public-writable,null,null,false;/pr,/data/public-readonly,null,null,true;/prw,/data/private-writable,user1,pass1,false

      #可用的标准参数
      #- "dav=/dir1,/data/dir1,user1,pass1,false;/dir2,/data/dir2,user1,pass1,true;/dir3,/data/dir3,null,null,false" #读写 只读 访客都读写

      #下一步把需要的目录都映射过来,然后逐个权限过去。挂载到子目录下面,然后直接掌管根目录文件夹给个账号密码来访问所有文件夹。
      #- "dav=/mnt,/mnt,user1,pass1,false;" #读写 只读 访客都读写
      #- "dav=/dav1,/dav/1,user1,pass1,false;/dav2,/dav/2,user1,pass1,false" #读写 只读 访客都读写

      #- "dav=/mnt,/mnt,user,227,false;/dav1,/dav/1,user,227,false;/dav2,/dav/2,user,227,false;/Image,/dav/images/pics,user,227,false;/images,/dav/images/pics,null,null,true;" #读写 只读 访客都读写
      #- "dav=/mnt,/mnt,user,227,false;/dav1,/dav/1,user,227,false;/dav2,/dav/2,user,227,false;/Image,/dav/images/pics,user,227,false;/images,/dav/images/pics,null,null,true;/immich,/immich,user,227,false" #读写 只读 访客都读写


      # 核心配置:WebDAV 目录权限与访问规则(格式:/访问别名,/容器实际路径,用户名,密码,是否只读(true=只读))
      - "dav=/mnt,/mnt/10t,user,227,false;/user,/webdav/2,user,227,false;/webdav,/webdav,user,227,false;/Image,/webdav/images/pics,user,227,false;/images,/webdav/images/pics,null,null,true;/immich,/immich,user,227,false" #读写 只读 访客都读写




    ports:
      #- 80:80
      - 65131:80   # 端口映射:主机 65131 端口 → 容器 80 端口(WebDAV 访问端口)



#VPS版配置
#docker load -i /root/117503445_go_webdav.tar

services:
  go_webdav:
    image: 117503445/go_webdav
    restart: unless-stopped
    container_name: go_webdav
    volumes:
      #- ./data:/data
      - ./mnt:/webdav
    deploy:
     resources:
       limits:
        #cpus: '1'
        #memory: 1G
        cpus: '0.1'
        memory: 356M

    environment:
      #- PUID=1000
      #- PGID=1000
      #- PUID=101
      #- PGID=65533
      - PUID=0
      - PGID=0

      #- dav=/pw,/data/public-writable,null,null,false;/pr,/data/public-readonly,null,null,true;/prw,/data/private-writable,user1,pass1,false

      #可用的标准参数
      #- "dav=/dir1,/data/dir1,user1,pass1,false;/dir2,/data/dir2,user1,pass1,true;/dir3,/data/dir3,null,null,false" #读写 只读 访客都读写

      #下一步把需要的目录都映射过来,然后逐个权限过去。挂载到子目录下面,然后直接掌管根目录文件夹给个账号密码来访问所有文件夹。
      #- "dav=/mnt,/mnt,user1,pass1,false;" #读写 只读 访客都读写
      #- "dav=/dav1,/dav/1,user1,pass1,false;/dav2,/dav/2,user1,pass1,false" #读写 只读 访客都读写

      #- "dav=/mnt,/mnt,user,227,false;/dav1,/dav/1,user,227,false;/dav2,/dav/2,user,227,false;/Image,/dav/images/pics,user,227,false;/images,/dav/images/pics,null,null,true;" #读写 只读 访客都读写
      #- "dav=/mnt,/mnt,user,227,false;/dav1,/dav/1,user,227,false;/dav2,/dav/2,user,227,false;/Image,/dav/images/pics,user,227,false;/images,/dav/images/pics,null,null,true;/immich,/immich,user,227,false" #读写 只读 访客都读写

      - "dav=/webdav,/webdav,user,227,false;/Image,/webdav/images/pics,user,227,false;/images,/webdav/images/pics,null,null,true" #读写 只读 访客都读写




    ports:
      #- 80:80
      - 65131:80



关键配置说明

配置项 说明与建议
image 指定要运行的 Docker 镜像。
ports "65131:80" 将容器内的 80 端口映射到主机的 65131 端口。您可以根据需要修改主机端口(前面的65131),但容器端口(后面的80)请保持不变
environment PUID/PGID:设置为 0 即以 root 权限运行,有助于避免文件权限问题。dav这是核心配置,用于定义 WebDAV 的共享目录和访问规则。
volumes 将宿主机的目录挂载到容器内,使得 WebDAV 服务可以访问这些目录下的文件。请确保宿主机上的这些目录存在。

dav 环境变量详解: 此变量用于配置 WebDAV 的共享路径、认证和权限,其语法遵循以下格式(配置中已使用分号分隔多个路径): "dav=<url路径1>,<容器内物理路径1>,<用户名1>,<密码1>,<是否只读1>;<url路径2>,<容器内物理路径2>,<用户名2>,<密码2>,<是否只读2>;..."

  • URL 路径:客户端访问 WebDAV 时使用的路径。
  • 容器内物理路径:该 URL 路径在容器内对应的实际目录(必须已通过 volumes 挂载)。
  • 用户名/密码:访问此路径的凭证。设置为 null 则表示允许匿名访问。
  • 是否只读true 表示只读;false 表示可读写。

根据您的配置示例: - /mnt 对应容器内 /mnt/10t 目录,用户 user 通过密码 227 认证,可读写。 - /images 对应容器内 /webdav/images/pics 目录,允许匿名访问,但仅为只读。

🚀 启动与验证

  1. 启动服务docker-compose.yml 文件所在目录执行: bash docker-compose up -d 此命令会读取配置并在后台启动容器。

  2. 检查服务状态 bash docker-compose ps 如果看到 go_webdav 容器的状态为 Up,说明服务已成功启动。

  3. 查看实时日志(可选) 如果遇到问题,可以通过以下命令查看容器日志来排查: bash docker-compose logs -f go_webdav

  4. 访问与测试 WebDAV 服务

    • 基础连通性测试:在浏览器中访问 http://你的服务器IP:65131。如果服务正常,你可能会看到一个目录列表(如果配置了匿名访问且目录存在文件)或者收到一个认证请求(如果配置了用户名密码)。请注意,某些浏览器对WebDAV的支持有限,专业客户端更可靠。
    • 使用专业客户端测试(推荐)
      • Windows:可以使用 RaiDrive 等工具挂载 WebDAV。
      • Linux:可以在文件管理器中添加网络位置。
      • Android/iOS:推荐使用 ES文件浏览器nPlayerfileball 等APP。

⚙️ 基础配置与使用

成功部署后,您可能需要根据实际需求调整配置。

  1. 调整 dav 环境变量 这是最核心的配置,您可以根据需要:

    • 添加新的共享目录:在 dav 字符串中新增一组配置,用分号分隔。
    • 修改访问权限:更改对应路径的"是否只读"设置(truefalse)。
    • 启用或禁用匿名访问:通过将用户名和密码设置为 null 来允许匿名访问,或设置具体的用户名和密码来要求认证。 任何对 docker-compose.yml 的修改都需要执行 docker-compose down 然后 docker-compose up -d 来重启服务才能生效。
  2. 权限管理建议

    • 在配置中,您已使用 PUID=0PGID=0(root)来运行容器,这通常可以避免复杂的权限问题。只要确保容器内进程对挂载的宿主机目录有读写权限即可。
    • 如果出于安全考虑想使用非 root 用户,需要确保该用户对挂载的所有目录都有适当的权限。

🔒 维护与管理

  • 服务管理

    • 停止服务docker-compose down
    • 重启服务docker-compose restart
    • 查看服务状态docker-compose ps
  • 数据备份

    • 定期备份您的 docker-compose.yml 配置文件。
    • 更重要的是,备份您通过 volumes 挂载到容器内的重要数据目录
  • 版本更新

    • 如果您有新的镜像版本需要更新,可以重新加载新镜像,然后使用 docker-compose downdocker-compose up -d 重启服务。

🐛 常见问题排查

问题现象 可能原因与解决方法
无法访问 WebDAV 服务 1. 检查防火墙/安全组是否放行了您设置的主机端口(例如 65131)。
2. 确认容器是否正常运行:docker-compose ps
3. 查看容器日志:docker-compose logs go_webdav
客户端连接失败或认证错误 1. 检查 dav 环境变量中的用户名和密码是否正确。
2. 确认在客户端中输入的用户名、密码和URL路径与配置一致。
可以连接但无法写入文件 1. 检查对应路径在 dav 环境变量中的"是否只读"设置是否为 false
2. 检查容器内进程(root)对挂载的宿主机目录是否有写入权限
在客户端中看不到预期的文件/目录 1. 检查 dav 环境变量中配置的"容器内物理路径"是否正确,且该路径已通过 volumes 正确挂载。
2. 确认宿主机上对应的源目录是否存在且包含文件。

希望这份教程能帮助您顺利完成 Go WebDAV 的部署,享受便捷安全的远程文件管理体验!