从零搭建内网文件共享平台:WebDAV + AList + OnlyOffice 完整部署指南

从零搭建内网文件共享平台: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 管理后台:

  1. 存储 → 添加两个存储(私人目录 + 公共区域)
  2. 角色 → 添加角色,基本路径设为 /新用户名,权限全选
  3. 用户 → 添加用户,绑定对应角色

删除用户

  1. 用户 → 删除该用户
  2. 角色 → 删除该角色
  3. 存储 → 删除该用户的两个存储
  4. 服务器删除目录(可选):
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 即可使用文件共享平台。

相关推荐
skilllite作者2 小时前
SkillLite 架构优化分析报告:项目开发日记
大数据·开发语言·后端·架构·rust·rust沙箱
止语Lab10 小时前
Go并发编程实战:Channel 还是 Mutex?一个场景驱动的选择框架
开发语言·后端·golang
小码哥_常11 小时前
Spring Boot一键限速:守护你的接口“高速路”
后端
阿丰资源11 小时前
基于SpringBoot的物流信息管理系统设计与实现(附资料)
java·spring boot·后端
王码码203512 小时前
Go语言的包管理:从GOPATH到Go Modules
后端·golang·go·接口
IT_陈寒14 小时前
Redis的内存溢出坑把我整懵了,分享这个血泪教训
前端·人工智能·后端
Jasper_o16 小时前
MassTransit OutBox 不发送消息问题
后端·.net
掘金码甲哥16 小时前
glm模型这么火,咱们用vllm也咧一个呗
后端
邦爷的AI架构笔记16 小时前
踩坑3天后,我把公司的AI接口全换成了多模型路由——GPT-6和Claude Opus 4.7同时上线的这周
人工智能·后端