🚀 使用 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 协议。
⚙️ 部署前准备
-
环境要求
- 已安装 Docker 和 Docker Compose。
- 系统内存:建议 1GB 以上。
- 确保服务器的 65131 端口(或您自定义的其他端口)未被占用。
-
加载镜像 如果您已拥有
go_webdav的镜像文件(如117503445/go_webdav),请先使用以下命令加载镜像(假设镜像文件位于/root/117503445_go_webdav.tar):bash docker load -i /root/117503445_go_webdav.tar -
创建项目目录 建议创建一个独立的目录来管理所有部署文件。
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 目录,允许匿名访问,但仅为只读。
🚀 启动与验证
-
启动服务 在
docker-compose.yml文件所在目录执行:bash docker-compose up -d此命令会读取配置并在后台启动容器。 -
检查服务状态
bash docker-compose ps如果看到go_webdav容器的状态为Up,说明服务已成功启动。 -
查看实时日志(可选) 如果遇到问题,可以通过以下命令查看容器日志来排查:
bash docker-compose logs -f go_webdav -
访问与测试 WebDAV 服务
- 基础连通性测试:在浏览器中访问
http://你的服务器IP:65131。如果服务正常,你可能会看到一个目录列表(如果配置了匿名访问且目录存在文件)或者收到一个认证请求(如果配置了用户名密码)。请注意,某些浏览器对WebDAV的支持有限,专业客户端更可靠。 - 使用专业客户端测试(推荐):
- Windows:可以使用 RaiDrive 等工具挂载 WebDAV。
- Linux:可以在文件管理器中添加网络位置。
- Android/iOS:推荐使用 ES文件浏览器、nPlayer 或 fileball 等APP。
- 基础连通性测试:在浏览器中访问
⚙️ 基础配置与使用
成功部署后,您可能需要根据实际需求调整配置。
-
调整
dav环境变量 这是最核心的配置,您可以根据需要:- 添加新的共享目录:在
dav字符串中新增一组配置,用分号分隔。 - 修改访问权限:更改对应路径的"是否只读"设置(
true或false)。 - 启用或禁用匿名访问:通过将用户名和密码设置为
null来允许匿名访问,或设置具体的用户名和密码来要求认证。 任何对docker-compose.yml的修改都需要执行docker-compose down然后docker-compose up -d来重启服务才能生效。
- 添加新的共享目录:在
-
权限管理建议
- 在配置中,您已使用
PUID=0和PGID=0(root)来运行容器,这通常可以避免复杂的权限问题。只要确保容器内进程对挂载的宿主机目录有读写权限即可。 - 如果出于安全考虑想使用非 root 用户,需要确保该用户对挂载的所有目录都有适当的权限。
- 在配置中,您已使用
🔒 维护与管理
-
服务管理:
- 停止服务:
docker-compose down - 重启服务:
docker-compose restart - 查看服务状态:
docker-compose ps
- 停止服务:
-
数据备份:
- 定期备份您的
docker-compose.yml配置文件。 - 更重要的是,备份您通过
volumes挂载到容器内的重要数据目录。
- 定期备份您的
-
版本更新:
- 如果您有新的镜像版本需要更新,可以重新加载新镜像,然后使用
docker-compose down和docker-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 的部署,享受便捷安全的远程文件管理体验!