从零搭建内网文件共享平台:WebDAV + AList + OnlyOffice 完整部署指南
本文介绍如何在本地服务器(Ubuntu)上,通过 Docker 容器化方式部署 WebDAV 存储服务、AList 网盘前端和 OnlyOffice 文档预览服务,实现一套完整的内网文件共享平台,支持多用户隔离、文件上传下载、在线预览 Office 文档等功能。

一、系统架构
整套方案由四个核心组件构成:
用户浏览器
↓ HTTP :5244
AList(网页界面 + 用户权限管理)
↓ WebDAV 协议 :80
bytemark/webdav(文件存储服务)
↓ 读写文件
/data/webdav/data(宿主机磁盘)
OnlyOffice(文档预览服务,独立运行)
↑ Nginx 提供中转页面 :8081
AList Iframe 预览调用
各组件职责如下:
- WebDAV:负责文件的实际存储与读写,基于 Apache HTTP Server,支持标准 WebDAV 协议
- AList:提供漂亮的网页界面、用户管理、角色权限控制、文件分享链接等功能
- OnlyOffice:提供 Word、Excel、PowerPoint 等 Office 文档的在线预览能力
- Nginx:为 OnlyOffice 提供中转页面服务,桥接 AList 和 OnlyOffice
二、前置要求
服务器配置
| 项目 | 要求 |
|---|---|
| 操作系统 | Ubuntu 20.04 / 22.04 |
| CPU | 2 核以上 |
| 内存 | 4GB 以上(OnlyOffice 占用较多) |
| 磁盘 | 50GB 以上(根据存储需求调整) |
| 网络 | 与用户终端在同一局域网 |
需要开放的端口
| 端口 | 用途 |
|---|---|
| 5244 | AList 网页访问 |
| 8081 | OnlyOffice 中转页面 |
| 8088 | OnlyOffice 文档服务(内部) |
安装 Docker
bash
# 使用阿里云镜像源安装(国内服务器推荐)
apt-get update
apt-get install -y ca-certificates curl gnupg
curl -fsSL https://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | \
gpg --dearmor -o /etc/apt/keyrings/docker.gpg
echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] \
https://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable" | \
tee /etc/apt/sources.list.d/docker.list > /dev/null
apt-get update
apt-get install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin
systemctl enable docker && systemctl start docker
配置 Docker 镜像加速器
国内服务器拉取镜像速度慢,建议提前配置加速器:
bash
cat > /etc/docker/daemon.json << 'EOF'
{
"registry-mirrors": [
"https://docker.1ms.run",
"https://docker.xuanyuan.me"
]
}
EOF
systemctl daemon-reload
systemctl restart docker
三、部署 WebDAV 存储服务
创建目录结构
bash
# 主数据目录
mkdir -p /data/webdav/data
mkdir -p /data/alist/data
# 用户目录(根据实际用户数量调整)
mkdir -p /data/webdav/data/公共区域
mkdir -p /data/webdav/data/张三
mkdir -p /data/webdav/data/李四
mkdir -p /data/webdav/data/王五
# 设置权限(WebDAV 容器内用户 uid=82)
chown -R 82:82 /data/webdav/data/
编写 docker-compose.yml
bash
mkdir -p /data/webdav
cat > /data/webdav/docker-compose.yml << 'EOF'
version: '3.8'
services:
webdav:
image: bytemark/webdav
container_name: webdav
restart: always
ports:
- "127.0.0.1:8080:80" # 仅本地监听,不对外暴露
environment:
AUTH_TYPE: Basic
USERNAME: admin
PASSWORD: 你的强密码 # 修改为实际密码
volumes:
- /data/webdav/data:/var/lib/dav/data
alist:
image: xhofe/alist:latest
container_name: alist
restart: always
ports:
- "5244:5244"
volumes:
- /data/alist/data:/opt/alist/data
environment:
PUID: 0
PGID: 0
EOF
启动服务
bash
cd /data/webdav
docker-compose up -d
# 验证服务状态
docker-compose ps
# 验证 WebDAV 可用
curl -u admin:你的强密码 http://localhost:8080/
# 返回文件列表则正常
获取 AList 初始密码
bash
docker logs alist 2>&1 | grep -i password
# 如果没有输出,直接重置
docker exec -it alist ./alist admin set Admin123456
四、配置 AList 用户与存储
添加 WebDAV 存储
浏览器访问 http://服务器IP:5244,用 admin 账号登录后台。
进入 管理 → 存储 → 添加,为每个用户添加两个存储:
以张三为例:
私人目录存储:
| 字段 | 值 |
|---|---|
| 驱动 | WebDAV |
| 显示文件夹名称(挂载路径) | /张三/我的文件 |
| 地址 | http://webdav:80 |
| 用户名 | admin |
| 密码 | WebDAV 密码 |
| 根文件夹路径 | /张三 |
公共区域存储:
| 字段 | 值 |
|---|---|
| 显示文件夹名称(挂载路径) | /张三/公共区域 |
| 根文件夹路径 | /公共区域 |
| 其他字段 | 同上 |
注意:地址填
http://webdav:80而不是localhost,因为两个容器在同一 Docker 网络中,通过容器名互相访问。
按同样方式为李四、王五各添加两个存储,公共区域的根文件夹路径都填 /公共区域,指向同一物理目录。
创建角色
进入 管理 → 角色 → 添加:
| 角色名称 | 基本路径 | 权限 |
|---|---|---|
| 张三 | /张三 |
全选 |
| 李四 | /李四 |
全选 |
| 王五 | /王五 |
全选 |
创建用户
进入 管理 → 用户 → 添加:
| 用户名 | 密码 | 角色 |
|---|---|---|
| 张三 | 自定义 | 张三 |
| 李四 | 自定义 | 李四 |
| 王五 | 自定义 | 王五 |
配置完成后,每个用户登录后只能看到自己的「我的文件」和「公共区域」,实现用户空间隔离。
五、部署 OnlyOffice 文档预览
OnlyOffice 7.2 版本在与 AList 集成方面稳定性最佳,JWT 认证问题较少。
拉取并启动 OnlyOffice
bash
# 使用阿里云镜像仓库的 7.2 稳定版(国内可直接拉取)
docker pull registry.cn-chengdu.aliyuncs.com/software-yxl/onlyoffice:7.2
docker run -it -d \
-p 8088:80 \
--restart=always \
--name onlyoffice \
registry.cn-chengdu.aliyuncs.com/software-yxl/onlyoffice:7.2
等待约 1-2 分钟初始化,访问 http://服务器IP:8088 看到 OnlyOffice 欢迎页即为成功。
创建文档预览中转页面
AList 无法直接调用 OnlyOffice API,需要一个 HTML 中转页面作为桥梁,负责接收 AList 传来的文档地址,调用 OnlyOffice 渲染显示。
bash
mkdir -p /home/onlyoffice
cat > /home/onlyoffice/view.html << 'EOF'
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<title>文档预览</title>
<style>
html, body, #placeholder {
height: 100%;
margin: 0;
padding: 0;
}
</style>
</head>
<body>
<div id="placeholder"></div>
<script type="text/javascript"
src="http://服务器IP:8088/web-apps/apps/api/documents/api.js">
</script>
<script>
function getQueryParamValue(name) {
const searchParams = new URLSearchParams(window.location.search);
return searchParams.get(name);
}
const url = decodeURIComponent(getQueryParamValue("src"));
const fileName = url.substring(
url.lastIndexOf('/') + 1,
url.lastIndexOf('?') != -1 ? url.lastIndexOf('?') : url.length
);
const fileExtension = fileName.split('.').pop();
const docEditor = new DocsAPI.DocEditor("placeholder", {
"document": {
"fileType": fileExtension,
"permissions": {
"edit": false,
"comment": true,
"download": true,
"print": true,
"fillForms": true
},
"title": fileName,
"url": url
},
"editorConfig": {
"lang": "zh-CN",
"mode": "view"
},
"height": "100%",
"type": "desktop"
});
</script>
</body>
</html>
EOF
注意:将
src中的服务器IP替换为实际 IP 地址。
配置 Nginx 提供中转页面服务
bash
# Ubuntu/Debian
apt install -y nginx --fix-missing
systemctl enable nginx --now
# 创建配置文件
cat > /etc/nginx/conf.d/onlyoffice.conf << 'EOF'
server {
listen 8081;
server_name localhost;
location / {
root /home/onlyoffice;
index index.html index.htm;
}
}
EOF
# 验证并重启
nginx -t
systemctl restart nginx
六、配置 AList 文档预览
登录 AList 管理后台,进入 管理 → 设置 → 预览 ,找到 Iframe 预览 配置项,修改为:
json
{
"doc,docx,xls,xlsx,ppt,pptx": {
"OnlyOffice": "http://服务器IP:8081/view.html?src=$e_url"
},
"pdf": {
"PDF.js": "https://alist-org.github.io/pdf.js/web/viewer.html?file=$e_url"
},
"epub": {
"EPUB.js": "https://alist-org.github.io/static/epub.js/viewer.html?url=$e_url"
}
}
保存后,点击任意 Office 文档,在「使用...打开」中选择 OnlyOffice 即可在线预览。
七、用户管理
添加新用户
bash
# 1. 服务器创建目录
mkdir -p /data/webdav/data/新用户名
chown -R 82:82 /data/webdav/data/新用户名
然后在 AList 管理后台:
- 存储 → 添加两个存储(私人目录 + 公共区域)
- 角色 → 添加角色,基本路径设为
/新用户名,权限全选 - 用户 → 添加用户,绑定对应角色
删除用户
- 用户 → 删除该用户
- 角色 → 删除该角色
- 存储 → 删除该用户的两个存储
- 服务器删除目录(可选):
bash
rm -rf /data/webdav/data/用户名
八、常用运维命令
bash
# 查看所有容器状态
docker ps
# 查看日志
docker logs alist
docker logs webdav
docker logs onlyoffice
# 重启服务
docker restart alist
docker restart webdav
docker restart onlyoffice
# 重置 AList 管理员密码
docker exec -it alist ./alist admin set 新密码
# 修改 WebDAV 密码后重启
nano /data/webdav/docker-compose.yml
cd /data/webdav && docker-compose up -d webdav
# 记得同步更新 AList 所有存储的密码
九、常见问题
Q:上传文件报 403 错误?
检查目录所有者是否为 uid 82:
bash
ls -la /data/webdav/data/
chown -R 82:82 /data/webdav/data/
Q:AList 连接 WebDAV 报 401 错误?
检查 AList 存储配置中的密码是否与 docker-compose.yml 中的 PASSWORD 完全一致。
Q:OnlyOffice 预览显示欢迎页而非文档内容?
检查 view.html 中的 OnlyOffice IP 地址是否正确,以及 Nginx 是否正常运行:
bash
systemctl status nginx
curl http://localhost:8081/view.html
Q:用户看到了其他人的目录?
检查该用户的角色基本路径是否正确设置,确保每个用户的角色基本路径指向各自独立的目录。
Q:docker-compose 版本过旧?
下载新版 docker-compose 并替换:
bash
# 下载 v2.24.0(可在 Windows 下载后 scp 传到服务器)
# https://github.com/docker/compose/releases/download/v2.24.0/docker-compose-linux-x86_64
chmod +x docker-compose-linux-x86_64
mv docker-compose-linux-x86_64 /usr/local/bin/docker-compose
ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose
十、注意事项
- WebDAV 密码修改后,必须同步更新 AList 中所有相关存储的密码配置
- 新建用户目录后必须执行
chown -R 82:82,否则 WebDAV 容器无法写入 - 内网部署环境下,OnlyOffice 只能预览内网可访问的文件,不支持外部链接
- 生产环境建议为 AList 配置 Nginx + HTTPS,避免密码明文传输
- 定期备份
/data/webdav/data和/data/alist/data两个目录
部署完成后,浏览器访问 http://服务器IP:5244 即可使用文件共享平台。